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