Question

Quels sont les outils à ma disposition pour construire un véritable DSL externe honnête et bon Et non, je ne parle pas d’abus de Ruby, Boo, XML ou d’un autre langage ou syntaxe existants, je parle d’un VRAI DSL externe - mon propre langage pour mes propres besoins.

Je sais que quelques ateliers linguistiques sont en cours de développement et j'ai entendu parler de choses comme "Irony". pour .NET. Et bien sûr, il y a ANTLR, Lex / Yaac, etc., mais je crains que ce ne soit trop compliqué pour ce que j'essaie de faire.

Veuillez parler d'un outil de création de DSL que vous avez peut-être utilisé ou entendu parler et de vos impressions sur son utilité et sur ses inconvénients.

Était-ce utile?

La solution

J'ai écrit des DSL dans Boo, Irony.NET et une boîte à outils appelée Grammatica. Vous dites qu'un générateur d'analyseur syntaxique est trop compliqué, mais vous pouvez être trop hâtif dans votre jugement. En fait, ils sont assez simples à utiliser une fois que vous avez dépassé une petite courbe d'apprentissage et ouvrez un vaste monde de possibilités qui l'emporte facilement. l'effort. J'ai trouvé que l'apprentissage de la notation requise pour écrire des grammaires pour la plupart des générateurs d'analyseurs syntaxiques était assez similaire à celui de l'apprentissage des expressions rationnelles: vous devez légèrement plier votre esprit pour les laisser entrer, mais les récompenses sont considérables.

Mon opinion est la suivante: si votre langue cible est suffisamment simple pour pouvoir être gérée par un concepteur visuel dépité, alors écrire une grammaire en utilisant un générateur d’analyseur devrait être assez facile.

Si votre DSL cible est suffisamment compliqué pour que vous deviez écrire une grammaire, l'outil visuel dépourvu ne coupera pas la moutarde et vous finirez par devoir apprendre à écrire une grammaire. .

Je suis d'accord à long terme sur les DSL internes par rapport aux DSL externes. J'ai écrit un DSL interne dans Boo et je devais modifier ma syntaxe DSL pour que cela fonctionne, et je me sentais toujours comme un piratage. La même grammaire utilisant Irony.NET ou ANTLR aurait été tout aussi facile à réaliser avec plus de flexibilité.

J'ai un article de blog discuter de certaines options. La publication est centrée sur l'écriture d'un DSL pour l'évaluation de l'expression à l'exécution, mais les outils sont les mêmes.

Mon expérience avec Irony.NET a été très positive et plusieurs langages de référence ont été implémentés, ce qui en fait un bon point de départ. Si votre langage est simple, il n’est absolument pas compliqué d’être opérationnel. Il existe également une bibliothèque sur CodeProject appelée TinyParser - celle-ci est vraiment intéressante, car elle génère l’analyseur en tant que code source pur, ce qui signifie que votre produit final est totalement exempt de toute référence à une tierce partie. Je ne l'ai pas utilisé moi-même, cependant.

Autres conseils

Si vous envisagez de rédiger des DSL autonomes, vous envisagez de créer des compilateurs - aucun moyen de les contourner. La construction du compilateur est une connaissance essentielle de la programmation, et ce n’est vraiment pas aussi difficile qu’on le pense généralement. Le Righ Programmer Food de Steve Yegge résume l'intérêt de savoir comment construire assez bien les compilateurs.

Il existe de nombreuses façons de commencer. Je vous recommande de consulter les 2 articles mentionnés dans l'article: Vous voulez écrire un compilateur? Il suffit de lire ces deux articles . Le premier, Construisons un compilateur , est très accessible. Il utilise Turbo Pascal comme langage d'implémentation, mais vous pouvez facilement l'implémenter dans n'importe quel autre langage - le code source est très clair. Pascal est un langage simple.

Une fois que vous avez une idée précise du fonctionnement des éléments et de la terminologie utilisée, je vous conseille d'explorer quelque chose comme ANTLR . . ANTLR a un bel IDE, ANTLRWorks , fourni avec un interpréteur et un débogueur. Il produit également de très bonnes visualisations de vos grammaires à la volée. Je l’ai trouvé très utile pour apprendre.

ANTLR propose plusieurs bons tutoriels, bien qu’ils puissent paraître un peu pénibles au début. Celui-ci est agréable, bien qu'il soit opposé à ANTLR 2.0, de sorte que vous pourriez rencontrer des incompatibilités avec une version plus récente (la version la plus récente est 3.1).

