为什么不显示解析树?

Why is parse tree not being displayed?

我有一个 ANTLR 语法,并试图在 Java 中使用 jFrame 制作一个解析树来显示。但是,解析树并未显示,如下所示。

我确实注意到,如果我删除对访问者行的调用 Object answer = new ExpAnalyserBaseVisitor<>().visit(parser.exp());,那么解析树就会正确显示。我不确定为什么这是个问题以及如何解决它。

这是我的显示代码:

CharStream charStream = CharStreams.fromString(exp);

ExpAnalyserLexer lexer = new ExpAnalyserLexer(charStream);
lexer.removeErrorListeners();

CommonTokenStream tokens = new CommonTokenStream(lexer);

ExpAnalyserParser parser = new ExpAnalyserParser(tokens);
parser.removeErrorListeners();

try {
    Object answer = new ExpAnalyserBaseVisitor<>().visit(parser.exp());
    System.out.println("Postfix Expression: " + answer);
}
catch (EmptyStackException e){
    System.out.println("Invalid expression!");
    return;
}

ParseTree tree = parser.exp();
JFrame frame = new JFrame("Parse Tree");
JPanel panel = new JPanel();
TreeViewer treeViewer = new TreeViewer(Arrays.asList(parser.getRuleNames()), tree);
treeViewer.setScale(1.5);
panel.add(treeViewer);
frame.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
frame.setVisible(true);

有没有更好的方法来显示解析树?我也可以删除规则名称以显示在解析树中吗?

您正在调用 parser.exp() 2 次而没有倒回您的输入流。第一次调用消耗了所有令牌,第二次调用找不到任何输入,因此它无法解析任何内容。您至少应该在第二次调用 parse.expr() 之前调用 tokens.reset()。也许您还必须重置字符流和词法分析器。和他们一起玩。