AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Quelltextformatierer programmieren

Ein Thema von Codewalker · begonnen am 7. Dez 2011 · letzter Beitrag vom 8. Dez 2011
Antwort Antwort
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Quelltextformatierer programmieren

  Alt 7. Dez 2011, 12:05
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.

Geändert von Bjoerk ( 7. Dez 2011 um 12:10 Uhr) Grund: Link eingefügt
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#2

AW: Quelltextformatierer programmieren

  Alt 7. Dez 2011, 13:30
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.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Quelltextformatierer programmieren

  Alt 7. Dez 2011, 13:37
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):

AddBedingung(Operator (AND,OR), Datentyp, Feld, Vergleichsoperator, Variable) Und der QueryBuilder rückt nicht ein sondern haut einfach die entsprechenden Zeilen darunter.
  Mit Zitat antworten Zitat
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#4

AW: Quelltextformatierer programmieren

  Alt 7. Dez 2011, 13:42
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.
  Mit Zitat antworten Zitat
Sailor

Registriert seit: 20. Jul 2008
Ort: Balaton
112 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Quelltextformatierer programmieren

  Alt 7. Dez 2011, 21:12
Die letztendlich einfachste Lösung ist der Aufbau eines Syntaxbaumes (am besten keinen AST, sondern den vollständigen Analysebaum oder parse tree), der in den Knoten die Zeilen- und Spaltennummern trägt, an denen das jeweilige Konstrukt beginnt. Diese Information wird ausgehend von den Endknoten (Lexemen) bottom-up weitergereicht. Anschließend kann man in einem top-down tree walk die neuen Positionen berechnen und danach den Text z.B. in einer Stringlist formatieren und ausgeben.
  Mit Zitat antworten Zitat
Antwort Antwort


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:28 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