mirror of
https://github.com/MartinThoma/LaTeX-examples.git
synced 2025-04-26 06:48:04 +02:00
Abschnitt über Reguläre Ausdrücke und Lex hinzugefügt
This commit is contained in:
parent
3657c5d8f5
commit
872cb8db96
5 changed files with 83 additions and 23 deletions
|
@ -1,3 +1,4 @@
|
|||
%!TEX root = Programmierparadigmen.tex
|
||||
\chapter{Compilerbau}
|
||||
\index{Compilerbau|(}
|
||||
|
||||
|
@ -64,7 +65,7 @@ Ausführung des Programms $A$ in Maschinencode (z.~B. x86, SPARC) übersetzt.
|
|||
\item Assemblieren und Binden
|
||||
\end{enumerate}
|
||||
|
||||
\subsection{Lexikalische Analyse}\xindex{Analyse!lexikalische}%
|
||||
\section{Lexikalische Analyse}\xindex{Analyse!lexikalische}%
|
||||
In der lexikalischen Analyse wird der Quelltext als Sequenz von Zeichen betrachtet.
|
||||
Sie soll bedeutungstragende Zeichengruppen, sog. \textit{Tokens}\xindex{Token},
|
||||
erkennen und unwichtige Zeichen, wie z.~B. Kommentare überspringen. Außerdem
|
||||
|
@ -75,6 +76,66 @@ zusammengefasst werden.
|
|||
\todo[inline]{Beispiel erstellen}
|
||||
\end{beispiel}
|
||||
|
||||
\subsection{Reguläre Ausdrücke}\xindex{Ausdrücke!reguläre}
|
||||
\begin{beispiel}[Regulärere Ausdrücke]
|
||||
Folgender regulärer Ausdruck erkennt Float-Konstanten in C nach
|
||||
ISO/IEC 9899:1999 §6.4.4.2:
|
||||
|
||||
$((0|\dots|9)^*.(0|\dots|9)^+)|((0|\dots|9)^+.)$
|
||||
\end{beispiel}
|
||||
|
||||
\begin{satz}
|
||||
Jede reguläre Sprache wird von einem (deterministischen) endlichen
|
||||
Automaten akzeptiert.
|
||||
\end{satz}
|
||||
|
||||
TODO: Bild einfügen
|
||||
|
||||
Zu jedem regulären Ausdruck im Sinne der theoretischen Informatik kann ein
|
||||
nichtdeterministischer Automat generiert werden. Dieser kann mittels
|
||||
Potenzmengenkonstruktion\footnote{\url{http://martin-thoma.com/potenzmengenkonstruktion/}}
|
||||
in einen deterministischen Automaten überführen. Dieser kann dann mittels
|
||||
Äquivalenzklassen minimiert werden.
|
||||
|
||||
\todo[inline]{Alle Schritte beschreiben}
|
||||
|
||||
\subsection{Lex}\index{Lex|(}\index{Flex|see{Lex}}
|
||||
Lex ist ein Programm, das beim Übersetzerbau benutzt wird um Tokenizer für die
|
||||
lexikalische Analyse zu erstellen. Flex ist eine Open-Source Variante davon.
|
||||
|
||||
Eine Flex-Datei besteht aus 3 Teilen, die durch \texttt{\%\%} getrennt werden:
|
||||
|
||||
\begin{verbatim}
|
||||
Definitionen: Definiere Namen
|
||||
%%
|
||||
Regeln: Definiere reguläre Ausdrücke und
|
||||
zugehörige Aktionen (= Code)
|
||||
%%
|
||||
Code: zusätzlicher Code
|
||||
\end{verbatim}
|
||||
|
||||
\subsubsection{Reguläre Ausdrücke in Flex}
|
||||
\begin{table}
|
||||
\begin{tabular}{ll}
|
||||
x & Zeichen 'x' erkennen \\
|
||||
"xy" & Zeichenkette 'xy' erkennen \\
|
||||
\textbackslash & Zeichen 'x' erkennen (TODO) \\
|
||||
$[xyz]$ & Zeichen $x$, $y$ oder $z$ erkennen \\
|
||||
$[a-z]$ & Alle Kleinbuchstaben erkennen \\
|
||||
$[\^a-z]$ & Alle Zeichen außer Kleinbuchstaben erkennen \\
|
||||
$x|y$ & $x$ oder $y$ erkennen \\
|
||||
(x) & x erkennen \\
|
||||
x* & 0, 1 oder mehrere Vorkommen von x erkennen \\
|
||||
x+ & 1 oder mehrere Vorkommen von x erkennen \\
|
||||
x? & 0 oder 1 Vorkommen von x erkennen \\
|
||||
\{Name\} & Expansion der Definition Name \\
|
||||
\textbackslash t, \textbackslash n, \textbackslash rq & Tabulator, Zeilenumbruch, Wagenrücklauf erkennen \\
|
||||
\end{tabular}
|
||||
\end{table}
|
||||
|
||||
\index{Lex|)}
|
||||
|
||||
|
||||
\section{Syntaktische Analyse}\xindex{Analyse!syntaktische}%
|
||||
In der syntaktischen Analyse wird überprüft, ob die Tokenfolge zur
|
||||
kontextfreien Sprache\todo{Warum kontextfrei?} gehört. Außerdem soll die
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue