SLL(k)-Grammatik

kontextfreie Grammatik

Eine SLL(k)-Grammatik (auch starke LL(k)-Grammatik) ist eine spezielle kontextfreie Grammatik, welche die Grundlage eines SLL(k)-Parsers bildet. Sie ist eine besondere Form der LL(k)-Grammatik. Im Gegensatz zu dieser kann für eine aus der Grammatik ableitbare Terminalfolge allein durch die nächsten k-Symbole der Terminalfolge (Lookahead) – ohne Berücksichtigung der vorhergegangenen Zeichen – die nächste Produktion der Produktionsfolge, die die Terminalfolge erzeugt, eindeutig gewählt werden.

Formale Definition SLL(k)-Grammatik

Bearbeiten

Eine kontextfreie Grammatik   ist genau dann eine starke LL(k) Grammatik für festes k > 0, wenn für beliebige Ableitungen der Form

 

mit   und   gilt:  

Dabei ist  

mit Sentinel  .


Es lässt sich zeigen, dass jede LL(1)-Grammatik auch eine SLL(1)-Grammatik ist. Für allgemeine   ist dies aber nicht der Fall.

Alternatives Kriterium

Bearbeiten

Der formale Nachweis der Gültigkeit obiger Definition für eine beliebige SLL(k)-Grammatik ist oft schwierig, weshalb hier ein alternatives Kriterium für eine SLL(k)-Grammatik vorgestellt wird.

Dafür seien zunächst

 

die First- und Followmengen. Eine intuitive Erklärung für die Firstmenge ist, dass diese für die gegebene Zeichenfolge   die ersten k Terminale, die sich aus   ableiten lassen, enthält. Die Followmenge hingegen enthält diejenigen Terminale, die bei einer Produktionsfolge die   ausgehend vom Startterminal erzeugt, nach   folgen können.

Mit den First- und Followmengen lässt sich nun das Kriterium definieren:

Eine Grammatik ist genau dann eine SLL(k)-Grammatik, wenn paarweise für alle Produktionen der Form   gilt:

 

Dabei ist die Followmenge nur relevant, falls es sich bei der entsprechenden Ableitung um eine  -Ableitung handelt.

Auch hier findet sich eine intuitive Erklärung: Der Schnitt beider Mengen stellt gerade die Terminalsequenzen der Länge   dar, die nach der Ableitung von   aus beiden Produktionen erzeugt werden können. Wenn aber nun ein Parser den aktuellen Terminalstrom verarbeitet, muss sich dieser deterministisch für eine Produktion entscheiden. Dies kann er aber nicht wenn der gleiche Zeichenstrom aus mehreren Produktionen generiert werden kann. Genau diese Situation wird durch obige Definition verhindert: unabhängig vom vorhergegangenen Zeichen   bzw.   ist die nächste Produktion eindeutig. Ein Parser braucht somit bereits gelesene Zeichen nicht nochmals zu betrachten.

Siehe auch

Bearbeiten

Literatur

Bearbeiten
  • Waite, W., & Goos, G. (1984). Compiler Construction. New York, USA: Springer-Verlag, ISBN 0-387-90821-8.