繁体   English   中英

递归下降优先级解析缺少的前缀表达式

[英]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运算。

我不确定表达这种语法的正确方法吗? 是否仍然有可能使用这种简单的递归下降方法,还是我需要转向功能更强大的算法(调车场或优先攀登)。

假定以下输入和预期的分析是正确的:

  1. 测试1
    • 输入: true == NOT false
    • 输出: (true == (NOT false))
  2. 测试2
    • 输入: NOT true == false
    • 输出:( (NOT (true == false))
  3. 测试3
    • 输入: 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创建的:

1个

在此处输入图片说明

2

在此处输入图片说明

3

在此处输入图片说明

您的语言也(不必要)含糊不清。 也可以帮助您解决此问题的修复程序。

在这里, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM