From c197d78957f773b913da50fc31c1eb9cc3dd9921 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Thu, 6 Mar 2008 18:02:44 +0000 Subject: [PATCH] Working on the parser --- src/parser.c | 64 +++++++++++++++++++++++++ src/sets/abstract_declarator.set | 2 + src/sets/declarator.set | 2 + src/sets/direct_abstract_declarator.set | 0 src/sets/direct_declarator.set | 0 src/tokenset.c | 20 ++++++++ src/tokenset.h | 2 + 7 files changed, 90 insertions(+) create mode 100644 src/sets/abstract_declarator.set create mode 100644 src/sets/declarator.set create mode 100644 src/sets/direct_abstract_declarator.set create mode 100644 src/sets/direct_declarator.set diff --git a/src/parser.c b/src/parser.c index 802aaf0..c1ace3a 100644 --- a/src/parser.c +++ b/src/parser.c @@ -52,6 +52,9 @@ static int _direct_declarator(C99 * c99); static int _identifier(C99 * c99); static int _identifier_list(C99 * c99); static int _parameter_type_list(C99 * c99); +static int _parameter_list(C99 * c99); +static int _parameter_declaration(C99 * c99); +static int _abstract_declarator(C99 * c99); static int _assignment_expr(C99 * c99); static int _unary_expr(C99 * c99); static int _assignment_operator(C99 * c99); @@ -437,6 +440,67 @@ static int _identifier_list(C99 * c99) /* parameter-type-list */ static int _parameter_type_list(C99 * c99) + /* FIXME can that really work? + * parameter-list [ "," "..." ] */ +{ + int ret; + +#ifdef DEBUG + fprintf(stderr, "DEBUG: %s()\n", __func__); +#endif + ret = _parameter_list(c99); + if(token_get_code(c99->token) == C99_CODE_COMMA) + { + ret |= c99_scan(c99); + ret |= _parse_check(c99, C99_CODE_OPERATOR_DOTDOTDOT); + } + return ret; +} + + +/* parameter-list */ +static int _parameter_list(C99 * c99) + /* parameter-declaration { "," parameter-declaration } */ +{ + int ret; + +#ifdef DEBUG + fprintf(stderr, "DEBUG: %s()\n", __func__); +#endif + ret = _parameter_declaration(c99); + while(token_get_code(c99->token) == C99_CODE_COMMA) + { + ret |= c99_scan(c99); + ret |= _parameter_declaration(c99); + } + return ret; +} + + +/* parameter-declaration */ +static int _parameter_declaration(C99 * c99) + /* declaration-specifiers declarator + * declaration-specifiers [ abstract-declarator ] */ +{ + int ret; + +#ifdef DEBUG + fprintf(stderr, "DEBUG: %s()\n", __func__); +#endif + ret = _declaration_specifiers(c99); + if(token_in_set(c99->token, c99set_abstract_declarator)) + ret |= _abstract_declarator(c99); + else if(token_in_set(c99->token, c99set_declarator)) + ret |= _declarator(c99); + else + ret |= _parse_error(c99, "Expected declarator" + " or abstract declarator"); + return ret; +} + + +/* abstract-declarator */ +static int _abstract_declarator(C99 * c99) { /* FIXME implement */ #ifdef DEBUG diff --git a/src/sets/abstract_declarator.set b/src/sets/abstract_declarator.set new file mode 100644 index 0000000..e09c599 --- /dev/null +++ b/src/sets/abstract_declarator.set @@ -0,0 +1,2 @@ +#include "pointer.set" +#include "direct_abstract_declarator.set" diff --git a/src/sets/declarator.set b/src/sets/declarator.set new file mode 100644 index 0000000..6ca6015 --- /dev/null +++ b/src/sets/declarator.set @@ -0,0 +1,2 @@ +#include "pointer.set" +#include "direct_declarator.set" diff --git a/src/sets/direct_abstract_declarator.set b/src/sets/direct_abstract_declarator.set new file mode 100644 index 0000000..e69de29 diff --git a/src/sets/direct_declarator.set b/src/sets/direct_declarator.set new file mode 100644 index 0000000..e69de29 diff --git a/src/tokenset.c b/src/tokenset.c index fe0e788..ddaa792 100644 --- a/src/tokenset.c +++ b/src/tokenset.c @@ -22,6 +22,16 @@ /* protected */ /* variables */ +/* abstract_declarator */ +static TokenCode _c99set_abstract_declarator[] = +{ +#include "sets/abstract_declarator.set" + C99_CODE_NULL +}; + +TokenSet c99set_abstract_declarator = _c99set_abstract_declarator; + + /* assignment-expr */ static TokenCode _c99set_assignment_expr[] = { @@ -92,6 +102,16 @@ static TokenCode _c99set_declaration_specifiers[] = TokenSet c99set_declaration_specifiers = _c99set_declaration_specifiers; +/* declarator */ +static TokenCode _c99set_declarator[] = +{ +#include "sets/declarator.set" + C99_CODE_NULL +}; + +TokenSet c99set_declarator = _c99set_declarator; + + /* enum-specifier */ static TokenCode _c99set_enum_specifier[] = { diff --git a/src/tokenset.h b/src/tokenset.h index 988db68..3a51171 100644 --- a/src/tokenset.h +++ b/src/tokenset.h @@ -23,6 +23,7 @@ /* protected */ +extern TokenSet c99set_abstract_declarator; extern TokenSet c99set_assignment_expr; extern TokenSet c99set_block_item; extern TokenSet c99set_block_item_list; @@ -30,6 +31,7 @@ extern TokenSet c99set_compound_statement; extern TokenSet c99set_declaration; extern TokenSet c99set_declaration_list; extern TokenSet c99set_declaration_specifiers; +extern TokenSet c99set_declarator; extern TokenSet c99set_enum_specifier; extern TokenSet c99set_expression; extern TokenSet c99set_expression_statement;