You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 17:25:17