Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "EvaluateExpression.h"
- EvaluateExpression::EvaluateExpression(Variables* variables, Arrays* arrays) : _variables(variables), _arrays(arrays) {}
- EvaluateExpression::~EvaluateExpression() {}
- mbData::mbByte EvaluateExpression::ToByte(const mbData::Tokens& tokens, unsigned& i)
- {
- for (; ; ++i) {
- if (tokens[i].ID == mbData::ID_EndExpr) { // End expression
- ++i; break;
- }
- if (tokens[i].ID == mbData::ID_opOpenParenthesis) {
- ops.push(tokens[i].ID); continue;
- }
- // Constants
- else if (tokens[i].ID == mbData::ID_Byte) { // byte -> byte
- valuesByte.push((mbData::mbByte) std::get<mbData::mbByte>(tokens[i].data)); continue;
- }
- else if (tokens[i].ID == mbData::ID_Short) { // short -> byte
- valuesByte.push((mbData::mbByte) std::get<mbData::mbShort>(tokens[i].data)); continue;
- }
- else if (tokens[i].ID == mbData::ID_Integer) { // integer -> byte
- valuesByte.push((mbData::mbByte) std::get<mbData::mbInteger>(tokens[i].data)); continue;
- }
- else if (tokens[i].ID == mbData::ID_Float) { // float -> byte
- valuesByte.push((mbData::mbByte) std::get<mbData::mbFloat>(tokens[i].data)); continue;
- }
- else if (tokens[i].ID == mbData::ID_String) { // string -> byte
- valuesByte.push((mbData::mbByte) std::stoi(std::get<mbData::mbString>(tokens[i].data))); continue;
- }
- // Variables
- else if (tokens[i].ID == mbData::ID_VarByte) { // varbyte -> byte
- valuesByte.push((mbData::mbByte) _variables->GetByte(std::get<mbData::SPECIFIER>(tokens[i].data))); continue;
- }
- else if (tokens[i].ID == mbData::ID_VarShort) { // varshort -> byte
- valuesByte.push((mbData::mbByte) _variables->GetShort(std::get<mbData::SPECIFIER>(tokens[i].data))); continue;
- }
- else if (tokens[i].ID == mbData::ID_VarInteger) { // varinteger -> byte
- valuesByte.push((mbData::mbByte) _variables->GetInteger(std::get<mbData::SPECIFIER>(tokens[i].data))); continue;
- }
- else if (tokens[i].ID == mbData::ID_VarFloat) { // varfloat -> byte
- valuesByte.push((mbData::mbByte) _variables->GetFloat(std::get<mbData::SPECIFIER>(tokens[i].data))); continue;
- }
- else if (tokens[i].ID == mbData::ID_VarString) { // varstring -> byte
- valuesByte.push((mbData::mbByte) std::stoi(_variables->GetString(std::get<mbData::SPECIFIER>(tokens[i].data)))); continue;
- }
- else if (tokens[i].ID == mbData::ID_opCloseParenthesis) {
- while (!ops.empty() && ops.top() != mbData::ID_opOpenParenthesis) {
- mbData::mbByte val2 = valuesByte.top(); valuesByte.pop();
- mbData::mbByte val1 = valuesByte.top(); valuesByte.pop();
- unsigned op = ops.top(); ops.pop();
- valuesByte.push(ApplyOp(val1, val2, op));
- }
- ops.pop(); continue;
- }
- else { // Current token is an operator
- while (!ops.empty() && Precedence(ops.top()) >= Precedence(tokens[i].ID)) {
- mbData::mbByte val2 = valuesByte.top(); valuesByte.pop();
- mbData::mbByte val1 = valuesByte.top(); valuesByte.pop();
- unsigned op = ops.top(); ops.pop();
- valuesByte.push(ApplyOp(val1, val2, op));
- }
- ops.push(tokens[i].ID);
- }
- }
- // Now entire expression has been parsed
- while (!ops.empty()) {
- mbData::mbByte val2 = valuesByte.top(); valuesByte.pop();
- mbData::mbByte val1 = valuesByte.top(); valuesByte.pop();
- unsigned op = ops.top(); ops.pop();
- valuesByte.push(ApplyOp(val1, val2, op));
- }
- return valuesByte.top();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement