afficher >><< masquer ]
SAMPI - Editeur structuré
1. Le Problème et la Proposition
2. Le Langage Primitif de Représentation Textuelle
2.1. Présentation de la Syntaxe Concrète
2.2. Notations
2.3. Exemple de structuration des données
2.4. Exemple de structuration des traitements
2.5. Exemple de structurations connexes
3. Le Langage Complété pour la Structuration des Textes
3.1. Présentation de la Syntaxe Complétée
3.1.1. Comportement dynamique des textes
3.1.11.1. Modification textuelle
3.1.11.2. Le contrôle non textuel
3.1.11.3. Insertion de code Lisp
3.1.11.4. Syntaxe Lisp
3.1.2. La syntaxe complétée
3.2. Etude quantitative de l'évolution des programmes
3.3. L'édition syntaxique
3.4. étude de cas : le langage LTR3 et l'atelier ENTREPRISE
4. L'Enrichissement du Langage par de Nouveaux Concepts
4.1. Présentation de la Syntaxe Abstraite
4.2. Les difficultés
4.3. Compléter la Syntaxe
5. La Formalisation des Solutions Techniques
5.1. L'évaluation fonctionnelle
5.2. La structuration par les objets
5.3. Modèle sémantique comparé de l'évaluateur
5.4. Comparaison critique
5.5. Construction de la Syntaxe Abstraite
6. Les Comparaisons avec d'autres Approches
7. Les Perspectives
8. Les Editeurs
8.0. brisé sur la barrière de la complexité (une fois de plus)
8.1. L'éditeur ligne : Manuel de l'utilisateur
8.2. L'éditeur page : Guide de l'utilisateur
9. Les Aspects d'Implantation
9.1. Contexte d'évaluation
9.2. La Syntaxe Abstraite : Manuel du concepteur
9.3. L'éditeur page : Guide de l'implanteur
Références
Rubrique Perl-Javascript

Comportement dynamique des textes

1. Modification textuelle

2. Le contrôle non textuel

3. Insertion de code Lisp

4. Syntaxe Lisp

4. Syntaxe Lisp

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.

4.1. rappel des syntaxes

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 :
 
  • une chaîne de caractère s'évalue identiquement à elle-même ;
  • une string stg s'évalue en convertissant le nom de stg en une chaîne de caractères – par exemple (stg txt) s'évalue : "txt" ;
  • une utilisation retourne la représentation évaluée du texte ;
  • une utilisation indéfinie – le texte n'a pas été trouvé – est convertie en une chaîne de caractères, avec un "format d'erreur" conventionnel – par exemple : (use txt) donne : "{txt}".

4.2. syntaxe commune

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 :

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.

4.3. syntaxe Lisp

On a repris la syntaxe précédente, en plaçant le Lisp lsp partout où on peut l'attendre :

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  :

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.