public Parser endMarker() {
        if (endMarkerParser == null) {
           FutureParser future = scoped("endMarker");
           endMarkerParser = future;
           future.setParser(
               choice(
                   sequence(
                       token("END"),
                       token("FUNCTION"),
                       functionName(),
                       token(".")
                   ),
                   sequence(
                       token("END"),
                       token("CLASS"),
                       className(),
                       token(".")
                   ),
                   sequence(
                       token("END"),
                       token("FACTORY"),
                       token(".")
                   ),
                   sequence(
                       token("END"),
                       token("STATIC"),
                       token(".")
                   ),
                   sequence(
                       token("END"),
                       token("OBJECT"),
                       token(".")
                   ),
                   sequence(
                       token("END"),
                       token("OPERATOR"),
                       token(".")
                   ),
                   sequence(
                       token("END"),
                       token("METHOD"),
                       optional(
                           methodName()
                       ),
                       token(".")
                   ),
                   sequence(
                       token("END"),
                       token("INTERFACE"),
                       interfaceName(),
                       token(".")
                   ),
                   sequence(
                       token("END"),
                       token("DELEGATE"),
                       delegateName(),
                       token(".")
                   ),
                   sequence(
                       token("END"),
                       token("ENUM"),
                       enumName(),
                       token(".")
                   ),
                   sequence(
                       token("END"),
                       token("OPERATOR"),
                       cobolWord(),
                       token(".")
                   ),
                   sequence(
                       token("END"),
                       token("VALUETYPE"),
                       valuetypeName(),
                       token(".")
                   ),
                   sequence(
                       token("END"),
                       token("PROGRAM"),
                       programName(),
                       token(".")
                   )
               )
           );
        }

        return endMarkerParser;
    }