public Parser invokeStatement() {
        if (invokeStatementParser == null) {
           FutureParser future = scoped("invokeStatement");
           invokeStatementParser = future;
           future.setParser(
               sequence(
                   token("INVOKE"),
                   identifier(),
                   optional(
                       sequence(
                           token("AS"),
                           choice(
                               token("OBJECT"),
                               identifier()
                           )
                       )
                   ),
                   choice(
                       literal(),
                       identifier()
                   ),
                   optional(
                       sequence(
                           token("USING"),
                           plus(
                               choice(
                                   sequence(
                                       optional(
                                           sequence(
                                               optional(
                                                   token("BY")
                                               ),
                                               token("REFERENCE")
                                           )
                                       ),
                                       choice(
                                           sequence(
                                               token("ADDRESS"),
                                               token("OF"),
                                               identifier()
                                           ),
                                           token("OMITTED"),
                                           literal(),
                                           identifier()
                                       )
                                   ),
                                   sequence(
                                       optional(
                                           token("BY")
                                       ),
                                       token("CONTENT"),
                                       choice(
                                           sequence(
                                               token("LENGTH"),
                                               token("OF"),
                                               identifier()
                                           ),
                                           arithmeticExpression(),
                                           literal(),
                                           identifier()
                                       )
                                   ),
                                   sequence(
                                       optional(
                                           token("BY")
                                       ),
                                       token("VALUE"),
                                       choice(
                                           sequence(
                                               token("LENGTH"),
                                               token("OF"),
                                               identifier()
                                           ),
                                           sequence(
                                               integer(),
                                               token("SIZE"),
                                               optional(
                                                   token("IS")
                                               ),
                                               integer()
                                           ),
                                           arithmeticExpression(),
                                           integer(),
                                           identifier()
                                       )
                                   )
                               )
                           )
                       )
                   ),
                   optional(
                       sequence(
                           choice(
                               token("GIVING"),
                               token("RETURNING")
                           ),
                           optional(
                               choice(
                                   token("INTO"),
                                   sequence(
                                       token("ADDRESS"),
                                       token("OF")
                                   )
                               )
                           ),
                           identifier()
                       )
                   )
               )
           );
        }

        return invokeStatementParser;
    }