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
相关产品推荐
相关产品推荐

