Domanda

Quali strumenti ci sono per me per costruire un DSL esterno reale, onesto alla bontà. E no, non sto parlando di abuso di Ruby, Boo, XML o di un'altra lingua o sintassi esistente, intendo un DSL esterno REALE - la mia lingua per i miei scopi.

So che ci sono alcuni banchi di lavoro linguistici in fase di sviluppo e ho sentito parlare di cose come " Irony " per .NET. E, naturalmente, c'è ANTLR, Lex / Yaac, ecc. Ma temo che siano troppo complicati per quello che sto cercando di fare.

Per favore, parla di uno strumento di creazione DSL che potresti aver usato o sentito parlare e delle tue impressioni su come aiuta e quali sono i suoi lati negativi.

È stato utile?

Soluzione

Ho scritto DSL in Boo, Irony.NET e un toolkit chiamato Grammatica. Dici che un generatore di parser è troppo complicato, ma potresti essere troppo frettoloso nel tuo giudizio, in effetti sono abbastanza semplici da usare una volta superata una piccola curva di apprendimento e apri un vasto mondo di possibilità che facilmente si sostituisce lo sforzo. Ho trovato l'apprendimento della notazione richiesta per scrivere grammatiche per la maggior parte dei generatori di parser in qualche modo simile all'apprendimento delle espressioni regolari: devi piegare leggermente la mente per farli entrare, ma i premi sono significativi.

La mia opinione è questa: se la tua lingua di destinazione è abbastanza semplice da poter essere gestita da un progettista visuale stupito, scrivere una grammatica usando un generatore di parser dovrebbe essere abbastanza semplice.

Se il tuo DSL di destinazione è abbastanza complicato da dover sudare scrivendo una grammatica, allora lo strumento visuale attenuato non taglierà comunque la senape e finirai per imparare a scrivere una grammatica comunque .

Concordo a lungo termine sulle DSL interne e esterne, tuttavia. Ho scritto un DSL interno in Boo e ho dovuto modificare la mia sintassi DSL per farlo funzionare e mi è sempre sembrato un hack. La stessa grammatica che utilizza Irony.NET o ANTLR sarebbe stata altrettanto facile da realizzare con maggiore flessibilità.

Ho un post sul blog discutere alcune opzioni. Il post è incentrato sulla scrittura di un DSL per la valutazione dell'espressione di runtime, ma gli strumenti sono tutti uguali.

La mia esperienza con Irony.NET è stata molto positiva e ci sono diversi linguaggi di riferimento implementati usando questo, che è un buon punto di partenza. Se la tua lingua è semplice, non è assolutamente complicato iniziare. C'è anche una libreria su CodeProject chiamata TinyParser - questa è davvero interessante, perché genera il parser come codice sorgente puro, il che significa che il tuo prodotto finale è completamente privo di riferimenti di terze parti. Non l'ho usato da solo, però.

Altri suggerimenti

Se stai cercando di scrivere DSL stand-alone, allora stai cercando di costruire compilatori - non c'è niente da fare. La costruzione del compilatore è una conoscenza di programmazione essenziale, e in realtà non è così difficile come si pensa comunemente. Righ Programmer Food di Steve Yegge riassume il valore del sapere come costruire compilatori abbastanza bene.

Ci sono molti modi per iniziare. Consiglio di consultare i 2 articoli citati nell'articolo: Vuoi scrivere un compilatore? Leggi questi due articoli . Il primo, Costruiamo un compilatore , è molto accessibile. Utilizza Turbo Pascal come linguaggio di implementazione, ma puoi implementarlo facilmente in qualsiasi altra lingua: il codice sorgente è molto chiaro. Pascal è un linguaggio semplice.

Una volta che hai capito bene come funzionano le cose e la terminologia in questione, ti consiglio di approfondire qualcosa come ANTLR . ANTLR ha un bel IDE, ANTLRWorks , che viene fornito con un interprete e un debugger. Produce anche visualizzazioni davvero molto buone delle tue grammatiche al volo. L'ho trovato prezioso per l'apprendimento.

