Advertisement
Guest User

Untitled

a guest
Mar 31st, 2020
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.40 KB | None | 0 0
  1. #include "evaluate_prefix.h"
  2. #include <bits/stdc++.h>
  3.  
  4. Expression::Expression(std::string text) {
  5. mText = text;
  6. dubina = 0;
  7. mNextToken = 0;
  8. }
  9.  
  10. Expression::Token Expression::getToken() {
  11. Expression::Token t;
  12. t.value = 0;
  13.  
  14. while (mNextToken < mText.size() && mText[mNextToken] == ' ') mNextToken++;
  15.  
  16. if (mNextToken == mText.size()) {
  17. throw std::runtime_error("nema vise tokena");
  18. }
  19.  
  20. if (mText[mNextToken] == '+' || mText[mNextToken] == '-' || mText[mNextToken] == '^' || mText[mNextToken] == '*' || mText[mNextToken] == '/') {
  21. t.type = binaryOp;
  22. t.symbol = mText[mNextToken];
  23. mNextToken++;
  24. }
  25. else if (mText[mNextToken] == '~') {
  26. t.type = unaryOp;
  27. t.symbol = mText[mNextToken];
  28. mNextToken++;
  29. }
  30. else if (mText[mNextToken] >= '0' && mText[mNextToken] <= '9') {
  31. t.type = operand;
  32.  
  33. while (mNextToken < mText.size() && mText[mNextToken] >= '0' && mText[mNextToken] <= '9') {
  34. t.value *= 10;
  35. t.value += mText[mNextToken] - '0';
  36. mNextToken++;
  37. }
  38. }
  39. else {
  40. throw std::runtime_error("nepoznati znak");
  41. }
  42.  
  43. while (mNextToken < mText.size() && mText[mNextToken] == ' ') mNextToken++;
  44.  
  45. return t;
  46. }
  47.  
  48. Expression::Value Expression::evaluate() {
  49. dubina++;
  50. int ret;
  51. Expression::Token t = this->getToken();
  52.  
  53. std::cout << dubina << " " << t.type << " " << t.symbol << ' ' << t.value << '\n';
  54.  
  55. if (t.type == unaryOp) {
  56. ret = -(this->evaluate());
  57. }
  58. if (t.type == binaryOp) {
  59. if (t.symbol == '+') {
  60. ret = (this->evaluate()) + (this->evaluate());
  61. }
  62. else if (t.symbol == '-') {
  63. ret = (this->evaluate()) - (this->evaluate());
  64. }
  65. else if (t.symbol == '^') {
  66. int a = (this->evaluate());
  67. int b = (this->evaluate());
  68. int ret = 1;
  69. std::cout << "pote " << a << " " << b << '\n';
  70.  
  71. while (b--) ret *= a;
  72. std::cout << "ret = " << ret << '\n';
  73. }
  74. else if (t.symbol == '*') {
  75. ret = (this->evaluate()) * (this->evaluate());
  76. }
  77. else if (t.symbol == '/') {
  78. ret = (this->evaluate()) / (this->evaluate());
  79. }
  80. std::cout << "ret = " << ret << '\n';
  81. }
  82. if (t.type == operand) {
  83. ret = t.value;
  84. }
  85. dubina--;
  86.  
  87. std::cout << "dubina i ret " << dubina << " " << ret << '\n';
  88.  
  89. if (!dubina && mNextToken != mText.size())
  90. throw std::runtime_error("previse znakova");
  91.  
  92. return ret;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement