2013-01-31 24 views
5

Tôi đã tạo một lexer bằng cách sử dụng antlr 4 để mã hóa các văn bản ngôn ngữ tự nhiên của Thổ Nhĩ Kỳ, những gì tôi cần làm là có một luồng mã thông báo mà tôi có thể tìm nạp từng thẻ một. CommonTokenStream trả về một danh sách nếu tôi sử dụng nó như thế này:Làm thế nào để sử dụng antlr 4 TokenStream dưới dạng luồng lặp lại?

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

Tuy nhiên tôi không muốn xây dựng một danh sách các thẻ như là đầu vào của tôi có thể là rất lớn, tôi chỉ muốn một cái gì đó như:

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

Mà tôi sẽ lặp lại cho đến khi nhận được một mã thông báo EOF.

Có một Dòng mã thông báo cho phép tôi lặp qua mã thông báo không?

Trả lời

10

Thay vì sử dụng CommonTokenStream, bạn có thể chỉ cần sử dụng Lexer.nextToken.

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

Ah cảm ơn rất nhiều. Tuy nhiên có lẽ nó sẽ được tốt đẹp để lộ này trong Token suối. Như một lưu ý phụ, phiên bản Java sử dụng lexer.nextToken() – mdakin

Các vấn đề liên quan