+++ /dev/null
-#include <msp/strings/lexicalcast.h>
-#include "evaluate.h"
-
-namespace Msp {
-namespace GL {
-namespace SL {
-
-ExpressionEvaluator::ExpressionEvaluator():
- variable_values(0),
- r_result(0.0f),
- r_result_valid(false)
-{ }
-
-ExpressionEvaluator::ExpressionEvaluator(const ValueMap &v):
- variable_values(&v),
- r_result(0.0f),
- r_result_valid(false)
-{ }
-
-void ExpressionEvaluator::visit(Literal &literal)
-{
- if(literal.token=="true")
- r_result = 1.0f;
- else if(literal.token=="false")
- r_result = 0.0f;
- else
- r_result = lexical_cast<float>(literal.token);
- r_result_valid = true;
-}
-
-void ExpressionEvaluator::visit(VariableReference &var)
-{
- if(!var.declaration)
- return;
-
- if(variable_values)
- {
- ValueMap::const_iterator i = variable_values->find(var.declaration);
- if(i!=variable_values->end())
- i->second->visit(*this);
- }
- else if(var.declaration->init_expression)
- var.declaration->init_expression->visit(*this);
-}
-
-void ExpressionEvaluator::visit(UnaryExpression &unary)
-{
- r_result_valid = false;
- unary.expression->visit(*this);
- if(!r_result_valid)
- return;
-
- if(unary.oper->token[0]=='!')
- r_result = !r_result;
- else
- r_result_valid = false;
-}
-
-void ExpressionEvaluator::visit(BinaryExpression &binary)
-{
- r_result_valid = false;
- binary.left->visit(*this);
- if(!r_result_valid)
- return;
-
- float left_result = r_result;
- r_result_valid = false;
- binary.right->visit(*this);
- if(!r_result_valid)
- return;
-
- std::string oper = binary.oper->token;
- if(oper=="<")
- r_result = (left_result<r_result);
- else if(oper=="<=")
- r_result = (left_result<=r_result);
- else if(oper==">")
- r_result = (left_result>r_result);
- else if(oper==">=")
- r_result = (left_result>=r_result);
- else if(oper=="==")
- r_result = (left_result==r_result);
- else if(oper=="!=")
- r_result = (left_result!=r_result);
- else if(oper=="&&")
- r_result = (left_result && r_result);
- else if(oper=="||")
- r_result = (left_result || r_result);
- else
- r_result_valid = false;
-}
-
-} // namespace SL
-} // namespace GL
-} // namespace Msp