Travaux Pratiques du L1 année 2000-2001

Analyseur Lexical





Durée : 3 heures.
 

    L'objectif de cette feuille de travaux pratiques est  d'écrire un programme pour  calculer la distribution des mots dans un fichier texte.  Il s'agit de gérer une liste de chaines , ordonnée par ordre alphabétique et balisée par deux sentinelles. La commande unix flex  sera utilisée pour extraire les mots du  fichiers texte.
 

Mots clefs : la commande  flex,  liste chaînée, fonction de hachage.

[ 1 ] Analyseur lexical.

  1. Editer un fichier  lexical.lex  à partir de l'exemple.
  2. Utiliser la commande  flex pour  produire le fichier lexical.c.
  3. Compiler le programme  en un exécutable lexical.x
  4. Tester  ce programme.
  5. Ecrire un fichier Makefile.
[ 2 ] Insersion dans une liste ordonnée
  1. Définir une structure pour représenter les listes chainées de mots.
  2. Ecrire les procédures de gestions des listes ordonnées.
  3. Modifier la source de lexical.lex pour  obtenir un programme distrib.x calculant  la distribution des mots d'un fichier texte.
  4. Donner une information sur le temps de calcul de votre programme.
[ 3 ] Hachage modulaire
  1. Ecrire une fonction  int Hachage( char * mot, int B, int M) qui calcule le haché d'un mot en base B modulo M.
  2. Utiliser le principe du hachage pour accélerer  le programme distrib.x d'un facteur 100.
  3. Tester vos programmes sur un gros fichier texte.


EXEMPLE DE PROGRAMME LEX
%{
#include <stdlib.h>
#include <stdio.h>

int cpt=0, mot=0, ligne=0, somme=0;
int ajoute(int s, char *str)
{
return( atoi(str)+s);
}
%}

CHIFFRE [0-9]
LETTRE  [A-Za-z]
NOMBRE  {CHIFFRE}+
MOT     {LETTRE}+
%%
{NOMBRE}  somme = ajoute(somme, yytext);
{MOT}   mot++;
\n      ligne++;
.       cpt++;
%%

int main(int argc, char *argv[])
{
printf("\nWelcome!\n");
++argv, --argc;
if ( argc > 0 )
          yyin = fopen( argv[0], "r" );
   else
          yyin = stdin;

yylex();
printf("\nNombre de mots lus :%d", mot);
printf("\nNombre de lignes   :%d", ligne);
printf("\ncaracteres ignores :%d", mot);
printf("\nsomme des nombres  :%d", somme);
printf("\nBye...\n");
}
 



MAKEFILE
LIB=-lfl
CC=gcc
LL=flex

prog.x: prog.lex
        $(LL) -oprog.c prog.lex
        $(CC) -o prog.x prog.c -lfl


Philippe Langevin,

Novembre 2000.