Working on the parser
This commit is contained in:
parent
d1715486d4
commit
c197d78957
64
src/parser.c
64
src/parser.c
@ -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
|
||||||
|
2
src/sets/abstract_declarator.set
Normal file
2
src/sets/abstract_declarator.set
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#include "pointer.set"
|
||||||
|
#include "direct_abstract_declarator.set"
|
2
src/sets/declarator.set
Normal file
2
src/sets/declarator.set
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#include "pointer.set"
|
||||||
|
#include "direct_declarator.set"
|
0
src/sets/direct_abstract_declarator.set
Normal file
0
src/sets/direct_abstract_declarator.set
Normal file
0
src/sets/direct_declarator.set
Normal file
0
src/sets/direct_declarator.set
Normal 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[] =
|
||||||
{
|
{
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user