2012-07-17 11 views
5

Ho un linguaggio specifico del dominio che può essere tradotto in SQL. Devo scrivere il mio lexer, parser e generatore di codice, o ci sono strumenti che potrebbero aiutarmi?Strumento giusto per tradurre una DSL in SQL?

+0

Hai intenzione di analizzare anche la sintassi del linguaggio specifico del dominio in SQL? – alexm

+1

Lasciatemi riformulare: qual è la lingua host che farebbe la generazione SQL? – alexm

+0

Dipende molto dalla lingua che stai usando e dalla complessità del tuo DSL. –

risposta

0

Sembra che tu stia cercando qualcosa come Eli, che è destinato ad accogliere una specifica e generare un traduttore da esso:

http://eli-project.sourceforge.net/

D'altra parte, si potrebbe essere altrettanto felice scrivendo il parser con uno strumento di generazione come ANTLR e codificando da soli l'AST e il generatore di codice.

La generazione di codice che scrive un linguaggio di alto livello come SQL probabilmente non è molto difficile da implementare, assumendo che la traduzione dal proprio DSL sia semplice.

Se fossi in me, scriverei la cosa in OCaml usando ocamllex e ocamlyacc, ma per prima cosa devi conoscere OCaml.

1

Questo dipende molto dalla lingua che userete, ma Groovy, Ruby, Scala, F # e Haskell sono buoni linguaggi per farlo.

La lingua utilizzata influirà sugli strumenti da utilizzare.

Si può fare questo in C, ad esempio, ma sarebbe più lavoro, e potrebbe non sembrare piacevole per l'utente.

In alcune lingue è necessario utilizzare strumenti per aiutare con il parser, altri sono migliori senza gli strumenti.

Si consiglia di leggere questo libro per imparare molto di più sull'argomento DSL, DSL in azione.

http://manning.com/ghosh/

1

Se il DSL è stato progettato per migliorare la leggibilità da parte del codificatore DSL, allora sì, è necessario un lexer, un parser e un generatore di codice.

(Altre risposte suggeriscono che se si codifica il DSL "nella sintassi del proprio" meta lingua "" non sono necessari questi parametri meccanici, mentre ciò può essere vero, ottimizza l'incorporabilità del DSL nelle meta- linguaggio piuttosto che la sua leggibilità per gli utenti finali, che credo sia un compromesso insoddisfacente).

No, non è necessario scriverli da zero.

Ci sono molti generatori di parser in natura (YACC, Bison, ANTLR, JavaCC) che ti aiuteranno a concentrarti sulla codifica solo delle regole grammaticali per il tuo DSL; forniscono molti strumenti di analisi di basso livello per elaborare/eseguire le regole grammaticali come motore di analisi. Tuttavia, devi dedicare uno sforzo alla flessione della grammatica concettuale alle limitazioni del particolare generatore di parser (LALR (1), LL (k), ...) ANTLR/Bison/Yacc ti aiuterà a costruire alberi; devi fare un lavoro esplicito per farlo. Dopodiché, sei da solo con parser tradizionali. Molte persone finiscono per essere sorprese una volta arrivati ​​(se arrivano così lontano, i parser per le lingue reali tendono ad essere più lavoro di quanto si aspettino.

Ecco perché c'è un sacco di Life After Parsing: tabelle dei simboli, analisi del codice generazione del codice: il nostro DMS Software Reengineering Toolkit è progettato per aiutarti a creare regole di analisi con vincoli minimi dal motore di grammatica, crea automaticamente alberi (guarda, ma, senza mani!) e fornisce un sacco di supporto per la trasformazione del codice in un'ampia varietà di modi.Inoltre, DMS fornisce una prospettiva e strumenti per supportare la conversione tra i frammenti DSL ("la tua lingua") e l'obiettivo in modi strutturati utilizzando le coppie di modelli di origine/destinazione per specificare la mappatura. Per lo scopo specifico dell'OP, il DMS può essere ottenuto con una grammatica SQL2011, fornendo una buona base per la scrittura dei pattern di destinazione.

Per ulteriori informazioni sulla conversione automatica con strumenti, vedere il mio SO discussion on translating between languages.

0

Non è necessario un lexer, un parser e un generatore di codice se si utilizza un linguaggio meta appropriato (ad es., Lisp). Tutto è già incluso - puoi costruire il tuo DSL sopra le S-espressioni, puoi generare una parte host del tuo codice in Lisp stesso.

Anche se si desidera una sintassi speciale per il proprio DSL, è molto semplice incorporare un parser in un meta-linguaggio.

2

Si consiglia di leggere questo libro: Language Implementation Patterns di Terence Parr della serie Pragmatic Programmers. È un'introduzione approfondita all'analisi, alla traduzione e alla compilazione. Si basa molto su ANTLR by Terence Parr per gli esempi, ma è abbastanza generale da permetterti di andare in altri linguaggi e sistemi.

0

Ho un progetto simile al tuo. Penso che dovresti controllare Xtext e Xtend, dato che possono essere usati direttamente in Eclipse, puoi facilmente ottenere intellisense, grammer, lessico. Ho provato a produrre codice SQL ed è stato un progetto di successo fino ad ora.

Problemi correlati