290 likes | 437 Views
Réalisation d’un compilateur ADT’81 à TAD persistants. 19 Mai 2008. Projet GENIE LOGICIEL. IASIG promotion 2007 - 2008. Intéractions avec les autres équipes. Avec l’équipe 1: Requête pour un identificateur de module lors d’un appel et requête pour l’instruction « result »
E N D
Réalisation d’un compilateur ADT’81 à TAD persistants 19 Mai 2008 Projet GENIE LOGICIEL IASIG promotion 2007 - 2008
Intéractions avec les autres équipes Avec l’équipe 1: Requête pour un identificateur de module lors d’un appel et requête pour l’instruction « result » REQ_APPEL (nomexp, codeIE, adresse, message) REQ_RESULT (type, genre, mult, org, cla, spar, ls, cs) Avec l’équipe 2: Requête pour le traitement des expressions dans le cas général et dans le cas d’une affectation REQ_EQ2 (nomexp, adresse, ICE, type, genre, ls, cs) REQ_AFFEC (nomexp, adresse, vecteurDeMessages, ls, cs)
5 types d’instructions exécutables : • Instructions exécutables de base (boucles, tests, cases, parallèles, débranchements…) • Instructions de liste • Instructions TAD • Instructions processus g non traitées dans cette version du compilateur • Instructions d’entrée-sortie g non traitées dans cette version du compilateur Instructions Exécutables
<boucle séquentielle> ::=loop@3010#[for <ident> @3020#:@3012# <eae> @3030#to@3013# <eae> @3031#[step <eae> @3032#]][while <exp bool> @3040#]do@3004# <lie boucle> [until <exp bool> @3041#]endloop@3050# loop for i : 1 to pos+1 step pas while a>b do … until bool endloop ; Boucles séquentielles Tâche 3010 : - empilement de LOOP dans la PILIE_ANX - insertion de LOOP et de la valeur de NTB dans la TIE - insertion de NTIE à adTB de la TB
<boucle séquentielle> ::=loop@3010#[for <ident> @3020#:@3012# <eae> @3030#to@3013# <eae> @3031#[step <eae> @3032#]][while <exp bool> @3040#]do@3004# <lie boucle> [until <exp bool> @3041#]endloop@3050# loop for i : 1 to pos+1 step pas while a>b do … until bool endloop ; Boucles séquentielles Tâche 3020 : - vérifications sur le compteur de boucle - insertion de l’adresse du compteur dans adC de la TB
<boucle séquentielle> ::=loop@3010#[for <ident> @3020#:@3012# <eae> @3030#to@3013# <eae> @3031#[step <eae> @3032#]][while <exp bool> @3040#]do@3004# <lie boucle> [until <exp bool> @3041#]endloop@3050# loop for i : 1 to pos+1 step pas while a>b do … until bool endloop ; Boucles séquentielles Tâches 3012, 3013, 3004 : - appel à GEST_ERR_SYN : automate de gestion des erreurs syntaxiques
<boucle séquentielle> ::=loop@3010#[for <ident> @3020#:@3012# <eae> @3030#to@3013# <eae> @3031#[step <eae> @3032#]][while <exp bool> @3040#]do@3004# <lie boucle> [until <exp bool> @3041#]endloop@3050# loop for i : 1 to pos+1 step pas while a>b do … until bool endloop ; Boucles séquentielles Tâches 3030, 3031, 3032 : - vérification sur le type de l’expression arithmétique - remplissage de la TB avec l’adresse de l'expression + cas
<boucle séquentielle> ::=loop@3010#[for <ident> @3020#:@3012# <eae> @3030#to@3013# <eae> @3031#[step <eae> @3032#]][while <exp bool> @3040#]do@3004# <lie boucle> [until <exp bool> @3041#]endloop@3050# loop for i : 1 to pos+1 step pas while a>b do … until bool endloop ; Boucles séquentielles Tâches 3040 : - vérification sur le type de l’expression + pas une constante - remplissage de la TB avec l’adresse de l'expression + cas
<boucle séquentielle> ::=loop@3010#[for <ident> @3020#:@3012# <eae> @3030#to@3013# <eae> @3031#[step <eae> @3032#]][while <exp bool> @3040#]do@3004# <lie boucle> [until <exp bool> @3041#]endloop@3050# loop for i : 1 to pos+1 step pas while a>b do … until bool endloop ; Boucles séquentielles
<boucle séquentielle> ::=loop@3010#[for <ident> @3020#:@3012# <eae> @3030#to@3013# <eae> @3031#[step <eae> @3032#]][while <exp bool> @3040#]do@3004# <lie boucle> [until <exp bool> @3041#]endloop@3050# loop for i : 1 to pos+1 step pas while a>b do … until bool endloop ; Boucles séquentielles Tâches 3041 : - vérification sur le type de l’expression + pas une constante - remplissage de la TB avec l’adresse de l'expression + cas
<boucle séquentielle> ::=loop@3010#[for <ident> @3020#:@3012# <eae> @3030#to@3013# <eae> @3031#[step <eae> @3032#]][while <exp bool> @3040#]do@3004# <lie boucle> [until <exp bool> @3041#]endloop@3050# loop for i : 1 to pos+1 step pas while a>b do … until bool endloop ; Boucles séquentielles Tâche 3050 : - dépile PILIE_ANX - insertion de ENDLOOP et de l’adresse de la boucle dans la TIE - insertion de NTIE à adFB de la TB
<boucle séquentielle> ::=loop@3010#[for <ident> @3020#:@3004# <eae> @3030#to@3004# <eae> @3031#[step <eae> @3032#]][while <exp bool> @3040#]do@3004# <lie boucle> [until <exp bool> @3041#]endloop@3050# loop while a>b for i : 1 to pos+1 step pas do … until bool endloop ; Gestion des erreurs syntaxiques Tâche 3004 : - appel à GEST_ERR_SYN
Les autres instructions exécutables de bases : • Tests • Cases • Boucles vectorielles • Groupes de séquences parallèles • Débranchements de boucle • Débranchements de module • Autres instructions non traitées (relance de coroutine, rupture, allocation/désallocation…) Instructions Exécutables de Base
La table des tests Instructions Exécutables de Base
Instructions Exécutables de Base La table des cases, des whens et des listes
La table des boucles vectorielles Instructions Exécutables de Base
La table des séquences parallèles Instructions Exécutables de Base
La table des débranchements de boucle Instructions Exécutables de Base
<appel de procédure sans type> ::= call@3200# <ident de module> @3211# <partie paramètres actuels> <relance de coroutine> ::= resume@3201# <ident de module> @3212# <partie paramètres actuels> <enchaînement de module> ::= chain@3202# <ident de module> @3210# CALL TOTO (X, Y) ; Tâche 3200 : insertion de CALL et de la valeur de NTAPP dans la TIE Tâche 3210 : Envoi de « TOTO » à l’équipe 1 qui nous retourne l’adresse dans la TEXT Gestion des erreurs Instructions d’appel
<affectation> ::= <ident dim ou non> @3240# := @3241# <exp> @3230# | inc@3241# <exp> @3231# Tâche 3240 : vérification syntaxique sur l’identificateur par le moteur de compilateur Tâche 3241 : vérification syntaxique sur l’opérateur d’affectation « := » Tâche 3230 : Traitement de l’expression derrière l’affectation Tâches 3241 et 3231 : Message à l’utilisateur l’opérateur « inc » n’est pas autorisé dans cette version du compilateur. Affectations
<insertion> ::= insert@3260# <liste d’exp> @3280#into@3272# <liste d’ident de listes> @3290# [after <exp> @3300# | before <exp> @3301# ] INSERT A,B,C INTO L1, L2 AFTER X ; Tâche 3290 : Vérification des identificateurs de liste Remplissage de TMELST Opérations sur les listes Tâche 3300 : Vérification de l’élément de référence Remplissage de TMELST Tâche 3280 : Vérification des éléments à insérer Remplissage de TMELST 5 insert 6 insert 7 insert 8 Tâche 3260 et 3272 : Vérifications syntaxiques par le moteur de compilateur insert 9 insert 10 5 A L1 X id id 6 B L1 X id id 7 C L1 X id id 8 A L2 X id id 9 B L2 X id id C L2 X id id 10
<extraction> ::= extract@3261# <liste d’exp> @3281#outof@3273# <liste d’ident de listes> @3291# <organisation> ::= linear@3263 <liste d’ident de listes> @3293# | circular@3264# <liste d’ident de listes> @3294# <multiplicité> ::= single@3265# <liste d’ident de listes> @3295# | tuple@3266# <liste d’ident de listes> @3296# <classement> ::= ascend@3267# <liste d’ident de listes> @3297# | descend@3268# <liste d’ident de listes> @3298# | free@3269# <liste d’ident de listes> @3299# <vidage> ::= empty@3262# <liste d’ident de listes> @3292# <typage> ::= typelist@3270# <ident de liste> @3360# <type> @3370# | retypelist@3271# <ident de liste> @3361# <type> @3371# Opérations sur les listes
<boucle ensembliste> ::= each@3310# <ident> @3320#of@3321# <ident de liste> @3330# [ \ <exp bool> @3340# ] do@3014# <lie> endeach@3350# EACH e OF L / X = A*B+3 DO {…} ENDEACH ; Boucles ensemblistes Tâche 3320 : Vérification de l’identificateur de boucle ad D Tâche 3310 : Vérification syntaxique ad D Tâche 3330 : Vérification de l’identificateur de liste ad L Tâche 3340 : Vérification de la condition ad C Tâche 3350 : Vérifications syntaxiques de fermeture de boucle ad F 46 23 23 46 67 e L c id exp 67 23
A la fin de la compilation de chaque module (si aucune erreur) Création du A-code
Exemple de A-code : Toto (αh⌂ Création du A-code (32 caractères) Nom du module
Exemple de A-code : Toto (αh⌂ Création du A-code (4 caractères) Nature, récursivité, nombre de paramètres, etc.
Exemple de A-code : Toto (αh⌂ Création du A-code (23 caractères) TCT : 23 compteurs de tables