#include <symtable.h>
Inheritance diagram for symtable:
Public Member Functions | |
void | init (uint size=SQRT_SYMTAB) |
symtable (unsigned int size=SQRT_SYMTAB, pool *p=NULL) | |
void | dealloc () |
~symtable () | |
void | set_pool (pool *p) |
void | set_owner (sym *parent) |
sym * | get_owner (void) |
sym * | enter_sym (STRING str, uint kind) |
Enter a symbol in the symbol table. | |
sym * | enter_sym (const char *pChar, uint kind) |
sym * | find_sym (STRING name) |
Search for a symbol in the symbol table whose name is in the STRING object name. | |
sym * | find_sym (const char *pChar) |
unsigned int | get_percent_alloced (void) |
unsigned int | get_max_list (void) |
void | pr (FILE *fp=stdout) |
Print the contents of the string table. | |
void | dealloc_sub_tables () |
Traverse the symbol table and find sub-symbols that have scope (e.g., symbol tables). | |
sym * | first (void) |
The functions first and get_item are used to iterate through the string table. | |
sym * | get_sym (void) |
get_str is used to iterate through the string table. | |
Private Member Functions | |
sym * | new_sym (STRING str, uint kind) |
Allocate a new symbol. | |
symtable (const symtable &st) | |
Private Attributes | |
unsigned int | table_size |
unsigned int | hash_slot |
LIST< sym * >::handle | list_handle |
sparse_array< chain_elem > * | hash |
pool * | alloc_pool |
sym * | owner |
The symbol table consists of symbols with unique names (contained in the STRING class, entered in the string table).
This class was originally a generic template (HASH) for building hash tables. However, this template uses other templates (e.g., the sparse_array and LIST templates). C++ compilers (especially the HP C++ compiler) tend to have trouble with nested templates. So this class has been changed to be a specific class, instead of a template.
Definition at line 59 of file symtable.h.
|
Definition at line 104 of file symtable.h. References FALSE.
00104 { assert( FALSE ); } |
|
Definition at line 113 of file symtable.h. References alloc_pool, init(), NULL, and owner.
00114 { 00115 00116 owner = NULL; 00117 alloc_pool = p; 00118 init( size ); 00119 } |
|
Definition at line 126 of file symtable.h. References dealloc(), and dealloc_sub_tables().
00127 { 00128 dealloc_sub_tables(); // Deallocate all the "child" symbol tables. 00129 dealloc(); // Deallocate the sparse array and list memory for 00130 // this symbol table. 00131 } |
|
Definition at line 120 of file symtable.h. References sparse_array< chain_elem >::dealloc(), and hash. Referenced by sym_scope::dealloc(), sym_component::proc_list_dealloc(), and ~symtable().
|
|
Traverse the symbol table and find sub-symbols that have scope (e.g., symbol tables). For each of these, call dealloc_sub_tables, and then dealloc. Definition at line 227 of file symtable.C. References sym::dealloc(), sym::get_symtab(), sym::has_scope(), hash, LIST< T >::list, NULL, sparse_array< chain_elem >::probe(), table_size, and uint. Referenced by sym_component::proc_list_dealloc(), and ~symtable().
00228 { 00229 uint i; 00230 00231 for (i = 0; i < table_size; i++) { 00232 if (hash->probe( i )) { 00233 LIST<sym *>::handle h; 00234 sym * pListSym; 00235 00236 for (h = (*hash)[i].list.first(); h != NULL; h = (*hash)[i].list.next(h)) { 00237 pListSym = (*hash)[i].list.get_item( h ); 00238 if (pListSym->has_scope()) { 00239 pListSym->get_symtab()->dealloc_sub_tables(); 00240 pListSym->dealloc(); 00241 } 00242 } // for 00243 } // if 00244 } // for 00245 } // dealloc_sub_tables |
|
Definition at line 158 of file symtable.h. References enter_sym(), pChar, and STRING::SetText().
|
|
Enter a symbol in the symbol table. If "name" is not entered in the string table, enter it as well. Definition at line 174 of file symtable.C. References strtable::find_string(), STRING::GetText(), hash, hash_services::hash_value(), sparse_array< chain_elem >::insert(), new_sym(), NULL, sparse_array< chain_elem >::probe(), strtab, sy_process, table_size, and TRUE. Referenced by enter_sym().
00175 { 00176 unsigned int ix, val; 00177 sym *retsym; 00178 STRING str; 00179 00180 retsym = NULL; 00181 00182 if (kind == sy_process) { 00183 // Processes are special cases. They are allocated by the 00184 // symbol table class, since they are derived from the 00185 // symbol type. But they are not entered into the symbol 00186 // table, since in VHDL a process name can't be referenced. 00187 // Allocation of processes by the symbol table allows uniform 00188 // allocation of all symbol derived objects. 00189 retsym = new_sym( name, kind); 00190 } 00191 else { 00192 00193 assert( name.GetText() != NULL ); 00194 00195 val = hash_value( name.GetText() ); 00196 str = strtab.find_string( name, TRUE ); // insert into table if its not there. 00197 // table size should always be a power of 2, so 00198 // table_size - 1 is likely to be a prime. 00199 ix = val % (table_size - 1); 00200 if (! hash->probe( ix ) ) { 00201 00202 hash->insert( chain_elem(), ix ); 00203 00204 retsym = new_sym( str, kind ); 00205 (*hash)[ix].list.add( retsym ); 00206 } 00207 else { 00208 retsym = (*hash)[ix].search_list( str ); 00209 if ( retsym == NULL) { 00210 retsym = new_sym( str, kind ); 00211 (*hash)[ix].list.add( retsym ); 00212 } 00213 } 00214 } 00215 00216 return retsym; 00217 } // enter_sym |
|
Definition at line 170 of file symtable.h. References find_sym(), pChar, and STRING::SetText().
|
|
Search for a symbol in the symbol table whose name is in the STRING object name.
Definition at line 139 of file symtable.C. References FALSE, strtable::find_string(), STRING::GetText(), hash, hash_services::hash_value(), NULL, sparse_array< chain_elem >::probe(), strtab, and table_size. Referenced by find_sym().
00140 { 00141 STRING str; 00142 sym *retsym; 00143 00144 retsym = NULL; 00145 if (name.GetText() != NULL) { 00146 // If the name is not entered into the string table then 00147 // its not in the symbol table. Of course the name could 00148 // be in the string table and not in the symbol table, since 00149 // the string table is global and symbol could be out of scope. 00150 str = strtab.find_string( name, FALSE ); 00151 if (str.GetText() != NULL) { 00152 unsigned int ix, val; 00153 00154 val = hash_value( str.GetText() ); 00155 // table size should always be a power of 2, so 00156 // table_size - 1 is likely to be a prime. 00157 ix = val % (table_size - 1); 00158 if (hash->probe( ix )) { 00159 retsym = (*hash)[ ix ].search_list( str ); 00160 } 00161 } 00162 } 00163 00164 return retsym; 00165 } // find_sym |
|
The functions first and get_item are used to iterate through the string table. Note that the strings will be returned in hash order, which is pseudorandom. An example is shown below:
|
|
Definition at line 182 of file symtable.h. References hash, sparse_array< chain_elem >::probe(), table_size, and uint.
00183 { 00184 uint i; 00185 uint max, len; 00186 00187 max = 0; 00188 for (i = 0; i < table_size; i++) { 00189 if (hash->probe( i )) { 00190 len = (*hash)[i].list_len(); 00191 if (len > max) { 00192 max = len; 00193 } 00194 } 00195 } 00196 return max; 00197 } // get_max_list |
|
Definition at line 144 of file symtable.h. Referenced by new_sym().
00145 { 00146 assert( owner != NULL ); 00147 return owner; 00148 } |
|
Definition at line 180 of file symtable.h. References sparse_array< chain_elem >::get_percent_alloced(), and hash.
00180 { return hash->get_percent_alloced(); } |
|
get_str is used to iterate through the string table. See symtable.h. Definition at line 275 of file symtable.C. References hash, hash_slot, list_handle, NULL, sparse_array< chain_elem >::probe(), and table_size. Referenced by first().
00276 { 00277 sym * pHashSym; 00278 00279 pHashSym = NULL; 00280 00281 while (list_handle == NULL && hash_slot < table_size) { 00282 if (hash->probe( hash_slot )) { 00283 list_handle = (*hash)[hash_slot].list.first(); 00284 } 00285 if (list_handle == NULL) { 00286 hash_slot++; 00287 } 00288 } // while 00289 00290 if (list_handle != NULL && hash_slot < table_size) { 00291 00292 pHashSym = (*hash)[hash_slot].list.get_item( list_handle ); 00293 00294 list_handle = (*hash)[hash_slot].list.next(list_handle); 00295 00296 // if we've hit the end of the list, increment the 00297 // slot so we're not stuck in the same place 00298 if (list_handle == NULL) 00299 hash_slot++; 00300 } 00301 00302 return pHashSym; 00303 } // get_str |
|
Definition at line 107 of file symtable.h. References sparse_array< chain_elem >::get_total_size(), hash, and table_size. Referenced by symtable().
00108 { 00109 hash = new sparse_array<chain_elem>( (const unsigned int)size ); 00110 table_size = hash->get_total_size(); 00111 } |
|
Allocate a new symbol. The STRING should have already been entered in the string table. Note that as different derived symbol types are added to dsym.h this function must be changed as well. Definition at line 59 of file symtable.C. References alloc_pool, bad_symbol, FALSE, get_owner(), sym::get_symtab(), sym::get_typtab(), NULL, set_owner(), typetable::set_pool(), set_pool(), sym::set_scope(), sy_block_label, sy_component, sy_const, sy_ident, sy_package, sy_process, sy_subprog, and sy_type. Referenced by enter_sym().
00060 { 00061 sym *pNewSym; 00062 00063 assert( alloc_pool != NULL ); 00064 00065 switch ( kind ) { 00066 // IDENT: has scope 00067 case sy_ident: 00068 pNewSym = new( alloc_pool ) sym_ident( str ); 00069 pNewSym->set_scope( get_owner() ); 00070 break; 00071 // TYPE : no scope 00072 case sy_type: 00073 pNewSym = new( alloc_pool ) sym_type( str ); 00074 break; 00075 // CONST: no scope 00076 case sy_const: 00077 pNewSym = new( alloc_pool ) sym_const( str ); 00078 break; 00079 00080 // SUBPROG: local symbol table 00081 case sy_subprog: 00082 pNewSym = new( alloc_pool ) sym_subprog( str ); 00083 00084 // the subprogram is in the scope of the owner of this symbol table 00085 pNewSym->set_scope( get_owner() ); 00086 // A function or procedure will allocate memory from 00087 // from the same pool as its parent scope (which will be 00088 // either a component or the global scope, in the case of 00089 // a function in a package). 00090 // 00091 pNewSym->get_symtab()->set_pool( alloc_pool ); 00092 // Set the allocation pool for the type table 00093 pNewSym->get_typtab()->set_pool( alloc_pool ); 00094 // The symbol table is owned by the subprogram 00095 pNewSym->get_symtab()->set_owner( pNewSym ); 00096 break; 00097 00098 // COMPONENT: local memory pool and local symbol table 00099 case sy_component: 00100 pNewSym = new( alloc_pool ) sym_component( str ); 00101 00102 // symbols in the component scope are owned by the component 00103 pNewSym->get_symtab()->set_owner( pNewSym ); 00104 break; 00105 00106 // PROCESS: local symbol table 00107 case sy_process: 00108 pNewSym = new( alloc_pool ) sym_process( str ); 00109 00110 // the process is in the scope of its component 00111 pNewSym->set_scope( get_owner() ); 00112 // set the memory pool to the pool of the parent 00113 pNewSym->get_symtab()->set_pool( alloc_pool ); 00114 // Set the allocation pool for the type table 00115 pNewSym->get_typtab()->set_pool( alloc_pool ); 00116 // The symbol table is owned by the process 00117 pNewSym->get_symtab()->set_owner( pNewSym ); 00118 break; 00119 case sy_package: // its not currently clear what to do about packages 00120 case sy_block_label: 00121 case bad_symbol: 00122 default: 00123 // bad symbol kind 00124 assert( FALSE ); 00125 break; 00126 } // switch 00127 00128 assert( pNewSym != NULL ); 00129 00130 return pNewSym; 00131 } // new_sym |
|
Print the contents of the string table.
Definition at line 250 of file symtable.C. References sym::get_name(), hash, LIST< T >::list, NULL, STRING::pr(), sparse_array< chain_elem >::probe(), table_size, and uint.
00251 { 00252 uint i; 00253 00254 for (i = 0; i < table_size; i++) { 00255 if (hash->probe( i )) { 00256 LIST<sym *>::handle h; 00257 sym * pListSym; 00258 00259 for (h = (*hash)[i].list.first(); h != NULL; h = (*hash)[i].list.next(h)) { 00260 // fprintf(fp, "hash_label::pr: i = %d, ", i ); 00261 pListSym = (*hash)[i].list.get_item( h ); 00262 pListSym->get_name().pr(fp); 00263 fprintf(fp, "\n"); 00264 } // for 00265 } // if 00266 } // for 00267 } // pr |
|
Definition at line 138 of file symtable.h. References owner. Referenced by new_sym().
00138 { owner = parent; } |
|
Definition at line 133 of file symtable.h. References alloc_pool. Referenced by sym_component::init(), and new_sym().
00134 { 00135 alloc_pool = p; 00136 } |
|
Definition at line 93 of file symtable.h. Referenced by new_sym(), set_pool(), and symtable(). |
|
Definition at line 92 of file symtable.h. Referenced by dealloc(), dealloc_sub_tables(), enter_sym(), find_sym(), get_max_list(), get_percent_alloced(), get_sym(), init(), and pr(). |
|
Definition at line 89 of file symtable.h. |
|
Definition at line 90 of file symtable.h. |
|
Definition at line 95 of file symtable.h. Referenced by get_owner(), set_owner(), and symtable(). |
|
Definition at line 88 of file symtable.h. Referenced by dealloc_sub_tables(), enter_sym(), find_sym(), get_max_list(), get_sym(), init(), and pr(). |