<?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[C++ mit Boost.Spirit einfaches format]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe folgendes dateiformat:</p>
<pre><code>module s27 ( clock, reset, G0, G1, G2, G3, G17, test_mode, test_si, test_so, test_se);
</code></pre>
<p>Und dazu folgenden Parser mit Boost spirit gebaut:</p>
<pre><code>void print(const std::string &amp;s)
{
	std::cout &lt;&lt; s &lt;&lt; &quot; &quot;;
}

template &lt;typename Iterator, typename Skipper&gt;
struct data : qi::grammar&lt;Iterator, Skipper&gt;
{
	data(): data::base_type(object)
	{
		module_name %= +(ascii::char_-'(');
		input_names %=  (+ascii::char_) % ','; 

		object = &quot;module&quot; &gt;&gt; module_name[print] &gt;&gt; '(' &gt;&gt; input_names[print] &gt;&gt; ')';

	}
	qi::rule&lt;Iterator, Skipper&gt; object, member, str;
	qi::rule&lt;Iterator, std::string(), Skipper&gt; module_name, input_names;
};

int main(int argc, char* argv[])  
{  
	std::ifstream input_file(&quot;s27_scan_simple.txt&quot;);
	std::string str((std::istreambuf_iterator&lt;char&gt;(input_file)), std::istreambuf_iterator&lt;char&gt;());
	std::cout &lt;&lt; str &lt;&lt; std::endl;
	data&lt;std::string::iterator, ascii::space_type&gt;v;
	qi::phrase_parse(str.begin(),str.end(),v,ascii::space);
	std::cin.get();
    return 0;
}
</code></pre>
<p>Den modulname bekomme ich richtig geparst aber die Liste der Namen innerhalb der Klammern werden nur als in ganzer String ausgegebn. Ich moechte aber die Namen einzeln haben und sie spaeter in einem vector speichern. Was ist falsch an diesem parser? Hat jemand einen Tip?</p>
<p>Besten Dank! <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/313915/c-mit-boost-spirit-einfaches-format</link><generator>RSS for Node</generator><lastBuildDate>Sat, 01 Aug 2026 19:23:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/313915.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 14 Feb 2013 08:43:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to C++ mit Boost.Spirit einfaches format on Thu, 14 Feb 2013 08:43:18 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe folgendes dateiformat:</p>
<pre><code>module s27 ( clock, reset, G0, G1, G2, G3, G17, test_mode, test_si, test_so, test_se);
</code></pre>
<p>Und dazu folgenden Parser mit Boost spirit gebaut:</p>
<pre><code>void print(const std::string &amp;s)
{
	std::cout &lt;&lt; s &lt;&lt; &quot; &quot;;
}

template &lt;typename Iterator, typename Skipper&gt;
struct data : qi::grammar&lt;Iterator, Skipper&gt;
{
	data(): data::base_type(object)
	{
		module_name %= +(ascii::char_-'(');
		input_names %=  (+ascii::char_) % ','; 

		object = &quot;module&quot; &gt;&gt; module_name[print] &gt;&gt; '(' &gt;&gt; input_names[print] &gt;&gt; ')';

	}
	qi::rule&lt;Iterator, Skipper&gt; object, member, str;
	qi::rule&lt;Iterator, std::string(), Skipper&gt; module_name, input_names;
};

int main(int argc, char* argv[])  
{  
	std::ifstream input_file(&quot;s27_scan_simple.txt&quot;);
	std::string str((std::istreambuf_iterator&lt;char&gt;(input_file)), std::istreambuf_iterator&lt;char&gt;());
	std::cout &lt;&lt; str &lt;&lt; std::endl;
	data&lt;std::string::iterator, ascii::space_type&gt;v;
	qi::phrase_parse(str.begin(),str.end(),v,ascii::space);
	std::cin.get();
    return 0;
}
</code></pre>
<p>Den modulname bekomme ich richtig geparst aber die Liste der Namen innerhalb der Klammern werden nur als in ganzer String ausgegebn. Ich moechte aber die Namen einzeln haben und sie spaeter in einem vector speichern. Was ist falsch an diesem parser? Hat jemand einen Tip?</p>
<p>Besten Dank! <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/2298782</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2298782</guid><dc:creator><![CDATA[Boostbeginner]]></dc:creator><pubDate>Thu, 14 Feb 2013 08:43:18 GMT</pubDate></item><item><title><![CDATA[Reply to C++ mit Boost.Spirit einfaches format on Thu, 14 Feb 2013 10:01:53 GMT]]></title><description><![CDATA[<p>Statt</p>
<pre><code class="language-cpp">input_names %=  (+ascii::char_) % ',';
</code></pre>
<p>versuch mal</p>
<pre><code class="language-cpp">input_names %=  (+ascii::char_ -  ',') % ',';
</code></pre>
<p>Außerdem ist</p>
<pre><code class="language-cpp">qi::rule&lt;Iterator, std::string(), Skipper&gt;
</code></pre>
<p>nicht der richtige Regeltyp für eine Regel, die einen std::vector<a href="std::string" rel="nofollow">std::string</a> zurückgeben soll. Möglich wäre</p>
<pre><code class="language-cpp">qi::rule&lt;Iterator, std::vector&lt;std::string&gt;(), Skipper&gt; input_names;
</code></pre>
<p>Allerdings würde ich an deiner Stelle etwas engere Beschränkungen für Identifier vergeben. So, wie du es im Moment vorhast, ist</p>
<pre><code>module s27,),,) (clo ck((), re(set), G0, G1, G2, G3), G17, test_mode, test_si, test_so, test_se))()());
</code></pre>
<p>gültig. Ich kann mir nicht vorstellen, dass das gewollt ist. Denkbar etwa eine Regel</p>
<pre><code class="language-cpp">identifier = qi::lexeme[ ascii::alpha &gt;&gt; *(ascii::alnum | '_') ];
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2298804</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2298804</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Thu, 14 Feb 2013 10:01:53 GMT</pubDate></item><item><title><![CDATA[Reply to C++ mit Boost.Spirit einfaches format on Thu, 14 Feb 2013 11:03:55 GMT]]></title><description><![CDATA[<p>Danke fuer die Hiweise! Jetzt klappt es fast, jetzt werden aber die Unterstriche herausgeschnitten, die Ausgabe ist:</p>
<pre><code>s27 clock reset G0 G1 G2 G3 G17 test mode test si test so test se
</code></pre>
<p>Aber richtig ist:</p>
<pre><code>s27 clock reset G0 G1 G2 G3 G17 test_mode test_si test_so test_se
</code></pre>
<p>Die Regel:</p>
<pre><code>identifier = qi::lexeme[ ascii::alpha &gt;&gt; *(ascii::alnum | '_') ];
</code></pre>
<p>besagt doch, alphabetische Zeichen gefolgt von einer beliebigen Anzahl alphanumerischwer Werte ODER dem Unterstriche. Warum werden sie dann geloescht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2298828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2298828</guid><dc:creator><![CDATA[Boostbeginner]]></dc:creator><pubDate>Thu, 14 Feb 2013 11:03:55 GMT</pubDate></item><item><title><![CDATA[Reply to C++ mit Boost.Spirit einfaches format on Sun, 17 Feb 2013 08:56:41 GMT]]></title><description><![CDATA[<p>Habe den Fehler bis jetzt noch nicht gefunden. hat jemand eine Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2299401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2299401</guid><dc:creator><![CDATA[Boostbeginner]]></dc:creator><pubDate>Sun, 17 Feb 2013 08:56:41 GMT</pubDate></item><item><title><![CDATA[Reply to C++ mit Boost.Spirit einfaches format on Sun, 17 Feb 2013 09:14:49 GMT]]></title><description><![CDATA[<p>Ich weiß waran es liegt, kenne aber nur einen schlechten woraround. vielleicht weiß jemand, wie es besser geht.</p>
<p>Das problem ist, dass spirit bei regeln wie &gt;&gt; ',' oder in deinem Fall &gt;&gt; '<em>' glaubt, dass das '</em>' nicht zur Ausgabe gehört (vergleiche deine Liste von Kommata die du auch nicht haben wolltest). Ich löse das immer mit dem attr-parser der einfach nix liest und das übergebene attribut zurück gibt.</p>
<pre><code>identifier = qi::lexeme[ ascii::alpha &gt;&gt; *(ascii::alnum | ('_' &gt;&gt; attr('_'))) ];
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2299402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2299402</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 17 Feb 2013 09:14:49 GMT</pubDate></item><item><title><![CDATA[Reply to C++ mit Boost.Spirit einfaches format on Sun, 17 Feb 2013 12:09:59 GMT]]></title><description><![CDATA[<p>Danke fuer den Hinweis! Es klappt jetzt! Aber troztdem komisch das Spirit denkt das &quot;_&quot; gehoert nicht zur Ausgabe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2299425</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2299425</guid><dc:creator><![CDATA[Boostbeginner]]></dc:creator><pubDate>Sun, 17 Feb 2013 12:09:59 GMT</pubDate></item><item><title><![CDATA[Reply to C++ mit Boost.Spirit einfaches format on Sun, 17 Feb 2013 12:41:02 GMT]]></title><description><![CDATA[<p>Warum? in diesem Fall wars doch genau das, was du wolltest:</p>
<pre><code>input_names %=  (+ascii::char_ -  ',') % ','; //das ',' hier ist nicht in der Ausgabe
</code></pre>
<p>//edit ich habs nochmal nachgeschlagen:</p>
<p>'x' steht für lit('x') welches kein attribut erzeugt<br />
char_('x')is ein parser für 'x' und erzeugt auch die Ausgabe 'x', also macht folgendes das was du willst:</p>
<pre><code>identifier = qi::lexeme[ ascii::alpha &gt;&gt; *(ascii::alnum | char_('_')) ];
</code></pre>
<p>//edit rechtschreibsler</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2299429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2299429</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 17 Feb 2013 12:41:02 GMT</pubDate></item><item><title><![CDATA[Reply to C++ mit Boost.Spirit einfaches format on Sun, 17 Feb 2013 14:20:38 GMT]]></title><description><![CDATA[<p>Danke fuer die Information! Der Unterscheid zwischen char_('<em>') und nur '</em>' is mir nun klar!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2299450</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2299450</guid><dc:creator><![CDATA[Boostbeginner]]></dc:creator><pubDate>Sun, 17 Feb 2013 14:20:38 GMT</pubDate></item></channel></rss>