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)); }
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)); }
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); }
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)); } }