diff --git a/gcc/cobol/parse.y b/gcc/cobol/parse.y index 811d12667af7e9451a8f7920ecfd24b14111649a..2b10b970531738ad5723d45dd5541e0797872876 100644 --- a/gcc/cobol/parse.y +++ b/gcc/cobol/parse.y @@ -9932,36 +9932,38 @@ keyword_tok( const char * text, bool include_intrinsics ) { }, *eokws = kws + COUNT_OF(kws); class tokenset_t { - std::map <std::string, size_t> tokens; + std::map <std::string, int> tokens; public: tokenset_t( const char * const *first, const char * const *last ) { - size_t i=255; + // Initialize a map of lexemes, as found in the COBOL text, to their token values. + int i = 3 + 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), '-', '_'); - + + strcpy(lname, *name); auto p = std::find_if( kws, eokws, [](kw_t kw) { - return 0 == strcasecmp(lname, kw.lexeme); + return 0 == strcasecmp(lname, kw.name); } ); if( p != eokws ) { - std::transform(p->name, p->name + strlen(p->name) + 1, lname, tolower); + strcpy(lname, p->lexeme); } + std::replace(lname, lname + strlen(lname), '_', '-'); + std::transform(lname, lname + strlen(lname) + 1, lname, tolower); tokens[lname] = i++; } } - size_t find( const cbl_name_t name, bool include_intrinsics ) { + int 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; - + int token = p->second; + if( include_intrinsics ) return token; return intrinsic_cname(token)? 0 : token; @@ -9970,7 +9972,7 @@ class tokenset_t { int keyword_tok( const char * text, bool include_intrinsics ) { - static auto last = std::find_if(yytname, yytname + COUNT_OF(yytname), + static auto last = std::find_if(yytname + 3, yytname + COUNT_OF(yytname), [] ( const char *name ) { return 0 == strcmp(name, "$accept"); }); static tokenset_t tokens( yytname + 3, last );