Worked on the ambiguity between cast-expr and unary-expr

This commit is contained in:
Pierre Pronchery 2008-06-12 05:40:23 +00:00
parent 266efcd35d
commit efda6685e3
3 changed files with 37 additions and 17 deletions

View File

@ -83,6 +83,7 @@ static int _direct_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 _postfix_expr(C99 * c99); static int _postfix_expr(C99 * c99);
static int _postfix_expr_do(C99 * c99);
static int _argument_expr_list(C99 * c99); static int _argument_expr_list(C99 * c99);
static int _primary_expr(C99 * c99); static int _primary_expr(C99 * c99);
static int _type_name(C99 * c99); static int _type_name(C99 * c99);
@ -772,15 +773,7 @@ static int _direct_declarator(C99 * c99)
else else
ret |= code_context_set(c99->code, ret |= code_context_set(c99->code,
CODE_CONTEXT_PARAMETERS); CODE_CONTEXT_PARAMETERS);
#if 0
fprintf(stderr, "DEBUG: before 3, %d %d\n",
C99_CODE_IDENTIFIER, token_get_code(
c99->token));
#endif
ret |= _parse_check(c99, C99_CODE_OPERATOR_RPAREN); ret |= _parse_check(c99, C99_CODE_OPERATOR_RPAREN);
#if 0
fprintf(stderr, "DEBUG: after 3\n");
#endif
} }
} }
return ret; return ret;
@ -1023,7 +1016,6 @@ static int _postfix_expr(C99 * c99)
* "(" type-name ")" "{" initializer-list [ "," ] "}" */ * "(" type-name ")" "{" initializer-list [ "," ] "}" */
{ {
int ret = 0; int ret = 0;
int code;
DEBUG_GRAMMAR(); DEBUG_GRAMMAR();
if(_parse_in_set(c99, c99set_primary_expr)) if(_parse_in_set(c99, c99set_primary_expr))
@ -1040,6 +1032,17 @@ static int _postfix_expr(C99 * c99)
ret |= scan(c99); ret |= scan(c99);
ret |= _parse_check(c99, C99_CODE_OPERATOR_RBRACE); ret |= _parse_check(c99, C99_CODE_OPERATOR_RBRACE);
} }
ret |= _postfix_expr_do(c99);
return ret;
}
/* postfix-expr-do */
static int _postfix_expr_do(C99 * c99)
{
int ret = 0;
C99Code code;
while((code = _parse_get_code(c99)) != TC_NULL) while((code = _parse_get_code(c99)) != TC_NULL)
if(code == C99_CODE_OPERATOR_LBRACKET) if(code == C99_CODE_OPERATOR_LBRACKET)
{ {
@ -1050,11 +1053,15 @@ static int _postfix_expr(C99 * c99)
} }
else if(code == C99_CODE_OPERATOR_LPAREN) else if(code == C99_CODE_OPERATOR_LPAREN)
{ {
code_context_set(c99->code, if(code_context_set(c99->code,
CODE_CONTEXT_FUNCTION_PARAMETERS); CODE_CONTEXT_FUNCTION_PARAMETERS) != 0)
ret |= _parse_error(c99, error_get());
ret |= scan(c99); ret |= scan(c99);
if(!_parse_is_code(c99, C99_CODE_OPERATOR_RPAREN)) if(!_parse_is_code(c99, C99_CODE_OPERATOR_RPAREN))
ret |= _argument_expr_list(c99); ret |= _parse_check_set(c99,
c99set_argument_expr_list,
"argument list",
_argument_expr_list);
ret |= _parse_check(c99, C99_CODE_OPERATOR_RPAREN); ret |= _parse_check(c99, C99_CODE_OPERATOR_RPAREN);
} }
else if(code == C99_CODE_OPERATOR_DOT else if(code == C99_CODE_OPERATOR_DOT
@ -1106,11 +1113,12 @@ static int _primary_expr(C99 * c99)
* string-literal * string-literal
* "(" expression ")" */ * "(" expression ")" */
{ {
int ret; int ret = 0;
int code; int code;
DEBUG_GRAMMAR(); DEBUG_GRAMMAR();
code_context_set(c99->code, CODE_CONTEXT_PRIMARY_EXPR); if(code_context_set(c99->code, CODE_CONTEXT_PRIMARY_EXPR) != 0)
ret |= _parse_error(c99, error_get());
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);
@ -1121,13 +1129,13 @@ static int _primary_expr(C99 * c99)
} }
else if(code == C99_CODE_OPERATOR_LPAREN) else if(code == C99_CODE_OPERATOR_LPAREN)
{ {
ret = scan(c99); ret |= scan(c99);
ret |= _parse_check_set(c99, c99set_expression, "expression", ret |= _parse_check_set(c99, c99set_expression, "expression",
_expression); _expression);
ret |= _parse_check(c99, C99_CODE_OPERATOR_RPAREN); ret |= _parse_check(c99, C99_CODE_OPERATOR_RPAREN);
} }
else /* constant or string-litteral */ else /* constant or string-litteral */
ret = scan(c99); ret |= scan(c99);
c99->can_label = 0; c99->can_label = 0;
return ret; return ret;
} }
@ -1382,7 +1390,7 @@ static int _multiplicative_expr(C99 * c99)
/* cast-expr { ("*" | "/" | "%") cast-expr } */ /* cast-expr { ("*" | "/" | "%") cast-expr } */
{ {
int ret; int ret;
int code; C99Code code;
DEBUG_GRAMMAR(); DEBUG_GRAMMAR();
ret = _cast_expr(c99); ret = _cast_expr(c99);
@ -1420,6 +1428,7 @@ static int _cast_expr(C99 * c99)
ret |= _parse_check_set(c99, c99set_expression, ret |= _parse_check_set(c99, c99set_expression,
"type cast or expression", _expression); "type cast or expression", _expression);
ret |= _parse_check(c99, C99_CODE_OPERATOR_RPAREN); ret |= _parse_check(c99, C99_CODE_OPERATOR_RPAREN);
ret |= _postfix_expr_do(c99);
return ret; return ret;
} }
ret |= _unary_expr(c99); ret |= _unary_expr(c99);

View File

@ -42,6 +42,16 @@ static TokenCode _c99set_abstract_or_declarator[] =
TokenSet c99set_abstract_or_declarator = _c99set_abstract_or_declarator; TokenSet c99set_abstract_or_declarator = _c99set_abstract_or_declarator;
/* argument-expr-list */
static TokenCode _c99set_argument_expr_list[] =
{
#include "sets/argument_expr_list.set"
C99_CODE_NULL
};
TokenSet c99set_argument_expr_list = _c99set_argument_expr_list;
/* assignment-expr */ /* assignment-expr */
static TokenCode _c99set_assignment_expr[] = static TokenCode _c99set_assignment_expr[] =
{ {

View File

@ -25,6 +25,7 @@
/* protected */ /* protected */
extern TokenSet c99set_abstract_declarator; extern TokenSet c99set_abstract_declarator;
extern TokenSet c99set_abstract_or_declarator; extern TokenSet c99set_abstract_or_declarator;
extern TokenSet c99set_argument_expr_list;
extern TokenSet c99set_assignment_expr; extern TokenSet c99set_assignment_expr;
extern TokenSet c99set_assignment_operator; extern TokenSet c99set_assignment_operator;
extern TokenSet c99set_block_item; extern TokenSet c99set_block_item;