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

我用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 '' 

我想知道如何从代码隐藏中的方法(getErrors()或…)中获取此错误而不是作为输出窗口的结果

谁能帮我 ?

使用ANTLR进行CSV解析是一个核选项恕我直言,但是因为你在…

  • 实现接口ANTLRErrorListener 。 您可以BaseErrorListener扩展BaseErrorListener 。 收集错误并将其附加到列表中。
  • 调用parser.removeErrorListeners()以删除默认侦听器
  • 调用parser.addErrorListener(yourListenerInstance)来添加自己的侦听器
  • 解析你的输入

现在,对于词法分析器,您可以执行相同的操作removeErrorListeners / removeErrorListeners ,或者在末尾添加以下规则:

 UNKNOWN_CHAR : . ; 

使用此规则,词法分析器将永远不会失败(当它无法执行任何其他操作时将生成UNKNOWN_CHAR标记)并且所有错误都将由解析器生成(因为它不知道如何处理这些UNKNOWN_CHAR标记)。 我推荐这种方法。