“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 136 — #146
i
i
i
i
i
i
i
i
136
3
• Techniques de programmation déclarative
des accumulateurs est moins claire, justement parce qu’elles sont des fonctions et pas
des procédures. L’état à l’entrée est un argument de la fonction et l’état à la sortie est
ce que renvoie la fonction.
P
S1
S2
S3
Sn
P1
P2
P3
S1
if
Sn
Cas de base
Cas récursif
Figure 3.10 Une procédure avec état enfilé.
Un exemple avec plusieurs accumulateurs
Pour donner un exemple avec plusieurs accumulateurs, nous allons écrire un compilateur pour une simple machine à pile. Le compilateur prend une expression contenant
des identificateurs, entiers et opérations d’addition (avec l’étiquette plus), et calcule
deux résultats : le code machine pour une machine à pile et le nombre d’instructions
dans ce code.
proc {ExprCode E C1 ?Cn S1 ?Sn}
case E of plus(A B) then C2 C3 S2 S3 in
C2=plus|C1
S2=S1+1
{ExprCode B C2 C3 S2 S3}
{ExprCode A C3 Cn S3 Sn}
[] I then
Cn=push(I)|C1
Sn=S1+1
end
end
Cette procédure a deux accumulateurs : un pour construire la liste des instructions
machine et un autre pour compter le nombre d’instructions. Voici un exemple de son
exécution :
declare Code Size in
{ExprCode plus(plus(a 3) b) nil Code 0 Size}
{Browse Size#Code}
Il affiche
5#[push(a) push(3) plus push(b) plus]
Précédent

- 151/370

Suivant