Testaufgaben zu PE − Lösungen
1. Aufgabe: Endliche Automaten
a) Geben Sie einen Endlichen Automaten an, der alle 0,1-Folgen akzeptiert, die mindestens die Länge 1 haben und unter je drei aufeinanderfolgenden Zeichen mindestens eine 1 enthalten. (Zustandsgraph, Start-/Endzustände)
b) Geben Sie eine reguläre Grammatik an, welche die in a) beschriebene Sprache erzeugt.
Begründen Sie kurz, daß Ihre Grammatik dies leistet.
zu a: Zustandsdiagramm
Zustand B ⇔ Es war zuletzt eine 1 da.
Zustand C ⇔ Es war zuletzt eine 0 da und unmittelbar davor eine 1.
Zustand D ⇔ Es war zuletzt zwei Nullen da.
Zustand E ⇔ Fehlerzustand
Startzustand = A, Endzustände = B, C, D
zu b: Grammatik:
{ }
{ }
X 0 | 1
X 1X | 0A | 1| 0 A 1X | 0B | 1| 0 B 1X | 1
| A | B
=
=
→
= →
→
4
4
N T
P
Begründung, daß die Grammatik die in a) beschriebene Sprache erzeugt:
− Die Grammatik erzeugt Folgen von Nullen und Einsen
− Eine 1 kann vom aktuellen Nonterminal aus jederzeit als nächstes Zeichen entstehen
− Eine 0 kann immer entstehen, wenn gerade eine 1 erzeugt wurde, weil dann X das Non- termianl ist.
− Die einzige Möglichkeit zwei Nullen zu erzeugen ist X → ....0A → 00B
− Danach muß erst wieder eine 1 erzeugt werden mit B → ....
2. Aufgabe: Speicherverwaltung
Gegeben ist der folgende Ausschnitt aus einem PL/0-Programm:
var a, b, c; ....
procedure P1;
var a, b; c; ...
begin { P1 } ... end; { P1 } procedure P2;
var a, u, v; ...
procedure P3;
var a, x, y; ...
procedure P4;
var a, b; ...
begin { P4 } ... end; { P4}
begin { P3 } ... end; { P3 } begin { P2 } ... end; { P2 } begin { HP } ... end. { HP }
Skizzieren Sie den Aufbau der Symboltabelle einschließlich der dort eingetragenen Variablen zum Zeitpunkt der Übersetzung des Rumpfes der Prozedur P4 und schildern Sie, wie der Compiler zu diesem Zeitpunkt den Symboltabelleneintrag der Variablen c sucht.
Lösung:
Name Typ Level Offset/Addr 0
1 a varobj 0 3
2 b varobj 0 4
3 c varobj 0 5
4 P1 procobj 0 …
5 P2 procobj 0 …
6 a varobj 1 3
7 u varobj 1 4
8 v varobj 1 5
9 P3 procobj 1 …
10 a varobj 2 3
11 x varobj 2 4
12 y varobj 2 5
13 P4 procobj 2 …
14 a varobj 3 3
15 b varobj 3 4
Die Variable c wird zum Zeitpunkt der Übersetzung des Rumpfes der Prozedur P4 vom unte- re Ende der Symboltabelle her gesucht und auf Position 3 gefunden.
HP P1
P2 P3
P4
Zur Laufzeit kann die folgende Aufruf-Reihenfolge der Prozeduren vorkommen:
HP → P1 → P2 → P3 → P3 → P4 → P2
Die Datenbereiche der Prozeduren Pi sind i∗150 Bytes lang (I=1,2,3,4). Der Datenbereich des Hauptprogramms ist 200 Bytes lang und beginnt auf Adresse 1000. Die Datenbereiche werden in der Aufrufreihenfolge im Laufzeitkeller angelegt. Damit beginnt z.B. der Datenbe- reich von P1 an der Adresse 1200.
Tragen Sie die Anfangsadressen der Datenräume in die unten stehende Skizze ein, entsprechend der obigen Aufrufreihenfolge. tragen Sie außerdem die Adreßwerte der Static Link-Kette (1.Feld im Datenraum) und der Dynamic Link-Kette (2. Feld im Daten- raum) ein.
SL:
DL
SL:
DL
SL:
DL
SL:
DL
SL:
DL
SL:
DL
1000
1200
Eine Variable V1 werde aus dem Aufruf von P4 heraus mit der Adresse (2,50) = (leveldistanz,offset) angesprochen.
Eine Variable V2 wird von der letzten Aktivierung von P2 aus mit (0,10) angesprochen.
Berechnen Sie die absoluten Adressen der Variablen:
Adresse (V1) = 1400
Adresse (V2) = 3160
1350
DSA(HP)
DSA(P1)
DSA(P2)
DSA(P3)
DSA(P3)
DSA(P4)
DSA(P2)
1000 1000
1000 1200
1350 1350
1350 1650
2100 2100
1000 2550
1650
2100
2550
3150
Die folgende Skizze stellt die Display-Vektoren der Datenräume in der selben Situation wie oben dar. tragen Sie die Adreßwerte der Zeiger ein.
0 1 2 3 P1 1000 1200
P2 1000 1350
P3 1000 1350 1650
P3 1000 1350 2100
P4 1000 1350 2100 2550
P2 1000 3150
3. Aufgabe LR-Analyse
Gegeben ist die folgende, bereits um ein nur einmalig auftretendes Axiom X erweiterte Grammatik :
G = 〈N,T,P,X〉 mit:
N = { X, A, V } T = { a | b }
X → V P = V → A A A → a A | b
a) Die erste LR(0)-Information hat die Form X → . V I0 = V → . A A A → . a A A → . b
Vervollständigen Sie die kanonische Kollektion der LR(0)-Informationen.
Es genügt dazu, die folgenden LR(0)-Informationen zu berechnen:
I1 = GOTO(I0,V), I2 = GOTO(I0,A), I3 = GOTO(I0,a), I4 = GOTO(I0,b), I5 = GOTO(I2,A), I6 = GOTO(I3,A)
b) Geben Sie die Aktions- und GOTO-Tabelle für den zugehörigen SLR(1)-Parser an.
Lösung:
1. Follow-Mengen der Nonterminals bestimmen:
FOLLOW(X) = { $ } FOLLOW(A) = { a, b, $ } FOLLOW(V) = { $ }
2. Kanonische Kollektion bestimmen:
Gegeben ist:
X → . V I0 = V → . A A A → . a A A → . b
Die weiteren LR(0)-Infos bestimmt man ausgehend von I0 wie folgt:
I1 = GOTO( I0 , V) = HÜLLE[ X → V. ] = [ X → V. ]
V → A . A I2 = GOTO( I0 , A) = HÜLLE[ V → A.A ] = A → . a A A → . b
A → a . A I3 = GOTO( I0 , a) = HÜLLE[ A → a.A ] = A → . a A A → . b
I4 = GOTO( I0 , b) = HÜLLE[ A → b. ] = [ A → b. ]
I5 = GOTO( I2 , A) = HÜLLE[ V → AA. ] = [ V → AA. ]
I6 = GOTO( I3 , A) = HÜLLE[ A → aA. ] = [ A → aA. ]
Weitere erlaubte Übergänge, die aber keine neuen Zustände liefern, sind auch noch:
GOTO( I2 , a) = HÜLLE[ A → a.A ] = I3
GOTO( I2 , b) = HÜLLE[ A → b. ] = I4
GOTO( I3 , a) = HÜLLE[ A → a.A ] = I3 GOTO( I3 , b) = HÜLLE[ A → b. ] = I4
Das Zustandsdiagramm des zugehörigen LR(0)-Automaten ist damit:
Aktionstabelle Sprungtabelle a b $ X A V
I0 I3 I4 I0 I2 I1
I1 accept I1
I2 I3 I4 I2 I5
I3 I3 I4 I3 I6
I4 A→b A→b A→b I4
I5 V→AA I5
I6 A→aA A→aA A→aA I6