private Expression MakeExpressionRecursive(List <Token> tokens, ref int pointer) { Expression expression = new Expression(runtimeControl); for (;; pointer++) { if (pointer >= tokens.Count) { MakeTreeInExpression(expression); return(expression); } Token token = tokens[pointer]; switch (token.TokenType) { case TokenType.StartExpr: pointer++; Expression subExp = MakeExpressionRecursive(tokens, ref pointer); ArgumentsExpression argumentException = new ArgumentsExpression(runtimeControl); argumentException.AddExpressions(subExp.SubExpressions); expression.AddExpression(argumentException); continue; case TokenType.EndExpr: MakeTreeInExpression(expression); return(expression); case TokenType.ComplexFunction: ComplexFunctionBase complexFunction = functions.GetComplexFunction(token.TokenString); expression.AddExpression(new ComplexFunctionExpression(runtimeControl, token, complexFunction)); break; case TokenType.Operation: OperationFunctionBase operationFunction = functions.GetOperation(token.TokenString); expression.AddExpression(new OperationExpression(runtimeControl, token, operationFunction)); break; case TokenType.Function: FunctionBase function = functions.GetFunction(token.TokenString); expression.AddExpression(new FunctionExpression(runtimeControl, token, function)); break; case TokenType.Numeric: expression.AddExpression(new ConstExpression(runtimeControl, token)); break; case TokenType.Text: expression.AddExpression(new ConstExpression(runtimeControl, token)); break; case TokenType.Variable: expression.AddExpression(new VariableExpression(runtimeControl, token, vars)); break; case TokenType.Separator: break; default: throw new ParseException($"Token type '{token.TokenType}' not supported!"); } } }
public ComplexFunctionExpression(IFunctionRuntimeControl internalControl, Token token, ComplexFunctionBase function) : base(internalControl, token) { this.Function = function ?? throw new ArgumentNullException("Function can't be null!"); }