为什么解析树没有显示?

时间:2018-02-21 19:41:40

标签: java antlr4 abstract-syntax-tree parse-tree

我有一个ANTLR语法并尝试使用Java中的jFrame来显示一个解析树。但是,解析树没有显示,因为它可以在下面看到。

Parse Tree not displaying correctly

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

Parse Tree displaying correctly

以下是我显示它的代码:

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);

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

1 个答案:

答案 0 :(得分:0)

您正在调用parser.exp() 2次而不重绕输入流。第一个调用消耗所有标记,第二个调用没有找到任何输入,因此无法解析任何内容。您应该在第二次致电tokens.reset()之前至少致电parse.expr()。也许你还需要重置你的char流和词法分析器。和他们一起玩。