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 ) {