【问题标题】:Drawing parse tree in ANTLR4 using Java使用Java在ANTLR4中绘制解析树
【发布时间】:2018-01-20 10:05:58
【问题描述】:

我是 ANTLR4 的新手,当我第一次在命令行中尝试它时,我使用的是 grungui 参数。现在我正在开发一个 Java 应用程序,我想在执行我的 Java 程序时显示相同的对话框。

我成功生成了 ParseTree,我可以浏览它。但我也想展示它。我认为它与TreeViewer 类有关,但我不知道如何使用它。

谢谢

【问题讨论】:

    标签: java antlr antlr4


    【解决方案1】:

    TreeViewer 是一个 Swing 组件,因此您应该能够将其添加到任何其他 SwingComponent,例如 JPanel。

    要实例化 TreeViewer(List<String> rules, Tree tree),您必须提供:

    • 完整的规则名称列表,您可以在此处使用null,但使用Parser.getRuleNames() 的结果会产生更好的结果
    • 一棵树,它是您的解析结果(类似于XXXContext)。

    【讨论】:

      【解决方案2】:

      复制自另一个帖子

      import java.util.Arrays;
      import javax.swing.JFrame;
      import javax.swing.JPanel;
      
      import org.antlr.v4.runtime.ANTLRInputStream;
      import org.antlr.v4.runtime.CharStream;
      import org.antlr.v4.runtime.CommonTokenStream;
      import org.antlr.v4.runtime.TokenStream;
      import org.antlr.v4.runtime.tree.ParseTree;
      import org.antlr.v4.runtime.tree.gui.TreeViewer;
      
      /**
       * A simple demo to show AST GUI with ANTLR
       * @see http://www.antlr.org/api/Java/org/antlr/v4/runtime/tree/gui/TreeViewer.html
       * 
       * @author wangdq
       * 2014-5-24
       *
       */
      public class HelloTestDrive {
          public static void main(String[] args) {
              //prepare token stream
              CharStream stream = new ANTLRInputStream("hello antlr");
              HelloLexer lexer  = new HelloLexer(stream);   
              TokenStream tokenStream = new CommonTokenStream(lexer);
              HelloParser parser = new HelloParser(tokenStream);
              ParseTree tree = parser.r(); 
      
              //show AST in console
              System.out.println(tree.toStringTree(parser));
      
              //show AST in GUI
              JFrame frame = new JFrame("Antlr AST");
              JPanel panel = new JPanel();
              TreeViewer viewr = new TreeViewer(Arrays.asList(
                      parser.getRuleNames()),tree);
              viewr.setScale(1.5);//scale a little
              panel.add(viewr);
              frame.add(panel);
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              frame.setSize(200,200);
              frame.setVisible(true);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-08-31
        • 1970-01-01
        • 2014-06-16
        • 1970-01-01
        • 2018-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多