Advertisement
Guest User

Untitled

a guest
Apr 18th, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.34 KB | None | 0 0
  1. #include "EvaluateExpression.h"
  2.  
  3. EvaluateExpression::EvaluateExpression(Variables* variables, Arrays* arrays) : _variables(variables), _arrays(arrays) {}
  4. EvaluateExpression::~EvaluateExpression() {}
  5.  
  6.  
  7. mbData::mbByte EvaluateExpression::ToByte(const mbData::Tokens& tokens, unsigned& i)
  8. {
  9.  
  10.     for (; ; ++i) {
  11.  
  12.         if (tokens[i].ID == mbData::ID_EndExpr) {           // End expression
  13.             ++i; break;
  14.         }
  15.  
  16.         if (tokens[i].ID == mbData::ID_opOpenParenthesis) {
  17.             ops.push(tokens[i].ID); continue;
  18.         }
  19.  
  20.         // Constants
  21.         else if (tokens[i].ID == mbData::ID_Byte) {         // byte -> byte
  22.             valuesByte.push((mbData::mbByte) std::get<mbData::mbByte>(tokens[i].data)); continue;
  23.         }
  24.         else if (tokens[i].ID == mbData::ID_Short) {        // short -> byte
  25.             valuesByte.push((mbData::mbByte) std::get<mbData::mbShort>(tokens[i].data)); continue;
  26.         }
  27.         else if (tokens[i].ID == mbData::ID_Integer) {      // integer -> byte
  28.             valuesByte.push((mbData::mbByte) std::get<mbData::mbInteger>(tokens[i].data)); continue;
  29.         }
  30.         else if (tokens[i].ID == mbData::ID_Float) {        // float -> byte
  31.             valuesByte.push((mbData::mbByte) std::get<mbData::mbFloat>(tokens[i].data)); continue;
  32.         }
  33.         else if (tokens[i].ID == mbData::ID_String) {       // string -> byte
  34.             valuesByte.push((mbData::mbByte) std::stoi(std::get<mbData::mbString>(tokens[i].data))); continue;
  35.         }
  36.  
  37.         // Variables
  38.         else if (tokens[i].ID == mbData::ID_VarByte) {      // varbyte -> byte
  39.             valuesByte.push((mbData::mbByte) _variables->GetByte(std::get<mbData::SPECIFIER>(tokens[i].data))); continue;
  40.         }
  41.         else if (tokens[i].ID == mbData::ID_VarShort)   {   // varshort -> byte
  42.             valuesByte.push((mbData::mbByte) _variables->GetShort(std::get<mbData::SPECIFIER>(tokens[i].data))); continue;
  43.         }
  44.         else if (tokens[i].ID == mbData::ID_VarInteger) {   // varinteger -> byte
  45.             valuesByte.push((mbData::mbByte) _variables->GetInteger(std::get<mbData::SPECIFIER>(tokens[i].data))); continue;
  46.         }
  47.         else if (tokens[i].ID == mbData::ID_VarFloat) {     // varfloat -> byte
  48.             valuesByte.push((mbData::mbByte) _variables->GetFloat(std::get<mbData::SPECIFIER>(tokens[i].data))); continue;
  49.         }
  50.         else if (tokens[i].ID == mbData::ID_VarString) {    // varstring -> byte
  51.             valuesByte.push((mbData::mbByte) std::stoi(_variables->GetString(std::get<mbData::SPECIFIER>(tokens[i].data)))); continue;
  52.         }
  53.  
  54.         else if (tokens[i].ID == mbData::ID_opCloseParenthesis) {
  55.             while (!ops.empty() && ops.top() != mbData::ID_opOpenParenthesis) {
  56.                 mbData::mbByte val2 = valuesByte.top(); valuesByte.pop();
  57.                 mbData::mbByte val1 = valuesByte.top(); valuesByte.pop();
  58.                 unsigned op = ops.top(); ops.pop();
  59.                 valuesByte.push(ApplyOp(val1, val2, op));
  60.             }
  61.             ops.pop(); continue;
  62.         }
  63.  
  64.         else { // Current token is an operator
  65.             while (!ops.empty() && Precedence(ops.top()) >= Precedence(tokens[i].ID)) {
  66.                 mbData::mbByte val2 = valuesByte.top(); valuesByte.pop();
  67.                 mbData::mbByte val1 = valuesByte.top(); valuesByte.pop();
  68.                 unsigned op = ops.top(); ops.pop();
  69.                 valuesByte.push(ApplyOp(val1, val2, op));
  70.             }
  71.             ops.push(tokens[i].ID);
  72.         }
  73.     }
  74.  
  75.     // Now entire expression has been parsed
  76.     while (!ops.empty()) {
  77.         mbData::mbByte val2 = valuesByte.top(); valuesByte.pop();
  78.         mbData::mbByte val1 = valuesByte.top(); valuesByte.pop();
  79.         unsigned op = ops.top(); ops.pop();
  80.         valuesByte.push(ApplyOp(val1, val2, op));
  81.     }
  82.  
  83.     return valuesByte.top();
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement