public dynamic Visit(DoWhileStm stm)
        {
            LoopsCount++;
            stm.Condition  = (ExpressionBase)stm.Condition.Optimize();
            stm.Statements = (CodeBlock)stm.Statements.Optimize();
            if (!OptimizeMode.UnreacheableCode)
            {
                return(stm);
            }
            var condition = stm.Condition as LiteralExpr;

            if (condition == null)
            {
                return(stm);
            }
            switch (stm.Type)
            {
            case LoopType.While:
                return(condition.Value ? stm : null);

            case LoopType.DoWhile:
                return(condition.Value ? (dynamic)stm : stm.Statements);
            }
            LoopsCount--;
            return(stm);
        }
 public dynamic Visit(DoWhileStm stm)
 {
     _codeGen.While(Visit((dynamic)stm.Condition));
     {
         Visit((dynamic)stm.Statements);
     }
     _codeGen.End();
     return(null);
 }
Beispiel #3
0
        /// <summary>
        /// Rule: DoStm -> DO Statements WHILE Expr ;
        /// </summary>
        protected override object EvalDoStm(ParseTree tree, params object[] paramlist)
        {
            var whileDoStm = new DoWhileStm
            {
                Condition  = (ExpressionBase)GetNode(TokenType.Expr)?.Eval(tree),
                Statements = (CodeBlock)GetNode(TokenType.Statements).Eval(tree),
                Type       = LoopType.DoWhile,
                Node       = this
            };

            return(whileDoStm);
        }
Beispiel #4
0
        public dynamic Visit(DoWhileStm stm)
        {
            var node = new TreeNode(stm.Type.ToString())
            {
                Tag = stm.Node
            };

            node.Nodes.Add(new TreeNode("Condition")
            {
                Nodes = { Visit((dynamic)stm.Condition) }
            });
            node.Nodes.Add(new TreeNode("Statements")
            {
                Nodes = { Visit(stm.Statements) }
            });
            return(node);
        }
 public dynamic Visit(DoWhileStm stm)
 {
     return(null);
 }
        public dynamic Visit(ForStm stm)
        {
            LoopsCount++;
            stm.AssignExpression = Visit(stm.AssignExpression);
            stm.Statements       = Visit(stm.Statements);
            stm.ToExpression     = Visit(stm.ToExpression);
            if (stm.IncByExpression != null)
            {
                stm.IncByExpression = Visit(stm.IncByExpression);
            }
            var strNamespace = Namespaces.Current;

            Namespaces.Current = stm.Namespace;
            stm.Variable       = Visit(stm.Variable);
            if (OptimizeMode.LoopExpansion)
            {
                var assignExpr = stm.AssignExpression as LiteralExpr;
                var toExpr     = stm.ToExpression as LiteralExpr;
                if (toExpr != null && assignExpr != null && assignExpr.GetExprType() == SymbolType.Integer)
                {
                    int startValue = assignExpr.Value;
                    int toValue    = toExpr.Value;
                    int incByValue = 1;
                    if (stm.IncByExpression != null)
                    {
                        incByValue = ((LiteralExpr)Visit((dynamic)stm.IncByExpression))?.Value ?? 1;
                    }

                    var steps = (toValue - startValue) / incByValue;
                    if (steps >= 0 && steps < OptimizeMode.LoopExpansionRepeatLimit)
                    {
                        var block = new CodeBlock {
                            Namespace = stm.Namespace, Node = stm.Node, Statements = new List <StatementBase>()
                        };
                        for (var i = startValue; i <= toValue; i += incByValue)
                        {
                            var assig = Visit(new CallOrAssign
                            {
                                Namespace        = stm.AssignExpression.Namespace,
                                Node             = stm.AssignExpression.Node,
                                AssignExpression = new LiteralExpr {
                                    Namespace = stm.Namespace, SymbolType = stm.Variable.VariableType, Value = i
                                },
                                LeftSideExpr = new LeftSideExprVariable
                                {
                                    Name         = stm.Variable.Name,
                                    Namespace    = stm.Variable.Namespace,
                                    Type         = LeftSideExprType.Variable,
                                    VariableType = stm.Variable.VariableType
                                }
                            });
                            block.Statements.Add(assig);
                            block.Statements.AddRange(Visit(stm.Statements).Statements);
                        }
                        Namespaces.Current = strNamespace;
                        LoopsCount--;
                        return(block);
                    }
                }
            }

            var assign = new CallOrAssign
            {
                Namespace        = stm.Namespace,
                Node             = stm.AssignExpression.Node,
                AssignExpression = stm.AssignExpression,
                LeftSideExpr     = new LeftSideExprVariable
                {
                    Name         = stm.Variable.Name,
                    Namespace    = stm.Namespace,
                    Type         = LeftSideExprType.Variable,
                    VariableType = stm.Variable.VariableType
                }
            };

            var loopBody = new CodeBlock
            {
                Namespace  = stm.Namespace,
                Node       = stm.Node,
                Statements = new List <StatementBase>
                {
                    stm.Statements,
                    new CallOrAssign
                    {
                        Namespace        = stm.Namespace,
                        Node             = stm.AssignExpression.Node,
                        AssignExpression = Visit(new AddExpr
                        {
                            First = new GetVariableExpr
                            {
                                Name = assign.LeftSideExpr.Name, Type = stm.Variable.VariableType
                            },
                            Second = stm.IncByExpression ?? new LiteralExpr
                            {
                                SymbolType = SymbolType.Integer,
                                Value      = 1
                            },
                            OperationText = "+",
                            Namespace     = stm.Namespace
                        }),
                        LeftSideExpr = new LeftSideExprVariable
                        {
                            Name         = stm.Variable.Name,
                            Namespace    = stm.Namespace,
                            Type         = LeftSideExprType.Variable,
                            VariableType = stm.Variable.VariableType
                        }
                    }
                }
            };

            var loop = new DoWhileStm
            {
                Namespace = stm.Namespace,
                Condition = Visit(new CompareExpr
                {
                    First = Visit(new GetVariableExpr {
                        Name = assign.LeftSideExpr.Name, Type = stm.Variable.VariableType, Namespace = stm.Namespace
                    }),
                    OperationText = "<=",
                    Second        = stm.ToExpression,
                    Namespace     = stm.Namespace
                }),
                Statements = loopBody,
                Type       = LoopType.While
            };

            var outerBlock = new CodeBlock
            {
                Statements = new List <StatementBase>(),
                Namespace  = stm.Namespace
            };

            outerBlock.Statements.Add(assign);
            outerBlock.Statements.Add(loop);

            Namespaces.Current = strNamespace;
            LoopsCount--;
            return(outerBlock);
        }