Ein Parser-Generator ist ein Werkzeug, das aus einer Grammatikbeschreibung automatisch den Quellcode eines Parsers erzeugt. Statt den Parser von Hand zu programmieren, schreibt man nur die Regeln – das Programm erledigt den Rest. Bekannte Vertreter sind Yacc, GNU Bison und ANTLR.
Vom Regelwerk zum lauffähigen Parser
Die Eingabe ist eine Datei mit Produktionen im Stil einer kontextfreien Grammatik. Zu jeder Regel gehört ein Code-Ausschnitt, der beim Erkennen dieser Regel ausgeführt wird. Der Generator übersetzt das Regelwerk in Tabellen oder Entscheidungsfunktionen:
- Yacc (Yet Another Compiler-Compiler) und sein GNU-Nachfolger Bison erzeugen LALR-Parser aus Tabellen und arbeiten klassisch mit einem externen Lexer wie lex beziehungsweise flex.
- ANTLR ist ein LL-basierter Generator, der mit dem ALL(*)-Verfahren auch mehrdeutige Regeln verarbeitet und Parser in Java, Python, C# und weiteren Zielsprachen ausgibt.
- Leichtgewichte wie PLY für Python setzen Yacc-Konzepte direkt in Bibliotheken um, die mit Datentypen statt Generatorlauf arbeiten.
Arbeitsschritte in der Praxis
Typisch läuft die Arbeit so ab:
- Grammatikregeln in eine Quelldatei schreiben (bei Yacc mit der Endung
.y, bei ANTLR mit.g4). - Den Generator aufrufen – er erzeugt Parser-Code, der das Regelwerk einbaut.
- Parser-Code in das eigene Programm einbinden und mit dem Token-Strom des Lexers füttern.
Oft gehört zum Parser-Generator auch ein passender Lexer-Generator: flex erzeugt den Scanner für Yacc/Bison, ANTLR kann Lexer und Parser aus einer Datei ableiten.
Wann lohnt sich ein Parser-Generator?
Für kleine Konfigurationsdateien reicht ein rekursiver Abstieg von Hand. Sobald die Sprache wächst – domänenspezifische Sprachen, Abfragesprachen, Datenformate oder ganze Compiler-Frontends – zahlt sich der Generator aus: Die Regeln bleiben lesbar, und der generierte Parser ist meist schneller und fehlerärmer als handgeschriebener Code. Die anschließende Verarbeitung übernehmen die semantische Analyse und die Codegenerierung.
Verwandte Grundlagen: LR-Parser, SLR-Parser, Syntaxbaum.