Tout part de CLApp, un langage original que j’ai voulu créer il y a longtemps (et dont je parlerai dans un autre post).
Au début (je suis de la vieille école), j’ai commencé avec la création de mon propre analyseur lexical (ce qu’aujourd’hui on appelle tokenizer), puis l’analyseur syntaxique (parser) avant d’en arriver au générateur de code (java), quand un collègue me suggéra d’utiliser ANTLR, beaucoup plus pratique où le gros du boulot est fait à ma place. Autre avantage : si je modifie quelque chose dans la définition de mon langage, je n’ai pas besoin de trifouiller dans mon code pour l’adapter à ce changement ; ANTLR me re-génère le tout.
Seulement voilà : ma syntaxe n’entre pas dans les cases ; je suis obligé de faire plein des concessions à l’originalité de CLApp pour l’adapter aux exigences d’ANTLR. Et à un moment, c’était trop. C’est là que j’ai décidé d’écrire mon propre générateur de parser et runtime. Et AKDL est né.
AKDL c’est Another Keyword Definition Language. Il a les particularités suivantes :
- Il génère du code java
- Le code généré, aussi bien pour le parser que pour le runtime, apparaît dans des classes représentant les mots-clé définis et ce dans les packages qu’on spécifie. Autrement dit, tu peux structurer le code qu’AKDL doit générer.
- Avoir une classe par mot-clé dans le parser te permet d’avoir autant de points d’entrée pour ton source. Tu peux donc générer du code pour une partie du source seulement et ainsi faire des snippets que tu peux déployer dans le reste de ton appli, par exemple.
Habituellement, pour définir des mots-clé, on se base sur la bonne vieille notation EBNF (Extended Bachus-Naur Form), celle où :
- les crochets [] sont utilisés pour l’option ; on a, par exemple, [a b c] pour dire que le groupe (a b c) est optionnel
- les accolades {} sont utilisées pour la quantification ; on a, par exemple, {a b c} pour dire que le groupe (a b c) apparaît un nombre n indéfini de fois (n pouvant être nul)
- le symbole | est utilisé pour l’alternative ; on a, par exemple, a | b | c pour dire que l’un des éléments du groupe (a b c) sera sélectionné aux détriments des autres
Il m’est apparu assez vite que cette bonne vieille notation ne me conviendrait pas. Le 1er truc qui m’a gêné, et qui saute aux yeux, c’est que le point 3 n’est pas consistant avec les 2 autres. Ensuite, les accolades autant que les crochets sont des symboles qui jouent 2 rôles à la fois : ils regroupent des éléments et un opérateur est appliqué au groupe. Et quand le groupe n’est constitué que d’un élément, on a [a] ou {a}, ce qui n’est pas grave mais pas trop joli non plus.
Pour moi, c’était un problème parce que je voulais absolument ajouter un ou deux autres opérateurs et, du coup, j’ai voulu rendre le tout cohérent. J’ai donc à la fois simplifié la notation (en séparant le regroupement et l’opérateur) tout en l’enrichissant de nouveaux opérateurs.
Ça donne:
- au lieu de [a b c] j’ai ^(a b c) ainsi que, au lieu de [a] j’ai ^a
- au lieu de {a b c} j’ai *(a b c) ainsi que, au lieu de {a} j’ai *a
- au lieu de a | b | c j’ai +(a b c)
ce qui m’a permis d’ajouter de nouveaux opérateurs sur le même modèle, dont un qui me plait particulièrement : l’opérateur dans n’importe quel ordre, symbolisé par &.
Ainsi, &(a b c) signifie: (a b c) | (a c b) | (b a c) | (b c a) | (c a b) | (c b a)
En plus, on peut combiner. Par exemple :
&(^a *b c) pour dire que a est optionnel, b apparaît un certain nombre de fois, c exactement une fois et le tout dans l’ordre que tu veux.
Il existe des cas concrets dans java avec les modificateurs synchronized, public, static …
Cette notation simplifiée et enrichie, je l’ai appelée seeBNF (simplified and enhanced EBNF). Elle permet de définir simplement un langage sous forme d’arborescence partant d’un symbole distingué (racine de l’arbre). C’est sous cette forme que le Visual AKDL Editor te propose de construire ta syntaxe.
A présent que tu sais presque tout sur AKDL, je te propose de découvrir l’éditeur avec les tutos suivants :
Tu peux également télécharger le tout :
AKDL : https://github.com/dragan-clapp-creator/akdl
Visual AKDL Editor : https://github.com/dragan-clapp-crea...al-AKDL-Editor
N’hésite pas à me dire ce que tu en penses. Ton avis m’intéresse.
Partager