docs: def loop(self):
          """
          loop       : 'for' init; ctrl; inc block
          """
          self.eat(TokenTypes.FOR_LOOP)
          init = NoOp()
          if self.cur_token.type != TokenTypes.SEMI_COLON:
              init = self.assign_statement()
          else:
              self.eat(TokenTypes.SEMI_COLON)
  
          ctrl = NoOp()
          if self.cur_token.type != TokenTypes.SEMI_COLON:
              ctrl = self.expression()
          self.eat(TokenTypes.SEMI_COLON)
  
          inc = NoOp()
          if self.cur_token.type != TokenTypes.LBRACE:
              inc = self.assign_statement()
  
          block = self.block()
          return ForLoop(init, ctrl, inc, block)