Implemented some more

This commit is contained in:
Pierre Pronchery 2008-03-11 17:39:36 +00:00
parent e890e7c02c
commit 2ef284cec7
3 changed files with 71 additions and 9 deletions

View File

@ -93,6 +93,8 @@ static int _init_declarator(C99 * c99);
static int _initializer(C99 * c99);
static int _initializer_list(C99 * c99);
static int _designation(C99 * c99);
static int _designator_list(C99 * c99);
static int _designator(C99 * c99);
/* functions */
@ -1314,15 +1316,22 @@ static int _init_declarator(C99 * c99)
/* initializer */
static int _initializer(C99 * c99)
/* assignment-expr
* { initializer-list [ "," ] } */
* "{" initializer-list [ "," ] "}" */
{
int ret = 0;
int ret;
/* FIXME complete */
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s() NOT COMPLETE\n", __func__);
fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif
if(token_in_set(c99->token, c99set_assignment_expr))
if(token_get_code(c99->token) == C99_CODE_OPERATOR_LBRACE)
{
ret = c99_scan(c99);
ret |= _initializer_list(c99);
if(token_get_code(c99->token) == C99_CODE_COMMA)
ret |= c99_scan(c99);
ret |= _parse_check(c99, C99_CODE_OPERATOR_RBRACE);
}
else
ret = _assignment_expr(c99);
return ret;
}
@ -1335,7 +1344,7 @@ static int _initializer_list(C99 * c99)
int ret = 0;
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s() NOT IMPLEMENTED\n", __func__);
fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif
if(token_in_set(c99->token, c99set_designation))
ret |= _designation(c99);
@ -1353,12 +1362,54 @@ static int _initializer_list(C99 * c99)
/* designation */
static int _designation(C99 * c99)
/* designator-list "=" */
{
/* FIXME implement */
int ret;
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s() NOT IMPLEMENTED\n", __func__);
fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif
return 0;
ret = _designator_list(c99);
ret |= _parse_check(c99, C99_CODE_OPERATOR_EQUALS);
return ret;
}
/* designator-list */
static int _designator_list(C99 * c99)
/* designator { designator } */
{
int ret;
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif
ret = _designator(c99);
while(token_in_set(c99->token, c99set_designator))
ret |= _designator(c99);
return ret;
}
/* designator */
static int _designator(C99 * c99)
/* "[" constant-expression "]"
* identifier */
{
int ret;
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif
if(token_get_code(c99->token) == C99_CODE_OPERATOR_LBRACKET)
{
ret = c99_scan(c99);
ret |= _constant_expr(c99);
ret |= _parse_check(c99, C99_CODE_OPERATOR_RBRACKET);
}
else
ret = _identifier(c99);
return ret;
}

View File

@ -122,6 +122,16 @@ static TokenCode _c99set_designation[] =
TokenSet c99set_designation = _c99set_designation;
/* designator */
static TokenCode _c99set_designator[] =
{
#include "sets/designator.set"
C99_CODE_NULL
};
TokenSet c99set_designator = _c99set_designator;
/* enum-specifier */
static TokenCode _c99set_enum_specifier[] =
{

View File

@ -33,6 +33,7 @@ extern TokenSet c99set_declaration_list;
extern TokenSet c99set_declaration_specifiers;
extern TokenSet c99set_declarator;
extern TokenSet c99set_designation;
extern TokenSet c99set_designator;
extern TokenSet c99set_enum_specifier;
extern TokenSet c99set_expression;
extern TokenSet c99set_expression_statement;