Sto lavorando al mio progetto .NET open source per generando SQL ...
Inizialmente, ho scritto il progetto in modo da sputare esattamente un formato SQL ... brutto. Ho iniziato a utilizzare questo progetto nel mondo reale e ho deciso che sarebbe stato bello poter generare abbastanza SQL in modalità di debug e brutto SQL in modalità di rilascio.
Il mio primo tentativo ha coinvolto molti loop if / else all'interno del mio codice di generazione dei comandi. In breve tempo doveva essere troppo da gestire. Così, ho iniziato a cercare un altro approccio che mi permettesse di inserire diverse strategie di formattazione. Ho anche guardato altre librerie di formattazione SQL, ma la maggior parte erano specifiche per un dialetto.
In questo momento, sto giocando con l'idea di generare un albero di token, simile a un albero sintattico astratto (AST) con cui lavora un compilatore. Speravo di navigare nell'albero e generare testo in base a dove sono nell'albero. Ora che ho costruito questi alberi, non sono sicuro di come scrivere il codice per visitare questi nodi.
Mi sento come se stessi andando indietro. Invece di analizzare SQL, generare un AST e sputare oggetti SQL, sto permettendo a qualcuno di creare oggetti SQL, quindi generare un AST e sputare fuori SQL. Quando qualcuno usa la mia libreria per costruire un'istruzione SELECT, specificano i valori da selezionare, le tabelle da cui selezionare, i filtri, l'ordinamento, ecc. Ma una volta generato un AST ... Ho meno informazioni di quelle originariamente iniziate con! Solo chiedendo "Il prossimo token è la parola chiave FROM?" posso avere una foto di dove sono. Devo scrivere un sacco di istruzioni if / elif / else per capire cosa verrà dopo. Almeno quando avevo gli oggetti SQL, potevo usare il polimorfismo per evitare brutte ramificazioni.
Quindi, forse ho perso un giorno nella teoria del compilatore o forse è perché sto cercando di tornare indietro. Ma, per qualunque ragione, il mio prossimo passo non mi è chiaro. Penso che il percorso AST fosse nella giusta direzione anche se ciò significasse perdere informazioni. Sono stato in grado di scrivere un formatter veramente stupido che mette gli spazi tra ogni token per ora. E 'davvero quando si tratta di avere fantasia che sono sopraffatto.
Se qualcuno ha delle buone risorse per tornare indietro, sarebbe probabilmente molto utile.