From 7af6d01b126a8984e5f33d80d8d34a241e8d696a Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Thu, 19 Jun 2008 15:51:00 +0000 Subject: [PATCH] Fixed ambiguity between postfix_expr and primary_expr (left parenthesis) --- src/parser.c | 43 +++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/src/parser.c b/src/parser.c index 1a8600c..4ec490e 100644 --- a/src/parser.c +++ b/src/parser.c @@ -999,8 +999,8 @@ static int _assignment_expr(C99 * c99) static int _unary_expr(C99 * c99) /* FIXME still recursive * postfix-expr - * ++ unary-expr - * -- unary-expr + * "++" unary-expr + * "--" unary-expr * unary-operator cast-expr * "sizeof" unary-expr * "sizeof" "(" type-name ")" */ @@ -1059,7 +1059,8 @@ static int _postfix_expr(C99 * c99) * postfix-expr "->" identifier * postfix-expr "++" * postfix-expr "--" - * "(" type-name ")" "{" initializer-list [ "," ] "}" */ + * "(" type-name ")" "{" initializer-list [ "," ] "}" + * "(" expression ")" */ { int ret = 0; @@ -1069,14 +1070,24 @@ static int _postfix_expr(C99 * c99) else if(_parse_is_code(c99, C99_CODE_OPERATOR_LPAREN)) { ret |= scan(c99); - ret |= _parse_check_set(c99, c99set_type_name, "type name", - _type_name); - ret |= _parse_check(c99, C99_CODE_OPERATOR_RPAREN); - ret |= _parse_check(c99, C99_CODE_OPERATOR_LBRACE); - ret |= _initializer_list(c99); - if(_parse_is_code(c99, C99_CODE_COMMA)) - ret |= scan(c99); - ret |= _parse_check(c99, C99_CODE_OPERATOR_RBRACE); + if(_parse_in_set(c99, c99set_type_name)) + { + ret |= _type_name(c99); + ret |= _parse_check(c99, C99_CODE_OPERATOR_RPAREN); + ret |= _parse_check(c99, C99_CODE_OPERATOR_LBRACE); + ret |= _initializer_list(c99); + if(_parse_is_code(c99, C99_CODE_COMMA)) + ret |= scan(c99); + ret |= _parse_check(c99, C99_CODE_OPERATOR_RBRACE); + } + else if(_parse_in_set(c99, c99set_expression)) + { + ret |= _expression(c99); + ret |= _parse_check(c99, C99_CODE_OPERATOR_RPAREN); + } + else + ret |= _parse_error(c99, + "Expected type name or expression"); } ret |= _postfix_expr_do(c99); return ret; @@ -1156,8 +1167,7 @@ static int _argument_expr_list(C99 * c99) static int _primary_expr(C99 * c99) /* identifier * constant - * string-literal - * "(" expression ")" */ + * string-literal */ { int ret = 0; int code; @@ -1173,13 +1183,6 @@ static int _primary_expr(C99 * c99) /* handle this as a labeled_statement */ c99->is_label = 1; } - else if(code == C99_CODE_OPERATOR_LPAREN) - { - ret |= scan(c99); - ret |= _parse_check_set(c99, c99set_expression, "expression", - _expression); - ret |= _parse_check(c99, C99_CODE_OPERATOR_RPAREN); - } else /* constant or string-litteral */ ret |= scan(c99); c99->can_label = 0;