home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1988 / 10_11 / symbol.mod < prev    next >
Text File  |  1988-06-30  |  6KB  |  195 lines

  1. (*-------------------------------------------------------*)
  2. (*                      SYMBOL.MOD                       *)
  3. (*       (C) 1988 Frank F. Wachtmeister & TOOLBOX        *)
  4.  
  5. IMPLEMENTATION MODULE Symbol;
  6.  
  7. FROM Streams IMPORT Stream;
  8. FROM Strings IMPORT Assign, Concat, Compare,
  9.                     CompareResults;
  10. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  11. FROM SYSTEM  IMPORT ADDRESS;
  12. FROM TextIO  IMPORT WRiteString, WRiteLn, WRiteCard,
  13.                     REadString;
  14.  
  15. (* TreeOperation ermöglicht eine Operation Op, angewandt
  16.    auf jedes Blatt des BAUMes. Siehe PASCAL 3/88, S.62
  17.    Die Durchlaufrichtung des Binärbaumes kann von der
  18.    übergebenen Prozedur her modifiziert werden. Laufzeit !
  19.    ==> Zwei Modi: All-Modus --> Lexikalische Suche.
  20.        Kontrollierte Modus: Die Wurzel wird über die
  21.        Prozedur Op analysiert, danach Entscheidung, ob nur
  22.        der rechte oder  linke Teilbaum abgearbeitet wird.
  23.    Der Zustand Stop beendet die Rekursion.               *)
  24.  
  25. TYPE DirectionType = ( Stop, All, Left, Right);
  26.      (* Suchrichtung *)
  27.      TreeOp = PROCEDURE(VAR SymbolTable,
  28.                         VAR DirectionType);
  29.  
  30. PROCEDURE TreeOperation (    Baum: SymbolTable; Op: TreeOp;
  31.                          VAR dir: DirectionType );
  32. BEGIN
  33.   IF (Baum<>NIL) AND (dir>Stop) THEN
  34.     WITH Baum^ DO
  35.       IF dir < Left THEN
  36.         TreeOperation (links, Op, dir);
  37.         IF dir<>Stop THEN Op (Baum, dir) END;
  38.         IF dir<>Stop THEN TreeOperation(rechts,Op,dir) END;
  39.       ELSE
  40.         Op (Baum, dir);
  41.         IF    dir=Left  THEN TreeOperation(links,Op,dir)
  42.         ELSIF dir=Right THEN TreeOperation(rechts,Op,dir)
  43.         ELSE  (* dir=Stop *) ;
  44.         END
  45.       END
  46.     END (* WITH *)
  47.   END (* IF *)
  48. END TreeOperation;
  49.  
  50. PROCEDURE Terminate;
  51. VAR s: ARRAY[1..80] OF CHAR;
  52. BEGIN
  53.    WRiteLn(main); WRiteString(main,'Program terminated.');
  54.    WRiteLn(main); WRiteString(main,'Press <RETURN>');
  55.    REadString(main,s); HALT;
  56. END Terminate;
  57.  
  58. PROCEDURE HeapCheck (a: ADDRESS);
  59. BEGIN
  60.   IF a=NIL THEN
  61.     WRiteString(main,'HEAP zu klein.'); WRiteLn(main);
  62.     Terminate;
  63.   END;
  64. END HeapCheck;
  65.  
  66. MODULE PRINT;
  67. IMPORT WRiteString, WRiteCard,WRiteLn, main, TreeOperation,
  68.        DirectionType, SymbolTable, String, HeapCheck;
  69. EXPORT PrintTree;
  70. (* PrintTree druckt den Inhalt eines BAUMes in alpha-
  71.    betischer Reihenfolge. MASTER: PrintTree.
  72.    SLAVE : PrintLeave.                                  *)
  73. PROCEDURE PrintLeave(VAR b: SymbolTable;
  74.                      VAR dir:DirectionType);
  75. BEGIN
  76.   WITH b^ DO
  77.     WRiteCard(main,rc,4); WRiteString (main,': ');
  78.     WRiteString(main,tx); WRiteLn(main);
  79.   END;
  80. END PrintLeave;
  81.  
  82. PROCEDURE PrintTree ( Baum: SymbolTable );
  83. VAR dir: DirectionType;
  84. BEGIN
  85.   dir:=All;TreeOperation(Baum,PrintLeave,dir);
  86. END PrintTree;
  87. END PRINT;
  88.  
  89.  
  90. MODULE SEARCH;
  91. (* SEARCH umfaßt Prozeduren zur Suche in Binärbäumen.
  92.    Search und SearchRC dienen zur Parameterübergabe
  93.    zwischen "MASTER"- und "SLAVE"-Prozedurpaaren.        *)
  94.  
  95. IMPORT Compare, CompareResults, Assign, SymbolTable,
  96.        DirectionType, String, RCTyp, TreeOperation,
  97.        NotFound, HeapCheck, ALLOCATE, DEALLOCATE;
  98. EXPORT SearchRC, SearchTxt, AddSymbol;
  99. VAR search: String;
  100.     searchRC: CARDINAL;
  101.  
  102. (* SearchRC sucht nach TXT in einer Symboltabelle s und
  103.    gibt den zugehörigen Relativcode zurück.
  104.    Die SLAVE-Prozedur steuert die Suche im Baum.        *)
  105.  
  106. PROCEDURE FindRC(VAR b:SymbolTable; VAR dir:DirectionType);
  107. VAR c: CompareResults;
  108. BEGIN
  109.   c:=Compare (search, b^.tx);
  110.   CASE c OF
  111.     Less   : dir:=Left; (* Durchsuche linken Teilbaum *)
  112.   | Equal  :
  113.       dir     := Stop;  (* Beendet Suche *)
  114.       searchRC:=b^.rc;
  115.   | Greater: dir:=Right;(* Durchsuche rechten Teilbaum*)
  116.   END;
  117. END FindRC;
  118.  
  119. PROCEDURE SearchRC ( VAR s: SymbolTable;
  120.                      VAR txt: ARRAY OF CHAR ): RCTyp;
  121. VAR dir: DirectionType;
  122. BEGIN
  123.    searchRC:=NotFound; dir:=Left; Assign (search,txt);
  124.    TreeOperation (s, FindRC, dir);
  125.    RETURN (searchRC);
  126. END SearchRC;
  127.  
  128. (* SearchTxt sucht nach Relativcode rc in Symboltabelle s
  129.    und gibt den zugehörigen Textstring txt zurück.       *)
  130.  
  131. PROCEDURE FindTxt (VAR b: SymbolTable;
  132.                    VAR dir: DirectionType);
  133. BEGIN
  134.   IF b^.rc=searchRC THEN
  135.     Assign (search, b^.tx); dir:=Stop;
  136.   END;
  137. END FindTxt;
  138.  
  139. PROCEDURE SearchTxt( VAR s: SymbolTable; 
  140.                      VAR rc:RCTyp; VAR txt: ARRAY OF CHAR);
  141. VAR dir: DirectionType;
  142. BEGIN
  143.    Assign (search,''); dir:=All; searchRC:=rc;
  144.    TreeOperation (s, FindTxt, dir); Assign (txt, search);
  145. END SearchTxt;
  146.  
  147. (* AddSymbol fügt einen NAMEn mit Relativcode rc in
  148.    Symboltabelle s ein.                               *)
  149. PROCEDURE CompareAndAdd (VAR b: SymbolTable;
  150.                          VAR dir: DirectionType);
  151. VAR c: CompareResults;
  152. BEGIN
  153.   c:=Compare (search, b^.tx);
  154.   CASE c OF
  155.     Less :
  156.       IF b^.links=NIL THEN (* Erzeuge "linken" Sohn *)
  157.         NEW (b^.links); HeapCheck (b^.links); dir:=Stop;
  158.         WITH b^.links^ DO
  159.           rc:=searchRC; Assign (tx,search);
  160.           links:=NIL; rechts:=NIL;
  161.         END
  162.       ELSE dir:=Left END; (* Durchsuche linken Teilbaum *)
  163.     | Equal  :
  164.       dir  := Stop;      (* Beendet Suche *)
  165.       b^.rc:= searchRC;  (* Überschreibe Relativcode *)
  166.     | Greater:
  167.       IF b^.rechts=NIL THEN (* Erzeuge "rechten" Sohn *)
  168.         NEW (b^.rechts); HeapCheck(b^.rechts); dir:=Stop;
  169.         WITH b^.rechts^ DO
  170.           rc:=searchRC; Assign(tx,search);
  171.           links:=NIL; rechts:=NIL;
  172.         END
  173.       ELSE dir:=Right END; (* Suche im rechten Teilbaum *)
  174.    END;
  175. END CompareAndAdd;
  176.  
  177. PROCEDURE AddSymbol(VAR s: SymbolTable;
  178.                     VAR name: ARRAY OF CHAR; r:RCTyp);
  179. VAR dir: DirectionType;
  180. BEGIN
  181.   IF s=NIL THEN
  182.     NEW (s); HeapCheck (s);
  183.     WITH s^ DO
  184.       rc:=r; Assign (tx,name); links:=NIL; rechts:=NIL;
  185.     END
  186.   ELSE
  187.     Assign (search, name); dir:=Left; searchRC:=r;
  188.     TreeOperation (s, CompareAndAdd, dir);
  189.   END;
  190. END AddSymbol;
  191.  
  192. END SEARCH;
  193.  
  194. END Symbol.
  195.