2015-03-03 63 views
1

我試圖弄清楚如何從解析器中獲取值。 我的輸入是'玩誰',它應該返回一個字符串與'誰'。在java中Antlr 3.3返回值

Sample.g:

text returns [String value] 
: speech = wordExp space name {$value = $speech.text;} 
; 

name returns [String value] 
: SongArtist = WORD (space WORD)* {$value = $SongArtist.text;} 
; 

wordExp returns [String value] 
: command = PLAY {$value = $command.text;} | command = SEARCH {$value = $command.text;} 
; 

PLAY : 'play'; 
SEARCH : 'search'; 
space : ' '; 

WORD : ('a'..'z' | 'A'..'Z')*; 


WS 
: ('\t' | '\r'| '\n') {$channel=HIDDEN;} 
; 

如果我進入 '打誰' 那棵樹出現:

http://i.stack.imgur.com/ET61P.png

我創建一個Java文件趕上輸出。如果我調用parser.wordExp(),我應該得到'who',但它返回對象和EOF失敗(請參閱下面的輸出)。 parser.text()返回'play'。

import org.antlr.runtime.*; 

import a.b.c.SampleLexer; 
import a.b.c.SampleParser; 

public class Main { 
    public static void main(String[] args) throws Exception { 
     ANTLRStringStream in = new ANTLRStringStream("play the who"); 

     SampleLexer lexer = new SampleLexer(in); 
     CommonTokenStream tokens = new CommonTokenStream(lexer); 
     SampleParser parser = new SampleParser(tokens); 

     System.out.println(parser.text()); 
     System.out.println(parser.wordExp()); 
    } 
} 

控制檯回報這樣的:

play 
[email protected] 
line 1:12 no viable alternative at input '<EOF>' 

如何我趕上'的是誰?這對我來說很奇怪,爲什麼我無法抓住這個字符串。解釋器正確地創建樹。

回答

1

首先,在您的文法中,speech只被分配了解析器規則wordExp的返回值。如果你想操縱規則name的返回值,你可以用下面的例子來做一個額外的變量。其次,調用parser.text()解析整個輸入。第二次調用(在你的情況parser.wordExp())因此找到EOF。如果您刪除第二個電話,則no viable alternative at input 'EOF'將消失。

可能有更好的方法來做到這一點,但同時這可能會幫助你。