public Parser chainUsing() {
        if (chainUsingParser == null) {
           FutureParser future = scoped("chainUsing");
           chainUsingParser = future;
           future.setParser(
               sequence(
                   token("USING"),
                   star(
                       choice(
                           literal(),
                           identifier()
                       )
                   ),
                   star(
                       choice(
                           sequence(
                               optional(
                                   token("BY")
                               ),
                               token("REFERENCE"),
                               plus(
                                   choice(
                                       sequence(
                                           optional(
                                               sequence(
                                                   token("ADDRESS"),
                                                   token("OF")
                                               )
                                           ),
                                           identifier()
                                       ),
                                       token("OMITTED"),
                                       literal()
                                   )
                               )
                           ),
                           sequence(
                               optional(
                                   token("BY")
                               ),
                               token("CONTENT"),
                               plus(
                                   choice(
                                       literal(),
                                       identifier()
                                   )
                               )
                           ),
                           sequence(
                               optional(
                                   token("BY")
                               ),
                               token("VALUE"),
                               plus(
                                   choice(
                                       sequence(
                                           optional(
                                               sequence(
                                                   token("LENGTH"),
                                                   token("OF")
                                               )
                                           ),
                                           identifier()
                                       ),
                                       sequence(
                                           integer(),
                                           optional(
                                               sequence(
                                                   token("SIZE"),
                                                   optional(
                                                       token("IS")
                                                   ),
                                                   integer()
                                               )
                                           )
                                       ),
                                       literal()
                                   )
                               )
                           )
                       )
                   )
               )
           );
        }

        return chainUsingParser;
    }