Prise de contact avec lex : Différence entre versions

De Wicri Manuel
imported>Jacques Ducloy
(Un premier exemple)
imported>Asma Lahssini
(Exercices)
 
(19 révisions intermédiaires par 2 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
 +
{{Exploration corpus, header
 +
|module=Prise de contact avec lex
 +
|précédent=Introduction aux cascades de filtres sous Unix
 +
|suivant=Le type entier, boucles, comptages
 +
}}
 +
 
[[Image:LexPrincipe.gif|thumb|right|300px|Principe de fonctionnement de lex]]
 
[[Image:LexPrincipe.gif|thumb|right|300px|Principe de fonctionnement de lex]]
 
Lex est un générateur d'analyseurs lexicaux. Il est étroitement associé, dans son fonctionnement, au [[C (langage)|langage C]] et disponible en standard sur les systèmes [[Unix]].
 
Lex est un générateur d'analyseurs lexicaux. Il est étroitement associé, dans son fonctionnement, au [[C (langage)|langage C]] et disponible en standard sur les systèmes [[Unix]].
Ligne 37 : Ligne 43 :
  
 
Pour tester ce programme, on crée d'abord un jeu de test, exemple :
 
Pour tester ce programme, on crée d'abord un jeu de test, exemple :
 
  
 
<source lang="sh">
 
<source lang="sh">
Ligne 44 : Ligne 49 :
 
...
 
...
 
</source>
 
</source>
 +
 +
Puis on vérifie avec :
 +
:<code>./ortho <testOrtho.txt </code>
 +
 +
==Deuxième exemple, extraction de dates==
 +
 +
Le deuxième programme va extraire les dates d'un texte.
 +
 +
<source lang="c">
 +
%%
 +
[1-2][0-9][0-9][0-9]  {ECHO; printf("\n");}
 +
.                      ;
 +
\n                    ;
 +
%%
 +
int main() {
 +
  yylex();
 +
  return 0;
 +
}
 +
 +
</source>
 +
 +
Ce programme contient 3 règles :
 +
#La première « [1-2][0-9][0-9][0-9] » sélectionne des nombres de 4 chiffres.
 +
#La deuxième réduite à un point sélectionne n'importe quel caractère, sauf le saut de ligne.
 +
#La troisième sélectionne un saut de ligne.
 +
 +
Deux actions sont associées à ces règles ;
 +
#Pour les dates, on imprime ce qui a été sélectionné (ECHO;) ; puis on imprime un saut de ligne.
 +
#:Comme il y a deux instructions elles sont regroupées dans un bloc <code>{ }</code>.
 +
#Pour les caractères qui ne sont pas dans des dates, on ne fait rien (autrement dit, on ne recopie pas le caractère lu).
 +
 +
===Exercices===
 +
Prise en main :
 +
* compiler ce programme,
 +
* créer un fichier de test et vérifier le fonctionnement.
 +
 +
Avec DILIB et le wiki Wicri/Santé
 +
* initialiser DILIB par (pour une installation ScienceExplor) :
 +
<source lang="sh">
 +
source $HOME/Documents/ScienceExplor/Dilib/init.sh
 +
</source>
 +
 +
La commande DILIB suivante permet d'extraire le texte de la page [[wicri-sante.fr:La grippe ou influenza (1908) André/Historique]] :
 +
 +
<source lang="sh">
 +
WicriGetPage -l wicri-sante.fr -p "La grippe ou influenza (1908) André/Historique"
 +
</source>
 +
 +
En utilisant le mécanisme de pipe :
 +
* tester votre programme sur cette page ([[Discussion:Prise de contact avec lex|solution en page discussion]]),
 +
* éditer le nombre de dates de cette page (avec wc) ([[Discussion:Prise de contact avec lex|solution en page discussion]]),
 +
* utiliser une commande nommée sort pour trier les dates ([[Discussion:Prise de contact avec lex|solution en page discussion]]),
 +
* en utilisant grep avec l'expression « 19.. » éditer les dates du {{XXe}} siècle ([[Discussion:Prise de contact avec lex|solution en page discussion]]),

Version actuelle datée du 22 juin 2020 à 13:00

Principe de fonctionnement de lex

Lex est un générateur d'analyseurs lexicaux. Il est étroitement associé, dans son fonctionnement, au langage C et disponible en standard sur les systèmes Unix.

En sciences de l'information, il est utilisé notamment pour faire des reformatages et des filtres de sélection.

Pré-requis

Un premier exemple

Lex est un générateur d'analyseurs lexicaux. Il est basé sur un ensemble de règles de reconnaissance lexicale auxquelles sont associées des instructions en langage C. L'analyseur Lex produit un programme C (qui sera ensuite compilé).

Dans les cas simples il permet d'effectuer des substitutions. Voici un exemple, montrant comment créer un fichier source lex :

cat <<... >ortho.lex
%%
chevals     printf("chevaux");
hibous      printf("hiboux");
%%
main() {
  yylex();
}
...

Faire une commande « ls » et vérifier la présence du fichier « ortho.lex ».

La compilation se déroule ici en 2 temps.

On va d'abord générer un programme C en faisant simplement :

lex ortho.lex
(ou flex ortho.lex sur certaines distributions).

Une commande ls montre qu'un fichier nommé lex.yy.c a été créé (on peut le lister avec une commande cat).

Pour compiler, il faut maintenant appeler le compilateur C :

gcc lex.yy.c -ll -o ortho

Pour tester ce programme, on crée d'abord un jeu de test, exemple :

cat <<... >testOrtho.txt
les hibous regardent les chevals. 
...

Puis on vérifie avec :

./ortho <testOrtho.txt

Deuxième exemple, extraction de dates

Le deuxième programme va extraire les dates d'un texte.

%%
[1-2][0-9][0-9][0-9]   {ECHO; printf("\n");}
.                      ;
\n                     ;
%%
int main() {
  yylex();
  return 0;
}

Ce programme contient 3 règles :

  1. La première « [1-2][0-9][0-9][0-9] » sélectionne des nombres de 4 chiffres.
  2. La deuxième réduite à un point sélectionne n'importe quel caractère, sauf le saut de ligne.
  3. La troisième sélectionne un saut de ligne.

Deux actions sont associées à ces règles ;

  1. Pour les dates, on imprime ce qui a été sélectionné (ECHO;) ; puis on imprime un saut de ligne.
    Comme il y a deux instructions elles sont regroupées dans un bloc { }.
  2. Pour les caractères qui ne sont pas dans des dates, on ne fait rien (autrement dit, on ne recopie pas le caractère lu).

Exercices

Prise en main :

  • compiler ce programme,
  • créer un fichier de test et vérifier le fonctionnement.

Avec DILIB et le wiki Wicri/Santé

  • initialiser DILIB par (pour une installation ScienceExplor) :
source $HOME/Documents/ScienceExplor/Dilib/init.sh

La commande DILIB suivante permet d'extraire le texte de la page wicri-sante.fr:La grippe ou influenza (1908) André/Historique :

WicriGetPage -l wicri-sante.fr -p "La grippe ou influenza (1908) André/Historique"

En utilisant le mécanisme de pipe :