Enfin, il existe une autre approche des DSL: l’approche Lisp. Compte tenu de la nature sans syntaxe de Lisp (votre code est essentiellement une arborescence de syntaxe abstraite), vous pouvez en faire des langages sans fin, à condition de vous habituer aux parenthèses:).

Si vous optez pour cette approche, vous souhaitez utiliser un Lisp intégrable. Sous Java, vous avez Clojure , un dialecte Lisp qui fonctionne parfaitement avec JVM et ses bibliothèques. Je ne l'ai pas utilisé personnellement, mais ça a l'air bien. Pour Scheme, il existe GNU Guile , qui est sous licence LGPL . Pour Common Lisp, il existe ECL , également dans la LGPL. Les deux utilisent une interface C pour l’interopérabilité, vous pouvez donc pratiquement les intégrer dans n’importe quel autre langage. ECL est unique parmi Lisps en ce que chaque fonction Lisp est implémentée en tant que fonction C, vous pouvez donc écrire du code Lisp en C si vous voulez (par exemple, dans vos propres méthodes d’extensions - vous pouvez créer des fonctions C qui fonctionnent sur des objets Lisp, puis appelez-les de Lisp). J'utilise ECL pour un projet parallèle depuis un moment et j'aime bien. Le responsable est très actif et réactif.

Vous devriez vraiment consulter Ragel . C'est un framework pour incorporer des machines d'état dans votre code source habituel. Ragel prend en charge les langages C, C ++, Objective-C, D, Java et Ruby.

Ragel est idéal pour écrire des analyseurs syntaxiques de fichiers et de protocoles, ainsi que pour parcourir des éléments DSL externes. Principalement parce qu'il vous permet d'exécuter n'importe quel type de code sur les transitions d'état et autres.

Quelques projets notables utilisant Ragel sont Mongrel , un excellent serveur Web Ruby. Et Hpricot , un analyseur HTML basé sur le rubis, en quelque sorte inspiré par jQuery.

Une autre fonctionnalité intéressante de Ragel est la manière dont il peut générer des graphiques à base de graphviz qui visualisent vos machines d'état. Vous trouverez ci-dessous un exemple tiré de de Zed Shaw article sur les tableaux d'état de ragel .

graphique d'état de ragel

Xtext a été construit pour cela.

Depuis le site Web:

  

Xtext est un cadre pour le développement de langages de programmation et   langues spécifiques au domaine.

     

Il couvre tous les aspects d’une infrastructure linguistique complète, de la   analyseurs syntaxiques, sur l’éditeur de liens, sur le compilateur ou sur l’interprète pour obtenir des résultats de qualité supérieure   Intégration Eclipse IDE. Il vient avec de bons défauts pour tous ces   aspects et en même temps chaque aspect peut être adapté à   vos besoins.

J'utilise Irony avec de bons résultats. Le grand avantage de l’ironie est que vous pouvez facilement l’inclure dans le programme d’exécution pour lequel vous utiliserez le DSL. Je crée un DSL externe que je remplis dans un modèle sémantique écrit en C #, donc l'ironie est géniale. Ensuite, j'utilise le modèle sémantique pour générer du code avec StringTemplate.

Si vous envisagez d'implémenter des DSL externes, Spoofax ( http://strategoxt.org/Spoofax ). est un bon langage Workbench pour le faire. Il s'agit d'un Langauge Workbench textuel basé sur un analyseur syntaxique qui exploite plusieurs technologies de pointe, telles que SDF, Stratego. Outre l’implémentation DSL, vous pouvez obtenir un très riche éditeur de services tels que la complétion de code, la vue en contour, l’intellisense, etc. Il a été utilisé pour créer plusieurs langages, par exemple. http://mobl-lang.org/ . Consultez cette page pour vous faire une idée du support fourni.

Le projet Spoofax est livré avec un exemple d'implémentation DSL prête à l'emploi et un générateur de code java. Cela peut fonctionner comme point de départ pour commencer à utiliser les outils.

Après les détails du didacticiel sur l'utilisation de cet atelier de langage: http://strategoxt.org/Spoofax/Tour.

J'espère que ça aide!

Pour les DSL externes sérieux, vous ne pouvez pas éviter le problème d'analyse; ANTLR est le moindre de vos besoins. Ce que vous voulez vérifier, ce sont les systèmes de transformation de programme, qui peuvent être utilisés pour mapper la syntaxe DSL arbitraire dans des langages cibles tels que Java.

Voir http://fr.wikipedia.org/wiki/Program_transformation

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top