Domanda

La base software che sto sviluppando utilizza una quantità significativa di yacc che non ho bisogno di affrontare. Alcune volte penso che sarebbe utile per capire alcuni problemi che trovo, ma la maggior parte delle volte riesco a cavarmela con la mia completa ignoranza di yacc.

La mia domanda ci sono abbastanza nuovi progetti là fuori che usano ancora yacc per garantire il tempo che dovrò imparare?

Modifica: dato che la risposta è principalmente a favore dell'apprendimento di Yacc, esiste una lingua simile che consiglieresti su yacc?

È stato utile?

Soluzione

Sì, vale la pena imparare questi strumenti se hai mai bisogno di creare o modificare il codice che analizza una grammatica.

Per molti anni lo strumento di fatto per generare codice per analizzare una grammatica era yacc, o suo cugino GNU, bisonte.

Ultimamente ho sentito che ci sono un paio di nuovi bambini nel blocco, ma il principio è lo stesso: scrivi una grammatica dichiarativa in un formato che è più o meno in Backus-Naur Form ( BNF ) e yacc / bison / qualunque cosa generi un codice per te che sarebbe estremamente noioso da scrivere a mano.

Inoltre, i principi alla base della grammatica possono essere molto utili da imparare anche se non è necessario lavorare direttamente su tale codice. Non lavoro molto con i parser da quando ho seguito un corso di progettazione di compilatori al college, ma comprendere gli stack di runtime, i parser di lookahead, la valutazione delle espressioni e molte altre cose correlate mi ha aiutato immensamente a scrivere ed eseguire il debug del mio codice in modo efficace.

modifica: data la tua domanda di follow-up su altri strumenti, Yacc / Bison ovviamente sono i migliori per i progetti C / C ++, poiché generano codice C. Esistono strumenti simili per altre lingue. Non tutte le grammatiche sono equivalenti e alcuni generatori di parser riescono a catturare solo grammatiche di una certa complessità. Quindi potrebbe essere necessario trovare uno strumento in grado di analizzare la grammatica. Vedi http://en.wikipedia.org/wiki/Comparison_of_parser_generators

Altri suggerimenti

Non conosco nuovi progetti che lo utilizzano, ma sono coinvolto in sette diversi lavori di manutenzione che utilizzano lex e yacc per l'elaborazione dei file di configurazione.

Nessun XML per me, no-sir-ee :-).

Le soluzioni che usano lex / yacc sono un passo avanti rispetto ai vecchi file di configurazione delle righe key = val poiché consentono migliori strutture gerarchiche come:

server = "mercury" {
    ip = "172.3.5.13"
    gateway = "172.3.5.1"
}
server = "venus" {
    ip = "172.3.5.21"
    gateway = "172.3.5.1"
}

E, sì, so che puoi farlo con XML, ma si tratta principalmente di applicazioni legacy scritte in C e, a dire il vero, probabilmente userò lex / yacc anche per nuovi lavori (non Java).

Questo perché preferisco fornire software in tempo e budget piuttosto che offrire la più grande nuova tecnologia whiz-bang: i miei clienti non pagheranno per la mia istruzione, vogliono prima di tutto risultati e sono già esperto di lex / yacc e avere tutto il codice modello per farlo rapidamente.

Una regola generale: il codice dura a lungo, quindi anche le tecnologie utilizzate in quel codice durano a lungo. Ci vorrebbe un'enorme quantità di tempo per sostituire la base di codice che menzioni (ci sono voluti 15 anni per costruirla ...), il che a sua volta implica che sarà ancora in giro tra 5, 10 o più anni. (C'è anche la possibilità che qualcuno che legge questa risposta finisca per lavorarci!)

Un'altra regola empirica: se una tecnologia di uso generale è abbastanza comune da averla già incontrata, è probabilmente abbastanza comune che dovresti familiarizzare con essa, perché la rivedrai un giorno. Chissà: familiarizzando con esso, forse hai aggiunto uno strumento utile alla tua cassetta degli attrezzi ...

Yacc è una di queste tecnologie: probabilmente ti imbatterai di nuovo, non è così difficile, e i principi che imparerai si applicano a tutta la famiglia di costruttori di parser.

PEGs sono i nuovi punti di forza, ma ci sono ancora molti progetti che usano yacc o strumenti più moderni di yacc. Vorrei disapprovare un nuovo progetto che ha scelto di utilizzare yacc, ma per i progetti esistenti il ??porting su uno strumento più moderno potrebbe non avere senso. Questo rende la familiarità con yacc un'abilità utile.

Se non hai familiarità con l'argomento dei generatori di parser, ti incoraggio a conoscerne uno, uno qualunque. Molti dei concetti sono portatili tra loro. Inoltre, è uno strumento utile da avere nella cintura: una volta che ne conosci uno capirai come spesso possono essere superiori rispetto ai parser scritti a mano pesante regex. Se sei già a tuo agio con l'argomento dei parser, non me ne preoccuperei. Imparerai yacc se e quando è necessario per fare qualcosa.

Lavoro su progetti che usano Yacc. Non un nuovo codice - ma erano nuovi, avrebbero comunque usato Yacc o un parente stretto (Bison, Byacc, ...).

Sì, ritengo che valga la pena imparare se lavori in C.

Considera anche l'apprendimento di ANTLR o di altri generatori di parser più moderni. Ma la conoscenza di Yacc ti darà una buona reputazione: ti aiuterà anche a imparare altri strumenti simili, poiché molta della teoria di base è simile.

Non conosco specificamente yacc / bison, ma ho usato antlr, cup, jlex e javacc. Pensavo che avrebbero avuto solo un'importanza accademica, ma a quanto pare avevamo bisogno di un linguaggio specifico per il dominio, e questo ci ha dato una soluzione molto più bella rispetto ad alcuni "più semplici". (regex based) parser là fuori. La manutenzione potrebbe essere un problema in molti ambienti, poiché la maggior parte dei programmatori in questi giorni non avrà alcuna esperienza con gli strumenti di analisi.

Non ho avuto la possibilità di confrontarlo con altri sistemi di analisi, ma posso sicuramente consigliare ANTLR basato sulla mia esperienza e anche con la sua ampia e attiva base di utenti.

Un altro punto a favore di ANTLR è ANTLRWorks: l'ambiente di sviluppo della GUI ANTLR che è di grande aiuto mentre sviluppo e debug delle tue grammatiche. Devo ancora vedere un altro sistema di analisi supportato da tale IDE.

Stiamo scrivendo un nuovo codice yacc presso la mia azienda per la spedizione dei prodotti. Sì, questa roba è ancora utilizzata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top