2013-01-31 9 views
5

Ho creato un lexer utilizzando antlr 4 per la tokenizzazione dei testi in lingua naturale turca, quello che devo fare è avere un flusso di token che posso recuperare i token uno per uno. CommonTokenStream restituisce una lista se lo uso come questo:Come utilizzare antlr 4 TokenStream come flusso iterabile?

ANTLRInputStream inputStream = new ANTLRInputStream(input); 
TurkishLexer lexer = new TurkishLexer(inputStream); 
CommonTokenStream tokenStream = new CommonTokenStream(lexer); 
List<Token> tokens = tokenStream.fill(); 
for (Token token : token) ... 

Comunque non voglio costruire un elenco di token come il mio ingresso potrebbe essere enorme, voglio solo qualcosa di simile:

for (Token token: tokenStream.next()) ... 

Che vorrei ripetere fino a ottenere un token EOF.

Esiste un token stream che mi consente di eseguire iterazioni su token?

risposta

10

Invece di utilizzare CommonTokenStream, è possibile utilizzare semplicemente Lexer.nextToken.

for (Token token = lexer.nextToken(); 
    token.getType() != Token.EOF; 
    token = lexer.nextToken()) 
{ 
    ... 
+0

Ah grazie mille. Ancora forse sarebbe bello esporlo nei flussi di Token. Come nota a margine, la versione di Java utilizza lexer.nextToken() – mdakin