<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Spirit_%28Parser%29</id>
	<title>Spirit (Parser) - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Spirit_%28Parser%29"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Spirit_(Parser)&amp;action=history"/>
	<updated>2026-06-03T23:13:31Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Spirit_(Parser)&amp;diff=1506111&amp;oldid=prev</id>
		<title>imported&gt;Himbeerbläuling: Änderung 245973969 von Wiki Gh! rückgängig gemacht; nbsp wirkt in dieser Umgebung nicht</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Spirit_(Parser)&amp;diff=1506111&amp;oldid=prev"/>
		<updated>2024-06-17T09:59:57Z</updated>

		<summary type="html">&lt;p&gt;Änderung &lt;a href=&quot;/index.php/Spezial:Diff/245973969&quot; title=&quot;Spezial:Diff/245973969&quot;&gt;245973969&lt;/a&gt; von &lt;a href=&quot;/index.php/Spezial:Beitr%C3%A4ge/Wiki_Gh!&quot; title=&quot;Spezial:Beiträge/Wiki Gh!&quot;&gt;Wiki Gh!&lt;/a&gt; rückgängig gemacht; nbsp wirkt in dieser Umgebung nicht&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Überarbeiten}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Spirit&amp;#039;&amp;#039;&amp;#039; ist ein mittels [[C++-Metaprogrammierung|Templatemetaprogrammierung]] implementierter [[Rekursiver Abstieg|rekursiv absteigender]] [[Parsergenerator]]. Die Benutzung der [[Erweiterte Backus-Naur-Form|erweiterten Backus-Naur-Form]] (EBNF) in C++ wird mithilfe von Ausdrucks-Templates ermöglicht. Die Parser-Objekte werden durch Überladen von Operatoren erstellt und ergeben einen [[LL-Parser]], der in der Lage ist, mehrdeutige Ausdrücke auszuwerten.&lt;br /&gt;
