240 likes | 403 Views
Réalisation d’un compilateur ADT’81 à TAD persistants. 19 Mai 2008. Projet GENIE LOGICIEL. IASIG promotion 2007 - 2008. Les rôles de l’équipe 1. L’en-tête d’un module Les déclarations d’externes La gestion des appels. Traitement de l’en-tête d’un module.
E N D
Réalisation d’un compilateur ADT’81 à TAD persistants 19 Mai 2008 Projet GENIE LOGICIEL IASIG promotion 2007 - 2008
Les rôles de l’équipe 1 • L’en-tête d’un module • Les déclarations d’externes • La gestion des appels
Traitement de l’en-tête d’un module Rappel: en ADT’81, la définition d’un module comporte : • La nature du module : • le programme (program) • la procédure sans type (subroutine) • la procédure avec type (function) • le foncteur (functor) • la coroutine (coroutine)
Son identificateur • La liste des paramètres formels • L’indication éventuelle de la récursivité • L’indication éventuelle de la généricité • Le type retourné dans le cas d’une procédure sans type • Le genre et le type retourné dans le cas d’un foncteur
Les tâches associées à la BNF traitant l’en-tête • Tâche : @1000# : Traitement de la nature du module • Tâche : @1001#: Traitement du nom de module+ traitement du préfixe dans le cas d’un foncteur Insertion du préfixe dans la TPPF
Tâche @1002#: Traitement des paramètres formels Exemple de procédure sans type : subroutine decision (note, elimination, seuil) ; Mise à jour de TETMODUL:
Tâche @1015#: • Test sur la présence de récursivité • Test sur la conformité de returns • Mise à jour de l’extension de TETMODUL
Vérification de la conformité des paramètres actuels avec les paramètres formels Tâche @1006#
Gestion de la déclaration d’externe • <partie externe> ::= [ external@1200# [ { <description d’externe> ;@1209# } ] ] [ <partie intrinsèque> ] • <description d’externe> ::= <ident> [ { , <ident> } ] :@1201# program@1202# | subroutine@1203# [ recursive@1207# ] [ generic@1005#] | coroutine@1204#[ generic@1005#] | function@1205# [ recursive@1207# ] [generic @1005#] returns@1211#<type retourné> [ <flou>@1500#] | functor@1206# [ recursive@1207# ] [generic @1005#] returns@1211# <résultat de foncteur> • <partie intrinsèque> ::= intrinsic@1208# { <ident> [ { , <ident> } ] … • Taches @1200# à @1209# : remplissage des tables en lien avec les externes • @1200# : initialisation des variables temporaires • @1201# : enregistrement des noms des externes • @1202# -> @1206# : enregistrement de la variable temporaire sur la nature • @1207# : variable temporaire (booléen) renseignement la récursivité • @1208# : activation de la variable « intrinseque » • @1209# : remplissage des tables d’externes
<type spécifié> ::= <type>@2007# <type> ::= <numérique> | <texte> | <booléen> | <tad > naturetemp recursiftemp Type retourné TGEXT TGETFFExt TGMODUL TEXTETFF TEXT
GESTION DES INTRINSEQUES CHARGE_INTRIN Comparer… Table des intrinsèques TABLES
GESTION DES ERREURS Externe déjà déclaré Déclaration non conforme
Validation des externes • Comparer la nature, le type, … • Pendant leur déclaration: • Condition : doit avoir été compilé (TGMODCOMP + extension) • A l’enregistrement de l’entête de module: • Condition : doit avoir été déclaré en externe (TGEXT) Type retourné naturetemp
COMPILATION DE FIN DE MODULE <corps de module> ::= begin @3000# <lie>end @3001# ; @3002 • Tous les externes validés? ValidMODULE() • Existe-t-il un retour (result) dans le corps d’un foncteur ou fonction? ValidFF() • Tous les externes ont-ils été appelés? ExterneAPPELE() • Compiler le module : ValidCOMPIL() TGEXT TGMODULE
EDITION DE LIEN • Valide les modules • Condition : ses externes doivent être validés • Condition : chaque module doit avoir été appelé au moins une fois ? X D
LES APPELS Les procédures appelées par les autres équipes • La procédure statique « Instruction_exécutable »: • La procédure statique « Entete_fct » • La procédure statique « remp »
LES APPELS La procédure statique «Instruction exécutable » • Procédure (statique et void) appelée dans une instruction exécutable lors d’un appel d’externe. • <appel de procédure sans type> ::= call @3200# <ident de module> @3211# <partie paramètres actuels>@1300# • <relance de coroutine> ::= resume @3201# <ident de module> @3212# <partie paramètres actuels>@1300 # • 1er rôle : renseigner l’équipe 3 de l’adresse de l’externe (TEXT). • 2nd rôle: vérifier la conformité à la déclaration d’externe(sa nature avec mot utilisé). • Les moyens: procédure RechercheCEXT, TEXT,codeIE
LES APPELS La procédure statique «Entete_fct » • Procédure (statique et void) appelée dans une expression lors d’un appel d’externe (juste après « ident de module ») • <fonction> ::= FUNCTION <ident de module> <partie paramètres actuels> • <foncteur> ::= FUNCTOR <ident module foncteur> [ <partie paramètres actuels>] • Un rôle multiple : • Donner l’adresse de l’externe dans TEXT • Donner le genre de l’externe • Donner le type de l’externe • Les moyens : Nom_externe, RechercheCEXT et TEXT
LES APPELS La procédure statique «remp » • Procédure (statique et void) appelée dans une expression lors d’un appel d’externe (juste après « partie paramètres actuels ») • <fonction> ::= FUNCTION <ident de module> <partie paramètres actuels> • <foncteur> ::= FUNCTOR <ident module foncteur> [ <partie paramètres actuels>] • Un rôle complexe: • Dans le cas d’un foncteur: gérer le préfixe • Suite à l’appel, remplir les tables TAPP, TPA,TGAPP, TGPA et TGMODUL(colonne Valide) • Vérifier la conformité à la déclaration de module • Vérifier si l’externe a été compilé: si non alors RIEN, si oui alors étape 2 • Pour chaque paramètre actuel vérifier si l’objet de la classe CGPA est identique à celui de TGPF (même type, même genre etc).
Remplissage des principales tables relatifs à un appel Remplissage des tables TAPP et TPA Remplissage des tables TGAPP et TGPA
Transmission du code de la tâche Appel de « ParamActu » Moteur de compilation Tâche 1300 Moteur de l’équipe 1 LES APPELS Tâche 1300 « ParamActu » • Procédure (statique et void) appelée dans une instruction exécutable juste après « partie paramètres actuels » • <appel de procédure sans type> ::= call @3200# <ident de module> @3211# <partie paramètres actuels>@1300# • <relance de coroutine> ::= resume @3201# <ident de module> @3212# <partie paramètres actuels>@1300 # • Un rôle complexe mais similaire à « remp »: • Vérification de la syntaxe de l’appel: PA vide, « ( » ou/et « ) » absente(s). • Remplir les tables TAPP, TPA,TGAPP, TGPA et TGMODUL(colonne Valide) • Vérifier la conformité à la déclaration de module • Vérifier si l’externe a été compilé: si non alors RIEN, si oui alors étape 2 • Pour chaque paramètre actuel, vérifier si l’objet de la classe CGPA est identique à celui de TGPF (même type, même genre etc).