2016-05-13 1 views
1

J'ai besoin de faire un DSL qui produise un langage de type SQL. D'abord, j'ai pensé rouler mon propre transpiler en utilisant un analyseur de descente récursif + une approche de génération de code simple. Mais comme le langage DSL est vraiment simple et le langage de sortie aussi, j'ai réalisé que j'essaierais de trouver une approche consommant moins de temps et d'énergie, où je ne réinvente pas la roue, comme une version plus puissante du pré-processeur. D'abord venu à l'esprit était m4, je n'avais entendu parler d'avant, jamais utilisé jusqu'ici. Je suis en train de lire quelques tutoriels/documentations mais je ne sais toujours pas si je peux atteindre mon objectif avec cet outil. Par exemple, je veux tourner:Bonne alternative pour faire un transtypeur de type sql-like

display a,b,c if a.substring(0, 3) == b.substring(0, 3) and (c + 8 > 20 || c == 0) 

se traduirait par quelque chose comme ça:

SELECT A, B, C from tbl where substring(A, 0, 3) = substring(B, 0, 3) and (c + 8 > 20 or c = 0) 

Je ce qui est une bonne façon d'y arriver? continuez d'apprendre M4 ou devrais-je essayer un autre outil (si oui, lequel) ou mieux faire ma propre implémentation du compilateur?

+0

Si votre langage DSL traduit trivialement vers une autre langue, il n'ajoute pas beaucoup de valeur; pourquoi ne pas simplement écrire ce que vous alliez écrire dans cette langue? Si la traduction n'est pas triviale, alors choisir un framework trivial "transpiler" n'ajoutera pas grand-chose à l'implémentation de la traduction et donc construire votre transpiler sera difficile. Je pense que ce que vous découvrirez est que vous ne pouvez pas éviter un analyseur (donc M4 n'est pas une réponse) et que juste un analyseur ne suffit pas. Voir http://www.semdesigns.com/Products/DMS/LifeAfterParsing.html –

Répondre

0

Je voudrais construire des DSL externes appropriés. De cette façon, vous pouvez valider le code et avoir des choses comme les règles du système de types.

Votre langage serait-il indépendant ou aurait-il besoin d'interopérer avec d'autres langages (par exemple, Java ou C)? Auriez-vous besoin d'un support éditeur?

Un analyseur peut être facilement écrit avec ANTLR. Comme l'a souligné Ira Baxter, il y a d'autres aspects à considérer et les efforts nécessaires pour mettre en œuvre ces autres choses dépendent de votre expérience sur le terrain.

1

que je dois faire une connexion DSL

Je vais travailler sur l'hypothèse que vous devez créer une connexion DSL. Bien que beaucoup de problèmes ressemblent à une DSL, cela aiderait bien souvent une bonne compréhension d'une autre langue serait plus bénéfique.

comme une version plus puissante du pré-processeur C.

Le préprocesseur C est considéré par beaucoup et je suis un de ces nombreux un programme non trivial, developing something more powerful aurait, au moins pour moi, constituer une œuvre d'art.

Développer un analyseur de descente récursif est également non trivial pour toute entrée non triviale. C'est facile à comprendre, mais la gestion de tous les cas/productions, etc. devient un peu de travail. Ce serait plus simple mais non trivial si vous utilisiez quelque chose comme ANTLR pour définir votre grammaire et ensuite l'utiliser pour générer l'analyseur. DSL n'implique pas simple, il implique plus simple, C est plus simple que C++ pour analyser et Scheme est plus simple que C pour analyser mais écrire un bon analyseur de schéma qui n'a pas de bugs va prendre some effort et le schéma est l'un des plus simples .

+0

OP a proposé d'utiliser m4 (il n'a pas besoin de le construire) qui est au moins aussi puissant que le préprocesseur C.Mais un macro-processeur n'est pas une excellente base pour un compilateur DSL. Construire un analyseur est en fait facile d'un point de vue pratique ("pas de problème difficile à résoudre") mais c'est le moindre des problèmes de l'OP quand il s'agit de construire un traducteur. –