public Parser mergeStatement() {
        if (mergeStatementParser == null) {
           FutureParser future = scoped("mergeStatement");
           mergeStatementParser = future;
           future.setParser(
               sequence(
                   token("MERGE"),
                   fileName(),
                   plus(
                       sequence(
                           optional(
                               token("ON")
                           ),
                           choice(
                               token("ASCENDING"),
                               token("DESCENDING")
                           ),
                           optional(
                               token("KEY")
                           ),
                           optional(
                               token("IS")
                           ),
                           plus(
                               dataName()
                           )
                       )
                   ),
                   optional(
                       sequence(
                           optional(
                               token("COLLATING")
                           ),
                           token("SEQUENCE"),
                           optional(
                               token("IS")
                           ),
                           alphabetName()
                       )
                   ),
                   token("USING"),
                   fileName(),
                   plus(
                       fileName()
                   ),
                   choice(
                       sequence(
                           token("OUTPUT"),
                           token("PROCEDURE"),
                           optional(
                               token("IS")
                           ),
                           procedureName(),
                           optional(
                               sequence(
                                   choice(
                                       token("THROUGH"),
                                       token("THRU")
                                   ),
                                   procedureName()
                               )
                           )
                       ),
                       sequence(
                           token("GIVING"),
                           plus(
                               fileName()
                           )
                       )
                   )
               )
           );
        }

        return mergeStatementParser;
    }