CLU példaprogramok

Symbol Table

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