Ein Lexer-Generator ist ein Werkzeug, das aus einer lexikalischen Spezifikation — meist reguläre Ausdrücke mit zugehörigen Aktionen — den fertigen Quellcode für einen Lexer (Scanner) erzeugt. Statt den Scanner von Hand zu schreiben, beschreibt man die Token-Regeln und lässt den Generator den deterministischen Erkennungsautomaten bauen.
Abgrenzung: Lexer-Konzept vs. Generator-Tool
Der Lexer-Artikel erklärt, was ein Scanner ist (Zerlegung von Quelltext in Tokens). Der Lexer-Generator ist die Tool-Facette: Flex, JFlex, ANTLR, re2c oder Ragel nehmen Regeln entgegen und produzieren produktionsreifen Code — der Entwickler schreibt keine Zustandsautomaten von Hand.
Wie die Regeln aussehen (Flex)
%%
[0-9]+ { return TOKEN_ZAHL; }
[a-zA-Z_][a-zA-Z0-9_]* { return TOKEN_IDENT; }
"if" { return TOKEN_IF; }
[
]+ { /* Leerraum ueberspringen */ }
%%
Jede Regel besteht aus einem Muster (regulärer Ausdruck) und einer Aktion. Der Generator erzeugt daraus eine Tabelle oder direkten Code. Bei mehreren passenden Mustern gewinnt der längste Match; bei Gleichstand die zuerst notierte Regel.
Verbreitete Werkzeuge
- Flex (C/C++): der klassische Nachfolger von Lex; Sektionen
%optionund%%. - JFlex: Flex-ähnlich für Java, erzeugt
yylex()und Token-Klassen. - ANTLR: kombiniert Lexer- und Parser-Grammatiken in einer Datei; generiert auch Listener/Visitor.
- re2c/Ragel: kompakte Generatoren, oft in eingebetteten Systemen und Protokoll-Parsern.
Praxis-Einsatz
- Compilerbau: der Lexer-Generator liefert die erste Stufe — das Token-Futter für einen LL- oder LR-Parser.
- DSLs: eigene kleine Sprachen mit identifizierten Schlüsselwörtern und Literalen.
- Syntax-Highlighting und Protokoll-Parser: statt handgeschriebener String-Verarbeitung.
Vorteil gegenüber Handarbeit: weniger Fehler, garantiert deterministisches Verhalten, leichte Pflege der Regeln. Die anschließende Verarbeitung des Token-Stroms kann dann mit Code-Optimierung und weiteren Compilerstufen verknüpft werden.