不允许使用外括号的表达式的语法

时间:2016-03-15 03:07:46

标签: parsing expression grammar context-free-grammar bnf

对于涉及二元运算符的表达式,我有以下语法(| ^&<<>> + - * /):

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

1 个答案:

答案 0 :(得分: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,你想要没有外部parens的表达式。