From ed8f21021ba53460b40b44c5ba982597c5951072 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Thu, 13 Mar 2008 18:46:21 +0000 Subject: [PATCH] Working some more on parsing --- src/parser.c | 27 +++++++++++++++++++++++-- src/sets/direct_abstract_declarator.set | 1 + src/tokenset.c | 10 +++++++++ src/tokenset.h | 1 + 4 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/parser.c b/src/parser.c index 84afe5f..3a221aa 100644 --- a/src/parser.c +++ b/src/parser.c @@ -64,6 +64,7 @@ static int _identifier_list(C99 * c99); static int _parameter_type_list(C99 * c99); static int _parameter_declaration(C99 * c99); static int _abstract_declarator(C99 * c99); +static int _direct_abstract_declarator(C99 * c99); static int _assignment_expr(C99 * c99); static int _unary_expr(C99 * c99); static int _postfix_expr(C99 * c99); @@ -719,12 +720,34 @@ static int _abstract_declarator(C99 * c99) { int ret = 0; +#ifdef DEBUG + fprintf(stderr, "DEBUG: %s()\n", __func__); +#endif + if(_parse_in_set(c99, c99set_pointer)) + ret = _pointer(c99); + if(_parse_in_set(c99, c99set_direct_abstract_declarator)) + ret |= _direct_abstract_declarator(c99); + return ret; +} + + +/* direct-abstract-declarator */ +static int _direct_abstract_declarator(C99 * c99) + /* "(" abstract-declarator ")" + * [ direct-abstract-declarator ] "[" [ assignment-expr ] "]" + * direct-abstract-declarator "[" "*" "]" + * [ direct-abstract-declarator ] "(" [ parameter-type-list ] ")" */ + +{ + int ret; + /* FIXME complete */ #ifdef DEBUG fprintf(stderr, "DEBUG: %s()\n", __func__); #endif - if(token_in_set(c99->token, c99set_pointer)) - ret = _pointer(c99); + ret = c99_scan(c99); + ret |= _abstract_declarator(c99); + ret |= _parse_check(c99, C99_CODE_OPERATOR_RPAREN); return ret; } diff --git a/src/sets/direct_abstract_declarator.set b/src/sets/direct_abstract_declarator.set index e69de29..cd15071 100644 --- a/src/sets/direct_abstract_declarator.set +++ b/src/sets/direct_abstract_declarator.set @@ -0,0 +1 @@ + C99_CODE_OPERATOR_LPAREN, diff --git a/src/tokenset.c b/src/tokenset.c index e4465b0..591cefb 100644 --- a/src/tokenset.c +++ b/src/tokenset.c @@ -132,6 +132,16 @@ static TokenCode _c99set_designator[] = TokenSet c99set_designator = _c99set_designator; +/* direct-abstract-declarator */ +static TokenCode _c99set_direct_abstract_declarator[] = +{ +#include "sets/direct_abstract_declarator.set" + C99_CODE_NULL +}; + +TokenSet c99set_direct_abstract_declarator = _c99set_direct_abstract_declarator; + + /* enum-specifier */ static TokenCode _c99set_enum_specifier[] = { diff --git a/src/tokenset.h b/src/tokenset.h index e7f87b4..e8d216c 100644 --- a/src/tokenset.h +++ b/src/tokenset.h @@ -34,6 +34,7 @@ extern TokenSet c99set_declaration_specifiers; extern TokenSet c99set_declarator; extern TokenSet c99set_designation; extern TokenSet c99set_designator; +extern TokenSet c99set_direct_abstract_declarator; extern TokenSet c99set_enum_specifier; extern TokenSet c99set_expression; extern TokenSet c99set_expression_statement;