不允许外括号的表达式的语法
Grammar for expressions which disallows outer parentheses
对于涉及二元运算符 (| ^ & << >> + - * /) 的表达式,我有以下语法:
expression : expression BITWISE_OR xor_expression
| xor_expression
xor_expression : xor_expression BITWISE_XOR and_expression
| and_expression
and_expression : and_expression BITWISE_AND shift_expression
| shift_expression
shift_expression : shift_expression LEFT_SHIFT arith_expression
| shift_expression RIGHT_SHIFT arith_expression
| arith_expression
arith_expression : arith_expression PLUS term
| arith_expression MINUS term
| term
term : term TIMES factor
| term DIVIDE factor
| factor
factor : NUMBER
| LPAREN expression RPAREN
这似乎工作正常,但不太符合我的需要,因为它允许外括号,例如((3 + 4) * 2)
.
如何更改语法以禁止外括号,同时仍然允许它们出现在表达式中,例如(3 + 4) * 2
,甚至是多余的,例如(3 * 4) + 2
?
将此规则添加到您的语法中:
top_level : expression BITWISE_OR xor_expression
| xor_expression BITWISE_XOR and_expression
| and_expression BITWISE_AND shift_expression
| shift_expression LEFT_SHIFT arith_expression
| shift_expression RIGHT_SHIFT arith_expression
| arith_expression PLUS term
| arith_expression MINUS term
| term TIMES factor
| term DIVIDE factor
| NUMBER
并在需要不带外括号的表达式的地方使用 top_level。
对于涉及二元运算符 (| ^ & << >> + - * /) 的表达式,我有以下语法:
expression : expression BITWISE_OR xor_expression
| xor_expression
xor_expression : xor_expression BITWISE_XOR and_expression
| and_expression
and_expression : and_expression BITWISE_AND shift_expression
| shift_expression
shift_expression : shift_expression LEFT_SHIFT arith_expression
| shift_expression RIGHT_SHIFT arith_expression
| arith_expression
arith_expression : arith_expression PLUS term
| arith_expression MINUS term
| term
term : term TIMES factor
| term DIVIDE factor
| factor
factor : NUMBER
| LPAREN expression RPAREN
这似乎工作正常,但不太符合我的需要,因为它允许外括号,例如((3 + 4) * 2)
.
如何更改语法以禁止外括号,同时仍然允许它们出现在表达式中,例如(3 + 4) * 2
,甚至是多余的,例如(3 * 4) + 2
?
将此规则添加到您的语法中:
top_level : expression BITWISE_OR xor_expression
| xor_expression BITWISE_XOR and_expression
| and_expression BITWISE_AND shift_expression
| shift_expression LEFT_SHIFT arith_expression
| shift_expression RIGHT_SHIFT arith_expression
| arith_expression PLUS term
| arith_expression MINUS term
| term TIMES factor
| term DIVIDE factor
| NUMBER
并在需要不带外括号的表达式的地方使用 top_level。