如何在词法分析过程中显示错误列表(如果有)。
我尝试了以下方法,但我的输出是[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);
请注意,上面的代码片段将显示消息mismatched input '(' expecting '.'
因为在这个位置:
System.out.println(
// ^
// |
// '-- here
它无法匹配 println 语句,因为缺少;
所以它然后尝试匹配另一个.
完成一个methodInvocation
,这也失败了。这就是语法的结构,对此没什么可做的(除了重写它的大部分)。
如果你解析这个:
String source = "public class Main {\n" +
" public static void main(String[] args) {\n" +
" foo()\n" +
" }\n" +
"}";
然后你确实收到消息:missing ';' at '}'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)