Utilisation de lex dans le monde XML

De Wicri Manuel
Révision datée du 17 juin 2014 à 15:19 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 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();
}