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

Abstrakte Syntax; Prolog (Listenoperationen)

This commit is contained in:
Martin Thoma 2014-04-02 19:08:06 +02:00
parent b555bae6c4
commit e42277ecda
6 changed files with 56 additions and 1 deletions

View file

@ -147,6 +147,43 @@ Ausgegeben wird ein \textbf{abstrakter Syntaxbaum}\xindex{Syntaxbaum!abstrakter}
TODO
\end{beispiel}
\subsection{Abstrakte Syntax}\xindex{Syntax!abstrakte}%
\begin{beispiel}[Abstrakte Syntax für reguläre Ausdrücke\footnotemark]
Die Grammatik $G = (\Set{\text{\texttt{char}}, (, ), \cup, \cdot, *, \varepsilon}, \Set{R}, P, R)$ mit den Produktionen
\[R \rightarrow \text{\texttt{char}} | \varepsilon | ( R \cup R ) | (R \cdot R) | (R)^*\]
erzeugt einfache reguläre Ausdrücke.
Die zugehörige abstrakte Syntax ist
\begin{align*}
\text{RegExp} &= \text{Char } | \text{ Epsilon } | \text{ Union } | \text{ Concatenation } | \text{ KleeneClosure }\\
\text{Union} &:: \text{RegExp RegExp}\\
\text{Concatenation} &:: \text{RegExp RegExp}\\
\text{KleeneClosure} &:: \text{RegExp}\\
\text{Char} &= \text{\texttt{char}}\\
\text{Epsilon} &= \varepsilon\\
\end{align*}
\end{beispiel}
\footnotetext{Klausur vom SS2012}
\begin{beispiel}[Abstrakte Syntax für reguläre Ausdrücke\footnotemark]
Die Grammatik $G = (\Set{\text{\texttt{char}}, (, ), \cup, \cdot, *, \varepsilon}, \Set{R}, P, R)$ mit den Produktionen
\[R \rightarrow \text{\texttt{char}} | \varepsilon | ( R \cup R ) | (R \cdot R) | (R)^*\]
erzeugt einfache reguläre Ausdrücke.
Die zugehörige abstrakte Syntax ist
\begin{align*}
\text{RegExp} &= \text{Char } | \text{ Epsilon } | \text{ Union } | \text{ Concatenation } | \text{ KleeneClosure }\\
\text{Union} &:: \text{RegExp RegExp}\\
\text{Concatenation} &:: \text{RegExp RegExp}\\
\text{KleeneClosure} &:: \text{RegExp}\\
\text{Char} &= \text{\texttt{char}}\\
\text{Epsilon} &= \varepsilon\\
\end{align*}
\end{beispiel}
\footnotetext{Klausur vom SS2012}
\section{Semantische Analyse}\xindex{Analyse!semantische}%
Die semantische Analyse arbeitet auf einem abstrakten Syntaxbaum und generiert
einen attributierten Syntaxbaum\xindex{Syntaxbaum!attributeriter}.

View file

@ -154,7 +154,8 @@ folgenden Zeilen äquivalent:
Das doppelte Plus (\texttt{++}) wird verwendet um Listen mit einander zu verbinden.
\subsection{Logische Operatoren}
\begin{table}[h]
\begin{table}[H]
\centering
\begin{tabular}{CCCC}
UND & ODER & Wahr & Falsch \\ \hline\hline

View file

@ -86,6 +86,18 @@ Rumpf \texttt{T}.
\xindex{split}Übergibt man \texttt{append(X,Y,[1,2,3,4,5])}, so werden durch Reerfüllung alle
Möglichkeiten durchgegangen, wie man die Liste \texttt{[1,2,3,4,5]} splitten kann.
Die Länge einer Liste \texttt{L} kann durch folgendes Prädikat ermittelt werden:\xindex{length(?List, ?Int)@\texttt{length(?List, ?Int)}}%
\inputminted[numbersep=5pt, tabsize=4]{prolog}{scripts/prolog/list-length.pl}
\underline{Hinweis}: Da es das Prädikat \texttt{length(?List, ?Int)} bereits gibt,
musste dieses Prädikat \texttt{lengthof} genannt werden.
Weitere nützliche Standard-Listenprädikate sind:\xindex{sort(+List, -Sorted)@\texttt{sort(+List, -Sorted)}}
\inputminted[numbersep=5pt, tabsize=4]{prolog}{scripts/prolog/standard-list-predicates.pl}
\underline{Hinweis}: \texttt{sort} entfernt Duplikate, \texttt{msort} hingegen nicht.
\section{Beispiele}
\subsection{Humans}
Erstelle folgende Datei:

View file

@ -0,0 +1,2 @@
lengthof(L, 0) :- L == [].
lengthof([_|R], NewLength) :- lengthof(R,Length), NewLength is Length+1.

View file

@ -0,0 +1,3 @@
sort(+List, -Sorted)
msort(+List, -Sorted)
memberchk(?Elem, +List)