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?
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 –