On définit ici la nouvelle syntaxe de description des textes, dans laquelle apparaissent les expressions Lisp. Dans la présentation des grammaires, o na omis les parenthèses qu'impose Lisp pour faciliter la lecture.
On reprend les syntaxes décrites plus en détail au chapitre traitant du contexte d'évaluation (cf. Chapitre 9.1, « Contexte d'évaluation »).
syntaxe concrète
On apporte une petite modification au niveau des chaînes de caractères :
| (1) | env ::= ε | trm env |
| (2) | trm ::= def | ref |
| (3) | def ::= <nom> env rep |
| (4) | ref ::= <nom> env |
| (5) | rep ::= ε | atm rep |
| (6) | atm ::= stg | use | <string> |
| (7) | stg ::= <nom> |
| (8) | use ::= <nom> env |
| (1) | un environnement est une liste de termes |
| (2) | un terme est une définition def ou une référence ref |
| (3) | une définition est : un nom <nom>, un environnement, une représentation |
| (4) | une référence est : un nom <nom>, un environnement |
| (5) | une représentation est une liste d'atomes |
| (6) | un atome est une string stg ou une utilisation use ou une chaîne de caractères <string> |
| (7) | une string stg est : un nom <nom> |
| (8) | une utilisation est : un nom <nom>, un environnement |
On introduit une distinction entre :
- stg : un nom,
- <string> : une chaîne de caractères,
pour plus de symétrie entre les définitions des environnements et des représentations. stg ne sera peut-être pas très utile en pratique.
syntaxe évaluée
C'est la syntaxe évaluée des textes – ou encore la syntaxe des textes évalués, c'est-à-dire la syntaxe des expressions retournées par une évaluation :
| (1e) | env ::= ε | trm env |
| (2e) | trm ::= def | ref |
| (3e) | def ::= <singleton> |
| (4e) | ref ::= <singleton> |
| (5e) | rep ::= ε | atm rep |
| (6e) | atm ::= <string> | rep |
| (1e) | un environnement est une liste de termes |
| (2e) | un terme est une définition def ou une référence ref |
| (3e) | une définition est un atome du langage (<singleton>) |
| (4e) | une référence est un atome du langage (<singleton>) |
| (5e) | une représentation est une liste d'atomes |
| (6e) | un atome est une chaîne de caractères <string> ou une représentation : |
|
Les syntaxes non évaluée et évaluée se ressemblant beaucoup, on est conduit à les identifier, ce qui simplifie les notions introduites sans les appauvrir ni les surcharger.
| (1) | env ::= ε | trm env |
| (2) | trm ::= def | ref | env |
| (3) | def ::= <nom> env rep |
| (4) | ref ::= <nom> env |
| (5) | rep ::= ε | atm rep |
| (6) | atm ::= stg | use | <string> | rep |
| (7) | stg ::= <nom> |
| (8) | use ::= <nom> env |
| (1) | un environnement est une liste de termes |
| (2) | un terme est une définition def ou une référence ref ou un environnement env – et ceci même avant l'évaluation |
| (3) | une définition est : un nom <nom>, un environnement, une représentation |
| (4) | une référence est : un nom <nom>, un environnement |
| (5) | une représentation est une liste d'atomes |
| (6) | un atome est une string stg ou une utilisation use ou une chaîne de caractères <string> ou une représentation rep – et ceci même avant l'évaluation |
| (7) | une string stg est : un nom <nom> |
| (8) | une utilisation est : un nom <nom>, un environnement |
On enrichit un peu la syntaxe qui se définit avant l'évaluation ; on enrichit surtout celle qui se définit après l'évaluation :
def et ref ne sont plus des atomes (<singleton>), mais sont définis comme ils l'étaient avant l'évaluation. Ceci n'est qu'une question de point de vue : def vu comme un atome possédait quand même un champ env et un champ rep, mais qui étaient ceux de la syntaxe non évaluée ; dans la syntaxe évaluée, ces champs étaient donc non significatifs, quoique présents – puisqu'une définition est évaluée identiquement à elle-même. En confondant, syntaxiquement, les notions d'environnement ou de représentation évalués ou non évalués, on "démasque" les champs de def, ce qui ne prête pas à conséquence. Il reste qu'une définition sera toujours invariante par évaluation, et en particulier que les champs env et rep seront les formes non évaluées des champs env et rep de définition def.ref.<string>) ou des représentations rep, certaines dérivations de la grammaire ne seront jamais réalisées.Le choix de restreindre ainsi le nombre de dérivations possibles de la syntaxe évaluée sur les représentations n'est pas tout à fait innocent. On peut en effet juger qu'un emploi "transparent" des textes ne montre à l'utilisateur que les représentations évaluées : la syntaxe non évaluée et les environnements devraient être gérés automatiquement pour assurer toujours une lecture agréable du texte construit. Dans cette optique la syntaxe doit ressembler de très près à celle que reconnaît un écran Vidéo, à savoir des chaînes de caractères.
On conserve le concept de représentation rep pour un simple problème technique de tabulation : la syntaxe évaluée des représentations fournit donc bien pratiquement des suites de caractères.
On a repris la syntaxe précédente, en plaçant le Lisp lsp partout où on peut l'attendre :
env, ni sur rep qui sont des listes respectivement de termes trm et d'atomes atm,def, ref, stg, use qui sont les "atomes" du langage,trm et atm qui sont les concepts du langage où on attend "diverses choses", sans impératif absolu.Les deux dernières formules décrivent une expression Lisp :
| (1) | env ::= ε | trm env |
| (2) | trm ::= def | ref | env | lsp |
| (3) | def ::= <nom> env rep |
| (4) | ref ::= <nom> env |
| (5) | rep ::= ε | atm rep |
| (6) | atm ::= stg | use | <string> | rep | lsp |
| (7) | stg ::= <nom> |
| (8) | use ::= <nom> env |
| (9) | lsp ::= ε | sex lsp |
| (10) | sex ::= trm | atm | <liste> | <atome> |
| (9) | un texte Lisp lsp est une liste de S-expressions (S-ex) |
| (10) | une S-expression sex est un terme trm ou un atome atm, ou bien encore l'un des deux terminaux qui tiennent compte de la syntaxe des S-expressions de Lisp : une liste (<liste>) ou un atome (<atome>) |
Note : syntaxe Lisp des S-expressions :
S-ex ::= liste | atome
liste ::= '(' { S-ex }
atome ::= IDENT
soit :
- une S-expression est une liste ou un atome,
- un atome est un identificateur Lisp (ou une chaîne de caractères, un nombre, ...),
- une liste est : « ouvrez la parenthèse », des S-ex, « fermez la parenthèse », d'où une densité élevée de parenthèses dans les programmes Lisp.
On reprend sur les exemples précédents :
Le type humain, paramétré par le type type_sexe :
def humain
= "TYPE " (nom) ":" "^M"
"RECORD" "^M"
" identif : type_info(" (sexe) ");" "^M"
" conjoint : type_info("
(lsp
(if (= (use sexe) "masculin")
"feminin"
"masculin")) ");" "^M"
"END RECORD;" "^M"
Le contrôle de type sur l'affectation :
def affect
= (util(var1)) ":="
(lsp
(if (= (use type(var1)) (use type(var2)))
()
"(erreur de type)"))
(util(var2)) ";" "^M"
Note :
On remarque sur les exemples que :
'use', parce qu'il n'y a pas d'ambiguïté :L'ambiguïté qui doit être levée dans le second cas tient à ce que, dans une expression Lisp, il est plus simple de reconnaître un des préfixes introduits ('def', 'ref', ...) que de reconnaître le nom d'une fonction Lisp (il y en a beaucoup) : de ce fait, c'est la solution simple qui a été adoptée.