<?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[Hilfe beim Parsen von eigener Sprache in C++]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich schreibe gerade an meinem ersten groesseren C++ Projekt und ich bin hier etwas vor ne Wand gelaufen.<br />
Im Prinzip gehts um einen Parser fuer eine einfache, eigene Programmiersprache, der in das fertige Program eingebaut werden soll.<br />
Die Sprache soll nichts koennen als mehrere Anweisungen (getrennt durch &quot;;&quot;) zu geben, die entweder als true oder false gewertet werden koennen. Dabei soll auf einen internen &quot;Vorrat&quot; an variablen zugegriffen , und einfache Dinge getestet werden (z.B. &quot;existiert in diesem array ein Objekt mit Wert X&quot;).</p>
<p>Ich habe eine Liste an Worten etc., die in der Sprache benutzt werden sollen und versuche jetzt, das ganze effizient (im Sinne vom Code-aufwand, nicht unbedingt Performance-bezogen) zu parsen.</p>
<p>Mein Problem hierbei ist, die verschiedenen Kombinationsmoeglichketen der Schluesselworte zu programmieren.<br />
Ein Beispiel:</p>
<pre><code>vector MUST CONTAIN 5;
vector MUST_NOT CONTAIN &quot;test&quot;;
string MUST CONTAIN_ONLY 's';
</code></pre>
<p>hier sind (bei den wenigen Beispielen) schon 3 verschiedene funktionen zum parsen noetig:</p>
<pre><code>bool check(int needle, const std::vector&lt;int&gt;&amp; haystack, bool must, bool only)
{
  ...
}

bool check(const std::string&amp; needle, const std::vector&lt;std::string&gt;&amp; haystack, bool must, bool only)
{
...
}

bool check(char needle, const std::string&amp; haystack, bool must, bool only)
{
...
}
</code></pre>
<p>Gibt es eine moeglichkeit, sozusagen zentral die noetige Funktion aufzurufen, anstatt das ganze ueber ewige if-else-Abfragen zu regeln?</p>
<pre><code>bool must,only;

if(word2==&quot;MUST&quot;)
  must=true;
else 
  must=false;

if(word3==&quot;CONTAIN&quot;)
  only=false;
else if(word3==&quot;CONTAIN_ONLY&quot;)
  only=true;

if(word1==&quot;vector&quot;&amp;&amp;isdigit(word4))
{
 check(word4,int_vector,must,only);
}
else if(word1==&quot;vector&quot;&amp;&amp;isstring(word4))
{
 check(word4,str_vector,must,only);
}
else if(word1==&quot;string&quot;&amp;&amp;ischar(word4))
{
 check(word4,string,must,only);
}

....
</code></pre>
<p>(der code ist jetzt nicht 100% richtig, war nur als Beispiel gedacht)</p>
<p>Das mag ja noch gehen bei 2-3 verschiedenen Typen/Kombinationen, aber ich habe inzwischen viel mehr, und ich frage mich, ob es da nicht einen einfachereren weg gibt als ueber if-else.</p>
<p>Jedwedige Hilfe willkomen <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/topic/279913/hilfe-beim-parsen-von-eigener-sprache-in-c</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 08:05:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/279913.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 06 Jan 2011 03:49:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Hilfe beim Parsen von eigener Sprache in C++ on Thu, 06 Jan 2011 03:49:04 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich schreibe gerade an meinem ersten groesseren C++ Projekt und ich bin hier etwas vor ne Wand gelaufen.<br />
Im Prinzip gehts um einen Parser fuer eine einfache, eigene Programmiersprache, der in das fertige Program eingebaut werden soll.<br />
Die Sprache soll nichts koennen als mehrere Anweisungen (getrennt durch &quot;;&quot;) zu geben, die entweder als true oder false gewertet werden koennen. Dabei soll auf einen internen &quot;Vorrat&quot; an variablen zugegriffen , und einfache Dinge getestet werden (z.B. &quot;existiert in diesem array ein Objekt mit Wert X&quot;).</p>
<p>Ich habe eine Liste an Worten etc., die in der Sprache benutzt werden sollen und versuche jetzt, das ganze effizient (im Sinne vom Code-aufwand, nicht unbedingt Performance-bezogen) zu parsen.</p>
<p>Mein Problem hierbei ist, die verschiedenen Kombinationsmoeglichketen der Schluesselworte zu programmieren.<br />
Ein Beispiel:</p>
<pre><code>vector MUST CONTAIN 5;
vector MUST_NOT CONTAIN &quot;test&quot;;
string MUST CONTAIN_ONLY 's';
</code></pre>
<p>hier sind (bei den wenigen Beispielen) schon 3 verschiedene funktionen zum parsen noetig:</p>
<pre><code>bool check(int needle, const std::vector&lt;int&gt;&amp; haystack, bool must, bool only)
{
  ...
}

bool check(const std::string&amp; needle, const std::vector&lt;std::string&gt;&amp; haystack, bool must, bool only)
{
...
}

bool check(char needle, const std::string&amp; haystack, bool must, bool only)
{
...
}
</code></pre>
<p>Gibt es eine moeglichkeit, sozusagen zentral die noetige Funktion aufzurufen, anstatt das ganze ueber ewige if-else-Abfragen zu regeln?</p>
<pre><code>bool must,only;

if(word2==&quot;MUST&quot;)
  must=true;
else 
  must=false;

if(word3==&quot;CONTAIN&quot;)
  only=false;
else if(word3==&quot;CONTAIN_ONLY&quot;)
  only=true;

if(word1==&quot;vector&quot;&amp;&amp;isdigit(word4))
{
 check(word4,int_vector,must,only);
}
else if(word1==&quot;vector&quot;&amp;&amp;isstring(word4))
{
 check(word4,str_vector,must,only);
}
else if(word1==&quot;string&quot;&amp;&amp;ischar(word4))
{
 check(word4,string,must,only);
}

....
</code></pre>
<p>(der code ist jetzt nicht 100% richtig, war nur als Beispiel gedacht)</p>
<p>Das mag ja noch gehen bei 2-3 verschiedenen Typen/Kombinationen, aber ich habe inzwischen viel mehr, und ich frage mich, ob es da nicht einen einfachereren weg gibt als ueber if-else.</p>
<p>Jedwedige Hilfe willkomen <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/2002991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2002991</guid><dc:creator><![CDATA[Temporary]]></dc:creator><pubDate>Thu, 06 Jan 2011 03:49:04 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe beim Parsen von eigener Sprache in C++ on Thu, 06 Jan 2011 04:37:17 GMT]]></title><description><![CDATA[<p>Ich meine es würde helfen erstmal eine Grammatik zu definieren. Dann siehst du ob du die mit einem &quot;formlosen&quot; if-else Parser gebacken bekommst, oder ob es besser/einfacher wäre sich eines Standardmodells ala Recursive-Descent-Parser zu bedienen.</p>
<p><a href="http://en.wikipedia.org/wiki/Recursive_descent_parser" rel="nofollow">http://en.wikipedia.org/wiki/Recursive_descent_parser</a></p>
<p>ps: du solltest vermutlich das &quot;Parsen&quot; und das &quot;Ausführen&quot; (Interpretieren) trennen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2002992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2002992</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 06 Jan 2011 04:37:17 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe beim Parsen von eigener Sprache in C++ on Thu, 06 Jan 2011 06:55:30 GMT]]></title><description><![CDATA[<p>Mit Compilerbau hast du dir ein relativ komplexes Thema ausgesucht, aber es gibt viel Info dazu. <a href="https://www.google.de/search?&amp;q=Compilerbau%20" rel="nofollow">Google: Compilerbau</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2002998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2002998</guid><dc:creator><![CDATA[mmmmmmmmmmmmmmmm]]></dc:creator><pubDate>Thu, 06 Jan 2011 06:55:30 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe beim Parsen von eigener Sprache in C++ on Thu, 06 Jan 2011 09:10:18 GMT]]></title><description><![CDATA[<p>Temporary schrieb:</p>
<blockquote>
<p>Hallo!</p>
<p>Das mag ja noch gehen bei 2-3 verschiedenen Typen/Kombinationen, aber ich habe inzwischen viel mehr, und ich frage mich, ob es da nicht einen einfachereren weg gibt als ueber if-else.</p>
<p>Jedwedige Hilfe willkomen <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>
</blockquote>
<p>Lange if/else-Ketten in Zusammenhang mit Zuständen umgehe ich gerne mit einer State-Event-Machine. Du hast dabei relativ wenig C++-Code und eine Tabelle, in die Du das zuvor gezeichnete State-Event-Diagramm schreibst. Abhängig vom aktuellen State sind gewisse Events (Tokens) erlaubt und andere nicht. Ein Event führt zu einem Zustandsübergang. Dabei kann zusätzlich eine Funktion ausgeführt werden.</p>
<p>State-Machines gibts z.B. in Boost. Für komplexe Sprachen gibts vermutlich noch geeignetere Ansätze.</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2003036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2003036</guid><dc:creator><![CDATA[sm]]></dc:creator><pubDate>Thu, 06 Jan 2011 09:10:18 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe beim Parsen von eigener Sprache in C++ on Thu, 06 Jan 2011 10:34:03 GMT]]></title><description><![CDATA[<p>Bzgl. Compilerbau ist ein Blick in die Theoretische Informatik sehr zu empfehlen, da dort deterministisch endliche Automaten und Sprachen sowie deren Grammatiken gelehrt werden. EBNF ist hier ein besonderes Schlagwort neben den erwähnten Automaten!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2003058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2003058</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 06 Jan 2011 10:34:03 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe beim Parsen von eigener Sprache in C++ on Thu, 06 Jan 2011 11:01:27 GMT]]></title><description><![CDATA[<p>Was spricht gegen YACC?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2003073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2003073</guid><dc:creator><![CDATA[Famer]]></dc:creator><pubDate>Thu, 06 Jan 2011 11:01:27 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe beim Parsen von eigener Sprache in C++ on Thu, 06 Jan 2011 11:09:45 GMT]]></title><description><![CDATA[<p>Der Artikel <a href="http://www.c-plusplus.net/forum/268247" rel="nofollow">Interpreterbau</a> sollte dir auch einen Überblick über eine mögliche Parser-Implementierung geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2003079</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2003079</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Thu, 06 Jan 2011 11:09:45 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe beim Parsen von eigener Sprache in C++ on Thu, 06 Jan 2011 13:18:33 GMT]]></title><description><![CDATA[<p>Vielen Dank fuer die Antworten, ich werde mich mal durch die gelinkten Artikel durchwaelzen und das mit den boost state-machines probieren.</p>
<p>Famer schrieb:</p>
<blockquote>
<p>Was spricht gegen YACC?</p>
</blockquote>
<p>Eigentlich nichts, bis auf den Umstand, dass ich das ganze gern selbst machen wuerde (ist sowieso ein Spass-Projekt) <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/2003144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2003144</guid><dc:creator><![CDATA[Temporary]]></dc:creator><pubDate>Thu, 06 Jan 2011 13:18:33 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe beim Parsen von eigener Sprache in C++ on Thu, 06 Jan 2011 13:38:37 GMT]]></title><description><![CDATA[<p>Achso, nadann. Ich dachte, du brauchst den Parser für dein &quot;erstes größeres Projekt&quot;. Aber wenn der Parser ebenjenes ist, ist YACC zu benutzen natürlich witzlos ;).<br />
Also dann, auf ins Land der DEAs und formalen Grammatiken, würd ich meinen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2003160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2003160</guid><dc:creator><![CDATA[Famer]]></dc:creator><pubDate>Thu, 06 Jan 2011 13:38:37 GMT</pubDate></item></channel></rss>