1 #include <msp/strings/lexicalcast.h>
8 ExpressionEvaluator::ExpressionEvaluator():
14 ExpressionEvaluator::ExpressionEvaluator(const ValueMap &v):
20 void ExpressionEvaluator::visit(Literal &literal)
22 if(literal.token=="true")
24 else if(literal.token=="false")
27 r_result = lexical_cast<float>(literal.token);
28 r_result_valid = true;
31 void ExpressionEvaluator::visit(VariableReference &var)
38 ValueMap::const_iterator i = variable_values->find(var.declaration);
39 if(i!=variable_values->end())
40 i->second->visit(*this);
42 else if(var.declaration->init_expression)
43 var.declaration->init_expression->visit(*this);
46 void ExpressionEvaluator::visit(UnaryExpression &unary)
48 r_result_valid = false;
49 unary.expression->visit(*this);
53 if(unary.oper->token[0]=='!')
56 r_result_valid = false;
59 void ExpressionEvaluator::visit(BinaryExpression &binary)
61 r_result_valid = false;
62 binary.left->visit(*this);
66 float left_result = r_result;
67 r_result_valid = false;
68 binary.right->visit(*this);
72 std::string oper = binary.oper->token;
74 r_result = (left_result<r_result);
76 r_result = (left_result<=r_result);
78 r_result = (left_result>r_result);
80 r_result = (left_result>=r_result);
82 r_result = (left_result==r_result);
84 r_result = (left_result!=r_result);
86 r_result = (left_result && r_result);
88 r_result = (left_result || r_result);
90 r_result_valid = false;