Académique Documents
Professionnel Documents
Culture Documents
Copilation TD2correction
Copilation TD2correction
Correction TD2
Analyse lexicale automatique
Exercice1:
1. Ecrire un programme Flex qui copie un programme écrit en C et qui remplace le mot
clé float par double.
%{
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
%}
flt "float"
%%
{flt} {printf("double");}
%%
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 ;
}
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_Line++;}
%%
#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 ;
}
Exercice2:
Le tableau suivant énumère les expressions régulières de base utilisées en Lex :
Exercice 3:
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 ;.
%{
#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]
%%
[ \t\n] ;
%%
int main(){
int token_courant;
do {
token_courant=yylex();
token_courant=yylex();
return(0)