- Spirit (Parser)
-
Das Spirit Parser Framework ist ein objektorientierter, rekursiv absteigender Parsergenerator der mittels Templatemetaprogrammierung implementiert worden ist. Die Benutzung der Erweiterten Backus-Naur-Form in C++ wird dem Programmierer mithilfe von Expression Templates möglich gemacht. Die Parser-Objekte werden durch Überladen von Operatoren erstellt und ergeben einen LL-Parser der fähig ist mehrdeutige Ausdrücke auszuwerten.
Spirit kann zusammen und getrennt für lexikalische Analyse sowie auch für einfaches Parsen benutzt werden.
Dieses Framework ist Bestandteil der freien Boost-Bibliothek.
Operatoren
Aufgrund von Beschränkungen seitens der C++ Programmiersprache wurde die Spirit-Syntax rundum die Operatoren-Rangfolge aufgebaut wobei Ähnlichkeiten zu EBNF sowie Regulären Ausdrücken erhalten bleiben.
Syntax Erläuterung x >> y Entspricht x gefolgt von y. *x Entspricht x null oder mindestens ein Mal. (Repräsentiert die Kleenesche Hülle; C++ hat keinen unären Postfix Operator *) x | y Entspricht x oder y. +x Entspricht x mindestens ein Mal. !x Entspricht x null oder ein Mal. x & y Entspricht x und y. x - y Entspricht x aber nicht y. x ^ y Entspricht x oder y aber nicht beide zusammen. x [ function_expression ] Rufe die Funktion (oder Funktor) auf die function_expression zurückgibt, wenn x wahr ist. ( x ) Entspricht x (kann für Rangfolgen-Gruppierungen benutzt werden) x % y Entspricht eine oder mehrere Wiederholungen von x, getrennt durch Vorkommnisse von y. ~x Entspricht alles außer x (nur mit Zeichenklassen wie ch_p oder alnum_p) Beispiel
#include <boost/spirit.hpp> #include <boost/spirit/actor.hpp> #include <string> #include <iostream> using namespace std; using namespace boost::spirit; int main(void) { string input; cout << "Gib eine Zeile ein.\n"; getline(cin, input); cout << "Eingabe: '" << input << "'.\n"; unsigned count = 0; /* Die nächste Zeile parst die Eingabe (input.c_str()), mittels folgender Semantik (Einrückung entspricht dem Quellcode zwecks Übersichtlichkeit): Null oder mehr Vorkommnisse von ( Buchstabenfolge "Katze" ( wenn wahr, erhöhe Zählvariable "count" ) oder jedes andere Zeichen (fortschreiten um nächstes Vorkommnis von "Katze" zu finden) ) */ parse(input.c_str(), *( str_p("Katze") [ increment_a(count) ] | anychar_p )); /* Der Parser wird mithilfe von Operatorüberladungen und Template-Matching gebaut, d.h. dass die eigentliche Arbeit in spirit::parse() erledigt wird und der Ausdruck der mit * anfängt, lediglich das Regelwerk initialisiert welches die Parser-Funktion benutzt. */ // Zeige schließlich das Ergebnis. cout << "Die Eingabe hatte " << count << " Vorkommnisse von 'Katze'\n"; return 0; }
Natürlich gibt es andere Algorithmen die zum Durchsuchen von Zeichenketten besser geeignet sind. Dieses Beispiel ist nur zur Veranschaulichung des Konzepts gedacht, wie Regeln erstellt und diesen Aktionen zugewiesen werden.
Weblinks
Kategorien:- Programmiersprache C++
- Bibliothek (Programmierung)
- Freies Programmierwerkzeug
Wikimedia Foundation.