Example #1
0
        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!");
 }