Informatique pour les sciences humaines
Deuxième année (BA3a)
Tp4 : Piles
Date de reddition
le 13 décembre 2005 à 9h
Les
piles ont la propriété que le dernier élément inséré est le premier à pouvoir
en être extrait. On appelle cet élément
le sommet de la pile. La pile obéit au protocole LIFO (Last In First Out). Elle est utilisée en informatique pour :
-
la réalisation de fonction "Undo"
-
analyse des expressions par un compilateur
-
Allocation de la mémoire pour les variables locales lors de l'exécution des
procédures
Représentation
et implémentation
Il
y a plusieurs façons de représenter une pile. Entre autres types de
représentation, il y a les représentations séquentielles (par tableaux) et les
représentations chaînées (par pointeurs). Nous choisissons de faire une
représentation chaînée (dynamique) vu que nous ne connaissons pas la taille des
données.
Spécification
Type
Liste = POINTER TO RECORD
elem :
CHAR
next : Liste
END ;
Pile = RECORD
Element : Liste
END
Procédures
liées
Constrcuteurs/Modifieurs
de pile
Clear*()
, procédure d'initialisation de la pile. Elle met la pile passée en paramètre à
vide.
Push*(e: CHAR),
procédure d'empilement d'un élément en sommet de pile.
Pop* (OUT e:
CHAR):BOOLEAN, procédure de
dépilement de l’élément en sommet de pile.
Sélecteurs
de pile
Sommet(): e, retourne
l'élément en sommet de pile
IsEmpty (): BOOLEAN, retourne
vrai si la pile est vide, faux autrement
NumItem():INTEGER; retourne la profondeur de la pile, la
profondeur correspond aux nombre d'éléments que contient la pile.
Interface des modules « Info2Tp4» et « Info2ClientTp4»
DEFINITION Info2Tp4;
TYPE
Pile
= RECORD
(VAR
p: Pile) Clear, NEW;
(VAR
p: Pile) IsEmpty (): BOOLEAN, NEW;
(IN p: Pile) NumItem (): INTEGER, NEW;
(VAR
p: Pile) Pop (OUT e: CHAR), NEW; (* Pré-condition : ~p.IsEmpty() *)
(VAR
p: Pile) Push (e: CHAR), NEW;
(IN
p: Pile) Sommet (OUT e: CHAR), NEW (* Pré-condition : ~p.IsEmpty() *)
END;
END Info2Tp4.
DEFINITION Info2ClientTp4;
(*Les symboles à considerer *)
CONST
symb1Fermant
= "}";
symb1Ouvrant
= "{";
symb2Fermant
= "]";
symb2Ouvrant
= "[";
symb3Fermant
= ")";
symb3Ouvrant
= "(";
VAR
d:
RECORD
text:
ARRAY 1200 OF CHAR;
result-:
ARRAY 32 OF CHAR (*résulta de l’analyse
*)
END;
PROCEDURE
ParseFile; (*analyse un fichier texte*)
PROCEDURE ParseText; (*analyse la chaîne d.text Pré-Condition :
d.text # «» *)
END Info2ClientTp4.
Enoncé
Faire
un programme d'analyse syntaxique qui permet de détecter et vérifier les paires
de symboles ouvrant/fermant tels que parenthèses, accolades etc. Le programme
doit détecter les paires suivantes : [], {} et ().
Exemple :
LEN[d] : correct
Set :={1,2,8} : correct
Chaîne:= « {e[b}] » : incorrect
Ce type de problème peut facilement être résolu grâce à l’utilisation d’une pile.
Pour ce faire :
Il s’agit de lire le texte d’entrée caractère par caractère et de considérer les cas de figures suivants :
1. si on trouve un symbole ouvrant, on l’empile,
2. si on trouve un symbole fermant et que l’élément en sommet de pile est un symbole ouvrant de même type, on dépile
3. si on trouve un symbole fermant et que l’élément en sommet de pile est un symbole ouvrant de type différent alors c’est mal formé
4. si on atteint la fin du fichier et que la pile n’est pas vide alors c’est mal formé
5. si on atteint la fin du fichier et que la pile est vide alors c’est bien formé
A rendre en fichier encodé à l’adresse : mar.ndiaye@lettres.unige.ch
- le module « fournisseur »
- le module « client »
- la documentation
- la boite de dialogue