diff options
Diffstat (limited to 'src/parser.c')
-rw-r--r-- | src/parser.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/src/parser.c b/src/parser.c index af0d0ab..0b524fc 100644 --- a/src/parser.c +++ b/src/parser.c @@ -84,6 +84,7 @@ print_token(TOKSTK *tokptr) case WORD: case MODIFIER: case STRUCT: + case PARM_WRAPPER: fprintf(stderr, "`%s'", tokptr->token); break; case LBRACE0: @@ -106,6 +107,9 @@ print_token(TOKSTK *tokptr) case OP: fprintf(stderr, "OP"); /* ouch!!! */ break; + case STRING: + fprintf(stderr, "\"%s\"", tokptr->token); + break; default: fprintf(stderr, "`%c'", tokptr->type); } @@ -214,6 +218,7 @@ save_token(TOKSTK *tokptr) case STRUCT: case PARM_WRAPPER: case WORD: + case QUALIFIER: if (need_space) obstack_1grow(&text_stk, ' '); len = strlen(tokptr->token); @@ -233,13 +238,23 @@ save_token(TOKSTK *tokptr) case EXTERN: /* storage class specifiers are already taken care of */ case STATIC: break; + case ',': + obstack_1grow(&text_stk, ','); + need_space = 1; + break; case '(': if (need_space) obstack_1grow(&text_stk, ' '); - /*FALLTHRU*/ - default: obstack_1grow(&text_stk, tokptr->type); need_space = 0; + break; + case ')': + obstack_1grow(&text_stk, tokptr->type); + need_space = 1; + break; + default: + if (verbose) + file_error(_("unrecognized definition"), 1); } } @@ -339,6 +354,8 @@ yyparse() switch (tok.type) { case 0: return 0; + case QUALIFIER: + continue; case TYPEDEF: parse_typedef(); break; @@ -477,6 +494,12 @@ parse_function_declaration(Ident *ident, int parm) } goto restart; + + case PARM_WRAPPER: + if (skip_balanced('(', ')', 0) == -1) + file_error(_("unexpected end of file in wrapper"), 0); + goto restart; + case ';': case ',': break; @@ -842,7 +865,6 @@ maybe_parm_list(int *parm_cnt_return) case IDENTIFIER: case STRUCT: case UNION: - case ENUM: case TYPE: parmcnt++; ident.storage = AutoStorage; |