Antlr4运行报错Mismatch input,COLUMN与SCALAR规则冲突如何修复?
Antlr4 Mismatch input错误修复方案
问题核心原因
Antlr4词法解析遵循两条优先级规则:
- 匹配长度更长的词法规则优先
- 匹配长度相同时,先定义的词法规则优先级更高
你定义的COLUMN和SCALAR规则完全一致(均匹配[a-z_]+),且COLUMN定义在SCALAR之前,因此所有符合该格式的字符串都会被识别为COLUMN类型的Token,SCALAR规则永远不会生效。解析到value节点时预期接收SCALAR类型Token,但实际拿到的是COLUMN类型,因此抛出Mismatch input错误。
修复方案
方案1:合并同类词法规则,语法层面区分使用场景
如果列名和值的词法格式没有明确区分要求,词法层面不需要拆分为两个Token,统一用同一个标识符规则即可,修改后的qwe.g4代码如下:
grammar qwe; query : IDENTIFIER OPERATOR value EOF ; OPERATOR : ('='|'>'|'<') ; // 统一匹配所有[a-z_]格式的标识符,列名和值通用 IDENTIFIER : [a-z_]+; value : IDENTIFIER; WS : [ \t\r\n]+ -> skip ;
该方案改动最小,修改语法文件重新生成代码后,原Python调用逻辑无需任何调整即可正常运行。
方案2:明确区分两类Token的词法特征
如果业务逻辑要求必须严格区分COLUMN和SCALAR两类Token,需要给SCALAR增加独有的词法标识,比如要求值必须用引号包裹,修改后的qwe.g4代码如下:
grammar qwe; query : COLUMN OPERATOR value EOF ; COLUMN : [a-z_]+; OPERATOR : ('='|'>'|'<') ; // 要求SCALAR用单引号包裹,和COLUMN的格式明确区分 SCALAR : '\'' [a-z_]+ '\''; value : SCALAR; WS : [ \t\r\n]+ -> skip ;
使用该方案时,输入的查询条件需要调整为total_sales>'qwe'格式即可正常解析。
内容的提问来源于stack exchange,提问作者Альберт Александров
相关产品推荐
相关产品推荐

