2016-03-15 9 views
3

У меня есть следующие грамматики для выражений, содержащих бинарные операторы (|^& < < >> + - * /):Грамматики для выражений, которые запрещают внешние скобки

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?

ответ

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, где вы хотите выражения без внешних скобок.

+0

Спасибо, это хорошо. – user200783

+0

Оригинальная грамматика 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

 Смежные вопросы

  • Нет связанных вопросов^_^