Operator = { ADD : function (leftVal, rightVal) { return leftVal + rightVal; }, SUBTRACT : function (leftVal, rightVal) { return leftVal - rightVal; }, MULTIPLY : function (leftVal, rightVal) { return leftVal * rightVal; }, DIVIDE : function (leftVal, rightVal) { return leftVal / rightVal; }, EQUALS : function (leftVal, rightVal) { return (leftVal == rightVal) ? 1 : 0; }, NOTEQUALS : function (leftVal, rightVal) { return (leftVal != rightVal) ? 1 : 0; }, GT : function (leftVal, rightVal) { return (leftVal > rightVal) ? 1 : 0; }, LT : function (leftVal, rightVal) { return (leftVal < rightVal) ? 1 : 0; }, GTEQ : function (leftVal, rightVal) { return (leftVal >= rightVal) ? 1 : 0; }, LTEQ : function (leftVal, rightVal) { return (leftVal <= rightVal) ? 1 : 0; }, BOOLEAN_OR : function (leftVal, rightVal) { ((leftVal != 0) || (rightVal != 0)) ? 1 : 0; }, BOOLEAN_AND : function (leftVal, rightVal) { ((leftVal != 0) && (rightVal != 0)) ? 1 : 0; } }; function VariablesHolder() { this.variables = {}; } VariablesHolder.prototype.init = function () { this.variables = { "True": 1, "False": 0 }; }; VariablesHolder.prototype.getVariable = function (name) { if (name in this.variables) { return this.variables[name]; } return 0; }; VariablesHolder.prototype.setVariable = function (name, value) { this.variables[name] = value; }; Variables = new VariablesHolder(); function BinaryExpression(op, left, right) { this.op = op; this.left = left; this.right = right; } BinaryExpression.prototype.eval = function () { return this.op(this.left.eval(), this.right.eval()); }; function ValueExpression(value) { this.value = value; } ValueExpression.prototype.eval = function () { return this.value; }; function VariableExpression(variable) { this.variable = variable; } VariableExpression.prototype.eval = function () { return Variables.getVariable(this.variable); };