Example #1
0
        public void Can_Read_Negated_Expression()
        {
            var tokenizer = NewTokenizer("NOT ( A.Field = 1 OR A.Other IS NULL )");

            tokenizer.ReadNextToken();

            ExpressionParser parser = new ExpressionParser(tokenizer);

            // exercise
            Expression expression = parser.Execute();

            // verify
            Assert.IsNotNull(expression);
            Assert.IsTrue(expression is NegationExpression);

            NegationExpression negationExpression = (NegationExpression)expression;
            Expression         criteria           = negationExpression.Expression;

            Assert.IsTrue(criteria is NestedExpression);

            NestedExpression nestedExpression = (NestedExpression)criteria;

            Assert.IsTrue(nestedExpression.Expression is CriteriaExpression);

            CriteriaExpression criteriaExpression = (CriteriaExpression)nestedExpression.Expression;

            Assert.AreEqual("A.Field = 1", criteriaExpression.Left.Value);
            Assert.AreEqual("OR", criteriaExpression.Operator);
            Assert.AreEqual("A.Other IS NULL", criteriaExpression.Right.Value);
        }
Example #2
0
        public void Can_Read_Negated_Expression_Without_Brackets()
        {
            var tokenizer = NewTokenizer("NOT EXISTS(SELECT 1 FROM dbo.Table)");

            tokenizer.ReadNextToken();

            ExpressionParser parser = new ExpressionParser(tokenizer);

            // exercise
            Expression expression = parser.Execute();

            // verify
            Assert.IsNotNull(expression);
            Assert.IsTrue(expression is NegationExpression);

            NegationExpression negationExpression = (NegationExpression)expression;
            Expression         criteria           = negationExpression.Expression;

            Assert.IsTrue(criteria is FunctionExpression);
            FunctionExpression functionExpression = (FunctionExpression)criteria;

            Assert.AreEqual(1, functionExpression.Arguments.Count);

            Expression arg = functionExpression.Arguments.First();

            Assert.IsTrue(arg is SelectExpression);
        }
Example #3
0
        private Expression ReadFactor(Expression parent)
        {
            // nested expressions first
            if (Tokenizer.IsNextToken(Constants.OpenBracket))
            {
                return(GetNestedExpression(parent));
            }
            else
            {
                if (Tokenizer.IsNextToken(Constants.Case))
                {
                    return(GetCaseExpression(parent));
                }

                if (Tokenizer.IsNextToken(Constants.Select))
                {
                    return(GetSelectExpression());
                }

                if (Tokenizer.HasMoreTokens && Tokenizer.Current.Type == TokenType.String)
                {
                    return(ReadString(parent));
                }

                if (Tokenizer.IsNextToken(Constants.Not))
                {
                    ReadNextToken();
                    NegationExpression negationExpression = new NegationExpression(parent);
                    var result = ReadCriteriaList(negationExpression);
                    negationExpression.Expression = result;
                    return(negationExpression);
                }

                if (Tokenizer.Current != (Token)null && !Tokenizer.Current.IsTypeIn(
                        TokenType.SingleQuote, TokenType.Variable, TokenType.AlphaNumeric, TokenType.AlphaNumeric,
                        TokenType.Numeric, TokenType.Operator, TokenType.BlockedText)
                    )
                {
                    throw new SyntaxException("expected alpha, numeric, or variable, found " + Tokenizer.Current.Value);
                }

                // get (possibly dot notated) identifier next
                string token = GetDotNotationIdentifier();

                // check for an open bracket, indicating that the previous identifier is actually a function
                if (Tokenizer.IsNextToken(Constants.OpenBracket))
                {
                    return(GetFunction(parent, token));
                }
                else
                {
                    return(new IdentifierExpression(token, parent));
                }
            }
        }
Example #4
0
        public void ParseBooleanNegation()
        {
            Parser parser   = new Parser("!a");
            var    expected = new NegationExpression(new NameExpression("a"));
            var    result   = parser.ParseExpression();

            Assert.IsNotNull(result);
            Assert.AreEqual(expected, result);

            Assert.IsNull(parser.ParseExpression());
        }
        public void Equals()
        {
            NegationExpression expr1 = new NegationExpression(new ConstantExpression(1));
            NegationExpression expr2 = new NegationExpression(new ConstantExpression(2));
            NegationExpression expr3 = new NegationExpression(new ConstantExpression(1));

            Assert.IsTrue(expr1.Equals(expr3));
            Assert.IsTrue(expr3.Equals(expr1));
            Assert.AreEqual(expr1.GetHashCode(), expr3.GetHashCode());

            Assert.IsFalse(expr1.Equals(null));
            Assert.IsFalse(expr1.Equals("foo"));
            Assert.IsFalse(expr1.Equals(expr2));
            Assert.IsFalse(expr2.Equals(expr1));
        }
