ANTLR4语法报错:输入不匹配,期望PARAM_NAME如何解决?
问题解决:ANTLR4参数名匹配错误
问题根源
你的语法中ENTITY_NAME和PARAM_NAME的词法规则完全一致(都是[a-zA-Z_][a-zA-Z0-9_]*),而ANTLR4的词法分析器遵循先定义先匹配的优先级规则。所有符合标识符格式的输入(包括参数名)都会被优先识别为ENTITY_NAME,但param规则期望的是PARAM_NAME,因此出现"mismatched input"错误。
解决方法
合并重复的词法规则,用一个通用的IDENTIFIER规则替代ENTITY_NAME和PARAM_NAME,然后在语法规则中根据上下文区分使用场景即可。
修改后的完整语法:
grammar SimpleExpr2; expr: entityName '(' paramList ')' SEMICOLON; entityName: IDENTIFIER; paramList: param (SEPARATOR param)*; param: IDENTIFIER ':' DATA_TYPE | IDENTIFIER; IDENTIFIER: [a-zA-Z_][a-zA-Z0-9_]*; DATA_TYPE: 'int' | 'string' | 'float' | 'date' | 'text' ; SEPARATOR: ','; SEMICOLON: ';'; WS: [ \t\n\r]+ -> skip;
修改说明
- 移除原有的
ENTITY_NAME和PARAM_NAME规则,新增通用的IDENTIFIER规则,覆盖所有标识符匹配需求。 - 将
entityName规则中的ENTITY_NAME替换为IDENTIFIER,param规则中的PARAM_NAME也替换为IDENTIFIER。
这样修改后,输入entity( parametros:int, parametro:int, paramtrico:float, paramtri);就能被正确解析,不会再出现匹配错误。
内容的提问来源于stack exchange,提问作者Cristian Jacob Jimenez
相关产品推荐
相关产品推荐

