为什么不显示解析树?
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()
。也许您还必须重置字符流和词法分析器。和他们一起玩。
我有一个 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()
。也许您还必须重置字符流和词法分析器。和他们一起玩。