ANTLR 4无法将'..'识别为单一token拆分为两个'.'报错如何解决
问题原因
这个错误是ANTLR词法规则的优先级匹配逻辑导致的:
- 你当前使用的Modula-2语法中,数字字面量(尤其是支持末尾带小数点的浮点数)的词法规则优先级高于
..的匹配规则 - 扫描
0..3片段时,词法分析器会优先将0.识别为合法的浮点数字面量,剩余的单独.无法匹配..标记,因此抛出解析错误
解决方案
不需要自定义修改词法分析器的底层逻辑,仅调整语法规则即可解决:
- 显式定义
..的词法标记,并调整规则顺序
不要在解析器规则中直接使用字面量'..',先在词法规则部分显式定义范围标记,并且将该规则放到所有数字字面量规则的前面(ANTLR词法规则优先级按定义顺序从上到下递减):
再修改子范围类型的解析器规则调用该标记:// 放在INTEGER、FLOAT等数字规则的前面 RANGE : '..' ;subrangeType : '[' constExpression RANGE constExpression ']' ; - 可选:优化数字词法规则
如果你的Modula-2解析场景不需要支持0.这类末尾带小数点的浮点数写法,可以修改浮点数规则强制要求小数点后必须跟随数字,从根源避免0.被误识别:// 修改前(可能的原有规则) FLOAT : DIGIT+ '.' DIGIT* ; // 修改后 FLOAT : DIGIT+ '.' DIGIT+ ; - 调整完成后重新生成ANTLR的C#解析器代码,重新运行即可正常识别
0..3的子范围写法。
内容的提问来源于stack exchange,提问作者Olivier Jacot-Descombes
相关产品推荐
相关产品推荐

