diff -wru cmix-2.0.12/src/analyzer/gram.y ../cmix-2.0.12/src/analyzer/gram.y --- cmix-2.0.12/src/analyzer/gram.y 2000-02-14 04:56:58.000000000 +0200 +++ ../cmix-2.0.12/src/analyzer/gram.y 2008-09-08 13:38:59.589848013 +0300 @@ -101,6 +101,7 @@ /* New Lexical element, whereas ANSI suggested non-terminal */ +%token ATTRIBUTE NONNULL THROW %token AUTO DOUBLE INT STRUCT %token BREAK ELSE LONG SWITCH %token CASE ENUM REGISTER TYPEDEF @@ -205,6 +206,33 @@ %% + +/* attribute */ +attribute_list: + | attribute_list_p ; + +attribute_list_p: + attribute | attribute attribute_list_p; + +clist_item: + constant | IDENTIFIER | IDENTIFIER '(' clist ')' ; + +clist: + clist_item | clist_item ',' clist ; + +attribute: + attribute_p | attribute_p IDENTIFIER ; + +attribute_p: + THROW | + ATTRIBUTE '(' '(' clist ')' ')' | + ATTRIBUTE IDENTIFIER | + nonnull ; + +nonnull: + NONNULL '(' '(' clist ')' ')' ; + + /************************** CONSTANTS *********************************/ constant: @@ -340,11 +368,11 @@ } | SIZEOF unary_expression { - $$=new ExprSize($2,$2->pos) + $$=new ExprSize($2,$2->pos); } | SIZEOF '(' type_name ')' { - $$=new TypeSize($3,ccchere) + $$=new TypeSize($3,ccchere); } ; @@ -592,12 +620,14 @@ declaring_list: /* tdecl */ declaration_specifier declarator { add_declaration($1,$2); $$ = $1; } + attribute_list initializer_opt - { add_initializer($4); $$=$3; } + { add_initializer($5); $$=$3; } | type_specifier declarator { add_declaration($1,$2); $$ = $1; } + attribute_list initializer_opt - { add_initializer($4); $$=$3; } + { add_initializer($5); $$=$3; } | declaring_list ',' declarator { add_declaration($1,$3); } initializer_opt @@ -626,15 +656,15 @@ declaration_qualifier_list: /* Parse_Type */ /* const/volatile, AND storage class */ storage_class | type_qualifier_list storage_class - { $1->combine(*$2); $$=$1 } +{ $1->combine(*$2); $$=$1; } | declaration_qualifier_list declaration_qualifier - { $1->combine(*$2); $$=$1 } +{ $1->combine(*$2); $$=$1; } ; type_qualifier_list: /* Parse_Type* */ type_qualifier | type_qualifier_list type_qualifier - { $1->combine(*$2); $$=$1 } +{ $1->combine(*$2); $$=$1; } ; declaration_qualifier: /* Parse_Type* */ diff -wru cmix-2.0.12/src/analyzer/lex.l ../cmix-2.0.12/src/analyzer/lex.l --- cmix-2.0.12/src/analyzer/lex.l 2008-09-08 13:25:48.000000000 +0300 +++ ../cmix-2.0.12/src/analyzer/lex.l 2008-09-08 13:40:50.329849326 +0300 @@ -48,6 +48,13 @@ %% +"__restrict" { } +"__extension__" { } +"__attribute__" { return (ATTRIBUTE); } +"__THROW" { return (THROW); } +"__nothrow" { } +"__nonnull" { return (NONNULL); } +"__const" { return (CONST); } "auto" { return (AUTO); } "break" { return (BREAK); } "case" { return (CASE); }