在我访问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
我如何适当地侦听错误并进行相应的管理?
谢谢。
答案 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
肯定不会明显表明它是一个错误侦听器。