2015-03-30 104 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(); 
}