| JLex
 | erzeugt aus einer Liste von regulären Ausdrücken
eine Java-Klasse.
 | 
 |  |  | 
     
       |  | 
ist in Java implementiert.
 | 
 |  |  | 
     
       |  | ist eine Weiterentwicklung von JLex, die bis auf Kleinigkeiten
mit der gleichen Eingabesyntax arbeitet.
        | 
     
       | 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
 | 
 |  |  |