Vous êtes sur la page 1sur 8

Chapitre III

Les Formes Intermédiaires

Programme Analyse Analyse Forme


Source Lexicale Syntaxique Intermédiaire
L’analyse syntaxique a permis d’engendrer deux textes :
- Le dictionnaire, qui rassemble des déclarations des objets manipules par le programme source.
- Le texte intermédiaire, qui correspond aux instructions du programme source.
On appelle forme intermédiaire, une forme dont l’ensemble des instructions est élémentaire.
Une instruction élémentaire est composée d’un opérateur et de deux opérandes.
Un opérande peut être une constante, une variable, un nom de procédure.
Un opérateur peut être arithmétique ou logique.
Nous distinguons plusieurs formes intermédiaires :
- Forme post fixée
- Forme préfixée
- Arbre abstraite
- Quadruplés
- Triplés directs
- Triplés indirects
III.1 Forme post fixée :
Notation : opérande opérande opérateur
fp(t1 opérateur t2) = fp(t1) fp(t2) opérateur
fp(opérateur t) = fp(t) opérateur
fp(constante) = constante
fp(variable simple) = variable simple
Evaluation d’une expression en notation post fixée :
On utilise une pile pour sauvegarder les opérandes :
Si tc est opérande Alors empile(t1); tc :=tc+1 ;
Sinon Si tc est opérateur binaire
Alors dépiler(opde2);
dépiler(opde1);
évaluer(tc, opde1, opde2, temporaire);
empiler(temporaire);
tc :=tc+1;
Sinon dépiler(opde);
évaluer(tc, opde, , temporaire);
empiler(temporaire);
tc :=tc+1;
Fsi;
Fsi.
Exemple :
Soit l’expression a-c+d*e ac-de*+
Pile Chaine Action
Vide ac-de*+ empiler a
a c-de*+ empiler c
ac -de*+ dépiler c, dépiler a, évaluer(-, a, c, t1),
empiler t1
t1 de*+ empiler d
t1d e*+ empiler e
t1de *+ dépiler e, dépiler d, évaluer(*, d, e, t2),
empiler t2
t1t2 + dépiler t2, dépiler t1, évaluer(+, t1, t2, t3),
empiler t3
t3 vide

III.1.1 Forme post fixée d’une affectation :


Var := <expression>
fp : fp(Var) fp(<expression>) :=
Exemple :
x := x+y*z fp : xxyz*+ :=
III.1.2 Forme post fixée d’un branchement inconditionnel (to label) :
Goto etiq etiq BRL
opérande BR, où opérande est une position dans la chaine post fixée.
III.1.3 Forme post fixée d’un branchement conditionnel :
<opérande1> <opérande2> opérateur de comparaison par rapport à zéro
Où : <opérande1> : forme post de la condition.
<opérande2> : position dans la chaine post fixée.
Comme opérateurs de comparaison par rapport à zéro : BZ(=0) BNZ(≠0)
BP(>0) BPZ(>=0)
BM(<0) BMZ(<=0)
III.1.4 Forme post fixée d’une déclaration de tableau :
Array V[U1:L1,…………, Un:Ln]*
Li et Ui sont les bornes de tableau, donc des expressions arithmétiques de type entier.
fp : fp(U1) fp(L1)……………fp(Un) fp(Ln) V ADEC
ADEC : opérateur de déclaration de tableau.
III.1.5 Forme post fixée pour référence d’un élément de tableau :
A[<expression1>, ………………,<expressionn>]
fp : fp(<expression1>)………………fp(<exptressionn>) A SUBS
SUBS : opérateur de référence à un élément de tableau.
III.1.6 Forme post fixée de l’instruction IF THEN ELSE :
fp [IF <cond> THEN <inst1> ELSE <inst2> ]
fp(<cond>) else BZ fp(<inst1>) Fin BR fp(<inst2>)

Où : else : position du 1ère symbole dans la chaine post fixée de <inst2>.


Fin : position dans la chaine post fixée qui suit immédiatement le dernier symbole de fp(<inst2>).
Remarque :
On suppose que l’expression booléenne est égale à ‘0’, si elle est fausse, est ‘1’ sinon.
Exemple :
IF a≠b THEN b :=b*a ELSE c :=a*c
fp : ab- 13 BZ bba*:= 18 BR cac*:=

III.2 Forme préfixée :


