用于Java的ANTLR4。如何在词法分析中显示错误

用于Java的ANTLR4。如何在词法分析中显示错误,java,antlr4,Java,Antlr4,如何在词法分析期间显示错误列表(如果有)。 我尝试了以下方法,但我的输出是[org.antlr.v4.runtime]。ConsoleErrorListener@1026c84c] 我写的代码是: private static String errorsOutput(String code) { Java8Lexer lexer = new Java8Lexer(new ANTLRInputStream(code)); CommonTokenStream tokens = ne

如何在词法分析期间显示错误列表(如果有)。 我尝试了以下方法,但我的输出是[org.antlr.v4.runtime]。ConsoleErrorListener@1026c84c]

我写的代码是:

private static String errorsOutput(String code) {
    Java8Lexer lexer = new Java8Lexer(new ANTLRInputStream(code));

    CommonTokenStream tokens = new CommonTokenStream(lexer);
    Java8Parser parser = new Java8Parser(tokens);

    return ""+lexer.getErrorListeners();
}
主要类别:

String code = "public class Main {public static void main(String[] args) {System.out.println("Hello, world")}}";
System.out.println( errorsOutput(code) );
在这个例子中没有任何迹象
[;]我需要程序来显示这个错误

你所描述的不是词法分析,而是语法分析

以下是添加自定义错误侦听器和收集消息的方式:

String source = "public class Main {\n" +
        "    public static void main(String[] args) {\n" +
        "        System.out.println(\"Hello, world\")\n" +
        "    }\n" +
        "}";

Java8Lexer lexer = new Java8Lexer(CharStreams.fromString(source));
Java8Parser parser = new Java8Parser(new CommonTokenStream(lexer));

parser.removeErrorListeners();

final List<String> errorMessages = new ArrayList<>();

parser.addErrorListener(new BaseErrorListener(){
    @Override
    public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) {
        errorMessages.add(msg);
    }
});

parser.compilationUnit();

System.out.println("errorMessages: " + errorMessages);
它无法匹配println语句,因为缺少
因此它会尝试匹配另一个
来完成
方法调用,该调用也会失败。这就是语法的结构,对此没什么可做的(除了重写大部分语法)

如果您分析这个:

String source=“public class Main{\n”+
“公共静态void main(字符串[]args){\n”+
“foo()\n”+
“}\n”+
"}";

然后你会得到这样的信息:
missing';'在“}”

通常你会用try/catch捕捉错误——我看不到你的。您要打印的是从错误侦听器返回的
toString()
。恐怕打印侦听器对象是没有意义的。