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.2. Etude quantitative de l'évolution des programmes
3.3. L'édition syntaxique
3.3.1. Définition d'un langage
3.3.11.1. La grammaire du langage
3.3.11.2. La syntaxe abstraite et les schémas de décompilation
3.3.11.3. La représentation textuelle
3.3.11.4. La concentration des variables
3.3.11.5. La concentration des propriétés
3.3.11.6. La paramétrisation des propriétés
3.3.11.7. Le poids sémantique des propriétés
3.3.2. Information de contexte
3.3.3. Exécution
3.3.4. Définition de propriétés
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

Définition d'un langage

On illustre la démarche par un exemple.

1. La grammaire du langage

2. La syntaxe abstraite et les schémas de décompilation

3. La représentation textuelle

4. La concentration des variables

5. La concentration des propriétés

6. La paramétrisation des propriétés

7. Le poids sémantique des propriétés

6. La paramétrisation des propriétés

En fait dans le choix précédent de représentation on reste encore trop près du langage et de ses spécificités : ici on sait que dans le langage on représente de la même façon une variable utilisée soit pour accéder à sa valeur soit pour en affecter la valeur.

Le problème des répétitions dans le texte n'est pas encore pleinement résolu, mais les répétitions sont maintenant plus diffuses. Par exemple une déclaration de variable utilise toujours les propriétés nom et typ de la variable déclarée : l'affectation ne s'intéresse pas tant au nom d'une variable qu'à sa possible propriété de se voir affecter une valeur, etc.

Figure 6.a : grammaire

On définit donc un modèle pour les variables :

(def var
   ((def lect () ((NOM)))
    (def ecr  () ((NOM)))
    (def init () ((INIT)))))

Le texte var :
- est paramétré par trois textes : NOM, TYP, INIT,
- définit pour les variables les propriétés : lect, ecr, init.

Figure 6.a : grammaireafficher >><< masquer ]

(def pgme ()
   ((PGME-DECLA)
    (PGME-INSTR)))

(def pgme-decla ()
   ((lst-init ((DECLA*))
       ("VAR " (rep (DECLA) (lst (DECLA)))))))

(def pgme-instr ()
   ((lst-init ((INSTR*))
       ((INSTR)))))

(def decla ()
   ((NOM((VAR))) ":" (TYP((VAR))) "^M"))

(def affect ()
   ((NOM) ":=" (EXP) "^M"))

(def affiche ()
   ("write(" (EXP) ")" "^M"))

(def cond ()
   ("if " (EXP-COND) "^M"
    (THEN-CLAUSE)
    (ELSE-CLAUSE)
    "endif" "^M"))

(def exp-egal ()
   ((EXP1) "=" (EXP2)))

(def exp-diff ()
   ((EXP1) "<>" (EXP2)))

(def then-clause ()
   ("then" "^M"
    (lst-init ((INSTR*))
       ("   " (rep (INSTR) (lst (INSTR)))))))

(def else-clause ()
   ("else" "^M"
    (lst-init ((INSTR*))
       ("   " (rep (INSTR) (lst (INSTR)))))))

(def var
   ((def lect () ((NOM)))
    (def ecr  () ((NOM)))
    (def init () ((INIT)))))

Figure 6.b : arbre syntaxique

Chaque variable est alors déclarée en référence à ce modèle, et les opérateurs de la grammaire peuvent exploiter ce point – ils savent d'une part quelles sont les propriétés des « variables », ils savent d'autre part quels paramètres elles ont définis à leur déclaration.

Par exemple :

(def VAR-x
   ((def NOM () ("x"))
    (def TYP () ("integer"))
    (def INIT () ("0"))
    (var)))

(def INSTR
   ((def VAR ((var-x)) ((ecr)))
    (def EXP ((var-y)) ((lect))))
   ((affect)))

La variable "x" : VAR-x est construite sur le modèle var.
A l'utilisation de affect, on utilise les propriétés des variables :
- la propriété d'écriture ecr de la variable VAR-x,
- la propriété de lecture lect de la variable VAR-y.

Figure 6.b : arbre syntaxiqueafficher >><< masquer ]

(def VAR-x
   ((def NOM () ("x"))
    (def TYP () ("integer"))
    (def INIT () ("0"))
    (var)))

(def VAR-y
   ((def NOM () ("y"))
    (def TYP () ("real"))
    (def INIT () ("1.0"))
    (var)))

(def PGME
 ((def PGME-DECLA
   ((def DECLA*
     (lst-env
      ((def DECLA
        ((def VAR ((VAR-x))))
        ((decla))))
       (def DECLA
        ((def VAR ((VAR-y))))
        ((decla)))))))
   ((pgme-decla)))
  (def PGME-INSTR
   ((def INSTR*
     (lst-env
      ((def INSTR
        ((def VAR ((VAR-x)) ((ecr)))
         (def EXP ((VAR-x)) ((init))))
        ((affect))))
       (def INSTR
        ((def VAR ((VAR-y)) ((ecr)))
         (def EXP ((VAR-y)) ((init))))
        ((affect))))
       (def INSTR
        ((def EXP-COND
          ((def EXP1 ((VAR-x)) ((lect)))
           (def EXP2 ((VAR-y)) ((lect))))
          ((exp-egal)))
         (def THEN-CLAUSE
          ((def INSTR*
            (lst-env
             ((def INSTR
               ((def EXP () ("'Ok'")))
              ((affiche)))))))
          ((then-clause)))
         (def ELSE-CLAUSE
          ((def INSTR*
            (lst-env
             ((def INSTR
               ((def VAR ((VAR-x)) ((ecr)))
                (def EXP ((VAR-y)) ((lect))))
              ((affect))))
              (def INSTR
               ((def EXP () ("'Erreur'")))
              ((affiche)))))))
          ((else-clause))))
        ((cond))))
       (def INSTR
        ((def EXP () ("'fin'")))
        ((affiche)))))))
   ((pgme-instr))))
 ((pgme)))