Für die Eingabe
VBoxkönnte die graphische Ausgabe folgendermaßen aussehen:
Hallo,
HBox bitte,kaufe,Boxen; ,
danke
;
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;generiert classgen eine Visitor-Schnittstelle und einen Adapter:
attr "javax.swing.JComponent" output with Box; //Attribut output
Box::= {HBox} Box*:children
| {VBox} Box*:children
| {IdBox} String:ident
public interface Visitor {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 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() { }
}
public class LayoutVisitor extends VisitorAdaptor {Die Ausgabe wird in das oben angegebene Attribut output gespeichert, das jeder Box-Knoten hat.
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
}
}
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();
}
}
:};
VBoxsieht die graphische Ausgabe folgendermaßen aus:
Hallo,
HBox bitte,kaufe,Boxen; ,
danke
;
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:
Erzeugen Sie einen Compiler aus Ihren Quellen und testen Sie den Compiler mit geeigneten Beispielen.
Geben Sie als Lösung der Aufgabe