![]() |
Quelltextformatierer programmieren
Meine Frage (bewusst allgemein gehalten): Wir würdet ihr prinzipiell einen Quelltextformatierer programmieren? (Grundwissen Grammatiken und Compilerbau vorhanden)
|
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. |
AW: Quelltextformatierer programmieren
Ich würd’s auch rein auf Stringbasis (BeginFound, EndFound ect.) machen, alles andere wird ziemlich heftig.
|
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? |
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.
|
AW: Quelltextformatierer programmieren
Für den Fall, dass Du es von Hand machen willst/musst, hier mal ein Link zu meinem verwandten Ansatz:
![]() 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. |
AW: Quelltextformatierer programmieren
Zitat:
![]() Dieser Code ist nicht besonders schön, aber so geht's im Prinzip. |
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:
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.
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; |
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:
Und der QueryBuilder rückt nicht ein sondern haut einfach die entsprechenden Zeilen darunter.
AddBedingung(Operator (AND,OR), Datentyp, Feld, Vergleichsoperator, Variable)
|
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 15:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz