예제 #1
0
        protected override BoundStatement RewriteWhileStatement(BoundWhileStatement node)
        {
            // while <condition>
            //      body
            //
            // --> becomes
            //
            // goto check
            // continue:
            // <body>
            // check:
            // gotoTrue <condition> continue
            // end:
            var continueLabel = GenerateLabel();
            var checkLabel    = GenerateLabel();
            var endLabel      = GenerateLabel();
            var gotoLabel     = GenerateLabel();

            var gotoCheck = new BoundGoToStatement(checkLabel);
            var continueLabelStatement = new BoundLabelStatement(continueLabel);
            var checkLabelStatement    = new BoundLabelStatement(checkLabel);
            var ebdLabelStatement      = new BoundLabelStatement(endLabel);
            var gotoTrue          = new BoundConditionalGotoStatement(continueLabel, node.Condition);
            var endLabelStatement = new BoundLabelStatement(endLabel);
            var result            = new BoundBlockStatement(ImmutableArray.Create <BoundStatement>(
                                                                gotoCheck,
                                                                continueLabelStatement,
                                                                node.Body,
                                                                checkLabelStatement,
                                                                gotoTrue,
                                                                endLabelStatement
                                                                ));

            return(RewriteStatement(result));
        }
예제 #2
0
 protected override BoundStatement RewriteIfStatement(BoundIfStatement node)
 {
     if (node.ElseStatement == null)
     {
         // if <condition>
         //      <then>
         //
         // --> becomes
         //
         // gotoIfFalse <condition> end
         // <then>
         // end:
         var endLabel          = GenerateLabel();
         var gotoFalse         = new BoundConditionalGotoStatement(endLabel, node.Condition, false);
         var endLabelStatement = new BoundLabelStatement(endLabel);
         var result            = new BoundBlockStatement(ImmutableArray.Create <BoundStatement>(gotoFalse, node.ThenStatement, endLabelStatement));
         return(RewriteStatement(result));
     }
     else
     {
         // if <condition>
         //      <then>
         // else
         //      <else>
         //
         // --> becomes
         //
         // gotoIfFalse <condition> else
         // <then>
         // goto end
         // else:
         // <else>
         // end:
         var elseLabel          = GenerateLabel();
         var endLabel           = GenerateLabel();
         var gotoFalse          = new BoundConditionalGotoStatement(elseLabel, node.Condition, false);
         var gotoEndStatement   = new BoundGoToStatement(endLabel);
         var elseLabelStatement = new BoundLabelStatement(elseLabel);
         var endLabelStatement  = new BoundLabelStatement(endLabel);
         var result             = new BoundBlockStatement(ImmutableArray.Create <BoundStatement>(
                                                              gotoFalse,
                                                              node.ThenStatement,
                                                              gotoEndStatement,
                                                              elseLabelStatement,
                                                              node.ElseStatement,
                                                              endLabelStatement
                                                              ));
         return(RewriteStatement(result));
     }
 }
예제 #3
0
 private void EmitGoToStatement(BoundGoToStatement statement)
 {
     this.instructions.Add(new TransientUnconditionalGoToInstruction(statement.Label, statement.Syntax.GoToToken.Range));
 }