Gruppe 2 und 4
Samuel Teuber
propa@teuber.dev
https://teuber.dev/propa
...gegen Ende des Tutoriums!
Terme $$ X_1 = X_2\\ X_2 = X_3 $$ Substitutionen: $$ \sigma_1 = \left[X_1⇨X_2, X_2⇨X_3\right]\\ \sigma_2 = \left[X_2⇨X_3\right]\circ\left[X_1⇨X_2\right]\\ \sigma_3 = \left[X_1⇨a,X_2⇨a,X_3⇨a\right] $$
a([1,2,3],[3,4],L) = a([X|Xs], [Y|Ys], L2)
$$
\left[L⇨L2, X⇨1, Xs⇨[2,3], Y⇨3, Ys⇨[4]\right]
$$
Idee: String -> Folge von Tokens
id:X
+
id:Y
*
float:Z
Grammatik $G = \left(\Sigma, V, P, S\right)$
$w \Rightarrow z$ Anwendung einer Produktion auf $w$ ergibt $z$
$w \Rightarrow^*z$ Anwendung einer, mehrer (oder keiner) Produktion verwandelt w in z
$w \Rightarrow^+ z$ Anwendung mind. einer Produktion
(vs. konkreter Syntaxbaum)
Normalerweise konstruiert ein Parser den AST direkt
LL: Liest einmal von links nach rechts, baut dabei Linksableitung auf
$$ P = \{S \rightarrow AB\\ A \rightarrow a \mid aA\\ B \rightarrow ab \} $$$k$-Lookahead
Indizmenge: Welche Terminale sieht der Parser, wenn er sich zwischen zwei Ableitungsregeln entscheiden muss?
Für $\chi\in\Sigma^*$ ist der $k$-Anfang $k\colon\chi$ der Präfix der Länge $k$ von $\chi\#\#\dots$ ($\#\notin\Sigma$)
Aufgabe
Eine (kontextfreie) Grammatik ist genau dann eine $SLL(k)$-Grammatik, wenn für alle Paare von Produktionen $A \rightarrow \alpha \mid \beta$ ($\alpha \neq \beta$) gilt:
$$ First_k\left(\alpha\ Follow_k\left(A\right)\right) \cap First_k\left(\beta\ Follow_k\left(A\right)\right) = \emptyset $$Für $\alpha \nRightarrow^* \varepsilon$ und $\beta \nRightarrow^* \varepsilon$: $$ SLL \iff First(\alpha) \cap First(\beta) = \emptyset $$
Für $\alpha \Rightarrow^* \varepsilon$ und $\beta \nRightarrow^* \varepsilon$: $$ SLL \iff First(\alpha) \cap First(\beta) = Follow(A) \cap First(\beta) = \emptyset $$
Umfrage
Vermeiden von gemeinsamen Nichtterminal-Anfängen:
Parse-Funktion für Nichtterminal A:
switch (lexer.current) {...}
expect(TokenType.a);
parseA();
parseB();