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); }
/// <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); }
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); }