<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Boost Spirit und C++ Repräsentation eines Grammatik Objekts]]></title><description><![CDATA[<p>Hallo,</p>
<p>mein Einstieg in Boost ist erstmal sehr glatt gelaufen vorallem Dank der schönen Einführung, ich habe erstmal aus ganz vielen **rule&lt;&gt;**s meine Grammatik relativ leicht zusammenbekommen und bekomme Matches da wo ich will. Theoretisch könnte ich dann, wenn ein Match für einen Typ erreicht ist, den eben über die die ganzen integralen <strong>Actor</strong>s Stück für Stück abspeichern. Nur eine Grammatik bedeutet ja auch ein größeres abstraktes Konstrukt zu beschreiben und zu erfassen. Ich will eigentlich nicht das komplexe Grammatikkonstrukt nicht nur erkennen, ich will es auch geparst als ganzes Objekt erfassen.</p>
<p>Ist möglich was ich mir gerade vorstelle, auf eine abstrakte Regel die Parserepräsentation in C++ als komplettes Objekt bzw. Struktur zu bekommen?</p>
<p>Ich möchte zuzusagen wenn ein Match für einen komplexen Typ gefunden wurde ein komplett ausgefülltes Struct mit den herausgeparsten Informationen bekommen und nur die Regeln beschreiben, wann, wie, welche Daten in einer spezifischen, gewünschten Struktur landen.</p>
<p>Ist dann mit den Sprachmitteln von Boost möglich oder muß ich mir alle Integral-Matches irgendwie merken und die Informationen zu übergeordneten Typen zu Fuß zusammenbauen?</p>
<p>danke!! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/244035/boost-spirit-und-c-repräsentation-eines-grammatik-objekts</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 06:39:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/244035.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 24 Jun 2009 11:23:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Boost Spirit und C++ Repräsentation eines Grammatik Objekts on Wed, 24 Jun 2009 14:14:57 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>mein Einstieg in Boost ist erstmal sehr glatt gelaufen vorallem Dank der schönen Einführung, ich habe erstmal aus ganz vielen **rule&lt;&gt;**s meine Grammatik relativ leicht zusammenbekommen und bekomme Matches da wo ich will. Theoretisch könnte ich dann, wenn ein Match für einen Typ erreicht ist, den eben über die die ganzen integralen <strong>Actor</strong>s Stück für Stück abspeichern. Nur eine Grammatik bedeutet ja auch ein größeres abstraktes Konstrukt zu beschreiben und zu erfassen. Ich will eigentlich nicht das komplexe Grammatikkonstrukt nicht nur erkennen, ich will es auch geparst als ganzes Objekt erfassen.</p>
<p>Ist möglich was ich mir gerade vorstelle, auf eine abstrakte Regel die Parserepräsentation in C++ als komplettes Objekt bzw. Struktur zu bekommen?</p>
<p>Ich möchte zuzusagen wenn ein Match für einen komplexen Typ gefunden wurde ein komplett ausgefülltes Struct mit den herausgeparsten Informationen bekommen und nur die Regeln beschreiben, wann, wie, welche Daten in einer spezifischen, gewünschten Struktur landen.</p>
<p>Ist dann mit den Sprachmitteln von Boost möglich oder muß ich mir alle Integral-Matches irgendwie merken und die Informationen zu übergeordneten Typen zu Fuß zusammenbauen?</p>
<p>danke!! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1732060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1732060</guid><dc:creator><![CDATA[GmbH]]></dc:creator><pubDate>Wed, 24 Jun 2009 14:14:57 GMT</pubDate></item><item><title><![CDATA[Reply to Boost Spirit und C++ Repräsentation eines Grammatik Objekts on Wed, 24 Jun 2009 12:06:40 GMT]]></title><description><![CDATA[<p>Vielleicht zeigtst du mal etwas Code. Ich kann dir gedanklich gerade nicht flogen...</p>
<p>Gruß<br />
Tobi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1732082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1732082</guid><dc:creator><![CDATA[Tobias Gerg]]></dc:creator><pubDate>Wed, 24 Jun 2009 12:06:40 GMT</pubDate></item><item><title><![CDATA[Reply to Boost Spirit und C++ Repräsentation eines Grammatik Objekts on Wed, 24 Jun 2009 13:52:49 GMT]]></title><description><![CDATA[<p>Also ich parse nach einem &quot;komplexen&quot; Eintrag (<strong>example_entry</strong>) für das ich eine <strong>rule&lt;&gt;</strong> habe und eine Struktur die diesem zu parsenden Eintrag an Programmlogik gegenübersteht:</p>
<pre><code class="language-cpp">rule&lt;&gt; seperator = /*..*/
rule&lt;&gt; i_value = !(int_p &gt;&gt; seperator);
rule&lt;&gt; name_string = print_p &gt;&gt; seperator;
rule&lt;&gt; example_entry = i_value &gt;&gt; *name_string;

struct example_s
{
   int i;
   list&lt;string&gt; names;

   example_s( rule&lt;&gt;&amp; transitition_match)
   {
      i = transitition.i_value.int_p;
      // ... 
   }
}
</code></pre>
<p>Das ist nur ein einfaches Beispiel, aber was ich möchte ist nicht einem <strong>i_value</strong> bzw. <strong>int_p</strong> fest sagen wo es beim Parsen hingeht, sondern ich möchte eine Struktur/Klasse (hier <strong>example_s</strong>) angeben und die an <strong>example_entry</strong> registrieren. Bei einem Match wird dann eine Funktion, Konstruktor, etc. aufgerufen, die die Regeln definiert um das komplett durch <strong>example_entry</strong> beschriebene Parsing-Set eines Matches auf ein Objekt zu transformieren.</p>
<p>Also wie in Pseudocode Manier für <strong>i</strong> im Konstruktor von <strong>example_entry</strong> geschehen. Man macht eine Art <strong>example_entry.registry&lt;example_s&gt;</strong>, bei einem Match wird <strong>example_s::example_s(transitition_match)</strong> aufgerufen und dort ist dann alles drin, was bei diesem Match geparsed wurde und die Regeln beschrieben wie das in ein Objekt transformiert wird.</p>
<p>Das muß jetzt natürlich nicht exakt so sein, aber ich suche eben nach einem Weg eine direkte Transition zwischen einer komplexen Regeln und einem komplexen C++ Typ herzustellen und nicht jeden Integraltyp während des Parsens durch die Gegend schieben zu müssen. Ist das in irgendeienr Form mit Boost::Spirit möglich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1732141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1732141</guid><dc:creator><![CDATA[GmbH]]></dc:creator><pubDate>Wed, 24 Jun 2009 13:52:49 GMT</pubDate></item><item><title><![CDATA[Reply to Boost Spirit und C++ Repräsentation eines Grammatik Objekts on Wed, 24 Jun 2009 20:39:44 GMT]]></title><description><![CDATA[<p>So was ist mir mit den Boardmitteln nicht bekannt. Allerdings kannst du einen complexen typ an eine Grammatik übergeben und so die variablen dieses typs füllen...</p>
<p>Ich hab dass hier mal an deinem Beispiel gemacht (abgewandelt vom Calculator Beispiel aus der Spirit Doku)</p>
<pre><code class="language-cpp">#include &lt;boost/spirit/include/classic_core.hpp&gt;
#include &lt;iostream&gt;
#include &lt;list&gt;
#include &lt;functional&gt;
#include &lt;string&gt;

////////////////////////////////////////////////////////////////////////////
using namespace std;
using namespace BOOST_SPIRIT_CLASSIC_NS;

////////////////////////////////////////////////////////////////////////////
//
// Complex data type
//
////////////////////////////////////////////////////////////////////////////
struct complex_type
{
	int i;
	list&lt;string&gt; names;

	// ausführen wenn komplette Regel geparst wurde
	void execute()
	{
		std::cout &lt;&lt; &quot;Do something with the data type after match&quot; &lt;&lt; std::endl;
		cout &lt;&lt; i &lt;&lt; &quot; &quot;;
		std::list&lt;string&gt;::iterator it = names.begin();
		while(it != names.end())
			std::cout &lt;&lt; *it++ &lt;&lt; std::endl;
		names.erase(names.begin());
	}
};

////////////////////////////////////////////////////////////////////////////
//
//  Semantic actions
//
////////////////////////////////////////////////////////////////////////////

// zahl holen
struct getiValue
{
	explicit getiValue(complex_type&amp; eval_) : eval(eval_){}
	template &lt;typename IteratorT&gt;
	void operator()(IteratorT val) const
	{
		eval.i = val;
	}

	complex_type&amp; eval;
};

// strings holen
struct getNames
{
	explicit getNames(complex_type&amp; eval_) : eval(eval_){}
	template &lt;typename IteratorT&gt;
	void operator()(IteratorT begin, IteratorT end) const
	{
		eval.names.push_back(std::string(begin, end));
	}

	complex_type&amp; eval;
};

// wenn regel geparst wurde execute aufrufen
struct operateOn
{
	explicit operateOn(complex_type&amp; eval_) : eval(eval_){}

	template &lt;typename IteratorT&gt;
	void operator()(IteratorT begin, IteratorT end) const
	{
		eval.execute();
	}

	complex_type&amp; eval;
};

////////////////////////////////////////////////////////////////////////////
//
//  Our calculator grammar
//
////////////////////////////////////////////////////////////////////////////

// grammatik definieren
struct complex_grammar : public grammar&lt;complex_grammar&gt;
{
	complex_grammar(complex_type&amp; eval_)
    : eval(eval_) {}

    template &lt;typename ScannerT&gt;
    struct definition
    {
        definition(complex_grammar const&amp; self)
        {
			// i_value nach eval.i schreiben
			i_value = !(int_p[getiValue(self.eval)]);

			// namen an liste hängen
			name = (+(print_p - space_p))[getNames(self.eval)];

			// namens liste
			string_names = +(space_p &gt;&gt; name) ;

			// beispiel eintrag (operation mit werten ausfürhen nach einem kompletten match
			sample_entry = (i_value &gt;&gt; string_names)[operateOn(self.eval)];
        }

        rule&lt;ScannerT&gt; sample_entry, i_value, string_names, name;
        rule&lt;ScannerT&gt; const&amp;
        start() const { return sample_entry; }
    };

    complex_type&amp; eval;
};

////////////////////////////////////////////////////////////////////////////
//
//  Main program
//
////////////////////////////////////////////////////////////////////////////
int
main()
{
    cout &lt;&lt; &quot;/////////////////////////////////////////////////////////\n\n&quot;;
    cout &lt;&lt; &quot;\t\tThe simplest working calculator...\n\n&quot;;
    cout &lt;&lt; &quot;/////////////////////////////////////////////////////////\n\n&quot;;
    cout &lt;&lt; &quot;Type an expression...or [q or Q] to quit\n\n&quot;;

    complex_type eval;
    complex_grammar calc(eval); //  Our parser

    string str;
    while (getline(cin, str))
    {
        if (str.empty() || str[0] == 'q' || str[0] == 'Q')
            break;

        parse_info&lt;&gt; info = parse(str.c_str(), calc, space_p);

        if (info.full)
        {
            cout &lt;&lt; &quot;-------------------------\n&quot;;
            cout &lt;&lt; &quot;Parsing succeeded\n&quot;;
            cout &lt;&lt; &quot;-------------------------\n&quot;;

        }
        else
        {
            cout &lt;&lt; &quot;-------------------------\n&quot;;
            cout &lt;&lt; &quot;Parsing failed\n&quot;;
            cout &lt;&lt; &quot;stopped at: \&quot;: &quot; &lt;&lt; info.stop &lt;&lt; &quot;\&quot;\n&quot;;
            cout &lt;&lt; &quot;-------------------------\n&quot;;
        }
    }

    cout &lt;&lt; &quot;Bye... :-) \n\n&quot;;
    return 0;
}
</code></pre>
<p>Vielleicht hilft dir dass weiter... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Gruß<br />
Tobi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1732399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1732399</guid><dc:creator><![CDATA[Tobias Gerg]]></dc:creator><pubDate>Wed, 24 Jun 2009 20:39:44 GMT</pubDate></item><item><title><![CDATA[Reply to Boost Spirit und C++ Repräsentation eines Grammatik Objekts on Tue, 21 Jul 2009 11:41:26 GMT]]></title><description><![CDATA[<p>Vielen Dank, daß hat mir wirklich sehr geholfen und dadurch habe ich auch das jetzt im Prinzip hinbekommen, was ich wollte.</p>
<p>Ich hätte noch eine Frage, auf die ich keine Antwort gefunden habe. Wenn ich nach oben beschriebenen Schema eine Funktion an eine rule&lt;&gt; dranhänge:</p>
<pre><code class="language-cpp">rule&lt;&gt; test = int_p[getInt(self.eval)];
rule&lt;&gt; final = test;
</code></pre>
<p>Dann wird die entsprechende Implementation ausgeführt:</p>
<pre><code class="language-cpp">struct getInt
{
    template &lt;typename IteratorT&gt;
    void operator()(IteratorT val) const
    {
       //
    }
}
</code></pre>
<p>Entscheidenend ist, daß <strong>operator()</strong> mit einem Parameter und '<strong>val</strong>' aufgerufen wird und darin steckt in jedem Fall bereits der geparste Int.</p>
<p>Wenn ich aber das mache:</p>
<pre><code class="language-cpp">rule&lt;&gt; test = int_p;
rule&lt;&gt; final = test[getInt(self.eval)];
</code></pre>
<p>Wird nur diese Implementation aufgerufen</p>
<pre><code class="language-cpp">void operator()(IteratorT begin, IteratorT end) const
{
}
</code></pre>
<p>Die Implementation enthält <strong>begin</strong> und <strong>end</strong> von dem geparsten String und liefert keinen Int, sondern eben einen String zurück. Kann ich für eine <strong>rule&lt;&gt;</strong> irgendwie festlegen, daß das Resultat vom geünschten Typ ist? Also wenn ich verschiedene Funktionen an <strong>rule&lt;&gt; test</strong> anhänge, daß dies Resultate vom gewollten Typ sind und nicht der grundlegendste Operator für den geparsten String implementiert wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1746896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1746896</guid><dc:creator><![CDATA[GmbH]]></dc:creator><pubDate>Tue, 21 Jul 2009 11:41:26 GMT</pubDate></item><item><title><![CDATA[Reply to Boost Spirit und C++ Repräsentation eines Grammatik Objekts on Tue, 21 Jul 2009 13:00:10 GMT]]></title><description><![CDATA[<p>Probier mal,</p>
<pre><code class="language-cpp">rule&lt;&gt; test = int_p;
rule&lt;parser_context&lt;int&gt; &gt; final = test[getInt(self.eval)];
</code></pre>
<p>Greets<br />
Tobi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1746939</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1746939</guid><dc:creator><![CDATA[Tobias Gerg]]></dc:creator><pubDate>Tue, 21 Jul 2009 13:00:10 GMT</pubDate></item><item><title><![CDATA[Reply to Boost Spirit und C++ Repräsentation eines Grammatik Objekts on Tue, 21 Jul 2009 13:08:57 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /></p>
<p>Man sollte nicht mehr mit spirit classic neue Projekte anfangen, nehm lieber direkt spirit2,<br />
das ist mittlerweile recht ausgereift, und der 2.1 Zweig lässt sich auch aus dem SVN gut nutzen.</p>
<p><a href="http://c-plusplus.net/forum/viewtopic-var-t-is-189058.html" rel="nofollow">http://c-plusplus.net/forum/viewtopic-var-t-is-189058.html</a></p>
<p>Bei Fragen kannst du dich gerne an die Spiritmailingliste wenden.</p>
<p>phlox</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1746946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1746946</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Tue, 21 Jul 2009 13:08:57 GMT</pubDate></item><item><title><![CDATA[Reply to Boost Spirit und C++ Repräsentation eines Grammatik Objekts on Tue, 21 Jul 2009 13:12:03 GMT]]></title><description><![CDATA[<p>Warum sollte man nicht mehr mit spirit classic arbeiten...<br />
Ist das schon irgendwo als deprecated markiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1746950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1746950</guid><dc:creator><![CDATA[Tobias Gerg]]></dc:creator><pubDate>Tue, 21 Jul 2009 13:12:03 GMT</pubDate></item><item><title><![CDATA[Reply to Boost Spirit und C++ Repräsentation eines Grammatik Objekts on Tue, 21 Jul 2009 13:26:37 GMT]]></title><description><![CDATA[<p>Tobias Gerg schrieb:</p>
<blockquote>
<p>Warum sollte man nicht mehr mit spirit classic arbeiten...<br />
Ist das schon irgendwo als deprecated markiert?</p>
</blockquote>
<p>Nein, aber neue Projekte sollte man in spirit2 machen, weil es einfach besser ist vom Design und Aufbau her.<br />
Auch ist es unter Umständen schneller.</p>
<p>Du kannst dir aber gerne selber ein Bild machen:<br />
<a href="http://www.boost.org/doc/libs/1_39_0/libs/spirit/doc/html/index.html" rel="nofollow">http://www.boost.org/doc/libs/1_39_0/libs/spirit/doc/html/index.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1746960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1746960</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Tue, 21 Jul 2009 13:26:37 GMT</pubDate></item><item><title><![CDATA[Reply to Boost Spirit und C++ Repräsentation eines Grammatik Objekts on Tue, 21 Jul 2009 13:40:34 GMT]]></title><description><![CDATA[<p>Jetzt seh ich das auch mal... Auf der boost homepage leitet mich ein klick auf spirit immer auf die doku der classic variante um. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /></p>
<p>Ich muss mir das mal genauer anschauen... Danke für den Link <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Greets<br />
Tobi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1746967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1746967</guid><dc:creator><![CDATA[Tobias Gerg]]></dc:creator><pubDate>Tue, 21 Jul 2009 13:40:34 GMT</pubDate></item><item><title><![CDATA[Reply to Boost Spirit und C++ Repräsentation eines Grammatik Objekts on Tue, 21 Jul 2009 15:04:00 GMT]]></title><description><![CDATA[<p>Tobias Gerg schrieb:</p>
<blockquote>
<p>Jetzt seh ich das auch mal... Auf der boost homepage leitet mich ein klick auf spirit immer auf die doku der classic variante um. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /></p>
<p>Greets<br />
Tobi</p>
</blockquote>
<p>Ja das ärgert mich auch, ist irgendwie blöd, aber so wirklich in doku und ähnliche Dinge stecken sie nicht so viel Aufwand, aber die Examples sind recht gut.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18405">@GmBH</a>:<br />
Schau dir mal das MiniXML AST Beispiel an:<br />
<a href="http://www.boost.org/doc/libs/1_39_0/libs/spirit/doc/html/spirit/qi_and_karma.html#spirit.qi_and_karma.tutorials.mini_xml___asts_" rel="nofollow">http://www.boost.org/doc/libs/1_39_0/libs/spirit/doc/html/spirit/qi_and_karma.html#spirit.qi_and_karma.tutorials.mini_xml___asts_</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1747031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1747031</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Tue, 21 Jul 2009 15:04:00 GMT</pubDate></item><item><title><![CDATA[Reply to Boost Spirit und C++ Repräsentation eines Grammatik Objekts on Wed, 22 Jul 2009 06:28:06 GMT]]></title><description><![CDATA[<p>Auf der spirit hompage steht dass Spirit 2.0 noch beta ist. Allerdings ist der Eintrag vom August 17, 2008.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/642">@phlox81</a>: Weißt du ob die Version schon aus dem beta stadium raus ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1747312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1747312</guid><dc:creator><![CDATA[Tobias Gerg]]></dc:creator><pubDate>Wed, 22 Jul 2009 06:28:06 GMT</pubDate></item></channel></rss>