<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="http://blogbin.net/styles/rss.css" type="text/css"?>
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
>
 <channel>
  <title>w72er</title>
  <link>http://blogbin.net/blog/574</link>
  <description></description>
  <pubDate>Tue, 07 Feb 2012 19:14:37 +0300</pubDate>
  <generator>http://www.lifetype.net</generator>
    <item>
   <title>Калькулятор</title>
   <description>
    &lt;p&gt;
Код калькулятора, приведенный в главе 6,&amp;nbsp;применяется повсеместно в книге Бьерна Страуструпа &amp;quot;Язык программирования c++&amp;quot;.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
/*&lt;br /&gt;
program:&lt;br /&gt;
&amp;nbsp; END&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //это конец ввода&lt;br /&gt;
&amp;nbsp; expr_list&lt;br /&gt;
expr_list:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //список выражений&lt;br /&gt;
&amp;nbsp; expression PRINT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //PRINT - это точка с запятой&lt;br /&gt;
&amp;nbsp; expression PRINT expr_list&lt;br /&gt;
expression:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //выражение&lt;br /&gt;
&amp;nbsp; expression + term&lt;br /&gt;
&amp;nbsp; expression - term&lt;br /&gt;
&amp;nbsp; term&lt;br /&gt;
term:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //терм&lt;br /&gt;
&amp;nbsp; term / primary&lt;br /&gt;
&amp;nbsp; term * primary&lt;br /&gt;
&amp;nbsp; primary&lt;br /&gt;
primary:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //первичное выражение&lt;br /&gt;
&amp;nbsp; NUMBER&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //число&lt;br /&gt;
&amp;nbsp; NAME&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //имя&lt;br /&gt;
&amp;nbsp; NAME = expression&lt;br /&gt;
&amp;nbsp; -primary&lt;br /&gt;
&amp;nbsp; (expression)
&lt;/p&gt;
&lt;p&gt;
Терминальные символы распознаются лексическим анализатором,&lt;br /&gt;
get_token(); Нетерминальные символы распознаются синтаксическим&lt;br /&gt;
анализатором, expr(), term(), prim(); Как только оба (под)выражения&lt;br /&gt;
определены вычисляется значение выражения.&lt;br /&gt;
*/
&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
#include &amp;lt;map&amp;gt;&lt;br /&gt;
#include &amp;lt;cctype&amp;gt;
&lt;/p&gt;
&lt;p&gt;
using namespace std;
&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;
enum Token_value {&lt;br /&gt;
&amp;nbsp; NAME, NUMBER, END,&lt;br /&gt;
&amp;nbsp; PLUS = &#039;+&#039;, MINUS = &#039;-&#039;, MUL = &#039;*&#039;, DIV = &#039;/&#039;,&lt;br /&gt;
&amp;nbsp; PRINT = &#039;;&#039;, ASSIGN = &#039;=&#039;, LP = &#039;(&#039;, RP = &#039;)&#039;&lt;br /&gt;
};
&lt;/p&gt;
&lt;p&gt;
Token_value curr_tok = PRINT;&lt;br /&gt;
double number_value;&amp;nbsp; //численное значение&lt;br /&gt;
string string_value;&amp;nbsp; //строковое значение&lt;br /&gt;
map&amp;lt;string, double&amp;gt; table;&lt;br /&gt;
int no_of_errors;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
int error(const string&amp;amp; s)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; no_of_errors++;&lt;br /&gt;
&amp;nbsp; cerr &amp;lt;&amp;lt; &amp;quot;ошибка: &amp;quot; &amp;lt;&amp;lt; s &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
&amp;nbsp; return 1;&lt;br /&gt;
}
&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;
Token_value get_token()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; char ch = 0;&lt;br /&gt;
&amp;nbsp; cin &amp;gt;&amp;gt; ch;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp; switch (ch) {&lt;br /&gt;
&amp;nbsp; case 0:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return curr_tok = END;&lt;br /&gt;
&amp;nbsp; case &#039;;&#039;:&lt;br /&gt;
&amp;nbsp; case &#039;*&#039;:&lt;br /&gt;
&amp;nbsp; case &#039;/&#039;:&lt;br /&gt;
&amp;nbsp; case &#039;+&#039;:&lt;br /&gt;
&amp;nbsp; case &#039;-&#039;:&lt;br /&gt;
&amp;nbsp; case &#039;(&#039;:&lt;br /&gt;
&amp;nbsp; case &#039;)&#039;:&lt;br /&gt;
&amp;nbsp; case &#039;=&#039;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return curr_tok = Token_value(ch);&lt;br /&gt;
&amp;nbsp; case &#039;0&#039;: case &#039;1&#039;: case &#039;2&#039;: case &#039;3&#039;: case &#039;4&#039;:&lt;br /&gt;
&amp;nbsp; case &#039;5&#039;: case &#039;6&#039;: case &#039;7&#039;: case &#039;8&#039;: case &#039;9&#039;:&lt;br /&gt;
&amp;nbsp; case &#039;.&#039;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cin.putback(ch);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cin &amp;gt;&amp;gt; number_value;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return curr_tok = NUMBER;&lt;br /&gt;
&amp;nbsp; default:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (isalpha(ch)) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cin.putback(ch);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cin &amp;gt;&amp;gt; string_value;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return curr_tok = NAME;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; error(&amp;quot;неправильная лексема&amp;quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return curr_tok = PRINT;&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
}
&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;
double expr(bool);
&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;
double prim(bool get)&amp;nbsp; //первичные выражения&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; if (get) get_token();
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp; switch (curr_tok) {&lt;br /&gt;
&amp;nbsp; case NUMBER:&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; double v = number_value;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; get_token();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return v;&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
&amp;nbsp; case NAME:&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; double&amp;amp; v = table[string_value];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (get_token() == ASSIGN) v = expr(true);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return v;&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
&amp;nbsp; case MINUS:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return -prim(true);&lt;br /&gt;
&amp;nbsp; case LP:&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; double e = expr(true);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (curr_tok != RP) return error(&amp;quot;ожидалась )&amp;quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; get_token(); //пропустить &amp;quot;)&amp;quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return e;&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
&amp;nbsp; default:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return error(&amp;quot;ожидалось первичное выражение&amp;quot;);&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
}
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
double term(bool get) //умножение и деление&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; double left = prim(get);
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp; for (;;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; switch (curr_tok) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case MUL:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; left *= prim(true);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case DIV:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (double d = prim(true)) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; left /= prim(true);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return error(&amp;quot;деление на 0&amp;quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return left;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}
&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;
double expr(bool get)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; double left = term(get);&lt;br /&gt;
&amp;nbsp; for (;;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; switch (curr_tok) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case PLUS:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; left += term(true);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case MINUS:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; left -= term(true);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return left;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; table[&amp;quot;pi&amp;quot;] = 3.14;&lt;br /&gt;
&amp;nbsp; table[&amp;quot;e&amp;quot;] = 2.72;&lt;br /&gt;
&amp;nbsp; while (cin) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; get_token();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (curr_tok == END) break;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (curr_tok == PRINT) continue;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; expr(false) &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
&amp;nbsp; }
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp; return no_of_errors;&lt;br /&gt;
}
&lt;/p&gt;
   </description>
   <link>http://blogbin.net/post/574/1917</link>
   <comments>http://blogbin.net/post/574/1917</comments>
   <guid>http://blogbin.net/post/574/1917</guid>
      <dc:creator>w72er</dc:creator>
      
    <category>Изучение c++</category>
         <pubDate>Mon, 18 Jan 2010 08:56:55 +0300</pubDate>
   <source url="http://blogbin.net/rss/rss20/574">w72er</source>
     </item>
   </channel>
</rss>
