private void CheckForStatement(ASTForStatementNode forNode) { //check counter if (forNode.Counter is ASTVariableNode varNode) { CheckVariable(varNode); } if (forNode.Counter is ASTAssignStatementNode assignNode) { CheckAssignStatement(assignNode); } //check condition CheckExpression(forNode.Condition); CheckImplicitCast(forNode.Condition, typeof(bool)); //check step if his defined if (forNode.Step != null) { CheckExpression(forNode.Step); CheckImplicitCast(forNode.Step, typeof(decimal)); } //checkbody if (forNode.Body != null) { _inLoop = true; CheckBody(forNode.Body); _inLoop = false; } }
/// <summary> /// Builds for loop statement /// </summary> /// <param name="forNode">For loop node</param> private void BuildForStatement(ASTForStatementNode forNode) { var condition = _emitter.DefineLabel(); var exitFor = _emitter.DefineLabel(); ASTVariableNode counter = null; //init counter if needed if (forNode.Counter is ASTAssignStatementNode assignNode) { BuildStatement(assignNode); counter = (ASTVariableNode)assignNode.Left; } else { counter = (ASTVariableNode)forNode.Counter; } //check condition _emitter.MarkLabel(condition); BuildExpression(forNode.Condition); _emitter.JumpFalse(exitFor); //body _loopsEnds.Push(exitFor); if (forNode.Body != null) { BuildStatement(forNode.Body); } _loopsEnds.Pop(); //load counter BuildExpression(counter); _emitter.ToDecimal(); //build step if (forNode.Step != null) { BuildExpression(forNode.Step); if (_emitter.StackPeek() != typeof(decimal)) { _emitter.ToDecimal(); } } else //default step { _emitter.PushLong(1); _emitter.ToDecimal(); } //update counter _emitter.StaticCall(typeof(decimal), "Add", new Type[] { typeof(decimal), typeof(decimal) }); _emitter.Box(); Store(counter.Name); //jump to condition _emitter.Jump(condition); //exit _emitter.MarkLabel(exitFor); }
private void VisitForStatement(ASTForStatementNode forStmt) { if (forStmt.Counter is ASTVariableNode varNode) { VisitVariable(varNode); } if (forStmt.Counter is ASTAssignStatementNode assignStmt) { VisitAssignStatement(assignStmt); } if (forStmt.Body != null) { VisitBodyStatement(forStmt.Body); } }
public override void ExitForStatement([NotNull] CmanParser.ForStatementContext context) { ASTBodyStatementNode body = null; IASTExprNode step = null; IASTExprNode cond = null; ASTNode counter = null; Queue <ASTNode> childs = new Queue <ASTNode>(); while (!(_nodes.Peek() is ASTForStatementNode)) { childs.Enqueue(_nodes.Pop()); //childs.Push(_nodes.Pop()); } //has body if (childs.Peek() is ASTBodyStatementNode) { body = (ASTBodyStatementNode)childs.Dequeue(); } int childCount = childs.Count(); //counter, condition, step if (childCount == 3) { step = (IASTExprNode)childs.Dequeue(); } cond = (IASTExprNode)childs.Dequeue(); counter = childs.Dequeue(); ASTForStatementNode forNode = (ASTForStatementNode)_nodes.Peek(); forNode.Counter = counter; forNode.Condition = cond; forNode.Step = step; forNode.Body = body; }