antlr4 Parser wiederverwenden und aufwärmen

8

In meinem Anwendungsfall muss ich mehrere tausend kleine und unabhängige Ausdrücke in eine Baumdarstellung unter Verwendung eines Besuchers auf den generierten Syntaxbäumen analysieren. Derzeit werden für jede Analyseoperation neue Streams, Lexer und Parser-Instanzen erstellt.

Ich nehme an, das ist vielleicht nicht optimal. Welche Objektinstanzen könnten in einem solchen Setup wiederverwendet werden, um die Aufwärmeigenschaften von ANTLR4 zu nutzen? Wie wäre es mit Thread-Sicherheit - welche dieser Instanzen sollte lokal Thread sein? Ist ein Reset erforderlich, um eine Lexer- oder Parser-Instanz erneut zu verwenden?

    
FreeJack 06.03.2013, 00:16
quelle

1 Antwort

11

In den frühen Tagen von ANTLR 4 (viele Monate vor seiner ersten Veröffentlichung) wurde der adaptive DFA-Cache pro Instanz erstellt, sodass die Verwendung von Lexer.setInputStream oder Parser.setInputStream wesentlich für das Erreichen einer guten Leistung war.

Dies ist nicht mehr der Fall. Der Hintergrund-Cache ist jetzt unter allen Parser-Instanzen freigegeben und Thread-sicher. Die Methoden der Klassen Lexer und Parser sind nicht Thread-sicher. Wenn Sie also mehrere Threads analysieren möchten, müssen Sie mehrere Instanzen Ihres Lexers und Parsers erstellen.

    
Sam Harwell 06.03.2013, 02:40
quelle

Tags und Links