Java 如何获取antlr解析的错误消息?

Java 如何获取antlr解析的错误消息?,java,parsing,antlr,antlr4,lexer,Java,Parsing,Antlr,Antlr4,Lexer,我用antlr 4.4编写了一个语法,如下所示: grammar CSV; file : row+ EOF ; row : value (Comma value)* (LineBreak | EOF) ; value : SimpleValueA | QuotedValue ; Comma : ',' ; LineBreak : '\r'? '\n' | '\r' ; SimpleValue : ~(',' | '\

我用antlr 4.4编写了一个语法,如下所示:

grammar CSV;

file
  :  row+ EOF
  ;

row
  :  value (Comma value)* (LineBreak | EOF)
  ;

value
  :  SimpleValueA
  |  QuotedValue
  ;

Comma
  :  ','
  ;

LineBreak
  :  '\r'? '\n'
  |  '\r'
  ;

SimpleValue
  :  ~(',' | '\r' | '\n' | '"')+
  ;

QuotedValue
  :  '"' ('""' | ~'"')* '"'
  ;
然后我使用antlr 4.4生成解析器和词法分析器, 这个过程是成功的

生成类之后,我编写了一些使用语法的java代码

import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;

public class Main {

    public static void main(String[] args)
    {
        String source =  "\"a\",\"b\",\"c";
        CSVLexer lex = new CSVLexer(new ANTLRInputStream(source));
        CommonTokenStream tokens = new CommonTokenStream(lex);
        tokens.fill();
        CSVParser parser = new CSVParser(tokens);
        CSVParser.FileContext file = parser.file();
    }
}
以上所有代码都是CSV字符串的解析器 例如:“a”、“b”、“c”

窗口输出:

line 1:8 token recognition error at: '"c'
line 1:10 missing {SimpleValue, QuotedValue} at '<EOF>'
第1:8行的令牌识别错误位于:''c'
第1:10行“”处缺少{SimpleValue,QuotedValue}
我想知道如何从代码隐藏中的方法(getErrors()或…)中获取此错误,而不是作为输出窗口的结果


有人能帮我吗?

使用ANTLR进行CSV解析对我来说是一个核心选项,但既然你已经做到了

  • 实现接口
    antlErrorListener
    。您可以为此扩展
    BaseErrorListener
    。收集错误并将其附加到列表中
  • 调用
    parser.removeErrorListeners()
    删除默认侦听器
  • 调用
    parser.addErrorListener(yourListenerInstance)
    添加您自己的侦听器
  • 解析您的输入
现在,对于lexer,您可以执行相同的操作
删除errorlisteners
/
添加errorlistener
,或者在末尾添加以下规则:

UNKNOWN_CHAR : . ;
有了这个规则,lexer将永远不会失败(当它不能做任何其他事情时,它将生成
UNKNOWN\u CHAR
标记),所有错误都将由解析器生成(因为它不知道如何处理这些
UNKNOWN\u CHAR
标记)。我推荐这种方法