Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何显示ANTLR树GUI_Java_Swing_User Interface_Tree_Antlr - Fatal编程技术网

Java 如何显示ANTLR树GUI

Java 如何显示ANTLR树GUI,java,swing,user-interface,tree,antlr,Java,Swing,User Interface,Tree,Antlr,如果您有这样的代码,无论是console还是swing,如何显示ASTGUI? 我的ANTLR是版本3 CharStream stream = new ANTLRStringStream("program XLSample1 =\n" + "constant one : Integer := 1;\n" + "constant two : Integer := 2;\n" + "var a, b,c : Integer

如果您有这样的代码,无论是console还是swing,如何显示ASTGUI? 我的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");       
}
CharStream-stream=new-ANTLRStringStream(“程序XLSample1=\n”+
“常数一:整数:=1;\n”+
“常数二:整数:=2;\n”+
变量a、b、c:整数:=42;\n“+
“开始\n”+
“x:=(12+6)-(7*41)-x模y;\n”+
“y:=21;\n”+
“\n”+
“如果x<10,则\n”+
“y:=2;\n”+
“elseif x<20那么\n”+
“y:=20;\n”+
“else\n”+
“y:=30;\n”+
“如果结束;\n”+
“结束样本1”);
SampleLexer lexer=新的SampleLexer(流);
TokenStream TokenStream=新的CommonTokenStream(lexer);
SampleParser=新的SampleParser(令牌流);
parser.program();
System.out.println(“OK”);
}
使用ANTLR V4(对于V3,请尝试找出类似的API),要显示gui AST,可以使用
org.ANTLR.V4.runtime.tree.gui.TreeViewer

您可以从中获得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 4的更新
TreeViewer
已从迁移到
org.ANTLR.v4.gui.TreeViewer

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

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

org.antlr
antlr4
4.7.2

在antlr 4中使用import org.antlr.v4.runtime.tree.gui.TreeViewer…其工作原理:)

在尝试了几次自定义wangdq代码之后,我发现调用TreeViewer类的open方法可以获得一个令人愉快的(因为它已经完成了:)解析树检查器

应用于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();
    }
}

ParseTree=parser.r()中的
r
方法是什么返回?--我在解析器中没有看到返回
ParseTree
.ParseTree=parser.translationunit()的方法;System.out.println(tree.toStringTree(解析器));