Skip to content

Grammatiken mit ANTLR

2007 November 13
by Sven Busse

Juten Tach,

ich beschäftige mich gerade ein wenig mit Übersetzergeneratoren. Da gibt es ja viele, man kennt z.B. Yacc, oder JLex usw. Ich schaue mir momentan ANTLR an. Alles sehr spannend. Ich habe mir – was ich sonst eher selten mache – tatsächlich auch mal ein Buch dazu gekauft. Sehr lesenswert. Cool ist auch, dass auf der Website von antlr ein tolles Tool namens ANTLRWorks zur Verfügung steht, mit dem man Grammatiken entwickeln, ausprobieren und debuggen kann, das erleichtert die ersten Schritte.

Was ich aber gleich erfahren musste ist, dass man mit fast allen heutigen gebräuchlichen Grammatiken nur kontextfreie Sprachen beschreiben kann. Kontextfreie Sprachen sind solche, die in sich z.B. keine Referenzen verwenden, in denen sich also platt gesagt in einem Satz alles direkt erklärt und nicht auf Sachverhalte verwiesen wird, die man in einem anderen Satz gesagt hat. Nun sind ja aber fast alle heutigen Programmiersprachen kontextbehaftet, schon allein dadurch, dass es z.B. Variablen gibt. Wenn ich also schreibe:

var i:Number = 10;
trace(i + 5);

dann beziehe ich mich in der zweiten Zeile auf eine Variable, die in der ersten Zeile deklariert wurde, also ist die zweite Zeile ohne den Kontext der Ersten nicht auswertbar.

Um diesem Umstand Rechnung zu tragen, arbeitet man dann mit Code, z.B. mit Hashmaps, um sich solche Kontexte zu merken, z.B. solche Variablendeklarationen. Und das finde ich auf den ersten Blick eigentlich gar nicht so schön, denn das bedeutet, dass ich in die Grammatik, die ja normalerweise in einer programmiersprachenübergreifenden Notation gehalten ist (z.B. der EBNF Notation), konkreten Code einer bestimmten Programmiersprache einfügen muss, um z.B. die Hashmaps zu verwalten. Was ich schade finde, denn so kann die Grammatik nicht unabhängig von der dem zu generierenden Parsercode zugrunde liegenden Sprache erstellt werden.

Muss ich mich wohl einfach mit abfinden.

No comments yet

Leave a Reply

Note: You can use basic XHTML in your comments. Your email address will never be published.

Subscribe to this comment feed via RSS

*