Python环境下ANTLR4自定义ErrorListener无法触发问题求助
问题原因及解决方法
1. 核心问题:回调方法名拼写错误
你自定义ErrorListener中的错误回调方法名拼写错误,正确的父类方法名为syntaxError,你写为了systaxError(将首段拼写中的n错写为t),属于没有正确覆盖父类的对应方法,因此解析器遇到语法错误时只会调用父类的默认空实现,不会触发你写的日志逻辑。
修正后的方法定义如下:
class GeneratorErrorListener(ErrorListener): def __init__(self, listener): super().__init__() self.listener = listener # 修正拼写错误 def syntaxError(self, recognizer, offendingSymbol, line, col, msg, e): log_it("Syntax error at line {} col {}: {}".format(line, col, msg))
2. 常见遗漏:未给词法分析器注册监听器
你当前只给Parser注册了自定义监听器,没有给Lexer做相同配置。如果错误发生在词法分析阶段(比如无法识别的字符、词法规则匹配失败),Lexer层面的错误不会触发Parser绑定的监听器。如果需要捕获全流程的语法错误,也需要对Lexer做相同配置:
lexer.removeErrorListeners() lexer.addErrorListener(GeneratorErrorListener(listener))
3. 补充优化:错误提前拦截
建议你在调用Parser的入口规则parser.protocol()之后,先判断解析器的错误计数parser.getNumberOfSyntaxErrors()是否大于0,如果大于0直接终止后续的遍历、代码生成逻辑,避免出现错误输入依然生成无效C代码的情况。
内容的提问来源于stack exchange,提问作者Richard Sharpe
相关产品推荐
相关产品推荐

