ParseExpression() public method

public ParseExpression ( ) : IExpression
return IExpression
示例#1
0
        public void ParseArrayExpression()
        {
            Parser parser = new Parser("[1,2,3]");
            var result = parser.ParseExpression();

            Assert.IsNotNull(result);
            Assert.IsInstanceOfType(result, typeof(ArrayExpression));

            ArrayExpression expr = (ArrayExpression)result;
            Assert.IsNotNull(expr.Expressions);
            Assert.AreEqual(3, expr.Expressions.Count());
        }
示例#2
0
 public void RaiseIfBinaryOperator()
 {
     Parser parser = new Parser("==");
     parser.ParseExpression();
 }
示例#3
0
        public void ParseVariable()
        {
            Parser parser = new Parser("foo");
            IExpression expr = parser.ParseExpression();

            Assert.IsNotNull(expr);
            Assert.IsInstanceOfType(expr, typeof(VariableExpression));

            VariableExpression vexpr = (VariableExpression)expr;

            Assert.AreEqual("foo", vexpr.Name);

            Assert.IsNull(parser.ParseExpression());
        }
示例#4
0
        public void ParseTrueAsConstant()
        {
            Parser parser = new Parser("true");
            var result = parser.ParseExpression();

            Assert.IsNotNull(result);
            Assert.IsInstanceOfType(result, typeof(ConstantExpression));

            ConstantExpression expression = (ConstantExpression)result;

            Assert.AreEqual(true, expression.Value);
        }
示例#5
0
        public void ParseSimpleSum()
        {
            Parser parser = new Parser("1+2");
            var result = parser.ParseExpression();
            Assert.IsNull(parser.ParseExpression());

            Assert.IsNotNull(result);
            Assert.IsInstanceOfType(result, typeof(ArithmeticBinaryExpression));

            ArithmeticBinaryExpression expression = (ArithmeticBinaryExpression)result;

            Assert.IsInstanceOfType(expression.LeftExpression, typeof(ConstantExpression));
            Assert.IsInstanceOfType(expression.RightExpression, typeof(ConstantExpression));
        }
示例#6
0
        public void ParseSimpleString()
        {
            Parser parser = new Parser("\"foo\"");
            IExpression expr = parser.ParseExpression();

            Assert.IsNotNull(expr);
            Assert.IsInstanceOfType(expr, typeof(ConstantExpression));

            ConstantExpression cexpr = (ConstantExpression)expr;

            Assert.AreEqual("foo", cexpr.Evaluate(null));

            Assert.IsNull(parser.ParseExpression());
        }
示例#7
0
 public void ParseClosingParenthesisAsNoExpression()
 {
     Parser parser = new Parser(")");
     Assert.IsNull(parser.ParseExpression());
 }
示例#8
0
        public void ParseDotExpression()
        {
            Parser parser = new Parser("a.length");
            var result = parser.ParseExpression();

            Assert.IsNotNull(result);
            Assert.IsInstanceOfType(result, typeof(DotExpression));

            DotExpression expression = (DotExpression)result;

            Assert.AreEqual("length", expression.Name);
            Assert.IsNull(expression.Arguments);
            Assert.IsInstanceOfType(expression.Expression, typeof(VariableExpression));
        }
示例#9
0
        public void ParseSimpleCall()
        {
            Parser parser = new Parser("prints(1)");
            IExpression expr = parser.ParseExpression();

            Assert.IsNotNull(expr);
            Assert.IsInstanceOfType(expr, typeof(CallExpression));

            CallExpression cexpr = (CallExpression)expr;

            Assert.IsInstanceOfType(cexpr.Expression, typeof(VariableExpression));
            Assert.AreEqual(1, cexpr.Arguments.Count());
            Assert.IsInstanceOfType(cexpr.Arguments.First(), typeof(ConstantExpression));
        }
示例#10
0
        public void ParseNullAsConstant()
        {
            Parser parser = new Parser("null");
            var result = parser.ParseExpression();

            Assert.IsNotNull(result);
            Assert.IsInstanceOfType(result, typeof(ConstantExpression));

            ConstantExpression expression = (ConstantExpression)result;

            Assert.IsNull(expression.Value);
        }
示例#11
0
        public void ParseLessOperator()
        {
            Parser parser = new Parser("a < 1");
            IExpression expr = parser.ParseExpression();

            Assert.IsNotNull(expr);
            Assert.IsInstanceOfType(expr, typeof(CompareExpression));

            CompareExpression cexpr = (CompareExpression)expr;

            Assert.AreEqual(ComparisonOperator.Less, cexpr.Operation);
            Assert.IsInstanceOfType(cexpr.LeftExpression, typeof(VariableExpression));
            Assert.IsInstanceOfType(cexpr.RightExpression, typeof(ConstantExpression));

            Assert.IsNull(parser.ParseExpression());
        }
示例#12
0
        public void ParseInteger()
        {
            Parser parser = new Parser("123");
            IExpression expr = parser.ParseExpression();

            Assert.IsNotNull(expr);
            Assert.IsInstanceOfType(expr, typeof(ConstantExpression));

            ConstantExpression cexpr = (ConstantExpression)expr;

            Assert.AreEqual(123, cexpr.Evaluate(null));

            Assert.IsNull(parser.ParseExpression());
        }
示例#13
0
        public void ParseDotExpressionWithArguments()
        {
            Parser parser = new Parser("a.slice(1)");
            var result = parser.ParseExpression();

            Assert.IsNotNull(result);
            Assert.IsInstanceOfType(result, typeof(DotExpression));

            DotExpression expression = (DotExpression)result;

            Assert.AreEqual("slice", expression.Name);
            Assert.IsNotNull(expression.Arguments);
            Assert.AreEqual(1, expression.Arguments.Count());
            Assert.IsInstanceOfType(expression.Expression, typeof(VariableExpression));
        }
示例#14
0
 public void RaiseIfMissingClosingParenthesis()
 {
     Parser parser = new Parser("prints(1");
     parser.ParseExpression();
 }
示例#15
0
        public void ParseSimpleCallWithParenthesisAndTwoArguments()
        {
            Parser parser = new Parser("myfunc(a, b)");
            IExpression expr = parser.ParseExpression();

            Assert.IsNotNull(expr);
            Assert.IsInstanceOfType(expr, typeof(CallExpression));

            CallExpression cexpr = (CallExpression)expr;

            Assert.IsInstanceOfType(cexpr.Expression, typeof(VariableExpression));
            Assert.AreEqual(2, cexpr.Arguments.Count());
            Assert.IsInstanceOfType(cexpr.Arguments.First(), typeof(VariableExpression));
            Assert.IsInstanceOfType(cexpr.Arguments.Skip(1).First(), typeof(VariableExpression));
        }
示例#16
0
        private static object EvaluateExpression(string text, Context context)
        {
            Parser parser = new Parser(text);

            var result = parser.ParseExpression();

            Assert.IsNull(parser.ParseExpression());

            return result.Evaluate(context);
        }
示例#17
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;
        }