diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-10-09 21:38:21 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-10-09 22:03:58 +0300 |
commit | a43d8894bc5bed439265dd3984898c22c8df857b (patch) | |
tree | 39256849547ae47a95107c8e9aa5856ec9578c07 /src | |
parent | 1fdfe0ec055c5e8c080dd1427d98730885ac8bd4 (diff) | |
download | cflow-a43d8894bc5bed439265dd3984898c22c8df857b.tar.gz cflow-a43d8894bc5bed439265dd3984898c22c8df857b.tar.bz2 |
Accept qualifiers before declarations.
* src/c.l: Handle "inline" keyword.
* src/main.c (symbol_optype): Add "qualifier".
* src/parser.c (print_token): Correctly handle
PARM_WRAPPER and STRING.
(save_token): Handle QUALIFIER.
In verbose mode, warn about unexpected symbols.
(yyparse): Handle QUALIFIER and PARM_WRAPPER.
* src/parser.h (QUALIFIER): New define.
Diffstat (limited to 'src')
-rw-r--r-- | src/c.l | 1 | ||||
-rw-r--r-- | src/main.c | 1 | ||||
-rw-r--r-- | src/parser.c | 28 | ||||
-rw-r--r-- | src/parser.h | 1 |
4 files changed, 28 insertions, 3 deletions
@@ -72,12 +72,13 @@ WS [ \t\f\r]* <longline>.*\n { BEGIN(INITIAL); ++line_num; } /* keywords */ auto /* ignored */; extern return EXTERN; static return STATIC; typedef return TYPEDEF; +inline {yylval.str = "inline"; return QUALIFIER; } struct {yylval.str = "struct"; return STRUCT;} union {yylval.str = "union"; return STRUCT;} enum {yylval.str = "enum"; return STRUCT;} \* { yylval.str = "*"; return MODIFIER; } @@ -243,12 +243,13 @@ static struct option_type symbol_optype[] = { { "keyword", 2, WORD }, { "kw", 2, WORD }, { "modifier", 1, MODIFIER }, { "identifier", 1, IDENTIFIER }, { "type", 1, TYPE }, { "wrapper", 1, PARM_WRAPPER }, + { "qualifier", 1, QUALIFIER }, { 0 }, }; /* Parse the string STR and store the symbol in the temporary symbol table. * STR is the string of form: NAME:TYPE * NAME means symbol name, TYPE means symbol type (possibly abbreviated) diff --git a/src/parser.c b/src/parser.c index af0d0ab..0b524fc 100644 --- a/src/parser.c +++ b/src/parser.c @@ -81,12 +81,13 @@ print_token(TOKSTK *tokptr) switch (tokptr->type) { case IDENTIFIER: case TYPE: case WORD: case MODIFIER: case STRUCT: + case PARM_WRAPPER: fprintf(stderr, "`%s'", tokptr->token); break; case LBRACE0: case LBRACE: fprintf(stderr, "`{'"); break; @@ -103,12 +104,15 @@ print_token(TOKSTK *tokptr) case TYPEDEF: fprintf(stderr, "`typedef'"); break; case OP: fprintf(stderr, "OP"); /* ouch!!! */ break; + case STRING: + fprintf(stderr, "\"%s\"", tokptr->token); + break; default: fprintf(stderr, "`%c'", tokptr->type); } } static void @@ -211,12 +215,13 @@ save_token(TOKSTK *tokptr) switch (tokptr->type) { case IDENTIFIER: case TYPE: case STRUCT: case PARM_WRAPPER: case WORD: + case QUALIFIER: if (need_space) obstack_1grow(&text_stk, ' '); len = strlen(tokptr->token); obstack_grow(&text_stk, tokptr->token, len); need_space = 1; break; @@ -230,19 +235,29 @@ save_token(TOKSTK *tokptr) len = strlen(tokptr->token); obstack_grow(&text_stk, tokptr->token, len); break; 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); } } static Stackpos start_pos; /* Start position in stack for saving tokens */ static int save_end; /* Stack position up to which the tokens are saved */ @@ -336,12 +351,14 @@ yyparse() clearstack(); while (nexttoken()) { identifier.storage = ExternStorage; switch (tok.type) { case 0: return 0; + case QUALIFIER: + continue; case TYPEDEF: parse_typedef(); break; case EXTERN: identifier.storage = ExplicitExternStorage; parse_declaration(&identifier, 0); @@ -474,12 +491,18 @@ parse_function_declaration(Ident *ident, int parm) if (verbose) file_error(_("expected `;'"), 1); error_recovery = 1; } goto restart; + + case PARM_WRAPPER: + if (skip_balanced('(', ')', 0) == -1) + file_error(_("unexpected end of file in wrapper"), 0); + goto restart; + case ';': case ',': break; case LBRACE0: case LBRACE: if (ident->name) { @@ -839,13 +862,12 @@ maybe_parm_list(int *parm_cnt_return) return; case ',': break; case IDENTIFIER: case STRUCT: case UNION: - case ENUM: case TYPE: parmcnt++; ident.storage = AutoStorage; parse_declaration(&ident, 1); putback(); break; diff --git a/src/parser.h b/src/parser.h index fd423ae..49c8b45 100644 --- a/src/parser.h +++ b/src/parser.h @@ -32,12 +32,13 @@ #define LBRACE '{' #define RBRACE '}' #define MEMBER_OF 269 #define TYPE 270 #define STRING 271 #define PARM_WRAPPER 272 +#define QUALIFIER 273 typedef struct { char *str; } YYSTYPE; extern YYSTYPE yylval; |