Zunächst geben wir ein Beispiel für eine doppelt verkettete Liste.
package Doubly_Linked is
Wir werden nun dieses Paket benutzen, um eine Assoziationstabelle zu realisieren. Das generische Paket Association hat als Parameter einen Key_Type, einen darauf definierten Gleichheitsoperator und eine darauf definierte Hash-Funktion.
with Doubly_Linked;
generic
type Key_Type is limited private;
with function "
"
(Left, Right: Key_Type) return Boolean is
with function Hash(Key: Key_Type) return Integer is
package Association is
type Element_Type is new Doubly_Linked.Node_Type with
record
Key: Key_Type;
end record;
type Element_Ptr is new Doubly_Linked.Node_Ptr;
function Key(E: Element_Ptr) return Key_Type;
type Association_Table(Size: Positive) is limited private;
procedure Enter(
Table: in out Association_Table;
Element: in Element_Ptr);
function Lookup(
Table: in Association_Table;
Key: in Key_Type)
return Element_Ptr;
-andereOperationen
private
type Element_Ptr_Array is array (Integer range
type Association_Table(Size: Positive) is
record
Buckets: Element_Ptr_Array(1..Size);
end record;
end Association;
Wir werden nun diese Hash-Tabelle benutzen, um eine Symboltabelle für einen Compiler einer einfachen Sprache zu definieren. Die Sprache soll Typen, Objekte und Funktionen kennen und die Symboltabelle soll dafür jeweils unterschiedliche Einträge haben.
with Association;
package Symbol_Table_Pkg is
type Identifier is access string;
function Equal(Left,Right: identifier) return Boolean;
function Hash(Key: Identifier) return Integer;
-Instantiierung
package Symbol_Association is
new Association(Identifier, Equal, Hash);
subtype Symbol_Table is
Symbol_Association.Association_Table;
type Type_Symbol is new Symbol_Association.Element_Type with
record
Category: Type_Category;
Size: Natural;
end record;
type Type_Ptr is access Type_Symbol;
type Object_Symbol is new Symbol_Association.Element_Type with
record
Object_Type: Type_Ptr;
Stack_Offset: Integer;
end record;
type Function_Symbol is new Symbol_Association.Element_Type with
record
Return_Type: Type_Ptr;
Formals: Symbol_Table(5); -einekleineHash-Tabelle
Locals: Symbol_Table(19); -eineetwasgroessereHash-Tabelle
Function_Body: Statement_List;
end record;
end Symbol_Table_Pkg;
Johann Blieberger