如何在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
相关产品推荐
相关产品推荐

