Aufgabe 1 Lösung
a) Zuerst kann man nullable berechnen: nullable(S)=false (direkt), nullable(A)=true (direkt), nullable(B)= true (weilB→AAund nullable(A))
Wer sich den Algorithmus anschaut, sieht, dass die FIRST-Berechnung nicht von den FOLLOW-Mengen ab- hängt. Wir können also im nächsten Schritt alle FIRST-Mengen berechnen. Wir gehen in einer etwas anderen Reihenfolge durch die Produktionen, um schneller zum Ziel zu kommen:
1. B→bBc: FIRST[B]← {b}.
2. A→BAa: FIRST[A]←FIRST[B]={b}.
3. A→BAa: FIRST[A]←FIRST[A]∪ {a}={a,b}, da nullable(B) und nullable(A).
4. B→AA: FIRST[B]←FIRST[B]∪FIRST[A]={a,b} 5. S→A#: FIRST[S]←FIRST[A]={a,b}
6. S→A#: FIRST[S]←FIRST[S]∪ {#}={a,b, #}, da nullable(A) Ergebnis: FIRST[A] ={a,b}, FIRST[B] ={a,b}, FIRST[S] ={a,b, #}.
Die FOLLOW-Mengen lassen sich nun ebenfalls ermitteln. Es werden nur Schritte angegeben, die die Mengen verändern:
1. S→A#: FOLLOW[A]← {#}.
2. A→BAa: FOLLOW[B]←FOLLOW[B]∪FIRST[A] ={a,b} 3. A→BAa: FOLLOW[A]←FOLLOW[A]∪ {a}={a, #} 4. B→bBc: FOLLOW[B]←FOLLOW[B]∪ {c}={a,b,c} 5. B→AA: FOLLOW[A]←FOLLOW[A]∪FIRST[A] ={a,b, #} 6. B→AA: FOLLOW[A]←FOLLOW[A]∪FOLLOW[B] ={a,b,c, #} Endergebnis:
nullable FIRST FOLLOW S false a, b, #
A true a, b a, b, c, # B true a, b a, b, c
b) Sie enthalten nicht das leere Wort. Mengen nach der Vorlesung: FIRST1(A) ={ε,a,b}, FIRST1(B) ={ε,a,b}, FIRST1(S) ={a,b, #},
c) Wir benutzen das Lemma aus der Vorlesung. Für die ProduktionA→BAagilt:
FIRST1(BAa)⊕1FOLLOW1(A)
=FIRST1(B)∪FIRST1(A)∪ {a} ⊕1FOLLOW1(A)
={ε,a,b} ⊕1{a,b,c, #}
={a,b,c, #}
für die ProduktionA→εgilt:
FIRST1(ε)⊕1FOLLOW1(A)={ε} ⊕1{a,b,c, #}={a,b,c, #}
Da die Schnittmenge nicht leer ist, folgt daraus, dassΓ1nicht LL(1) ist.
d)
foreach terminal symbola FIRST[a]← {a} repeat
foreach productionX→α1α2· · ·αk
FIRST[X]←FIRST[X]∪FIRST[α1]
FOLLOW[αk]←FOLLOW[αk]∪FOLLOW[X] foreachifrom 1 tok−1
FOLLOW[αi]←FOLLOW[αi]∪FIRST[αi+1]
untilFIRST, FOLLOW, and nullable did not change in this iteration
1