Delphi-Parser, Delphi-Präprozessor und Delphi-Prettyprinter
-
Ich habe kürzlich eine Grammatik für Delphi 4/5 zur Generierung von Parsern mittels des TextTransformer-Programms veröffentlicht und könnte mir vorstellen, dass sich der eine oder andere hier dafür interessiert.
http://www.text-konverter.homepage.t-online.de/Delphi_ge.txt
Es ist meines Wissens die einzige veröffentliche Delphi-Grammatik für einen Parsergenerator, die ohne schwerwiegende Einschränkungen funktioniert. Die gesamte VCL und über 2000 pas-Dateien meiner installierten Komponenten konnte ich damit parsen.
Der Delphi-Parser benutzt einen Präprozessor zur bedingten Kompilierung der Quellen. Das ist sehr praktisch, weil damit weitere pas-Dateien unmittelbar getestet werden können.
http://www.text-konverter.homepage.t-online.de/Delphi_pp_ge.html
Als Demonstration für die Verwendbarkeit des Parsers gibt es einen Prettyprinter:
http://www.text-konverter.homepage.t-online.de/DelphiPrettyPrint_ge.html
Der Prettyprinter ist auch in den freien TextTransformer-Komponenten enthalten. Mit der ebenfalls enthaltenen Beispielsanwendung kann er geladen und unmittelbar ausgeführt werden.
http://www.text-konverter.homepage.t-online.de/Components_ge.html
Den TextTransformer gibt es unter:
Der TextTransformer kann alle Projekten als C++ Code exportieren. Er ist mit sich selbst und dem CBuilder erzeugt.
---
Detlef Meyer-Eltz
-
Ich hab gerade festgestellt, dass der erste der angegebenen Links die falsche Endung hat. Richtig lautet er:
http://www.text-konverter.homepage.t-online.de/Delphi_ge.html
Sollte das der Grund gewesen sein, dass es gar keine Reaktion auf die Ankündigung gibt oder ist tatsächlich niemand an den Möglichkeiten eines Delphi-Parsers interessiert?
-
dmeltz schrieb:
Sollte das der Grund gewesen sein, dass es gar keine Reaktion auf die Ankündigung gibt oder ist tatsächlich niemand an den Möglichkeiten eines Delphi-Parsers interessiert?
Sicher nicht. Es kommt hier aber ziemlich trocken an. Kontakte zu Delphi-Projekten/Komponenten hatte sicher der eine oder andere hier im Forum öfter.
Sag doch noch was als Extrakt des ganzen. (Screenshot auf der Webseite?)
mfg
kpeter
-
Danke für den guten Rat. Ich hab jetzt drei Bilder zur Verwendung des Prettyprinters mit den TetraComponents gemacht.
http://www.text-konverter.homepage.t-online.de/Components_ge.html
Sie zeigen, dass das Prettyprinter-Projekt aus einem eigenen Programm heraus aufgerufen werden kann. Schlecht strukturierter Quellcode wird verarbeitet und in einem neuen Fenster in besserer Strukturierung angezeigt. Die Verarbeitung geschieht hier mittels des integrierten C++-Interpreters. Alternativ kann auch eine Baumstruktur des Quelltextes, die der Delphi-Parser erzeugt in eine TreeView dargestellt werden. Derartige Bäume ließen sich mit eigenem Code weiterverarbeiten.
Mit einem Delphi-Parser bietet kann man mehr anfangen als einen Prettyprinter zu bauen. Ich selbst bin an einem Übersetzer nach C++ interessiert und werde damit bald beginnen. Dabei will ich mich zunächst nur auf den Implementationsteil beschränken und auch nur einfach zu bewälitgende Übersetzungsaufgaben angehen.
Man könnte den Parser dazu benutzen in Delphi-Code Profileranweisungen automatisch einzufügen bzw. zu entfernen.
Oder, man könnte sogar einen Delphi-Interpreter bauen.Vielleicht gibt es noch mehr Ideen?
Natürlich gibt es auch Screenshots zum TextTransformer
-
Aus dem Delphi Parser hab ich jetzt das Programm Delphi2Cpp gebaut, das Delphi Quellcode in C++ Code konvertiert.
http://www.texttransformer.de/Delphi2Cpp_ge.html
Bisher ist die Übersetzung auf den CBuilder zugeschnitten und Delphi-Features, die nach Delphi 4/5 eingeführt wurden können noch nicht geparst werden. Die Konvertierung erspart alle einfachen Ersetzungen und Umstellungen des Codes, die den weitaus größten Teil der Übersetzungsarbeit ausmachen. Außerdem werden eine Reihe weiterer komplexerer Übersetzungsschritte ausgeführt. In den meisten Fällen wird allerdings eine manuelle Nachbearbeitung des erzeugten Codes erforderlich sein.
Die besten Ergebnisse erhält man, wenn in den Optionen die Pfade zur VCL gesetzt werden (das kann auch die aktuellen VCL sein, optimal ist aber die VCL 4/5). Delphi2Cpp wird dann bei der Übersetzung der ersten Dateien relativ langsam, merkt sich aber die Informationen derjenigen Dateien, die bereits einmal geparst wurden, so dass es zunehmend schneller wird.
Mehr Details zu den einzelnen Übersetzungsleistungen sind hier aufgelistet:
http://www.texttransformer.de/Delphi2CppDetails_ge.html
Das Programm ist Shareware und 30 Tage kostenlos zu testen. Über Feedback würde ich mich freuen.
-
Klingt aufs erste Lesen sehr interessant. Durch die Reduktion auf Delphi 4/5 allerdings doch nicht so
Konstruierst du aus dem Delphi-Quelltext einen vollständigen AST oder nur einen syntaktischen Parsebaum? Ersteres schiene mir für diese Aufgabe angemessener.
-
Reduktion auf Delphi 4/5
Ich denke, dass sich damit die größte Menge an vorhandenem Code parsen lässt. Soviel ist in den neueren Delphi-Versionen nicht dazugekommen und nicht alles Dazugekommene wird in jeder Unit benutzt. Aber ich habe durchaus vor, den Parser zu erweitern.
vollständigen AST oder nur einen syntaktischen Parsebaum
Eher das letztere. Tatsächlich wird bereits beim Parsen des Delphi-Codes einen Baum erzeugt, der eine C++-Form hat. Das geht, weil die rekursiv aufgerufenen Parserregeln eine Art Stack darstellen der bereit eine Art "Baum" ist, der die zur Umformung nötigen Informationen enthält. Z.B. aus der Deklaration:
i : Integer;
wird nicht erst
declaration
|
|- i
|- :
|- Integer
|- ;aufgebaut, sondern gleich der Baum:
declaration | |- int |- i |- ;
Der C++-Baum muss dann schließlich nur noch so durchwandert werden, dass dabei der Code in lesbarer Form ausgegeben wird.
-
dmeltz schrieb:
Soviel ist in den neueren Delphi-Versionen nicht dazugekommen
Nein, nur Generics, anonyme Methoden, Attribute, Interface-to-object-Casts, Operatorüberladung, Class-Helpers, Methoden in Records, statische Klassenvariablen, -konstanten, -methoden und -properties, verschachtelte Klassen, Klassenkonstruktoren und -destruktoren, das for-in-Statement sowie ein paar andere Kleinigkeiten, die ich nicht im Kopf habe.
-
Ok, ich gebe zu als C++-Programmierer war ich da nicht so ganz auf dem Laufenden. Aber wer das alles nutzt, ist ohnehin Delphi-Freak und hat gar kein Interesse an einer Übersetzung nach C++. Schon in der aktuellen VCL (für mich ist das die VCL zu CBuilder 2009) wird wenig davon verwendet. Und es gibt tonnenweise alte Komponenten, die ohne den modernen Schnickschnack
weiter verwendet werden. Und es sind eben zumeist alte Programme, die portiert werden sollen.
Mal sehen, wie sich die Nachfrage entwickelt. Ich werde die möglichen Verbesserungen an den Wünschen der Benutzer ausrichten.