From 1a1d24c6e41f96fe2007ab76a0d6d65fd9a94acc Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Thu, 12 Jun 2008 05:40:17 +0000 Subject: [PATCH] Getting rid of ambiguities between casts and sizeof with expressions --- src/parser.c | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/src/parser.c b/src/parser.c index 4fe1345..eb48cbb 100644 --- a/src/parser.c +++ b/src/parser.c @@ -964,6 +964,7 @@ static int _assignment_expr(C99 * c99) #if 0 ret |= _conditional_expr(c99); #endif +#if 0 /* FIXME check is this solves the conflict somehow */ for(;;) { @@ -972,6 +973,15 @@ static int _assignment_expr(C99 * c99) return ret; ret |= _assignment_operator(c99); } +#endif + for(;;) + { + ret |= _conditional_expr(c99); + if(!_parse_in_set(c99, c99set_assignment_operator)) + return ret; + ret |= _parse_check_set(c99, c99set_assignment_operator, + "assignment operator", _assignment_operator); + } return ret; } @@ -983,8 +993,8 @@ static int _unary_expr(C99 * c99) * ++ unary-expr * -- unary-expr * unary-operator cast-expr - * sizeof unary-expr - * sizeof "(" type-name ")" */ + * "sizeof" unary-expr + * "sizeof" "(" type-name ")" */ { int ret = 0; int code; @@ -1012,13 +1022,18 @@ static int _unary_expr(C99 * c99) if(_parse_is_code(c99, C99_CODE_OPERATOR_LPAREN)) { ret |= scan(c99); - ret |= _parse_check_set(c99, c99set_type_name, - "type name", _type_name); + /* FIXME it may still be an unary-expr */ + if(_parse_in_set(c99, c99set_type_name)) + ret |= _type_name(c99); + else + ret |= _parse_check_set(c99, c99set_expression, + "type cast or expression", + _expression); ret |= _parse_check(c99, C99_CODE_OPERATOR_RPAREN); } else ret |= _parse_check_set(c99, c99set_unary_expr, - "unary expression or parenthesis", + "type cast or expression", _unary_expr); } return ret; @@ -1205,7 +1220,7 @@ static int _assignment_operator(C99 * c99) /* conditional-expr */ static int _conditional_expr(C99 * c99) - /* logical-OR-expr [ "?" expression ":" conditional-expr ] */ + /* logical-OR-expr { "?" expression ":" logical-OR-expr } */ { int ret; @@ -1421,9 +1436,19 @@ static int _cast_expr(C99 * c99) while(_parse_is_code(c99, C99_CODE_OPERATOR_LPAREN)) { ret |= scan(c99); - ret |= _parse_check_set(c99, c99set_type_name, "type name", - _type_name); + /* in both cases it may already be an unary-expr */ + if(_parse_in_set(c99, c99set_type_name)) + { + ret |= _type_name(c99); + ret |= _parse_check(c99, C99_CODE_OPERATOR_RPAREN); + /* FIXME "{" => postfix-expr with initializer-list */ + continue; + } + /* primary-expr */ + ret |= _parse_check_set(c99, c99set_expression, + "type cast or expression", _expression); ret |= _parse_check(c99, C99_CODE_OPERATOR_RPAREN); + return ret; } ret |= _unary_expr(c99); return ret;