Lemon Parser:如何为一元减号与减法设置不同结合性?
解决Lemon Parser中一元/二元减号的结合性冲突问题
核心思路是把一元减号和二元减号拆成两个不同的token,分别设置优先级和结合性,具体步骤如下:
拆分token,新增一元减号专属标记
在你的token定义中添加UNARY_MINUS,让原来的MINUS只对应二元减法场景。在词分析器里区分两种减号
当减号出现在以下场景时,生成UNARY_MINUS而不是MINUS:- 处于输入起始位置
- 前面是左括号
( - 前面是其他运算符(比如
PLUS、NOT等)
伪代码示例:
// 假设当前读到字符'-' if (前一个标记是起始标识 || 前一个标记是'(' || 前一个标记是运算符) { return UNARY_MINUS; } else { return MINUS; }修改语法规则
把一元减号的规则替换为新的token:expr ::= expr MINUS expr. // 二元减法,保留原规则 expr ::= UNARY_MINUS expr. // 一元负号,使用新token设置优先级与结合性
一元运算符优先级通常高于二元,将UNARY_MINUS设为高优先级右结合(符合数学运算习惯),二元加减设为低优先级左结合:%right UNARY_MINUS NOT. // 一元运算符组,右结合,优先级更高 %left PLUS MINUS. // 二元加减组,左结合,优先级较低
原理很简单:Lemon不允许同一个token拥有多组优先级或结合性,所以必须在词法阶段就把一元、二元减号区分开,当成不同的标记处理,这样就能分别配置对应的规则了。
内容的提问来源于stack exchange,提问作者Le Young
相关产品推荐
相关产品推荐

