Advertisement
bueddl

Untitled

Dec 10th, 2015
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.25 KB | None | 0 0
  1.  
  2. #include <iostream>
  3. #include <stack>
  4.  
  5. class parser {
  6.  
  7. public:
  8.     int parse(const char *expr)
  9.     {
  10.         m_buffer = expr;
  11.         m_pos = 0;
  12.  
  13.         int res;
  14.         parse_expression(res);
  15.         return res;
  16.     }
  17.  
  18. private:
  19.     std::stack<int> m_stack;
  20.     int m_pos;
  21.     const char *m_buffer;
  22.  
  23.     bool parse_expression(int &num)
  24.     {
  25.         save();
  26.  
  27.         if (parse_multiplication(num) || parse_addition(num))
  28.             return commit();
  29.  
  30.         if (parse_number(num))
  31.             return commit();
  32.  
  33.         return restore();
  34.     }
  35.  
  36.     bool parse_addition(int &num)
  37.     {
  38.         save();
  39.  
  40.         int a;
  41.         if (!(parse_subexpression(a) || parse_number(a)))
  42.             return restore();
  43.  
  44.         if (!parse_char('+'))
  45.             return restore();
  46.  
  47.         int b;
  48.         if (!(parse_subexpression(b) || parse_number(b)))
  49.             return restore();
  50.  
  51.         num = a + b;
  52.         return commit();
  53.     }
  54.  
  55.     bool parse_char(char ch)
  56.     {
  57.         save();
  58.  
  59.         if (m_buffer[m_pos] == ch) {
  60.             m_pos++;
  61.             return commit();           
  62.         }
  63.  
  64.         return restore();
  65.     }
  66.  
  67.     bool parse_multiplication(int &num)
  68.     {
  69.         save();
  70.  
  71.         int a;
  72.         if (!(parse_addition(a) || parse_number(a) || parse_subexpression(a)))
  73.             return restore();
  74.  
  75.         if (!parse_char('*'))
  76.             return restore();
  77.  
  78.         int b;
  79.         if (!(parse_addition(b) || parse_number(b) || parse_subexpression(b)))
  80.             return restore();
  81.  
  82.         num = a * b;
  83.         return commit();
  84.     }
  85.  
  86.     bool parse_subexpression(int &num)
  87.     {
  88.         save();
  89.  
  90.         if (parse_char('(')) {
  91.             if (!parse_expression(num))
  92.                 return restore();
  93.  
  94.             if (!parse_char(')'))
  95.                 return restore();
  96.             return commit();
  97.         }
  98.  
  99.         return restore();
  100.     }
  101.  
  102.     bool parse_number(int &num)
  103.     {
  104.         save();
  105.  
  106.         num = 0;
  107.         if (is_numeric()) {
  108.             do {
  109.                 num *= 10;
  110.                 num += current_seek() - '0';
  111.             } while (is_numeric());
  112.  
  113.             return commit();
  114.         }
  115.  
  116.         return restore();
  117.     }
  118.  
  119.     bool is_numeric()
  120.     {
  121.         return current() >= '0' && current() <= '9';
  122.     }
  123.  
  124.     char current()
  125.     {
  126.         return m_buffer[m_pos];
  127.     }
  128.  
  129.     char current_seek()
  130.     {
  131.         char ch = current();
  132.         m_pos++;
  133.         return ch;
  134.     }
  135.  
  136.     void save()
  137.     {
  138.         m_stack.push(m_pos);
  139.     }
  140.  
  141.     bool restore()
  142.     {
  143.         m_pos = m_stack.top();
  144.         m_stack.pop();
  145.         return false;
  146.     }
  147.  
  148.     bool commit()
  149.     {
  150.         m_stack.pop();
  151.         return true;
  152.     }
  153. };
  154.  
  155. int main()
  156. {
  157.     parser p;
  158.     int num = p.parse("2+5*3+4");
  159.  
  160.     std::cout << "res: " << num << std::endl;
  161.  
  162.     return 0;
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement