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 5 : la concentration des propriétés
On observe qu'une variable a en fait une sémantique plus riche que la seule représentation : sont utilisation est toujours étroitement liée à son type sur lequel elle a été définie. Plus généralement certains concepts du programme seront définis par un regroupement de propriétés ; on utilisera alors l'environnement de définition pour lier ces propriétés, la référence à un environnement pour y accéder.
Par exemple, on définit ici :
(def var-x
((def nom () ("x"))
(def typ () ("integer"))
(def init () ("0"))))
(def INSTR
((def VAR () ((nom((var-x)))))
(def EXP () ((nom((var-y))))))
((affect)))
La variable var-x est définie par ses trois propriétés : son nom (nom), son type (typ) et sa valeur d'initialisation (init). Le texte VAR utilise la propriété nom de l'objet var-x.
Figure 5 : la concentration des propriétés [ << masquer ]
(def var-x
((def nom () ("x"))
(def typ () ("integer"))
(def init () ("0"))))
(def var-y
((def nom () ("y"))
(def typ () ("real"))
(def init () ("1.0"))))
(def PGME
((def PGME-DECLA
((def DECLA*
(lst-env
((def DECLA
((def NOM () ((nom((var-x)))))
(def TYP () ((typ((var-x))))))
((decla))))
(def DECLA
((def NOM () ((nom((var-y)))))
(def TYP () ((typ((var-y))))))
((decla)))))))
((pgme-decla)))
(def PGME-INSTR
((def INSTR*
(lst-env
((def INSTR
((def VAR () ((nom((var-x)))))
(def EXP () ((init((var-x))))))
((affect))))
(def INSTR
((def VAR () ((nom((var-y)))))
(def EXP () ((init((var-x))))))
((affect))))
(def INSTR
((def EXP-COND
((def EXP1 () ((nom((var-x)))))
(def EXP2 () ((nom((var-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((var-x)))))
(def EXP () ((nom((var-y))))))
((affect))))
(def INSTR
((def EXP () ("'Erreur'")))
((affiche)))))))
((else-clause))))
((cond))))
(def INSTR
((def EXP () ("'fin'")))
((affiche)))))))
((pgme-instr))))
((pgme)))