&lt;br /&gt;
Spirit kann zusammen und getrennt für [[lexikalische Analyse]] sowie auch für einfaches Parsen benutzt werden.&lt;br /&gt;
&lt;br /&gt;
Der Spirit-Parser ist Bestandteil der freien [[Boost (C++-Bibliothek)|Boost]]-Bibliothek.&lt;br /&gt;
&lt;br /&gt;
== Operatoren ==&lt;br /&gt;
Aufgrund von Beschränkungen seitens der Programmiersprache C++ wurde die Spirit-Syntax um die Operatoren-Rangfolge aufgebaut, wobei Ähnlichkeiten zu EBNF sowie [[Regulärer Ausdruck|regulären Ausdrücken]] erhalten bleiben.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Syntax&lt;br /&gt;
! Erläuterung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;x &amp;gt;&amp;gt; y&amp;lt;/code&amp;gt;&lt;br /&gt;
| Entspricht x gefolgt von y.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;*x&amp;lt;/code&amp;gt;&lt;br /&gt;
| Entspricht x null oder mindestens einmal. (Repräsentiert die [[kleenesche Hülle]]; C++ hat keinen unären [[Umgekehrte polnische Notation|Postfix-Operator]] &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;x &amp;amp;#124; y&amp;lt;/code&amp;gt;&lt;br /&gt;
| Entspricht x oder y.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;+x&amp;lt;/code&amp;gt;&lt;br /&gt;
| Entspricht x mindestens einmal.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-x&amp;lt;/code&amp;gt;&lt;br /&gt;
| Entspricht x null oder einmal.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;x &amp;amp; y&amp;lt;/code&amp;gt;&lt;br /&gt;
| Entspricht x und y.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;x - y&amp;lt;/code&amp;gt;&lt;br /&gt;
| Entspricht x, aber nicht y.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;x ^ y&amp;lt;/code&amp;gt;&lt;br /&gt;
| Entspricht x, y oder beiden zusammen (in beliebiger Reihenfolge).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;x [ &amp;#039;&amp;#039;Funktionsausdruck&amp;#039;&amp;#039; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ruft die Funktion (oder den Funktor) auf, die (oder der) function_expression zurückgibt, wenn x wahr ist.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;( x )&amp;lt;/code&amp;gt;&lt;br /&gt;
| Entspricht x (kann für Rangfolgen-Gruppierungen benutzt werden)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;x % y&amp;lt;/code&amp;gt;&lt;br /&gt;
| Entspricht eine oder mehrere Wiederholungen von x, getrennt durch Vorkommnisse von y.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;~x&amp;lt;/code&amp;gt;&lt;br /&gt;
| Entspricht allem außer x (nur mit Zeichenklassen wie ch_p oder alnum_p)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
&lt;br /&gt;
=== Spirit.Classic ===&lt;br /&gt;
{{Veraltet|seit=2009|1=Hier wird Spirit 1.8 gezeigt, inzwischen veraltet als &amp;quot;Spirit Classic&amp;quot; in Spirit 2 geführt, aber mit leicht abweichenden Headers/Namespaces}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; style=&amp;quot;font-size:75%;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;boost/spirit.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;boost/spirit/actor.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
using namespace boost::spirit;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    string input;&lt;br /&gt;
&lt;br /&gt;
    cout &amp;lt;&amp;lt; &amp;quot;Gib eine Zeile ein.\n&amp;quot;;&lt;br /&gt;
    getline(cin, input);&lt;br /&gt;
&lt;br /&gt;
    cout &amp;lt;&amp;lt; &amp;quot;Eingabe: &amp;#039;&amp;quot; &amp;lt;&amp;lt; input &amp;lt;&amp;lt; &amp;quot;&amp;#039;.\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    unsigned count = 0;&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
    Die nächste Zeile parst die Eingabe (input.c_str())&lt;br /&gt;
    mittels folgender Semantik&lt;br /&gt;
        (Einrückung entspricht dem Quellcode zwecks Übersichtlichkeit):&lt;br /&gt;
&lt;br /&gt;
     Null oder mehr Vorkommnisse von (&lt;br /&gt;
          Buchstabenfolge &amp;quot;Katze&amp;quot; (wenn wahr, erhöhe Zählvariable &amp;quot;count&amp;quot;)&lt;br /&gt;
      oder jedes anderen Zeichens (fortschreiten, um nächstes Vorkommnis von &amp;quot;Katze&amp;quot; zu finden)&lt;br /&gt;
     )&lt;br /&gt;
 */&lt;br /&gt;
     parse(input.c_str(),&lt;br /&gt;
        *( str_p(&amp;quot;Katze&amp;quot;) [ increment_a(count) ]&lt;br /&gt;
          | anychar_p&lt;br /&gt;
         ));&lt;br /&gt;
 /*&lt;br /&gt;
     Der Parser wird mithilfe von Operatorüberladungen und&lt;br /&gt;
     Template-Matching gebaut, d.h. die eigentliche&lt;br /&gt;
     Arbeit wird in spirit::parse() erledigt und der Ausdruck,&lt;br /&gt;
     der mit * anfängt, initialisiert lediglich das Regelwerk,&lt;br /&gt;
     das die Parser-Funktion benutzt.&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
    // Zeige schließlich das Ergebnis.&lt;br /&gt;
    cout &amp;lt;&amp;lt; &amp;quot;Die Eingabe hatte &amp;quot; &amp;lt;&amp;lt; count&lt;br /&gt;
              &amp;lt;&amp;lt; &amp;quot; Vorkommnisse von &amp;#039;Katze&amp;#039;\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es gibt 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.&lt;br /&gt;
&lt;br /&gt;
=== Spirit 2.x ===&lt;br /&gt;
&lt;br /&gt;
Das folgende Programm gibt für Eingabestrings (gegeben als Kommandozeilenargument) &amp;quot;OKAY&amp;quot; aus, wenn sie der Regel &amp;lt;math&amp;gt;\left\{a^nb^n \mid n\in \mathbb{N}_0\right\}&amp;lt;/math&amp;gt; entsprechen, andernfalls &amp;quot;NOT OKAY&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;boost/spirit/include/qi.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// shortcuts&lt;br /&gt;
namespace qi = boost::spirit::qi;&lt;br /&gt;
typedef qi::rule&amp;lt;std::string::const_iterator, std::string()&amp;gt; Rule;&lt;br /&gt;
&lt;br /&gt;
Rule ab0;&lt;br /&gt;
Rule ab;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char** argv)&lt;br /&gt;
{&lt;br /&gt;
    Rule ab_alias = ab0.alias();&lt;br /&gt;
    ab0 = qi::char_(&amp;#039;a&amp;#039;) &amp;gt;&amp;gt; -ab_alias &amp;gt;&amp;gt; qi::char_(&amp;#039;b&amp;#039;);&lt;br /&gt;
    ab = (ab0 | qi::eps) &amp;gt;&amp;gt; qi::eoi;&lt;br /&gt;
&lt;br /&gt;
    const std::string input = argc&amp;gt;1 ? argv[1] : &amp;quot;&amp;quot;;&lt;br /&gt;
    auto begin = input.begin();&lt;br /&gt;
    bool okay = qi::parse(begin, input.end(), ab );&lt;br /&gt;
    &lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;String \&amp;quot;&amp;quot; &amp;lt;&amp;lt; input &amp;lt;&amp;lt; &amp;quot;\&amp;quot; is &amp;quot; &amp;lt;&amp;lt; (okay ? &amp;quot;OKAY&amp;quot; : &amp;quot;NOT OKAY&amp;quot;) &amp;lt;&amp;lt; &amp;quot;.\n&amp;quot;;&lt;br /&gt;
    return okay != true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://spirit.sourceforge.net/ Spirit] bei Sourceforge&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C++-Bibliothek]]&lt;br /&gt;
[[Kategorie:Freies Programmierwerkzeug]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Himbeerbläuling</name></author>
	</entry>
</feed>