Working on the parser

This commit is contained in:
Pierre Pronchery 2008-03-06 18:02:44 +00:00
parent d1715486d4
commit c197d78957
7 changed files with 90 additions and 0 deletions

View File

@ -52,6 +52,9 @@ static int _direct_declarator(C99 * c99);
static int _identifier(C99 * c99); static int _identifier(C99 * c99);
static int _identifier_list(C99 * c99); static int _identifier_list(C99 * c99);
static int _parameter_type_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 _assignment_expr(C99 * c99);
static int _unary_expr(C99 * c99); static int _unary_expr(C99 * c99);
static int _assignment_operator(C99 * c99); static int _assignment_operator(C99 * c99);
@ -437,6 +440,67 @@ static int _identifier_list(C99 * c99)
/* parameter-type-list */ /* parameter-type-list */
static int _parameter_type_list(C99 * c99) 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 */ /* FIXME implement */
#ifdef DEBUG #ifdef DEBUG

View File

@ -0,0 +1,2 @@
#include "pointer.set"
#include "direct_abstract_declarator.set"

2
src/sets/declarator.set Normal file
View File

@ -0,0 +1,2 @@
#include "pointer.set"
#include "direct_declarator.set"

View File

View File

View File

@ -22,6 +22,16 @@
/* protected */ /* protected */
/* variables */ /* 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 */ /* assignment-expr */
static TokenCode _c99set_assignment_expr[] = static TokenCode _c99set_assignment_expr[] =
{ {
@ -92,6 +102,16 @@ static TokenCode _c99set_declaration_specifiers[] =
TokenSet c99set_declaration_specifiers = _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 */ /* enum-specifier */
static TokenCode _c99set_enum_specifier[] = static TokenCode _c99set_enum_specifier[] =
{ {

View File

@ -23,6 +23,7 @@
/* protected */ /* protected */
extern TokenSet c99set_abstract_declarator;
extern TokenSet c99set_assignment_expr; extern TokenSet c99set_assignment_expr;
extern TokenSet c99set_block_item; extern TokenSet c99set_block_item;
extern TokenSet c99set_block_item_list; extern TokenSet c99set_block_item_list;
@ -30,6 +31,7 @@ extern TokenSet c99set_compound_statement;
extern TokenSet c99set_declaration; extern TokenSet c99set_declaration;
extern TokenSet c99set_declaration_list; extern TokenSet c99set_declaration_list;
extern TokenSet c99set_declaration_specifiers; extern TokenSet c99set_declaration_specifiers;
extern TokenSet c99set_declarator;
extern TokenSet c99set_enum_specifier; extern TokenSet c99set_enum_specifier;
extern TokenSet c99set_expression; extern TokenSet c99set_expression;
extern TokenSet c99set_expression_statement; extern TokenSet c99set_expression_statement;