Пример #1
0
        public void EvaluateUndefinedVariable()
        {
            Context context = new Context();
            VariableExpression expr = new VariableExpression("foo");

            Assert.IsNull(expr.Evaluate(context));
        }
Пример #2
0
        public void DefineVariableWithName()
        {
            Context context = new Context();
            VariableExpression expr = new VariableExpression("foo");

            Assert.AreEqual("foo", expr.Name);
        }
Пример #3
0
        public void EvaluateDefinedVariable()
        {
            Context context = new Context();
            context.SetValue("one", 1);
            VariableExpression expr = new VariableExpression("one");

            Assert.AreEqual(1, expr.Evaluate(context));
            Assert.AreEqual("one", expr.Name);
        }
        public void DefineVariableWithTypeAndInitialValue()
        {
            Context context = new Context();
            IExpression typeexpr = new VariableExpression("List");
            DefineVariableCommand expr = new DefineVariableCommand(typeexpr, "a", new ConstantExpression(1));

            Assert.AreEqual(1, expr.Execute(context));
            Assert.IsTrue(context.HasVariable("a"));
            Assert.AreEqual(1, context.GetValue("a"));
            Assert.AreEqual("a", expr.Name);
            Assert.AreEqual(typeexpr, expr.TypeExpression);
        }
Пример #5
0
        private IExpression ParseStringInterpolation(string text)
        {
            IList<IExpression> expressions = new List<IExpression>();

            while (true)
            {
                int pos = text.IndexOf('$');

                if (pos < 0)
                {
                    if (!string.IsNullOrEmpty(text))
                    {
                        IExpression textexpr = new ConstantExpression(text);
                        expressions.Add(textexpr);
                    }

                    break;
                }

                if (pos == text.Length - 1)
                    throw new ParserException("Unexpected End of String");

                string left = text.Substring(0, pos);

                if (!string.IsNullOrEmpty(left))
                    expressions.Add(new ConstantExpression(left));

                if (text[pos + 1] == '{')
                {
                    int pos2 = text.IndexOf('}', pos + 1);

                    if (pos2 < 0)
                        throw new ParserException("Unexpected End of String");

                    string subtext = text.Substring(pos + 2, pos2 - pos - 2);
                    text = text.Substring(pos2 + 1);

                    Parser parser = new Parser(subtext);

                    IExpression newexpr = parser.ParseExpression();

                    if (parser.ParseExpression() != null)
                        throw new ParserException("Bad String Interpolation");

                    expressions.Add(newexpr);
                }
                else if (char.IsLetter(text[pos + 1]))
                {
                    Parser parser = new Parser(text.Substring(pos + 1));
                    string name = parser.ParseName();
                    IExpression varexpr = new VariableExpression(name);
                    expressions.Add(varexpr);
                    text = text.Substring(pos + name.Length + 1);
                }
                else
                    throw new ParserException("Bad String Interpolation");
            }

            if (expressions.Count == 1)
                return expressions[0];

            IExpression expression = expressions[0];

            foreach (var expr in expressions.Skip(1))
                expression = new ArithmeticBinaryExpression(ArithmeticOperator.Add, expression, expr);

            return expression;
        }
Пример #6
0
        private IExpression ParseSimpleExpression()
        {
            Token token = this.NextToken();

            if (token == null)
                return null;

            if (token.Type == TokenType.Separator && (token.Value == "}" || token.Value == ")"))
            {
                this.PushToken(token);
                return null;
            }

            switch (token.Type)
            {
                case TokenType.Integer:
                    return new ConstantExpression(int.Parse(token.Value, CultureInfo.InvariantCulture));

                case TokenType.Name:
                    string name = token.Value;

                    if (name == "null")
                        return new ConstantExpression(null);
                    if (name == "true")
                        return new ConstantExpression(true);
                    if (name == "false")
                        return new ConstantExpression(false);

                    token = this.NextToken();

                    if (token != null && token.Type == TokenType.Separator && token.Type == TokenType.Separator && token.Value == "(")
                    {
                        return new CallExpression(new VariableExpression(name), this.ParseExpressionList(")"));
                    }

                    IExpression expr = new VariableExpression(name);

                    if (token != null)
                        this.PushToken(token);

                    return expr;

                case TokenType.String:
                    if (token.Value.Contains('$'))
                        return this.ParseStringInterpolation(token.Value);

                    return new ConstantExpression(token.Value);

                case TokenType.Separator:
                    if (token.Value == "(")
                    {
                        var result = this.ParseExpression();
                        this.ParseToken(")", TokenType.Separator);
                        return result;
                    }

                    if (token.Value == "[")
                    {
                        var result = this.ParseExpressionList("]");
                        return new ArrayExpression(result);
                    }

                    break;
            }

            throw new ParserException(string.Format("Unexpected '{0}'", token.Value));
        }