Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Quelltextformatierer programmieren (https://www.delphipraxis.net/164943-quelltextformatierer-programmieren.html)

Codewalker 7. Dez 2011 07:13

Quelltextformatierer programmieren
 
Meine Frage (bewusst allgemein gehalten): Wir würdet ihr prinzipiell einen Quelltextformatierer programmieren? (Grundwissen Grammatiken und Compilerbau vorhanden)

Coder 7. Dez 2011 08:02

AW: Quelltextformatierer programmieren
 
hatte mal einen geschrieben - muß ich mal suchen.

Bin den Quelltext durchgegangen,
hab Zeichen für Zeichen und hab nach Schlagworten gesucht, Wörter in meiner bib abgeglichen.
und je nachdem, was ich gefunden hab, dann in einer Tabelle Vermerke gemacht (Klammern offen => Einrückung, Schließen => wieder nach Links, etc., und bei IF then ebenfalls)

Ahnung von Compilerbau?
Hab ich glaub ich nich.

OK, vielleicht war mein Quelltextformatierer auch nicht optimal.
Aber optisch sah es besser aus.

Bjoerk 7. Dez 2011 11:36

AW: Quelltextformatierer programmieren
 
Ich würd’s auch rein auf Stringbasis (BeginFound, EndFound ect.) machen, alles andere wird ziemlich heftig.

Codewalker 7. Dez 2011 11:48

AW: Quelltextformatierer programmieren
 
Es darf ruhig heftiger ausfallen. Um mal konkreter zu werden: Ich brauche einen Formatierer für SQLs mit einigen Herstellerspezifischen Spezialitäten (sowas wie (+) für Outer Joins, etc.). Da die SQLs häufig mehr als 100 Zeilen umfassen und auch an Verschachtelungen nicht gerade sparen, werde ich mit einer reinen Stringverarbeitung wohl schnell an Grenzen kommen (etwa bei zunehmender Einrückung von SubSelects, etc.).
Daher war die Frage: Angekommen ich stütze mich auf eine SQL-Grammatik o.ä. - wie komme ich von da aus (am sinnvollsten) an einen flexiblen Formatierer?

Medium 7. Dez 2011 11:54

AW: Quelltextformatierer programmieren
 
Meine Idee wäre es, einen Syntaxbaum aufzubauen, und jedem Knoten seinen entsprechenden Quelltextfetzen anzuhängen. Dann ließe sich der Baum abarbeiten, wobei die sematische Struktur ja recht günstig vorliegt, und man könnte so Regeln aufstellen, nach denen die Textfetzen neu zusammengesetzt würden. So als sehr allgemeinen Ansatz.

stahli 7. Dez 2011 12:02

AW: Quelltextformatierer programmieren
 
Für den Fall, dass Du es von Hand machen willst/musst, hier mal ein Link zu meinem verwandten Ansatz: http://www.delphipraxis.net/159366-r...unktionen.html

Ich habe für einen eigenen Codegenerator ein Funktion geschrieben, die Regionen sucht und den Quelltext in Abschnitte zerlegt und diese (nach Änderungen einzelner Abschnitte) wieder zusammen baut. So kann mein Experte Änderungen in bestehenden Units vornehmen und auch auf nachträgliche Änderungen reagieren.

Letztlich zerlege ich den Code in mehrere Stringlisten, formatiere diese und setze das dann wieder zusammen.

Zu einem Codeformatter fehlt natürlich noch einiges, aber vielleicht kannst Du Teile wiederverwenden.

Bjoerk 7. Dez 2011 12:05

AW: Quelltextformatierer programmieren
 
Zitat:

Zitat von Codewalker (Beitrag 1140002)
Es darf ruhig heftiger ausfallen. Um mal konkreter zu werden: Ich brauche einen Formatierer für SQLs mit einigen Herstellerspezifischen Spezialitäten (sowas wie (+) für Outer Joins, etc.). Da die SQLs häufig mehr als 100 Zeilen umfassen und auch an Verschachtelungen nicht gerade sparen, werde ich mit einer reinen Stringverarbeitung wohl schnell an Grenzen kommen (etwa bei zunehmender Einrückung von SubSelects, etc.).
Daher war die Frage: Angekommen ich stütze mich auf eine SQL-Grammatik o.ä. - wie komme ich von da aus (am sinnvollsten) an einen flexiblen Formatierer?

Dann würde ich einen Scanner programmieren.

http://wiki.delphigl.com/index.php/T...prachen_Teil_1
Dieser Code ist nicht besonders schön, aber so geht's im Prinzip.

Jumpy 7. Dez 2011 13:30

AW: Quelltextformatierer programmieren
 
Sollte man da nicht beim Erstellen der SQL-Statements direkt ansetzen? Wir bauen die uns immer als Stringfunktkion mithilfe einer Extra (auf einer TStringList basierenden) Klasse zusammen. Beispiel:

SQL-Code:
function SQL_Main:String;
var s:TSQL;
begin
  s:=TSQL.Create;
  s.Add:='Select';
  s.Add:=' *';
  s.Add:='From';
  s.Add:=' ('+SQL_Subselect+')';
  s.Add:='Where';
  s.Add:=' myVarCharFeld=' + s.OracleString(IrgendeineStringVariable);
  Result:=s.Text;
  s.Free;
end;

function SQL_Subselect:String;
var s:TSQL;
begin
  s:=TSQL.Create;
  s.Add:='Select';
  s.Add:=' T1.*, T2.MyFeld';
  s.Add:='From';
  s.Add:=' Tabelle1 T1';
  s.Add:='Left Join';
  s.Add:=' Tabelle2 T2';
  s.Add:='On'
  s.Add:=' T1.FID=T2.ID';
  Result:=s.Text;
  s.Free;
end;
Mmn kann man 100+ zeileige SQL-Statements mit vielen Verschachttelungen eh kaum noch verstehen, auch wenn sie noch so gut formatiert sind. Da ist es leichter jede Verschachtelungsebene selber in der entsprechenden Unterfunktion prüfen zu können.

Codewalker 7. Dez 2011 13:37

AW: Quelltextformatierer programmieren
 
Das ganze läuft schon über einen QueryBuilder und wird über Methoden dynamisch erzeugt. Nur dem übergebe ich nicht direkt einen String sondern etwas in der Art (Pseudocode):

Delphi-Quellcode:
AddBedingung(Operator (AND,OR), Datentyp, Feld, Vergleichsoperator, Variable)
Und der QueryBuilder rückt nicht ein sondern haut einfach die entsprechenden Zeilen darunter.

Iwo Asnet 7. Dez 2011 13:42

AW: Quelltextformatierer programmieren
 
1. Du suchst Dir einen Compiler Compiler (LEX & YACC, COCO oder so hießen die früher) und baust dir deine Regeln zusammen.
2. Du suchst Dir einen Parser, der den Quelltext in einen Syntaxbaum überführt und aus dem Syntaxbaum erstellst du wieder den Code, aber so, wie Du in willst.
3. Du schreibst Dir einen Parser.

In jedem Falle benötigst Du die BNF und ein paar Kisten Bier.

Verfahren, die sich irgendwie durchwuseln, gehen vielleicht auch. Aber das ist nix für mich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:46 Uhr.
Seite 1 von 2  1 2      

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