DEVOIR 1 Noté sur 5 points Exercice 1 : édition de liens On dispose d'un ensemble de modules définis comme suit: module GEOMETRIE taille 1242 liens à satisfaire TRIANGLE_SURFACE CARRE_PERIMETRE DIAGONALE ERREUR_CALCUL adresse lancement 612 (2 points) module TRIANGLE taille 548 liens utilisables TRIANGLE_SURFACE 257 TRIANGLE_PERIMETRE 412 HAUTEUR 124 module CARRE taille 2120 liens utilisables CARRE_PERIMETRE 1200 liens à satisfaire DIAGONALE LONGUEUR_COTE ERREUR_CALCUL module UTIL taille 532 liens utilisables ERREUR_CALCUL 213 DIAGONALE 144 LONGUEUR_COTE 513 liens à satisfaire ECRIRE module E/S taille 128 liens utilisables ECRIRE 64 LIRE 104 On effectue l'édition de liens de tous ces modules. Donnez en justifiant brièvement votre réponse: les adresses d'implantation de ces modules, la taille totale du programme résultant, la table des liens, l'adresse de lancement du programme résultant. 1
Exercice 2 : Compilation (3 points) Soit la langage suivant : <programme> ::= PROGRAM <identificateur> <suite de phrases> FIN <suite de phrases> ::= <phrase> <phrase><suite de phrases> <phrase> ::= <déclaration> ; <instruction> ; <déclaration>::= <identificateur> : <type> <type>::= réel entier <instruction> ::= <identificateur> = <expression> <expression> ::= <facteur> { + - } <expression> <facteur> <facteur> ::= <terme> { * / } <facteur> <terme> <terme> ::= <identificateur> <nombre> ( <expression> ) <nombre> ::= <nombre entier> <nombre réel> De ces règles, on peut déduire qu un tel langage contient déjà les unités lexicales suivantes: = + - * / ( ) réel entier PROGRAM FIN ; : De plus, les identificateurs sont des unités lexicales constituées d une lettre. Les nombres entiers sont des unités lexicales constituées d un chiffre et les nombres réels sont des unités lexicales constituées de deux chiffres séparés par une virgule. Ceci peut donc se décrire comme suit: <nombre entier> ::= <chiffre> <nombre réel> ::= <chiffre>, <chiffre> <identificateur> ::= <lettre> <chiffre> ::= 1 2 3 4 5 6 7 8 9 <lettre> ::= A B... Z L'espace (blanc) est sans signification, mais ne peut se trouver à l intérieur d une unité lexicale. Les espaces ne peuvent se trouver à l'intérieur d'une unité lexicale, et n'ont pas de signification. Une instruction doit se trouver toute entière sur une même ligne, et une ligne ne peut contenir qu'une seule instruction. A- On s'intéresse d abord à l'analyse lexicale. Présentez le découpage en unités lexicales en enfermant celles-ci dans des rectangles. Donner le résultat fourni par l'analyseur lexical pour les lignes suivantes, en justifiant votre raisonnement. Signalez les éventuelles erreurs lexicales. 2
PROGRAM X A : entier $ C : réel ; b = 3 * C 1 FIN B - Donner le résultat de l analyse syntaxique sur les 4 lignes suivantes, en justifiant votre raisonnement. B = 3 * C 1 On exprimera cette analyse sous la forme d arbres de syntaxe. C. Analyse sémantique. L'analyse sémantique doit vérifier pour notre langage, les règles suivantes : Tout identificateur, utilisé dans une instruction, doit être déclaré. Tout identificateur déclaré doit être utilisé dans une instruction ; Dans une instruction, si l'identificateur à gauche de "=" est déclaré de type "entier" alors l expression à droite ne doit comporter que des valeurs entières. De même, si l'identificateur à gauche de "=" est déclaré de type "réel" alors alors l expression à droite ne doit comporter que des valeurs réelles. Quelles sont les erreurs signalées par l'analyse sémantique pour notre programme corrigé? Justifiez votre réponse. PROGRAM X A : entier ; C : réel ; B = 3 * C ; FIN 3
Exercice BONUS L exercice BONUS est un exercice complémentaire utilisant des notions non étudiées en cours mais faisant l objet d un complément écrit déposé sur le site http://deptinfo.cnam.fr et sur pleiad. Cet exercice n est pas formellement noté. Le fait de le résoudre correctement apporte un bonus pour la note finale de l examen pris en compte pour relever les notes finales comprises entre 8 <= NF <10. Rappel NF valeur sur 20 = NExamen noté sur 15 + Moyenne devoirs sur 5 On dispose de cinq fichiers sources, dont des extraits sont donnés ci-dessous. Ils définissent une collection de modules qui, avec d autres modules de bibliothèque, constituent un programme appelé init_ordi. proc.h #ifdef PROC_86 long cache[512]; long memoire[512,512]; #else long cache[128]; long memoire[128,128]; #endif interrupt.h #define NB_INTERRUPT 256 peripherique.h #ifdef BUS_IDE int nb_disque; #else int nb_dma; #endif init_proc.c #define PROC_86 #include "proc.h" main() {... } init_autre.c #include "peripherique.h" #include "interrupt.h" int tab_interrupt [NB_INTERRUPT] 4
main() {... } A Ces fichiers contiennent des directives qui doivent faire l objet d un traitement par un préprocesseur avant d être compilé. Donnez le résultat du traitement du préprocesseur sur chacun des fichiers «.c». B.Pour obtenir le programme init_ordi, il faut exécuter les commandes suivantes, correspondant à la compilation des modules suivie de l édition des liens: cc -c init_autre.c cc -c init_proc.c ld -o init_ordi init_autre.o init_proc.o Définissez le graphe de dépendance relatif au programme init_ordi, et construisez le fichier Makefile correspondant. C Le fichier interrupt.h est modifié comme suit: interrupt.h #define NB_INTERRUPT 512 Expliquer ce qui se passe lorsque l'on lance ensuite la commande make. 5