func
:
Les fonctions retournent toutes une valeur entière. Cette valeur est
celle qui est << affectée >> à l'identificateur de la fonction au
sein de celle-ci.FACT
pour ce faire :
Dans cette règle, un ID
désigne le nom d'une variable ; les
appels de fonctions se font par dérivation du non-terminal APPEL
.INT 1
avant d'empiler les paramètres de la fonction
et de faire l'appel.S'il y a N paramètres, le résultat de la fonction est accédé (dans la fonction) par
|----------| | | | |<--- variables locales |----------| +-------|------ | | |----------| | | AR |<--- BASE | |----------| | | |<--- parametres effectifs | | | de l'appel V |----------| | |<--- retour |----------| | |Figure 13.1 : État de la pile juste après l'appel d'une fonction.
program X ; var N ; func F (M) ; begin if M = 1 then F := 1 ; if M > 1 then F := M * F (M-1) end ; begin read (N) ; write (F(N)) end .Figure 13.2 : Exemple de programme PP9.
0 INT 1 reserve 1 emplacement pour N 1 BRN 27 # debut de la fonction F 2 LDL -3 | 3 LDV | M:=1 4 LDI 1 | 5 EQL | 6 BZE 10 7 LDL -4 | 8 LDI 1 | F:=1 9 STO | 10 LDL -3 | 11 LDV | M>1 12 LDI 1 | 13 GTR | 14 BZE 26 15 LDL -4 | F 16 LDL -3 | M 17 LDV | 18 INT 1 | 19 LDL -3 | 20 LDV | F (M-1) 21 LDI 1 | 22 SUB | 23 CAL 2 | 24 MUL | * 25 STO | := 26 RET 1 # programme X 27 LDA 0 28 INN 29 INT 1 | 30 LDA 0 | F (N) 31 LDV | 32 CAL 1 | 33 PRN 34 HLT
Figure 13.3 : P-Code généré pour le programme de la figure 13.2.
return
) : du point de vue du programmeur, et du point
de vue de l'écriture du compilateur.