JLex
|
erzeugt aus einer Liste von regulären Ausdrücken
eine Java-Klasse
|
|
|
|
ist in Java implementiert
|
|
|
lex, flex
|
besitzt im Wesentlichen die gleiche Funktionalität wie die
Scanner-Generatoren für C.
|
|
|
Rahmen
|
für die Umgebung, in die der erzeugte Scanner eingebettet ist
|
|
reiner Java Code für die Token-Klasse und die Umgebung
|
|
|
Direktiven
|
zur Parametrisierung der erzeugten Java-Klassen
|
|
%class Scanner // erzeugte Klasse
%function nextSymbol // Methode für nächstes Symbol
%type Token // Symbol Klasse
|
|
|
Makros
|
für gemeinsame Teilausdrücke in den regulären Ausdrücken
|
|
digit=[0-9]
digits={digit}+
|
|
|
|
bessere Wartbarkeit
|
|
|
Token
|
typische Token Klasse
|
|
class Token {
int symbol;
int line;
String text;
}
|
|
|
Variable: yytext, yyline, ...
|
vordefinierte Variablen für die Zeichenreihe des aktuellen Symbols,
für die momentane Zeilen- und Spaltennummer
...
|
|
|
Aktionen
|
Java-Anweisungen für die Aktionen, nachdem ein Symbol erkannt worden ist
|
|
|
|
für einen Scanner für 4 Symbole
|
|
|
Scanner- Zustände
|
Erweiterung
|
|
|
|
reguläre Ausdrücke für komplexere syntaktische Konstrukte sind nicht einfach zu entwickeln
|
|
|
|
Immer Suche nach der längsten Zeichenreihe für einen R.E.
|
|
|
Beispiel
|
Kommentare mit mehreren Zeichen als Anfangs- und Ende-Klammern
|
|
/* ... C ... */ .... /* ... */
<!-- .... html ... -->
|
|
|
R.E.
|
falsch
|
|
|
|
|
R.E.
|
richtig (???)
|
|
"/*"(\n|[^*]|"*"+[^/])*"*/"
Test: /***/
|
|
|
|
Ähnliche Probleme bei Text-Konstanten und Ersatzsequenzen
|
|
|
Lösung
|
Aufteilen eines Scanners in mehrere kleine Scanner (endliche Automaten)
und kontrollierte Übergänge zwischen den einzelnen Automaten
|
|
|
Beispiel
|
- "normaler" Automat
- Automat für Kommentare
- Automat für Text-Konstanten
|
|
|
Beispiel
|
für HTML
- Automat für Text
- Automat für Kommentare
- Automat für Tags
- Automat für DTDs
|
|
|
Kommentar
|
aus C mit regulären Ausdrücken
|
|
"/*" Kommentar-Anfang
"*/" Kommentar-Ende
.|\n ein Kommentarzeichen
|
|
|
|
für einen einfachen HTML Scanner
|
|
|