public void DistinctAddExpressions()
        {
            var a = new AddExpression(new IntegerExpression(5), new VariableExpression("a"));
            var b = new AddExpression(new VariableExpression("a"), new VariableExpression("a"));

            Assert.IsFalse(_instance.AreEqual(a, b));
        }
Esempio n. 2
0
        public void AddTwoIntegers()
        {
            AddExpression expr = new AddExpression(new ConstantExpression(1), new ConstantExpression(2));

            Assert.AreEqual(3, expr.Evaluate(null));
            Assert.IsFalse(expr.HasVariable());
        }
        public void EqualAddExpressionsMirrored()
        {
            var a = new AddExpression(new IntegerExpression(5), new VariableExpression("a"));
            var b = new AddExpression(new VariableExpression("a"), new IntegerExpression(5));

            Assert.IsTrue(_instance.AreEqual(a, b));
        }
            public AddExpression _CreateAddExpression(BinaryExpressionSyntax node, Expression left, Expression right)
            {
                // String concatenations require semantic proofs because of the implicit toString() call.
                var result = new AddExpression(left, right);

                if (!_proofSemantics)
                {
                    return(result);
                }

                var addSymbol = _semanticModel.GetSymbolInfo(node).Symbol as IMethodSymbol;

                if (addSymbol == null)
                {
                    throw new UnsupportedSyntaxException($"failed to resolve the symbol for the add expression {node}");
                }

                if (!addSymbol.ContainingType.IsStringType())
                {
                    return(result);
                }

                if (!node.Left.IsEvaluatingToPrimitiveType(_semanticModel) || !node.Right.IsEvaluatingToPrimitiveType(_semanticModel))
                {
                    throw new UnsupportedSyntaxException($"one of the operands of the string concatenation '{node}' will not evaluate to a primitive type");
                }

                return(result);
            }
Esempio n. 5
0
        private IExpression ParseBinaryExpressionLevel1()
        {
            IExpression expression = this.ParseBinaryExpressionLevel2();

            Token token = this.lexer.NextToken();

            while (token != null && (token.Value == "+" || token.Value == "-"))
            {
                switch (token.Value[0])
                {
                case '+':
                    expression = new AddExpression(expression, this.ParseBinaryExpressionLevel2());
                    break;

                case '-':
                    expression = new SubtractExpression(expression, this.ParseBinaryExpressionLevel2());
                    break;
                }

                token = this.lexer.NextToken();
            }

            if (token != null)
            {
                this.lexer.PushToken(token);
            }

            return(expression);
        }
Esempio n. 6
0
        public void AddIntegerToString()
        {
            AddExpression expr = new AddExpression(new ConstantExpression(42), new ConstantExpression("1"));

            Assert.AreSame(TypeInfo.String, expr.TypeInfo);
            Assert.AreEqual("421", expr.Evaluate(null));
        }
Esempio n. 7
0
        public void ParseAddMultiplyWithParens()
        {
            Parser parser = new Parser("(2+3)*4.");

            IExpression expression = parser.ParseExpression();

            Assert.IsNotNull(expression);
            Assert.IsInstanceOfType(expression, typeof(MultiplyExpression));

            MultiplyExpression multexpression = (MultiplyExpression)expression;

            Assert.IsInstanceOfType(multexpression.RightExpression, typeof(ConstantExpression));
            Assert.AreEqual(4, ((ConstantExpression)multexpression.RightExpression).Value);

            Assert.IsInstanceOfType(multexpression.LeftExpression, typeof(AddExpression));

            AddExpression addexpression = (AddExpression)multexpression.LeftExpression;

            Assert.IsInstanceOfType(addexpression.LeftExpression, typeof(ConstantExpression));
            Assert.IsInstanceOfType(addexpression.RightExpression, typeof(ConstantExpression));

            Assert.AreEqual(2, ((ConstantExpression)addexpression.LeftExpression).Value);
            Assert.AreEqual(3, ((ConstantExpression)addexpression.RightExpression).Value);

            Assert.IsNull(parser.ParseExpression());
        }
Esempio n. 8
0
        private static RawExpression Exp3(char **input)
        {
            RawExpression e = Exp2(input);

            while (true)
            {
                if (Char(input, '+'))
                {
                    e = new AddExpression
                    {
                        Left  = e,
                        Right = Exp2(input),
                    };
                }
                else if (Char(input, '-'))
                {
                    e = new SubExpression
                    {
                        Left  = e,
                        Right = Exp2(input),
                    };
                }
                else
                {
                    break;
                }
            }
            return(e);
        }
