private void OutputStatement(Definition.Statement s) { if (s == null) { WriteLine("/* debug: null statement */"); } else if (s is Definition.BlockStatement) { var s2 = (Definition.BlockStatement)s; OutputStatements(s2.Statements); } else if (s is Definition.ContinueStatement) { WriteLine("continue;"); } else if (s is Definition.BreakStatement) { WriteLine("break;"); } else if (s is Definition.ExpressionStatement) { var s2 = (Definition.ExpressionStatement)s; WriteLine("{0};", GetExpression(s2.Expression)); } else if (s is Definition.ForeachStatement) { var s2 = (Definition.ForeachStatement)s; WriteLine("for({0} {1}: {2})", GetTypeSpecifier(s2.Type), s2.Name, GetExpression(s2.Value)); WriteLine("{{"); IndentDepth++; OutputStatement(s2.Statement); IndentDepth--; WriteLine("}}"); } else if (s is Definition.ForStatement) { var s2 = (Definition.ForStatement)s; WriteLine("for({0} {1} = {2}; {3}; {4})", GetTypeSpecifier(s2.Declaration.Type), s2.Declaration.Name, GetExpression(s2.Declaration.Value), GetExpression(s2.Condition), GetExpression(s2.Incrementor)); WriteLine("{{"); IndentDepth++; OutputStatement(s2.Statement); IndentDepth--; WriteLine("}}"); } else if (s is Definition.WhileStatement) { var s2 = (Definition.WhileStatement)s; WriteLine("while({0})", GetExpression(s2.Condition)); WriteLine("{{"); IndentDepth++; OutputStatement(s2.Statement); IndentDepth--; WriteLine("}}"); WriteLine(""); } else if (s is Definition.IfStatement) { var s2 = (Definition.IfStatement)s; WriteLine("if({0})", GetExpression(s2.Condition)); WriteLine("{{"); IndentDepth++; OutputStatement(s2.TrueStatement); IndentDepth--; if (s2.FalseStatement != null) { WriteLine("}}"); WriteLine("else"); WriteLine("{{"); IndentDepth++; OutputStatement(s2.FalseStatement); IndentDepth--; WriteLine("}}"); } else { WriteLine("}}"); } } else if (s is Definition.ReturnStatement) { var s2 = (Definition.ReturnStatement)s; WriteLine("return {0};", GetExpression(s2.Return)); } else if (s is Definition.VariableDeclarationStatement) { MakeIndent(); var s2 = (Definition.VariableDeclarationStatement)s; Res.AppendFormat("{0} {1}", GetTypeSpecifier(s2.Type), s2.Name); if (s2.Value != null) { Res.AppendFormat(" = {0};\r\n", GetExpression(s2.Value)); } else { Res.AppendLine(";"); } } else if (s is Definition.LockStatement) { var s2 = (Definition.LockStatement)s; WriteLine("synchronized({0})", GetExpression(s2.Expression)); WriteLine("{{"); IndentDepth++; OutputStatement(s2.Statement); IndentDepth--; WriteLine("}}"); } else if (s is Definition.CommentStatement) { var s2 = (Definition.CommentStatement)s; WriteLine("// {0}", s2.Text); } else { throw new NotImplementedException("unknown statement " + s.GetType().ToString()); } }
void Edit(Func <object, Tuple <bool, object> > func, ICollection <Definition.Statement> arr) { for (int i = 0; i < arr.Count; i++) { var r = func(arr.ElementAt(i)); if (r.Item2 != null) { if (arr is Definition.Statement[]) { var arrr = ((Definition.Statement[])arr)[i]; ((Definition.Statement[])arr)[i] = (Definition.Statement)r.Item2; } if (arr is List <Definition.Statement> ) { ((List <Definition.Statement>)arr)[i] = (Definition.Statement)r.Item2; } if (!r.Item1) { continue; } } var s = arr.ElementAt(i); if (s == null) { } else if (s is Definition.BlockStatement) { var s_ = s as Definition.BlockStatement; Edit(func, s_.Statements); } else if (s is Definition.VariableDeclarationStatement) { var s_ = s as Definition.VariableDeclarationStatement; Edit(func, ref s_.Type); Edit(func, ref s_.Value); } else if (s is Definition.ForeachStatement) { var s_ = s as Definition.ForeachStatement; Edit(func, ref s_.Type); Edit(func, ref s_.Value); Edit(func, ref s_.Statement); } else if (s is Definition.ForStatement) { var s_ = s as Definition.ForStatement; { Definition.Statement st = s_.Declaration; Edit(func, ref st); s_.Declaration = st as Definition.VariableDeclarationStatement; } Edit(func, ref s_.Condition); Edit(func, ref s_.Incrementor); Edit(func, ref s_.Statement); } else if (s is Definition.WhileStatement) { var s_ = s as Definition.WhileStatement; Edit(func, ref s_.Condition); Edit(func, ref s_.Statement); } else if (s is Definition.IfStatement) { var s_ = s as Definition.IfStatement; Edit(func, ref s_.Condition); Edit(func, ref s_.TrueStatement); Edit(func, ref s_.FalseStatement); } else if (s is Definition.ReturnStatement) { var s_ = s as Definition.ReturnStatement; Edit(func, ref s_.Return); } else if (s is Definition.ContinueStatement) { } else if (s is Definition.BreakStatement) { } else if (s is Definition.ExpressionStatement) { var s_ = s as Definition.ExpressionStatement; Edit(func, ref s_.Expression); } else if (s is Definition.LockStatement) { var s_ = s as Definition.LockStatement; Edit(func, ref s_.Expression); Edit(func, ref s_.Statement); } else if (s is Definition.CommentStatement) { } else { throw new Exception(); } } }
Definition.Statement ConvertTypeName(Definition.Statement s) { if (s == null) { return(s); } if (s is Definition.BlockStatement) { var s_ = s as Definition.BlockStatement; s_.Statements = s_.Statements.Select(_ => ConvertTypeName(_)).ToArray(); return(s_); } else if (s is Definition.VariableDeclarationStatement) { var s_ = s as Definition.VariableDeclarationStatement; s_.Type = ConvertTypeName(s_.Type); s_.Value = ConvertTypeName(s_.Value); return(s_); } else if (s is Definition.ForeachStatement) { var s_ = s as Definition.ForeachStatement; s_.Type = ConvertTypeName(s_.Type); s_.Value = ConvertTypeName(s_.Value); s_.Statement = ConvertTypeName(s_.Statement); return(s_); } else if (s is Definition.ForStatement) { var s_ = s as Definition.ForStatement; s_.Declaration = ConvertTypeName(s_.Declaration) as Definition.VariableDeclarationStatement; s_.Condition = ConvertTypeName(s_.Condition); s_.Incrementor = ConvertTypeName(s_.Incrementor); s_.Statement = ConvertTypeName(s_.Statement); return(s_); } else if (s is Definition.WhileStatement) { var s_ = s as Definition.WhileStatement; s_.Condition = ConvertTypeName(s_.Condition); s_.Statement = ConvertTypeName(s_.Statement); return(s_); } else if (s is Definition.IfStatement) { var s_ = s as Definition.IfStatement; s_.Condition = ConvertTypeName(s_.Condition); s_.TrueStatement = ConvertTypeName(s_.TrueStatement); s_.FalseStatement = ConvertTypeName(s_.FalseStatement); return(s_); } else if (s is Definition.ReturnStatement) { var s_ = s as Definition.ReturnStatement; s_.Return = ConvertTypeName(s_.Return); return(s_); } else if (s is Definition.ContinueStatement) { return(s); } else if (s is Definition.BreakStatement) { return(s); } else if (s is Definition.ExpressionStatement) { var s_ = s as Definition.ExpressionStatement; s_.Expression = ConvertTypeName(s_.Expression); return(s_); } else if (s is Definition.LockStatement) { var s_ = s as Definition.LockStatement; s_.Expression = ConvertTypeName(s_.Expression); s_.Statement = ConvertTypeName(s_.Statement); return(s_); } else if (s is Definition.CommentStatement) { return(s); } throw new Exception(); }
void Edit(Func <object, Tuple <bool, object> > func, ref Definition.Statement arr) { var r = func(arr); if (r.Item2 != null) { arr = (Definition.Statement)r.Item2; if (!r.Item1) { return; } } var s = arr; if (s == null) { } else if (s is Definition.BlockStatement) { var s_ = s as Definition.BlockStatement; Edit(func, s_.Statements); } else if (s is Definition.VariableDeclarationStatement) { var s_ = s as Definition.VariableDeclarationStatement; Edit(func, ref s_.Type); Edit(func, ref s_.Value); } else if (s is Definition.ForeachStatement) { var s_ = s as Definition.ForeachStatement; Edit(func, ref s_.Type); Edit(func, ref s_.Value); Edit(func, ref s_.Statement); } else if (s is Definition.ForStatement) { var s_ = s as Definition.ForStatement; { Definition.Statement st = s_.Declaration; Edit(func, ref st); s_.Declaration = st as Definition.VariableDeclarationStatement; } Edit(func, ref s_.Condition); Edit(func, ref s_.Incrementor); Edit(func, ref s_.Statement); } else if (s is Definition.WhileStatement) { var s_ = s as Definition.WhileStatement; Edit(func, ref s_.Condition); Edit(func, ref s_.Statement); } else if (s is Definition.IfStatement) { var s_ = s as Definition.IfStatement; Edit(func, ref s_.Condition); Edit(func, ref s_.TrueStatement); Edit(func, ref s_.FalseStatement); } else if (s is Definition.ReturnStatement) { var s_ = s as Definition.ReturnStatement; Edit(func, ref s_.Return); } else if (s is Definition.ContinueStatement) { } else if (s is Definition.BreakStatement) { } else if (s is Definition.ExpressionStatement) { var s_ = s as Definition.ExpressionStatement; Edit(func, ref s_.Expression); } else if (s is Definition.LockStatement) { var s_ = s as Definition.LockStatement; Edit(func, ref s_.Expression); Edit(func, ref s_.Statement); } else { throw new Exception(); } }