Lexikalische Analyse
In der lexikalischen Analyse soll ein Lexer (auch "Scanner") den Zeichenstrom in eine Folge von Token zerlegen. Zur Spezifikation der Token werden in der Regel reguläre Ausdrücke verwendet.
In der lexikalischen Analyse soll ein Lexer (auch "Scanner") den Zeichenstrom in eine Folge von Token zerlegen. Zur Spezifikation der Token werden in der Regel reguläre Ausdrücke verwendet.
Hier entsteht ein Tafelbild.
Def.: Ein deterministischer endlicher Automat (DFA) ist ein 5-Tupel $A = (Q, \Sigma, \delta, q_0, F)$ mit
$Q$ : endliche Menge von Zuständen
$\Sigma$ : Alphabet von Eingabesymbolen
$\delta$ : die (eventuell partielle) Übergangsfunktion $(Q \times \Sigma) \rightarrow Q, \delta$ kann partiell sein
$q_0 \in Q$ : der Startzustand
$F \subseteq Q$ : die Menge der Endzustände
Def.: Ein nichtdeterministischer endlicher Automat (NFA) ist ein 5-Tupel $A = (Q, \Sigma, \delta, q_0, F)$ mit
$Q$ : endliche Menge von Zuständen
$\Sigma$ : Alphabet von Eingabesymbolen
$\delta$ : die (eventuell partielle) Übergangsfunktion $(Q \times \Sigma) \rightarrow Q$
$q_0 \in Q$ : der Startzustand
$F \subseteq Q$ : die Menge der Endzustände
Def.: Sei A ein DFA oder ein NFA. Dann ist L(A) die von A akzeptierte Sprache, d. h.
$L(A) = \lbrace\text{Wörter}\ w\ |\ \delta^*(q_0, w) \in F\rbrace$Pattern Matching (Erkennung von Schlüsselwörtern, Bezeichnern, ...) geht mit NFAs.
NFAs sind so nicht zu programmieren, aber:
Satz: Eine Sprache $L$ wird von einem NFA akzeptiert $\Leftrightarrow L$ wird von einem DFA akzeptiert.
D. h. es existieren Algorithmen zur
Def.: Induktive Definition von regulären Ausdrücken (regex) und der von ihnen repräsentierten Sprache L:
Basis:
Induktion: Seien $E,\ F$ reguläre Ausdrücke. Dann gilt:
Vorrangregeln der Operatoren für reguläre Ausdrücke: *, Konkatenation, +
Def.: Eine formale Grammatik ist ein 4-Tupel $G=(N,T,P,S)$ aus
$N$: endliche Menge von Nichtterminalen
T: endliche Menge von Terminalen, $N \cap T = \emptyset$
$S \in N$: Startsymbol
P: endliche Menge von Produktionen der Form
Def.: Sei $G = (N, T, P, S)$ eine Grammatik, sei $\alpha A \beta$ eine Zeichenkette über $(N \cup T)^{\ast}$ und sei $A$ $\rightarrow \gamma$ eine Produktion von $G$.
Wir schreiben: $\alpha A \beta \Rightarrow \alpha \gamma \beta$ ($\alpha A \beta$ leitet $\alpha \gamma \beta$ ab).
Def.: Wir definieren die Relation $\overset{\ast}{\Rightarrow}$ induktiv wie folgt:
Basis: $\forall \alpha \in (N \cup T)^{\ast} \alpha \overset{\ast}{\Rightarrow} \alpha$ (Jede Zeichenkette leitet sich selbst ab.)
Induktion: Wenn $\alpha \overset{\ast}{\Rightarrow} \beta$ und $\beta\Rightarrow \gamma$ dann $\alpha \overset{\ast}{\Rightarrow} \gamma$
Def.: Sei $G = (N, T ,P, S)$ eine formale Grammatik. Dann ist $L(G) = \lbrace\text{Wörter}\ w\ \text{über}\ T \mid S \overset{\ast}{\Rightarrow} w\rbrace$ die von $G$ erzeugte Sprache.
Def.: Eine reguläre (oder type-3-) Grammatik ist eine formale Grammatik mit den folgenden Einschränkungen:
Alle Produktionen sind entweder von der Form
$X\rightarrow\epsilon$ ist erlaubt
Satz: Die von endlichen Automaten akzeptiert Sprachklasse, die von regulären Ausdrücken beschriebene Sprachklasse und die von regulären Grammatiken erzeugte Sprachklasse sind identisch und heißen reguläre Sprachen.
Reguläre Sprachen
Reguläre Ausdrücke
Ein Lexer
wandelt mittels DFAs aus regulären Ausdrücken die Folge von Zeichen der Quelldatei in eine Folge von sog. Token um
bekommt als Input eine Liste von Paaren aus regulären Ausdrücken und Tokennamen, z. B. ("while", WHILE)
Kommentare und Strings müssen richtig erkannt werden. (Schachtelungen)
liefert Paare von Token und deren Werte, sofern benötigt, z. B. (WHILE, _), oder (IDENTIFIER, "radius") oder (INTEGERZAHL, "334")
Ein Parser
führt mit Hilfe des Tokenstreams vom Lexer die Syntaxanalyse durch
basiert auf einer sog. kontextfreien Grammatik, deren Terminale die Token sind
liefert die syntaktische Struktur in Form eines Ableitungsbaums (syntax tree, parse tree), bzw. einen AST (abstract syntax tree) ohne redundante Informationen im Ableitungsbaum (z. B. Semikolons)
liefert evtl. Fehlermeldungen