public Parser readStatement() {
        if (readStatementParser == null) {
           FutureParser future = scoped("readStatement");
           readStatementParser = future;
           future.setParser(
               sequence(
                   token("READ"),
                   fileName(),
                   optional(
                       choice(
                           token("NEXT"),
                           token("PREVIOUS")
                       )
                   ),
                   optional(
                       token("RECORD")
                   ),
                   optional(
                       sequence(
                           token("INTO"),
                           identifier_format2()
                       )
                   ),
                   optional(
                       choice(
                           sequence(
                               token("ADVANCING"),
                               optional(
                                   token("ON")
                               ),
                               token("LOCK")
                           ),
                           sequence(
                               token("IGNORING"),
                               token("LOCK")
                           ),
                           sequence(
                               optional(
                                   token("WITH")
                               ),
                               choice(
                                   sequence(
                                       optional(
                                           choice(
                                               token("KEPT"),
                                               token("NO"),
                                               token("IGNORE")
                                           )
                                       ),
                                       token("LOCK")
                                   ),
                                   token("WAIT")
                               )
                           ),
                           retryPhrase()
                       )
                   ),
                   optional(
                       sequence(
                           token("KEY"),
                           optional(
                               token("IS")
                           ),
                           qualifiedDataName()
                       )
                   ),
                   optional(
                       sequence(
                           optional(
                               token("AT")
                           ),
                           token("END"),
                           nestedStatements()
                       )
                   ),
                   optional(
                       sequence(
                           token("NOT"),
                           optional(
                               token("AT")
                           ),
                           token("END"),
                           nestedStatements()
                       )
                   ),
                   optional(
                       sequence(
                           token("INVALID"),
                           optional(
                               token("KEY")
                           ),
                           nestedStatements()
                       )
                   ),
                   optional(
                       sequence(
                           token("NOT"),
                           token("INVALID"),
                           optional(
                               token("KEY")
                           ),
                           nestedStatements()
                       )
                   ),
                   optional(
                       token("END-READ")
                   )
               )
           );
        }

        return readStatementParser;
    }