使用 Java 在 ANTLR4 中绘制解析树
Drawing parse tree in ANTLR4 using Java
我是 ANTLR4 的新手,当我第一次在命令行中尝试它时,我使用的是 grun
和 gui
参数。现在我正在开发一个 Java 应用程序,我想在执行我的 Java 程序时显示相同的对话框。
我成功生成了 ParseTree,并且可以在其中导航。但我也想展示它。我认为它与 TreeViewer
class 有关,但我不知道如何使用它。
谢谢
TreeViewer 是一个 Swing 组件,因此您应该能够将它添加到任何其他 SwingComponent,例如 JPanel。
要实例化 TreeViewer(List<String> rules, Tree tree)
,您必须提供:
- 一个完整的规则名称列表,你可以在这里使用
null
,但是使用Parser.getRuleNames()
的结果会产生更好的结果
- 一棵树,这是您解析的结果(类似于
XXXContext
)。
从另一个post
复制
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);
}
}
我是 ANTLR4 的新手,当我第一次在命令行中尝试它时,我使用的是 grun
和 gui
参数。现在我正在开发一个 Java 应用程序,我想在执行我的 Java 程序时显示相同的对话框。
我成功生成了 ParseTree,并且可以在其中导航。但我也想展示它。我认为它与 TreeViewer
class 有关,但我不知道如何使用它。
谢谢
TreeViewer 是一个 Swing 组件,因此您应该能够将它添加到任何其他 SwingComponent,例如 JPanel。
要实例化 TreeViewer(List<String> rules, Tree tree)
,您必须提供:
- 一个完整的规则名称列表,你可以在这里使用
null
,但是使用Parser.getRuleNames()
的结果会产生更好的结果 - 一棵树,这是您解析的结果(类似于
XXXContext
)。
从另一个post
复制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);
}
}