public Parser usageClause() {
        if (usageClauseParser == null) {
           FutureParser future = scoped("usageClause");
           usageClauseParser = future;
           future.setParser(
               choice(
                   token("BINARY"),
                   sequence(
                       token("BINARY-CHAR"),
                       optional(
                           choice(
                               token("SIGNED"),
                               token("UNSIGNED")
                           )
                       )
                   ),
                   sequence(
                       token("BINARY-SHORT"),
                       optional(
                           choice(
                               token("SIGNED"),
                               token("UNSIGNED")
                           )
                       )
                   ),
                   sequence(
                       token("BINARY-LONG"),
                       optional(
                           choice(
                               token("SIGNED"),
                               token("UNSIGNED")
                           )
                       )
                   ),
                   sequence(
                       token("BINARY-DOUBLE"),
                       optional(
                           choice(
                               token("SIGNED"),
                               token("UNSIGNED")
                           )
                       )
                   ),
                   token("BINARY-C-LONG"),
                   token("FLOAT-SHORT"),
                   token("FLOAT-LONG"),
                   token("FLOAT-EXTENDED"),
                   token("BIT"),
                   token("CHARACTER"),
                   token("COMPUTATIONAL"),
                   token("COMP"),
                   token("COMPUTATIONAL-1"),
                   token("COMP-1"),
                   token("COMPUTATIONAL-2"),
                   token("COMP-2"),
                   token("COMPUTATIONAL-3"),
                   token("COMP-3"),
                   token("COMPUTATIONAL-4"),
                   token("COMP-4"),
                   token("COMPUTATIONAL-5"),
                   token("COMP-5"),
                   token("COMPUTATIONAL-X"),
                   token("COMP-X"),
                   token("CONDITION-VALUE"),
                   token("DECIMAL"),
                   token("DISPLAY"),
                   token("INDEX"),
                   token("MONITOR-POINTER"),
                   token("MUTEX-POINTER"),
                   token("NATIONAL"),
                   sequence(
                       token("OBJECT"),
                       token("REFERENCE"),
                       optional(
                           choice(
                               sequence(
                                   optional(
                                       sequence(
                                           token("FACTORY"),
                                           token("OF")
                                       )
                                   ),
                                   token("ACTIVE-CLASS")
                               ),
                               sequence(
                                   optional(
                                       sequence(
                                           token("FACTORY"),
                                           token("OF")
                                       )
                                   ),
                                   className(),
                                   optional(
                                       choice(
                                           token("ONLY"),
                                           token("EVENT")
                                       )
                                   )
                               )
                           )
                       )
                   ),
                   token("OBJECT"),
                   token("PACKED-DECIMAL"),
                   token("POINTER"),
                   token("PROCEDURE-POINTER"),
                   sequence(
                       token("PROGRAM-POINTER"),
                       optional(
                           sequence(
                               optional(
                                   token("TO")
                               ),
                               programName()
                           )
                       )
                   ),
                   token("SEMAPHORE-POINTER"),
                   token("SIGNED-INT"),
                   token("SIGNED-LONG"),
                   token("SIGNED-SHORT"),
                   token("UNSIGNED-INT"),
                   token("UNSIGNED-LONG"),
                   token("UNSIGNED-SHORT"),
                   token("STRING"),
                   token("THREAD-POINTER"),
                   typedefName(),
                   className()
               )
           );
        }

        return usageClauseParser;
    }