【发布时间】:2014-08-11 18:51:48
【问题描述】:
注意:这是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'
但是,如果 NOT 用作更高优先级中缀运算符的 RHS,则此语法不能正常工作,即:
true == NOT false
这是由于 == 运算符需要 RHS 上的 E3,这不能是“NOT”操作。
我不确定表达这种语法的正确方法?是否仍然可以使用这种简单的递归下降方法,或者我需要转向更具特色的算法(调车场或优先攀登)。
以下是一些需要正确解析的示例:
- 输入
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))**不起作用
我已尝试更改级别E4、E3 和E2 以在中缀表达式的RHS 上使用E5,如Recursive Descent precedence parsing missing prefix expression 中所建议的那样(即E3 '==' E5、E3 '<' E5 , 等等)。然而,这打破了这些级别之间的优先级,即 true == 1 < 2 将错误地为 parsed as
【问题讨论】:
-
嗯,我看不出有什么办法,除了用
NOT添加额外的替代品。例如:E4 = E3 '==' E3 | E3 '!=' E3 | E3 '==' 'NOT' E3 | E3 '!=' 'NOT' E3 | E3等 -
这会很疯狂,因为
NOT不是唯一的前缀表达式(即还有-、+等) -
是的,我同意。因此,我的句子“我看不到方法”的开头,以及我没有将建议作为答案发布的事实:)
-
这是一种你自己定义的语言,对吧?根据上面的大纲,关系运算符(如
==)比逻辑运算符(如AND)绑定更难。这使得A AND B == C AND D之类的东西解析为A AND (B == C) AND D- 这就是你想要的吗?我认为您可能希望关系运算符位于顶部。 -
标准做法是使前缀一元运算符具有第二高的优先级(而后缀一元应具有最高优先级)。由于这个确切的原因,以不同的方式定义它们没有多大意义。
标签: algorithm parsing operator-precedence recursive-descent