如何获取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来生成解析器&lexer,这个过程是成功的

生成类之后,我编写了一些使用语法的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>'

我想知道如何从方法(getErrors()或…)中获取这些错误在代码后面不是输出窗口的结果

有人能帮我吗?

使用ANTLR进行CSV解析是IMHO的核心选项,但由于您正在进行…

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

现在,对于lexer,您可以执行相同的操作removeErrorListeners/addErrorListener,或者在末尾添加以下规则:

UNKNOWN_CHAR : . ;

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

相关内容

  • 没有找到相关文章

最新更新