diff options
author | johnvg | 2011-04-06 10:12:15 +0000 |
---|---|---|
committer | johnvg | 2011-04-06 10:12:15 +0000 |
commit | fb3a3d6a01992541475d1b7c47252cfa0197aa25 (patch) | |
tree | 3db8e564d89bc4a0cce7891d6220e21a6cf05e03 /frontend/hashtable.icl | |
parent | use type ImportQualified instead of Bool for fields import_qualified and ei_q... (diff) |
add qualified import of a module, for functions, macros, constructors, types and classes
git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@1901 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
Diffstat (limited to 'frontend/hashtable.icl')
-rw-r--r-- | frontend/hashtable.icl | 56 |
1 files changed, 53 insertions, 3 deletions
diff --git a/frontend/hashtable.icl b/frontend/hashtable.icl index 1e0aefc..0df5802 100644 --- a/frontend/hashtable.icl +++ b/frontend/hashtable.icl @@ -16,7 +16,7 @@ import predef, syntax, StdCompare, compare_constructor | IC_Type | IC_TypeAttr | IC_Class - | IC_Module + | IC_Module !QualifiedIdents | IC_Field !Ident | IC_Selector | IC_Instance ![Type] @@ -24,6 +24,9 @@ import predef, syntax, StdCompare, compare_constructor | IC_GenericCase !Type | IC_Unknown +:: QualifiedIdents = QualifiedIdents !Ident !IdentClass !QualifiedIdents + | NoQualifiedIdents; + :: BoxedIdent = {boxed_ident::!Ident} newHashTable :: !*SymbolTable -> *HashTable @@ -89,7 +92,7 @@ putIdentInHashTable name ident_class {hte_symbol_heap,hte_entries,hte_mark} # hash_val = hashValue name (entries,hte_entries) = replace hte_entries hash_val HTE_Empty (ident, hte_symbol_heap, entries) = insert name ident_class hte_mark hte_symbol_heap entries - hte_entries = update hte_entries hash_val entries + hte_entries = {hte_entries & [hash_val]=entries} = (ident, { hte_symbol_heap = hte_symbol_heap, hte_entries = hte_entries,hte_mark=hte_mark }) where insert :: !String !IdentClass !Int !*SymbolTable *HashTableEntry -> (!BoxedIdent, !*SymbolTable, !*HashTableEntry) @@ -98,7 +101,7 @@ where # ident = { id_name = name, id_info = hte_symbol_ptr} # boxed_ident={boxed_ident=ident} = (boxed_ident, hte_symbol_heap, HTE_Ident boxed_ident ident_class hte_mark0 HTE_Empty HTE_Empty) - insert name ident_class hte_mark0 hte_symbol_heap (HTE_Ident hte_ident=:{boxed_ident={id_name,id_info}} hte_class hte_mark hte_left hte_right) + insert name ident_class hte_mark0 hte_symbol_heap (HTE_Ident hte_ident=:{boxed_ident={id_name}} hte_class hte_mark hte_left hte_right) # cmp = (name,ident_class) =< (id_name,hte_class) | cmp == Equal = (hte_ident, hte_symbol_heap, HTE_Ident hte_ident hte_class (hte_mark bitand hte_mark0) hte_left hte_right) @@ -108,6 +111,33 @@ where #! (boxed_ident, hte_symbol_heap, hte_right) = insert name ident_class hte_mark0 hte_symbol_heap hte_right = (boxed_ident, hte_symbol_heap, HTE_Ident hte_ident hte_class hte_mark hte_left hte_right) +putQualifiedIdentInHashTable :: !String !BoxedIdent !IdentClass !*HashTable -> (!BoxedIdent, !*HashTable) +putQualifiedIdentInHashTable module_name ident ident_class {hte_symbol_heap,hte_entries,hte_mark} + # hash_val = hashValue module_name + (entries,hte_entries) = replace hte_entries hash_val HTE_Empty + (ident, hte_symbol_heap, entries) = insert module_name ident ident_class (IC_Module NoQualifiedIdents) hte_mark hte_symbol_heap entries + hte_entries = update hte_entries hash_val entries + = (ident, { hte_symbol_heap = hte_symbol_heap, hte_entries = hte_entries,hte_mark=hte_mark }) +where + insert :: !String !BoxedIdent !IdentClass !IdentClass !Int !*SymbolTable *HashTableEntry -> (!BoxedIdent, !*SymbolTable, !*HashTableEntry) + insert module_name ident ident_class module_ident_class hte_mark0 hte_symbol_heap HTE_Empty + # (hte_symbol_ptr, hte_symbol_heap) = newPtr EmptySymbolTableEntry hte_symbol_heap + # module_ident = { id_name = module_name, id_info = hte_symbol_ptr} + # boxed_module_ident={boxed_ident=module_ident} + # ident_class = IC_Module (QualifiedIdents ident.boxed_ident ident_class NoQualifiedIdents) + = (boxed_module_ident, hte_symbol_heap, HTE_Ident boxed_module_ident ident_class hte_mark0 HTE_Empty HTE_Empty) + insert module_name ident ident_class module_ident_class hte_mark0 hte_symbol_heap (HTE_Ident hte_ident=:{boxed_ident={id_name}} hte_class hte_mark hte_left hte_right) + # cmp = (module_name,module_ident_class) =< (id_name,hte_class) + | cmp == Equal + # (IC_Module qualified_idents) = hte_class + qualified_idents = QualifiedIdents ident.boxed_ident ident_class qualified_idents + = (hte_ident, hte_symbol_heap, HTE_Ident hte_ident (IC_Module qualified_idents) (hte_mark bitand hte_mark0) hte_left hte_right) + | cmp == Smaller + #! (boxed_ident, hte_symbol_heap, hte_left) = insert module_name ident ident_class module_ident_class hte_mark0 hte_symbol_heap hte_left + = (boxed_ident, hte_symbol_heap, HTE_Ident hte_ident hte_class hte_mark hte_left hte_right) + #! (boxed_ident, hte_symbol_heap, hte_right) = insert module_name ident ident_class module_ident_class hte_mark0 hte_symbol_heap hte_right + = (boxed_ident, hte_symbol_heap, HTE_Ident hte_ident hte_class hte_mark hte_left hte_right) + putPredefinedIdentInHashTable :: !Ident !IdentClass !*HashTable -> *HashTable putPredefinedIdentInHashTable predefined_ident=:{id_name} ident_class {hte_symbol_heap,hte_entries,hte_mark} # hash_val = hashValue id_name @@ -131,6 +161,26 @@ where #! (hte_symbol_heap, hte_right) = insert name ident_class hte_mark0 hte_symbol_heap hte_right = (hte_symbol_heap, HTE_Ident hte_ident hte_class hte_mark hte_left hte_right) +get_qualified_idents_from_hash_table :: !Ident !*HashTable -> (!QualifiedIdents,!*HashTable) +get_qualified_idents_from_hash_table module_ident=:{id_name} hash_table=:{hte_entries} + # hash_val = hashValue id_name + (entries,hte_entries) = replace hte_entries hash_val HTE_Empty + (qualified_idents, entries) = find_qualified_idents id_name (IC_Module NoQualifiedIdents) entries + hte_entries = update hte_entries hash_val entries + = (qualified_idents, {hash_table & hte_entries = hte_entries}) +where + find_qualified_idents :: !String !IdentClass *HashTableEntry -> (!QualifiedIdents, !*HashTableEntry) + find_qualified_idents module_name module_ident_class hte=:(HTE_Ident hte_ident=:{boxed_ident={id_name}} hte_class hte_mark hte_left hte_right) + # cmp = (module_name,module_ident_class) =< (id_name,hte_class) + | cmp == Equal + # (IC_Module qualified_idents) = hte_class + = (qualified_idents, hte) + | cmp == Smaller + #! (qualified_idents, hte_left) = find_qualified_idents module_name module_ident_class hte_left + = (qualified_idents, HTE_Ident hte_ident hte_class hte_mark hte_left hte_right) + #! (qualified_idents, hte_right) = find_qualified_idents module_name module_ident_class hte_right + = (qualified_idents, HTE_Ident hte_ident hte_class hte_mark hte_left hte_right) + remove_icl_symbols_from_hash_table :: !*HashTable -> *HashTable remove_icl_symbols_from_hash_table hash_table=:{hte_entries} # hte_entries=remove_icl_symbols_from_array 0 hte_entries |