<?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[Einfache Algebra nach boost::spirit übersetzen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich schreibe gerade einen einfachen Einheitenparser und habe mich dazu mal an boost::spirit gewagt.<br />
Um eine simple Algebra für Multiplikation und Division meiner Klasse &quot;Unit&quot; zu unterstützen, würde ich gerne schreiben:</p>
<pre><code>qi::rule&lt;Iterator, Unit()&gt; unit;

unit = (/*unit Produktionsregeln*/) |
       // unit Algebra
       ( '(' &gt;&gt; unit[_val = _1] &gt;&gt; ')' ) |
       ( unit[_val = _1] &gt;&gt;        unit[_val *= _1] ) |
       ( unit[_val = _1] &gt;&gt; '/' &gt;&gt; unit[_val /= _1] );
</code></pre>
<p>Leider geht das wegen left recursion (-&gt; stack-overflow) nicht in spirit.<br />
Wie bekomme ich das denn möglichst einfach nach spirit übersetzt?<br />
Ich möchte wenn möglich keinen AST aufbauen, sondern die Einheiten direkt über deren überladene Operatoren verwursten.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/320713/einfache-algebra-nach-boost-spirit-übersetzen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 23 Jul 2026 21:39:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/320713.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 09 Oct 2013 08:00:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Einfache Algebra nach boost::spirit übersetzen on Wed, 09 Oct 2013 08:03:30 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich schreibe gerade einen einfachen Einheitenparser und habe mich dazu mal an boost::spirit gewagt.<br />
Um eine simple Algebra für Multiplikation und Division meiner Klasse &quot;Unit&quot; zu unterstützen, würde ich gerne schreiben:</p>
<pre><code>qi::rule&lt;Iterator, Unit()&gt; unit;

unit = (/*unit Produktionsregeln*/) |
       // unit Algebra
       ( '(' &gt;&gt; unit[_val = _1] &gt;&gt; ')' ) |
       ( unit[_val = _1] &gt;&gt;        unit[_val *= _1] ) |
       ( unit[_val = _1] &gt;&gt; '/' &gt;&gt; unit[_val /= _1] );
</code></pre>
<p>Leider geht das wegen left recursion (-&gt; stack-overflow) nicht in spirit.<br />
Wie bekomme ich das denn möglichst einfach nach spirit übersetzt?<br />
Ich möchte wenn möglich keinen AST aufbauen, sondern die Einheiten direkt über deren überladene Operatoren verwursten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2359037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2359037</guid><dc:creator><![CDATA[C14]]></dc:creator><pubDate>Wed, 09 Oct 2013 08:03:30 GMT</pubDate></item><item><title><![CDATA[Reply to Einfache Algebra nach boost::spirit übersetzen on Wed, 09 Oct 2013 08:02:05 GMT]]></title><description><![CDATA[<p>Das ergibt doch garkeinen Sinn. Schreib mal die EBNF dazu auf. Irgendwo muss da ein int_ oder sowas vorkommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2359038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2359038</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Wed, 09 Oct 2013 08:02:05 GMT</pubDate></item><item><title><![CDATA[Reply to Einfache Algebra nach boost::spirit übersetzen on Wed, 09 Oct 2013 08:51:15 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Das ergibt doch garkeinen Sinn. Schreib mal die EBNF dazu auf. Irgendwo muss da ein int_ oder sowas vorkommen.</p>
</blockquote>
<p>Ja richtig, ich habe zu viel gekürzt. Es gibt noch Produktionsregeln für die unit, die aber keine Rolle spielen. (EP editiert)<br />
Die Frage ist, wie ich die Algebra in spirit abbilden kann.</p>
<p>Edit:<br />
Ok, habe es nun selber herausgefunden.<br />
Es geht so:</p>
<pre><code>qi::rule&lt;Iterator, Unit()&gt; unit;
qi::rule&lt;Iterator, Unit()&gt; unit_term;

unit =  (/* Produktionsregeln */) |
        ('(' &gt;&gt; unit_term[_val=_1]  &gt;&gt; ')');

unit_term = unit[_val=_1] &gt;&gt; *( unit[_val*=_1] | ('/' &gt;&gt; unit[_val/=_1]) );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2359040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2359040</guid><dc:creator><![CDATA[C14]]></dc:creator><pubDate>Wed, 09 Oct 2013 08:51:15 GMT</pubDate></item></channel></rss>