Notation : opérateur opérande opérande
III.3 Les quadruplés :
Un quadruplé à la forme générale suivante :
(opérateur, opérande1, opérande2, Temporaire)
Cette forme permet de préciser les mémoires de manœuvre nécessitées pour l’évaluation.
Exemple : a*b/c+d
1-(*, a, b, T1)
2-(/, T1, c, T2)
3-(+, T2, d, T3)
T1, T2, T3 désignent des mémoires de manœuvre. Une certaine optimisation des mémoires de
manœuvre est nécessaire avec cette méthode, sinon on risque d’aboutir à une occupation mémoire
importante.
Remarque : Nous n’avons pas toujours les trois opérandes.
Généralisation des quadruplés aux opérateurs :
III.3.1 Affectation :
Var := <expression>

Quadruplés <expression> résultat dans T

( :=, T, , Var)
III.3.2 Branchement inconditionnel (to label) :
Goto etiq (BRL, etiq, , )
(BR, N°quadruplé, , )
III.3.3 Branchement conditionnel :
(BZ[BNZ, BM, BMZ, BP, BPZ], N°quadruplé, Temporaire, )
Dans cette forme, il existe des opérateurs binaires : comparaison de deux opérandes :
(BE[BNE, BL, BLE, BG, BGE], N°quadruplé, T1, T2)
III.3.4 Déclaration de tableau :
Array[U1:L1,……Un:Ln]

Quadruplés de U1 résultat dans T1.1

Quadruplés de L1 résultat dans T1.2

(BOUNDS, T1.1, T1.2, )


.
.
.

Quadruplés de Un résultat dans Tn.1

Quadruplés de Ln résultat dans Tn.2

(BOUNDS, Tn.1, Tn.2, )


(ADEC, A, , )
Exemple : Array[1:i+j-k, 2:c-d]
1-(+, i, j, T1)
2-(-, T1, k, T2)
3-(BOUNDS, 1, T2, )
4-(-, c, d, T3)
5-(BOUNDS, 2, T3, )
6-(ADEC, A, , )
III.3.5 Référence à un élément de tableau :
A[<exp1>,………….<expn>]
Quadruplés de <exp1> résultat dans T1

.
.
.

Quadruplés de <expn> résultat dans Tn

(opérateur, A[T1,………, Tn], opérande, resultat)


III.3.5 Instruction conditionnelle :
IF <cond> THEN <inst1> ELSE <inst2>

Quadruplés de <cond> résultat dans T

(BZ, else, T, )

Quadruplés de <inst1>

(BR, FIN, , )

Quadruplés de <inst2>

Exemple :
1- (BE, else, a, b)
2- (*, b, a, T1)
3- ( :=, T1, , b)
4- (BR, Fin, , )
5- (*, a, c, T2) else
6- ( :=, T2, , c)
7- Fin
Conclusion :
On remarque qu’avec cette méthode, on perd beaucoup de place mémoire : Stockage des
temporaires. Pour cela, il a été conçu une autre forme intermédiaire : Triplés.
III.4 Arbre abstrait :
Une des formes intermédiaires la plus utilisée en compilation est la représentation arborescente.
Celle-ci a l’avantage de représenter l’arbre syntaxique, déduit de l’analyse syntaxique, de manière
abstraite, les non-terminaux de la grammaire sont supprimés, on ne conserve que les relations entre
opérateurs et opérandes.
Exemple : i*i+i
+

* i

i i
III.4.1 Affectation :
:=

Variable <expression>
III.4.2 Branchement inconditionnel :
Goto etiq BRL

etiq
III.4.3 Instruction IF <cond> THEN <inst1> ELSE <inst2> :
IF

<cond> <inst1> <inst2>


III.4.4 Instruction Begin <inst1>,……., <instn> End :
Begin-End

<inst1> ……………….. <instn>


III.4.5 Déclaration d’un tableau :
Array A[U1:L1,………, Un:Ln]
ADEC

A U1 L1 …………………. Un Ln
III.4.6 Référence à un élément de tableau :
A [<exp1>, ………., <expn>]

SUBS

A <exp1> …………………. <expn>

Exemple :

Begin

Integer i, j, k;

Array A[1:i+j, 1:k];

Label etiq;

K := 0;

etiq : IF i>j THEN k := k+A[i+j, k]*6

ELSE Begin

i := i+1;

Goto etiq;

End ;

End.

Vous aimerez peut-être aussi