Spirit (Parser)

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


Wikimedia Foundation.

Игры ⚽ Поможем решить контрольную работу

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Spirit Parser Framework — The Spirit Parser Framework is an object oriented recursive descent parser generator framework implemented using template metaprogramming techniques. Expression templates allow users to approximate the syntax of Extended Backus Naur Form (EBNF)… …   Wikipedia

  • Spirit — (engl.: Geist) ist: Spirit (Band), eine amerikanische Band Spirit (CAD), eine CAD Software für Windows Spirit Racing, ein ehemaliges Formel 1 Team Spirit (Parser), ein rekursiv absteigender objekt orientierter Parsergenerator Spirit (Raumsonde),… …   Deutsch Wikipedia

  • Spirit (disambiguation) — The term spirit has many disparate meanings in various fields. Religion and spirituality *A ghost *In religion and spirituality, the innate essence (soul) of a being *The Holy Spirit or Holy Ghost, in Christianity, one of the three hypostases… …   Wikipedia

  • LL parser — An LL parser is a top down parser for a subset of the context free grammars. It parses the input from Left to right, and constructs a Leftmost derivation of the sentence (hence LL, compared with LR parser). The class of grammars which are… …   Wikipedia

  • Recursive descent parser — A recursive descent parser is a top down parser built from a set of mutually recursive procedures (or a non recursive equivalent) where each such procedure usually implements one of the production rules of the grammar. Thus the structure of the… …   Wikipedia

  • Comparison of parser generators — This is a list of notable lexer generators and parser generators for various language classes. Contents 1 Regular languages 2 Deterministic context free languages 3 Parsing expression grammars, deterministic boolean grammars …   Wikipedia

  • Kindred Spirit Hybrid Oak — Taxobox image width = 240px image caption = Kindred Spirit With Foliage regnum = Plantae divisio = Magnoliophyta classis = Magnoliopsida ordo = Fagales familia = Fagaceae genus = Quercus Kindred Spirit Hybrid Oak is an oak hybrid of Quercus robur …   Wikipedia

  • Parsing — In computer science and linguistics, parsing, or, more formally, syntactic analysis, is the process of analyzing a sequence of tokens to determine their grammatical structure with respect to a given (more or less) formal grammar.Parsing is also… …   Wikipedia

  • Синтаксический анализ — В информатике, синтаксический анализ (парсинг)  это процесс сопоставления линейной последовательности лексем (слов, токенов) языка с его формальной грамматикой. Результатом обычно является дерево разбора (синтаксическое дерево). Обычно… …   Википедия

  • Backus-Naur form — Saltar a navegación, búsqueda El Backus Naur form (BNF) (también conocido como Backus Naur formalism, Backus normal form o Panini Backus Form) es una metasintaxis usada para expresar gramáticas libres de contexto: es decir, una manera formal de… …   Wikipedia Español

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”