public static IEnumerable <Statement> GetSubStatements(this Statement statement)
 {
     if (statement is IfStatement)
     {
         IfStatement ifStatement = (IfStatement)statement;
         return(ifStatement.ThenStatements.GetStatements()
                .Concat(ifStatement.ElseIfStatements.GetStatements())
                .Concat(ifStatement.ElseStatements.GetStatements()));
     }
     else if (statement is ElseIfStatement)
     {
         ElseIfStatement elseIfStatement = (ElseIfStatement)statement;
         return(elseIfStatement.ThenStatements.GetStatements());
     }
     else if (statement is ForStatement)
     {
         ForStatement forStatement = (ForStatement)statement;
         return(forStatement.ForBody.GetStatements());
     }
     else if (statement is WhileStatement)
     {
         WhileStatement whileStatement = (WhileStatement)statement;
         return(whileStatement.WhileBody.GetStatements());
     }
     else if (statement is SubroutineStatement)
     {
         SubroutineStatement subroutineStatement = (SubroutineStatement)statement;
         return(subroutineStatement.SubroutineBody.GetStatements());
     }
     return(new Statement[0]);
 }
Esempio n. 2
0
            public object VisitSubroutineStatement(SubroutineStatement s, object context)
            {
                StringBuilder.Append(s.Name.Content);
                StringBuilder.Append("(");
                int i = 0;

                foreach (Token param in s.Parameters)
                {
                    if (i > 0)
                    {
                        StringBuilder.Append(", ");
                    }
                    StringBuilder.Append(param.Content);
                    i++;
                }
                StringBuilder.Append(") ");
                s.Body.AcceptVisitor(this, context);
                return(null);
            }
        private static string Dump(this IEnumerable <Statement> statements, string ident = "")
        {
            StringWriter writer = new StringWriter();

            foreach (Statement statement in statements)
            {
                writer.WriteLine($"{ident}{statement.GetType().Name} --> {(statement.HasCompiler() ? statement.Compiler().ToString() : "NO COMPILER")}");
                if (statement is EmptyStatement)
                {
                    writer.WriteLine($"{ident}-----> Comment: {((EmptyStatement)statement).EndingComment.Dump()}");
                }
                else if (statement is AssignmentStatement)
                {
                    var leftValue  = ((AssignmentStatement)statement).LeftValue;
                    var rightValue = ((AssignmentStatement)statement).RightValue;
                    writer.WriteLine($"{ident}-----> LEFT: {leftValue.Dump()}");
                    if (leftValue is ArrayExpression)
                    {
                        ArrayExpression arrayExpression = (ArrayExpression)leftValue;
                        writer.WriteLine($"{ident}----->   ARRAY LeftHand: ({arrayExpression.LeftHand.Dump()}");
                        writer.WriteLine($"{ident}----->   ARRAY Indexer: ({arrayExpression.Indexer.Dump()}");
                        DumpValueExpression(writer, arrayExpression.Indexer, ident);
                    }
                    writer.WriteLine($"{ident}-----> RIGHT: {rightValue.Dump()}");
                    DumpValueExpression(writer, rightValue, ident);
                }
                else if (statement is MethodCallStatement)
                {
                    writer.WriteLine($"{ident}-----> Expression: {((MethodCallStatement)statement).MethodCallExpression.Dump()}");
                    DumpValueExpression(writer, ((MethodCallStatement)statement).MethodCallExpression, ident);
                }
                else if (statement is IfStatement)
                {
                    IfStatement ifStatement = (IfStatement)statement;
                    writer.WriteLine($"{ident}-----> Condition: {ifStatement.Condition} {ifStatement.Condition.Dump()}");
                    DumpValueExpression(writer, ifStatement.Condition, ident);
                    writer.WriteLine($"{ident}-----> ThenStatements <-----");
                    writer.Write(ifStatement.ThenStatements.Dump(ident + "    "));
                    writer.WriteLine($"{ident}-----> ElseIfStatements <-----");
                    writer.Write(ifStatement.ElseIfStatements.Dump(ident + "    "));
                    writer.WriteLine($"{ident}-----> ElseStatements <-----");
                    writer.Write(ifStatement.ElseStatements.Dump(ident + "    "));
                    writer.WriteLine($"{ident}-----> EndIf <-----");
                }
                else if (statement is ElseIfStatement)
                {
                    ElseIfStatement elseIfStatement = (ElseIfStatement)statement;
                    writer.WriteLine($"{ident}-----> Condition: {elseIfStatement.Condition} {elseIfStatement.Condition.Dump()}");
                    DumpValueExpression(writer, elseIfStatement.Condition, ident);
                    writer.WriteLine($"{ident}-----> ElseIfStatements <-----");
                    writer.Write(elseIfStatement.ThenStatements.Dump(ident + "    "));
                }
                else if (statement is ForStatement)
                {
                    ForStatement forStatement = (ForStatement)statement;
                    writer.WriteLine($"{ident}-----> Iterator: {forStatement.Iterator} {forStatement.Iterator.Dump()}");
                    writer.WriteLine($"{ident}-----> ForBody <-----");
                    writer.Write(forStatement.ForBody.Dump(ident + "    "));
                    writer.WriteLine($"{ident}-----> EndFor <-----");
                }
                else if (statement is WhileStatement)
                {
                    WhileStatement whileStatement = (WhileStatement)statement;
                    writer.WriteLine($"{ident}-----> Condition: {whileStatement.Condition} {whileStatement.Condition.Dump()}");
                    DumpValueExpression(writer, whileStatement.Condition, ident);
                    writer.WriteLine($"{ident}-----> WhileBody <-----");
                    writer.Write(whileStatement.WhileBody.Dump(ident + "    "));
                    writer.WriteLine($"{ident}-----> EndWhile <-----");
                }
                else if (statement is SubroutineStatement)
                {
                    SubroutineStatement subroutineStatement = (SubroutineStatement)statement;
                    writer.WriteLine($"{ident}-----> SubroutineName: {subroutineStatement.SubroutineName}");
                    writer.WriteLine($"{ident}-----> SubroutineBody <-----");
                    writer.Write(subroutineStatement.SubroutineBody.Dump(ident + "    "));
                    writer.WriteLine($"{ident}-----> EndSubroutine <-----");
                }
                else
                {
                    writer.WriteLine($"{ident}-----> {statement.ToString().Trim('\n', '\r')}");
                }
            }

            return(writer.ToString());
        }