--- /dev/null
+#include "evaluate.h"
+
+namespace Msp {
+namespace GL {
+namespace SL {
+
+ExpressionEvaluator::ExpressionEvaluator():
+ variable_values(0),
+ result(0.0f),
+ result_valid(false)
+{ }
+
+ExpressionEvaluator::ExpressionEvaluator(const ValueMap &v):
+ variable_values(&v),
+ result(0.0f),
+ result_valid(false)
+{ }
+
+void ExpressionEvaluator::visit(Literal &literal)
+{
+ if(literal.token=="true")
+ result = 1.0f;
+ else if(literal.token=="false")
+ result = 0.0f;
+ else
+ result = lexical_cast<float>(literal.token);
+ result_valid = true;
+}
+
+void ExpressionEvaluator::visit(ParenthesizedExpression &parexp)
+{
+ parexp.expression->visit(*this);
+}
+
+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)
+{
+ result_valid = false;
+ unary.expression->visit(*this);
+ if(!result_valid)
+ return;
+
+ if(unary.oper=="!")
+ result = !result;
+ else
+ result_valid = false;
+}
+
+void ExpressionEvaluator::visit(BinaryExpression &binary)
+{
+ result_valid = false;
+ binary.left->visit(*this);
+ if(!result_valid)
+ return;
+
+ float left_result = result;
+ result_valid = false;
+ binary.right->visit(*this);
+ if(!result_valid)
+ return;
+
+ if(binary.oper=="<")
+ result = (left_result<result);
+ else if(binary.oper=="<=")
+ result = (left_result<=result);
+ else if(binary.oper==">")
+ result = (left_result>result);
+ else if(binary.oper==">=")
+ result = (left_result>=result);
+ else if(binary.oper=="==")
+ result = (left_result==result);
+ else if(binary.oper=="!=")
+ result = (left_result!=result);
+ else if(binary.oper=="&&")
+ result = (left_result && result);
+ else if(binary.oper=="||")
+ result = (left_result || result);
+ else
+ result_valid = false;
+}
+
+} // namespace SL
+} // namespace GL
+} // namespace Msp