diff --git a/gcc/cobol/parse.y b/gcc/cobol/parse.y
index 258225aa5c15f96c9f9b5be2ab245b78cdc6297e..811d12667af7e9451a8f7920ecfd24b14111649a 100644
--- a/gcc/cobol/parse.y
+++ b/gcc/cobol/parse.y
@@ -9827,6 +9827,7 @@ keyword_str( int token ) {
  * All function names are rejected here; the lexer uses typed_name to check
  * REPOSITORY names.
  */
+#if 0
 int
 keyword_tok( const char * text, bool include_intrinsics ) {
   class cmp {
@@ -9878,7 +9879,25 @@ keyword_tok( const char * text, bool include_intrinsics ) {
     }
   };
 
-  ////static auto last = yytname + YYNTOKENS; // COUNT_OF(yytname);
+  class tokenset_t {
+    std::map <std::string, size_t> tokens;
+   public:
+    tokenset_t() {
+      size_t i=0;
+      for( auto name = yytname + 3; name < last, name++ ) {
+	static cbl_name_t lname;
+	std::transform(name, name + strlen(name) + 1, lname, tolower);
+	tokens[lname] = i++;
+      }
+    }
+    size_t find_token( const cbl_name_t name ) {
+      cbl_name_t lname;
+      std::transform(name, name + strlen(name) + 1, lname, tolower);
+      auto p = tokens.find(lname);
+      return p != tokens.end()? p->second : 0;      
+    }
+  };
+
   static auto last = std::find_if(yytname, yytname + COUNT_OF(yytname),
                                   [] ( const char *name ) {
                                     return 0 == strcmp(name, "$accept"); });
@@ -9892,8 +9911,73 @@ keyword_tok( const char * text, bool include_intrinsics ) {
   
   return intrinsic_cname(token)? 0 : token;
 }
+#else 
+  static struct kw_t { const char *lexeme, *name; } kws[] = {
+    { "CODE_SET", "CODESET" },
+    { "DATA", "DATA_DIV" },
+    { "ENVIRONMENT", "ENVIRONMENT_DIV" },
+    { "FALSE", "FALSE_kw" },
+    { "FILE", "FILE_KW" },
+    { "FILLER", "FILLER_kw" },
+    { "IDENTIFICATION", "IDENTIFICATION_DIV" },
+    { "I_O", "IO" },
+    { "INITIAL", "INITIAL_kw" },
+    { "PIC", "PICTURE" },
+    { "PROCEDURE", "PROCEDURE_DIV" },
+    { "PROGRAM", "PROGRAM_kw" },
+    { "QUOTE", "QUOTES" },
+    { "STRING", "STRING_kw" },
+    { "THROUGH", "THRU" },
+    { "TRUE", "TRUE_kw" },
+  }, *eokws = kws + COUNT_OF(kws);
+
+class tokenset_t {
+  std::map <std::string, size_t> tokens;
+  
+ public:
+  tokenset_t( const char * const *first,
+	      const char * const *last ) {
+    size_t i=255;
+    for( auto name = first; name < last; name++ ) {
+      static cbl_name_t lname;
+      
+      std::transform(*name, *name + strlen(*name) + 1, lname, tolower);
+      std::replace(lname, lname + strlen(lname), '-', '_');
+      
+      auto p = std::find_if( kws, eokws,
+			     [](kw_t kw) {
+			       return 0 == strcasecmp(lname, kw.lexeme);
+			     } );
+      if( p != eokws ) {
+	std::transform(p->name, p->name + strlen(p->name) + 1, lname, tolower);
+      }
+      tokens[lname] = i++;
+    }
+  }
+  
+  size_t find( const cbl_name_t name, bool include_intrinsics ) {
+    cbl_name_t lname;
+    std::transform(name, name + strlen(name) + 1, lname, tolower);
+    auto p = tokens.find(lname);
+    if( p == tokens.end() ) return 0;
+    size_t token = p->second;
+    
+    if( include_intrinsics ) return token;
+    
+    return intrinsic_cname(token)? 0 : token;
+  }
+};
 
+int
+keyword_tok( const char * text, bool include_intrinsics ) {
+  static auto last = std::find_if(yytname, yytname + COUNT_OF(yytname),
+                                  [] ( const char *name ) {
+                                    return 0 == strcmp(name, "$accept"); });
+  static tokenset_t tokens( yytname + 3, last );
   
+  return tokens.find(text, include_intrinsics);  
+}  
+#endif
 
 static inline size_t
 verify_figconst( enum cbl_figconst_t figconst , size_t pos ) {