繁体   English   中英

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

[英]Recursive Descent precedence parsing - matching lower precedence prefix expressions

注意:这是递归下降优先级解析缺失前缀表达式的更详细的版本

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

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 ,这不能为“ 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)) **不起作用

我已尝试更改级别E4E3E2以在中缀表达式的RHS上使用E5 ,如递归下降优先级在解析缺少的前缀表达式 (即E3 '==' E5E3 '<' E5等)中所建议的那样)。 但是,这打破了这些级别之间的优先级,即true == 1 < 2将被错误地parsed as <(==(true,1),2)`。

坚持定义语言的方式时,您将无法

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解析器允许显式定义运算符优先级; 看到这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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