public Parser cicsLink() {
        if (cicsLinkParser == null) {
           FutureParser future = scoped("cicsLink");
           cicsLinkParser = future;
           future.setParser(
               sequence(
                   token("LINK"),
                   token("PROGRAM"),
                   token("("),
                   programID(),
                   token(")"),
                   permuted(
                       sequence(
                           choice(
                               token("SYSID"),
                               token("SYS")
                           ),
                           token("("),
                           cicsSysid(),
                           token(")")
                       ),
                       sequence(
                           token("COMMAREA"),
                           token("("),
                           commareaName(),
                           token(")"),
                           optional(
                               sequence(
                                   token("LENGTH"),
                                   cicsWaterInBrackets()
                               )
                           ),
                           optional(
                               sequence(
                                   token("DATALENGTH"),
                                   cicsWaterInBrackets()
                               )
                           )
                       ),
                       token("SYNCONRETURN"),
                       sequence(
                           token("TRANSID"),
                           cicsWaterInBrackets()
                       ),
                       sequence(
                           token("INPUTMSG"),
                           cicsWaterInBrackets(),
                           optional(
                               sequence(
                                   token("INPUTMSGLEN"),
                                   cicsWaterInBrackets()
                               )
                           )
                       ),
                       sequence(
                           token("CHANNEL"),
                           cicsWaterInBrackets()
                       )
                   )
               )
           );
        }

        return cicsLinkParser;
    }