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

ANTLR中NUMERAL令牌无法匹配数字的问题求助

ANTLR中NUMERAL令牌无法匹配数字的问题排查与解决

问题根源

ANTLR词法分析器遵循最长匹配优先和先定义规则优先匹配的原则。你的lexer规则中,DECIMAL_NUMERAL定义在NUMERAL之前,而DECIMAL_NUMERAL的规则包含了NUMERAL作为前缀分支(NUMERAL ('.' NUMERAL)?)。这意味着所有整数(比如测试文本中的3300)都会被优先匹配为DECIMAL_NUMERAL,根本不会触发NUMERAL规则。而你的parser规则qualifier明确要求匹配NUMERAL,因此出现不匹配的错误。

解决方案

方案1:调整词法规则顺序

将NUMERAL移到DECIMAL_NUMERAL之前,让整数优先匹配NUMERAL,带小数点的数字才会匹配DECIMAL_NUMERAL:

NUMERAL          : DIGIT+;
DECIMAL_NUMERAL  : NUMERAL ('.' NUMERAL)?;
fragment DIGIT  : [0-9];

方案2:修改解析器规则兼容DECIMAL_NUMERAL

如果不需要严格区分整数和小数,可以让qualifier同时接受NUMERAL和DECIMAL_NUMERAL:

qualifier :
    NUMERAL | DECIMAL_NUMERAL;

方案3:合并词法规则(推荐,若无需区分整数小数)

直接用DECIMAL_NUMERAL覆盖整数和小数场景,删除单独的NUMERAL规则:

DECIMAL_NUMERAL  : DIGIT+ ('.' DIGIT+)?;
fragment DIGIT  : [0-9];

同时修改parser中的qualifier规则:

qualifier :
    DECIMAL_NUMERAL;

额外检查

确保你的lexer中已经正确定义了GT令牌(对应测试文本中的>),否则exp规则中的eval部分也会出现匹配错误。

内容的提问来源于stack exchange,提问作者G. Scott Singleton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 21:23:25