예제 #1
0
        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());
            }
        }
예제 #2
0
        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();
                }
            }
        }
예제 #3
0
        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();
        }
예제 #4
0
        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();
            }
        }