Verwenden von Antlr zum Parsen von Daten aus einem nie endenden Stream

Ist Antlr zum Parsen von Daten aus Streams geeignet, die direkt nach dem zu analysierenden Text kein EOF haben? Nach meiner Beobachtung gibt der Lexer das aktuelle Token erst dann aus, wenn das erste Zeichen des nächsten Tokens empfangen wurde. Darüber hinaus scheint der Parser die Regel erst dann auszugeben, wenn das erste Token der nächsten Regel empfangen wurde. Hier ist eine einfache Grammatik, die ich ausprobiert habe:

fox: 'quick' 'brown' 'fox' '\r'? '\n' ;

Dann habe ich den generierten Parser mit UnbufferedCharStream und UnbufferedTokenStream verwendet:

  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();

wenn der Strom kommtschnell' - nichts passiert.

wann 'b"Eingetreten - Regel eingeben"Fuchs'

dann 'roun'- nichts (2 Token sind im Stream - keiner von ihnen ist leser bekannt!)

nur nach 'f'der Zuhörer besucht das erste Token:'schnell'

dann - nichts auf 'Ochse'

in der neuen Zeile (Unix): visit token 'braun'

Jetzt hat der Stream alle Daten (4 Token), aber nur 2 Token werden erkannt.

Ich fand heraus, dass der Stream 2 Token ausgeben kann, um diese Token durch das System zu schieben, dh alle Token, die der Grammatik bekannt sind. Es könnten 2 zusätzliche neue Zeilen sein, oder sagen wir 'Fuchs' und 'braun'. Erst dann die TokenFuchs' und '\ n'besucht werden, der Parser verlässt die Regel'Fuchs'und das Parsen wird beendet.

Ist das ein Bug oder ein Feature? Gibt es eine Möglichkeit, diese Verzögerung zu beseitigen?

Vielen Dank!

Antworten auf die Frage(3)

Ihre Antwort auf die Frage