Advertisement
Guest User

Untitled

a guest
Jul 31st, 2015
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.89 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include "std_lib_facilities.h"
  5.  
  6. void throwError(std::string message){
  7.  
  8.  
  9. std::cout << "-----------------------------------" << std::endl << message << std::endl
  10. << "-----------------------------------" << std::endl;
  11.  
  12. system("PAUSE");
  13.  
  14. }
  15.  
  16. class Token {
  17.  
  18. public:
  19.  
  20. char kind;
  21. double value;
  22.  
  23. Token(char ch)
  24. :kind(ch), value(0){}
  25.  
  26. Token(char ch, double val)
  27. :kind(ch), value(val){}
  28.  
  29. };
  30.  
  31. class Token_stream{
  32.  
  33. public:
  34.  
  35. Token_stream();
  36. Token get();
  37. void putBack(Token t);
  38.  
  39. private:
  40.  
  41. bool full;
  42. Token buffer;
  43.  
  44. };
  45.  
  46. Token_stream::Token_stream()
  47. :full(false), buffer(0){}
  48.  
  49. void Token_stream::putBack(Token t){
  50.  
  51. if (full) throwError("putBack() into a full buffer");
  52.  
  53. buffer = t;
  54. full = true;
  55.  
  56. }
  57.  
  58. Token Token_stream::get(){
  59.  
  60. if (full){
  61.  
  62. full = false;
  63. return buffer;
  64.  
  65. }
  66.  
  67. char ch;
  68.  
  69. std::cin >> ch;
  70.  
  71. switch (ch){
  72.  
  73. case ';': case 'q':
  74. case '(': case ')': case '+':
  75. case '-': case '*': case '/':
  76.  
  77. return Token(ch);
  78.  
  79. case '.':
  80.  
  81. case '0': case '1': case '2': case '3': case '4':
  82. case '5': case '6': case '7': case '8': case '9':{
  83.  
  84. std::cin.putback(ch);
  85. double val;
  86. std::cin >> val;
  87.  
  88. return Token('8', val);
  89.  
  90. }
  91.  
  92. default:
  93.  
  94. throwError("Bad token");
  95.  
  96. }
  97. }
  98.  
  99. Token_stream ts;
  100. double expression();
  101.  
  102. double primary(){
  103.  
  104. Token t = ts.get();
  105. switch (t.kind){
  106.  
  107. case '(': {
  108.  
  109. double d = expression();
  110.  
  111. t = ts.get();
  112.  
  113. if (t.kind != ')'){
  114.  
  115. throwError("')' expected");
  116.  
  117. }
  118.  
  119. return d;
  120.  
  121. }
  122.  
  123. case '8':
  124.  
  125. return t.value;
  126.  
  127. default:
  128.  
  129. throwError("Primary expected");
  130.  
  131. }
  132. }
  133.  
  134. double term(){
  135.  
  136. double left = primary();
  137. Token t = ts.get();
  138.  
  139. while (true){
  140.  
  141. switch (t.kind){
  142.  
  143. case '*':
  144.  
  145. left *= primary();
  146. t = ts.get();
  147.  
  148. break;
  149.  
  150. case '/': {
  151.  
  152. double d = primary();
  153.  
  154. if (d == 0){
  155.  
  156. throwError("You cannot divide by 0.");
  157. break;
  158.  
  159. }
  160.  
  161. left /= d;
  162. t = ts.get();
  163.  
  164. break;
  165.  
  166. }
  167.  
  168. default:
  169.  
  170. ts.putBack(t);
  171.  
  172. return left;
  173.  
  174. }
  175. }
  176. }
  177.  
  178. double expression(){
  179.  
  180. double left = term();
  181. Token t = ts.get();
  182.  
  183. while (true){
  184.  
  185. switch (t.kind){
  186.  
  187. case '+':
  188.  
  189. left += term();
  190. t = ts.get();
  191.  
  192. break;
  193.  
  194. case '-':
  195.  
  196. left -= term();
  197. t = ts.get();
  198.  
  199. break;
  200.  
  201. default:
  202.  
  203. ts.putBack(t);
  204.  
  205. return left;
  206.  
  207. }
  208. }
  209. }
  210.  
  211. int main(){
  212.  
  213. try{
  214.  
  215. double val = 0;
  216.  
  217. while (std::cin){
  218.  
  219. Token t = ts.get();
  220.  
  221. if (t.kind == 'q') break;
  222. if (t.kind == ';'){
  223.  
  224. std::cout << "=" << val << std::endl;
  225.  
  226. }else{
  227.  
  228. ts.putBack(t);
  229. val = expression();
  230.  
  231. }
  232.  
  233. system("PAUSE");
  234. return 0;
  235.  
  236. }
  237. }
  238. catch (std::exception& e){
  239.  
  240. std::cerr << e.what() << std::endl;
  241.  
  242. system("PAUSE");
  243. return 1;
  244.  
  245. }
  246. catch (...){
  247.  
  248. std::cerr << "Exception" << std::endl;
  249.  
  250. system("PAUSE");
  251. return 2;
  252.  
  253. }
  254. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement