我正在尝试使用bison规则来匹配以下表达式:
( (a1 > a3) && ((a2 <= 8) || (a1 == 4.5)) )
( ((b1 > b4) && (b2 <= 5.62)) || (b1 == 3) )
(a < b)
( (c1 = 8.9) && (c2 > c1) )
我试过这些规则,但它有#34;冲突:6转/减少,6减少/减少&#34;它不起作用。
exprs:
'(' conditions ')'
conditions: conditions AND expression
| conditions OR expression
| conditions AND condition
| conditions OR condition
| condition
condition: expression
| expression AND expression
| expression OR expression
| '(' expression AND expression ')'
| '(' expression OR expression ')'
expression: '(' IDENTIFIER COMPARSION NAME ')'
| IDENTIFIER COMPARISON NAME
答案 0 :(得分:1)
让我们看一下你的三部作品:
conditions: conditions AND expression
| conditions AND condition
condition: expression
现在假设我们在堆栈顶部有conditions AND condition
。我们现在可以减少使用第三次生产,然后是第一次生产。或者我们可以减少使用第二次生产。在这两种情况下,我们最终都会使用conditions
:
conditions AND condition → conditions AND expression → conditions
conditions AND condition → conditions
所以语法含糊不清,这就是野牛告诉你的冲突。
你没有显示你的flex文件,但我很困惑:
expression: IDENTIFIER COMPARISON NAME
IDENTIFIER
和NAME
之间有什么区别?这似乎是一种混乱;您的扫描仪很可能没有返回您希望它返回的标记。您可能希望使用flex的调试功能(使用--debug
),它将为每个匹配的令牌打印一条消息给stderr。
编写语法的最简单方法是:
expression: expression AND term
| expression OR term
| term
term : comparison
| '(' expression ')'
comparison: IDENTIFIER COMPARISON NAME
这为AND
和OR
提供了相同的优先级,这是不常见的。通常,OR
优先于AND
,因此您可以编写,例如
a == 3 && b == 3 || a > 7 && b < 2
含义
((a == 3) && (b == 3)) || ((a > 7) && (b < 2))
要实现这一目标,您只需要另一级别的非终端:
expression: expression OR conjunct
| conjunct
conjunct : conjunct AND term
| term
term : comparison
| '(' expression ')'
comparison: IDENTIFIER COMPARISON NAME