Skip to content
Snippets Groups Projects
Commit 367c99ef authored by James K. Lowden's avatar James K. Lowden :anchor:
Browse files

introduce name cache to lexer

parent 518e56a5
No related branches found
No related tags found
No related merge requests found
Pipeline #1719 passed
......@@ -410,6 +410,27 @@ static int symbol_function_token( const char name[] ) {
return e ? symbol_index(e) : 0;
}
static symbol_elem_t *
symbol_exists( const char name[] ) {
typedef std::map <std::string, size_t> name_cache_t;
static std::map <size_t, name_cache_t> cachemap;
cbl_name_t lname;
std::transform( name, name + strlen(name) + 1, lname, tolower );
auto& cache = cachemap[PROGRAM];
auto p = cache.find(lname);
if( p == cache.end() ) {
symbol_elem_t * e = symbol_field( PROGRAM, 0, name );
if( !e ) return NULL;
cache[lname] = symbol_index(e);
return e;
}
size_t isym = p->second;
return symbol_at(cache[lname] = isym);
}
static int
typed_name( const char name[] ) {
if( 0 == PROGRAM ) return NAME;
......@@ -421,7 +442,7 @@ typed_name( const char name[] ) {
struct symbol_elem_t *e = symbol_special( PROGRAM, name );
if( e ) return cbl_special_name_of(e)->token;
e = symbol_field( PROGRAM, 0, name );
e = symbol_exists( name );
auto type = e && e->type == SymField? cbl_field_of(e)->type : FldInvalid;
......@@ -567,7 +588,7 @@ might_be(void) {
assert(yyleng > 0);
for( char *name = yytext + yyleng - 1; name > yytext; name-- ) {
if( isspace(*name) ) {
symbol_elem_t *e = symbol_field(PROGRAM, 0, ++name);
symbol_elem_t *e = symbol_exists(++name);
// TRUE if the input names a field that isn't a level 88 or switch
return e && e->type == SymField &&
cbl_field_of(e)->type != FldSwitch && cbl_field_of(e)->level != 88;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment