Syntaxe abstraite

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

Dans la définition formelle des langages de programmation, la syntaxe abstraite s'oppose à la syntaxe concrète. Tandis que cette dernière représente les suites de caractères que l'utilisateur doit taper, la syntaxe abstraite tend à donner une structure aux données entrées, suggérant au passage la façon de les stocker en mémoire.

Par exemple, considérant une expression arithmétique dont la syntaxe concrète est 3*x+5, sa syntaxe abstraite pourra être un arbre dont la racine est un nœud +, de branche gauche un nœud * (ayant comme branche les feuilles 3 et x), de branche droite une feuille 5.

La syntaxe abstraite des langages de programmation, et son lien avec la syntaxe concrète, est le plus souvent donné par une grammaire hors-contexte en forme de Backus-Naur.

Il est remarquable que la famille de langages Lisp fait converger la syntaxe abstraite et la syntaxe concrète de façon à les rendre indiscernables pour le programmeur. Les langages Lisp se définissent en effet par l'utilisation des s-expressions pour la représentation littérale (syntaxique) du code source. Or en combinant des s-expressions, on obtient la représentation littérale d'un arbre de syntaxe, dont la traduction en arbre syntaxique abstrait est immédiate. Cette convergence permet d'ajouter à ces langages les macros, c’est-à-dire des opérateurs effectuant des transformations de source à source, ce qui permet de créer de nouveaux opérateurs sans altérer la définition du langage ni modifier le compilateur.

Par exemple :

3 * x + 5

est exprimé en Lisp :

 (+ 5 (* x 3))

qui correspond directement à l'arbre de syntaxe de racine +, feuille gauche 5, nœud droit * (feuilles x et 3). On observe qu'il n'y a plus besoin de connaître les règles de précédence des opérateurs arithmétiques infixes.

Perl 6 a pour ambition d'offrir le même type de fonctionnalité, grâce à un système de macros retournant directement un arbre syntaxique.

Un compositeur est une syntaxe concrète pour exprimer une valeur non primitive et spécifique à son type. Beaucoup de langages proposent des compositeurs pour les conteneurs (tableaux, tables associatives...). Plus rares sont les langages qui proposent une syntaxe concrète pour d'autres type d'objets, évitant ainsi l'utilisation explicite de constructeurs. Une forme spéciale de compositeur est l'interpolation de chaîne.