Removed part of the ambiguity between abstract declarators or not in parameters
This commit is contained in:
parent
ec8acd14af
commit
a7b6acdccc
27
src/parser.c
27
src/parser.c
@ -65,6 +65,7 @@ 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_declaration(C99 * c99);
|
static int _parameter_declaration(C99 * c99);
|
||||||
|
static int _abstract_or_declarator(C99 * c99);
|
||||||
static int _abstract_declarator(C99 * c99);
|
static int _abstract_declarator(C99 * c99);
|
||||||
static int _direct_abstract_declarator(C99 * c99);
|
static int _direct_abstract_declarator(C99 * c99);
|
||||||
static int _assignment_expr(C99 * c99);
|
static int _assignment_expr(C99 * c99);
|
||||||
@ -604,8 +605,7 @@ static int _type_qualifier_list(C99 * c99)
|
|||||||
|
|
||||||
/* direct-declarator */
|
/* direct-declarator */
|
||||||
static int _direct_declarator(C99 * c99)
|
static int _direct_declarator(C99 * c99)
|
||||||
/* FIXME still recursive
|
/* identifier
|
||||||
* identifier
|
|
||||||
* "(" declarator ")"
|
* "(" declarator ")"
|
||||||
* direct-declarator "[" (assignment-expression | "*") "]"
|
* direct-declarator "[" (assignment-expression | "*") "]"
|
||||||
* direct-declarator "(" parameter-type-list ")"
|
* direct-declarator "(" parameter-type-list ")"
|
||||||
@ -714,15 +714,28 @@ static int _parameter_declaration(C99 * c99)
|
|||||||
fprintf(stderr, "DEBUG: %s()\n", __func__);
|
fprintf(stderr, "DEBUG: %s()\n", __func__);
|
||||||
#endif
|
#endif
|
||||||
ret = _declaration_specifiers(c99);
|
ret = _declaration_specifiers(c99);
|
||||||
/* FIXME ambiguity between declarator and abstract declarator */
|
if(_parse_in_set(c99, c99set_abstract_or_declarator))
|
||||||
if(_parse_in_set(c99, c99set_abstract_declarator))
|
ret |= _abstract_or_declarator(c99);
|
||||||
ret |= _abstract_declarator(c99);
|
|
||||||
else if(_parse_in_set(c99, c99set_declarator))
|
|
||||||
ret |= _declarator(c99);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* abstract-or-declarator */
|
||||||
|
static int _abstract_or_declarator(C99 * c99)
|
||||||
|
/* pointer
|
||||||
|
* [ pointer ] (direct-declarator | abstract-direct-declarator) */
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if(_parse_in_set(c99, c99set_pointer))
|
||||||
|
ret |= _pointer(c99);
|
||||||
|
if(_parse_is_code(c99, C99_CODE_IDENTIFIER))
|
||||||
|
return ret | _direct_declarator(c99);
|
||||||
|
/* FIXME there is still an ambiguity with "(" */
|
||||||
|
return ret | _direct_abstract_declarator(c99);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* abstract-declarator */
|
/* abstract-declarator */
|
||||||
static int _abstract_declarator(C99 * c99)
|
static int _abstract_declarator(C99 * c99)
|
||||||
/* pointer
|
/* pointer
|
||||||
|
2
src/sets/abstract_or_declarator.set
Normal file
2
src/sets/abstract_or_declarator.set
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#include "abstract_declarator.set"
|
||||||
|
#include "declarator.set"
|
@ -32,6 +32,16 @@ static TokenCode _c99set_abstract_declarator[] =
|
|||||||
TokenSet c99set_abstract_declarator = _c99set_abstract_declarator;
|
TokenSet c99set_abstract_declarator = _c99set_abstract_declarator;
|
||||||
|
|
||||||
|
|
||||||
|
/* abstract_or_declarator */
|
||||||
|
static TokenCode _c99set_abstract_or_declarator[] =
|
||||||
|
{
|
||||||
|
#include "sets/abstract_or_declarator.set"
|
||||||
|
C99_CODE_NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
TokenSet c99set_abstract_or_declarator = _c99set_abstract_or_declarator;
|
||||||
|
|
||||||
|
|
||||||
/* assignment-expr */
|
/* assignment-expr */
|
||||||
static TokenCode _c99set_assignment_expr[] =
|
static TokenCode _c99set_assignment_expr[] =
|
||||||
{
|
{
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
/* protected */
|
/* protected */
|
||||||
extern TokenSet c99set_abstract_declarator;
|
extern TokenSet c99set_abstract_declarator;
|
||||||
|
extern TokenSet c99set_abstract_or_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;
|
||||||
|
Loading…
Reference in New Issue
Block a user