示例#1
0
        public override IValue Eval(IValue[] parameters)
        {
            this.Validate(parameters);

            var set       = parameters[0].AsSet;
            var res       = new ListArray();
            var i         = new Variable(parameters[1].AsString, new DoubleValue(0));
            var evaluator = default(PostFixEvaluator);

            this.Context.VariableManager.Define(i);

            try
            {
                var tokenizer = new Tokenizer(parameters[2].AsString, this.Context.Config);
                tokenizer.Run();
                var parser = new Parser(tokenizer.Tokens, this.Context.Config);
                evaluator = new PostFixEvaluator(parser.CreatePostFixExpression(), this.Context);
            }
            catch (System.Exception)
            {
                throw new OperandEvaluationException();
            }

            foreach (var item in set)
            {
                i.Value = item;
                if (evaluator.Run().AsDouble != 0)
                {
                    res.Add(item);
                }
            }

            return(new ArrayValue(res));
        }
示例#2
0
        public override IValue Eval(IValue[] parameters)
        {
            this.Validate(parameters);

            var add       = parameters[0].AsString == "+";
            var count     = (int)parameters[1].AsDouble;
            var res       = 0.0;
            var evaluator = default(PostFixEvaluator);
            var counter   = new Variable(parameters[2].AsString, new DoubleValue(0));

            this.Context.VariableManager.Define(counter);

            try
            {
                var tokenizer = new Tokenizer(parameters[3].AsString, this.Context.Config);
                tokenizer.Run();
                var parser = new Parser(tokenizer.Tokens, this.Context.Config);
                evaluator = new PostFixEvaluator(parser.CreatePostFixExpression(), this.Context);
            }
            catch (System.Exception)
            {
                throw new OperandEvaluationException();
            }

            for (var i = 0; i < count; i++)
            {
                counter.Value = new DoubleValue(i);
                var aggregate = evaluator.Run();

                if (aggregate.Type != ValueType.Number)
                {
                    throw new OperandEvaluationException();
                }

                if (add)
                {
                    res += aggregate.AsDouble;
                }
                else
                {
                    res *= aggregate.AsDouble;
                }
            }

            this.Context.VariableManager.Remove(counter.Name);

            return(new DoubleValue(res));
        }
示例#3
0
        public override IValue Eval(IValue[] parameters)
        {
            this.Validate(parameters);

            var set       = parameters[0].AsSet;
            var evaluator = default(PostFixEvaluator);
            var i         = this.Context.VariableManager.CreateTempVariable();
            var res       = this.Context.VariableManager.CreateTempVariable();

            try
            {
                var tokenizer = new Tokenizer(parameters[2].AsString, this.Context.Config);
                tokenizer.Run();
                var tokens = new List <Token>();

                tokens.Add(new Token(TokenType.FunctionStart, new Functions.DefaultFunctions.Util.Set().Name));
                tokens.Add(new Token(TokenType.String, res.Name));
                tokens.Add(new Token(TokenType.Seperator, ","));
                tokens.Add(new Token(TokenType.Identifier, res.Name));
                tokens.AddRange(tokenizer.Tokens);
                tokens.Add(new Token(TokenType.Identifier, i.Name));
                tokens.Add(new Token(TokenType.FunctionEnd));

                var parser = new Parser(tokens, this.Context.Config);
                evaluator = new PostFixEvaluator(parser.CreatePostFixExpression(), this.Context);
            }
            catch (System.Exception)
            {
                throw new OperandEvaluationException();
            }

            foreach (var item in set)
            {
                i.Value = item;
                evaluator.Run();
            }

            this.Context.VariableManager.Remove(i.Name);
            this.Context.VariableManager.Remove(res.Name);

            return(res.Value);
        }
示例#4
0
        public IValue Calculate(string expression)
        {
            var config = this.context.Config.Clone();
            var value  = default(IValue);

            try
            {
                var tokenizer = new Tokenizer(expression, config);
                tokenizer.Run();
                var parser    = new Parser(tokenizer.Tokens, config);
                var evaluater = new PostFixEvaluator(parser.CreatePostFixExpression(), this.context);
                value = evaluater.Run();
                return(value);
            }
            catch (TokenizerException t)
            {
                return(new ErrorValue(t));
            }
            catch (ParserException p)
            {
                return(new ErrorValue(p));
            }
        }