Antlr4开发SQL解释器触发token recognition error等错误求解
问题根因
问题出在你的Antlr4 String词法规则写法不符合Antlr4语法规范,导致单引号包裹的字符串无法被正确识别:
- Antlr4词法规则不支持正则风格的
[^']否定字符类写法,你写的String: '\''[^']+'\'';会被Antlr4解析为「匹配单引号 + 至少一个^或'字符 + 单引号」,完全无法匹配'Anna'这类普通字符串。 - 由于
'Anna'无法被识别为String类型的token,词法解析器会逐字符处理该部分内容:开头的'和大写A没有匹配规则,触发token识别错误;后续的nna符合ValidName小写开头的规则,被识别为ValidName类型的token,自然不符合语法规则中要求的Value类型,所以报extraneous input 'nna' expecting Value错误。
修复方案
- 修正String词法规则为Antlr4支持的写法,用
~'\''表示匹配任意非单引号字符:
// 基础版本,匹配无转义单引号的字符串 String: '\'' ~'\''* '\''; // 如果需要支持单引号内的转义单引号(例如'Anna\'s code'),用这个版本 String: '\'' (~'\'' | '\\\'')* '\'';
- 确认你的词法规则中添加了空白符跳过规则,避免空格、换行等字符触发不必要的token错误:
WS: [ \t\r\n]+ -> skip;
- 如果你的业务需要支持大小写开头的标识符,可以按需调整
ValidName规则:
ValidName: [a-zA-Z][a-zA-Z0-9_]*;
内容的提问来源于stack exchange,提问作者Emily H
相关产品推荐
相关产品推荐

