2009-11-26 9 views
9

Ho lavorato a Flex, Bison alcuni anni fa durante i miei studi universitari. Tuttavia, non me ne ricordo molto ora. Di recente, sono venuto a conoscenza di ANTLR.Quali sono gli svantaggi dell'uso di ANTLR rispetto a Flex/Bison?

  • Consiglieresti che imparo ANTLR o meglio spazzolare Flex/Bison?
  • ANTLR ha più/meno funzioni di Flex/Bison?
+0

Il contrario [vantaggi-di-antl-versus-dire-lex-yacc-bison] (http://stackoverflow.com/questions/212900/advantages-of-antlr-versus-say-lex-yacc -bison) – nawfal

+0

Possibile duplicato di [Vantaggi di Antlr (contro dire, lex/yacc/bison)] (https://stackoverflow.com/questions/212900/advantages-of-antlr-versus-say-lex-yacc-bison) @nawfal: Sì. – einpoklum

risposta

7

ANTLRv3 è LL (k) e può essere configurato come LL (*). Quest'ultimo, in particolare, è incredibilmente facile da scrivere in parser, in quanto si può essenzialmente usare EBNF come-è.

Inoltre, ANTLR genera un codice molto simile al parser di discesa ricorsivo che si scrive da zero. È molto leggibile e facile da eseguire il debug per capire perché l'analisi non funziona o funziona male.

Il vantaggio di Flex/Bison (o di qualsiasi altro parser LALR) è che è più veloce.

+0

Più veloce? Stai confrontando LALR con LL (k) o LL (\ *)? LL (k) parsing è abbastanza veloce. L'analisi LL (\ *) è lenta a causa del backtracking, ma raramente è necessario utilizzarla (e anche quando lo fai, credo che ANTLR ti permetta di usare LL (\ *) per un sottoinsieme della tua grammatica). L'unico vantaggio di LALR che conosco è che ci sono alcune grammatiche che non possono essere analizzate LL (k) che può essere analizzato LALR, ma in pratica la maggior parte delle grammatiche che dovresti effettivamente * analizzare * possono essere ricondotte espresso in una forma che può essere analizzata LL (k). –

+2

Sì. LALR è più veloce perché è possibile utilizzare una macchina a stati finiti basata su tabella per questo. È incomprensibile e quasi impossibile eseguire il debug dopo che è stato generato da un generatore di parser come Bison, ma è anche molto veloce. LL (k) implementato da ANTLR utilizza l'analisi della discesa ricorsiva, che è un po 'più lenta. –

+0

Ho appena provato lo strumento antlrworks e la seguente cosa non ha funzionato: expr: expr '+' expr; perché non consente la ricorsione a sinistra. Non lo trovi tutti un po 'scomodo. Devi quindi convertirlo in qualcosa come expr: expr ('+' expr) * , ad esempio scrivilo come un'espressione regolare. In flex potrei scrivere nel modo precedente e l'ho trovato molto più naturale di questo stile regex. – user855

0

Abbiamo deciso di utilizzare ANTLR per alcuni dei nostri requisiti di elaborazione delle informazioni: analisi di file legacy e linguaggio naturale. La curva di apprendimento è ripida e ci stiamo lavorando sopra e ritengo che sia un approccio più moderno e versatile per ciò che dobbiamo fare. Gli svantaggi - dal momento che chiedi - sono principalmente la curva di apprendimento che sembra essere inevitabile.

+2

Sospetto che la curva di apprendimento per praticamente qualsiasi generatore di parser sia più o meno la stessa. Ci vogliono solo 5 minuti per "tecnicamente" capire la frase "È LALR ..." o "È LL ..." Ci vogliono settimane per ingannare i macchinari che devi usare, per ottenere una grammatica divisa in forma, per impara come piegare la grammatica, ... A parità di condizioni, le curve di apprendimento sono simili, dovresti scegliere il generatore di parser più potente che funzioni nel tuo mondo. –

2

ANTLR ha una libreria di runtime JAR che è necessario includere nel progetto.

I parser di discesa ricorsiva di ANTLR sono più facili da eseguire il debug rispetto ai parser "bottom-up" generati da Flex/Bison, ma le regole di grammatica sono leggermente diverse.

Se si desidera un generatore di parser di tipo Flex/Bison (LALR) per Java, consultare JavaCC.

Problemi correlati