コード例 #1
0
ファイル: ParzEngine.cs プロジェクト: sj-freitas/parz
        public void EvaluateComputesTheValue()
        {
            var parser = new ParzEngine(
                toLevelTokens: tokens => tokens
                .AggregateByQuotationMarks(LambdaDefaults.QuotationMarks)
                .ToLevelTokens(),
                separators: LambdaDefaults
                .QuotationMarks
                .Concat(FuncDefaults.FunctionSeparators)
                .Concat(Defaults.Separators),
                tokenFactory: new AggregateTokenFactory(
                    new ConstantNumberParser(),
                    new OperatorParser(),
                    new OpenerParser(),
                    new CloserParser(),
                    new SeparatorParser(),
                    new FunctionParser("avg", "sum", "min", "max"),
                    new LambdaExpressionParser(),
                    new VariableParser()),
                nodeConverter: new AggregateNodeConverter(
                    new OpenerNodeConverter(),
                    new BinaryOperatorNodeConverter(),
                    new UnaryOperatorNodeConverter(),
                    new FunctionNodeConverter(),
                    new ConstantNumberNodeConverter(),
                    new VariableNodeConverter(),
                    new LambdaExpressionNodeConverter()));

            var expression = "1 + 3 / 5 +(52/3 + (-5))+56 * min(4, 3, 6 * 2 ,7) + min(0 + max(1, min(2, min(3, 4))))";

            var result        = parser.Parse(expression);
            var decimalResult = Evaluate(result);

            Assert.Equal(183.93333333333333333333333333m, decimalResult);
        }
コード例 #2
0
ファイル: ParzEngine.cs プロジェクト: sj-freitas/parz
        public void Test5()
        {
            var equalsOperator      = new[] { "==" };
            var exponentialOperator = new[] { "^" };
            var extraOpeners        = new[] { "<" };
            var extraClosers        = new[] { ">" };
            var parser = new ParzEngine(
                toLevelTokens: tokens => tokens
                .AggregateByQuotationMarks(LambdaDefaults.QuotationMarks)
                .ToLevelTokens(
                    Defaults.Openers.Concat(extraOpeners),
                    Defaults.Closers.Concat(extraClosers)),
                separators: FuncDefaults
                .FunctionSeparators
                .Concat(LambdaDefaults.LambdaSeparators)
                .Concat(equalsOperator)
                .Concat(exponentialOperator)
                .Concat(Defaults.Separators)
                .Concat(extraOpeners)
                .Concat(extraClosers),
                tokenFactory: new AggregateTokenFactory(
                    new ConstantNumberParser(),
                    new OperatorParser(Defaults.OperatorSymbols
                                       .Concat(equalsOperator)
                                       .Concat(exponentialOperator)),
                    new OpenerParser(Defaults.Openers
                                     .Concat(extraOpeners)),
                    new CloserParser(Defaults.Closers
                                     .Concat(extraClosers)),
                    new SeparatorParser(),
                    new FunctionParser("avg", "sum", "min", "max"),
                    new LambdaExpressionParser(),
                    new VariableParser()),
                nodeConverter: new AggregateNodeConverter(
                    new OpenerNodeConverter(),
                    new BinaryOperatorNodeConverter(Defaults.Operators
                                                    .AddEntry(equalsOperator.First(), -1)
                                                    .AddEntry(exponentialOperator.Single(), 2)
                                                    .ToDictionary(Defaults.StringEqualityComparer)),
                    new UnaryOperatorNodeConverter(),
                    new FunctionNodeConverter(),
                    new ConstantNumberNodeConverter(),
                    new VariableNodeConverter(),
                    new LambdaExpressionNodeConverter()));

            //var expression = "min(avg('t => t.Money >= 500'), allValues) ^ 2";
            //var expression = "(5+4)*max(4,-1-5.3435345,'t => cenas',sum(4.323,5,dasdasd,5,ddd,4))";
            var expression = "(5+4)*max(4,-1-5.3435345,'t => a.Coisas == \"cenas\"',sum(4.323,5,dasdasd,5,ddd,4))";
            //var expression = "(5+4)*max(--3----5)+max(4,-1-5.3435345,'t => cenas',sum(asd+4.32*3,5,dasdasd,5,ddd,4))";
            //var expression = "((5+4)*(--3----5))-4--1-5.3435345+(4.32*3-5+4)+(4---(4*3)*--5)";
            //var expression = "(5+4)*max(--3----5)+max(4,-1-5.3435345,avg(3,57,8),sum(4.32*3,5,4))";
            //var expression = "(5+4)*sum(5,8*avg(4,5,-------6,7),9,15)";

            var result        = parser.Parse(expression);
            var variableNames = result
                                .GetAll <VariableNode>()
                                .Select(t => t.Symbol)
                                .ToList();

            var values = new Dictionary <string, int>
            {
                { "dasdasd", 69 },
                { "ddd", 42 }
            };

            var replaced = result
                           .ReplaceNodes <VariableNode>(t => new ConstantNumberNode(values[t.Symbol]))
                           .ReplaceNodes <LambdaExpressionNode>(t => new NodeArrayNode(new INode[]
            {
                new ConstantNumberNode(5m),
                new ConstantNumberNode(900m),
                new ConstantNumberNode(8m),
            }));

            var root = new Root <string>(replaced, "banana");
            var lel  = JsonConvert.SerializeObject(root);

            var resultDecimal = Evaluate(root.RootNode);

            var asObj = JsonConvert.DeserializeObject <Root <string> >(lel);
        }