![](/img/trans.png)
[英]Recursive Descent precedence parsing - matching lower precedence prefix expressions
[英]Recursive Descent precedence parsing missing prefix expression
我正在构建一个简单的语言解析器,并且存在优先级较低的前缀表达式的问题。 这是一个示例语法:
E = E5
E5 = E4 'OR' E4 | E4
E4 = E3 'AND' E3 | E3
E3 = 'NOT' E3 | E2
E2 = E1 '==' E1 | E1
E1 = '(' E ')' | 'true' | 'false'
但是,如果将该语法用作较高优先级中缀运算符的RHS,则该语法对于NOT
不能正常工作,即:
true == NOT false
这是由于==
运算符需要RHS上的E1,而这不能是NOT运算。
我不确定表达这种语法的正确方法吗? 是否仍然有可能使用这种简单的递归下降方法,还是我需要转向功能更强大的算法(调车场或优先攀登)。
假定以下输入和预期的分析是正确的:
true == NOT false
(true == (NOT false))
NOT true == false
(NOT (true == false))
NOT true == NOT false
(NOT (true == (NOT false)))
这是一个完成技巧的(ANTLR4)语法:
grammar Expr;
e : e5;
e5 : e4 'OR' e5 | e4;
e4 : e3 'AND' e4 | e3;
e3 : 'NOT' e3 | e2;
e2 : e1 '==' e3 | e1;
e1 : '(' e ')' | 'true' | 'false';
S : [ \t\r\n] -> skip;
解析ANTLR创建的:
您的语言也(不必要)含糊不清。 也可以帮助您解决此问题的修复程序。
在这里, D
是“析取”的简写, C
是合取, N
是否定, P
是主要, E
是等价。
D = C | C 'OR' D
C = N | N 'AND' C
N = E | 'NOT' N
E = P | P '==' P
P = '(' E ')' | 'true' | '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'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.