我有一个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);
有没有更好的方法来显示解析树?我也可以删除要在解析树中显示的规则名称吗?
答案 0 :(得分:0)
您正在调用parser.exp()
2次而不重绕输入流。第一个调用消耗所有标记,第二个调用没有找到任何输入,因此无法解析任何内容。您应该在第二次致电tokens.reset()
之前至少致电parse.expr()
。也许你还需要重置你的char流和词法分析器。和他们一起玩。