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