从Java应用程序中运行ANTLR TestRig GUI

时间:2015-03-30 18:04:54

标签: java eclipse antlr antlr4

我知道可以使用ANTLR的TestRig" grun"生成解析树的图形表示。通过终端:

$ alias grun='java org.antlr.v4.runtime.misc.TestRig'​​
$ grun Example test -gui
hello world
​​​​E​O​F​​​​

但是可以从Java应用程序中调用TestRig吗?我想利用TestRig功能创建一个Java应用程序,它接受用户输入并显示生成的解析树图形表示。

我已经尝试了以下内容:

import org.antlr.v4.runtime.misc.TestRig;
...
TestRig test = new TestRig(args);
test.process();

但我收到了这条消息:

  

无法将示例加载为词法分析器或解析器

它看起来应该有效,因为它正确识别了我在Eclipse上设置的参数Example test -gui,但TestRig似乎无法找到语法。

如何正确设置参数?如果那不可能,还有其他方法可以在Java应用程序中运行ANTLR的TestRig吗?

2 个答案:

答案 0 :(得分:1)

这个代码片段适用于我(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();
}

答案 1 :(得分:0)

好的,我已经解决了我的问题。通过查看TestRig类的源代码,我发现我只需要使用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);