Antlr4语法如何识别多余右括号并触发报错?
解决Antlr4中多余右括号未报错的问题
问题原因
当前的myVal规则仅定义了合法表达式的结构,但Antlr4解析器默认只会匹配第一个合法的子表达式,不会检查输入是否完全消耗。比如输入(3+4)))时,解析器会先匹配(3+4)作为一个合法的myVal,剩余的))不会被验证,因此不会触发报错。
解决方案
1. 添加顶层规则并强制匹配到输入结束
在语法文件中新增一个顶层规则,要求整个输入必须是一个完整的myVal,且后面不能有多余字符(通过EOF标记输入结束):
start : myVal EOF; // 原有的myVal规则保持不变 myVal : '(' myVal ')' | MINUS myVal | NOT myVal | '$' IDENTIFIER '(' ')' | '$' IDENTIFIER '(' myVal (',' myVal)* ')' | myVal op=(MULT | DIVIDE) myVal | myVal op=(PLUS | MINUS) myVal | myVal op=(EQ | NE | GT | GTE | LT | LTE) myVal | myVal IN '[' myVal (',' myVal)* ']' | myVal '~' myVal | myVal op=(AND | OR) myVal | myVal '?' myVal ':' myVal | IF myVal THEN myVal (ELSEIF myVal THEN myVal)* ELSE myVal | IDENTIFIER DOT IDENTIFIER | STRINGLIT | '[' myVal (',' myVal)* ']' | TRUE | FALSE | IDENTIFIER | NUMBER | INTEGER ;
2. 调整解析入口
生成解析器后,在代码中调用解析器的start()方法作为入口,而不是直接调用myVal()方法。这样解析器会强制检查整个输入是否完全匹配start规则,一旦有多余字符(比如末尾的)))就会抛出语法错误。
原理说明
EOF是Antlr4的内置标记,表示输入流的结束。通过顶层规则绑定myVal和EOF,解析器会要求输入必须是一个完整的合法表达式,且没有任何多余内容。当输入存在未被消耗的字符时,解析器会触发语法错误,从而捕获多余的右括号问题。
内容的提问来源于stack exchange,提问作者tRuEsAtM
相关产品推荐
相关产品推荐

