Abgabetermine:
Auf Grund der grössen Nachfrage verzichte ich auf ein
großes Programmierprojekt noch in Compilerbau. Aber ein bißchen
müssen wir noch tun. Ich stelle hier alle Aufgaben bis zum Ende
des Semesters auf, die Abgabe-Termine entnehmen Sie die Aufstellung.
Frühzeitiger Abgabe ist natürlich jederzeit möglich!
Lernziele:
Recursive-Descent Parser verstehen;
Linksrekursion eliminieren üben;
Befestigung der Begriffe Syntaxbaum, Rechts- bzw.
Linksableitung, Grammatik, FIRST- und FOLLOW-Mengen,
Parse
E -> E + T | E - T | TDazu muß natürlich erst mal die Linksrekursion eliminiert werden. Entwickeln Sie geeigneten Testfälle, um Ihr Parser zu testen, und geben Sie einen Testbericht mit ab. Mein Beispiel Parser recdesc.ada können Sie als Grundlage verwenden.
T -> T * F | T / F | F
F -> i | (E)
A -> Ab | cA | Bd | e
B -> Ba | \epsilon
G = A -> Ba | bC B -> d | eBf C -> gC | gWelche Zeichenreihen sind in L(G)? Geben Sie Syntaxbäume und Ableitungen für diejenigen an, die dazugehören!
bg bffd bggg edfa eedffa faae defa
S => AB => BeB => deB => deaBc => deadc
S
/ | \
/ | \
/ | \
/ | \
A B C
/ \ / \ /|\
B d e f g C g
/ \ / \
e f A d
|
h
S -> aS | SB | d
B -> Bb | c
Zeigen Sie, daß die Grammatik mehrdeutig ist, in den Sie
mehrere Syntaxbäume für aadccb angeben!
S -> ABC
A -> a | Cb | \epsilon
B -> C | dA | \epsilon
C -> e | f
S -> if E then S | if E then S else S | a | b
E -> x | y
ist mehrdeutig. Nach Linksfaktorisierung bekommen wir
S -> if E then SQ | a | b
E -> x | y
Q -> else S | \epsilon
FIRST(Q) = {else \epsilon}
FOLLOW(S) = {$, else}
FOLLOW(Q) = {$, else}
die natülich immer noch mehrdeutig ist, weil FOLLOW(S) und
FOLLOW(Q) nicht disjunkt sind. Damit sieht die Tabelle wie folgt aus:
| if | x | y | then | a | b | else | $ | |
|---|---|---|---|---|---|---|---|---|
| S | if E then SQ | a | b | |||||
| E | x | y | ||||||
| Q | else S \epsilon |
\epsilon |
Wenn wir für [Q, else] else S wählen, behaupte ich, daß der Parser nun korrekt arbeitet, d.h. ein else paßt immer zum nächsten if. Zeigen Sie dies durch Angabe eines Parses und der Syntaxbaum für
| Normal | Vorschlag |
|---|---|
| E -> E+T | E-T | T | E -> T + E | T - E | T |
| T -> T*F | T/F | F | T -> F*T | F/T | F |
| F -> (E) | i | F -> (E) | i |
Ist dies eine gute Idee? Belegen Sie Ihre Begründung mit guten Beispielen!