<?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[Mathe Parser]]></title><description><![CDATA[<p>Hallo</p>
<p>Ich wollte in meiner Freizeit einen kleinen Matheparser schreiben.<br />
Das Ding scheint weitgehend zu funktionieren. Schlägt aber Fehl, wenn die Reihenfolge eine Rolle Spielt.<br />
So funktioniert z.B. der Ausdruck 1-2-3 oder 2-2-2 nicht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Der Fehler scheint wohl darin zu liegen, dass der Ausdruck von hinten nach vorne ausgewertet wird.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;exception&gt;
#include &lt;cmath&gt;

class wrong_argument : public std::exception
{
public:
	const char* what() const throw();
};

const char* wrong_argument::what() const throw()
{
	return &quot;Falsches Argument!&quot;;
}

double term(std::istream&amp;);
double term1(std::istream&amp;);
double zahl(std::istream&amp;);
double function(std::istream&amp;);

double function(std::istream &amp;s)
{
	char c;
	s.get(c);
	std::cout &lt;&lt; &quot;Error: &quot; &lt;&lt; c &lt;&lt; '\n';

	throw wrong_argument();
}

double zahl(std::istream &amp;s)
{
	double d;
	char c;
	s.get(c);
	switch(c)
	{
		case '0': case '1': case '2': case '3': case '4': case '5': 
		case '6': case '7': case '8': case '9': 
			s.putback(c);
			s &gt;&gt; d;
			return d;
	}
	throw wrong_argument();
}

 double parse(std::istream &amp;s)
{
	return term(s);
}

double term1(std::istream &amp;s)
{
	double z = zahl(s);
	char c;	
	s.get(c);
	switch(c)
	{
		case '*':
			return (z * term1(s));
		case '/':
			return (z / term1(s));
	}

	s.putback(c);
	return z;
}

double term(std::istream &amp;s)
{
	double z = term1(s);
	char c;	
	s.get(c);
	switch(c)
	{
		case '+' :
			return (z + term(s));
		case '-':
			return (z - term(s));
	}

	s.putback(c);
	return z;
}

int main(int argc, char *argv[])
{
	if(argc &lt; 2) return -1;
	std::stringstream s(argv[1]);
	std::cout &lt;&lt; parse(s) &lt;&lt; '\n';
return 0;
}
</code></pre>
<p>Hat irgendjemand einen Tipp oder eine Lösung.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/298330/mathe-parser</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 20:48:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/298330.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 18 Jan 2012 08:32:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mathe Parser on Wed, 18 Jan 2012 08:32:33 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Ich wollte in meiner Freizeit einen kleinen Matheparser schreiben.<br />
Das Ding scheint weitgehend zu funktionieren. Schlägt aber Fehl, wenn die Reihenfolge eine Rolle Spielt.<br />
So funktioniert z.B. der Ausdruck 1-2-3 oder 2-2-2 nicht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Der Fehler scheint wohl darin zu liegen, dass der Ausdruck von hinten nach vorne ausgewertet wird.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;exception&gt;
#include &lt;cmath&gt;

class wrong_argument : public std::exception
{
public:
	const char* what() const throw();
};

const char* wrong_argument::what() const throw()
{
	return &quot;Falsches Argument!&quot;;
}

double term(std::istream&amp;);
double term1(std::istream&amp;);
double zahl(std::istream&amp;);
double function(std::istream&amp;);

double function(std::istream &amp;s)
{
	char c;
	s.get(c);
	std::cout &lt;&lt; &quot;Error: &quot; &lt;&lt; c &lt;&lt; '\n';

	throw wrong_argument();
}

double zahl(std::istream &amp;s)
{
	double d;
	char c;
	s.get(c);
	switch(c)
	{
		case '0': case '1': case '2': case '3': case '4': case '5': 
		case '6': case '7': case '8': case '9': 
			s.putback(c);
			s &gt;&gt; d;
			return d;
	}
	throw wrong_argument();
}

 double parse(std::istream &amp;s)
{
	return term(s);
}

double term1(std::istream &amp;s)
{
	double z = zahl(s);
	char c;	
	s.get(c);
	switch(c)
	{
		case '*':
			return (z * term1(s));
		case '/':
			return (z / term1(s));
	}

	s.putback(c);
	return z;
}

double term(std::istream &amp;s)
{
	double z = term1(s);
	char c;	
	s.get(c);
	switch(c)
	{
		case '+' :
			return (z + term(s));
		case '-':
			return (z - term(s));
	}

	s.putback(c);
	return z;
}

int main(int argc, char *argv[])
{
	if(argc &lt; 2) return -1;
	std::stringstream s(argv[1]);
	std::cout &lt;&lt; parse(s) &lt;&lt; '\n';
return 0;
}
</code></pre>
<p>Hat irgendjemand einen Tipp oder eine Lösung.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169386</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169386</guid><dc:creator><![CDATA[a+b=c]]></dc:creator><pubDate>Wed, 18 Jan 2012 08:32:33 GMT</pubDate></item><item><title><![CDATA[Reply to Mathe Parser on Wed, 18 Jan 2012 09:24:57 GMT]]></title><description><![CDATA[<p>Hallo, schau mal hier:<br />
<a href="http://www.stroustrup.com/Programming/" rel="nofollow">http://www.stroustrup.com/Programming/</a></p>
<p>Guck mal bei Supporting Code, da findest du vielleicht was du suchst.</p>
<p>Da solltest du das hier finden:</p>
<p>First &quot;mysterious&quot; version calculator example for Chapter 6 page 202 &quot;Try This&quot;.<br />
Be-bugged calculator example for Chapter 6 exercise in debugging.<br />
Be-bugged calculator example for Chapter 7 exercise in debugging.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169410</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169410</guid><dc:creator><![CDATA[c_P_P]]></dc:creator><pubDate>Wed, 18 Jan 2012 09:24:57 GMT</pubDate></item><item><title><![CDATA[Reply to Mathe Parser on Wed, 18 Jan 2012 09:27:54 GMT]]></title><description><![CDATA[<p>a+b=c schrieb:</p>
<blockquote>
<pre><code class="language-cpp">return (z / term1(s));
</code></pre>
</blockquote>
<p>a+b=c schrieb:</p>
<blockquote>
<pre><code class="language-cpp">return (z - term(s));
</code></pre>
</blockquote>
<p>Deine Operatoren sind rechtsassoziativ. Du Subtrahierst / Dividierst hier immer durch den rechten Term. Richtig wäre, nacheinander zu subtrahieren/dividieren. Meiner Meinung nach geht das nur Iterativ, ich lasse mich aber gerne eines besseren belehren.</p>
<p>P.S.: Ich empfehle dir, das Lexing und Parsing zu trennen, macht einiges einfacher.<br />
P.P.S.: Klammern um Returnvalues sind hässlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169412</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 18 Jan 2012 09:27:54 GMT</pubDate></item><item><title><![CDATA[Reply to Mathe Parser on Wed, 18 Jan 2012 10:54:55 GMT]]></title><description><![CDATA[<p>Mach es wie <a href="https://www.ibm.com/developerworks/library/j-w3eval/" rel="nofollow">Knuth</a> und wandle den Ausdruck erst in Postfix um und parse dann den.</p>
<p>Oder schau dir einmal <a href="http://www.c-plusplus.net/forum/p1642138#1642138" rel="nofollow">diese fertige Lösung</a> von Werner Salomon an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169467</guid><dc:creator><![CDATA[outliner]]></dc:creator><pubDate>Wed, 18 Jan 2012 10:54:55 GMT</pubDate></item><item><title><![CDATA[Reply to Mathe Parser on Wed, 18 Jan 2012 16:21:14 GMT]]></title><description><![CDATA[<p>@c_P_P<br />
Danke für den Link. Hab nun, ähnlich wie in der Stroustrup-Lösung, while-Schleifen implementiert.<br />
Eigentlich eine ganz simple Lösung. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22268">@PI</a></p>
<blockquote>
<p>P.S.: Ich empfehle dir, das Lexing und Parsing zu trennen, macht einiges einfacher.</p>
</blockquote>
<p>Bei dem einfachen Programm kann ich mir nur schwer eine Verbesserung durch die Trennung zwischen Lexer und Parser vorstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169647</guid><dc:creator><![CDATA[a+b=c]]></dc:creator><pubDate>Wed, 18 Jan 2012 16:21:14 GMT</pubDate></item><item><title><![CDATA[Reply to Mathe Parser on Wed, 18 Jan 2012 17:59:05 GMT]]></title><description><![CDATA[<p>Je komplizierte die Ausdrücke werden, desto eher lohnt es sich. <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/2169702</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169702</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 18 Jan 2012 17:59:05 GMT</pubDate></item><item><title><![CDATA[Reply to Mathe Parser on Wed, 18 Jan 2012 18:04:49 GMT]]></title><description><![CDATA[<p><a href="http://www.c-plusplus.net/forum/268247" rel="nofollow">http://www.c-plusplus.net/forum/268247</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169708</guid><dc:creator><![CDATA[jjj]]></dc:creator><pubDate>Wed, 18 Jan 2012 18:04:49 GMT</pubDate></item><item><title><![CDATA[Reply to Mathe Parser on Wed, 18 Jan 2012 18:06:08 GMT]]></title><description><![CDATA[<p>Lustig, dass ich erst vor ein paar Tagen ein Parser Konzept gebastelt habe... (jedoch komplexer mit Variablen, Klammern, Operatorenreihenfolge und Funktionen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169711</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169711</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Wed, 18 Jan 2012 18:06:08 GMT</pubDate></item><item><title><![CDATA[Reply to Mathe Parser on Wed, 18 Jan 2012 18:08:07 GMT]]></title><description><![CDATA[<p>jjj schrieb:</p>
<blockquote>
<p><a href="http://www.c-plusplus.net/forum/268247" rel="nofollow">http://www.c-plusplus.net/forum/268247</a></p>
</blockquote>
<p>Iiiih, der arbeitet ja mit std::string. Wie langsam.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169712</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169712</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 18 Jan 2012 18:08:07 GMT</pubDate></item><item><title><![CDATA[Reply to Mathe Parser on Wed, 18 Jan 2012 19:55:05 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>jjj schrieb:</p>
<blockquote>
<p><a href="http://www.c-plusplus.net/forum/268247" rel="nofollow">http://www.c-plusplus.net/forum/268247</a></p>
</blockquote>
<p>Iiiih, der arbeitet ja mit std::string. Wie langsam.</p>
</blockquote>
<p>Es handelt sich um einen Artikel und da zählt Geschwindigkeit nicht. Aber zum Download steht sogar eine einfache Version in C bereit. Hättest du dich mal genauer damit befasst bevor du meckerst. <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/2169767</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169767</guid><dc:creator><![CDATA[jjj]]></dc:creator><pubDate>Wed, 18 Jan 2012 19:55:05 GMT</pubDate></item><item><title><![CDATA[Reply to Mathe Parser on Wed, 18 Jan 2012 20:08:00 GMT]]></title><description><![CDATA[<p>C ist aber auch doph.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169779</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 18 Jan 2012 20:08:00 GMT</pubDate></item><item><title><![CDATA[Reply to Mathe Parser on Wed, 18 Jan 2012 22:02:45 GMT]]></title><description><![CDATA[<p>boah PI ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169846</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Wed, 18 Jan 2012 22:02:45 GMT</pubDate></item><item><title><![CDATA[Reply to Mathe Parser on Thu, 19 Jan 2012 04:40:00 GMT]]></title><description><![CDATA[<p>Da ist der gute Pi so begeistert von meiner Range Idee, will sie aber einfach nicht Range nennen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
const_string. Pff.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169874</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 19 Jan 2012 04:40:00 GMT</pubDate></item><item><title><![CDATA[Reply to Mathe Parser on Thu, 19 Jan 2012 08:41:34 GMT]]></title><description><![CDATA[<p>Die Idee ist nicht von dir.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169920</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 19 Jan 2012 08:41:34 GMT</pubDate></item></channel></rss>