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(ParenthesizedExpression &parexp)
33 parexp.expression->visit(*this);
36 void ExpressionEvaluator::visit(VariableReference &var)
43 ValueMap::const_iterator i = variable_values->find(var.declaration);
44 if(i!=variable_values->end())
45 i->second->visit(*this);
47 else if(var.declaration->init_expression)
48 var.declaration->init_expression->visit(*this);
51 void ExpressionEvaluator::visit(UnaryExpression &unary)
53 r_result_valid = false;
54 unary.expression->visit(*this);
58 if(unary.oper->token[0]=='!')
61 r_result_valid = false;
64 void ExpressionEvaluator::visit(BinaryExpression &binary)
66 r_result_valid = false;
67 binary.left->visit(*this);
71 float left_result = r_result;
72 r_result_valid = false;
73 binary.right->visit(*this);
77 std::string oper = binary.oper->token;
79 r_result = (left_result<r_result);
81 r_result = (left_result<=r_result);
83 r_result = (left_result>r_result);
85 r_result = (left_result>=r_result);
87 r_result = (left_result==r_result);
89 r_result = (left_result!=r_result);
91 r_result = (left_result && r_result);
93 r_result = (left_result || r_result);
95 r_result_valid = false;