aboutsummaryrefslogtreecommitdiff
path: root/frontend/hashtable.icl
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/hashtable.icl')
-rw-r--r--frontend/hashtable.icl56
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