Beispiel #1
0
        private void CreateIfStatement(int i, JumpIfNotToken jumpToken, int ifEnd)
        {
            int ifCount     = ifEnd - i - 1;
            int ifEndOffset = jumpToken.TargetOffset;
            CompositeStatement elseStatement = null;
            bool isWhile = false;

            if (this[ifEnd - 1].Token is UncondJumpToken)
            {
                var endToken = (UncondJumpToken)this[ifEnd - 1].Token;
                if (endToken.TargetOffset == this[i].StartOffset)
                {
                    isWhile = true;
                }
                else if (FindBreakTarget(endToken.TargetOffset) == null)
                {
                    int elseEnd = FindByTargetOffset(endToken.TargetOffset, ifEnd + 1);
                    if (elseEnd >= 0)
                    {
                        ifEndOffset   = this[ifEnd - 1].StartOffset;
                        elseStatement = new ElseStatement(this[ifEnd].StartOffset,
                                                          this[ifEnd - 1].Token,
                                                          GetRange(ifEnd, elseEnd - ifEnd),
                                                          endToken.TargetOffset);
                        ifCount--;
                    }
                }
            }
            CompositeStatement statement = isWhile
                ? (CompositeStatement) new WhileStatement(this[i].StartOffset, jumpToken.Condition, GetRange(i + 1, ifCount), ifEndOffset)
                : new IfStatement(this[i].StartOffset, jumpToken.Condition, GetRange(i + 1, ifCount), ifEndOffset);

            ReplaceRange(i, ifEnd - i, statement);
            statement.ProcessChildren();
            if (elseStatement != null)
            {
                ReplaceRange(i + 1, elseStatement.Children, elseStatement);
                elseStatement.Children.CreateControlStatements();
            }
        }
Beispiel #2
0
 private void CreateIfStatement(int i, JumpIfNotToken jumpToken, int ifEnd)
 {
     int ifCount = ifEnd - i - 1;
     int ifEndOffset = jumpToken.TargetOffset;
     CompositeStatement elseStatement = null;
     bool isWhile = false;
     if (this[ifEnd - 1].Token is UncondJumpToken)
     {
         var endToken = (UncondJumpToken)this[ifEnd - 1].Token;
         if (endToken.TargetOffset == this[i].StartOffset)
         {
             isWhile = true;
         }
         else if (FindBreakTarget(endToken.TargetOffset) == null)
         {
             int elseEnd = FindByTargetOffset(endToken.TargetOffset, ifEnd + 1);
             if (elseEnd >= 0)
             {
                 ifEndOffset = this[ifEnd - 1].StartOffset;
                 elseStatement = new ElseStatement(this[ifEnd].StartOffset,
                                                   this[ifEnd - 1].Token,
                                                   GetRange(ifEnd, elseEnd - ifEnd),
                                                   endToken.TargetOffset);
                 ifCount--;
             }
         }
     }
     CompositeStatement statement = isWhile
         ? (CompositeStatement) new WhileStatement(this[i].StartOffset, jumpToken.Condition, GetRange(i + 1, ifCount), ifEndOffset)
         : new IfStatement(this[i].StartOffset, jumpToken.Condition, GetRange(i + 1, ifCount), ifEndOffset);
     ReplaceRange(i, ifEnd - i, statement);
     statement.ProcessChildren();
     if (elseStatement != null)
     {
         ReplaceRange(i + 1, elseStatement.Children, elseStatement);
         elseStatement.Children.CreateControlStatements();
     }
 }