Esempio n. 9
0
        public void AddIntegerToDouble()
        {
            AddExpression expr = new AddExpression(new ConstantExpression(1), new ConstantExpression(2.5));

            Assert.AreSame(TypeInfo.Double, expr.TypeInfo);
            Assert.AreEqual(1 + 2.5, expr.Evaluate(null));
        }
Esempio n. 10
0
        public void AddTwoIntegers()
        {
            AddExpression expr = new AddExpression(new ConstantExpression(1), new ConstantExpression(2));

            Assert.AreSame(TypeInfo.Int, expr.TypeInfo);
            Assert.AreEqual(3, expr.Evaluate(null));
        }
Esempio n. 11
0
        public void AddDoubleToInteger()
        {
            AddExpression expr = new AddExpression(new ConstantExpression(2.5), new ConstantExpression(1));

            Assert.AreSame(TypeInfo.Double, expr.TypeInfo);
            Assert.AreEqual(2.5 + 1, expr.Evaluate(null));
        }
Esempio n. 12
0
 // Function to perform arithmetic operations.
 public Expression applyOp(Expression val1, Expression op, Expression val2)
 {
     if (((Operator)op).GetOp() == '+')
     {
         BinaryExpression Add = new AddExpression(val1, val2);
         return(Add);
     }
     else if (((Operator)op).GetOp() == '-')
     {
         BinaryExpression Substract = new SubstractExpression(val1, val2);
         return(Substract);
     }
     else if (((Operator)op).GetOp() == '*')
     {
         BinaryExpression Multiply = new MultiplyExpression(val1, val2);
         return(Multiply);
     }
     else if (((Operator)op).GetOp() == '/')
     {
         BinaryExpression Division = new DivisionExpression(val1, val2);
         return(Division);
     }
     else     /*if (((Operator)op).GetOp() == '^')*/
     {
         BinaryExpression Appointment = new AppointmentExpression(val1, val2);
         return(Appointment);
     }
 }
        public static IExpression CreateFromExpression(string expression)
        {
            IExpression result = null;

            if (ConstantExpression.IsMatch(expression))
            {
                result = new ConstantExpression();
            }
            else if (AddExpression.IsMatch(expression))
            {
                result = new AddExpression();
            }
            else if (SubExpression.IsMatch(expression))
            {
                result = new SubExpression();
            }
            else if (MulExpression.IsMatch(expression))
            {
                result = new MulExpression();
            }
            else if (DivExpression.IsMatch(expression))
            {
                result = new DivExpression();
            }
            else if (LetExpression.IsMatch(expression))
            {
                result = new LetExpression();
            }
            else if (VariableExpression.IsMatch(expression))
            {
                result = new VariableExpression();
            }

            return(result);
        }
Esempio n. 14
0
        public void AddTwoDoubles()
        {
            AddExpression expr = new AddExpression(new ConstantExpression(2.5), new ConstantExpression(3.7));

            Assert.AreSame(TypeInfo.Double, expr.TypeInfo);
            Assert.AreEqual(2.5 + 3.7, expr.Evaluate(null));
        }
Esempio n. 15
0
        static Expression Generate(Expression par, int lv, ref bool hasVar, Random rand)
        {
            Expression ret = null;

            if (lv == 0)
            {
                if (!hasVar && rand.NextDouble() > 0.5)
                {
                    ret    = new VariableExpression();
                    hasVar = true;
                }
                else
                {
                    ret = new ConstantExpression();
                    while ((ret as ConstantExpression).Value == 0 ||
                           (ret as ConstantExpression).Value == -1 ||
                           (ret as ConstantExpression).Value == 1)
                    {
                        (ret as ConstantExpression).Value = rand.Next(-10, 10);
                    }
                }
            }
            else
            {
                int a = rand.NextDouble() > 0.15 ? lv - 1 : 0;
                int b = rand.NextDouble() > 0.15 ? lv - 1 : 0;
                switch (rand.Next(0, 3))
                {
                case 0:
                    ret = new AddExpression();
                    (ret as AddExpression).OperandA = Generate(ret, a, ref hasVar, rand);
                    (ret as AddExpression).OperandB = Generate(ret, b, ref hasVar, rand);
                    break;

                case 1:
                    ret = new SubExpression();
                    (ret as SubExpression).OperandA = Generate(ret, a, ref hasVar, rand);
                    (ret as SubExpression).OperandB = Generate(ret, b, ref hasVar, rand);
                    break;

                case 2:
                    ret = new NegExpression();
                    (ret as NegExpression).Value = Generate(ret, a, ref hasVar, rand);
                    break;
                    //case 3:
                    //    ret = new MulExpression();
                    //    (ret as MulExpression).OperandA = Generate(ret, a, ref hasVar, rand);
                    //    (ret as MulExpression).OperandB = Generate(ret, b, ref hasVar, rand);
                    //    break;
                    //case 4:
                    //    ret = new DivExpression();
                    //    (ret as DivExpression).OperandA = Generate(ret, a, ref hasVar, rand);
                    //    (ret as DivExpression).OperandB = Generate(ret, b, ref hasVar, rand);
                    //    break;
                }
            }
            ret.Parent = par;
            return(ret);
        }
