无法捕获ANTLR4语法错误

时间:2018-12-03 12:20:46

标签: java grammar antlr4

在我访问ParseTree之前,我试图在ANTLR4中捕获语法错误。简化,我声明双精度的语法是这样的:

双重类型的语法(解析器规则):

declare_double: DOUBLE_TYPE  WHITESPACE ID WHITESPACE(EQUALS WHITESPACE DOUBLE)? SEMICOLON;

双重类型(词法规则)的语法:

DOUBLE: [0-9]+ '.' [0-9]+ | '.' [0-9]+ | [0-9]+;

编译器类:

公共类编译器实现ANTLRErrorListener {     公共静态void main(String [] args){

    //CharStream chars = CharStreams.fromString("double a = 3.1415;");
    CharStream chars = CharStreams.fromString("double a = 3;");


    SimpleJavaLexer lexer = new SimpleJavaLexer(chars);
    CommonTokenStream tokens = new CommonTokenStream(lexer);

    SimpleJavaParser parser = new SimpleJavaParser(tokens);

    ANTLRErrorListener errorListener = new BaseErrorListener();

    //parser.removeErrorListeners();

    parser.addErrorListener(errorListener);

    SimpleJavaParser.ProgramContext programTree = parser.program();


    TypeChecker visitor = new TypeChecker();
    visitor.visit(programTree);
}

@Override
public void syntaxError(Recognizer<?, ?> recognizer, Object o, int i, int i1, String s, RecognitionException e) {
    System.out.println("Syntax Error");
}

@Override
public void reportAmbiguity(Parser parser, DFA dfa, int i, int i1, boolean b, BitSet bitSet, ATNConfigSet atnConfigSet) {
    System.out.println("Report ambiguity");
}

@Override
public void reportAttemptingFullContext(Parser parser, DFA dfa, int i, int i1, BitSet bitSet, ATNConfigSet atnConfigSet) {
    System.out.println("Report attempting full context");
}

@Override
public void reportContextSensitivity(Parser parser, DFA dfa, int i, int i1, int i2, ATNConfigSet atnConfigSet) {
    System.out.println("Report context sensitivity");
}

如果运行此命令,但没有从解析器中删除默认侦听器,则会得到以下结果:

默认错误侦听器输出

line 1:11 mismatched input '3' expecting DOUBLE
line 1:12 extraneous input ';' expecting {<EOF>, WHITESPACE, '(', INTEGER,BOOLEAN, DOUBLE, STRING, ID}

我遇到的问题是,显示此错误后,将实例化访问者,它将访问TypeChecker。每当发现错误时,我都不想继续。我认为通过像我一样实现错误侦听器,我可以创建自己的错误消息并停止运行程序。我希望可以触发语法错误方法,但不会。我已将该主题用作参考:

https://stackoverflow.com/questions/25832429/how-get-error-messages-of-antlr-parsing

我如何适当地侦听错误并进行相应的管理?

谢谢。

1 个答案:

答案 0 :(得分:0)

您的 example .sort((a, b) => a.name.localeCompare(b.name)) .map(m => { return { name: m.name, children: m.children.sort((a, b) => a.name.localeCompare(b.name)) }; }); 类实现了Compiler,但您从未使用过它,甚至没有实例化它,因此它没有任何作用。

相反,您实例化了ANTLRErrorListener,它什么也不做(实际上,我什至对代码进行了编译感到有些惊讶-我本来希望BaseErrorListener是一个抽象类)。

如果将BaseErrorListener替换为new BaseErrorListener(),则将调用您的new Compiler()方法。

PS:我建议您将类重命名为包含单词syntaxError的名称,因为名称ErrorListener肯定不会明显表明它是一个错误侦听器。