EXPRESSIONS BOOLEENNES EXPRESSIONS BOOLEENNES
Instructions du code intermédiaire
(P)B[P/N/Z] $reg, etiquette
positif, négatif, zéro

JMP etiquette

Elles suffisent pour générer du code pour les structures conditionnelles et itératives

Code pour les boucles et IF

On suppose que l'expression booléenne possède un attribut place (lieu) et que les valeurs booléennes sont représentées par un octet qui vaut 1 (vrai) ou 0 (faux).

Première idée:
I ®  if  E  then  I
I1.etiquette = nouvelle.etiquette()
I1.code = E.code
||gen(BZ,  E.place,  ¢,¢, I1.etiquette)
||I2.code||gen(I1.etiquette   )

Pour éviter la possibilité d'avoir plusieurs étiquettes sur une instruction on peut ajouter un attribut suit pour l'instruction qui suit une I.

I ®  if  E  then  I
I2.suit = I1.suit
I1.code = E.code ||
gen(BZ,  E.place, ¢,¢,  I1.suit)
||I2.code
I® I   I
I2.suit = nouvelle.etiquette()
I3.suit = I1.suit
I1.code = I2.code ||gen(I2.suit   )
||I3.code

Pareil pour if-then-else

Les Boucles
Code simple pour boucles while et repeat normales
L1 Expression.code
BZ Expression.place, L2
Instruction.code
JMP L1
L2

et
L1
Instruction.code
Expression.code
PBP Expression.place, L1

Le deuxième est plus court et plus efficace!
Pourquoi? parce que le test est à la fin:
JMP L2
L1
Instruction.code
L2 Expression.code
PBP Expression.place, L1

est une version du code de while qui est plus efficace (si le nombre moyen d'itérations est supérieur à 1!)

A noter les deux choix orthogonaux pour les boucles: nombre minimal d'itérations =0 ou 1? (un choix algorithmique)
écrire la condition de terminaison ou la condition de continuation? (un choix stylistique)
Pascal et C ont chacun deux des quatre possibilités
(B)CPL en avaient les 4.

Evaluation d'expressions booléennes
Pour les opérateurs de comparaison:
E ® E  op  E
Prenons le cas ou op est >
E1.vrai : = nouvelle.etiquette()
E1.code = E2.code ||E3.code ||
gen(¢CMP¢,  $t,  E2.place,  ¢,¢,  E3.place )
gen(¢BP¢,  $t, ¢,¢,  E1.vrai)||
gen(¢SET¢,  E1.place , ¢,¢¢0¢)||
gen(¢JMP¢,  E1.suit)||
gen(E1.vrai,  ¢SET¢,  E1.place,  ¢,¢¢1¢)

plus les règles de calcul pour E.suit...

ET et OU sont comme les opérateurs arithmétiques

COMMENT FAIRE MIEUX

Donc l'idée de deux attributs hérités, l'étiquette à laquelle il faut aller dans le cas d'un résultat vrai (ou faux);
Aucun besoin de représentation explicite de la valeur calculée.

exemples
E ® E op E
E1.code = E2.code ||E3.code ||
gen(¢CMP¢  ,  $t,  ¢,¢,  E2.place ,  E3.place)||
gen( ¢BP¢,  $t,  ¢,¢,  E1.vrai)||
gen (¢JMP¢,  E1.faux)
E ® E OU E
E2.vrai = E1.vrai
E3.vrai = E1.vrai
E3.faux = E1.faux
E2.faux = nouvelle.etiquette()
E1.code = E2.code ||gen(E2.faux) ||E3.code
E ® NON E
E2.vrai = E1.faux
E2.faux = E1.vrai
E1.code = E2.code  aucun code pour la négation!
Les instructions switch ...
Choisir entre 4 traductions (au moins) selon le nombre et densité des constantes (et si une fourchette de valeurs est possible).



File translated from TEX by TTH, version 3.05.
On 5 Mar 2002, 11:41.