Example #6
0
        private IExpression ParseTerm()
        {
            IExpression expression = null;

            if (this.TryParseToken(TokenType.Operator, "-"))
            {
                expression = new NegativeExpression(this.ParseTerm());
            }
            else if (this.TryParseToken(TokenType.Operator, "+"))
            {
                expression = this.ParseTerm();
            }
            else if (this.TryParseToken(TokenType.Operator, "!"))
            {
                expression = new NegationExpression(this.ParseTerm());
            }
            else
            {
                expression = this.ParseSimpleTerm();
            }

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

            while (true)
            {
                if (this.TryParseToken(TokenType.Separator, "."))
                {
                    string name = this.ParseName();

                    if (this.TryParseToken(TokenType.Separator, "{"))
                    {
                        expression = new DotExpression(expression, name, new IExpression[] { this.ParseBlockExpression(true) });
                    }
                    else if (this.NextTokenStartsExpressionList())
                    {
                        expression = new DotExpression(expression, name, this.ParseExpressionList());
                    }
                    else
                    {
                        expression = new DotExpression(expression, name, new IExpression[0]);
                    }

                    continue;
                }

                if (this.TryParseToken(TokenType.Separator, "::"))
                {
                    string name = this.ParseName();

                    expression = new DoubleColonExpression(expression, name);

                    continue;
                }

                if (this.TryParseToken(TokenType.Separator, "["))
                {
                    IExpression indexexpr = this.ParseExpression();
                    this.ParseToken(TokenType.Separator, "]");
                    expression = new IndexedExpression(expression, indexexpr);

                    continue;
                }

                break;
            }

            return(expression);
        }
 public virtual void Visit(NegationExpression negationExpression)
 {
     Visit(negationExpression.E);
 }
 public string GenerateString(NegationExpression expression)
 {
     return(expression.tok.val + GenerateString(expression.E));
 }
Example #9
0
 void UnaryExpression(out Expression e, bool allowSemi, bool allowLambda)
 {
     Contract.Ensures(Contract.ValueAtReturn(out e) != null); IToken/*!*/ x;  e = dummyExpr;
     if (la.kind == 128) {
     Get();
     x = t;
     UnaryExpression(out e, allowSemi, allowLambda);
     e = new NegationExpression(x, e);
     } else if (la.kind == 121 || la.kind == 122) {
     NegOp();
     x = t;
     UnaryExpression(out e, allowSemi, allowLambda);
     e = new UnaryOpExpr(x, UnaryOpExpr.Opcode.Not, e);
     } else if (IsMapDisplay()) {
     Expect(17);
     x = t;
     MapDisplayExpr(x, true, out e);
     while (IsSuffix()) {
         Suffix(ref e);
     }
     } else if (IsIMapDisplay()) {
     Expect(18);
     x = t;
     MapDisplayExpr(x, false, out e);
     while (IsSuffix()) {
         Suffix(ref e);
     }
     } else if (IsISetDisplay()) {
     Expect(14);
     x = t;
     ISetDisplayExpr(x, false, out e);
     while (IsSuffix()) {
         Suffix(ref e);
     }
     } else if (IsLambda(allowLambda)) {
     LambdaExpression(out e, allowSemi);
     } else if (StartOf(29)) {
     EndlessExpression(out e, allowSemi, allowLambda);
     } else if (la.kind == 1) {
     NameSegment(out e);
     while (IsSuffix()) {
         Suffix(ref e);
     }
     } else if (la.kind == 46 || la.kind == 48) {
     DisplayExpr(out e);
     while (IsSuffix()) {
         Suffix(ref e);
     }
     } else if (la.kind == 15) {
     MultiSetExpr(out e);
     while (IsSuffix()) {
         Suffix(ref e);
     }
     } else if (StartOf(27)) {
     ConstAtomExpression(out e, allowSemi, allowLambda);
     while (IsSuffix()) {
         Suffix(ref e);
     }
     } else SynErr(223);
 }
 public void MathExpression_Can_Evaluate_Negated_Expression()
 {
     var expression = new NegationExpression(new NumericExpression(42));
     var visitor = new EvaluationVisitor();
     Assert.AreEqual(-42, visitor.Evaluate(expression, new MathExpressionContext()));
 }
        public void NegationInteger()
        {
            NegationExpression expr = new NegationExpression(new ConstantExpression(123));

            Assert.AreEqual(false, expr.Evaluate(null));
        }
        public void NegationString()
        {
            NegationExpression expr = new NegationExpression(new ConstantExpression("foo"));

            Assert.AreEqual(false, expr.Evaluate(null));
        }
        public void NegationTrue()
        {
            NegationExpression expr = new NegationExpression(new ConstantExpression(true));

            Assert.AreEqual(false, expr.Evaluate(null));
        }