I’ve not followed your links, so forgive me for the quick answer that may miss something you’re already taking into account.
My *suspicion* would be that you’re tripping over “PROGRAM” being a COBOL reserved word, and the Lexer is identifying it as such, and consequently, not seeing it as an “IDENTIFIER” .
For things like the CICS preprocessor, you may need to implement an Island Grammar and switch to it. (Of course, another alternative might be to handle it like the CICS preprocessor does, and run a parser designed only to recognize the embedded CICS commands and convert them to valid COBOl before handing it off to the COBOL compiler.)
The bottom line is that the “EXEC” … “END-EXEC” is not really valid COBOL and needs to be handled by independent parsing.