递归下降优先级解析 - 匹配较低优先级前缀表达式

时间:2014-06-20 23:19:29

标签: algorithm parsing operator-precedence recursive-descent

注意:这是Recursive Descent precedence parsing missing prefix expression

的更详细版本

我正在构建一个简单的语言解析器,并且遇到较低优先级前缀表达式的问题。这是一个示例语法:

E = E8
E8 = E7 'OR' E8 | E7
E7 = E6 'XOR' E7 | E6
E6 = E5 'AND' E6 | E5
E5 = 'NOT' E5 | E4
E4 = E3 '==' E4 | E3 '!=' E4 | E3
E3 = E2 '<' E3 | E2 '>' E3 | E2
E2 = E1 '+' E2 | E1 '-' E2 | E1 '*' E2 | E1 '+' E2 | E1
E1 = '(' E ')' | 'true' | 'false' | '0'..'9'

但是,如果将该语法用作较高优先级中缀运算符的RHS,则该语法对NOT不起作用,即:

true == NOT false

这是因为在RHS上需要E3的==运营商,这不是“不是”。操作

我不确定表达这种语法的正确方法吗?是否仍然可以使用这种简单的递归下降方法,或者我是否需要转向更具特色的算法(分流码或优先攀爬)。

以下是一些需要正确解析的示例:

  • 输入true == 1 < 2,输出==(true, <(1, 2))
  • 输入1 < 2 == true,输出==(<(1, 2), true)
  • 输入NOT true == false,输出NOT(==(true, false))
  • 输入true == NOT false,输出==(true, NOT(false)) **无法正常工作
  • 输入true < NOT false,输出<(true, NOT(false)) **无法正常工作

我已尝试更改级别E4E3E2以在中缀表达式的RHS上使用E5,如{{3}中所述}(即E3 '==' E5E3 '<' E5等)。然而,这打破了这些级别之间的优先级,即true == 1 < 2将不正确parsed as&lt;(==(true,1),2)`。

1 个答案:

答案 0 :(得分:0)

当坚持定义语言的方式时,你不能拥有

true == NOT false 

作为您所用语言的有效术语。因为那时

NOT false == true

将是不明确的:解析树可能是

    NOT
     | 
    ==
   /  \
false true

   ==
  /  \
 NOT true
  |
false

请注意

true == NOT (false)

是您所用语言的有效术语。对您的语言可能更直观的定义是将NOT级别从E5降低到E2。然后

true == NOT false 
NOT false == true

有效且NOTfalse绑定。第二个表达式的替代含义将表示为

NOT (false == true)

如果这些选项仍然不能满足您,则必须更改/扩展该工具。例如。 yacc / bison解析器允许明确定义运算符优先级;见例如here