Exemple #1
0
        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);
        }
Exemple #2
0
        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();
        }
Exemple #3
0
 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;
 }
Exemple #5
0
        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);
            }
        }
Exemple #6
0
 public void VisitDo(DoNode node)
 {
     VisitDoHandler(node);
 }
Exemple #7
0
 public DoNodeTests()
 {
     condition = new IdentNode(SourcePosition.NIL, "foo");
     code      = new BlockNode(SourcePosition.NIL);
     subject   = new DoNode(SourcePosition.NIL, condition, code);
 }