Syntaxe abstraite

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher
Cette page n'est pas vérifiable. Il est fortement conseillé aux contributeurs de cet article d'étayer son contenu par des sources fiables. (avril 2014).

Discussion ici (si vous venez d'apposer le bandeau, veuillez cliquer sur ce lien pour créer la discussion et en afficher les indications).

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 représenté par un arbre dont la racine est un nœud +, avec pour branche gauche un nœud * (ayant comme branche les feuilles 3 et x), et pour branche droite une feuille 5. Comme le montre cet exemple, la syntaxe abstraite d'un langage est généré grâce à sa syntaxe concrète. BNF permet de définir la syntaxe concrète mais ne suffit pas pour générer les arbres de syntaxe abstraite.

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 types d'objets, évitant ainsi l'utilisation explicite de constructeurs. Une forme spéciale de compositeur est l'interpolation de chaîne.