AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte UnitOptimizer

UnitOptimizer

Ein Thema von stahli · begonnen am 25. Mai 2018 · letzter Beitrag vom 31. Okt 2021
Antwort Antwort
Seite 9 von 25   « Erste     789 101119     Letzte » 
Benutzerbild von stahli
stahli
Registriert seit: 26. Nov 2003
Ich bin dabei, ein Tool aufzubauen, das Units sortiert und Code ergänzt.

Es ist quasi eine Klassenvervollständigung, Codeformatierung und Codesortierung in einem.

Hier mal ein aktueller Zwischenstand als Video: https://youtu.be/cfKa3wuoEd0

Eine direkte Codeformatierung (Einrückung) habe ich noch nicht drin, will das aber auch noch ergänzen. Die anderen Features gehen für mich aber vor.

Die Abkürzung "prop" könnte man auch mit "property" ausschreiben lassen. Ebenso sind optional andere Voreinstellungen möglich, wenn dies gewünscht würde. Ich bin zunächst erst einmal von meinen Wünschen ausgegangen.

Ich würde das später sehr gern kommerziell anbieten, wenn es Nachfrage gibt.
Für öffentliche Tests ist es noch etwas früh. Dazu muss ich noch einiges ausbauen und ausbessern.
Sofern jemand Erfahrungen mit den OTA hat und daran mitarbeiten möchte, dann gebt Bescheid...



Ich hatte dazu schon einen Thread, der sich aber speziell auf die Interface-Unterstützung bezogen hatte. Da das Tool aber Units allgemein bearbeitet habe ich hier einen neuen Thread eröffnet.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
 
TigerLilly

 
Delphi 11 Alexandria
 
#81
  Alt 8. Okt 2019, 07:21
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.
  Mit Zitat antworten Zitat
DenkDirNix

 
Delphi 10.4 Sydney
 
#82
  Alt 8. Okt 2019, 07:48
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.
  Mit Zitat antworten Zitat
jobo

 
Delphi 2010 Enterprise
 
#83
  Alt 8. Okt 2019, 08:22
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?
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

 
Delphi 10.4 Sydney
 
#84
  Alt 8. Okt 2019, 08:50
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 I := 0; so etwas schreiben würde wie 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.
  Mit Zitat antworten Zitat
samso
 
#85
  Alt 8. Okt 2019, 09:57
Hast Du Dir den "Castalia Delphi Parser" schon angesehen?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

 
Delphi 10.4 Sydney
 
#86
  Alt 8. Okt 2019, 10:48
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.

Für einen Parser wäre es letztlich am einfachsten, wenn man statt I := 0; so etwas schreiben würde wie 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.
Sebastian Jänicke
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

 
Delphi 10.4 Sydney
 
#87
  Alt 8. Okt 2019, 11:31
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.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

 
Delphi 10.4 Sydney
 
#88
  Alt 8. Okt 2019, 12:58
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.
Sebastian Jänicke
  Mit Zitat antworten Zitat
Fritzew

 
Delphi 11 Alexandria
 
#89
  Alt 8. Okt 2019, 13:40
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
Fritz Westermann
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

 
Delphi 10.4 Sydney
 
#90
  Alt 8. Okt 2019, 15:29
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...
Miniaturansicht angehängter Grafiken
08-10-_2019_16-24-00.png  
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf