You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ANTLR Lexer的ANTLRErrorListener中获取未识别字符?

从ANTLR词法分析器错误中提取单个出错字符

在ANTLR的词法分析错误监听逻辑里,你可以通过强转offendingSymbol参数为Token类型,直接获取引发错误的单个字符,完全不需要解析错误消息msg。具体实现代码如下:

lexer.addErrorListener(new ANTLRErrorListener() {
    @Override
    public void syntaxError(Recognizer<?, ?> recognizer,  
                            Object offendingSymbol, int line,
                            int charPositionInLine, String msg,
                            RecognitionException e) {
        // 词法分析阶段的错误符号必然是Token实例,直接强转
        Token errorToken = (Token) offendingSymbol;
        // 获取引发错误的单个字符文本
        String errorChar = errorToken.getText();
        
        // 生成友好提示示例(可根据需求调整格式)
        String friendlyHint = String.format("第%d行第%d列存在未识别字符:'%s'", 
                                           line, charPositionInLine + 1, errorChar);
        // 这里可根据业务需求输出或处理该提示
        System.err.println(friendlyHint);
    }

    // 实现ANTLRErrorListener的其他默认方法
    @Override
    public void reportAmbiguity(Recognizer<?, ?> recognizer, DFA dfa, int startIndex, int stopIndex, boolean exact, BitSet ambigAlts, ATNConfigSet configs) {}

    @Override
    public void reportAttemptingFullContext(Recognizer<?, ?> recognizer, DFA dfa, int startIndex, int stopIndex, BitSet conflictingAlts, ATNConfigSet configs) {}

    @Override
    public void reportContextSensitivity(Recognizer<?, ?> recognizer, DFA dfa, int startIndex, int stopIndex, int prediction, ATNConfigSet configs) {}
});

核心说明

  • 词法分析阶段触发的syntaxError中,offendingSymbol本质就是Token实例,强转不会出现类型转换异常
  • 未识别的单个字符对应的Token,其getText()方法直接返回该字符本身,无需从msg中截取内容
  • 注意charPositionInLine从0开始计数,给用户展示时通常需要+1,符合日常阅读习惯

内容的提问来源于stack exchange,提问作者Oliver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 10:11:15