Esempio n. 1
0
        public static string GetTokensExpression(List <Token> tokens, ref Any alreadyEvaluatedValue)
        {
            string expression = "";

            for (int i = 0; i < tokens.Count; i++)
            {
                string identifier = tokens[i].identifier;

                Type objectType = null;
                if (tokens[i].type == TokenType.VariableIdentifier)
                {
                    Variable var = Interpreter.Vars[identifier];
                    identifier = Modules.Main._ToString(var.Value);                     // replace variable name with it's value
                    objectType = var.Type;
                }

                switch (tokens[i].type)
                {
                case TokenType.WhileConditional:
                case TokenType.IfConditional:
                case TokenType.EndBracket:
                    continue;
                }

                if (tokens[i].type == TokenType.FunctionCall)
                {
                    BaseFunction func     = Interpreter.Functions[identifier];
                    Any          returned = func.Invoke(identifier);
                    objectType = func.ReturnType;

                    if (tokens.Count == 1)
                    {
                        alreadyEvaluatedValue = returned;
                        return("");
                    }

                    if (returned != null)
                    {
                        identifier = Modules.Main._ToString(returned.Value);                         // replace function call with it's return value
                    }
                    else
                    {
                        identifier = "";
                    }
                }
                else if (tokens[i].type == TokenType.FunctionChain)
                {
                    Any evaluatedChain = FunctionChain.Evaluate(identifier);

                    if (tokens.Count == 1)
                    {
                        alreadyEvaluatedValue = evaluatedChain;
                        return("");
                    }

                    identifier = Modules.Main._ToString(evaluatedChain.Value);
                    objectType = FunctionChain.GetType(tokens[i].identifier);
                }

                if (tokens[i].type == TokenType.StringLiteral || objectType == Types.String)
                {
                    identifier = "\"" + identifier.Replace("\"", "\\\"") + "\"";
                }
                else if (tokens[i].type == TokenType.CharacterLiteral || objectType == Types.Character)
                {
                    identifier = "\'" + identifier + "\'";
                }

                expression += identifier + (i < tokens.Count - 1 ? " " : "");
            }

            return(expression);
        }