public void CreateSimpleVariableExpression() { Variable variable = new Variable("X"); VariableExpression expression = new VariableExpression(variable); Assert.AreEqual(variable, expression.Variable); }
public void EvaluateUndefinedVariableExpression() { Variable variable = new Variable("X"); Context context = new Context(); VariableExpression expression = new VariableExpression(variable); Assert.AreEqual(variable, expression.Evaluate(context, true)); }
public void EvaluateVariableExpression() { Variable variable = new Variable("X"); Context context = new Context(); context.SetValue("X", 1); VariableExpression expression = new VariableExpression(variable); Assert.AreEqual(1, expression.Evaluate(context)); }
public void RaiseIfEvaluateUndefinedVariableExpression() { Variable variable = new Variable("X"); Context context = new Context(); VariableExpression expression = new VariableExpression(variable); try { expression.Evaluate(context, false); Assert.Fail(); } catch (Exception ex) { Assert.AreEqual("variable 'X' is unbound", ex.Message); } }
private IExpression ParseTerm() { Token token = this.NextToken(); IExpression expression = null; if (token == null) return null; if (token.Type == TokenType.Variable) { expression = new VariableExpression(new Variable(token.Value)); if (this.TryParseToken(TokenType.Separator, "(")) { var list = this.ParseExpressionList(); this.ParseToken(TokenType.Separator, ")"); expression = new CallExpression(expression, list); } } else if (token.Type == TokenType.Atom) { if (token.Value == "false") return new ConstantExpression(false); if (token.Value == "true") return new ConstantExpression(true); if (token.Value == "fun") return this.ParseFunExpression(); if (token.Value == "receive") return this.ParseReceiveExpression(); expression = new AtomExpression(new Atom(token.Value)); if (this.TryParseToken(TokenType.Separator, "(")) { var list = this.ParseExpressionList(); this.ParseToken(TokenType.Separator, ")"); expression = new CallExpression(expression, list); } else if (this.TryParseToken(TokenType.Separator, ":")) { var nexpression = new AtomExpression(new Atom(this.ParseAtom())); this.ParseToken(TokenType.Separator, "("); var list = this.ParseExpressionList(); this.ParseToken(TokenType.Separator, ")"); expression = new QualifiedCallExpression(expression, nexpression, list); } } else if (token.Type == TokenType.Integer) expression = new ConstantExpression(int.Parse(token.Value, CultureInfo.InvariantCulture)); else if (token.Type == TokenType.Real) expression = new ConstantExpression(double.Parse(token.Value, CultureInfo.InvariantCulture)); else if (token.Type == TokenType.String) expression = new ConstantExpression(token.Value); else if (token.Type == TokenType.Separator && token.Value == "(") { expression = this.ParseSimpleExpression(); this.ParseToken(TokenType.Separator, ")"); } else if (token.Type == TokenType.Separator && token.Value == "{") { var expressions = this.ParseExpressionList(); this.ParseToken(TokenType.Separator, "}"); expression = new TupleExpression(expressions); } else if (token.Type == TokenType.Separator && token.Value == "[") { var expressions = this.ParseExpressionList(); IExpression tailexpression = null; if (this.TryParseToken(TokenType.Separator, "|")) tailexpression = this.ParseSimpleExpression(); this.ParseToken(TokenType.Separator, "]"); expression = new ListExpression(expressions, tailexpression); } else this.PushToken(token); return expression; }