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.2. Information de contexte
3.3.3. Exécution
3.3.33.1. L'exécution
3.3.33.2. Le prototypage
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

Exécution

Le procédé de décompilation des arbres syntaxiques – l'évaluation d'un texte – et la langage – Lisp – suggèrent l'introduction d'une nouvelle forme de décompilation : l'exécution du programme.

On reprend ici l'exemple du langage (§ 1) et celui des fonctions (§ 2) en vue d'une interprétation effective du programme en cours d'édition.

1. L'exécution

2. Le prototypage

2. Le prototypage

On reprend l'exemple des fonctions.

précision de l'exemple

Ici aussi on précise mieux l'exemple :

Figure 3.a : grammaire des fonctionsafficher >><< masquer ]

(def type-int
   ((def nom () ("integer"))
    (def conv () ((STG)))))

(def type-real
   ((def nom () ("real"))
    (def conv () ((STG)))))

(def type-bool
   ((def nom () ("boolean"))
    (def conv () ((STG)))))

(def affect ()
   ((VAR) ":=" (EXP) ";"))

(def affiche ()
   ("write(" (EXP) ");"))

(def cond ()
   ("IF " (TEST) " THEN" "^M"
    "   " (ALORS) "^M"
    "ELSE" "^M"
    "   " (SINON) "^M"
    "END IF;" "^M"))

(def none ()
   ("NONE"))

(def somme ()
   ((EXP1) " + " (EXP2)))

(def fonction
   ((def return
       ((def VAR ()
           ((NOM ((bloc-fct))))))
       ((affect)))
    (def call-rec
       ((def BLOC-FCT
           ((bloc-fct))))
       ((call-fct))))
   ("FUNCTION " (NOM ((bloc-fct))) " (" (formel ((PARAM ((bloc-fct))))) ")"
       " RETURNS " (TYP ((bloc-fct))) ";" "^M"
    "BEGIN" "^M"
    "   " (INSTR ((bloc-fct))) "^M"
    "END;" "^M"))

(def call-fct ()
   ((NOM ((BLOC-FCT))) " (" (effect) ")"))

(def formel ()
   ((NOM) " : " (SNS) " " (TYP)))

(def effect ()
   ((EXP)))

(def var
   ((def lect () ((NOM)))
    (def ecr () ((NOM)))))

Figure 3.b : la fonction compteafficher >><< masquer ]

(def fct-compte ()
   ((fonction)
    (def bloc-fct
       ((def NOM () ("compte"))
        (def TYP () ((type-int)))
        (def PARAM
           ((param-arbre)))
        (def param-arbre
           ((def NOM () ("a"))
            (def TYP () ((type-arbre)))
            (def SNS () ("IN"))
            (def VAL () ((lsp *)))
            (var)))
        (def INSTR
           ((def TEST
               ((def BLOC-FCT
                   ((bloc-fct ((fct-feuille)))))
                (def EXP ((param-arbre ((bloc-fct)))) ((lect))))
               ((call-fct)))
            (def ALORS
               ((def EXP ((type-int))
                   ((conv
                       ((def STG () ("1"))))))
               ((return)))
            (def SINON
               ((def EXP ()
                  ((def EXP1
                      ((def EXP
                         ((def BLOC-FCT
                             ((bloc-fct ((fct-fg)))))
                          (def EXP ((param-arbre ((bloc-fct)))) ((lect)))))
                         ((call-fct))))
                      ((call-rec)))
                   (def EXP2
                      ((def EXP
                         ((def BLOC-FCT
                             ((bloc-fct ((fct-fd)))))
                          (def EXP ((param-arbre ((bloc-fct)))) ((lect)))))
                         ((call-fct))))
                      ((call-rec))))
                   ((somme))))
               ((return))))
           ((cond))))))
   ((fonction)))

Figure 3.c : les fonctions sur les arbresafficher >><< masquer ]

(def type-arbre
   ((def nom () ("arbre"))
    (def conv () ((STG)))))

(def fct-feuille
   ((fonction)
    (def bloc-fct
       ((def NOM () ("feuille"))
        (def TYP () ((type-bool)))
        (def PARAM
           ((param-arbre)))
        (def param-arbre
           ((def NOM () ("a"))
            (def TYP () ((type-arbre)))
            (def SNS () ("IN")))
            (def VAL () ((lsp *)))
            (var)))
        (def INSTR
           ((none))))))
   ((fonction)))

(def fct-fg
   ((fonction)
    (def bloc-fct
       ((def NOM () ("fg"))
        (def TYP () ((type-arbre)))
        (def PARAM
           ((param-arbre)))
        (def param-arbre
           ((def NOM () ("a"))
            (def TYP () ((type-arbre)))
            (def SNS () ("IN")))
            (def VAL () ((lsp *)))
            (var)))
        (def INSTR
           ((none))))))
   ((fonction)))

(def fct-fg
   ((fonction)
    (def bloc-fct
       ((def NOM () ("fd"))
        (def TYP () "arbre"))
        (def PARAM
           ((param-arbre)))
        (def param-arbre
           ((def NOM () ("a"))
            (def TYP () ("arbre"))
            (def SNS () ("IN")))
            (def VAL () ((lsp *)))
            (var)))
        (def INSTR
           ((none))))))
   ((fonction)))

