Syntaxe abstraite

Un article de Wikipédia, l'encyclopédie libre.

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 de syntaxe 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.