Exemplo n.º 1
0
        /// <summary>
        /// Traduit le jeton en code lisible.
        /// </summary>
        /// <returns></returns>
        public string ToReadableCode()
        {
            Func <string, string> getChildrenCode = delegate(string separator)
            {
                StringBuilder b = new StringBuilder();
                for (int i = 0; i < SubTokens.Count; i++)
                {
                    b.Append(SubTokens[i].ToReadableCode());
                    if (i != SubTokens.Count - 1)
                    {
                        b.Append(separator);
                    }
                }
                return(b.ToString());
            };

            Func <string, string> getChildrenCode2 = delegate(string ending)
            {
                StringBuilder b = new StringBuilder();
                for (int i = 0; i < SubTokens.Count; i++)
                {
                    b.Append(SubTokens[i].ToReadableCode());
                    b.Append(ending);
                }
                return(b.ToString());
            };

            switch (TkType)
            {
            case ExpressionTokenType.BracketList:
                return("[" + getChildrenCode(",") + "]");

            case ExpressionTokenType.FunctionCall:
                return(FunctionCallIdentifier.ToReadableCode() + "(" + FunctionCallArgs.ToReadableCode() + ")");

            case ExpressionTokenType.GenericType:
                return(GenericTypeIdentifier.ToReadableCode() + "<" + GenericTypeArgs.ToReadableCode() + ">");

            case ExpressionTokenType.ArrayType:
                return(ArrayTypeIdentifier.ToReadableCode() + "[" + ArrayTypeArgs.ToReadableCode() + "]");

            case ExpressionTokenType.List:
                return(getChildrenCode(" "));

            case ExpressionTokenType.ArgList:
                return(getChildrenCode(","));

            case ExpressionTokenType.GenericParametersList:
                return("<" + getChildrenCode(",") + ">");

            case ExpressionTokenType.Name:
                return(this.Content);

            case ExpressionTokenType.CodeBlock:
                return("{ " + getChildrenCode(",") + " }");

            case ExpressionTokenType.NamedCodeBlock:
                return(SubTokens[0].ToReadableCode() + "\n{\n" + Tools.StringUtils.Indent(SubTokens[1].ToReadableCode(), 1) + "\n}");

            case ExpressionTokenType.FunctionDeclaration:
                return(SubTokens[0].ToReadableCode() + "\n{\n" + Tools.StringUtils.Indent(SubTokens[1].ToReadableCode(), 1) + "\n}");

            case ExpressionTokenType.NamedGenericCodeBlock:
                return(NamedGenericCodeBlockIdentifier.ToReadableCode() +
                       "{\n" + Tools.StringUtils.Indent(NamedGenericCodeBlockInstructions.ToReadableCode(), 1) + "\n}");

            case ExpressionTokenType.EndOfInstruction:
                return(this.Content + "\n");

            case ExpressionTokenType.InstructionList:
                return(getChildrenCode2(";\n"));

            case ExpressionTokenType.ExpressionGroup:
                if (Operator.IsBinaryOperator)
                {
                    if (Operator.Content == "=")
                    {
                        return(Operands1.ToReadableCode() + Operator.ToReadableCode() + Operands2.ToReadableCode());
                    }
                    else
                    {
                        return("(" + Operands1.ToReadableCode() + Operator.ToReadableCode() + Operands2.ToReadableCode() + ")");
                    }
                }
                else
                {
                    return(Operator.ToReadableCode() + Operands1.ToReadableCode());
                }

            case ExpressionTokenType.NumberLiteral:
                return(this.Content);

            case ExpressionTokenType.Operator:
                return(this.Content);

            case ExpressionTokenType.Separator:
                return(this.Content);

            case ExpressionTokenType.BoolLiteral:
                return(this.Content);

            case ExpressionTokenType.StringLiteral:
                return("\"" + this.Content + "\"");

            case ExpressionTokenType.Modifier:
                return(this.Content);

            default:
                return("??");
            }
        }