AW: UnitOptimizer
Naja, grundsätzlich liegt Delphi eine reguläre Grammatik zugrunde - da ist nichts indeterministisch. Siehe auch:
https://condor.depaul.edu/ichu/csc44...k2/pascal.html Aber die Kommentare und die Formatierung machen das natürlich schwieriger (darum gibt es ja auch die Tricks wie //1 //3 oder irgendwelche Tags etc). Da bist du rasch in der Verarbeitung natürlicher Sprache drin. Während ich dem Umstrukturieren des Codes noch etwas abgewinnen kann, verstehe ich das Formatieren nicht - das kann Delphi ja schon + das macht es auch gut. |
AW: UnitOptimizer
Zitat:
Code:
Das ist für einen Parser und dessen Programmierer nicht schön, da stimme ich Dir vollkommen zu. Typischerweise ist die Erklärung für solche Dinge in der Versions-Historie zu finden. Der Zwang zur Abwärts-Kompatibilität entschuldigt SEHR vieles.
var
_OleCreatePictureIndirect: function(const PictDesc: TPictDesc; const iid: TIID; fOwn: BOOL; out vObject): HResult stdcall; _OleLoadPicture: function(stream: IStream; lSize: Longint; fRunmode: BOOL; const iid: TIID; out vObject): HResult; stdcall; |
AW: UnitOptimizer
Ich finde die "Strukturidee" eigentlich ganz gut. Hab mal den Film überflogen.
Leider wirkt es recht "monolitisch" und wenn Farbe, dann v ielleicht eher die Schriftfarbe, statt den Hintergrund und wenn Hintergrund dann vielleicht zeilenweise, statt Flattersatz entlang der Schrift. Wieso machst Du das gerade in solch einem Test nicht interaktiv. Maßnahmen abschaltbar oder sogar interaktiv. Würde sicher die Fehlerfindung vereinfachen und Verständnis / Aha Effekt des Users auch. Am Ende wäre es in meinen Augen sogar auch erstmal ein command line tool mit Regelset, Eingabedatei und Ausgabe. Heute auch gern gesehen (Stichwort "moderne Programmierung"): Logging, wenigstens Fehlerausgabe auf Stdout, besser aber mehr, konfigurierbar. Formatierung dito, müsste allerdings ebenfalls sehr individuell konfigurierbar sein, da es sonst keine Vorteile zu bestehenden Formatierern bietet oder? |
AW: UnitOptimizer
Danke Euch.
Das Hauptziel meines Tools ist eine Codevervollständigung incl. Interfaceunterstützung. Das ist in der Demo noch gar nicht drin. Zweites großes Ziel ist die Sortierung der Unit. Mich nervt es immer, wenn die Methoden im Implementationsteil "irgendwo" stehen. Bei der Umsortierung von Code sollen alle Lesezeichen und Breakpoints erhalten bleiben und mit verschoben werden. Das hat in meiner früheren Version schon grundsätzlich funktioniert, aber noch nicht vollständig. Die Codeformatierung gehört dann natürlich mit dazu. Die ist aber eher ein Nebenprodukt, enthält aber zur Delphi-Formatierung m.E. auch noch einige Vorteile (Ausrichtungen untereinander, weiche Umbrüche und 3 Kommentar-Stile). Die Exe ist jetzt nur während der Entwicklungszeit zum testen da. Später soll das Tool als Delphi-Experte in Delphi eingebunden werden und den Code im Editor auf Knopfdruck überarbeiten. Der Flatter-Satz ergibt sich so, weil der Quelltext so analysiert wird. Es soll ja nicht schön aussehen, sondern ist eine optische Kontrolle während der Entwicklungszeit, was mein Parser in den Texten erkennt. Ein Logging habe ich zusätzlich. Delphi-Pascal selbst finde ich weiterhin eine super Sprache aber sie ist tatsächlich sehr komplex zu analysieren, eben weil sie der natürlich Sprache ziemlich ähnelt. Für einen Parser wäre es letztlich am einfachsten, wenn man statt
Delphi-Quellcode:
so etwas schreiben würde wie
I := 0;
Delphi-Quellcode:
.
Assign, I, 0
Alles, was dann an Freiheiten noch kommt, erhöht die Komplexität der Sprache. Für die Programmierer macht es allerdings auch einiges einfacher und es fühlt sich natürlicher an. Ich habe also nichts gegen Delphi-Pascal, sondern wollte nur sagen, dass es doch überraschend komplex ist - vor allem wenn man etwas umsortieren möchte. |
AW: UnitOptimizer
Hast Du Dir den "Castalia Delphi Parser" schon angesehen?
|
AW: UnitOptimizer
Zitat:
Zitat:
Das hört sich jetzt im Kontext eines Parsers etwas seltsam an. |
AW: UnitOptimizer
Ich habe keinen fertigen Parser benutzt, sondern alles selbst geschrieben.
Was meinst Du mit "nicht einfach zeilenweise"? Meine Vorgehensweise ist etwa so: - Zerlegen der Unit in einzelne Worte (Namen und Zahlen werden als Ketten behandelt, sonstige Zeichen sind immer separiert (Wörter sind dann ein Zeichen lang), LineBreaks sind auch "ein Wort") - Die Wörter sind Objekte, die den Text beinhalten. Diese Objekte werden in Listen gespeichert. - Den Objekten werden dann durch den Parser Tags hinzugefügt (z.B. "IstEinSchlüsselwort", "BeginnKommentar", EndeKommentar" usw.) - Die Tags werden dann ggf. verschoben, um z.B. das Ende einer Methode zu markieren oder auch das Ende einer Unit. - Dann werden die einzelnen Blöcke ausgeschnitten und in anderer Reihenfolge wieder eingefügt. - Dann geht ein Formatierer durch die Liste und fügt z.B. Leerzeichen ein oder entfernt welche. . Zum Schluss werden die Texte aus den Objekten wieder in eine Stringlist geschrieben. |
AW: UnitOptimizer
Ein echter Parser geht so vor, dass er unabhängig von Zeilenumbrüchen einfach zeichenweise durchgeht und jeweils schaut, wenn er z.B. ein Wort oder Satzzeichen findet, ob das an der Stelle laut Grammatik erlaubt ist und entsprechend verarbeitet.
Bei dem Castalia Parser ist das z.B. so gelöst, dass es eine Methode gibt, die eine Unit parst. Stößt die auf das Schlüsselwort interface, wird eine Methode aufgerufen, die dieses parst. Findet die einen Bezeichner, kann das nur ein Unitname sein usw., so dass man immer weiß wo man gerade ist und was an der Stelle richtig oder falsch ist. Da man Konstrukte wie Typdeklarationen innerhalb von Methoden hat usw., ist das anders auch nur schwer abzubilden. Schau dir am besten einfach mal an wie das dort läuft. Der Quelltext ist ziemlich einfach zu verstehen. Klar ist jedenfalls, dass man nie alle Formatierungen und Konstrukte verstehen können wird, wenn man nicht wirklich entsprechend der Grammatik parst. |
AW: UnitOptimizer
Was machst Du mit defines und co?
also so etwas wie:
Delphi-Quellcode:
{$IFDEF USENEWPARTS}
irgendwas das nicht compiliert {$ELSE} s := 'Bla'{$IFDEF CPU64}+'64 {$ENDIF} + Blub; {$ENDIF} Eine Weiterentwicklung des Castalia Parsers findest Du hier: https://github.com/RomanYankovsky/DelphiAST Ist auf jeden Fall ein ambitioniertes Projekt 8-) |
AW: UnitOptimizer
Liste der Anhänge anzeigen (Anzahl: 1)
So, mein Delphi CE läuft wieder auf dem neuen Rechner. :-)
Das $ifdef habe ich gleich mal angepasst. Siehe Screenshot. 3 kleine Änderungen musste ich noch einarbeiten. Jetzt werde ich mich mal um "das hsg-Problem" von oben kümmern... :-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz