【发布时间】:2014-08-08 13:58:25
【问题描述】:
我正在构建一个简单的语言解析器,但遇到了较低优先级前缀表达式的问题。这是一个示例语法:
E = E5
E5 = E4 'OR' E4 | E4
E4 = E3 'AND' E3 | E3
E3 = 'NOT' E3 | E2
E2 = E1 '==' E1 | E1
E1 = '(' E ')' | 'true' | 'false'
但是,如果 NOT 用作更高优先级中缀运算符的 RHS,则此语法不能正常工作,即:
true == NOT false
这是由于 == 运算符需要 RHS 上的 E1,这不能是 NOT 运算。
我不确定表达这种语法的正确方法?是否仍然可以使用这种简单的递归下降方法,或者我需要转向更具特色的算法(调车场或优先攀登)。
【问题讨论】:
-
请注意,
true == (NOT false)会解析,因为显式括号规则会从顶层重新开始计算。 -
也许使用波兰符号?
E = E5 E5 = 'OR' E4 E4 | E4 E4 = 'AND' E3 E3 | E3 E3 = 'NOT' E3 | E2 E2 = '==' E1 E1 | E1 E1 = '(' E ')' | 'true' | 'false' -
如果我理解正确,您不希望 E == E 像不是 (E == E) 那样解析,而是 E == not E 像 E == (笔记)。这是可能的,但很奇怪。如果这确实是您想要的,请在问题中更清楚地说明。
-
这确实很奇怪,但这是解析
E == not E的唯一合乎逻辑的有效方式。 -
注意 - 我已经在stackoverflow.com/questions/24337000进行了澄清和扩展
标签: algorithm parsing operator-precedence recursive-descent