Advertisement
Guest User

Untitled

a guest
May 25th, 2015
236
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.16 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <string>
  4. #include <list>
  5. #include <vector>
  6. #include <algorithm>
  7. #include <stdexcept>
  8. #include <conio.h>
  9. #include <cstdlib>
  10.  
  11. using namespace std;
  12.  
  13. class Token {
  14. public:
  15.     char kind;
  16.     double value;
  17.     Token(char ch)
  18.         :kind(ch), value(0) { }    
  19.     Token(char ch, double val)
  20.         :kind(ch), value(val) { }
  21. };
  22.  
  23. string ERROR(string str)
  24. {
  25.     cout << str;
  26.     exit(0);
  27. }
  28.  
  29. Token get_token()
  30. {
  31.     char ch;
  32.     cin >> ch;
  33.     switch (ch)
  34.     {
  35.         case '(': case ')': case '+': case '-': case '*': case '/':
  36.             return Token(ch);
  37.         case '.':
  38.         case '0': case '1': case '2': case '3': case '4':
  39.         case '5': case '6': case '7': case '8': case '9':
  40.             {    
  41.                 cin.putback(ch);
  42.                 double val;
  43.                 cin >> val;
  44.                 return Token('8',val);
  45.             }
  46.         default:
  47.             ERROR("Bad token");
  48.     }
  49. }
  50.  
  51. double expression();
  52. double term();
  53.  
  54. double primary()    
  55. {
  56.     Token t = get_token();
  57.     switch (t.kind)
  58.     {
  59.         case '(':  
  60.             {    
  61.                 double d = expression();
  62.                 t = get_token();
  63.                 if (t.kind != ')')ERROR("')' expected");
  64.                 return d;
  65.             }
  66.         case '8':            
  67.             return t.value;  
  68.         default:
  69.             ERROR("primary expected");
  70.     }
  71. }
  72.  
  73. double term()
  74. {
  75.     double left = primary();
  76.     Token t = get_token();  
  77.     while(true)
  78.     {
  79.         switch (t.kind)
  80.         {
  81.             case '*':
  82.                 left *= primary();
  83.                 t = get_token();
  84.                 break;
  85.             case '/':
  86.                 {    
  87.                     double d = primary();
  88.                     if (d == 0) ERROR("divide by zero");
  89.                     left /= d;
  90.                     t = get_token();
  91.                     break;
  92.                 }
  93.             default:
  94.                 return left;
  95.         }
  96.     }
  97. }
  98.  
  99. double expression()
  100. {
  101.     double left = term();
  102.     Token t = get_token();  
  103.     while(true)
  104.     {    
  105.         switch(t.kind)
  106.         {
  107.             case '+':
  108.                 left += term();  
  109.                 t = get_token();
  110.                 break;
  111.             case '-':
  112.                 left -= term();  
  113.                 t = get_token();
  114.                 break;
  115.             default:
  116.                 return left;      
  117.         }
  118.     }
  119. };
  120.  
  121. int main()
  122. {
  123.     try
  124.     {
  125.         while (cin)
  126.             cout << expression() << '\n';
  127.         //keep_window_open("~0");
  128.     }
  129.     catch (exception& e)
  130.     {
  131.         cerr << e.what() << endl;
  132.         //keep_window_open ("~1");
  133.         return 1;
  134.     }
  135.     catch (...)
  136.     {
  137.         cerr << "exception \n";
  138.         //keep_window_open ("~2");
  139.         return 2;
  140.     }
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement