public Parser performStatement() {
        if (performStatementParser == null) {
           FutureParser future = scoped("performStatement");
           performStatementParser = future;
           future.setParser(
               sequence(
                   token("PERFORM"),
                   choice(
                       sequence(
                           optional(
                               choice(
                                   times(),
                                   until(),
                                   varying()
                               )
                           ),
                           choice(
                               sequence(
                                   nestedStatements(),
                                   token("END-PERFORM")
                               ),
                               statement(),
                               token("END-PERFORM")
                           )
                       ),
                       sequence(
                           procedureName(),
                           optional(
                               sequence(
                                   choice(
                                       token("THROUGH"),
                                       token("THRU")
                                   ),
                                   procedureName()
                               )
                           ),
                           optional(
                               choice(
                                   times(),
                                   until(),
                                   varying()
                               )
                           )
                       ),
                       sequence(
                           token("VARYING"),
                           identifier(),
                           token("THROUGH"),
                           identifier(),
                           nestedStatements(),
                           token("END-PERFORM")
                       )
                   )
               )
           );
        }

        return performStatementParser;
    }