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 | cZeigen 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 | yist 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!