【问题标题】:How to Display ANTLR Tree GUI如何显示 ANTLR 树 GUI
【发布时间】:2014-05-22 13:58:52
【问题描述】:

如果你有这样的代码,无论是控制台还是摆动,你如何显示 AST GUI? 我的 ANTLR 是第 3 版。

CharStream stream = new ANTLRStringStream("program XLSample1 =\n" + 
            "constant one : Integer := 1;\n" + 
            "constant two : Integer := 2;\n" + 
            "var a, b,c : Integer := 42;\n" + 
            "begin\n" + 
            " x:= (12 + 6) - (7 * 41) - x mod y;\n" + 
            " y := 21;\n" + 
            "\n" + 
            "if x < 10 then\n" + 
            "  y :=2;\n" + 
            "  elseif x < 20 then\n" + 
            "  y := 20;\n" + 
            "  else\n" + 
            "  y := 30;\n" + 
            "end if; \n" + 
            "end XLSample1.");
    SampleLexer lexer  = new SampleLexer(stream);   
    TokenStream tokenStream = new CommonTokenStream(lexer);
    SampleParser parser = new SampleParser(tokenStream);
    parser.program();       
    System.out.println("OK");       
}

【问题讨论】:

    标签: java swing user-interface tree antlr


    【解决方案1】:

    使用ANTLR V4(对于V3尝试找出类似的API),显示一个gui AST,你可以使用org.antlr.v4.runtime.tree.gui.TreeViewer

    您可以从ANTLR's site 获得 Hello 演示。一旦你得到它,运行这个简单的演示:

    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 viewer = new TreeViewer(Arrays.asList(
                    parser.getRuleNames()),tree);
            viewer.setScale(1.5); // Scale a little
            panel.add(viewer);
            frame.add(panel);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);
        }
    }
    

    然后您将在控制台中获得 AST 打印并显示在 JFrame 中。 更多详情请参考ANTLR API

    确保您的语法正常,然后您可以修改此演示以满足您的要求。

    ANTLR 4 更新TreeViewer 已从 ANTLR 4 Tool 移至 org.antlr.v4.gui.TreeViewer 包。

    使用maven时,TreeViewer需要以下依赖:

    <dependency>
        <groupId>org.antlr</groupId>
        <artifactId>antlr4</artifactId>
        <version>4.7.2</version>
    </dependency>
    

    【讨论】:

    • rParseTree tree = parser.r();返回的方法是什么? -- 我在解析器中没有看到返回ParseTree 的方法。
    • ParseTree 树 = parser.translationunit(); System.out.println(tree.toStringTree(parser));
    【解决方案2】:

    在尝试自定义 wangdq 代码几次尝试后,我发现可以调用 TreeViewer 类的 open 方法来获得令人愉快的(因为它已经完成了:)) Parse Tree Inspector。

    应用于wangdq示例:

    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
            TreeViewer viewr = new TreeViewer(Arrays.asList(
                    parser.getRuleNames()),tree);
            viewr.open();
        }
    }
    

    【讨论】:

      【解决方案3】:

      在 ANTLR 4 中使用 import org.antlr.v4.runtime.tree.gui.TreeViewer ...它的作品 :)

      【讨论】:

        猜你喜欢
        • 2015-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多