Esempio n. 16
0
        private IExpression ParseBinaryExpression(int level)
        {
            if (level >= binaryoperators.Length)
            {
                return(this.ParseTerm());
            }

            IExpression expr = this.ParseBinaryExpression(level + 1);

            if (expr == null)
            {
                return(null);
            }

            Token token;

            for (token = this.lexer.NextToken(); token != null && this.IsBinaryOperator(level, token); token = this.lexer.NextToken())
            {
                if (token.Value == "=:=")
                {
                    expr = new StrictEqualExpression(expr, this.ParseBinaryExpression(level + 1));
                }
                else if (token.Value == "==")
                {
                    expr = new EqualExpression(expr, this.ParseBinaryExpression(level + 1));
                }
                else if (token.Value == "+")
                {
                    expr = new AddExpression(expr, this.ParseBinaryExpression(level + 1));
                }
                else if (token.Value == "-")
                {
                    expr = new SubtractExpression(expr, this.ParseBinaryExpression(level + 1));
                }
                else if (token.Value == "*")
                {
                    expr = new MultiplyExpression(expr, this.ParseBinaryExpression(level + 1));
                }
                else if (token.Value == "/")
                {
                    expr = new DivideExpression(expr, this.ParseBinaryExpression(level + 1));
                }
                else if (token.Value == "div")
                {
                    expr = new DivExpression(expr, this.ParseBinaryExpression(level + 1));
                }
                else if (token.Value == "rem")
                {
                    expr = new RemExpression(expr, this.ParseBinaryExpression(level + 1));
                }
            }

            if (token != null)
            {
                this.lexer.PushToken(token);
            }

            return(expr);
        }
Esempio n. 17
0
        public void SerializeAddExpression()
        {
            var num = new LiteralExpression(1);
            var a   = new AddExpression(num, num);
            var b   = Reserialize(a);

            Assert.AreEqual(a, b);
        }
Esempio n. 18
0
        public void AddExpression()
        {
            var e = new AddExpression(new StringLiteral("wheee"), new Literal("6"));

            Assert.IsFalse(e.IsTrivial);
            Assert.AreEqual("(\"wheee\"+6)", e.ToString());
            Assert.AreEqual("Add", e.Name);
        }
Esempio n. 19
0
 public Expression Visit(AddExpression expression)
 {
     return(_ApplyBinaryExpression(expression,
                                   (left, right) => left + right,
                                   (left, right) => (left.Value == 0) ? right : new AddExpression(left, right),
                                   (left, right) => (right.Value == 0) ? left : new AddExpression(left, right),
                                   (left, right) => new AddExpression(left, right)));
 }
        public void EvaluateTest(string expression, int expectedResult)
        {
            var addExpression = new AddExpression();

            int result = addExpression.Evaluate(expression);

            Assert.That(result, Is.EqualTo(expectedResult));
        }
        public static void SerializeAddExpression()
        {
            var v = new NumberLiteral(2);
            var a = new AddExpression(v, v);
            var b = SerializationUtil.Reserialize(a);

            Assert.AreEqual(a, b);
        }
Esempio n. 22
0
        public void InstanceIsNotEqualToCompletelyDifferent()
        {
            var expression1 = new AddExpression(new IntegerExpression(1), new IntegerExpression(2));
            var expression2 = new ModuloExpression(new VariableExpression("y"), new VariableExpression("z"));
            var available1  = new AvailableExpression(_CreateFlowNode(), expression1);
            var available2  = new AvailableExpression(_CreateFlowNode(), expression2);

            Assert.AreNotEqual(available1, available2);
        }
Esempio n. 23
0
        public void TestEvaluateWithDifferentSizedArrays()
        {
            var expression = new AddExpression(
                Mock.Of <IExpression>(e => e.Evaluate(It.IsAny <IDictionary <string, object> >()) == (object)new[] { 1, 2, 3 }),
                Mock.Of <IExpression>(e => e.Evaluate(It.IsAny <IDictionary <string, object> >()) == (object)new[] { 1 }),
                new Context(ExpressiveOptions.None));

            Assert.IsNull(expression.Evaluate(null));
        }
