2016-03-15 19 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) - 添加此規則可保留該屬性。然而,可以通過移除遞歸(例如'expression:expression BITWISE_OR xor_expression | xor_expression' =>'expression:xor_expression expression1; expression1 - > BITWISE_OROROR expression1 | empty')將原始語法轉換爲LL(1)。是否可以在保持LL(1)的同時向這個轉換後的語法添加一個'top_level'規則?如果不是,LL(k)怎麼樣? – user200783

相關問題