Java: Compilerbau mit SableCC
Ende September ist SableCC 3.1 erschienen, jetzt habe ich jenes Objekt orientierte Gerüst zur Entwicklung von Compilern und Interpretern in Java mal ausprobiert.
SableCC ähnelt LEX + YACC, so dass man damit schnell zurechtkommt, verfolgt jedoch einen anderen Ansatz.
Lexer und Parser in einem
Lexer und Parser sind nicht in seperate Programme und Dateien getrennt, sondern in SableCC miteinander vereint. In der .grammar-Datei stehen die Helpers (Lexer), Tokens (Lexer) und Produktionsregeln (Parser) in einer Datei - so ist alles schön übersichtlich zusammen.
Syntaxbaum statt Actions
Daraus erzeugt SableCC die Java-Klassen für den Lexer und Parser und, abweichend von YACC, zusätzlich die Knoten für den Syntaxbaum (AST) und Routinen zum Durchwandern dieses Syntaxbaum (analysis). SableCC arbeitet also nicht mit den von YACC bekannten Actions, sondern erzeugt gleich selbst einen Syntaxbaum. Dieser wird von der apply()
Methode durchlaufen, die via Visitor-Pattern die eigenen Methoden aufruft, die den gewünschten Programmcode generieren. Damit lässt sich mit wenig Aufwand schnell ein erster Compiler schreiben.
Beispiele
Ein einführendes Beispiel gibt es im dritten Kapitel des SableCC-Handbuchs: "3.1 Introduction to SableCC". Die drei nachfolgenden Kapitel behandeln die Themen: Lexer, Parser und Visitor-Pattern.
Ein Tutorial "Writing a compiler with SableCC" und kompletter Pacal-S Compiler, der Pascal-P4-Code für den dazu passenden Interpreter erzeugt. Sowie auf der Website von Roger Keays u.a. eine Grammatik für ISO-C und die nützlichen Text AST Printer- und GUI AST Displayer-Klassen zur Ausgabe des Syntaxbaums, welche beim Verstehenlernen und Debuggen des generierten Parsers und eigenen Programmcodes helfen.