Less segfaults and tracking more errors

This commit is contained in:
Pierre Pronchery 2008-03-14 01:58:22 +00:00
parent f8c779142b
commit d1fce35c7f

View File

@ -967,9 +967,9 @@ static int _primary_expr(C99 * c99)
token_get_string(c99->token)); token_get_string(c99->token));
#endif #endif
if(c99->token == NULL) if(c99->token == NULL)
return 0; return 1;
else if((code = token_get_code(c99->token)) == C99_CODE_IDENTIFIER) else if((code = token_get_code(c99->token)) == C99_CODE_IDENTIFIER)
return c99_scan(c99); return _identifier(c99);
else if(code == C99_CODE_OPERATOR_LPAREN) else if(code == C99_CODE_OPERATOR_LPAREN)
{ {
ret = c99_scan(c99); ret = c99_scan(c99);
@ -977,7 +977,7 @@ static int _primary_expr(C99 * c99)
ret |= _parse_check(c99, C99_CODE_OPERATOR_RPAREN); ret |= _parse_check(c99, C99_CODE_OPERATOR_RPAREN);
return ret; return ret;
} }
else else /* constant or string-litteral */
return c99_scan(c99); return c99_scan(c99);
} }
@ -992,7 +992,7 @@ static int _type_name(C99 * c99)
fprintf(stderr, "DEBUG: %s()\n", __func__); fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif #endif
ret = _specifier_qualifier_list(c99); ret = _specifier_qualifier_list(c99);
if(token_in_set(c99->token, c99set_abstract_declarator)) if(_parse_in_set(c99, c99set_abstract_declarator))
ret |= _abstract_declarator(c99); ret |= _abstract_declarator(c99);
return ret; return ret;
} }
@ -1006,7 +1006,8 @@ static int _specifier_qualifier_list(C99 * c99)
int looped = 0; int looped = 0;
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__); fprintf(stderr, "DEBUG: %s() \"%s\"\n", __func__,
token_get_string(c99->token));
#endif #endif
for(;;) for(;;)
{ {
@ -1339,7 +1340,7 @@ static int _block_item(C99 * c99)
return _declaration(c99); return _declaration(c99);
else if(token_in_set(c99->token, c99set_statement)) else if(token_in_set(c99->token, c99set_statement))
return _statement(c99); return _statement(c99);
return 1; /* FIXME report error */ return _parse_error(c99, "Expected declaration or statement");
} }
@ -1385,7 +1386,8 @@ static int _labeled_statement(C99 * c99)
fprintf(stderr, "DEBUG: %s() %s\n", __func__, fprintf(stderr, "DEBUG: %s() %s\n", __func__,
token_get_string(c99->token)); token_get_string(c99->token));
#endif #endif
/* FIXME may segfault upon EOF (c99->token is NULL) */ if(c99->token == NULL)
return 1;
if((code = token_get_code(c99->token)) == C99_CODE_IDENTIFIER) if((code = token_get_code(c99->token)) == C99_CODE_IDENTIFIER)
ret = _identifier(c99); ret = _identifier(c99);
else if(code == C99_CODE_KEYWORD_CASE) else if(code == C99_CODE_KEYWORD_CASE)
@ -1450,16 +1452,18 @@ static int _expression(C99 * c99)
/* selection-statement */ /* selection-statement */
static int _selection_statement(C99 * c99) static int _selection_statement(C99 * c99)
/* if "(" expression ")" statement [ else statement ] /* "if" "(" expression ")" statement [ "else" statement ]
* switch "(" expression ")" statement */ * "switch" "(" expression ")" statement */
{ {
int ret; int ret;
int code; int code;
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__); fprintf(stderr, "DEBUG: %s() \"%s\"\n", __func__,
token_get_string(c99->token));
#endif #endif
/* FIXME may segfault upon EOF (c99->token is NULL) */ if(c99->token == NULL)
return 1;
if((code = token_get_code(c99->token)) == C99_CODE_KEYWORD_SWITCH) if((code = token_get_code(c99->token)) == C99_CODE_KEYWORD_SWITCH)
c99->in_switch++; c99->in_switch++;
ret = c99_scan(c99); ret = c99_scan(c99);
@ -1546,8 +1550,8 @@ static int _jump_statement(C99 * c99)
/* FIXME may segfault upon EOF (c99->token is NULL) */ /* FIXME may segfault upon EOF (c99->token is NULL) */
if((code = token_get_code(c99->token)) == C99_CODE_KEYWORD_GOTO) if((code = token_get_code(c99->token)) == C99_CODE_KEYWORD_GOTO)
{ {
c99_scan(c99); ret = c99_scan(c99);
ret = _identifier(c99); ret |= _identifier(c99);
} }
else if(code == C99_CODE_KEYWORD_RETURN) else if(code == C99_CODE_KEYWORD_RETURN)
{ {