Пример #1
0
        public void TestString()
        {
            var expression = new PlusExpression(Mock.Of <IExpression>(e =>
                                                                      e.Evaluate(It.IsAny <IDictionary <string, object> >()) == (object)"12"));

            Assert.AreEqual(12M, expression.Evaluate(null));
        }
Пример #2
0
        public void TestInvalid()
        {
            var expression = new PlusExpression(Mock.Of <IExpression>(e =>
                                                                      e.Evaluate(It.IsAny <IDictionary <string, object> >()) == (object)DateTime.Now));

            Assert.IsNull(expression.Evaluate(null));
        }
Пример #3
0
        private Expression Suffix(INode node)
        {
            if (node.Name == "quantified")
            {
                Debug.Assert(node.Count == 2);

                var expression = Primary(node[0]);
                switch (node[1].Name)
                {
                case "?":
                    return(OptionalExpression.From(node, expression));

                case "*":
                    return(StarExpression.From(node, expression));

                case "+":
                    return(PlusExpression.From(node, expression));

                default:
                    throw new NotImplementedException();
                }
            }

            return(Primary(node));
        }
Пример #4
0
 protected override void VisitPlusExpression(PlusExpression expression)
 {
     base.VisitPlusExpression(expression);
     if (expression.Expression.Attr.IsNullable)
     {
         Results.AddError(new MessageError(MessageCode.NullableManyContent, expression));
     }
 }
Пример #5
0
 public void Visit(PlusExpression exp)
 {
     exp.Op0.Accept(this);
     exp.Op1.Accept(this);
     int b = stack.Pop();
     int a = stack.Pop();
     stack.Push(checked(a + b));
 }
Пример #6
0
 public object Visit(PlusExpression exp)
 {
     if (d)
     {
         return(checked ((double)exp.Op0.Accept(this) + (double)exp.Op1.Accept(this)));
     }
     else
     {
         return(checked ((int)exp.Op0.Accept(this) + (int)exp.Op1.Accept(this)));
     }
 }
Пример #7
0
 protected override void VisitPlusExpression(PlusExpression plus)
 {
     CS.IndentInOut(
         "PlusExpression",
         () =>
     {
         using var start = Locals.Use("start");
         using var nodes = Locals.Use("nodes");
         CS.Ln($"{start} = {Cfg.CurName};");
         CS.Ln($"{nodes} = new List<INode>(10);");
         Locals.PeekPrep(Writer);
         CS.ForEver(
             () =>
         {
             VisitExpression(plus.Expression);
             CS.If(
                 $"{Locals.Result}.IsSuccess",
                 () =>
             {
                 CS.Ln($"{Cfg.CurName} = {Locals.Result}.Next;");
                 CS.Ln($"{nodes}.AddRange({Locals.Result}.Nodes);");
             },
                 () =>
             {
                 CS.Ln("break;");
             });
         });
         CS.If(
             $"{nodes}.Count > 0",
             () =>
         {
             using var location = Locals.Use("location");
             using var node     = Locals.Use("node");
             CS.Ln($"{location} = Location.From({start}, {Cfg.CurName});");
             CS.Ln($"{node} = NodeList.From({location}, NodeSymbols.Plus, {nodes}.ToArray());");
             CS.Ln($"{Locals.Result} = Result.Success({location}, {Cfg.CurName}, {node});");
         },
             () =>
         {
             CS.Ln($"{Locals.Result} = Result.Fail({start});");
         });
     });
 }
Пример #8
0
            private static Expression Expression(INode node)
            {
                switch (node.Name)
                {
                case "sequence": return(Sequence(node));

                case "choice": return(Choice(node));

                case "prefix.drop": return(DropExpression.From(node[0], Expression(node[0])));

                case "prefix.lift": return(LiftExpression.From(node[0], Expression(node[0])));

                case "prefix.fuse": return(FuseExpression.From(node[0], Expression(node[0])));

                case "prefix.not": return(NotExpression.From(node[0], Expression(node[0])));

                case "suffix.zero-or-more": return(StarExpression.From(node[0], Expression(node[0])));

                case "suffix.one-or-more": return(PlusExpression.From(node[0], Expression(node[0])));

                case "suffix.zero-or-one": return(OptionalExpression.From(node[0], Expression(node[0])));

                case "inline": return(InlineExpression.From(node[0], Tree.Rule.From(Identifier(node[0]), Expression(node[1]))));

                case "identifier": return(NameExpression.From(node, Identifier(node)));

                case "any": return(AnyExpression.From(node));

                case "verbatim-string": return(StringLiteralExpression.From(node, ((ILeaf)node).Value));

                case "character-class": return(Class(node));

                case "string": return(String(node));

                default:
                    throw new NotImplementedException();
                }
            }
