WS 97/98: Algorithmen und Programmierung III - Übungsblatt 6
Abgabe bis 27.11., 12.30 Uhr
Aufgabe 6.1 (7 Punkte)
In blockstrukturierten Programmiersprachen gibt es geschachtelte
Sichtbarkeitsbereiche mit eventuellen Namensverdeckungen. Hier ein
Programmfragment in einer Modula-ähnlichen Sprache:
VAR i: int;
b: bool;
PROC p;
VAR c: char;
b: real;
BEGIN ... c
... b
... i ...
END p;
BEGIN ... b
... c ... {Fehler!}
END
Den Umgang des Übersetzers mit den im Programm vorkommenden Namen
kann man sich im Modell wie folgt vorstellen: Für jeden Block gibt
es eine eigene Symboltabelle. Die Tabellen werden in einer kellerähnlichen
Tabellenfolge verwaltet. Beim Eintritt in einen Block wird eine leere
Tabelle eingekellert, und beim Blockaustritt wird die oberste Tabelle
ausgekellert. Eintragungen werden ausschließlich in der obersten Tabelle
vorgenommen. Beim Suchen von Einträgen kann es allerdings erforderlich
sein, auch weiter unten im Keller liegende Tabellen zu befragen. Somit
kann man wie folgt spezifizieren:
DEFINITION MODULE Symbolkeller;
(* Modell: Folge von Tabellen gemäß der Spezifikation
der Symboltabelle aus Aufgabe 5.2, anfangs leer. *)
(* Inv.: - *)
TYPE Name = ...
Attribute = ...
PROCEDURE blockanfang;
PROCEDURE blockende(): BOOLEAN;
PROCEDURE eintragen(n: Name; a: Attribute): BOOLEAN;
PROCEDURE aufsuchen(n: Name; VAR a: Attribute): BOOLEAN;
PROCEDURE leer(): BOOLEAN;
END Symbolkeller.
a) Vervollständige diese Spezifikation durch Angabe der Voraussetzungen
und Effekte!
b) Entwickle eine Implementierung, die nicht von der Symboltabelle
aus Aufgabe 5.2 Gebrauch macht! Vielmehr soll eine kellerähnliche Folge
von Einträgen geführt werden, in die spezielle Blocktrennungsmarkierungen
eingestreut sind. Für das obige Programmbeispiel könnte man etwa den
folgenden Schnappschuß vorfinden:
Namen: * i b p * c b
Attribute: ......
Das Implementierungsmodul soll wie üblich dokumentiert werden.
Erforderlich sind Invariante, Abstraktion und
Voraussetzungen/Effekte.
Aufgabe 6.2 (5 Punkte)
Entwickle eine iterative Prozedur für die Türme von Hanoi!
17.11.1997