2009-03-30 21 views
7

Quale generatore di lexer/parser è il migliore (più facile da usare, più veloce) per C o C++? In questo momento sto usando flex e bisonte, ma il bisonte gestisce solo grammatiche LALR (1). Il linguaggio che sto analizzando non è in realtà ha bisogno di lookahead illimitato, ma lookahead illimitato renderebbe più semplice l'analisi . Dovrei provare Antlr? Coco/R? Elkhound? Qualcos'altro?Strumenti Lexer/parser

+1

Cosa intendi per "migliore"? Devi rendere la tua domanda più specifica. –

+1

Quali sono i tuoi requisiti? LALR (1) non è sufficiente per te, e in tal caso, in che modo? –

+0

I seconda domanda di Brian. Cosa devi essere in grado di fare? In che modo LALR (1) è insufficiente? –

risposta

5

Aggiornato 2015/01/05:

mio risposta originale che punta a una domanda ora cancellato:

Ci sono un sacco di buone risposte a questa domanda già in What parser generator do you recommend

Quindi ho preso l'elenco di articoli dal deleted answer on archive.org con almeno 1 voto qui:

Ho eseguito personalmente vari sistemi flex/bison, ma ora sostituivo entrambi con Lemon da sqlite poiché è uno strumento, rientranti e thread-safe oltre ad avere un modello basato su streaming/pull.

+0

Lemon sembra davvero bello, e sono stato in grado di ridurre la grammatica a LALR (1), quindi potrei utilizzarlo. – Zifre

+1

I programmatori di StackOverflow necessitano di un controllo nel proprio sistema prima di eliminare le domande per assicurarsi che non siano referenziati da nessuno. Ti ricordi quali erano alcuni dei suggerimenti? –

+0

Sono d'accordo, questa risposta è ora completamente inutile – paulm

0

Non so quello che stai cercando esattamente, ma penso che Boost Xpressive vale la pena guardare ...

non esattamente un generatore di parser, ma un ottimo strumento per gestire grammatiche e sento che può gestire quelli strani.

0

Ho utilizzato il sistema di analisi GOLD (http://www.devincook.com/goldparser) con ottimi risultati. Il mio progetto è piccolo, un sistema di analisi per file NC in C. Ma penso che lo strumento possa gestire anche progetti più complessi.

+1

GOLD sembra non funzionare su Linux. – Zifre

+0

Goldparser è bello ma è estremamente lento. Anche nel codice C++ ottimizzato per la velocità occorrono 10 secondi per analizzare 15000 righe di codice. Se si confronta questo con la velocità del parser PHP questo è estremamente lento. – Elmue

3

La cattiva notizia è che la maggior parte delle lingue di computer reali non sono "LALR (1)", il che significa che è necessario ricorrere a una notevole quantità di hacker per far sì che YACC paragoni le vere lingue.

Se si sta progettando un DSL, è possibile utilizzare qualsiasi generatore di parser LALR senza molti problemi proprio perché è possibile modificare la grammatica del DSL quando il generatore di parser gracchia. I generatori di parser LL funzionano principalmente anche qui per lo stesso motivo, ma la mancanza di ricorsione a sinistra può essere un vero dolore.

Se non sei contento del modo in cui ti piace la sintassi, i parser GLR sono vincitori pratici. Li usiamo nel DMS Software Reengineering Toolkit e abbiamo costruito parser di qualità di produzione per oltre 30 lingue tra cui C++, che ha un teorema popolare che dice che è quasi impossibile da analizzare. Il teorema folk è stato avviato da persone che usano parser LL e LALR per provare a gestire C++. GLR lo fa facilmente.

0

L'ultimo bisonte dichiara di eseguire un numero illimitato di lookahead, eseguendo (in effetti) parecchie analisi simultaneamente. Se hai già un investimento in bison, potrebbe valere la pena provarlo, piuttosto che passare a un altro pacchetto.

http://www.gnu.org/software/bison/manual/bison.html#GLR-Parsers

Non ho usato questa funzione io stesso, però.

Per quanto riguarda gli altri sistemi, ho usato ANTLR. Non mi piaceva particolarmente (la documentazione non era molto buona, e bisognava considerare manualmente la grammatica di uno per soddisfare la precedenza degli operatori), ma ha funzionato, e così tanti giurano che vale sicuramente la pena guardare.

+0

Ho provato l'analisi Bison GLR, ma sembra causare alcuni problemi con la precedenza degli operatori ed è notevolmente più lento. ANTLR è difficile da usare con C++ e preferisco di gran lunga LR su grammatiche di stile LL. – Zifre

1

ANTLR semplifica il lookahead illimitato con l'opzione 'backtrack'. Potrebbe anche qualificare i criteri "più facili da usare, più veloci" dal momento che ha ANTLRWORKS che consente di visualizzare ed eseguire il debug della grammatica.

Un altro vantaggio è che rende AST facile da costruire con il supporto integrato per la creazione di AST che manca in bisonte.

Con due libri pubblicati - "ANTLR: guida definitiva" e "Modelli di progettazione linguistica", è uno degli strumenti molto ben documentati disponibili. Hai anche una mailing list molto attiva.

0

LRSTAR 6.4 può eseguire l'analisi LR (k). È un sistema basato su C++, amichevole con Windows e Visual Studio. Crea parser basati su tabelle simili a Bison. Crea anche lexer basati su tabelle simili ai lexer "flex" e a codice diretto simili a "re2c". La velocità del codice generato è circa il doppio della velocità di ciò che "bison" e "flex" creano.

È possibile modificare il file di parser di scheletro e LRSTAR genererà il codice nel modo desiderato oppure è possibile riscrivere il file di scheletro in un'altra lingua, ad esempio C#.

I parser LRSTAR possono creare automaticamente un AST. È una licenza BSD open source. Le persone lo utilizzano su sistemi UNIX/Linux e MAC OS dopo la ricompilazione con GCC.