Пример #9
0
 protected override void VisitPlusExpression(PlusExpression expression)
 {
     MaybeParent(expression.Expression is PrefixExpression, expression.Expression);
     Writer.Write($"{OpSymbols.Plus}");
 }
Пример #10
0
            public SingleExpression(TextReader reader)
            {
                while (reader.Peek() != -1)
                {
                    char c = (char)reader.Peek();

                    if (c == '(')
                    {
                        reader.Read();
                        Expression = new SingleExpression(reader);
                        if ((char)reader.Read() != ')')
                        {
                            throw new Exception("Expected )");
                        }
                    }
                    else if (c == ')')
                    {
                        return;
                    }
                    else if (c == '[')
                    {
                        reader.Read();
                        Expression = new RangeExpression(reader);
                        if ((char)reader.Read() != ']')
                        {
                            throw new Exception("Expected ]");
                        }
                    }
                    else if (c == '{')
                    {
                        reader.Read();
                        Expression = new RepeatExpression(reader)
                        {
                            Expression = Expression
                        };
                        if ((char)reader.Read() != '}')
                        {
                            throw new Exception("Expected }");
                        }
                    }
                    else if (c == '|')
                    {
                        reader.Read();
                        Expression = new OrExpression {
                            Left = Expression, Right = new SingleExpression(reader)
                        };
                    }
                    else if (c == '.')
                    {
                        reader.Read();
                        Expression = new ConcatExpression {
                            Left = Expression, Right = new SingleExpression(reader).Expression
                        };
                    }
                    else if (c == '*')
                    {
                        reader.Read();
                        Expression = new StarExpression {
                            Expression = Expression
                        };
                    }
                    else if (c == '+')
                    {
                        reader.Read();
                        Expression = new PlusExpression {
                            Expression = Expression
                        };
                    }
                    else
                    {
                        throw new Exception("Unexpected " + c);
                    }
                }
            }
Пример #11
0
 private string GetExpression(PlusExpression expression, ref List<OleDbParameter> parameters)
 {
     return " ( " + GetExpressionDispatch(expression.Children[0], ref parameters) + " + " +
       GetExpressionDispatch(expression.Children[1], ref parameters) + " ) ";
 }
Пример #12
0
 protected override void VisitPlusExpression(PlusExpression plus)
 {
     VisitExpression(plus.Expression);
     Push(new Plus(Pop()));
 }
Пример #13
0
            public SingleExpression(TextReader reader)
            {
                while (reader.Peek() != -1)
                {
                    char c = (char)reader.Peek();

                    if (c == '(')
                    {
                        reader.Read();
                        Expression = new SingleExpression(reader);
                        if ((char)reader.Read() != ')')
                            throw new Exception("Expected )");
                    }
                    else if (c == ')')
                    {
                        return;
                    }
                    else if (c == '[')
                    {
                        reader.Read();
                        Expression = new RangeExpression(reader);
                        if ((char)reader.Read() != ']')
                            throw new Exception("Expected ]");
                    }
                    else if (c == '{')
                    {
                        reader.Read();
                        Expression = new RepeatExpression(reader) { Expression = Expression };
                        if ((char)reader.Read() != '}')
                            throw new Exception("Expected }");
                    }
                    else if (c == '|')
                    {
                        reader.Read();
                        Expression = new OrExpression { Left = Expression, Right = new SingleExpression(reader) };
                    }
                    else if (c == '.')
                    {
                        reader.Read();
                        Expression = new ConcatExpression { Left = Expression, Right = new SingleExpression(reader).Expression };
                    }
                    else if (c == '*')
                    {
                        reader.Read();
                        Expression = new StarExpression { Expression = Expression };
                    }
                    else if (c == '+')
                    {
                        reader.Read();
                        Expression = new PlusExpression { Expression = Expression };
                    }
                    else
                    {
                        throw new Exception("Unexpected " + c);
                    }
                }
            }
Пример #14
0
 protected override void VisitPlusExpression(PlusExpression expression)
 {
     base.VisitPlusExpression(expression);
     SetNullable(expression, expression.Expression.Attr.IsNullable);
 }
 private string GetExpression(PlusExpression expression, ref List <OleDbParameter> parameters)
 {
     return(" ( " + GetExpressionDispatch(expression.Children[0], ref parameters) + " + " +
            GetExpressionDispatch(expression.Children[1], ref parameters) + " ) ");
 }