Esempio n. 24
0
        public void TestEvaluate()
        {
            var expression = new AddExpression(
                Mock.Of <IExpression>(e => e.Evaluate(It.IsAny <IDictionary <string, object> >()) == (object)1),
                Mock.Of <IExpression>(e => e.Evaluate(It.IsAny <IDictionary <string, object> >()) == (object)2),
                ExpressiveOptions.None);

            Assert.AreEqual(3, expression.Evaluate(null));
        }
Esempio n. 25
0
        public void TestStringAddition()
        {
            var expression = new AddExpression(
                Mock.Of <IExpression>(e => e.Evaluate(It.IsAny <IDictionary <string, object> >()) == (object)"1"),
                Mock.Of <IExpression>(e => e.Evaluate(It.IsAny <IDictionary <string, object> >()) == (object)2),
                new Context(ExpressiveOptions.None));

            Assert.AreEqual("12", expression.Evaluate(null));
        }
        public void ValidateExpressionTest(string expression, bool expectedResult, string expectedError)
        {
            var addExpression = new AddExpression();

            bool result = addExpression.ValidateExpression(expression, out string error);

            Assert.That(result, Is.EqualTo(expectedResult));
            Assert.That(error, Is.EqualTo(expectedError));
        }
        public void TestPlusExpression()
        {
            IExpressionNode const1   = new ConstantExpression(5);
            IExpressionNode const2   = new ConstantExpression(15);
            IExpressionNode plusExpr = new AddExpression(const1, const2);

            var result = plusExpr.Evaluate();

            Assert.AreEqual(20, result);
        }
Esempio n. 28
0
        public void InstanceHasNotSameHashCodeAsOtherWithDifferenLeftOperand()
        {
            var node        = _CreateFlowNode();
            var expression1 = new AddExpression(new IntegerExpression(3), new VariableExpression("y"));
            var expression2 = new AddExpression(new IntegerExpression(5), new VariableExpression("y"));
            var available1  = new AvailableExpression(node, expression1);
            var available2  = new AvailableExpression(node, expression2);

            Assert.AreNotEqual(available1.GetHashCode(), available2.GetHashCode());
        }
Esempio n. 29
0
        public void InstanceIsNotEqualToOtherWithOperator()
        {
            var node        = _CreateFlowNode();
            var expression1 = new AddExpression(new IntegerExpression(5), new VariableExpression("y"));
            var expression2 = new MultiplyExpression(new IntegerExpression(5), new VariableExpression("y"));
            var available1  = new AvailableExpression(node, expression1);
            var available2  = new AvailableExpression(node, expression2);

            Assert.AreNotEqual(available1, available2);
        }
Esempio n. 30
0
        public void InstanceIsNotEqualToOtherWithDifferentRightOperand()
        {
            var node        = _CreateFlowNode();
            var expression1 = new AddExpression(new VariableExpression("y"), new VariableExpression("y"));
            var expression2 = new AddExpression(new VariableExpression("y"), new VariableExpression("z"));
            var available1  = new AvailableExpression(node, expression1);
            var available2  = new AvailableExpression(node, expression2);

            Assert.AreNotEqual(available1, available2);
        }
		public void Visit(AddExpression x)
		{
			
		}
		public ISymbolValue Visit(AddExpression x)
		{
			return E_MathOp(x);
		}
Esempio n. 33
0
 IExpression ParseAsmAddExpression(IBlockNode Scope, IStatement Parent)
 {
     var left = ParseAsmMulExpression(Scope, Parent);
     while (laKind == Plus || laKind == Minus)
     {
         Step();
         var e = new AddExpression(t.Kind == Minus);
         e.LeftOperand = left;
         e.RightOperand = ParseAsmMulExpression(Scope, Parent);
         left = e;
     }
     return left;
 }
Esempio n. 34
0
        /// <summary>
        /// Note: Add, Multiply as well as Cat Expressions are parsed in this method.
        /// </summary>
        IExpression AddExpression(IBlockNode Scope = null)
        {
            var left = UnaryExpression(Scope);

            OperatorBasedExpression ae = null;

            switch (laKind)
            {
                case Plus:
                case Minus:
                    ae = new AddExpression(laKind == Minus);
                    break;
                case Tilde:
                    ae = new CatExpression();
                    break;
                case Times:
                case Div:
                case Mod:
                    ae = new MulExpression(laKind);
                    break;
                default:
                    return left;
            }

            Step();

            ae.LeftOperand = left;
            ae.RightOperand = AddExpression(Scope);
            return ae;
        }