On illustre la démarche par un exemple.
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
Figure 4 : la concentration des variables
Dans l'exemple on reconnaît plusieurs occurrences d'identificateurs sémantiquement liés : d'une part "x" et d'autre part "y". Dans ces deux cas il s'agit bien d'un même concept – une variable – qu'on utilise plusieurs fois : une fois pour la déclaration, les autres fois comme utilisation d'une variable déclarée. Comme il s'agit ici de la valeur de terminaux instanciables du langage, il n'y a pas de liens particuliers entre ces diverses occurrences de "x" ou de "y".
On définit alors deux nouveaux "opérateurs", d'arité nulle, nom-x et nom-y, qu'on place également dans l'environnement global. Le tampon d'édition PGME utilise alors ces définitions au lieu de donner explicitement leur représentation (qui est respectivement "x" et "y").
Par exemple :
(def nom-x () ("x"))
(def INSTR
((def VAR () ((nom-x)))
(def EXP () ((nom-y))))
((affect)))
Le texte VAR n'est plus défini comme « la chaîne de caractères "x" » mais comme « l'utilisateur de l'opérateur nom-x » : on a bien concentré dans la définition de ces nouveaux textes les occurrences d'utilisation de ces identificateurs.
Figure 4 : la concentration des variables [ << masquer ]
(def nom-x () ("x"))
(def nom-y () ("y"))
(def PGME
((def PGME-DECLA
((def DECLA*
(lst-env
((def DECLA
((def NOM () ((nom-x)))
(def TYP () ("integer")))
((decla))))
(def DECLA
((def NOM () ((nom-y)))
(def TYP () ("real")))
((decla)))))))
((pgme-decla)))
(def PGME-INSTR
((def INSTR*
(lst-env
((def INSTR
((def VAR () ((nom-x)))
(def EXP () ("0")))
((affect))))
(def INSTR
((def VAR () ((nom-y)))
(def EXP () ("1.0")))
((affect))))
(def INSTR
((def EXP-COND
((def EXP1 () ((nom-x)))
(def EXP2 () ((nom-y))))
((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 () ((nom-x)))
(def EXP () ((nom-y))))
((affect))))
(def INSTR
((def EXP () ("'Erreur'")))
((affiche)))))))
((else-clause))))
((cond))))
(def INSTR
((def EXP () ("'fin'")))
((affiche)))))))
((pgme-instr))))
((pgme)))