public Parser record() {
        if (recordParser == null) {
           FutureParser future = scoped("record");
           recordParser = future;
           future.setParser(
               sequence(
                   token("RECORD"),
                   choice(
                       sequence(
                           optional(
                               token("CONTAINS")
                           ),
                           integer(),
                           optional(
                               sequence(
                                   token("TO"),
                                   integer()
                               )
                           ),
                           optional(
                               token("CHARACTERS")
                           )
                       ),
                       sequence(
                           optional(
                               token("IS")
                           ),
                           token("VARYING"),
                           optional(
                               token("IN")
                           ),
                           optional(
                               token("SIZE")
                           ),
                           optional(
                               sequence(
                                   optional(
                                       token("FROM")
                                   ),
                                   integer(),
                                   optional(
                                       sequence(
                                           token("TO"),
                                           integer()
                                       )
                                   ),
                                   optional(
                                       token("CHARACTERS")
                                   )
                               )
                           ),
                           optional(
                               sequence(
                                   token("DEPENDING"),
                                   optional(
                                       token("ON")
                                   ),
                                   fileName()
                               )
                           )
                       )
                   )
               )
           );
        }

        return recordParser;
    }