ANTLR ha diversi buoni tutorial, anche se all'inizio potrebbero essere un po 'travolgenti. Questo è carino, sebbene sia contro ANTLR 2.0, quindi potresti riscontrare incompatibilità con una versione più recente (attualmente l'ultimo è 3.1).

Infine, c'è un altro approccio ai DSL: l'approccio Lisp. Data la natura priva di sintassi di Lisp (il tuo codice è fondamentalmente alberi di sintassi astratti), puoi modellare infiniti linguaggi da esso, a patto che ti abitui alle parentesi :).

Se segui questo approccio, vuoi usare un Lisp incorporabile. Sotto Java, hai Clojure , un dialetto Lisp che interagisce perfettamente con JVM e le sue librerie. Non l'ho usato personalmente, ma sembra buono. Per Scheme, c'è GNU Guile , che è concesso in licenza sotto LGPL . Per Common Lisp, c'è ECL , anche sotto LGPL. Entrambi usano un'interfaccia C per l'interoperabilità, quindi puoi praticamente incorporarli in qualsiasi altra lingua. ECL è unico tra Lisps in quanto ogni funzione Lisp è implementata come una funzione C, quindi puoi scrivere il codice Lisp in C se vuoi (diciamo, all'interno dei tuoi metodi di estensione - puoi creare funzioni C che operano su oggetti Lisp, e poi chiamali da Lisp). Ho usato ECL per un mio progetto collaterale per un po ', e mi piace. Il manutentore è piuttosto attivo e reattivo.

Dovresti davvero dare un'occhiata a Ragel . È un framework per incorporare macchine a stati nel tuo normale codice sorgente. Ragel supporta C, C ++, Objective-C, D, Java e Ruby.

Ragel è ottimo per scrivere parser di file e protocolli e per passare attraverso materiale DSL esterno. Principalmente perché ti consente di eseguire qualsiasi tipo di codice sulle transizioni di stato e simili.

Un paio di progetti importanti che usano Ragel sono, Mongrel , un ottimo server web rubino. E Hpricot , un html-parser basato su rubini, una sorta di ispirato da jQuery.

Un'altra grande caratteristica di Ragel è come può generare grafici basati su graphviz che visualizzano le tue macchine a stati. Di seguito è riportato un esempio tratto da Zed Shaw's articolo su grafici a stati ragel .

diagramma di stato ragel

Xtext è stato creato per questo.

Dal sito Web:

  

Xtext è un framework per lo sviluppo di linguaggi di programmazione e   lingue specifiche del dominio.

     

Copre tutti gli aspetti di un'infrastruttura linguistica completa, da   parser, over linker, compilatore o interprete di altissimo livello   Integrazione IDE Eclipse. Viene fornito con buone impostazioni predefinite per tutti questi   aspetti e allo stesso tempo ogni singolo aspetto può essere personalizzato   le tue esigenze.

Uso Irony con buoni risultati. La parte grandiosa dell'ironia è che puoi facilmente includerlo in qualunque runtime utilizzerai il DSL. Sto creando un DSL esterno che popolo in un modello semantico scritto in C #, quindi l'ironia è grandiosa. Quindi uso il modello semantico per generare codice con StringTemplate.

Se hai intenzione di implementare un DSL esterno, Spoofax ( http://strategoxt.org/Spoofax ) è un bel Language Workbench per farlo. È un Langauge Workbench testuale basato su parser che sfrutta diverse tecnologie all'avanguardia come SDF, Stratego. Oltre all'implementazione di DSL, potresti ottenere servizi editor molto ricchi come, completamento del codice, vista di struttura, intellisense ecc. È stato usato per costruire diverse lingue, ad es. http://mobl-lang.org/ . Dai un'occhiata a questo per avere l'idea del supporto fornito.

Il progetto Spoofax viene fornito con un'implementazione DSL di esempio pronta per l'uso e un generatore di codice java. Potrebbe funzionare come punto di partenza per iniziare con gli strumenti.

Seguendo i dettagli del tutorial sull'uso di questo banco di lavoro della lingua: http://strategoxt.org/Spoofax/Tour.

Spero che sia d'aiuto!

Per gravi DSL esterni, non è possibile evitare il problema di analisi; ANTLR è il minimo di ciò di cui hai bisogno. Ciò che si desidera verificare sono i sistemi di trasformazione del programma, che possono essere utilizzati per mappare la sintassi DSL arbitraria nelle lingue di destinazione come Java.

Vedi http://en.wikipedia.org/wiki/Program_transformation

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top