In früheren Versionen des EA war es nicht möglich das Einlesen des Codes und die Erstellung von Modellen zu beeinflussen. Dieser Schritt des „Parsens“ war eine Black-Box. Die einzelnen Abbildungsregeln, welche Code-Konstrukte in welcher Form in UML abgebildet werden, sind in der Hilfe nachzulesen. (Suche nach „[Porgrammiersprache] Conventions z.B. C# Conventions“ in der EA Hilfe)
Seit der Version EA 10 ist der interne Mechanismus, mit dem Code eingelesen und zu UML-Modellen erstellt bzw. synchronisiert wird, zugängig und anpassbar.
Der EA 10 bietet nun einen Grammatik-Editor, um das Mapping zwischen Code-Konstrukten und UML-Modell selber definieren zu können. Dabei wird durch eine nBNF Grammatik die Syntax der zu lesenden Zeichen (Programmiersprache) definiert und durch UML-Objekttypen angereichert. Die Objekttypen sind eine Ergänzung zur normalen BNF bze. EBNF (Extended Backus-Naur Form) Grammatiken. Daher auch der Name nBNF, wobei das n für „new“ steht.
Hinweis: Der Grammatik-Editor steht in jeder Edition zur Verfügung mit der man Code generieren kann.
Definition der Grammatik
Im Grammatik-Editor gibt es zwei Karteireiter, den Parser-Editor und den Parser-Debugger. Im Editor kann die Grammatik erstellt werden, im Debugger kann ein Text-File (Source-Code) ausgewählt werden, das mit der definierten Grammatik eingelesen wird. Kann der Text (Source-Code) mit der definierten Grammatik eingelesen werden, wird der entsprechende Objektbaum (Abstract Syntax Tree (AST)) für den Source-Code angezeigt. Wird ein Zweig im Baum selektiert, wird der korrespondierende Teil im Source-Code ausgewählt.
Kann der Source-Code mit der definierten Grammatik nicht gelesen werden, bleibt der AST Result Reiter leer. Im daneben liegenden Reiter Profiler Result, wird der Aufruf der Grammatikregeln als Baum dargestellt. Damit soll das Auffinden von Fehlern erleichtert werden.
Im Installationsverzeichnis des EA sind einige Beispielgrammatiken verfügbar.
…\Sparx Systems\EA\Code Samples\Grammar_Samples
Einbinden der Grammatik in eine MDG Technology
Um die Grammatik benützen zu können, muss dafür ein neues „Produkt“, also eine neue Programmiersprache angelegt werden! Unter Settings | Code Engineering Datatypes… ist es möglich ein neues Produkt (Sprache) anzulegen. Es muss mindestens ein Datentyp angelegt werden. Anschließend ist die neue Sprache definiert. Es ist nun möglich ein Codegenerierungs-Template dafür anzulegen.
Das Codegenerierungstemplate ist unter Tools | Source Code Generation Template… zu finden.
Um die Grammatik nun zum Einlesen von Source-Code verwenden zu können, muss diese in eine MDG-Technology aufgenommen werden (Tools | Generate MDG Technology File…). Im MDG-Technology Wizard kann durch Auswahl der Check-Box Code Modules die zuvor neu angelegte Sprache ausgewählt werden. In die MDG-Technology können nun auch die angelegten Datentypen für die Sprache, das Codegenerierungs-Template (Code Template), das File mit der Grammatik (Code Grammar), sowie ein XML File mit weiteren Optionen ausgewählt werden.
Wurde zumindest Code Grammar ausgewählt, steht nun die definierte Programmiersprache „ToyLanguage“ beim Einlesen von Code zur Verfügung, nachdem die MDG-Technology „installiert“ oder dynamisch geladen wurde.
Ich empfehle immer die MDG-Technology dynamisch zu laden, da die die Wartung und Verteilung der Technologien vereinfacht. Dazu muss lediglich unter Settings | MDG Technologies… | Advanced… ein Verzeichnis ausgewählt werden. Im Idealfall ist es ein Versionskontrolliertes Verzeichnis! Gibt es eine neue Version der Technology, muss lediglich ein „GetLatest“ auf das Verzeichnis ausgeführt werden und beim nächsten Start des EA wird die neue Technology dynamisch nachgeladen.
Hinweis: Wird ein Netzwerklaufwerk oder URL angegeben, wird die MDG-Technologie nicht geladen, wenn diese nicht erreichbar sind!
Wurde die Technologie erfolgreich geladen, ist dies unter Settings | MDG Technology… ersichtlich. Beim Import von Source Directory oder Files steht nun die neue Sprache zur Auswahl.
Cooles feature.
Jedoch stellt sich mir die Frage ob die integrierte reverse engine für bspw. C++ auch über eine BNF realisiert und wenn Ja wieso kann man diese nicht direkt mit diesem Fenster editieren oder kopieren. Gibt es vielleicht online eine Referenz auf solche „nBNFs“, welche man direkt im EA verwenden kann oder muss man sich die BNF für C/C++ selbst nachimplementieren, wie in ihrem dargestellten Beispiel
MFG