Forme interne du compilateur
Notre compilateur génère des quadruplés.
Un élément de la table des quadruplés a la structure suivante :
Cop (Pt1,b1) (Pt2,b1) (Pt3, b1)
avec bi = vrai si l'objet Pti est local
bi = faux si l'objet Pti est global
Pt1, Pt2, Pt3 désignent des indices dans la table des objets Tabob de la procédure courante ou
du module principal.
Au niveau du quadruplé, figure aussi le numéro de ligne correspondant dans le source. Ce numéro est utilisé lors de la simulation en mode 'Pas à Pas'.
Pour récupérer l'adresse de l'objet,
Si bi = vrai
c'est Tabpro[Proc_cour].Tabob[Pti].adresse
sinon c'est Tabpro[1].Tabob[Pti].adresse
Proc_cour désigne le module en cours de compilation.
Affectation
<<<<<< Affectation : Idf := Exp
Cop : 'Aff' ou ' :='
Pt1 : Indice dans Tabob vers Idf
Pt2 :
Pt3 : Indice dans Tabob vers le résultat de Exp
Structures de contrôle
<<<<<< Branchement conditionnel : Si Exp Aller à Et1 sinon aller à Et2 fsi
Cop : 'B'
Pt1 : Indice dans Tabob vers le résultat de Exp
Pt2 : Et1 ( indice dans la table des quadruplés Quadruple)
Pt3 : Et2 ( indice dans la table des quadruplés Quadruple)
<<<<<< Branchement inconditionnel : Aller à Et
Cop : 'Br'
Pt1 : Et ( indice dans la table des quadruplés Quadruple)
Pt2 :
Pt3 :
Opérations
<<<<<< Opérateur de relation : Exp1 Opr Exp2 avec Opr dans [=, <, >, <=, >=, ^=, #, <>]
Cop : opérateur
Pt1 : Indice dans Tabob vers le résultat de Exp1
Pt2 : Indice dans Tabob vers le résultat de Exp2
Pt3 : Indice dans Tabob vers le résultat de l'opération ( Booléen)
<<<<<< Opérateur arithmétique Exp1 Op Exp2 avec Op dans [+, -, *, / ]
Cop : opérateur
Pt1 : Indice dans Tabob vers le résultat de Exp1
Pt2 : Indice dans Tabob vers le résultat de Exp2
Pt3 : Indice dans Tabob vers le résultat de l'opération ( entier)
<<<<<< Opérateur logiques Exp1 Op Exp2 avec Op dans [ET, OU ]
Cop : opérateur
Pt1 : Indice dans Tabob vers le résultat de Exp1
Pt2 : Indice dans Tabob vers le résultat de Exp2
Pt3 : Indice dans Tabob vers le résultat de l'opération ( booléen)
<<<<<< Opérateur chaînes Exp1 op Exp2 avec op dans [+ ]
Cop : opérateur
Pt1 : Indice dans Tabob vers le résultat de Exp1
Pt2 : Indice dans Tabob vers le résultat de Exp2
Pt3 : Indice dans Tabob vers le résultat de l'opération ( chaîne)
<<<<<< Opérateur unaire : - Exp ou + Exp
Cop : '-U' ou '+U'
Pt1 : Indice dans Tabob vers le résultat de Exp
Pt2 :
Pt3 : Indice dans Tabob vers le résultat de l'opération
<<<<<< Opérateur de négation : Non Exp
Cop : 'Non'
Pt1 : Indice dans Tabob vers le résultat de Exp
Pt2 :
Pt3 : Indice dans Tabob vers le résultat de l'opération
Tableaux
<<<<<< Déclaration de tableau : Soit T un Tableau ....
Cop : 'Dt'
Pt1 : Indice dans Tabob vers l'Idf de tableau
Pt2 : Indice dans Tabcomp où l'on trouve la liste des bornes
Pt3 : Dimension
<<<<<< Elément ( fonction [ listexp ] )
Cop : 'Elément'
Pt1 : Indice dans Tabob vers le résultat de fonction
Pt2 : pointeur dans Tabcomp des résultats des expressions ( indices )
Pt3 : Indice dans Tabob vers le résultat de Elément
<<<<<< Aff_element ( fonction [listexp], Exp)
Cop : 'Aff_element'
Pt1 : Indice dans Tabob vers le résultat de fonction
Pt2 : pointeur dans Tabcomp vers la liste des résultats des expressions ( indices )
Pt3 : Indice dans Tabob vers le résultat de Exp ( Elément … affecter )
Listes linéaires chaînées
<<<<<< Fonctions Valeur (p), Suivant(p)
Cop : fonction
Pt1 : Indice dans Tabob vers p
Pt2 :
Pt3 : Indice dans Tabob vers le résultat de fonction
<<<<<< Procédures : Allouer (P), Libérer (p)
Cop : procédure
Pt1 :
Pt2 :
Pt3 : Indice dans Tabob vers P
<<<<<< Aff_adr(f1,f2), Aff_val(f1, f2)
Cop : procédure
Pt1 : Indice dans Tabob vers le résultat de f1
Pt2 :
Pt3 : Indice dans Tabob vers le résultat de f2
Entrées/sorties
<<<<<< Lire ( Idf1, Idf2, ....)
Cop : LIRE
Pt1 : pointeur dans Tabcomp vers la liste des Idf ( scalaires ou structures )
Pt2 : Nombre d'éléments
Pt3 :
<<<<<< Ecrire ( Exp, Exp ....)
Cop : ECRIRE
Pt1 : pointeur dans Tabcomp des expressions scalaires ou des structures.
Pt2 : Nombre d'éléments
Pt3 :
Appel et retour de modules
<<<<<< Appel Idf ( listexp )
Cop : 'Appel'
Pt1 : Indice dans Tabob vers une constante représentant le nom de l'appelé
Pt2 : Indice dans Tabcomp ( liste de paramètres)
Pt3 : Nombre de paramètres
<<<<<< Retour d'un module
Cop : Ret
Pt1 :
Pt2 : égal à 0 et désigne l'adresse dans Tabcomp où l'on trouve la liste des paramètres.
Pt3 :
Opération de haut niveau
<<<<<<CREER_LISTE( Idf , [ ~exp/[exp {, exp}*]~ {, ~exp/[exp {, exp}*]~}* ] )
INIT_VECTEUR, INIT_TABLEAU
Cop : procédure
Pt1 : Indice dans Tabob vers l'Idf
Pt2 : Indice dans Tabcomp vers la liste des valeurs d'initialisation
Pt3:
si la valeur est une variable de type structure, on met dans un maillon de cette liste l'objet correspondant. si la valeur est une constante 'structure', cad délimitée par '[' et ']' alors on crée autant de maillons que de valeurs dans cette structure.
EXEMPLE
INIT_VECTEUR(V, [ [a,5, faux], x, [23, z, vrai] ]) crée une liste avec 7 maillons.
En-tête de module
Cop : Proc
Pt1 : Nombre de paramètres
Pt2 : Indice dans Tabcomp où l'on trouve les paramètres formels
Pt3 : Indice dans Tabpro
Machines de Turing
<<<<<< Lirenombre(M, Idf), lirecar(M, Idf)
Cop : procedure
Pt1 : Indice dans Tabob vers la Machine-caractères ( ou Machine-Nombres )
Pt2 : Indice dans Tabob vers l'Idf
Pt3 :
<<<<<< Nbrnombre(M), Nbrcar(M)
Cop : fonction
Pt1 : Indice dans Tabob vers la Machine-caractères ( ou Machine-Nombres )
Pt2 :
Pt3 : Indice dans Tabob vers le résultat de la fonction
<<<<<< CREER_MNOMBRE (M, [Listexp])
Cop : CREER_MNOMBRE
Pt1 : Indice dans Tabob vers la Machine-nombres (M)
Pt2 : indice dans Tabcomp vers la liste des expressions
Pt3 : Nombre d'expressions
<<<<<< CREER_MCAR ( M, [ Chaine ] )
Cop : CREER_MCAR
Pt1 : Indice dans Tabob vers la Machine-caractères (M)
Pt2 : indice dans Tabob vers la chaine Chaine
Pt3 :
Structures
<<<<<< Déclaration de structures Soir Idf une Structure ....
Cop : Ds
Pt1 : Indice dans Tabob vers l'objet composé'
Pt2 : Nombre de champs
Pt3 :
<<<<<< Struct (Idf, cste)
Cop : Struct
Pt1 : Indice dans Tabob vers l'objet composé
Pt2 : numéro du champ ( constante)
Pt3 : Indice dans Tabob vers le résultat de Struct
<<<<<< Aff_Struct (Idf, cste, Exp)
Cop : Aff_struct
Pt1 : Indice dans Tabob vers l'objet composé
Pt2 : Numéro du champ ( constante )
PT3 : Indice dans Tabob vers l'expression … affecter
<<<<<< Init_Struct (Idf, [...])
Cop : Init_struct
Pt1 : Indice dans Tabob vers l'objet composé
Pt2 : Indice dans Tabcomp vers liste des expressions scalaires.
PT3 : Nombre d'expressions
Fichiers
<<<<<< Déclaration de fichier : Soit Idf Un Fichier de ...
Cop : Df
Pt1 : Indice dans Tabob vers le fichier;
Pt2 : absence(1) ou présence(2) des caractéristiques
Pt3 : Indice dans Tabconscar vers les types des caract. (si Pt2=2)
<<<<<< Ouvrir(F, fichier physique, mode)
Cop : OUVRIR
Pt1 : Indice dans Tabob vers le fichier
Pt2 : Indice dans Tabconscar vers le nom physique
Pt3 : Indice dans Tabconscar vers le mode d'ouverture ('A' ou 'N')
<<<<<< Fermer(F)
Cop :FERMER
Pt1 :
Pt2 :
Pt3 : Indice dans Tabob vers le fichier
<<<<<< Liredir(F, num, Buffer), Ecriredir(F, num, Buffer)
Cop = Liredir ou Ecriredir
Pt1 : Indice dans Tabob vers le fichier
Pt2 : Indice dans Tabob vers le buffer
Pt3 : Indice dans Tabob vers le numéro
<<<<<< Lireseq(F, Buffer), Ecrireseq(F, Buffer), Rajouter(F, Buffer)
Cop : Lireseq ou Ecrireseq ou Rajouter
Pt1 : Indice dans Tabob vers le fichier
Pt2 : Indice dans Tabob vers le buffer
Pt3 :
<<<<<< Entete(F, num)
Cop : ENTETE
Pt1 : Indice dans Tabob vers le fichier
Pt2 : rang (constante)
Pt3 : Indice dans Tabob vers le résultat
<<<<<< Aff_entete( F, num, exp)
Cop : AFF_ENTETE
Pt1 : Indice dans Tabob vers le fichier
Pt2 : rang (constante)
Pt3 : Indice dans Tabob vers la valeur à affecter
<<<<<< Finfich(F)
Cop : FINFICH
Pt1 : Indice dans Tabob vers le fichier
Pt2 :
Pt3 : Indice dans Tabob vers le résultat
<<<<<< Alloc_bloc(F)
Cop : ALLOC_BLOC
Pt1 : Indice dans Tabob vers le fichier
Pt2 :
Pt3 : Indice dans Tabob vers le résultat