la grammaire d'exécution

On construit la grammaire d'exécution :

Dans l'exemple, la fonction compte utilise les fonctions sur les arbres feuille, fg et fd, pour lesquelles on n'a pas encore écrit le corps. Au lieu d'en écrire un, et fixer alors dans le programme un certain choix de représentation du type arbre, on remplace le corps de ces fonctions par du code d'exécution – du code Lisp, introduit par l'opérateur exec.

Figure 4 : la grammaire d'exécutionafficher >><< masquer ]

(def type-int
   ((def nom () ("integer"))
    (def conv ()
     (exec
       (conv-int (clean STG))))))

(def type-real
   ((def nom () ("real"))
    (def conv ()
     (exec
       (conv-real (clean STG))))))

(def type-bool
   ((def nom () ("boolean"))
    (def conv ()
     (exec
       (conv-real (clean STG))))))

(def affect ()
   (funclean VAR () ((clean EXP))))

(def affiche ()
   (exec
     (print (clean EXP))))

(def cond ()
   (exec
     (if (clean EXP-COND) (use THEN-CLAUSE) (use ELSE-CLAUSE))))

(def none ()
   ())

(def somme ()
   (exec
     (+ (clean EXP1) (clean EXP2))))

(def fonction
   ((def return () ((EXP)))
    (def call-rec ()
       (exec
          (let ((val (clean EXP)))
             (use empile ((PARAM ((bloc-fct)))))
             (funclean ecr ((PARAM ((bloc-fct)))) ((lsp val))))
       (prog1
          (clean INSTR ((bloc-fct)))
          (use depile ((PARAM ((bloc-fct))))))))
   ())

(def call-fct ()
   (exec
     (use effect)
     (let ((ctx (cons-env
                   (eval `(env (ref fonction env))
                               (def bloc-fct ((ref BLOC-FCT (env)) (rep))))
                   ctx)))
          (clean INSTR ((bloc-fct))))))

(def formel ())

(def effect ()
   (funclean ecr ((PARAM ((BLOC-FCT))))
      ((clean EXP))))

(def var
   ((def lect ()
     (exec
       (setq aux (recht 'VAL))
       (setq aux (cdr (nth <fct> (repq (cdr aux)))))
       (car aux)))
    (def ecr ()
     (exec
       '(lambda (x)
          (setq aux (recht 'VAL))
          (setq aux (cdr (nth <fct> (repq (cdr aux)))))
          (rplaca aux x))))
    (def empile ()
     (exec
       (setq aux (recht 'VAL))
       (setq aux (cdr (nth <fct> (repq (cdr aux)))))
       (rplaca aux (1+ (car aux)))
       (newr aux '*)))
    (def depile ()
     (exec
       (setq aux (recht 'VAL))
       (setq aux (cdr (nth <fct> (repq (cdr aux)))))
       (rplaca aux (1- (car aux)))
       (setq aux (nthcdr (car aux) aux))
       (rplacd aux nil)))))

le type arbre

On représente très simplement un arbre par une liste à deux champs. Ce choix n'offre aucune garantie vis-à-vis du programme (typage, facilité de traduction dans le langage, etc.). Mais il permet à la fonction appelante compte d'avoir l'illusion que le type arbre a déjà été réalisé – les appels à ces fonctions retournent des valeurs qui semblent traduire un "bon comportement".

Figure 5 : le type arbreafficher >><< masquer ]

(def type-arbre
   ((def nom () ("arbre"))
    (def conv ()
       (clean STG))))

(def fct-feuille
   ((fonction)
    (def bloc-fct
       ((def NOM () ("feuille"))
        (def TYP () ((type-bool)))
        (def PARAM
           ((param-arbre)))
        (def param-arbre
           ((def NOM () ("a"))
            (def TYP () ((type-arbre)))
            (def SNS () ("IN")))
            (def VAL () ((lsp 1 *)))
            (var)))
        (def INSTR ()
           (exec
             (atom (clean lect ((param-arbre ((bloc-fct))))))))))
   ((fonction)))

(def fct-fg
   ((fonction)
    (def bloc-fct
       ((def NOM () ("fg"))
        (def TYP () ((type-arbre)))
        (def PARAM
           ((param-arbre)))
        (def param-arbre
           ((def NOM () ("a"))
            (def TYP () ((type-arbre)))
            (def SNS () ("IN")))
            (def VAL () ((lsp 1 *)))
            (var)))
        (def INSTR ()
           (exec
             (car (clean lect ((param-arbre ((bloc-fct))))))))))
   ((fonction)))

(def fct-fg ()
   ((fonction)
    (def bloc-fct
       ((def NOM () ("fd"))
        (def TYP () "arbre"))
        (def PARAM
           ((param-arbre)))
        (def param-arbre
           ((def NOM () ("a"))
            (def TYP () ("arbre"))
            (def SNS () ("IN")))
            (def VAL () ((lsp 1 *)))
            (var)))
        (def INSTR ()
           (exec
             (cadr (clean lect ((param-arbre ((bloc-fct))))))))))
   ((fonction)))