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 %option und %%.
  • 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.