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

ANTLR 4无法将'..'识别为单一token拆分为两个'.'报错如何解决

问题原因

这个错误是ANTLR词法规则的优先级匹配逻辑导致的:

  • 你当前使用的Modula-2语法中,数字字面量(尤其是支持末尾带小数点的浮点数)的词法规则优先级高于..的匹配规则
  • 扫描0..3片段时,词法分析器会优先将0.识别为合法的浮点数字面量,剩余的单独.无法匹配..标记,因此抛出解析错误

解决方案

不需要自定义修改词法分析器的底层逻辑,仅调整语法规则即可解决:

  1. 显式定义..的词法标记,并调整规则顺序
    不要在解析器规则中直接使用字面量'..',先在词法规则部分显式定义范围标记,并且将该规则放到所有数字字面量规则的前面(ANTLR词法规则优先级按定义顺序从上到下递减):
    // 放在INTEGER、FLOAT等数字规则的前面
    RANGE : '..' ;
    
    再修改子范围类型的解析器规则调用该标记:
    subrangeType
       : '[' constExpression RANGE constExpression ']'
       ;
    
  2. 可选:优化数字词法规则
    如果你的Modula-2解析场景不需要支持0.这类末尾带小数点的浮点数写法,可以修改浮点数规则强制要求小数点后必须跟随数字,从根源避免0.被误识别:
    // 修改前(可能的原有规则)
    FLOAT : DIGIT+ '.' DIGIT* ;
    // 修改后
    FLOAT : DIGIT+ '.' DIGIT+ ;
    
  3. 调整完成后重新生成ANTLR的C#解析器代码,重新运行即可正常识别0..3的子范围写法。

内容的提问来源于stack exchange,提问作者Olivier Jacot-Descombes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:54:03