Open Source im professionellen Einsatz
Linux-Magazin 04/2005
580

Bäume mit JJTree bauen

Bestandteil der JavaCC-Distribution ist auch JJTree (»/usr/local/javacc-3.2/bin/jjtree«). Es fungiert als Präprozessor, der semantische Aktionen zum Aufbau des Baums in eine Grammatik einbaut. Um den Ablauf zu demonstrieren, soll das Beispiel den Grammatikbaum konstruieren und ausgeben. Dazu sind nur in der Parserklasse kleine Änderungen notwendig (Listing 5, Zeile 36), die eigentliche Grammatik bleibt unberührt.

Das Ergebnis ist in Abbildung 1 zu sehen. Es durchläuft zwei Stufen (»jjtree«, »javacc«) bis zum kompilierbaren Code. Beide benutzen dabei die Kommandozeilenoption »-OUTPUT_DIRECTORY«, um das Verzeichnis für die Ausgabe zu spezifizieren. Ohne weitere Angaben erzeugt JJTree Knoten der Klasse »SimpleNode«: eine Knotenklasse praktisch ohne Inhalte.

Für echte Anwendungen muss der Programmierer natürlich eine eigene Knotenklasse schreiben und in eigenen semantischen Aktionen die Knoten mit Werten füllen, zum Beispiel aus dem aktuellen Token. Die Variable »jjtThis« referenziert stets den aktuellen Knoten. Der Aufbau des Baums selbst ist aber auch in diesem Fall Aufgabe von JJTree.

Ein weiteres nützliches Tool des JavaCC-Pakets ist JJDoc (»/usr/local /javacc-3.2/bin/jjdoc«). Es wandelt eine JavaCC-Grammatik wahlweise in Text oder in verlinkten Hypertext um. Dazu ruft es der Anwender lediglich mit der Grammatik als Parameter auf:

jjdoc HelloWorld.jjt


Das Ergebnis ist eine HTML-Datei, die jeder Browser darstellen kann, siehe Abbildung 2. Damit entsteht eine BNF-Sicht, die das Format exakt dokumentiert: Sie legt eindeutig fest, wie die Eingabedaten auszusehen haben. Ruft man JJTree mit dem Kommandozeilenparameter »-TEXT« auf, schreibt es die Grammatik im Ascii-Textformat.

Zusätzlich ist es eine gute Idee, auch von der JavaCC-Grammatik (zu finden in den Beispielen) eine HTML-Seite anzufertigen. Sie bietet einen kompakten Überblick über die gesamte Syntax - die Dokumentation hält eine annotierte Version bereit.

finally{}

Wer klassische Lexer und Parser kennt, muss sich nur wenig umgewöhnen. Ein Unterschied ist natürlich die generierte Sprache. Aber auch in Syntax und Arbeitsweise unterscheiden sie sich, denn JavaCC ist kein so genannter LALR(1)-Parser wie Bison/Yacc. Mehr Details dazu liefern die FAQ[3].

JavaCC ist in der Java-Welt der Standard für Parsergenerierung. Das zeigt sich nicht nur an der langen Liste verfügbarer Grammatiken[2], sondern auch an der Integration in das klassische Java-Buildtool Ant. Oft nutzen Anwendungen JavaCC, ohne dass der Benutzer es merkt. Viele Open-Source-Projekte liefern die durch JavaCC generierten Java-Quellen mit und ersparen damit dem Anwender dessen Installation.

Wer Open Source nutzt, hat meist die Wahl zwischen mehreren Lösungen. Das gilt auch für Parsergeneratoren. Eine gute Alternative zu JavaCC ist ANTLR[5], der Code in verschiedenen Programmierprachen generieren kann. Eine Übersicht über verfügbare Parser bietet die Website[6]. (ofr)

Listing 5:
»HelloWorld.jjt«

27 PARSER_BEGIN(HelloWorld)
28
29 package hello;
30
31 public class HelloWorld {
32   public static void main(String args[]) throws  ParseException {
33     HelloWorld parser = new HelloWorld(System.in);
34     try {
35       parser.processInput();
36       ((SimpleNode) jjtree.rootNode()).dump("-");
37     } catch (Exception e) {
38       e.printStackTrace();
39     }
40   }
41 }
42
43 PARSER_END(HelloWorld)

Infos

[1] Homepage von JavaCC: [http://javacc.dev.java.net]

[2] JavaCC-Grammatik-Repository: [http://www.cobase.cs.ucla.edu/pub/javacc/]

[3] JavaCC-FAQ: [http://www.engr.mun.ca/~theo/JavaCC-FAQ]

[4] Einführung in BNF: [http://www.garshol.priv.no/download/text/bnf.html]

[5] Homepage von ANTLR: [http://www.antlr.org]

[6] Infos zu ANTLR und Übersicht über verfügbare Parser: [http://www.bearcave.com/software/antlr/antlr_expr.html]

Der Autor

Bernhard Bablok arbeitet bei der AGIS mbH als Anwendungsentwickler. Wenn er nicht Musik hört, mit dem Radl oder zu Fuß unterwegs ist, beschäftigt er sich mit Themen rund um Objektorientierung. Er ist unter [coffee-shop@bablokb.de] zu erreichen.

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Wir können auch anders

    Bisher vorgestellte Programme waren in funktionaler Weise implementiert. Schemes Stärken liegen zwar hauptsächlich in diesem Bereich, jedoch gibt es auch die Möglichkeit, objektorientiert vorzugehen.

  • Hello, World!

    Programmiersprachen, Bibliotheken, Tools, Entwicklungsumgebungen: Das Linux-Magazin widmet sich in einer eigenen Rubrik den Fragen rund ums Programmieren.

  • Haskell

    Haskell ist keine Skriptsprache, sondern wird in der Regel kompiliert. Mit einigen Handgriffen lassen sich aber Shellskripte in die funktionale Sprache einbinden. Haskells starkes Typensystem greift dann ein, um Fehler durch Argumente in falscher Anzahl oder Art zu verhindern.

  • Shell scripting with type-safety using Haskell

    Why is scripting usually done in dynamically typed languages? This article applies strong typing in Haskell to shell programs. The end result can still be light-weight but also save time by reducing runtime errors.

  • Übersetzungskünstler

    Lexer und Parser in Perl schreiben ist keineswegs langbärtigen Gurus vorbehalten. Am Beispiel eines mathematischen Formelparsers nimmt dieser Perl-Snapshot die Angst vor Token und RPN.

comments powered by Disqus

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.