Fixed ambiguity between postfix_expr and primary_expr (left parenthesis)
This commit is contained in:
parent
05b4a9c58e
commit
7af6d01b12
43
src/parser.c
43
src/parser.c
@ -999,8 +999,8 @@ static int _assignment_expr(C99 * c99)
|
|||||||
static int _unary_expr(C99 * c99)
|
static int _unary_expr(C99 * c99)
|
||||||
/* FIXME still recursive
|
/* FIXME still recursive
|
||||||
* postfix-expr
|
* postfix-expr
|
||||||
* ++ unary-expr
|
* "++" unary-expr
|
||||||
* -- unary-expr
|
* "--" unary-expr
|
||||||
* unary-operator cast-expr
|
* unary-operator cast-expr
|
||||||
* "sizeof" unary-expr
|
* "sizeof" unary-expr
|
||||||
* "sizeof" "(" type-name ")" */
|
* "sizeof" "(" type-name ")" */
|
||||||
@ -1059,7 +1059,8 @@ static int _postfix_expr(C99 * c99)
|
|||||||
* postfix-expr "->" identifier
|
* postfix-expr "->" identifier
|
||||||
* postfix-expr "++"
|
* postfix-expr "++"
|
||||||
* postfix-expr "--"
|
* postfix-expr "--"
|
||||||
* "(" type-name ")" "{" initializer-list [ "," ] "}" */
|
* "(" type-name ")" "{" initializer-list [ "," ] "}"
|
||||||
|
* "(" expression ")" */
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
@ -1069,14 +1070,24 @@ static int _postfix_expr(C99 * c99)
|
|||||||
else if(_parse_is_code(c99, C99_CODE_OPERATOR_LPAREN))
|
else if(_parse_is_code(c99, C99_CODE_OPERATOR_LPAREN))
|
||||||
{
|
{
|
||||||
ret |= scan(c99);
|
ret |= scan(c99);
|
||||||
ret |= _parse_check_set(c99, c99set_type_name, "type name",
|
if(_parse_in_set(c99, c99set_type_name))
|
||||||
_type_name);
|
{
|
||||||
ret |= _parse_check(c99, C99_CODE_OPERATOR_RPAREN);
|
ret |= _type_name(c99);
|
||||||
ret |= _parse_check(c99, C99_CODE_OPERATOR_LBRACE);
|
ret |= _parse_check(c99, C99_CODE_OPERATOR_RPAREN);
|
||||||
ret |= _initializer_list(c99);
|
ret |= _parse_check(c99, C99_CODE_OPERATOR_LBRACE);
|
||||||
if(_parse_is_code(c99, C99_CODE_COMMA))
|
ret |= _initializer_list(c99);
|
||||||
ret |= scan(c99);
|
if(_parse_is_code(c99, C99_CODE_COMMA))
|
||||||
ret |= _parse_check(c99, C99_CODE_OPERATOR_RBRACE);
|
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);
|
ret |= _postfix_expr_do(c99);
|
||||||
return ret;
|
return ret;
|
||||||
@ -1156,8 +1167,7 @@ static int _argument_expr_list(C99 * c99)
|
|||||||
static int _primary_expr(C99 * c99)
|
static int _primary_expr(C99 * c99)
|
||||||
/* identifier
|
/* identifier
|
||||||
* constant
|
* constant
|
||||||
* string-literal
|
* string-literal */
|
||||||
* "(" expression ")" */
|
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
int code;
|
int code;
|
||||||
@ -1173,13 +1183,6 @@ static int _primary_expr(C99 * c99)
|
|||||||
/* handle this as a labeled_statement */
|
/* handle this as a labeled_statement */
|
||||||
c99->is_label = 1;
|
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 */
|
else /* constant or string-litteral */
|
||||||
ret |= scan(c99);
|
ret |= scan(c99);
|
||||||
c99->can_label = 0;
|
c99->can_label = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user