Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lecture: add definition of Follow(k) and more examples (CFG) #303

Merged
merged 3 commits into from
Nov 16, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 29 additions & 3 deletions lecture/02-parsing/cfg.md
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,25 @@ Für eine kontextfreie Grammatik $G$ ist nicht entscheidbar, ob es eine *LL(1)*
In der Praxis reichen *LL(1)* - Grammatiken oft. Hier gibt es effiziente Parsergeneratoren (hier: ANTLR), deren Eingabe eine LL-Grammatik ist, und die als Ausgabe den Quellcode eines (effizienten) tabellengesteuerten Parsers generieren.


## Was brauchen wir zur Erzeugung eines LL(k)-Parsers?

* eine *LL(k)*-Grammatik
* die $First_k$-Mengen der rechten Seiten aller Produktionsregeln
* die $Follow_k$-Mengen aller Nichtterminale und der rechten Seiten aller Produktionsregeln
* das Endezeichen $\perp$ hinter dem Eingabewort

**Def.:** Wir definieren $Follow$ - Mengen einer Grammatik wie folgt:

$Follow_k(\beta) = \lbrace w \in T^\ast\ |\ \exists \alpha, \gamma \in (N \cup T)^\ast\ \text{mit}\ S \overset{\ast}{\Rightarrow}_l\ \alpha \beta \gamma\ \text{und}\ w \in First_k(\gamma) \rbrace$


## Beispiel: First- und Follow-Mengen

:::notes
Hier entsteht ein Tafelbild.
:::


## Algorithmus: Konstruktion einer LL-Parsertabelle {.fragile}

**Eingabe:** Eine Grammatik $G = (N, T, P, S)$
Expand All @@ -259,19 +278,21 @@ In der Praxis reichen *LL(1)* - Grammatiken oft. Hier gibt es effiziente Parserg

![Algorithmus zur Generierung einer LL-Parsertabelle](images/LL-Parsertabelle.png){width="60%"}

Hier ist $\perp$ das Endezeichen des Inputs.
Statt $First_1(\alpha)$ wird oft nur $First(\alpha)$ geschrieben.

## LL-Parsertabellen

## Beispiel: LL-Parsertabellen

:::notes
Hier entsteht ein Tafelbild.
:::

## LL-Parsertabellen

## LL-Parser

Rekursive Programmierung bedeutet, dass das Laufzeitsystem einen Stack benutzt. Diesen Stack kann man auch "selbst programmieren", d. h. einen PDA implementieren. Dabei wird ebenfalls die oben genannte Tabelle zur Bestimmung der nächsten anzuwendenden Produktion benutzt. Der Stack enthält die zu erwartenden Eingabezeichen, wenn immer eine Linksableitung gebildet wird. Diese Zeichen im Stack werden mit dem Input gematcht.


## Algorithmus: Tabellengesteuertes LL-Parsen mit einem PDA {.fragile}

**Eingabe:** Eine Grammatik $G = (N, T, P, S)$, eine Parsertabelle $P$ mit "$w\perp$" als initialem Kellerinhalt
Expand All @@ -281,6 +302,11 @@ Rekursive Programmierung bedeutet, dass das Laufzeitsystem einen Stack benutzt.
![Algorithmus zum tabellengesteuerten LL-Parsen](images/LL-Parser.png){width="49%"}


## Beispiel: LL-Parsen
:::notes
Hier entsteht ein Tafelbild.
:::


## Ergebnisse der Syntaxanalyse

Expand Down