LF(k)-Grammatik

Aus testwiki
Zur Navigation springen Zur Suche springen

Dieser Artikel setzt Vorkenntnisse im Bereich Theoretische Informatik und Compilerbau voraus.


Eine LF(k)-Grammatik ist eine spezielle kontextfreie Grammatik, welche die Grundlage eines LF(k)-Parsers bildet. Auf Grund der sehr engen Verwandtschaft werden LF(k)-Grammatiken auch als starke LL(k)-Grammatiken bezeichnet.

Die Bezeichnung LF(k)-Grammatik bedeutet, dass jeder Ableitungsschritt eindeutig durch k Symbole der Eingabe (Lookahead) bestimmt ist. Damit kann die Frage, welches Nichtterminalsymbol mit welcher Regel als Nächstes expandiert werden soll, eindeutig mit Hilfe der nächsten k Symbole der Eingabe beantwortet werden.

Generell gilt, je größer k gewählt wird, umso mächtiger wird die Sprachklasse, wobei die Ausdrucksstärke von kontextfreien Grammatiken nie erreicht wird. Damit gibt es kontextfreie Grammatiken, die für kein k LF(k)-Grammatiken sind.

(LF(1))(LF(2))(PDA)

Formale Definition LF(k)-Grammatik

Eine kontextfreie Grammatik G=(N,Σ,P,S) ist genau dann eine LF(k)-Grammatik, wenn für alle Linksableitungen der Form

wAγlwαγl*wx
Sl*
wAγlwβγl*wy

mit w,w,x,yΣ*;α,β,γ,γ(NΣ)*;AN und firstk(x)=firstk(y) gilt α=β.

Für die in der Definition benutzte Funktion zur Bestimmung der first-Mengen gilt:

aΣ*;|a|k 𝑓𝑖𝑟𝑠𝑡k(a)={a}
aΣ*;|a|>k 𝑓𝑖𝑟𝑠𝑡k(a)={vΣ*a=vw;|v|=k}
A(NΣ)*Σ* 𝑓𝑖𝑟𝑠𝑡k(A)={vΣ*A*w;wΣ*;𝑓𝑖𝑟𝑠𝑡k(w)={v}}
𝒜2(NΣ)* 𝑓𝑖𝑟𝑠𝑡k(𝒜)={wfirstk(α)α𝒜}

Anwendung

Die formale Definition einer LF(k)-Grammatik ist bezüglich praktischer Anwendung nur mit großem Aufwand überprüfbar. Daher erfolgt die Prüfung auf LF(k)-Eigenschaft mithilfe eines abgewandelten Ansatzes.

Eine reduzierte kontextfreie Grammatik ist genau dann eine LF(k)-Grammatik, wenn für alle Nichtterminalsymbole A und für alle Produktionen Aβ und Aγ mit βγ gilt: firstk({β}followk(A))firstk({γ}followk(A))=.


Erklärung: Infolge einer Wortableitung wurde das Startsymbol der kontextfreien Grammatik (in eventuell mehreren Schritten) expandiert. Angenommen, im nächsten Schritt soll das Nichtterminalsymbol A ersetzt werden. Dazu stehen aber zwei verschiedene Regeln Aβ und Aγ zur Verfügung. Ist die in der Gesetzmäßigkeit angegebene Schnittmenge leer, dann kann die Regelauswahl eindeutig getroffen werden.

Für diesen Zweck wird die Funktion followk(A) benötigt, die die Menge aller A folgenden Symbole berechnet.

β(NΣ)*gilt:followk(β)={wΣ*αγ(NΣ)*mitSl*αβγundwfirstk(γ)}

Die Prüfung auf LL(1)-Eigenschaft benutzt den gleichen Ansatzpunkt. Eine Verallgemeinerung auf beliebige k ist dabei jedoch nicht möglich. Dieser Unterschied grenzt beide Grammatikformen voneinander ab.

Beispiel

Die Grammatik G soll auf ihre LF(k)-Eigenschaft hin untersucht werden. Mit anderen Worten: Für welches k ist G eine LF(k)-Grammatik?

G=({S,A},{ε,a,b},P,S) und die Menge der Produktionen ist
SaAaaSbAbaAεAb

Zunächst werden die first- bzw. follow-Mengen der Nichtterminalsymbole bestimmt.

first1 first2 first3 follow1 follow2 follow3
S {a,b} {aa,ab,bb} {aaa,aba,bba,bbb} {ε} {ε} {ε}
A {ε,b} {ε,b} {ε,b} {a,b} {aa,ba} {aa,ba}

Es folgt der Vergleich der wie oben definierten Mengen für alle Produktionen mit gleichen linken Regelseiten. In diesem Beispiel werden somit die Regeln SaAaa mit SbAba und Aε mit Ab verglichen.

Im Fall des Nichtterminalsymbols S sind schon für k=1 die Mengen first1({aAaa}follow1(S))={a} und first1({bAba}follow1(S))={b} disjunkt. Weitere Betrachtungen für größere k können entfallen.

k=1 k=2 k=3
firstk({ε}followk(A)) {a,b} {aa,ba} {aa,ba}
firstk({b}followk(A)) {b} {ba,bb} {baa,bba}

Erst für k=3 sind die zu vergleichenden Mengen disjunkt und damit die deterministische Regelauswahl gewährleistet. Die Beispielgrammatik G ist also eine LF(3)-Grammatik.

Literatur