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]); }
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()); }