public void Visit(DoNode doNode) { doNode.Body.Parent = doNode; doNode.Condition.Parent = doNode; var loop = _currentLoop; _currentLoop = LoopType.Loop; doNode.Body.Accept(this); _currentLoop = loop; doNode.Condition.Accept(this); }
public void VisitDo(DoNode node) { UpdateLine(node); PushScope(); var start = asm.NewLabel(); var end = asm.NewLabel(); var codeEnd = asm.NewLabel(); asm.MarkLabel(start); PushLoop(start, end, codeEnd); node.Code.Accept(this); asm.MarkLabel(codeEnd); node.Condition.Accept(this); asm.Branch(start); PopLoop(); PopScope(); }
private RuntimeResult VisitDoNode(DoNode node, Context context) { Values.Value output = new Values.NullValue().SetPositionAndContext(node.Position, context); while (true) { RuntimeResult bodyResult = Visit(node.Body, context); if (bodyResult.HasError) { return(bodyResult); } output = bodyResult.Value; RuntimeResult condResult = Visit(node.Condition, context); if (condResult.HasError) { return(condResult); } if (!condResult.Value.GetAsBoolean()) { break; } } return(new RuntimeResult(output)); }
public DoCompiler(DoNode node) { this.node = node; }
private void addBlockNodes(XmlNodeList list, BaseNode lastNode, BaseNode parentNode) { foreach (XmlNode node in list) { BaseNode newNode = null; if (node.Name.Equals("End")) { newNode = endNode; } else if (node.Name.Equals("Start")) { newNode = startNode; } else if (node.Name.Equals("Assign")) { newNode = new AssignNode(); } else if (node.Name.Equals("Declare")) { newNode = new DeclareNode(); } else if (node.Name.Equals("Input")) { newNode = new InputNode(); } else if (node.Name.Equals("Output")) { newNode = new OutputNode(); } else if (node.Name.Equals("If")) { newNode = new IfNode(); setAttributes(node, newNode); addBlockNodes(node.FirstChild.ChildNodes, ((DecisionNode)newNode).TrueNode, newNode); } else if (node.Name.Equals("IfElse")) { newNode = new IfElseNode(); setAttributes(node, newNode); addBlockNodes(node.FirstChild.ChildNodes, ((IfElseNode)newNode).TrueNode, newNode); addBlockNodes(node.LastChild.ChildNodes, ((IfElseNode)newNode).FalseNode, newNode); } else if (node.Name.Equals("While")) { newNode = new WhileNode(); setAttributes(node, newNode); addBlockNodes(node.FirstChild.ChildNodes, ((DecisionNode)newNode).TrueNode, newNode); } else if (node.Name.Equals("DoWhile")) { newNode = new DoNode(); setAttributes(node, newNode); addBlockNodes(node.FirstChild.ChildNodes, ((DecisionNode)newNode).TrueNode, newNode); } else if (node.Name.Equals("For")) { newNode = new ForNode(); setAttributes(node, newNode); addBlockNodes(node.FirstChild.ChildNodes, ((DecisionNode)newNode).TrueNode, newNode); } else { showErrorMessage("Error not valid file"); } if (!(node.Name.Equals("Start") || node.Name.Equals("End"))) { BaseNode oldNode = lastNode.OutConnector.EndNode; lastNode.OutConnector.EndNode = newNode; newNode.OutConnector.EndNode = oldNode; newNode.addToModel(); newNode.ParentNode = parentNode; } lastNode = newNode; blockNodes.Add(new Pair(node, newNode)); setAttributes(node, newNode); } }
public void VisitDo(DoNode node) { VisitDoHandler(node); }
public DoNodeTests() { condition = new IdentNode(SourcePosition.NIL, "foo"); code = new BlockNode(SourcePosition.NIL); subject = new DoNode(SourcePosition.NIL, condition, code); }