Nothing Special   »   [go: up one dir, main page]

KHJKJKBVHVJV

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 4

Module : Techniques de Compilation

TP1 : Analyse lexicale


NIVEAU : L2SIL A.U :2020-2021

Rappel
La tâche principale d’un analyseur lexical est de lire un texte source (suite de caractères) et de
produire comme résultat une suite d’unités lexicales. La reconnaissance des unités lexicales
est basée sur la notion d’expressions régulières. Théoriquement, la construction d’un
analyseur lexical consiste à :
- Définir les unités lexicales.
- Modéliser chaque unité lexicale par une expression régulière.
- Représenter chaque expression régulière par un diagramme de transition (automate).
- Construire le diagramme global.
- Implémenter à la main le diagramme obtenu.
Généralement, l’implémentation à la main d’un diagramme avec un grand nombre d’états est
une tâche qui n’est pas assez facile. En outre, si on a besoin d’ajouter ou modifier une unité
lexicale, il faut parcourir tout le programme pour effectuer les modifications nécessaires.
Plusieurs outils ont été bâtis pour simplifier cette tâche. (Flex par exemple)
Flex :
L’outil Flex (version GNU de LEX) est un générateur d’analyseurs lexicaux. Il accepte en
entrée des unités lexicales sous formes d’expressions régulières et produit un programme écrit
en langage C qui, une fois compilé, reconnaît ces unités lexicales. L’exécutable obtenu lit le
texte d’entrée caractère par caractère jusqu’à l’identification de plus long préfixe du texte
source qui concorde avec l’une des expressions régulières. Un fichier de spécifications Flex se
compose de quatre parties :
%{
Les déclarations en c
%}
Déclaration des définitions régulières
%%
Règles de traduction
%%
Bloc principal et fonctions auxiliaires en C
Définitions régulières :
Une définition régulière permet d’associer un nom à une expression régulière et de se référer
par la suite dans la section de règles à ce nom, plutôt qu’à l’expression régulière.
Règles de traduction :
exp1 { action1}
exp2 { action2}
... …
expn { actionn}
Chaque expi est une expression régulière qui modélise une unité lexicale. Chaque actioni est
une suite d'instructions en C.

Exercice 1 (premiers pas en Flex) outil: Flex Windows


1) Ecrire le programme Flex suivant permettant de dire si une chaîne en entrée est un
nombre binaire ou non. Le fichier doit être enregistré avec l’extension .l (exemple :
binaire.l)
2)Créer un nouveau répertoire et y placer le fichier binaire.l.

3)Lancer l’invite de commande propre a Flex Windows et compiler votre fichier « binaire.l » à l’aide de la commande:
flex binaire.l. S’il y aura pas de problème, un fichier lex.yy sera crée.

Ensuite on va compiler le fichier lex.yy.c et générer un fichier C .exe à l’aide de la commande : gcc lex.yy.c -o prog

Enfin, vous pouver appeler le programme prog.exe à travers la commande prog.exe

4-Créer un fichier texte dans votre répertoire de travail et y editer quelques lignes.

Rajouter le code suivant dans le main() de votre programme.

int main(int argc, char *argv[])

{….

++argv, --argc;
if ( argc > 0 )
yyin = fopen( argv[0], "r" );
else
yyin = stdin;
yylex() ;
Vous pouvez exécuter votre programme de la manière suivante :

Modifier votre programme pour rediriger la sortie standard vers un fichiers resultat.txt.
EXERCICE2 :

-Exécuter le programme pour un fichier test.txt pour répondre a la question.

EXERCICE 3 :

Ecrire un analyseur lexical qui permettra de :

- Compter le nombre de mots.


- Compter le nombre de ligne.
- Compter le nombre de caractères.
- Retourner la somme des nombres lus.

L’exécution doit être effectuée sur un fichier texte (en entrée) et le résultat est redirigé vers un fichier resultat.txt.

EXERCICE 4 : On veut concevoir un vérificateur qui vérifie que des chaines saisies peuvent correspondre à une
immatriculation de véhicule en Tunisie.
On vérifie donc que la chaine saisie commence par 1 ou 2 ou 3 chiffres ensuite la chaine
TUNIS ensuite 1 ou 2 ou 3 ou 4 chiffres ensuite le caractère #.
Exemple de mots : 160TUNIS9876# 43TUNIS234# 8TUNIS24#
1- Ecrire à l’aide de Flex un analyseur lexical correspondant .

EXERCICE 5 :
Donner les expressions régulières pour reconnaitre :
Les identificateurs du C.
Les chaines de caractères du Pascal (‘chaine’).
Les chaines de caractères du C.
Les commentaires du C.
Les entiers (décimal, hexadécimal et octal)
Les flottants avec exposant.
Ecrire à l’aide de Flex un analyseur lexical correspondant (en TP).

EXERCICE 6 :
Écrire un programme Flex qui prend un programme C et qui affiche tous les noms de fonctions utilisés dans ce
programme. On fera attention à ne pas repérer abusivement les noms qui apparaissent dans les chaînes et les
commentaires. Par exemple, soit le code C suivant donné comme entrée :
on devra obtenir la liste suivante: plus main printf plus getchar

Annexe – variables et fonctions flex


Expressions régulières Flex :
Variables : Fonctions :
yyin fichier de lecture (par défaut: stdin) int yylex ( ) : fonction qui lance
yyout fichier d’écriture (par défaut: stdout) l’analyseur.
char yytext [] : tableau de caractères qui Int yywrap ( ) : fonction qui est toujours
contient le lexème accepté. appelée à la fin du texte d’entrée. Elle
int yyleng : la longueur du lexème accepté. retourne 0 si l’analyse doit se poursuivre
et 1 sinon.

Vous aimerez peut-être aussi