运行 Java 应用程序中的 ANTRL TestRig GUI
Running ANTRL TestRig GUI from within a Java application
我知道可以通过终端使用 ANTLR 的 TestRig "grun" 生成解析树的图形表示:
$ alias grun='java org.antlr.v4.runtime.misc.TestRig'
$ grun Example test -gui
hello world
EOF
但是可以从 Java 应用程序中调用 TestRig 吗?我想利用 TestRig 功能制作一个 Java 应用程序,它接受用户输入并显示生成的解析树图形表示。
我已经尝试过以下方法:
import org.antlr.v4.runtime.misc.TestRig;
...
TestRig test = new TestRig(args);
test.process();
但我收到了这条消息:
Can't load Example as lexer or parser
看起来应该可行,因为它正确识别了我在 Eclipse 上设置的参数 Example test -gui
,但 TestRig 似乎无法找到语法。
如何正确设置参数?如果那不可能,在 Java 应用程序中是否有任何其他方式 运行 ANTLR 的 TestRig?
好的,我的问题已经解决了。通过查看 TestRig class 的源代码,我发现我只需要使用 inspect() 方法来生成 GUI 视图。这是一个示例代码:
// Create an input stream that receives text from the terminal
ANTLRInputStream input = new ANTLRInputStream(System.in);
// Create an Lexer that receives the char stream
ExampleLexer lexer = new ExampleLexer(input);
// Create a token stream from the lexer
CommonTokenStream tokens = new CommonTokenStream(lexer);
// Create a parser that receives the token stream
ExampleParser parser = new ExampleParser(tokens);
// Create a parser tree starting from the first rule
TestContext tree = parser.test();
//Generates the GUI
tree.inspect(parser);
编辑:对于版本 4.5.1,生成树的代码更改为:
//Generates the GUI
Trees.inspect(tree, parser);
这段代码适合我 (antlr-4.5.3-complete.jar):
void showGuiTreeView(final String code)
{
final org.antlr.v4.runtime.CharStream stream = new ANTLRInputStream(code);
final MyLexer lexer = new MyLexer(stream);
final CommonTokenStream tokens = new CommonTokenStream(lexer);
final MyParser parser = new MyParser(tokens);
final ParseTree tree = parser.expr();
final List<String> ruleNames = Arrays.asList(MyParser.ruleNames);
final TreeViewer view = new TreeViewer(ruleNames, tree);
view.open();
}
我知道可以通过终端使用 ANTLR 的 TestRig "grun" 生成解析树的图形表示:
$ alias grun='java org.antlr.v4.runtime.misc.TestRig'
$ grun Example test -gui
hello world
EOF
但是可以从 Java 应用程序中调用 TestRig 吗?我想利用 TestRig 功能制作一个 Java 应用程序,它接受用户输入并显示生成的解析树图形表示。
我已经尝试过以下方法:
import org.antlr.v4.runtime.misc.TestRig;
...
TestRig test = new TestRig(args);
test.process();
但我收到了这条消息:
Can't load Example as lexer or parser
看起来应该可行,因为它正确识别了我在 Eclipse 上设置的参数 Example test -gui
,但 TestRig 似乎无法找到语法。
如何正确设置参数?如果那不可能,在 Java 应用程序中是否有任何其他方式 运行 ANTLR 的 TestRig?
好的,我的问题已经解决了。通过查看 TestRig class 的源代码,我发现我只需要使用 inspect() 方法来生成 GUI 视图。这是一个示例代码:
// Create an input stream that receives text from the terminal
ANTLRInputStream input = new ANTLRInputStream(System.in);
// Create an Lexer that receives the char stream
ExampleLexer lexer = new ExampleLexer(input);
// Create a token stream from the lexer
CommonTokenStream tokens = new CommonTokenStream(lexer);
// Create a parser that receives the token stream
ExampleParser parser = new ExampleParser(tokens);
// Create a parser tree starting from the first rule
TestContext tree = parser.test();
//Generates the GUI
tree.inspect(parser);
编辑:对于版本 4.5.1,生成树的代码更改为:
//Generates the GUI
Trees.inspect(tree, parser);
这段代码适合我 (antlr-4.5.3-complete.jar):
void showGuiTreeView(final String code)
{
final org.antlr.v4.runtime.CharStream stream = new ANTLRInputStream(code);
final MyLexer lexer = new MyLexer(stream);
final CommonTokenStream tokens = new CommonTokenStream(lexer);
final MyParser parser = new MyParser(tokens);
final ParseTree tree = parser.expr();
final List<String> ruleNames = Arrays.asList(MyParser.ruleNames);
final TreeViewer view = new TreeViewer(ruleNames, tree);
view.open();
}