<?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[Frage zu Parser (Buch von Stroustrup)]]></title><description><![CDATA[<p>Hallo,</p>
<p>hab eine Frage, ergeben hat sie sich in Kapitel &quot;6.1.1 Der Parser&quot; vom Buch &quot;Die C++ Programmiersprache&quot;.</p>
<p>Es geht darum, einen Taschenrechner zu programmieren, der mittels Parser erstmal den eingegebenen Text analysiert. Also sowas in der Art wie<br />
<strong>r = 2.5<br />
w = 3 + 5 * r</strong></p>
<p>Nun wird die Grammatik definiert:</p>
<pre><code>program:
 END //END ist Eingabeende
 expr_list END

expr_list:
 expression PRINT //PRINT ist Semikolon
 expression PRINT expr_list

expression:
 expression+term
 expression-term

term:
 term/primary
 term*primary
 primary

primary:
 NUMBER
 NAME
 NAME=expression
 -primary
 ( expression )
</code></pre>
<p>Damit kann ich leider nicht viel anfangen, weil ich nicht kapiere, wie diese Grammatik zu interpretieren ist.<br />
Kann mir das mal jemand kurz erläutern, bzw. mir entsprechende Links bzw. Stichworte liefern, dass ich mich zu dem Thema zumindest soweit vertraut machen kann, dass ich die angegebene Grammatik kapiere.</p>
<p>Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/306226/frage-zu-parser-buch-von-stroustrup</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 07:36:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/306226.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 21 Jul 2012 19:02:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Parser (Buch von Stroustrup) on Sat, 21 Jul 2012 19:02:26 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>hab eine Frage, ergeben hat sie sich in Kapitel &quot;6.1.1 Der Parser&quot; vom Buch &quot;Die C++ Programmiersprache&quot;.</p>
<p>Es geht darum, einen Taschenrechner zu programmieren, der mittels Parser erstmal den eingegebenen Text analysiert. Also sowas in der Art wie<br />
<strong>r = 2.5<br />
w = 3 + 5 * r</strong></p>
<p>Nun wird die Grammatik definiert:</p>
<pre><code>program:
 END //END ist Eingabeende
 expr_list END

expr_list:
 expression PRINT //PRINT ist Semikolon
 expression PRINT expr_list

expression:
 expression+term
 expression-term

term:
 term/primary
 term*primary
 primary

primary:
 NUMBER
 NAME
 NAME=expression
 -primary
 ( expression )
</code></pre>
<p>Damit kann ich leider nicht viel anfangen, weil ich nicht kapiere, wie diese Grammatik zu interpretieren ist.<br />
Kann mir das mal jemand kurz erläutern, bzw. mir entsprechende Links bzw. Stichworte liefern, dass ich mich zu dem Thema zumindest soweit vertraut machen kann, dass ich die angegebene Grammatik kapiere.</p>
<p>Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234624</guid><dc:creator><![CDATA[parser c++]]></dc:creator><pubDate>Sat, 21 Jul 2012 19:02:26 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Parser (Buch von Stroustrup) on Sat, 21 Jul 2012 19:05:12 GMT]]></title><description><![CDATA[<p>Das ist rekursiv zu interpretieren. Schaue mal das hier an:<br />
<a href="http://de.wikipedia.org/wiki/Backus-Naur-Form" rel="nofollow">http://de.wikipedia.org/wiki/Backus-Naur-Form</a></p>
<p>Dann solltest du die Grammatik verstehen können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234626</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 21 Jul 2012 19:05:12 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Parser (Buch von Stroustrup) on Sat, 21 Jul 2012 19:11:07 GMT]]></title><description><![CDATA[<p>danke dir! werd mir das morgen mal anschauen, wenns dann noch fragen gibt meld ich mich nochmal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234627</guid><dc:creator><![CDATA[parser c++]]></dc:creator><pubDate>Sat, 21 Jul 2012 19:11:07 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Parser (Buch von Stroustrup) on Mon, 23 Jul 2012 18:25:49 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">program:
 END /**&lt;-- dies bedeutet also dass nur END (wie auch immer END jetzt definiert ist)
      ** auch eine gültige Eingabe wäre???
      **/

 expr_list END // und hier eben z.B. 3+5*7 END
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2234997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234997</guid><dc:creator><![CDATA[parser c++]]></dc:creator><pubDate>Mon, 23 Jul 2012 18:25:49 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Parser (Buch von Stroustrup) on Mon, 23 Jul 2012 18:34:20 GMT]]></title><description><![CDATA[<p>Beidesmal ja. Und END liefert der Scanner am Ende der Eingabe (EOF).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234999</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Mon, 23 Jul 2012 18:34:20 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Parser (Buch von Stroustrup) on Mon, 23 Jul 2012 20:10:21 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>Beidesmal ja. Und END liefert der Scanner am Ende der Eingabe (EOF).</p>
</blockquote>
<p>dann ist jetzt alles klar.<br />
Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235016</guid><dc:creator><![CDATA[parser c++]]></dc:creator><pubDate>Mon, 23 Jul 2012 20:10:21 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Parser (Buch von Stroustrup) on Mon, 23 Jul 2012 23:34:47 GMT]]></title><description><![CDATA[<p>In der Definition von &quot;expression&quot; fehlt aber wohl ein &quot;term&quot; als letzte Alternative.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235091</guid><dc:creator><![CDATA[unexpected token near exp]]></dc:creator><pubDate>Mon, 23 Jul 2012 23:34:47 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Parser (Buch von Stroustrup) on Tue, 24 Jul 2012 18:39:24 GMT]]></title><description><![CDATA[<p>unexpected token near exp schrieb:</p>
<blockquote>
<p>In der Definition von &quot;expression&quot; fehlt aber wohl ein &quot;term&quot; als letzte Alternative.</p>
</blockquote>
<p>gut beobachtet, hab ich doch glatt vergessen beim abtippen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235350</guid><dc:creator><![CDATA[parser c++]]></dc:creator><pubDate>Tue, 24 Jul 2012 18:39:24 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Parser (Buch von Stroustrup) on Tue, 24 Jul 2012 18:40:59 GMT]]></title><description><![CDATA[<p>tja, copy und paste wäre wohl auch gegangen.<br />
das programm gibts auf bjarnes homepage.</p>
<pre><code class="language-cpp">// The desk calculator

// includes character-level input (sec6.1.3), but
// no command line input (sec6.1.7),
// no namespaces, and
// no exceptions

// pp 107-117, sec 6.1, A Desk calculator

// uses += rather than push_back() for string
// to work around standard library bug

// No guarantees offered. Constructive comments to bs@research.att.com

/*
    program:
	END			   // END is end-of-input
	expr_list END

    expr_list:
	expression PRINT	   // PRINT is semicolon
	expression PRINT expr_list

    expression:
	expression + term
	expression - term
	term

    term:
	term / primary
	term * primary
	primary

    primary:
	NUMBER
	NAME
	NAME = expression
	- primary
	( expression )
*/

#include &lt;string&gt;
#include &lt;cctype&gt;
#include&lt;iostream&gt;
#include&lt;map&gt;

using namespace std;

int no_of_errors;	// note: default initialized to 0

double error(const char* s)
{
    no_of_errors++;
    cerr &lt;&lt; &quot;error: &quot; &lt;&lt; s &lt;&lt; '\n';
    return 1;
}

enum Token_value {
	NAME,		NUMBER,		END,
	PLUS='+',	MINUS='-',	MUL='*',	DIV='/',
	PRINT=';',	ASSIGN='=',	LP='(',		RP=')'
};

Token_value curr_tok = PRINT;
double number_value;
string string_value;

/* The simplest token reader

Token_value get_token()
{
	char ch = 0;
	cin&gt;&gt;ch;

	switch (ch) {
	case 0:
		return curr_tok=END;
	case ';':
	case '*':
	case '/':
	case '+':
	case '-':
	case '(':
	case ')':
	case '=':
		return curr_tok=Token_value(ch);
	case '0': case '1': case '2': case '3': case '4':
	case '5': case '6': case '7': case '8': case '9':
	case '.':
		cin.putback(ch);
		cin &gt;&gt; number_value;
		return curr_tok=NUMBER;
	default:					// NAME, NAME =, or error
		if (isalpha(ch)) {
			cin.putback(ch);
			cin&gt;&gt;string_value;
			return curr_tok=NAME;
		}
		error(&quot;bad token&quot;);
		return curr_tok=PRINT;
	}
}
*/

Token_value get_token()
{
	char ch;

	do {	// skip whitespace except '\en'
		if(!cin.get(ch)) return curr_tok = END;
	} while (ch!='\n' &amp;&amp; isspace(ch));

	switch (ch) {
	case ';':
	case '\n':
		return curr_tok=PRINT;
	case '*':
	case '/':
	case '+':
	case '-':
	case '(':
	case ')':
	case '=':
		return curr_tok=Token_value(ch);
	case '0': case '1': case '2': case '3': case '4':
	case '5': case '6': case '7': case '8': case '9':
	case '.':
		cin.putback(ch);
		cin &gt;&gt; number_value;
		return curr_tok=NUMBER;
	default:			// NAME, NAME=, or error
		if (isalpha(ch)) {
			string_value = ch;
			while (cin.get(ch) &amp;&amp; isalnum(ch))
				string_value += ch;	// string_value.push_back(ch);
							// to work around library bug
			cin.putback(ch);
			return curr_tok=NAME;
		}
		error(&quot;bad token&quot;);
		return curr_tok=PRINT;
	}
}

map&lt;string,double&gt; table;

double expr(bool);	// cannot do without

double prim(bool get)		// handle primaries
{
	if (get) get_token();

	switch (curr_tok) {
	case NUMBER:		// floating-point constant
	{	double v = number_value;
		get_token();
		return v;
	}
	case NAME:
	{	double&amp; v = table[string_value];
		if (get_token() == ASSIGN) v = expr(true);
		return v;
	}
	case MINUS:		// unary minus
		return -prim(true);
	case LP:
	{	double e = expr(true);
		if (curr_tok != RP) return error(&quot;) expected&quot;);
		get_token();		// eat ')'
		return e;
	}
	default:
		return error(&quot;primary expected&quot;);
	}
}

double term(bool get)		// multiply and divide
{
	double left = prim(get);

	for (;;)
		switch (curr_tok) {
		case MUL:
			left *= prim(true);
			break;
		case DIV:
			if (double d = prim(true)) {
				left /= d;
				break;
			}
			return error(&quot;divide by 0&quot;);
		default:
			return left;
		}
}

double expr(bool get)		// add and subtract
{
	double left = term(get);

	for (;;)				// ``forever''
		switch (curr_tok) {
		case PLUS:
			left += term(true);
			break;
		case MINUS:
			left -= term(true);
			break;
		default:
			return left;
		}
}

int main()
{

	table[&quot;pi&quot;] = 3.1415926535897932385;	// insert predefined names
	table[&quot;e&quot;] = 2.7182818284590452354;

	while (cin) {
		get_token();
		if (curr_tok == END) break;
		if (curr_tok == PRINT) continue;
		cout &lt;&lt; expr(false) &lt;&lt; '\n';
	}

	return no_of_errors;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2235352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235352</guid><dc:creator><![CDATA[parser c++]]></dc:creator><pubDate>Tue, 24 Jul 2012 18:40:59 GMT</pubDate></item></channel></rss>