<?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[Rekursiven Parser beschleunigen]]></title><description><![CDATA[<p>Hi,</p>
<p>also ich habe folgendes Problem:<br />
Ich habe einen rekursiven parser, der mathematische Ausdrücke (in Form von strings) rekursive durchrechnet, z.B. 2^(i+4*3/5+7/2)/5. Sprich ein etwas schlauerer Taschenrechner.<br />
Das funktioniert auch gut und schön, ist jedoch, um damit beispielsweise eine Funktion (variable wird deklariert und dann durch Zahlenstring ersetzt) zu plotten viel zu langsam. Lässt sich das beschleunigen ? Z.B. indem der Parser irgendwie anstatt in eine Zahl zu parsen, eine Funktion erstellt (???), die sowas macht ? Dann müsste man einmal parsen und alles weitere würde beschleunigt von statten gehen.</p>
<p>Oder kann ich das compilermäßig beschleunigen (borland 5.5) ?<br />
ASM muss ich nicht unbedingt verwenden, falls das eine Variante sein sollte...</p>
<p>Vielen dank für ideen !</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/233519/rekursiven-parser-beschleunigen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 02:59:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/233519.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Feb 2009 13:41:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Rekursiven Parser beschleunigen on Thu, 05 Feb 2009 13:41:24 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>also ich habe folgendes Problem:<br />
Ich habe einen rekursiven parser, der mathematische Ausdrücke (in Form von strings) rekursive durchrechnet, z.B. 2^(i+4*3/5+7/2)/5. Sprich ein etwas schlauerer Taschenrechner.<br />
Das funktioniert auch gut und schön, ist jedoch, um damit beispielsweise eine Funktion (variable wird deklariert und dann durch Zahlenstring ersetzt) zu plotten viel zu langsam. Lässt sich das beschleunigen ? Z.B. indem der Parser irgendwie anstatt in eine Zahl zu parsen, eine Funktion erstellt (???), die sowas macht ? Dann müsste man einmal parsen und alles weitere würde beschleunigt von statten gehen.</p>
<p>Oder kann ich das compilermäßig beschleunigen (borland 5.5) ?<br />
ASM muss ich nicht unbedingt verwenden, falls das eine Variante sein sollte...</p>
<p>Vielen dank für ideen !</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658487</guid><dc:creator><![CDATA[Floyd]]></dc:creator><pubDate>Thu, 05 Feb 2009 13:41:24 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursiven Parser beschleunigen on Thu, 05 Feb 2009 13:54:15 GMT]]></title><description><![CDATA[<p>Ich bezweifle dass das am Parser liegt, eher am Plotter. Schau dich mal nach einem geeigneten Profiler um, der wird dir sagen wo das Programm sich so lange rumtreibt <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/1658497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658497</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 05 Feb 2009 13:54:15 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursiven Parser beschleunigen on Thu, 05 Feb 2009 14:13:07 GMT]]></title><description><![CDATA[<p>ich benutze zur Zeit die VCL vom Builder...<br />
Ist die so langsam ? Aber gut, ich schaue es mir an !</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658507</guid><dc:creator><![CDATA[Floyd]]></dc:creator><pubDate>Thu, 05 Feb 2009 14:13:07 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursiven Parser beschleunigen on Thu, 05 Feb 2009 14:31:56 GMT]]></title><description><![CDATA[<p>Floyd schrieb:</p>
<blockquote>
<p>Lässt sich das beschleunigen ? Z.B. indem der Parser irgendwie anstatt in eine Zahl zu parsen, eine Funktion erstellt (???), die sowas macht ? Dann müsste man einmal parsen und alles weitere würde beschleunigt von statten gehen.</p>
</blockquote>
<p>Du kannst anhand der Formel einfach C- oder C++-Code erstellen, einen Compiler das Ganze als minimale DLL kompilieren lassen und sie laden. Hört sich umständlich an, ist aber imho recht flott realisiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658526</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Thu, 05 Feb 2009 14:31:56 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursiven Parser beschleunigen on Thu, 05 Feb 2009 14:33:16 GMT]]></title><description><![CDATA[<p>lass dern parser keinen double zurückgeben, sondern eine</p>
<pre><code class="language-cpp">class ParseDing{
   virtual double eval()=0;
};
class Summe:public ParseDing{
   ParseDing* links;
   ParseDing* rechts;
   double eval(){
      return links-&gt;eval()+rechts-&gt;eval();
   }
};
class Produkt...
</code></pre>
<p>damit kannste einen total übersichtlichen parsebaum bauen. der ist dann auch recht fix im interpretieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658528</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 05 Feb 2009 14:33:16 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursiven Parser beschleunigen on Thu, 05 Feb 2009 14:34:07 GMT]]></title><description><![CDATA[<p>Du kannst die Gleichung einmalig als Baum darstellen und diesen dann auswerten. Somit wird nur einmal geparst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658529</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658529</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 05 Feb 2009 14:34:07 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursiven Parser beschleunigen on Thu, 05 Feb 2009 18:18:25 GMT]]></title><description><![CDATA[<p>@ Volkard: Ja, an eine solche Parse-Klasse dachte ich auch schon. Was da rauskommt ist doch aber praktisch eine Art Kette bzw. Baum ,oder ?</p>
<p>Daher meine frage:..<br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21632">@Knivil</a>: Wie genau meinst du das ? Im Sinne von Binärbäumen mit Zeigern auf das jeweils nächste Element ? Wo ist der Unterschied (evtl. Vorteil) zu Volkards Lösung ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658662</guid><dc:creator><![CDATA[Floyd]]></dc:creator><pubDate>Thu, 05 Feb 2009 18:18:25 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursiven Parser beschleunigen on Thu, 05 Feb 2009 22:04:39 GMT]]></title><description><![CDATA[<p>Volkards Lösung ist bereits so ein Parse-Baum. Stichwort Abstract Syntax Tree.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658783</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Thu, 05 Feb 2009 22:04:39 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursiven Parser beschleunigen on Sat, 07 Feb 2009 21:47:35 GMT]]></title><description><![CDATA[<p>Schon mal dran gedacht, dass Posts mit einem Abstand von ... 1 Minute vom anderen nicht gelesen wurde? Warum wundert es dich, dass gleiche Ideen dargelegt werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1659763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1659763</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Sat, 07 Feb 2009 21:47:35 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursiven Parser beschleunigen on Mon, 09 Mar 2009 15:13:12 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21632">@knivil</a>: Sorry, so war das nicht gemeint. Ich dachte, es wären vielleicht noch nennenswerte Unterschiede vorhanden gewesen.</p>
<p>Mhh... Ok, wie wird so eine Parserklasse praktisch umgesetzt ?<br />
Ich nehme an, ich baue eine Klasse</p>
<pre><code class="language-cpp">class ParseMathString {

public : 
    ParseMathSring( const char* MathString );
    double Evaluate();

private :
     char* MathString;
};
</code></pre>
<p>die dann in der evaluate Funktion den ParseTree baut. Wie handhabe ich den, sprich wie sorge ich z.B. dafür, dass ich ihn erneut abrufen kann. Die Lebensdauer der dort erzeugten ParseDings-Klassen ( siehe Beitrag von Volkard ) wäre ja nur entlang der Evaluate Funktion.<br />
Macht man das, z.B. dann so :</p>
<pre><code class="language-cpp">typedef vector&lt;ParseDing&gt; Expression;

class ParseMathString {

public : 
    ParseMathString( const char* MathString );
    Expression evaluate();

private :
     char* MathString ;
     vector&lt;Expression&gt; evaluatedStrings ; 
};
</code></pre>
<p>dann müsste man irgendwie dafür sorgen, dass die ganzen Zeiger usw. noch gelten, oder ??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1676811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1676811</guid><dc:creator><![CDATA[Floyd]]></dc:creator><pubDate>Mon, 09 Mar 2009 15:13:12 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursiven Parser beschleunigen on Mon, 09 Mar 2009 15:37:52 GMT]]></title><description><![CDATA[<p>Floyd schrieb:</p>
<blockquote>
<p>ich benutze zur Zeit die VCL vom Builder...</p>
</blockquote>
<p>Wenn du das nicht unbedingt selbst schreiben willst, könntest du JclExprEval aus der <a href="http://sourceforge.net/projects/jcl/" rel="nofollow">JEDI Code Library</a> benutzen. Die enthaltenen Klassen können einen Parse-Tree generieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1676827</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1676827</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Mon, 09 Mar 2009 15:37:52 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursiven Parser beschleunigen on Mon, 09 Mar 2009 16:54:42 GMT]]></title><description><![CDATA[<p>Schreib die Typen fuer deine Knoten des Gleichungsbaums: Sowas musste ich schon mal machen. Ist die selbe Idee, die oben schon mal angesprochen wurde: <a href="http://fara.cs.uni-potsdam.de/~schugk/myStud/numerik/beleg/src/exp.h" rel="nofollow">exp.h</a> <a href="http://fara.cs.uni-potsdam.de/~schugk/myStud/numerik/beleg/src/exp.cpp" rel="nofollow">exp.cpp</a>. Mit Hilfe von flex und bison wurde der Scanner bzw. Parser aus <a href="http://fara.cs.uni-potsdam.de/~schugk/myStud/numerik/beleg/src/scanner.l" rel="nofollow">scanner.l</a> und <a href="http://fara.cs.uni-potsdam.de/~schugk/myStud/numerik/beleg/src/parser.y" rel="nofollow">parser.y</a> automatisch generiert. Dazu empfehle ich aber die entsprechenden Tutorials zu flex und bison. Aufgerufen wird das ganze von <a href="http://fara.cs.uni-potsdam.de/~schugk/myStud/numerik/beleg/src/odeparser.h" rel="nofollow">odeparser.h</a>. Optimal ist es nicht, heute wuerde ich es wohl etwas anders machen, aber nicht grossartig anders.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1676883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1676883</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 09 Mar 2009 16:54:42 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursiven Parser beschleunigen on Tue, 10 Mar 2009 07:41:34 GMT]]></title><description><![CDATA[<p>Hey cool, Tools die Parsercode generieren, also MetaParser...</p>
<p>Flex und Bison - werde ich ausprobieren.</p>
<p>EDIT:<br />
Eine Frage dazu habe ich noch: Lässt sich der Code händisch einigermaßen erweitern ? Ich hätte zum Beispiel gerne die Möglichkeit Variablen (string name, double value ) in einer Datei zu deklarieren, sodass er diese erkennt und die entsprechenden Werte einsetzt. Das sollte aber nicht als eine Art Makro fungieren, sondern direkt im ParseTree mit vorhanden sein .<br />
Ich sehe den Code ja, daher die Frage: ist das wirklich eine Arbeitsaufwandsreduzierung ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677083</guid><dc:creator><![CDATA[Floyd]]></dc:creator><pubDate>Tue, 10 Mar 2009 07:41:34 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursiven Parser beschleunigen on Tue, 10 Mar 2009 08:43:02 GMT]]></title><description><![CDATA[<p>Ja das geht, aber wenn man es richtig machen moechte, dann kann ich dir noch weitere Lektuere empfehlen: z.B. Struktur und Interpretation von Computerprogramme. Bison z.B. ist die GNU-Variante von YACC, wes uebersetzt bedeuted: yet another compiler compiler, was schon alles sagt. Andere sind z.B. boost::spirit oder boost::spirit2, habe die abder noch nie benutzt/gebraucht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677105</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 10 Mar 2009 08:43:02 GMT</pubDate></item></channel></rss>