2012-07-26 12 views
7

Sto cercando di utilizzare flex e bison nel mio progetto per generare un codice parser per una struttura di file. Il linguaggio di programmazione principale è C++ e il progetto è su un progetto OO che funziona principalmente in parallelo.Flex ++ BisonC++ parser

Ho sentito che i parser generati da flex e bison sono codici C e non sono rientranti. Googling, ho trovato flex++ e bisonc++. Sfortunatamente non esiste un semplice tutorial per iniziare. La maggior parte degli esempi si basa su bison/flex. Alcune persone hanno in qualche modo integrato i parser bison/flex nel loro codice C++. Dovrebbero essere "ingannevoli" ...

La documentazione di flex++ e bisonc++ non mi aiuta e. Esercitazioni ed esempi, tutti ricevono input da stdin e stampano alcuni messaggi sullo stdout.

ho bisogno di queste caratteristiche nel mio parser:

  1. Parser dovrebbe essere una classe C++, definito in modo normale (un colpo di testa e un file cpp)
  2. Parser riceve i dati sia da una std::string o std::stringstream o un char* a terminazione nulla.

Mi sento così confuso. Dovrei usare flex++/bisonc++ o flex/bison? E come farlo, soddisfacendo le condizioni sopra?

risposta

3

Ci sono flex/bison, flex ++/bison ++ e flexC++/bisonC++. Penso che sia meglio scegliere una di queste tre coppie, invece di mixare/abbinare flex ++ e bisonC++. Ecco le guide per l'utente per Flexc++ e Bisonc++.

Dal sito FlexC++:

FlexC++, contrariamente a flettere e flettere ++, genera il codice che è esplicitamente indicata per l'uso da programmi C++. Il noto programma flex (1) genera codice sorgente C e flex ++ (1) offre semplicemente uno shell tipo simile a C++ attorno alla funzione yylex generata da flex (1) e appena supporta le idee attuali sullo sviluppo del software C++ . Contrariamente a questo, flexC++ crea una classe C++ che offre un input di corrispondenza di lex di funzione membro predefinito contro espressioni regolari e possibilmente eseguendo codice C++ una volta che le espressioni regolari sono state abbinate. Il codice generato da flexC++ è puro C++, consentendo agli utenti di applicare tutte le delle funzionalità offerte da tale lingua.

Dal sito BisonC++:

BisonC++ è un generatore di parser universale che converte una grammatica descrizione per un LALR (1) grammatica libera dal contesto in una classe C++ per interpretare tale grammatica . Una volta esperto di bisonC++, è possibile utilizzare per sviluppare una vasta gamma di parser di lingua, da quelli utilizzati nei calcolatori da scrivania semplici in complessi linguaggi di programmazione. BisonC++ è altamente paragonabile al programma bison ++, scritto da Alain Coetmeur: tutte le grammatiche bison ++ correttamente scritte dovrebbero essere convertibili in grammatiche bisonC++ dopo pochissime o nessuna modifica. Chiunque abbia familiarità con bison ++ o il suo precursore, bisonte, dovrebbe essere in grado di utilizzare bisonC++ con piccolo problema. È necessario essere fluenti nell'usare la programmazione C++ nell'ordine per utilizzare bisonC++ o per comprendere questo manuale.

Così flexC++/bisonC++ sono più di semplici wrapper attorno alle vecchie utilità flex/bison. Generano classi C++ complete da utilizzare per la scansione/analisi re-entry.

+0

Non riesco nemmeno a compilare flexC++! Ho appena scaricato il codice sorgente. Nessun makefile, niente cocake! –

+0

@ sorush-r c'è un pacchetto Linux: http://packages.debian.org/sid/flexc++ Perché avresti bisogno di un makefile? Basta includere le intestazioni e costruire dal proprio ambiente. – TemplateRex

+1

Prima non avevo sentito parlare di 'icmake'. sembra essere il sistema di compilazione usato per compilare 'flexC++'. Grazie –

2

Flex può generare uno scanner C rientrante. Vedere la Sezione 19 Reentrant C scanners nel manuale Flex.

Analogamente, Bison può generare un parser C rientrante. Vedere la Sezione 3.8.11 A Pure (Reentrant) Parser nel manuale del Bisonte per i dettagli.

Hai assolutamente bisogno di avere un parser C++ e dati parser basati su std :: string/stringstream?

Hai guardato allo Boost.Spirit in alternativa?

+0

No. Posso cambiare il mio codice per generare 'char *' s da analizzare. Bu non è in grado di leggere l'input da 'stdin' –

+1

@ sorush-r: dovresti essere in grado di cambiare la sorgente dell'input dello scanner Flex C ridefinendo la macro' YY_INPUT() '. Vedi [Sezione 9 The Generated Scanner] (http://flex.sourceforge.net/manual/Generated-Scanner.html#Generated-Scanner) nel manuale di Flex. Darei un'occhiata seria anche a Boost.Spirit. – Void