【问题标题】:Why is parse tree not being displayed?为什么不显示解析树?
【发布时间】:2018-02-21 19:41:40
【问题描述】:

我有一个 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);

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 2012-11-26
      • 2019-11-14
      相关资源
      最近更新 更多