<?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[Interpreter Entwurf]]></title><description><![CDATA[<p>Ich schreibe momentan an einem Formelinterpreter, dieser soll folgende Funktionen unterstuetzen<br />
- alle Grundrechenoperatoren (+,-,*,/)<br />
- die 4 Winkelfunktionen (sin, cos, tan, cotan)<br />
- er soll auch einfach erweiterbar sein zb (exponenten, log, usw..)</p>
<p>zB soll er folgenden Ausdruck auswerten koennen</p>
<pre><code>$var1 = 3.3
  $var2 = 7

  f := (4 + 3) - $var1 + cos($var2)
</code></pre>
<p>momentan verfolge ich diesen Ansatz<br />
ich habe eine abstrakte Ausdrucks Klasse die mir die Schnittstelle fuer meine Ausdrucksunterklassen wie zB: +, -, sin Ausdruck bereitstellt und die dem User eine interpretierte Formel liefern soll</p>
<pre><code class="language-cpp">template &lt;class T&gt;
	class Expression
	{
	public:
		typedef Expression&lt;T&gt; ExpressionBase;

	public:
		Expression();
		virtual ~Expression();

		virtual Expression&amp; interpret() = 0;
	};

	template &lt;class T&gt;
	class ValueExpression : public Expression&lt;T&gt;
	{
	public:
		ValueExpression(T&amp; val) : _value(val) { }
		virtual ~ValueExpression();

		virtual ExpressionBase&amp; interpret() { return new ValueExpression(_value); }

	private:
		T _value;
	};

	template &lt;class T&gt;
	class PlusExpression : public Expression&lt;T&gt;
	{
	public:
		PlusExpression(ExpressionBase&amp; left, ExpressionBase&amp; right)
			: _pleft(left), _pright(right) { }
		virtual ~PlusExpression() { }

		virtual ExpressionBase&amp; interpret() { return new ExpressionBase(_pleft + _pright); }

	private:
		ExpressionBase * _pleft;
		ExpressionBase * _pright;
	};
</code></pre>
<p>was haltet ihr von diesem Ansatz.. ich steh momentan auf der Leitung und waere fuer ein paar Denkanstoeße sehr dankbar, vielleicht kennt auch jemand einen einfachen Interpreter dem ich mir anschaun koennte</p>
<p>mfg leo</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/125982/interpreter-entwurf</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 13:56:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/125982.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 10 Nov 2005 21:11:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Interpreter Entwurf on Fri, 11 Nov 2005 20:43:49 GMT]]></title><description><![CDATA[<p>Ich schreibe momentan an einem Formelinterpreter, dieser soll folgende Funktionen unterstuetzen<br />
- alle Grundrechenoperatoren (+,-,*,/)<br />
- die 4 Winkelfunktionen (sin, cos, tan, cotan)<br />
- er soll auch einfach erweiterbar sein zb (exponenten, log, usw..)</p>
<p>zB soll er folgenden Ausdruck auswerten koennen</p>
<pre><code>$var1 = 3.3
  $var2 = 7

  f := (4 + 3) - $var1 + cos($var2)
</code></pre>
<p>momentan verfolge ich diesen Ansatz<br />
ich habe eine abstrakte Ausdrucks Klasse die mir die Schnittstelle fuer meine Ausdrucksunterklassen wie zB: +, -, sin Ausdruck bereitstellt und die dem User eine interpretierte Formel liefern soll</p>
<pre><code class="language-cpp">template &lt;class T&gt;
	class Expression
	{
	public:
		typedef Expression&lt;T&gt; ExpressionBase;

	public:
		Expression();
		virtual ~Expression();

		virtual Expression&amp; interpret() = 0;
	};

	template &lt;class T&gt;
	class ValueExpression : public Expression&lt;T&gt;
	{
	public:
		ValueExpression(T&amp; val) : _value(val) { }
		virtual ~ValueExpression();

		virtual ExpressionBase&amp; interpret() { return new ValueExpression(_value); }

	private:
		T _value;
	};

	template &lt;class T&gt;
	class PlusExpression : public Expression&lt;T&gt;
	{
	public:
		PlusExpression(ExpressionBase&amp; left, ExpressionBase&amp; right)
			: _pleft(left), _pright(right) { }
		virtual ~PlusExpression() { }

		virtual ExpressionBase&amp; interpret() { return new ExpressionBase(_pleft + _pright); }

	private:
		ExpressionBase * _pleft;
		ExpressionBase * _pright;
	};
</code></pre>
<p>was haltet ihr von diesem Ansatz.. ich steh momentan auf der Leitung und waere fuer ein paar Denkanstoeße sehr dankbar, vielleicht kennt auch jemand einen einfachen Interpreter dem ich mir anschaun koennte</p>
<p>mfg leo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/914394</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/914394</guid><dc:creator><![CDATA[leo aka qsch]]></dc:creator><pubDate>Fri, 11 Nov 2005 20:43:49 GMT</pubDate></item><item><title><![CDATA[Reply to Interpreter Entwurf on Fri, 11 Nov 2005 20:44:22 GMT]]></title><description><![CDATA[<p>bitte um Hilfe</p>
<p>leo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/915540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/915540</guid><dc:creator><![CDATA[leo aka qsch]]></dc:creator><pubDate>Fri, 11 Nov 2005 20:44:22 GMT</pubDate></item><item><title><![CDATA[Reply to Interpreter Entwurf on Sat, 12 Nov 2005 07:52:12 GMT]]></title><description><![CDATA[<p>Bitte kommentier mal deinen Ansatz, steige da nicht ganz durch.<br />
(Nicht, dass ich dir danach unbedingt helfen könnte ..)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/915669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/915669</guid><dc:creator><![CDATA[Panke]]></dc:creator><pubDate>Sat, 12 Nov 2005 07:52:12 GMT</pubDate></item><item><title><![CDATA[Reply to Interpreter Entwurf on Sat, 12 Nov 2005 12:26:32 GMT]]></title><description><![CDATA[<p>Also bei Interpretern wie diesem denke ich an <a href="http://spirit.sourceforge.net/" rel="nofollow">Spirit</a>. Mit dem ginge so etwas (zumindest prinzipiell ;)) deutlich einfacher.</p>
<p>Deinen Ansatz verstehe ich übrigens auch nicht so richtig. Beispielsweise frage ich mich, wieso du Zeiger auf dynamischen Speicher als Referenzen auf diesen zurückgibts. Das schreit doch eigentlich nach Speicherleck.</p>
<p>Und das ExpressionBase-Typedef funktioniert doch afaik nur, wenn in der abgeleiteten Klasse dann</p>
<pre><code class="language-cpp">using Expression&lt;T&gt;::ExpressionBase;
</code></pre>
<p>steht, was ja wiederum länger als</p>
<pre><code class="language-cpp">typedef Expression&lt;T&gt; ExpressionBase;
</code></pre>
<p>ist.</p>
<p>Außerdem bin ich mir noch im Unklaren über den Template-Parameter T. Wieso ist nur EIN Typ erlaubt? Wenn du an double gedacht hast, hättest du das auch direkt schreiben können. T=int u.a. ist doch eigentlich auch unsinnig, zumindest in dieser Struktur, die nur einen Typ für den Gesamtausdruck zulässt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/915832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/915832</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sat, 12 Nov 2005 12:26:32 GMT</pubDate></item></channel></rss>