2
0
Fork 0
mirror of https://github.com/MartinThoma/LaTeX-examples.git synced 2025-04-26 06:48:04 +02:00

First- und follow

This commit is contained in:
Martin Thoma 2014-04-04 13:07:12 +02:00
parent 1bcd6dbccc
commit 281f9ea351
5 changed files with 41 additions and 4 deletions

View file

@ -228,7 +228,7 @@ Maschinencode oder Assembler zu erstellen. Dabei muss folgendes beachtet werden:
$x \in \Sigma^*$ mit
\[x = x_1 \dots x_m \text{ mit } x_i \in \Sigma \text{ wobei } i \in 1, \dots, m\]
Dann heißt $\tilde{x} \in (\Sigma \cup \Set{\#})^+$ ein $k$-\textbf{Präfix} von $x$,
Dann heißt $\tilde{x} \in (\Sigma \cup \Set{\#})^+$ ein $k$-\textbf{Anfang} von $x$,
wenn gilt:
\[\tilde{x} =
\begin{cases}
@ -249,6 +249,7 @@ Maschinencode oder Assembler zu erstellen. Dabei muss folgendes beachtet werden:
\end{align*}
Dann gilt:
\begin{multicols}{2}
\begin{bspenum}
\item $a = 1 : aaaa$
\item $a = 1 : a$
@ -257,21 +258,38 @@ Maschinencode oder Assembler zu erstellen. Dabei muss folgendes beachtet werden:
\item $aba = 3 : aba$
\item $aba\# = 4 : aba$
\end{bspenum}
\end{multicols}
\end{beispiel}
\begin{definition}[First- und Follow-Menge]\xindex{Firstkx@$\text{First}_k(x)$}\xindex{Followkx@$\text{Follow}_k(x)$}%
Sei $G = (\Sigma, V, P, S)$ eine Grammatik und $x \in V$.
Sei $G = (\Sigma, V, P, S)$ eine Grammatik und $x \in (V \cup \Sigma)$.
\begin{defenum}
\item $\begin{aligned}[t]\First_k (x) := \{u \in (V \cup \Sigma)^+ | &\exists y \in \Sigma^*:\\
\item $\begin{aligned}[t]\First_k (x) := \{u \in \Sigma^+ | \exists &y \in \Sigma^*:\\
&x \Rightarrow^* y\\
\land &u = k : y \}\end{aligned}$
\item $\begin{aligned}[t]\Follow_k(x) := \{u \in (V \cup \Sigma)^+ | &\exists m, y \in (V \cup \Sigma)^* :\\
\item $\First(x) := \First_1(x)$
\item $\begin{aligned}[t]\Follow_k(x) := \{u \in \Sigma^+ | \exists &m, y \in (V \cup \Sigma)^* :\\
&S \Rightarrow^* mxy\\
\land &u \in \First_k(y)\}\end{aligned}$
\item $\Follow(x) := \Follow_1(x)$
\end{defenum}
\end{definition}
Die $\First_k(x)$-Menge beinhaltet also alle Terminalfolgen, die entweder $k$
Terminale lang sind oder kürzer sind und dafür mit \# enden und die zugleich
der Anfang von Ableitungen von $x$ sind.
Die $\Follow_k(x)$-Menge hingegen hat alle Terminalfolgen der Länge $k$ oder kürzer
und dafür mit \# am Ende, die aus einer Ableitung des Startsymbols $S \Rightarrow^* mxy$
auf die Teilfolge $x$ folgen können.
Mit der $\Follow_k(x)$-Menge kann man also zu jedem Zeitpunkt sagen, was momentan
folgen darf. Wenn der Parser etwas anderes liest, ist ein Fehler passiert.
Da jede Terminalfolge, die sich aus $S$ folgern lässt mit \# endet, gilt immer:
\[\# \in \Follow_k(x)\]
\begin{beispiel}[First- und Follow-Mengen\footnotemark]
Sei $G = (\Sigma, V, P, E)$ mit
\begin{align*}

View file

@ -24,6 +24,7 @@
% no \else branch needed in this case
\fi
\usepackage{enumitem} % Better than \usepackage{enumerate}, because it allows to set references
\usepackage{multicol} % Breaking a list into multiple columns
\usepackage{tabto}
\usepackage{braket} % needed for \Set
\usepackage{csquotes} % \enquote{}

View file

@ -33,6 +33,19 @@ und $Y$ Farben sind und $X \neq Y$ gilt:
\inputminted[numbersep=5pt, tabsize=4]{prolog}{scripts/prolog/simple-term.pl}
\subsection{= und ==}\xindex{= (Prolog)}\xindex{== (Prolog)}
In Prolog entspricht \texttt{=} dem Prädikat \texttt{=/2}. Das Prädikat \texttt{<a> = <b>} wird
erfüllt, wenn die beiden Terme \texttt{<a>} und \texttt{<b>} unifiziert werden
können.
Das Prädikat \texttt{<a> == <b>} ist im Gegensatz dazu jedoch nur erfüllt, wenn
die beiden Terme bereits identisch sind.
\begin{beispiel}[= und ==]
\inputminted[numbersep=5pt, tabsize=4]{prolog}{scripts/prolog/equal.pl}
\end{beispiel}
Weitere Informationen: \url{http://stackoverflow.com/a/8220315/562769}
\subsection{Arithmetik}
Die Auswertung artihmetischer Ausdrücke muss in Prolog explizit durch \texttt{is}

View file

@ -0,0 +1,5 @@
?- X = Y.
X = Y.
?- X == Y.
false.