Delphi-PRAXiS
Seite 9 von 25   « Erste     789 101119     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   UnitOptimizer (https://www.delphipraxis.net/196493-unitoptimizer.html)

TigerLilly 8. Okt 2019 07:21

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.

DenkDirNix 8. Okt 2019 07:48

AW: UnitOptimizer
 
Zitat:

Schlüsselwörter haben unterschiedliche Bedeutungen, abhängig vom Kontext.
Manche Anweisungen sind mit einem Semikolon beendet, anderen folgen mehrere Zeilen, die mit Semikolon beendet werden können, aber nicht müssen.
Gleiche Schlüsselwörter können mehrfach in verschiedenen Abschnitten auftauchen.
Leerzeilen und unterschiedlichste Kommentare können überall enthalten sein.
Diese Dinge bekommt man sicher mit etwas Zusatz-Aufwand bei der Analyse in der Griff. Ich bin (bisher) nur über eine unschöne Sache gestolpert: Die Direktive "stdcall" kann tatsächlich sowohl mit Semikolon wie auch ohne an die vorausgehende Deklaration angehängt werden. Siehe z.B. in Source VCL.AxCtrls.pas:

Code:
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;
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.

jobo 8. Okt 2019 08:22

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?

stahli 8. Okt 2019 08:50

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:
I := 0;
so etwas schreiben würde wie
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.

samso 8. Okt 2019 09:57

AW: UnitOptimizer
 
Hast Du Dir den "Castalia Delphi Parser" schon angesehen?

jaenicke 8. Okt 2019 10:48

AW: UnitOptimizer
 
Zitat:

Zitat von samso (Beitrag 1449283)
Hast Du Dir den "Castalia Delphi Parser" schon angesehen?

Den habe ich auch schon verwendet und erweitert. Den kann ich absolut empfehlen um damit einen Syntaxbaum aufzubauen, den dann entsprechend zu transformieren und wieder zu schreiben.

Zitat:

Zitat von stahli (Beitrag 1449279)
Für einen Parser wäre es letztlich am einfachsten, wenn man statt
Delphi-Quellcode:
I := 0;
so etwas schreiben würde wie
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 hoffe doch, dass du einen echten Parser benutzt und nicht einfach zeilenweise analysierst?!
Das hört sich jetzt im Kontext eines Parsers etwas seltsam an.

stahli 8. Okt 2019 11:31

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.

jaenicke 8. Okt 2019 12:58

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.

Fritzew 8. Okt 2019 13:40

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-)

stahli 8. Okt 2019 15:29

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.
Seite 9 von 25   « Erste     789 101119     Letzte »    

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