<?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 &#x2F; Recursive Descent Übersetzer]]></title><description><![CDATA[<p>N`Abend,</p>
<p>bin auf der Suche nach einem einfachen Parser/Recursive Descent Übersetzer, also als C++ Code.</p>
<p>Habe schon das Netz durchsucht und zwar auch 1-2 Beispiele gefunden, die waren aber sehr umfangreich, also bin ich bei Euch gelandet <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="🙂"
    /><br />
Suche also eher etwas einfaches als Anschauungsobjekt, damit ich da mal durchsteige <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>Nehme sonst auch gerne Pseudocode <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>
<p>Danke!!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/169290/parser-recursive-descent-übersetzer</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 00:05:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/169290.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 03 Jan 2007 23:18:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Parser &#x2F; Recursive Descent Übersetzer on Wed, 03 Jan 2007 23:18:48 GMT]]></title><description><![CDATA[<p>N`Abend,</p>
<p>bin auf der Suche nach einem einfachen Parser/Recursive Descent Übersetzer, also als C++ Code.</p>
<p>Habe schon das Netz durchsucht und zwar auch 1-2 Beispiele gefunden, die waren aber sehr umfangreich, also bin ich bei Euch gelandet <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="🙂"
    /><br />
Suche also eher etwas einfaches als Anschauungsobjekt, damit ich da mal durchsteige <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>Nehme sonst auch gerne Pseudocode <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>
<p>Danke!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1202326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1202326</guid><dc:creator><![CDATA[xMänneken]]></dc:creator><pubDate>Wed, 03 Jan 2007 23:18:48 GMT</pubDate></item><item><title><![CDATA[Reply to Parser &#x2F; Recursive Descent Übersetzer on Thu, 04 Jan 2007 00:14:42 GMT]]></title><description><![CDATA[<p>boost::spirit ist eine möglichkeit - <a href="http://boost.org/libs/spirit/index.html" rel="nofollow">http://boost.org/libs/spirit/index.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1202347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1202347</guid><dc:creator><![CDATA[ronny]]></dc:creator><pubDate>Thu, 04 Jan 2007 00:14:42 GMT</pubDate></item><item><title><![CDATA[Reply to Parser &#x2F; Recursive Descent Übersetzer on Thu, 04 Jan 2007 13:56:42 GMT]]></title><description><![CDATA[<p>r0nny schrieb:</p>
<blockquote>
<p>boost::spirit ist eine möglichkeit - <a href="http://boost.org/libs/spirit/index.html" rel="nofollow">http://boost.org/libs/spirit/index.html</a></p>
</blockquote>
<p>Der sieht auch ganz schön mächtig aus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Würde ja gern mal selbst einen kleinen erstellen, für einfache mathematische Aufgaben oder so. Deshalb wäre ein einfacher, fertiger sehr hilfreich <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="🙂"
    /> Könnte man die Funktionsweise genau erkennen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1202734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1202734</guid><dc:creator><![CDATA[xMänneken]]></dc:creator><pubDate>Thu, 04 Jan 2007 13:56:42 GMT</pubDate></item><item><title><![CDATA[Reply to Parser &#x2F; Recursive Descent Übersetzer on Thu, 04 Jan 2007 14:55:11 GMT]]></title><description><![CDATA[<p>Tip: Schau Dir mal ANTLR an, insbesondere die von ANTLR erstellten Codes, das sind wunderschöne Recursive Descent Parser. Schön ist auch die Einführung des Autors in die manuelle Konstruktion von Recursive Descent Parsern:</p>
<p><a href="http://www.antlr.org/book/byhand.pdf" rel="nofollow">http://www.antlr.org/book/byhand.pdf</a></p>
<p>(Ist zwar alles Java, ist aber recht einfach nach C++ übertragbar.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1202792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1202792</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Thu, 04 Jan 2007 14:55:11 GMT</pubDate></item><item><title><![CDATA[Reply to Parser &#x2F; Recursive Descent Übersetzer on Fri, 12 Jan 2007 14:21:23 GMT]]></title><description><![CDATA[<p>Moin,</p>
<p>so, habe mich nun mal rangemacht und probiert einen Parser zu schreiben, der einen Term - erlaubt sind Ziffern, + , -, *, ( und ) - in infix einliest und in postfix wieder ausgibt.</p>
<p>Soweit bin ich bisher gekommen...hoffe das ist soweit richtig, habe mich bemüht den Code zu erklären, hoffe jemand steigt durch <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="🙂"
    /><br />
Für Verbesserungen bin ich jederzeit offen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
<p>Problem ist nun die Funktion stack.<br />
Operanden werden ja sofort in den Postfix-String geschrieben. (Funktion push)<br />
Diese Regeln soll der stack anwenden:<br />
<a href="http://www.cz.j.th.schule.de/html_inc/schule/lehrer/privat/mirko_koenig/postfix/postfix.htm#in2post" rel="nofollow">http://www.cz.j.th.schule.de/html_inc/schule/lehrer/privat/mirko_koenig/postfix/postfix.htm#in2post</a></p>
<p>Jemand eine Idee ? Wäre dufte <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="🙂"
    /> Danke!</p>
<pre><code class="language-cpp">#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include&lt;iostream.h&gt;
#include&lt;string.h&gt;

char	lookahead;		// nächstes Zeichen in expression
int     pos = 0;		// aktuelle Positon des Zeichens
char    expression[20]; // der zu parsende Ausdruck
int		fehler = 0;		// Fehler-Index
int		klammer = 0;	// Klammer-Fehler wenn am Ende !=0
int		stellepost = 0;	// Stelle im Postfix-String
int		stellestack = 0;// Stelle im Operanden Stack

char aktuell;
char postfix[20];	// Postfix-String
char operanden[10];	// Operanden-Stack

void push(char reindamit); // Schreibe Zahlen in Postfixstring
void stack(char aufnstack);// Stack für Operanden und Klammern

// Grammatik-Anfang
void expr();		// epxr -&gt; term exprrest
void exprrest();	// exprrest -&gt; + term exprrest | - term exprrest | NIX
void term();		// term -&gt; factor termrest
void termrest();	// termrest -&gt; * factor termrest | NIX
void factor();		// factor -&gt; + factor | - factor | (expr) | number
void number();		// number -&gt; 0.....9
// Grammatik-Ende

void consume(char); // aktuelles Zeichen abarbeiten, pos++
void error(int);	// werfe Fehler aus

// Fehler-Anfang
void error(int fehler)
{
	switch(fehler)
	{
	case 1: cout &lt;&lt; &quot;Fehler bei number()\n &quot;; break;
	case 2: cout &lt;&lt; &quot;Fehler bei consume()\n&quot;; break;
	case 3: cout &lt;&lt; &quot;Klammerfehler\n &quot;; break;
	}

}
// Fehler-Ende

// Expr-Anfang
void expr()
{
	term();
	exprrest();
}
// Expr-Ende

// Epxrrest-Anfang
void exprrest()
{
	switch( lookahead ) 
	{
		case '+' : case '-':
		stack(lookahead);
		consume( lookahead );
		term();
		exprrest();
		break;
	}

	switch( lookahead ) 
	{
		case ')' : klammer--;
		stack(lookahead);
		consume( lookahead );
		break;
	}

}
// Epxrrest-Ende

// Term-Anfang
void term()
{
	factor();
	termrest();
}
// Term-Ende

// Termrest-Anfang
void termrest()
{
	switch( lookahead ) 
	{
		case '*' :
		stack(lookahead);
		consume( lookahead );
		factor();
		termrest();
		break;

		default:
        return;
	}
}
// Termrest-Ende

// Factor-Anfang
void factor()
{
	switch( lookahead ) 
	{
		case '+' : case '-':
		stack(lookahead);
		consume( lookahead );
		factor();
		break;
	}

	switch( lookahead ) 
	{
		case '(' : klammer++;
		stack(lookahead);
		consume(lookahead);
		expr();
		break;
	}

        number();	
}
// Factor-Ende

// Number-Anfang
void number()
{
	switch( lookahead ) 
		{
			case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
			push(lookahead);
			consume(lookahead);
			break;

			default:
			error(1);
			break;
			}
}
// Number-Ende

// consume-Anfang
void consume(char t) 
	{
		if(lookahead == t) 
			{
				//aktuell = lookahead;
				//stack(aktuell);
				pos++;
				lookahead = expression[pos];            
			}
		else
			error(2);
	}
// consume-Ende

// Push-Anfang
void push(char reindamit)
{

	postfix[stellepost]= reindamit;
	stellepost++;
}
// Push-Ende

//Stack-Anfang
void stack(char aufnstack)
{

}
//Stack-Ende

// Main-Anfang
void main()
{
	cout &lt;&lt; &quot;Bitte geben Sie einen Ausdruck in Infix-Notation ein:\n\n\t&quot;;
	gets( expression );

	lookahead = *expression;
	expr();

	// Klammer-Fehler
	if(klammer !=0)
		{
		error(3);
		}
	// Klammer-Fehler-Ende

	cout &lt;&lt; pos;
	int i = 0;
	cout &lt;&lt; &quot;Ausgabe:  &quot;;
	while(i &lt;= pos)
		{
	  cout &lt;&lt; postfix[i];
	  i++;
		}
}
// Main-Ende
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1208761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208761</guid><dc:creator><![CDATA[xMänneken]]></dc:creator><pubDate>Fri, 12 Jan 2007 14:21:23 GMT</pubDate></item><item><title><![CDATA[Reply to Parser &#x2F; Recursive Descent Übersetzer on Fri, 12 Jan 2007 15:20:16 GMT]]></title><description><![CDATA[<p>xMänneken schrieb:</p>
<blockquote>
<p>Jemand eine Idee ? Wäre dufte <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="🙂"
    /> Danke!</p>
</blockquote>
<p>Wo ist denn da Dein Problem? Die Regeln sind doch recht gut beschrieben. Das kann man mit nem Switch erschlagen.</p>
<pre><code class="language-cpp">void stack(char aufnstack)
{
    switch (aufnstack) {
       case '(': push('('); break;
       case ')':
           for (; ;) {
               char zeichen = pop();
               if (zeichen == '(') break;
               ausgabe(zeichen);
           }
           break;
       case '+', '-', '*', '/':
           // Als Übung Dir überlassen. ;-)
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1208801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208801</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Fri, 12 Jan 2007 15:20:16 GMT</pubDate></item></channel></rss>