野牛规则匹配复杂的表达

时间:2015-11-11 16:28:46

标签: regex bison

我正在尝试使用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

1 个答案:

答案 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

IDENTIFIERNAME之间有什么区别?这似乎是一种混乱;您的扫描仪很可能没有返回您希望它返回的标记。您可能希望使用flex的调试功能(使用--debug),它将为每个匹配的令牌打印一条消息给stderr。

编写语法的最简单方法是:

expression: expression AND term
          | expression OR term
          | term
term      : comparison
          | '(' expression ')'
comparison: IDENTIFIER COMPARISON NAME

这为ANDOR提供了相同的优先级,这是不常见的。通常,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