Szimbólumtáblát megvalósító modul. A szimbólumtábla
verem, melynek elemei kulcs-érték párok. A speciálisan felépített Unbounded
Stack-nek köszönhetően nagyon egyszerű az implementáció, a beépített hibakezelési
részek ellenére is.
Például egy új keret készítése (lásd.
Assembler és fordítóprogramok) csupán
a verem aktuális állapotának eltárolását jelenti. Elem tárolásakor pedig
a legutóbbi állapotot beállítjuk virtuális állapotnak, s a virtuális Push
művelettel egyszerűen visszapörgetjük az az óta (vagyis az aktuális keretben)
betett változók neveit.
Műveletek:
TSymbolTable=cluster [Frame:int] is
Create, Store, Search, Enter, Leave
TEntry=record[Key,Value:string]
rep=TStack[TEntry,Frame]
own outp:stream := stream$primary_output() %for debug reasons
% ---------------------[ Create ]----------------------
Create = proc () returns (cvt)
ret:rep
ret:=rep$Create(TEntry${Key:"",Value:""})
rep$PushState(ret)
return
(ret)
end Create
% ---------------------[ Store ]-----------------------
Store = proc (SymT:cvt,Key:string,Value:string) signals (SYM_Redefine(string))
Ent:TEntry
rep$VRestoreState(SymT)
while (true)
do
Ent:=rep$VPush(SymT)
if Ent.Key=key then
signal SYM_Redefine(string$copy(Key))
end
end
except when
ST_VPushOverflow: rep$Push(SymT,TEntry${Key:Key,Value:Value})
end
end Store
% --------------------[ Search ]------------------------
Search = proc (SymT:cvt,Key:string) returns (string) signals
(SYM_NotFound)
Ent:TEntry
rep$VReset(SymT)
begin
while (true) do
Ent:=rep$VPop(SymT)
if (Ent.Key=Key) then
return (string$copy(Ent.Value))
else
rep$VPop(SymT)
end
end
signal SYM_NotFound
end except
when ST_NullVStack: signal SYM_NotFound
end
end Search
% ---------------------[ Enter ]------------------------
Enter = proc (SymT:cvt)
rep$PushState(SymT)
end Enter
% ---------------------[ Leave ]-------------------------
Leave = proc (SymT:cvt) signals (SYM_NoFrame)
rep$RestoreState(SymT)
except when
ST_NoMoreState: signal SYM_NoFrame
end
end Leave
end TSymbolTable