Używanie Antlr do analizowania danych z niekończącego się strumienia
Czy Antlr nadaje się do analizowania danych ze strumieni, które nie mają EOF bezpośrednio po tekście do analizy? Zgodnie z moimi obserwacjami leksyk nie emituje aktualnego tokena, dopóki nie otrzyma pierwszego znaku następnego tokena. Ponadto - parser wydaje się nie emitować reguły, dopóki nie otrzyma pierwszego znacznika następnej reguły. Oto prosta gramatyka, którą próbowałem:
fox: 'quick' 'brown' 'fox' '\r'? '\n' ;
Następnie użyłem wygenerowanego parsera z UnbufferedCharStream i UnbufferedTokenStream:
CharStream input = new UnbufferedCharStream(is);
MyLexer lex = new MyLexer(input);
lex.setTokenFactory(new CommonTokenFactory(true));
TokenStream tokens = new UnbufferedTokenStream(lex);
MyParser parser = new MyParser(tokens);
MyParser.FoxContext fox = parser.fox();
kiedy strumień się pojawiszybki' - nic się nie dzieje.
gdy 'b„wchodzi - wchodzi reguła”lis'
następnie 'roun'- nic (2 strumienie są w strumieniu - żaden z nich nie jest jeszcze znany do przeskoczenia!)
tylko po 'f„słuchacz odwiedza pierwszy token:”szybki'
potem - nic na tematwół'
w nowej linii (unix): odwiedź token 'brązowy'
Teraz strumień ma wszystkie dane (4 tokeny), ale rozpoznawane są tylko 2 żetony.
Odkryłem, że aby wypchnąć te tokeny przez system, strumień może emitować 2 tokeny, czyli wszystkie tokeny znane gramatyce. Mogą to być 2 dodatkowe nowe linie lub powiedzmy „lis' i 'brązowy” Tylko wtedy tokeny ”lis' i 'n„odwiedź, parser wychodzi z reguły”lis'i parsowanie zostanie zakończone.
Czy to błąd lub funkcja? Czy istnieje sposób na wyeliminowanie tego opóźnienia?
Dzięki!