Tuesday, March 18, 2008

Parser- Lexer-Entwicklung mit Antlr

Mittels des Antlr Framework kann man sehr schnell und effektiv durch Definition von Grammatiken Recognizer, Interpreter, Compiler und Translator sich generieren lassen. Was das Framework aus meiner Sicht sehr sexy macht ist, wie bei allen Frameworks die ihre Artefakten generieren, die Wartbarkeit sowie Erweiterungsmöglichkeiten. Diese Aspekte sind vor allem im Umfeld der Parser-Entwicklung sehr wichtig. 
Die Grammatiken für den Parser werden in einer Art Backus Naur Form in *.g Files geschrieben. Wie diese Statements in dem *.g File aussehen kann man in dem folgenden kleinen Beispiel sehen:

variableDeclaration : type ident ';'
type  : 'int' | 'String';
ident  : ('a'...'z' | 'A'...'Z' | '0'...'9' | '_' ) (  'a'...'z' | 'A'...'Z' |'0'...'9' | '_' )*;

Innerhalb solcher Rules, wie es z.B. variableDeclaration ist, kann mittels Actions in der Sprache die als Zielsprache gewählt wird, normaler Code eingewoben werden und auf die Werte der Tokens zugegriffen werden. 
Antlr bietet des Weiteren die Möglichkeit die geparsten Informationen in einem AST (abstract syntax tree) zu speichern und sich wiederum mittels einer Grammatik ein TreeWalker generieren zu lassen. Diese Feature habe ich leider bis dato noch nicht getestet aber es hört sich vielversprechend an. 
Ein Tipp für alle die die ihre geparsten Daten in ein Modell packen wollen ist mittels den Actions in der Grammatik sich ein EMF Modell zu füllen. Wenn man sich ein Metamodell mittels EMF erstellt und sich die Implementierung durch Generierung der Java-Klassen erstellen lässt kann man einfach und elegant mit den Actions in der Grammatik die Daten in ein Modell füllen und weiterverarbeiten. ;)
Also einfach mal probieren und mit Antlr sowie EMF herumspielen.
Have a lot of fun!