ANTLR解析器触发mismatched input '.'报错 符号属于预期集合求助
ANTLR 预期内字符匹配失败问题排查建议
line 1:8 mismatched input '.' expecting {'[', '.', FROM, AS, '+', '-', '*', '/', '%', '&', '|', ',', '^', ID}
- 校验词法token拆分结果
90%以上的这类问题都是词法分析阶段没有把目标.识别为独立的DOTtoken,而是和前后字符拼接为了其他token。比如输入中的123.45会被很多默认数值规则识别为完整的FLOATtoken,而非INT+.+INT,此时解析器期待独立.的位置拿到FLOAT就会抛出匹配错误。单独测试片段时没有前后拼接的上下文,自然可以正常识别。
你可以通过CommonTokenStream遍历所有token并打印,或者使用antlr4-parse 你的语法名 起始规则 -tokens 输入内容命令,确认报错位置的.是否为独立的.类型token。 - 核对解析路径的上下文约束
ANTLR报错中的期望token集合是当前语法节点所有可能分支的后续token并集,不代表你当前实际走到的分支支持该token。比如某条分支允许ID后接.,另一条分支允许数值后接[,你当前走到了数值后接字符的分支,虽然期望集合里包含.,但当前分支并不支持。
可以开启ANTLR的解析追踪日志,或者用-gui参数生成可视化解析树,定位报错时解析器进入的具体规则分支,核对该分支后续允许的token列表。 - 排查不可见字符与编码问题
报错位置的字符可能不是你以为的半角.:比如全角句号、零宽空格等不可见字符和.相邻,都会导致词法器识别异常。你可以将输入的每个字符的ASCII/Unicode编码逐一打印,确认位置1:8的字符确实是编码为0x2E的半角句点,且前后无异常不可见字符。 - 检查词法规则优先级
ANTLR的词法规则按定义顺序优先匹配,如果你把能匹配.的其他规则(比如匹配浮点数的规则、匹配路径字符串的规则)写在了DOT : '.' ;规则前面,符合对应规则的.就会被优先识别为其他token类型,而非你期待的独立.。 - 校验输入流完整性
整句输入时如果是从文件/网络接口读取内容,可能存在编码转义、缓冲区未读全、多余换行/结束符残留的问题。你可以在把输入传给ANTLR的CharStream之前,先完整打印输入内容的字节序列,和预期输入逐字符对比。
内容的提问来源于stack exchange,提问作者Mauricio Galvao
相关产品推荐
相关产品推荐

