Utilisation de lex dans le monde XML

De Wicri Manuel
Révision datée du 18 juin 2014 à 07:32 par imported>Jacques Ducloy (Indexation par filtrage)

Lex est un générateur d'analyseur syntaxique qui associe simplement des actions à des règles.

En associant des règles à des éléments syntaxiques du langage XML, lex se comporte en fait comme un analyseur XML relativement élémentaire.

Quelques exemples d'applications

Changement de noms de balises d'un document XML

Pour changer un nom de balise (exemple remplacer <titre> par <title>), deux règles suffisent dans les cas simples :

%%
"</titre>"      printf("</title>";
"<titre"/[ >]   printf("<title");
%%
main() {
  yylex();
  return 0;
}


Cas simples pour praticiens d'unix/langage C

Dans des cas simples, le traitement peut être intégralement résolu dans le traitement lex. Voir par exemple&nbsp:

Cette approche permet d'associer facilement des non-spécialistes des outils XML (parser SAX ou DOM).

Pré-traitement de documents XML non conformes

Lex peut être très utile pour traiter un document approximatif vers un parser DOM ou SAX rigoureux.

Par exemple, la bibliothèque Dilib contient un programme qui normalise les entités Sgml des flux de données venant de l'INIST.

En voici un extrait :

/*   -*- coding: utf-8 -*-  */
%%
"&Eacute;"      printf("É");
"&Aacute;"      printf("Á");

...

"&ggr;"         printf("γ");
"&"             printf("========");  /* pour repérer les codes non traités */
%%
main()
{
  yylex();
}

Indexation par filtrage

Cet exemple montre comment extraire, dans le serveur Rabelais des termes terminés par « us » (en excluant le terme « plus ») dans un fichier bibliographique Sxml.

%{
#include <stdio.h>
 char *key;
%}
%%
^[0-9A-F]+/\t              strcpy(key, yytext);
plus/[ <,]                  ;
[A-Za-z][a-z]+"us"/[ <,]   {printf("%s\t%s\n", yytext, key);}
.              ;
\n             ;
%%
main()
{
  key=malloc(7);
  yylex();
}

Pour tester cet exemple sur le serveur Rabelais, recopier le programme dans un fichier, par exemple testRabelais.lex, et procéder ainsi :

. ~/Dilib/init.sh
lex testRabelais.lex
gcc lex.yy.c -ll -o testRabelais 
HfdCat $DILIB/Samples/RabelaisV1/Data/Main/Exploration/biblio.hfd   \
         | ./testRabelais | sort -u                                 \
         | IndexBuildRec                                            \
         | SxmlSelect -g idx/f/1 -g idx/k/1 -p @g1 -p @g2 | sort -rn | more

On obtient alors une liste telle que :

20      sous
16      Erasmus
15      nous
14      tous
9       Famous
8       corpus
7       Religious
6       processus
3       thus
3       focus
3       Sous
3       Bacchus
2       vertus
2       various
2       serous
2       refus
2       parus
2       mysterious
2       dessus
2       dangerous
2       Tous
2       Thus
2       Plus
2       Phallus
2       Nous
2       Neophilologus
2       Grobianus
2       Corpus
Exercices

Cet exemple peut être modifié pour analyser puis éliminer les termes en « ious ». On peut également rechercher les noms propres...