Perché vengono utilizzati i generatori di parser?

6

Ho visto alcuni progetti che richiedono BISON per generare codice C ++. Qual è il vantaggio di avere BISON / Yacc, ecc., Generare codice C / C ++ invece di scriverlo da solo?

    
posta Atilla Filiz 13.10.2010 - 14:14
fonte

4 risposte

13

La cosa più importante su BISON e YACC è che generano una macchina a stati che analizzerebbe esattamente la tua grammatica. Questo è per ragioni di velocità, poiché la complessità del codice generato è non O (n) con n = numero di regole come sarebbe nella maggior parte delle implementazioni del primo tentativo.

L'approccio della macchina a stati fa sì che il numero di stati generato sia molto alto e quindi sarebbe molto incline a scrivere quel codice. Anche la manutenzione di quel codice sarebbe un inferno (dove diavolo = avrei lasciato il lavoro se qualcuno mi avesse suggerito di farlo).

Bison e Yacc ti fanno concentrare sulla grammatica anziché sulla sua implementazione.

    
risposta data 13.10.2010 - 16:04
fonte
4

Lo stesso motivo per cui non scrivi la tua hashmap, o il puntatore intelligente o la libreria di threading. È molto meglio usare il tuo tempo per usare qualcosa che è già scritto e sottoposto a debug che lo fai da solo. Ci saranno sempre certe persone e certe situazioni in cui l'opzione migliore è quella di tirare il tuo, ma queste sono rare. Probabilmente più raro di quanto la maggior parte delle persone accetti.

Per i parser in particolare, è abbastanza facile scrivere un parser che funzioni il più delle volte. È difficile scriverne uno che funzioni correttamente per tutti gli input, incluso l'input malformato, ed è facile da modificare. È anche tentato di imporre una strana sintassi sull'input per far sì che est venga analizzato, a scapito di rendere più difficile la creazione di file di input.

Per C ++, ho avuto buoni risultati con Boost :: spirit. È un framework di parser che, attraverso l'uso di un sacco di template magic, ti permette di incorporare BNF direttamente nel tuo codice C ++. Ha un po 'di curva di apprendimento, ma una volta avvolto la mente attorno a esso, è facile costruire parser per linguaggi complessi.

    
risposta data 13.10.2010 - 15:30
fonte
3

Due motivi:

Chiarezza : un generatore di parser può utilizzare un linguaggio (ad esempio, ABNF) orientato verso il problema, quello della descrizione di una grammatica. (Probabilmente alcune lingue possono farla franca senza bisogno di una lingua separata: basta creare un DSL nella lingua dell'host.)

Facilità d'uso : non devi sapere come scrivere un parser da solo. Useresti un parser di discesa ricorsivo? un parser pack-rat? ecc. E ti interessa , se vuoi solo analizzare un messaggio SIP?

    
risposta data 13.10.2010 - 15:05
fonte
2

Se conosci la grammatica che devi analizzare, è molto più veloce ottenere codice funzionante semplicemente inserendo quella grammatica in un generatore di parser e utilizzare callout appropriati da quella piuttosto che codificare manualmente un parser.

Se, tuttavia, hai un formato di file poco descrittivo che devi analizzare, potrebbe essere il lavoro da fare per ottenere un parser come sarebbe per capire la grammatica, descriverlo al generatore di parser e quindi ottieni un parser.

Si spera che tu sia più vicino al primo paragrafo che al secondo.

    
risposta data 13.10.2010 - 17:00
fonte

Leggi altre domande sui tag