Utilisation de lex dans le monde XML : Différence entre versions

De Wicri Manuel
imported>Jacques Ducloy
(Indexation par filtrage)
imported>Jacques Ducloy
m (13 révisions importées)
 
(7 révisions intermédiaires par le même utilisateur non affichées)
Ligne 20 : Ligne 20 :
 
</source>
 
</source>
  
 
===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:
 
 
* [[Liste des inscrits sur un réseau MediaWiki]]
 
 
Cette approche permet d'associer facilement des non-spécialistes des outils XML (parser SAX ou DOM).
 
  
 
===Pré-traitement de documents XML non conformes===
 
===Pré-traitement de documents XML non conformes===
Ligne 54 : Ligne 46 :
  
 
===Indexation par filtrage===
 
===Indexation par filtrage===
 +
Cet exemple montre comment extraire, dans le [[Serveur d'exploration sur Rabelais|serveur Rabelais]] des termes terminés par « us » (en excluant le terme « plus ») dans un fichier bibliographique Sxml.
 
<source lang="c">
 
<source lang="c">
 
%{
 
%{
Ligne 60 : Ligne 53 :
 
%}
 
%}
 
%%
 
%%
^[0-9A-F]+/\t              strcmp(key, yytext);
+
^[0-9A-F]+/\t              strcpy(key, yytext);
 +
plus/[ <,]                  ;
 
[A-Za-z][a-z]+"us"/[ <,]  {printf("%s\t%s\n", yytext, key);}
 
[A-Za-z][a-z]+"us"/[ <,]  {printf("%s\t%s\n", yytext, key);}
 
.              ;
 
.              ;
Ligne 67 : Ligne 61 :
 
main()
 
main()
 
{
 
{
   key=malloc(5);
+
   key=malloc(7);
 
   yylex();
 
   yylex();
 
}
 
}
  
 +
</source>
 +
Pour tester cet exemple sur le serveur Rabelais, recopier le programme dans un fichier, par exemple testRabelais.lex, et procéder ainsi :
 +
<source lang="c">
 +
. ~/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
 +
</source>
 +
 +
On obtient alors une liste telle que :
 +
<source lang="html">
 +
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
 +
</source>
 +
;Exercices:
 +
Cet exemple peut être modifié pour analyser puis éliminer les termes en « ious ». On peut également rechercher les noms propres...
 +
===Repérage de composés chimiques===
 +
L'exemple précédent peut s'appliquer à la recherche de composés chimiques.
 +
 +
Par exemple sur la base EuropiumV3, les nouvelles règles du programme lex :
 +
<source lang="c">
 +
%%
 +
^[0-9A-F]+/\t              strcpy(key, yytext);
 +
[A-Za-z0-9]*"Eu"[A-Z][A-Za-z0-9]*    {printf("%s\t%s\n", yytext, key);}
 +
.              ;
 +
\n            ;
 +
%%
 +
</source>
 +
donnent le résultat suivant :
 +
<source lang="html">
 +
176    EuO
 +
170    EuS
 +
164    EuBa
 +
140    EuCl
 +
103    EuTe
 +
77      EuF
 +
62      EuB
 +
56      EuCu
 +
53      EuSe
 +
52      EuBa2Cu3O7
 +
41      EuPd
 +
36      EuNi
 +
34      EuFe
 +
24      EuMo
 +
21      EuF3
 +
21      EuB6
 +
20      EuW
 +
20      EuL
 +
18      PbEuTe
 +
18      EuTiO
 +
18      EuGa
 +
18      EuCo
 +
18      EuAl
 +
16      EuVO
 +
16      EuP
 +
16      EuCl3
 +
16      EuBr
 +
15      EuPO
 +
15      EuAs
 +
14      EuOCl
 +
13      EuX
 +
13      EuN
 +
13      EuMnO
 +
13      EuBa2Cu3Oy
 +
12      EuI
 +
10      EuMn
 +
10      EuFeO
 
</source>
 
</source>
  
 
[[Catégorie:Application lex]]
 
[[Catégorie:Application lex]]
 
[[Catégorie:Application XML]]
 
[[Catégorie:Application XML]]

Version actuelle datée du 24 juin 2017 à 18:17

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;
}


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...

Repérage de composés chimiques

L'exemple précédent peut s'appliquer à la recherche de composés chimiques.

Par exemple sur la base EuropiumV3, les nouvelles règles du programme lex :

%%
^[0-9A-F]+/\t              strcpy(key, yytext);
[A-Za-z0-9]*"Eu"[A-Z][A-Za-z0-9]*    {printf("%s\t%s\n", yytext, key);}
.              ;
\n             ;
%%

donnent le résultat suivant :

176     EuO
170     EuS
164     EuBa
140     EuCl
103     EuTe
77      EuF
62      EuB
56      EuCu
53      EuSe
52      EuBa2Cu3O7
41      EuPd
36      EuNi
34      EuFe
24      EuMo
21      EuF3
21      EuB6
20      EuW
20      EuL
18      PbEuTe
18      EuTiO
18      EuGa
18      EuCo
18      EuAl
16      EuVO
16      EuP
16      EuCl3
16      EuBr
15      EuPO
15      EuAs
14      EuOCl
13      EuX
13      EuN
13      EuMnO
13      EuBa2Cu3Oy
12      EuI
10      EuMn
10      EuFeO