У меня есть следующие грамматики для выражений, содержащих бинарные операторы (|^& < < >> + - * /):Грамматики для выражений, которые запрещают внешние скобки
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
Это, кажется, работает хорошо, но Безразлично» t вполне соответствует моим потребностям, потому что он допускает внешние скобки, например ((3 + 4) * 2)
.
Как я могу изменить грамматику, чтобы запретить внешние круглые скобки, все еще позволяя им в выражениях, например. (3 + 4) * 2
, даже избыточно, например. (3 * 4) + 2
?
Спасибо, это хорошо. – user200783
Оригинальная грамматика LALR (1) - добавление этого правила сохраняет это свойство. Тем не менее, можно преобразовать исходную грамматику в LL (1), удалив рекурсию (например, выражение: выражение BITWISE_OR xor_expression | xor_expression' => выражение: выражение xor_expression1; expression1 -> BITWISE_OR xor_expression expression1 | empty'). Можно ли добавить правило «top_level» к этой преобразованной грамматике, сохраняя при этом LL (1)? Если нет, что относительно LL (k)? – user200783