diff --git a/src/code.c b/src/code.c index 4b7ee46..7a686ab 100644 --- a/src/code.c +++ b/src/code.c @@ -403,6 +403,14 @@ int code_context_set(Code * code, CodeContext context) } +/* code_context_set_class */ +int code_context_set_class(Code * code, CodeClass cclass) +{ + /* FIXME implement */ + return 0; +} + + /* code_context_set_identifier */ int code_context_set_identifier(Code * code, char const * identifier) { diff --git a/src/code.h b/src/code.h index d6ec95a..d3ced93 100644 --- a/src/code.h +++ b/src/code.h @@ -67,6 +67,26 @@ typedef enum _CodeStorage # define CODE_STORAGE_LAST CODE_STORAGE_REGISTER # define CODE_STORAGE_COUNT (CODE_STORAGE_LAST + 1) +typedef enum _CodeClass +{ + CODE_CLASS_NULL = 0x0000, + CODE_CLASS_VOID = 0x0001, + CODE_CLASS_CHAR = 0x0002, + CODE_CLASS_SHORT = 0x0004, + CODE_CLASS_INT = 0x0008, + CODE_CLASS_LONG = 0x0010, + CODE_CLASS_LONG_LONG = 0x0020, + CODE_CLASS_FLOAT = 0x0040, + CODE_CLASS_DOUBLE = 0x0080, + CODE_CLASS_SIGNED = 0x0100, + CODE_CLASS_UNSIGNED = 0x0200, + CODE_CLASS__BOOL = 0x0400, + CODE_CLASS__COMPLEX = 0x0800, + CODE_CLASS__IMAGINARY = 0x1000 +} CodeClass; +# define CODE_CLASS_LAST CODE_CLASS__IMAGINARY +# define CODE_CLASS_COUNT (CODE_CLASS_LAST + 1) + /* functions */ Code * code_new(C99Prefs const * prefs, char const * outfile); @@ -76,6 +96,7 @@ int code_delete(Code * code); /* context */ CodeContext code_context_get(Code * code); int code_context_set(Code * code, CodeContext context); +int code_context_set_class(Code * code, CodeClass cclass); int code_context_set_identifier(Code * code, char const * identifier); int code_context_set_storage(Code * code, CodeStorage storage); diff --git a/src/parser.c b/src/parser.c index 92a7290..7b7901d 100644 --- a/src/parser.c +++ b/src/parser.c @@ -18,6 +18,7 @@ +#include #include #include #include @@ -438,17 +439,61 @@ static int _type_specifier(C99 * c99) * | _Bool | _Complex | _Imaginary | struct-or-union-specifier * | enum-specifier | typedef-name */ { - int ret; + int ret = 0; + CodeClass cclass; DEBUG_GRAMMAR(); if(_parse_in_set(c99, c99set_struct_or_union_specifier)) - ret = _struct_or_union_specifier(c99); + return _struct_or_union_specifier(c99); else if(_parse_in_set(c99, c99set_enum_specifier)) - ret = _enum_specifier(c99); + return _enum_specifier(c99); else if(_parse_in_set(c99, c99set_typedef_name)) - ret = _typedef_name(c99); - else - ret = scan(c99); + return _typedef_name(c99); + switch(_parse_get_code(c99)) + { + case C99_CODE_KEYWORD_VOID: + cclass = CODE_CLASS_VOID; + break; + case C99_CODE_KEYWORD_CHAR: + cclass = CODE_CLASS_CHAR; + break; + case C99_CODE_KEYWORD_SHORT: + cclass = CODE_CLASS_SHORT; + break; + case C99_CODE_KEYWORD_INT: + cclass = CODE_CLASS_INT; + break; + case C99_CODE_KEYWORD_LONG: + cclass = CODE_CLASS_LONG; + break; + case C99_CODE_KEYWORD_FLOAT: + cclass = CODE_CLASS_FLOAT; + break; + case C99_CODE_KEYWORD_DOUBLE: + cclass = CODE_CLASS_DOUBLE; + break; + case C99_CODE_KEYWORD_SIGNED: + cclass = CODE_CLASS_SIGNED; + break; + case C99_CODE_KEYWORD_UNSIGNED: + cclass = CODE_CLASS_UNSIGNED; + break; + case C99_CODE_KEYWORD__BOOL: + cclass = CODE_CLASS__BOOL; + break; + case C99_CODE_KEYWORD__COMPLEX: + cclass = CODE_CLASS__COMPLEX; + break; + case C99_CODE_KEYWORD__IMAGINARY: + cclass = CODE_CLASS__IMAGINARY; + break; + default: + assert(0); + break; + } + if((ret = code_context_set_class(c99->code, cclass)) != 0) + _parse_error(c99, error_get()); + ret |= scan(c99); return ret; }