aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2011-10-09 21:38:21 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2011-10-09 22:03:58 +0300
commita43d8894bc5bed439265dd3984898c22c8df857b (patch)
tree39256849547ae47a95107c8e9aa5856ec9578c07 /src
parent1fdfe0ec055c5e8c080dd1427d98730885ac8bd4 (diff)
downloadcflow-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.l1
-rw-r--r--src/main.c1
-rw-r--r--src/parser.c28
-rw-r--r--src/parser.h1
4 files changed, 28 insertions, 3 deletions
diff --git a/src/c.l b/src/c.l
index bb38d17..205a297 100644
--- a/src/c.l
+++ b/src/c.l
@@ -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;
}
diff --git a/src/main.c b/src/main.c
index 12ef6b7..dff6788 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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;

Return to:

Send suggestions and report system problems to the System administrator.