2013-02-08 11 views
15

Scriverò un parser del linguaggio verilog (o vhdl) e eseguirò molte manipolazioni (sorta di trasformazioni) dei dati analizzati. Ho intenzione di analizzare file veramente grandi (design completi di Verilog, grandi come linee 10K) e supporterò in definitiva la maggior parte del Verilog. Non mi interessa digitare ma non voglio riscrivere alcuna parte del codice ogni volta che aggiungo il supporto per qualche altra regola.Parsec o felice (con alex) o u-parsinglib

In Haskell, quale libreria consiglieresti? Conosco Haskell e ho usato Happy before (per giocare). Sento che ci sono possibilità nell'usare Parsec per trasformare la stringa analizzata nel codice (che è un grande vantaggio). Non ho esperienza con uu-paringlib.

Quindi per analizzare una grammatica completa di verilog/VHDL di cui uno è raccomandato? La mia preoccupazione principale è la facilità e la "correttezza" con cui posso manipolare i dati analizzati secondo il mio capriccio. La velocità non è una preoccupazione primaria.

+0

Questo è un progetto enorme. Un parser di Verilog è molto complicato. –

+4

Sì, davvero. Supportare parte del verilog è abbastanza buono da mostrare che desidero fare con verilog durante il mio dottorato. ma voglio continuare anche dopo il mio dottorato. Quindi è un investimento davvero a lungo termine. Vorrei sapere se Haskell si adatta al conto. Amo questa lingua. – Dilawar

+1

Quindi, cosa hai fatto alla fine? Sei felice della tua scelta? – Schiavini

risposta

19

Personalmente preferisco Parsec con l'aiuto di Alex per lexing.

Preferisco Parsec su Happy perché 1) Parsec è una libreria, mentre Happy è un programma e si scriverà in una lingua diversa se si utilizza Happy e quindi si compila con Happy. 2) Parsec offre capacità di analisi sensibile al contesto grazie alla sua interfaccia monadica. È possibile utilizzare lo stato extra per l'analisi sensibile al contesto, quindi ispezionare e decidere in base a tale stato. Oppure guarda solo qualche valore analizzato prima e decidi i prossimi parser ecc. (Come a <- parseSomething; if test a then ... do ...) E quando non hai bisogno di informazioni sensibili al contesto, puoi semplicemente usare lo stile applicativo e ottenere un'implementazione come implementata in YACC o uno strumento simile .

Come un aspetto negativo di Parsec, non saprai mai se il parser Parsec contiene una ricorsione a sinistra, e il parser otterrà bloccato in fase di esecuzione (in quanto Parsec è fondamentalmente un parser top-down ricorsivo-discesa). Devi trovare le ricadute a sinistra ed eliminarle. I parser in stile YACC possono darti alcune garanzie statiche e informazioni (come lo spostamento/riduzione dei conflitti, i terminali inutilizzati, ecc.) Che non puoi ottenere con Parsec.

Alex è altamente raccomandato per lexing in entrambe le situazioni ( penso che deve uso Alex se si decide di andare avanti con Felice ). Perché anche se usi Parsec, semplifica davvero l'implementazione del parser e cattura anche una grande quantità di bug (ad esempio: analizzare una parola chiave come identificatore era un errore comune che facevo mentre stavo usando Parsec senza Alex: è solo un esempio).

È possibile dare un'occhiata al mio Lua parser implementato in Alex + Parsec ed ecco lo code to use Alex-generated tokens in Parsec.

MODIFICA: Grazie John L per le correzioni. A quanto pare puoi anche fare un parsing sensibile al contesto con Happy. Inoltre, Alex per lexing non è richiesto in Happy, anche se è raccomandato.

+0

Grazie per aver condiviso il parser Lua. È utile vedere Alex in carne e ossa, e non solo alcuni esempi di giocattoli tratti dalla documentazione. –

+0

+1 per condividere il tuo lavoro. – Dilawar

+4

Molti dei dettagli riguardanti Happy in questa risposta sono sbagliati.Happy supporta l'analisi sensibile al contesto (dato che i parser possono essere eseguiti in monade arbitrarie). Felice non ha bisogno di Alex, puoi usare qualsiasi lexer. Si potrebbe anche fare il lexing direttamente in Happy, anche se ciò non sarebbe raccomandato. –