2013-03-06 11 views
8

Nel mio caso di utilizzo devo analizzare parecchie migliaia di espressioni piccole e indipendenti in una rappresentazione ad albero utilizzando un visitatore sugli alberi di analisi generati. Attualmente vengono create nuove istanze di flussi, lexer e parser per ciascuna operazione di analisi.parser antlr4 riutilizzo e riscaldamento

Presumo che questo potrebbe non essere ottimale. Quali istanze dell'oggetto possono essere riutilizzate in una tale configurazione per utilizzare la proprietà warm-up di ANTLR4? Che ne dici di sicurezza dei thread - quale di queste istanze dovrebbe essere thread locale? È necessario un reset di qualche tipo per riutilizzare un'istanza di lexer o parser?

risposta

11

Nei primi giorni di ANTLR 4 (molti mesi prima della sua versione iniziale), la cache DFA adattiva è stata creata per ogni istanza, quindi l'uso di Lexer.setInputStream o Parser.setInputStream era essenziale per ottenere buone prestazioni.

Questo non è più il caso. La cache in background è ora condivisa tra tutte le istanze parser ed è thread-safe. I metodi delle classi Lexer e Parser non sono thread-safe, quindi se si desidera analizzare su più thread, sarà necessario creare più istanze del lexer e del parser.