Technische Dokumentation Allgemeine Vorgangsweise, um den Parser zu kompilieren: 1) Aufruf der Batchdatei make.bat make.bat macht folgendes: a) b) c) 2) Aufruf von PCLEX mit der Spezifikationsdatei ocl.l. Aufruf von PCYACC mit der Spezifikationsdatei ocl.y Umbennenung der von PCLEX erzeugten Datei ocl.lex.cpp. ocl.c Einfügen folgender include-Anweisung in die Datei Ocl.h: #include „Ast.h“ Begründung: Die union YYSTYPE verwendet Klassen, die in Ast.h deklariert werden. Bei jedem Aufruf von make.bat wird Ocl.h jedoch ohne dem notwendigen include überschrieben. 3) Compilieren unter Visual C++ 6. 1 in Beschreibung der Implementierung des Eingabestroms: PROBLEMSTELLUNG: Unser OCL-Parser benötigt zum Testen der Syntax und Semantik alle OCLConstraints des Datenmodells. Diese Constraints müssen irgendwie aus dem Datenmodell herausgelesen und dem Parser bereitgestellt werden. Wir haben uns darauf geeinigt alle Constraints in eine Datei zu schreiben und diese dem Parser als Eingabestrom zu übergeben. VORGANGSWEISE: Die Mainmethode main.cpp enthält das Datenmodell (Objekt der Klasse Model), welches die OCL-Constraints beinhaltet. Diese werden durch Aufruf der Prozedur extractConstraints aus dem Modell ausgelesen. Der Prozedur extractConstraints wird als einziger Parameter das gesamte Datenmodell mit den enthaltenen OCL-Constraints übergeben. Die Prozedur ermittelt nun die Constraints aller Komponententypen des Datenmodells. Jedes Constraint wird in die Datei „data.txt“ ausgelesen. Das Auslesen erfolgt mit Hilfe der Methode writeToFile der Klasse „IOData“. Diese Klasse bildet die Schnittstelle zur Datei „data.txt“ („data.txt“ wird im Konstruktor der Klasse „IOData“ festgelegt). Die Methode writeToFile bekommt als einzigen Parameter den auszulesenden Constraint als String über. 2 Dokumentation zur Implementierung des Abstrakten Syntaxbaumes (AST) EINLEITUNG Was ist ein Abstrakter Syntaxbaum (AST) ? Der abstrakte Syntaxbaum (AST) wird während des erstmaligen Parsens (syntaktische Prüfung) aufgebaut. Dabei werden wichtige Informationen, die zur späteren semantischen Prüfung und zum Übersetzen benötigt werden, in den Knoten des Baumes mit abgespeichert (man sagt der Baum wird „annotiert“). Wurde eine OCL-Expression geparst (syntaktische Prüfung abgeschlossen), so liegt es nun daran, diesen Baum auf semantische Fehler Inorder zu durchlaufen. VORGANGSWEISE ZUR ERSTELLUNG EINES AST Viele Grammatikregeln (in „Ocl.y“ ) sind sich untereinander ähnlich. Zum Beispiel sind „additiveExpression“ und „multiplicativeExpression“ beide Expressions allerdings mit unterschiedlicher Präzedenz und unterschiedlichen Operatoren. Die Aufgabe zur Erstellung des AST liegt nun darin, solche Gruppierungen von untereinander ähnlichen Regeln herauszufinden und als Klassenhierarchien zu implementieren. Solche Klassenhierarchien (Klassen in C++) haben den wesentlichen Vorteil, durch die angebotenen Möglichkeiten der Objektorientierung in C++ (Vererbung und Polymorphismus) die Komplexität der Implementierung eines AST stark einzuschränken. Der AST wird dadurch leichter wartbar und kann in relativ kurzer Zeit realisiert werden. Sind also gemeinsame Grammatikregeln entdeckt, so erhalten alle einen gemeinsamen Supertyp. Zum Beispiel sind alle Ausdrücke mit Operatoren vom Typ „Exp“. In den Aktionen zu den Expressionregeln werden nun Klassen mit den notwendigen Informationen erzeugt und dem in PCYACC vordefinierten „$$“ zugewiesen. Diese Klasse wird in der übergeordneten Regel wieder als Information in einem Knoten des AST abgespeichert. Im folgenden wird die Klassenhierarchie des AST beschrieben: 3 KLASSENHIERARCHIE Superklasse Subklasse Grammatikregel LogicalExp RelationalExp AdditiveExp MultiplicativeExp UnaryExp IfExp PostFixExp logicalExpression relationalExpression additiveExpression multiplicativeExpress. unaryExpression ifExpression postfixExpression PrimLiteral PrimLiteralCollect PrimFeature PrimIfExp PrimExp alle Regeln mit dem Namen „primary“ Exp Primary Type Integer Boolean String alle Literals 4