<?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[Parser fuer Ausdruecke mit binaeren Operatoren]]></title><description><![CDATA[<p>Hallo Leute!</p>
<p>Ich wuerde euch gerne meine Arbeit der letzten Stunden praesentieren. Urspruenglich wollte ich einen einfachen Matheparser bauen, stattdessen ist daraus aber ein Parser-Generator fuer binaere Operatoren geworden. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Hier ein Codebeispiel, wie man ihn verwendet:</p>
<pre><code class="language-cpp">typedef operator_table
&lt;
	operator_group
	&lt;
		operator_left&lt;'+', node_add&gt;,
		operator_left&lt;'-', node_sub&gt;
	&gt;,
	operator_group
	&lt;
		operator_left&lt;'*', node_mul&gt;,
		operator_left&lt;'/', node_div&gt;
	&gt;,
	operator_group
	&lt;
		operator_right&lt;'^', node_pow&gt;
	&gt;
&gt; operators;

struct binary_operator_parser
{
	static std::unique_ptr&lt;node_base&gt; parse(char const*&amp; string)
	{
		// whitespace_skipper: Irgendwie selbsterklaerend. Legt fest, dass Leerzeichen uebersprungen werden.
		// primary_expression_parser: Der naechste, aufzurufende Parser.
		// operators: Die Operatorendefinition.
		return ::parse&lt;whitespace_skipper, primary_expression_parser, operators&gt;(string);
	}
};
</code></pre>
<p>operator_table fasst die Operatoren in einem Typ zusammen. Eine operator_group repraesentiert eine Gruppe von Operatoren mit der selben Prioritaet. operator_left bzw operator_right ist ein links/rechtsassoziativer Operator. Der erste Parameter ist das Symbol (derzeit nur ein einzelnes Zeichen moeglich), der zweite Parameter der Typ der entsprechenden AST-Node.</p>
<p>Hier ein vollstaendiges, kompilierbares Beispiel, inkl. Implementierung (Aus mehreren Dateien zusammengewuerfel, daher die Include-Guards): <a href="http://ideone.com/si1fy" rel="nofollow">http://ideone.com/si1fy</a></p>
<p>Feedback waere supi <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Gruessle,<br />
Der Kellerautomat</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/308436/parser-fuer-ausdruecke-mit-binaeren-operatoren</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 18:05:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/308436.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 25 Sep 2012 07:58:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Parser fuer Ausdruecke mit binaeren Operatoren on Tue, 25 Sep 2012 07:59:21 GMT]]></title><description><![CDATA[<p>Hallo Leute!</p>
<p>Ich wuerde euch gerne meine Arbeit der letzten Stunden praesentieren. Urspruenglich wollte ich einen einfachen Matheparser bauen, stattdessen ist daraus aber ein Parser-Generator fuer binaere Operatoren geworden. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Hier ein Codebeispiel, wie man ihn verwendet:</p>
<pre><code class="language-cpp">typedef operator_table
&lt;
	operator_group
	&lt;
		operator_left&lt;'+', node_add&gt;,
		operator_left&lt;'-', node_sub&gt;
	&gt;,
	operator_group
	&lt;
		operator_left&lt;'*', node_mul&gt;,
		operator_left&lt;'/', node_div&gt;
	&gt;,
	operator_group
	&lt;
		operator_right&lt;'^', node_pow&gt;
	&gt;
&gt; operators;

struct binary_operator_parser
{
	static std::unique_ptr&lt;node_base&gt; parse(char const*&amp; string)
	{
		// whitespace_skipper: Irgendwie selbsterklaerend. Legt fest, dass Leerzeichen uebersprungen werden.
		// primary_expression_parser: Der naechste, aufzurufende Parser.
		// operators: Die Operatorendefinition.
		return ::parse&lt;whitespace_skipper, primary_expression_parser, operators&gt;(string);
	}
};
</code></pre>
<p>operator_table fasst die Operatoren in einem Typ zusammen. Eine operator_group repraesentiert eine Gruppe von Operatoren mit der selben Prioritaet. operator_left bzw operator_right ist ein links/rechtsassoziativer Operator. Der erste Parameter ist das Symbol (derzeit nur ein einzelnes Zeichen moeglich), der zweite Parameter der Typ der entsprechenden AST-Node.</p>
<p>Hier ein vollstaendiges, kompilierbares Beispiel, inkl. Implementierung (Aus mehreren Dateien zusammengewuerfel, daher die Include-Guards): <a href="http://ideone.com/si1fy" rel="nofollow">http://ideone.com/si1fy</a></p>
<p>Feedback waere supi <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Gruessle,<br />
Der Kellerautomat</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254178</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Tue, 25 Sep 2012 07:59:21 GMT</pubDate></item><item><title><![CDATA[Reply to Parser fuer Ausdruecke mit binaeren Operatoren on Tue, 25 Sep 2012 13:09:15 GMT]]></title><description><![CDATA[<p>Warum das Rad neu erfinden? Ich fand flex+bison immer ganz nett.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254286</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 25 Sep 2012 13:09:15 GMT</pubDate></item><item><title><![CDATA[Reply to Parser fuer Ausdruecke mit binaeren Operatoren on Tue, 25 Sep 2012 13:12:12 GMT]]></title><description><![CDATA[<p>Oder boost::spirit <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254287</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 25 Sep 2012 13:12:12 GMT</pubDate></item><item><title><![CDATA[Reply to Parser fuer Ausdruecke mit binaeren Operatoren on Wed, 26 Sep 2012 13:01:35 GMT]]></title><description><![CDATA[<p>Am besten macht ein Mod den Thread einfach zu, wenn hier nichts brauchbares mehr kommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254596</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Wed, 26 Sep 2012 13:01:35 GMT</pubDate></item><item><title><![CDATA[Reply to Parser fuer Ausdruecke mit binaeren Operatoren on Wed, 26 Sep 2012 16:43:13 GMT]]></title><description><![CDATA[<p>Schöner Code, gefällt mir. <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/2254697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254697</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Wed, 26 Sep 2012 16:43:13 GMT</pubDate></item></channel></rss>