public Parser cicsReadFile() {
        if (cicsReadFileParser == null) {
           FutureParser future = scoped("cicsReadFile");
           cicsReadFileParser = future;
           future.setParser(
               choice(
                   sequence(
                       token("READ"),
                       choice(
                           token("FILE"),
                           token("DATASET")
                       ),
                       token("("),
                       fileName(),
                       token(")"),
                       permuted(
                           sequence(
                               choice(
                                   token("SYSID"),
                                   token("SYS")
                               ),
                               token("("),
                               cicsSysid(),
                               token(")")
                           ),
                           sequence(
                               choice(
                                   token("SET"),
                                   token("INTO")
                               ),
                               token("("),
                               dataArea(),
                               token(")"),
                               optional(
                                   sequence(
                                       token("LENGTH"),
                                       cicsWaterInBrackets()
                                   )
                               )
                           ),
                           sequence(
                               token("RIDFLD"),
                               cicsWaterInBrackets(),
                               optional(
                                   sequence(
                                       token("KEYLENGTH"),
                                       cicsWaterInBrackets(),
                                       optional(
                                           token("GENERIC")
                                       )
                                   )
                               )
                           ),
                           choice(
                               token("GTEQ"),
                               token("EQUAL")
                           ),
                           choice(
                               token("UNCOMMITTED"),
                               token("CONSISTENT"),
                               token("REPEATABLE"),
                               sequence(
                                   token("UPDATE"),
                                   token("TOKEN"),
                                   cicsWaterInBrackets()
                               )
                           ),
                           token("NOSUSPEND")
                       )
                   ),
                   sequence(
                       token("READNEXT"),
                       choice(
                           token("FILE"),
                           token("DATASET")
                       ),
                       token("("),
                       fileName(),
                       token(")"),
                       permuted(
                           sequence(
                               choice(
                                   token("SYSID"),
                                   token("SYS")
                               ),
                               token("("),
                               cicsSysid(),
                               token(")")
                           ),
                           sequence(
                               choice(
                                   token("SET"),
                                   token("INTO")
                               ),
                               token("("),
                               dataArea(),
                               token(")"),
                               optional(
                                   sequence(
                                       token("LENGTH"),
                                       cicsWaterInBrackets()
                                   )
                               )
                           ),
                           sequence(
                               token("RIDFLD"),
                               cicsWaterInBrackets(),
                               optional(
                                   sequence(
                                       token("KEYLENGTH"),
                                       cicsWaterInBrackets()
                                   )
                               )
                           ),
                           choice(
                               token("RBA"),
                               token("XRBA"),
                               token("RRN")
                           ),
                           choice(
                               token("UNCOMMITTED"),
                               token("CONSISTENT"),
                               token("REPEATABLE"),
                               sequence(
                                   token("UPDATE"),
                                   token("TOKEN"),
                                   cicsWaterInBrackets()
                               )
                           ),
                           token("NOSUSPEND")
                       )
                   )
               )
           );
        }

        return cicsReadFileParser;
    }