0% ont trouvé ce document utile (0 vote)
400 vues7 pages

Correction TP3

Le document présente 7 exercices sur la conception de programmes Flex pour analyser des fichiers texte. Les exercices portent sur la numérotation des lignes, le comptage de mots et caractères, la transformation de chaînes, etc.

Transféré par

benhamedsouhailisimm
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
400 vues7 pages

Correction TP3

Le document présente 7 exercices sur la conception de programmes Flex pour analyser des fichiers texte. Les exercices portent sur la numérotation des lignes, le comptage de mots et caractères, la transformation de chaînes, etc.

Transféré par

benhamedsouhailisimm
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Correction TP n°3 : Compilation, Analyse Lexicale

Enseignante : SANA HAMDI


Section : LF2-Informatique, A.U. 2024

1. Ecrire un programme Flex qui copie un programme écrit en C et qui affiche double
lorsqu’il trouve le mot clé float.

2. Ecrire un programme Flex qui permet de compter le nombre de lignes, de mots et de


caractères d’un fichier en entrée. Le programme affichera ensuite ces nombres.

%{
unsigned charCount=0,wordCount=0,lineCount=0;
%}
word [^ \t\n]+
eol \n
%%
{word} {wordCount++;charCount+=yyleng;}
{eol} {charCount++;lineCount++;}
. charCount++;
%%
int main(int argc,char *argv[])
{
if(argc>1){
FILE *file;
file = fopen(argv[1],"r");
if(!file){
fprintf(stderr,"fichier ne peut être ouvert%s\n",argv[1]);
exit(1);
}
yyin=file;
}
yylex();
printf("%d %d %d\n",lineCount,wordCount,charCount);
return 0;
}

3. Ecrire un programme Flex qui numérote les lignes d’un fichier (hormis les lignes
blanches)
%{
int yywrap (void) {} /* GNU flex */
int Nb_Line = 1;
%}
blanc " "|\t
%%
^({blanc})* {}
\n {}
^.* {printf("[%d] %s\n",Nb_Line, yytext); Nb_Lin
%%
#include <stdio.h>
int main () {
yylex();
return 0;
}

4. Ecrire un programme Flex qui n’imprime que les commentaires d’un programme.
Ceux-ci sont compris entre {}.
%{
int yywrap (void) {}
%}
%%
"{"([^{}])+"}" {ECHO;}
.|\n {}
%%
#include <stdio.h>
int main () {
yylex();
return 0;
}

5. Ecrire un programme Flex qui transforme un texte en remplaçant le mot compilateur


par interp si la ligne début par a, par binterp si la ligne débute par b et par cinterp! si la
ligne débute par c.
%{
int yywrap (void) {} /* GNU flex */
int i;
%}
%%
\n {ECHO; i = 0;}
^a {ECHO; i = 1;}
^b {ECHO; i = 2;}
^c {ECHO; i = 3;}
compilateur {if (i == 1) printf("interp");
if (i == 2) printf("binterp");
if (i == 3) printf("cinterp!");
if (i == 0) printf("compilateur");}
. {ECHO;}
%%
#include <stdio.h>
int main () {
i = 0;
yylex();
return 0;
}

6. Ecrire un programme en Flex qui supprime une suite d’espaces et les remplace par un
seul espace.
%{
#include<stdio.h>
%}
espace [ \t]
%%
({espace})+ {printf(" ");}
%%
int main (int args,char *argr[]){
FILE *f;
if(args>1){
f=fopen(argr[1] , "r") ;
if(!f){
printf("fichier n est existe pas") ;
exit(1) ;
}
else{
yyin=f;
yylex();
fclose(f) ;
}}
return 0 ;
}

7. Ecrire un programme en Flex qui convertit une chaine en majuscule si elle est
minuscules et inversement.
%{
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
%}
Min [a-z]
Maj [A-Z]
Espas [ \t\n]
%%
{Min} {printf("%c",yytext[0]-32);}
{Maj} {printf("%c",yytext[0]+32);}
{Espas} { ECHO ;}
%%
int main (int args,char *argr[]){
FILE *f;
if(args>1){
f=fopen(argr[1] , "r") ;
if(!f){
printf("fichier n est existe pas") ;
exit(1) ;
}
else{
yyin=f;
yylex();
fclose(f) ;
}}
return 0 ;
}
8. On veut concevoir un langage pour manipuler des expressions. Pour cela, on définit
des constantes entières val, des noms de variables ident, les parenthèses, les opérateurs
+, -, *, /, :=, et un marqueur de fin d’expression ;.
Ecrire un programme Flex pour reconnaître ces lexèmes.
%{
#include <stdio.h>
#include <stdlib.h>
#define TOKEN_EOF 0
#define TOKEN_VAL 1
#define TOKEN_VAR 2
#define TOKEN_PLUS 3
#define TOKEN_MOINS 4
#define TOKEN_MUL 5
#define TOKEN_DIV 6
#define TOKEN_AFFECT 8
#define TOKEN_FIN 9
#define TOKEN_LPAR 10
#define TOKEN_RPAR 11
%}
C [0-9]
L [A-Za-z]
%%
"+" return TOKEN_PLUS ;
"-" return TOKEN_MOINS ;
"*" return TOKEN_MUL ;
"/" return TOKEN_DIV ;
":=" return TOKEN_AFFECT ;
";" return TOKEN_FIN ;
"(" return TOKEN_LPAR ;
")" return TOKEN_RPAR ;
{C}+ return TOKEN_VAL ;
{L}({L}|{C})* return TOKEN_VAR ;
[ \t\n] ;
. { fprintf (stderr, "erreur lexicale %s à la ligne %d.\n", yytext[0], yylineno); }
%%
int main(){
int token_courant;
printf("Codes des tokens retournés par yylex: ")
do {
token_courant=yylex();
printf("%d ", token_courant);
token_courant=yylex();
} while (token_courant !=TOKEN_EOF);
return(0)
}

Vous aimerez peut-être aussi