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 3.a : grammaire
On place dans l'« environnement global » la syntaxe du langage – c'est-à-dire au vu de tous les textes. On peut noter que :
Par exemple : l'affectation
(def affect ()
((VAR) ":=" (EXP) "^M")) ; Note: "^M" = « retour à la ligne »
On définit le texte affect :
- qui utilise deux textes VAR et EXP (à définir par ailleurs),
- dont la valeur de représentation correspond à ce qui précédemment s'appelait le schéma de décompilation de l'opérateur.
Figure 3.a : grammaire [ << 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) ":" (TYP) "^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)))))))
Figure 3.b : arbre syntaxique
On place un dernier "opérateur" dans l'environnement global : il s'agit du programme en cours d'exécution : on le définit ici dans un texte nommé PGME qui sera associé à un nouveau tampon de l'éditeur.
Par exemple : l'affectation
(def INSTR
((def VAR () ("x"))
(def EXP () ("y")))
((affect)))
On définit le texte INSTR par :
- sa valeur de représentation : il utilise le texte affect,
- sa valeur d'environnement : il définit les paramètres de l'"opérateur" affect, c'est-à-dire ici les textes VAR et EXP.
Figure 3.b : arbre syntaxique [ << masquer ]
(def PGME
((def PGME-DECLA
((def DECLA*
(lst-env
((def DECLA
((def NOM () ("x"))
(def TYP () ("integer")))
((decla))))
(def DECLA
((def NOM () ("y"))
(def TYP () ("real")))
((decla)))))))
((pgme-decla)))
(def PGME-INSTR
((def INSTR*
(lst-env
((def INSTR
((def VAR () ("x"))
(def EXP () ("0")))
((affect))))
(def INSTR
((def VAR () ("y"))
(def EXP () ("1.0")))
((affect))))
(def INSTR
((def EXP-COND
((def EXP1 () ("x"))
(def EXP2 () ("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 () ("x"))
(def EXP () ("y")))
((affect))))
(def INSTR
((def EXP () ("'Erreur'")))
((affiche)))))))
((else-clause))))
((cond))))
(def INSTR
((def EXP () ("'fin'")))
((affiche)))))))
((pgme-instr))))
((pgme)))