<?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 qi + phoenix + locals]]></title><description><![CDATA[<p>Ich habe ein bisschen schwierigkeiten mit boost phoenix in boost spirit qi Grammatiken / Symantischen Ausdrücken.</p>
<p>Ich versuche Memberfunctionpointer aus einer map mit dem synthesized attribute &quot;_val&quot; zu binden um damit Seiteneffekte auszulösen.<br />
Allerdings kompiliert folgendes nicht.</p>
<p>Eine Grammatik soll folgendes beinhalten:</p>
<pre><code>// grammar Klasse
// initialisiere die map container mit den string &lt;-&gt; Funktionszeiger Paaren

// ...

// Im Konstruktor der Grammatik:
qualifiers =
    eps [_val = _r1] &gt;&gt;  // übernehme bisherigen TypeWrapper und verändere den (Seitenfrage: Gibt es sowas wie pass by reference in rules?)
    *(
        qual // parse sowas wie &quot;const, static, volatile&quot; und gib den string zurück
        [
            // PROBLEM HERE !!!:
            // ich würde ja eigentlich ganz gern an den eigentlich Wert,
            // der sich hinter _1 versteckt, aber das scheint nach meiner recherche
            // nicht so einfach zu gehen.
            // Vorher hatte ich einen Workaround mit einer Membervariable der Grammatik
            // Aber das finde ich absolut hässlich.
            // Ich will aber auch nicht die lazy function binden, sondern den fptr
            // ich hatte auch sowas wie 
            // phoenix::bind(phoenix::bind(&amp;std::map&lt;/*...*/&gt;::at, qualifier_neg_getters, _1), _val) 
            // ausprobiert.
            // leider sind das auch keine einfachen phx::val, die man aufrufen könnte um den Wert zu bekommen
            // mir gehen die Ideen aus
            if_(phoenix::bind(phoenix::at(qualifier_neg_getters, _1), _val))   // prüfe ob qualifier von &quot;TypeWrapper&quot; auf false
            [
                phoenix::bind(phoenix::at(qualifier_setters, _1), _val, true)   // setze qualifier von &quot;TypeWrapper&quot; auf true
            ]
            .else_
            [
                _pass = false // qualifier wurde schon geparst (= ist auf true)! -&gt; nicht gültig
            ]
        ]
    )
;

start =
    qualifiers(_val)    [_val = _1] // parse &quot;const&quot;, &quot;volatile&quot;, &quot;static&quot;, &quot;auto&quot;, &quot;register&quot;
// ... noch im Aufbau befindlich
;

// end of constructor 
// ...

/// RULES
qi::rule &lt;iterator_type, TypeWrapper(TypeWrapper), ascii::space_type&gt; qualifiers;
qi::rule &lt;iterator_type, TypeWrapper(), ascii::space_type, qi::locals &lt;TypeWrapper&gt; &gt; start;

/// SYMBOLS
type_qualifiers qual;

/// MEMBERS
std::map &lt;std::string, void (TypeWrapper::*)(bool)&gt; qualifier_setters;
std::map &lt;std::string, bool (TypeWrapper::*)() const&gt; qualifier_neg_getters;

// end of grammar class
</code></pre>
<p>Ist das Problem oder mein Ziel ersichtlich?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/321310/boost-spirit-qi-phoenix-locals</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 00:06:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/321310.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 31 Oct 2013 20:25:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost spirit qi + phoenix + locals on Fri, 01 Nov 2013 00:45:15 GMT]]></title><description><![CDATA[<p>Ich habe ein bisschen schwierigkeiten mit boost phoenix in boost spirit qi Grammatiken / Symantischen Ausdrücken.</p>
<p>Ich versuche Memberfunctionpointer aus einer map mit dem synthesized attribute &quot;_val&quot; zu binden um damit Seiteneffekte auszulösen.<br />
Allerdings kompiliert folgendes nicht.</p>
<p>Eine Grammatik soll folgendes beinhalten:</p>
<pre><code>// grammar Klasse
// initialisiere die map container mit den string &lt;-&gt; Funktionszeiger Paaren

// ...

// Im Konstruktor der Grammatik:
qualifiers =
    eps [_val = _r1] &gt;&gt;  // übernehme bisherigen TypeWrapper und verändere den (Seitenfrage: Gibt es sowas wie pass by reference in rules?)
    *(
        qual // parse sowas wie &quot;const, static, volatile&quot; und gib den string zurück
        [
            // PROBLEM HERE !!!:
            // ich würde ja eigentlich ganz gern an den eigentlich Wert,
            // der sich hinter _1 versteckt, aber das scheint nach meiner recherche
            // nicht so einfach zu gehen.
            // Vorher hatte ich einen Workaround mit einer Membervariable der Grammatik
            // Aber das finde ich absolut hässlich.
            // Ich will aber auch nicht die lazy function binden, sondern den fptr
            // ich hatte auch sowas wie 
            // phoenix::bind(phoenix::bind(&amp;std::map&lt;/*...*/&gt;::at, qualifier_neg_getters, _1), _val) 
            // ausprobiert.
            // leider sind das auch keine einfachen phx::val, die man aufrufen könnte um den Wert zu bekommen
            // mir gehen die Ideen aus
            if_(phoenix::bind(phoenix::at(qualifier_neg_getters, _1), _val))   // prüfe ob qualifier von &quot;TypeWrapper&quot; auf false
            [
                phoenix::bind(phoenix::at(qualifier_setters, _1), _val, true)   // setze qualifier von &quot;TypeWrapper&quot; auf true
            ]
            .else_
            [
                _pass = false // qualifier wurde schon geparst (= ist auf true)! -&gt; nicht gültig
            ]
        ]
    )
;

start =
    qualifiers(_val)    [_val = _1] // parse &quot;const&quot;, &quot;volatile&quot;, &quot;static&quot;, &quot;auto&quot;, &quot;register&quot;
// ... noch im Aufbau befindlich
;

// end of constructor 
// ...

/// RULES
qi::rule &lt;iterator_type, TypeWrapper(TypeWrapper), ascii::space_type&gt; qualifiers;
qi::rule &lt;iterator_type, TypeWrapper(), ascii::space_type, qi::locals &lt;TypeWrapper&gt; &gt; start;

/// SYMBOLS
type_qualifiers qual;

/// MEMBERS
std::map &lt;std::string, void (TypeWrapper::*)(bool)&gt; qualifier_setters;
std::map &lt;std::string, bool (TypeWrapper::*)() const&gt; qualifier_neg_getters;

// end of grammar class
</code></pre>
<p>Ist das Problem oder mein Ziel ersichtlich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2364166</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2364166</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Fri, 01 Nov 2013 00:45:15 GMT</pubDate></item></channel></rss>