2015-03-30 13 views
0

我知道这是可能产生使用ANTLR的TestRig“GRUN”通过终端解析树的图形表示:从Java应用程序中运行ANTRL TestRig GUI

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

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

我已经试过如下:

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

但我得到这个消息:

无法加载实例为词法分析器或

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

如何正确设置参数?如果这是不可能的,在Java应用程序中是否有其他方式运行ANTLR的TestRig?

+0

你有没有尝试设置CLASSPATH出口后,从命令行运行Java代码= “:在/ usr/local/lib目录/ ANTLR-4.2.2-complete.jar:$ CLASSPATH”?请根据需要更改antlr-4.2.2-complete.jar的位置。如果它从命令行运行,那么可能是它在你的eclipse设置中的唯一问题 – Saurabh 2015-03-30 18:24:08

+0

是的,我已经设置了类路径,但是从命令行运行应用程序得到了相同的结果。我确实把所有的java类都放在同一个包里,但是没有帮助。 – 2015-03-31 00:26:13

+0

如果你看看TestRig的源代码,那么它看起来很像类加载问题。我可以在这里建议的是继续挖掘这些线。 – Saurabh 2015-03-31 19:08:44

回答

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