Parcourir la source

Abstrakte Syntax; Prolog (Listenoperationen)

Martin Thoma il y a 11 ans
Parent
commit
e42277ecda

+ 37 - 0
documents/Programmierparadigmen/Compilerbau.tex

@@ -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}.

+ 2 - 1
documents/Programmierparadigmen/Haskell.tex

@@ -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

BIN
documents/Programmierparadigmen/Programmierparadigmen.pdf


+ 12 - 0
documents/Programmierparadigmen/Prolog.tex

@@ -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:

+ 2 - 0
documents/Programmierparadigmen/scripts/prolog/list-length.pl

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

+ 3 - 0
documents/Programmierparadigmen/scripts/prolog/standard-list-predicates.pl

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