Domanda

Qual è il modo migliore per creare un parser in C ++ da un file con la grammatica?

È stato utile?

Soluzione

È inoltre potrebbe desiderare di avere uno sguardo a questi link:

Altri suggerimenti

Dipende pesantemente sulla grammatica. Io tendo a come parser discesa ricorsiva, che sono normalmente scritti a mano (anche se è possibile generare uno da una descrizione della grammatica).

Se avete intenzione di utilizzare un generatore di parser, ci sono in realtà due buone scelte: byacc e Antlr. Se si desidera qualcosa che è (abbastanza) compatibile con Yacc, byacc è (di gran lunga) la scelta migliore. Se si sta iniziando dall'inizio, né con il codice esistente né l'esperienza che favorisce utilizzando qualcosa di compatibile con Yacc, allora Antlr è quasi certamente la soluzione migliore.

Dal momento che è stato detto, io parla anche un po 'di Bison. Eviterei Bison come la peste che è. il consiglio di Brooks a "Piano di buttare via uno" si applica qui. Robert Corbett (l'autore di byacc) ha scritto Bison come il suo primo tentativo di un generatore di parser. Purtroppo, lo diede a GNU invece di buttare via. In un classico caso di commercializzazione battere eccellenza tecnica, Bison è ampiamente usato (e anche consigliato, da parte di coloro che non conoscono meglio) mentre byacc rimane relativamente oscuro.

Edit: mi dispiace farlo, ma dal momento che è stato anche detto, sarò anche commentare Boost.spirit. Se questo può essere l'esempio più cool del modello di programmazione meta in giro, ha un paio di problemi che mi portano a consigliare contro il tentativo di metterlo in uso serio.

  1. Compila volte con si può ottenere straziante - 10 minuti è comune, e una / più complessa grammatica più grandi possono prendere anche di più (ammesso che non va in crash il compilatore).
  2. Se si commette alcun errore a tutti, può e spesso produrrà i messaggi di errore follemente lunghi che sono praticamente impossibili da decifrare. I messaggi di errore dal codice del modello-pesanti sono notoriamente male comunque, e lo Spirito sottolinea il sistema più di qualsiasi altra cosa.

Mi creda: il fatto che si può scrivere qualcosa di simile Spirito a tutti è proprio sul confine tra impressionante e sorprendente - ma mi piacerebbe ancora uso solo se ero sicuro la grammatica avevo a che fare con era (e sarebbe rimarrà sempre) molto piccolo e semplice.

Ci sono flex e bisonti . Lex & Yacc cugini che fanno prendere C ++ esistenza in considerazione.

Hai guardato Lex e Yacc ? Per citare dalla sezione 5 del documento collegato:

  

Il mio modo preferito per fare un parser C ++   è quello di avere Lex generare una pianura C   di file, e di lasciare che YACC generare C ++   codice. Quando poi si collega la tua   applicazione, si può incorrere in qualche   problemi perché il ++ C codice   di default non sarà in grado di trovare C   funzioni, a meno che non gli si dice che   tali funzioni sono extern "C".

Ho usato bisonti , trovato giusto per il mio livello esempi. È stato in grado di creare una semplice calcolatrice con esso, naturalmente si può fare molto di più.

La calcolatrice ha avuto 1 + 2 * 3 per esempio e costruito un albero di sintassi. La documentazione non ha descritto come costruire l'albero comunque e che mi ha portato un po 'di tempo per lavorare fuori.

Se dovessi andare di nuovo mi piacerebbe guardare in 'antlr' come sembrava buono e ben supportato.

Martin.

Il modo migliore per creare un parser è quello di utilizzare lex e yacc.

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