2013-03-23 79 views
1

我是Antlr的新手。我寫練習了一點語法,但得到由API CommonTokenStream從CommonTokenStream沒有令牌使用Antlr

lexer grammar Expr; 
options { 
    language = Java; 
} 

EXPRS:EXPRT {System.out.println($EXPRT.text);}; 
fragment 
EXPRT : 'xxx' ID {System.out.println($ID.text);} ' zzz'; 
fragment 
ID : ('a'..'z' |'A'..'Z' |'_')('a'..'z' |'A'..'Z'|'_')*; 

測試代碼是這樣的困惑:

ANTLRStringStream input = new ANTLRStringStream(msg); 
Expr expr = new Expr(input); 
CommonTokenStream cs = new CommonTokenStream(expr); 
System.out.println(cs.size()); 

無論輸入的是,沒有從CommonTokenStream令牌。 但是,直接使用expr時會輸出。 任何人都知道爲什麼? antlr的版本是3.5

回答

2

CommonTokenStream被懶惰地初始化。爲了迫使它立即填充所有令牌(在您的詞法分析器調用nextToken達到EOF直到),你可以調用fill()方法:

CommonTokenStream cs = new CommonTokenStream(expr); 
cs.fill(); 
System.out.println(cs.size()); 
+0

非常感謝你。有用。這個問題花了我兩天時間。我在互聯網上找到的所有樣本都沒有提到它。我訪問官方網站,只找到了一個java文檔。你知道antlr的API介紹的任何材料嗎? – user2202494 2013-03-24 12:31:25