Technische Universität München
Fakultät für Informatik
Prof. Dr. Helmut Seidl
Riitta Höllerer


Praktikum des Übersetzerbaus WS 2003/04:

Generierung von Benutzungsoberflächen


Aufgabenblatt 7

17. Dezember 2003

Visitor-Konzept und graphische Ausgabe für die Box-Sprache

In der Aufgabe 14 haben wir die Implementierung der Box-Sprache so weit realisiert, dass für eine Eingabe ein abstrakter Syntaxbaum erstellt wird. Nun implementieren wir einen bottom up-Durchlauf des Syntaxbaumes, bei dem eine graphische Ausgabe erstellt wird.

Für die Eingabe

VBox
  Hallo,
  HBox bitte,kaufe,Boxen; ,
  danke
;
könnte die graphische Ausgabe folgendermaßen aussehen:

Für die Ausgabe verwenden wir das Visitor-Konzept, das durch classgen unterstützt wird. classgen erzeugt nicht nur die Java-Klassen für die Knotentypen des abstrakten Syntaxbaumes, sondern auch eine Visitor- Schnittstelle. Wenn die abstrakte Syntax folgendermaßen definiert ist:

package abstractSyntaxTree;

attr "javax.swing.JComponent" output with Box; //Attribut output

Box::= {HBox} Box*:children
     | {VBox} Box*:children
     | {IdBox} String:ident
generiert classgen eine Visitor-Schnittstelle und einen Adapter:
public interface Visitor {

public void visit(BoxList boxList);
public void visit(Box box);
public void visit(HBox hBox);
public void visit(VBox vBox);
public void visit(IdBox idBox);
}

public abstract class VisitorAdaptor implements Visitor {

public void visit(BoxList boxList) { visit(); }
public void visit(Box box) { visit(); }
public void visit(HBox hBox) { visit(); }
public void visit(VBox vBox) { visit(); }
public void visit(IdBox idBox) { visit(); }
 
public void visit() { }
}
In dem VisitorAdaptor ist für jede visit-Methode schon eine Implementierung angegeben, bei der nichts geschieht. Der Benutzer muss nun eine neue Klasse LayoutVisitor implementieren, in der die Ausgabe realisiert wird:
public class LayoutVisitor extends VisitorAdaptor {

   public void visit(HBox hBox) {
   // Hier die Darstellung von HBox
   // JPanel mit BoxLayout und sichtbarem Border
   }

   public void visit(VBox vBox) {
   // Hier die Darstellung von Vbox
   // JPanel mit BoxLayout und sichtbarem Border
   }

   public void visit(IdBox idBox) {
   // Hier die Darstellung für Identifier-Box erstellen
   // Jlabel mit sichtbarem Border
   }
}
Die Ausgabe wird in das oben angegebene Attribut output gespeichert, das jeder Box-Knoten hat.

In der Parsereingabe muss die main-Methode so ergänzt werden, dass der abstrakte Syntaxbaum durchlaufen wird und die graphische Ausgabe angezeigt wird:

import abstractSyntaxTree.*;
import java_cup.runtime.Symbol;
import javax.swing.JFrame;

parser code {:
...
public static void main(String argv[]) {
try {
Lexer l = new Lexer(new java.io.FileReader(argv[0]));
Parser p = new Parser(l);
Box b = (Box) p.parse().value;
System.out.println(b);

b.traverseBottomUp(new LayoutVisitor());
JFrame frame = new JFrame();
frame.getContentPane().add(b.getOutput());
frame.pack();
frame.setVisible(true);

} catch (Exception e) {
e.printStackTrace();
}
}
:};

16. Aufgabe  (Visitor-Konzept; graphische Ausgabe für die Box-Sprache)

In dieser Aufgabe ist die Spezifikation für die Box-Srache vorgeben. Der vorgegebene Compiler erstellt für Box-Sprachen-Texte die entsprechenden graphischen Ausgaben, z. B. für die Eingabe
VBox
  Hallo,
  HBox bitte,kaufe,Boxen; ,
  danke
;
sieht die graphische Ausgabe folgendermaßen aus:

Sie sollen die Spezifikation so ergänzen, dass der Benutzer für die Boxenumrandung eine Farbe angeben kann. Die graphische Ausgabe für ein entsprechend ergänztes Beispiel könnte dann folgendermaßen aussehen:

Gehen Sie von Ihrer Lösung zur Aufgabe 14 aus. Dort wird der abstrakte Syntaxbaum (inklusive eventueller Farbenangabe) schon aufgebaut. Nun müssen Sie den hier vorgegebenen Visitor LayoutVisitor.java so ergänzen, dass bei der Ausgabe die Farbenangabe berücksichtigt wird.

Die Quellen des Compilers sind hier: Aufgabe16-Vorgabe.jar

Erzeugen Sie einen neuen Compiler aus Ihren Quellen und testen Sie den Compiler mit geeigneten Beispielen. Geben Sie als Lösung der Aufgabe:

17. Aufgabe  (Visitor-Konzept; graphische Ausgabe für die die Formularsprache)

In dieser Aufgabe realisien wir die graphische Ausgabe für für die Formularsprache von der Aufgabe 15. Dafür mussen Sie wie in der obigen Aufgabe 16 vorgegeben ist, einen Visitor LayoutVisitor.java schreiben, der für Ihre Fax- und Memo-Formulare eine graphische Ausgabe erstellt. (Wählen Sie dabei für die Formularelemente geeignete Swing-Darstellungen, wie JLabel, JTextField usw.) Zusätzlich mussen Sie die main-Methode des Parsers wie oben angegeben ergänzen, so dass die Ausgabe in einem Fenster angezeigt wird.

Erzeugen Sie einen Compiler aus Ihren Quellen und testen Sie den Compiler mit geeigneten Beispielen.

Geben Sie als Lösung der Aufgabe

Hinweis:

Abgabetermin: Mittwoch, 7. Januar 2004 12:00


Ich wünsche allen Praktikumsteilnehmern Frohe Weichnachten und
ein Gutes Neues Jahr
Riitta Höllerer