La recherche et l'accès aux documents comportent de nombreux aspects : repérage de mots-clés et de leurs variantes, repérage de paragraphes, constitution de tables exploitables en recherche... etc. L'exercice en donne un aperçu, en se limitant à une analyse structurelle minimale, l'extraction de descriptions de "paragraphes" (selon un format de document particulier), la génération de code HTML permettant ensuite de visualiser les paragraphes par surbrillance HTML + Javascript.
lex1.flex
reconnaissant les deux fichiers en définissant les macros
suivantes :
OP
pour open et CL
pour close) :
HTML_OP
, HTML_CL
pour <html>
et </html>
HEAD_OP
, HEAD_CL
pour <head>
et </head>
BODY_OP
, BODY_CL
pour <body>
et </body>
PRE_OP
, PRE_CL
pour <pre>
et </pre>
I_OP
, I_CL
pour <i>
et </i>
P_OP
, P_CL
pour <p>
et </p>
BR
pour <br>
SPS
pour espace(s) ou tabulation(s)NL
pour un newline, à définir comme
\r\n
ou \r
ou \n
(pour
traiter les différences Windows/Linux/Mac)PURE_TEXT
pour du texte pur, sans balise
HTML. Hypothèse simplificatrice : considérer qu'il suffit
de ne pas avoir de caractère '<' (mais autoriser les
'>' pour accepter par exemple des renvois comme
"=>")H_OP
, H_CL
pour <hX> </hX>
, avec X
= 1,... 5LINK
pour la balise link
(à la fois ouvrante et fermante) telle que:
<link rel="stylesheet" href="divColors.css" type="text/css"/>Hypothèse simplificatrice : on ne distingue pas les différents attributs de cette balise.
SCRIPT_OP
et SCRIPT_CL
pour la balise script
telle que:
<script type="text/javascript" src="HL.js"></script>Hypothèse simplificatrice : on ne distingue pas les différents attributs de cette balise.
OTHERTAG_OP
, OTHERTAG_CL
permettant de récupérer toutes les balises non traitées jusqu'ici
AH_OP
pour l'ouverture d'une balise de lien de type <a href=...>
AN_OP
pour l'ouverture d'une balise d'ancre nommée de type <a name="..." >
A_CL
pour la fermeture d'une balise ancre : </a>
CDIV_OP
pour l'ouverture d'une balise «division coloree» de type <div class="...">
. Hypothèse simplificatrice : on ne récupère pas la couleur.DIV_OP
pour l'ouverture de d'une balise division (non colorée) : <div...>
. Hypothèse simplificatrice : on ne récupère pas les valeurs des attributs.DIV_CL
pour la fermeture d'une balise de division : </div>
Mettre au point un analyseur lex2.flex,
gram2.bison
définissant les catégories lexicales
correspondant à celles reconnues dans la question précédente.
La grammaire doit contenir deux règles :
Text
(texte acceptable en entrée) permettant
de reconnaître une suite de LexUnit
,LexUnit
permettant de reconnaître chacune des catégories lexicales définies ci-dessus.SPS
et
NL
au niveau syntaxiqueOTHERTAG_OP
et OTHERTAG_CL
sont considérées comme des erreurs au niveau syntaxiquedoc-erreurs.htm
contenant des erreurs.select
dans le fichier control.htm
.
Créez l'analyseur lex3.flex
, gram3.bison
reconnaissant les règles suivantes:
NamedAnchor
: pour reconnaître les ancres nommées
<a name="bTachesZonesIcones">BARRE DES TACHES, ZONES, ICONES</a>l'analyseur lexical devra passer la valeur de l'attribut
name
au niveau syntaxique.
ColoredDiv
: pour reconnaître une portion délimitée
par une balise ouvrante telle que <div class="Orange0"
id="0">
et une balise fermante
</div>
.
l'analyseur lexical devra passer la
valeur de l'attribut id
au niveau syntaxique.Au niveau lexical
GEN_TEXT
reconnaissant du texte généralisé,
c'est-à-dire un motif constitué de texte pur et aussi:
GEN_TEXT
permettra donc de reconnaître les balises HTML
, HEAD
, BODY
, PRE
, I
, P
, BR
, H
, LINK
, SCRIPT
...SPS
et NL
n'est pas considéré comme du GEN_TEXT
name
et id
name
et id
au niveau syntaxiqueAN_OP
et à ne transmettre au niveau syntaxique que la valeur de l'attribut name
, en faisant côté lexical une fonction récupérant directement la valeur de cet attribut. La grammaire est alors beaucoup plus simple puisqu'il n'y a pas à décrire la syntaxe des attributs.
<a name="nom1">Titre 1</a> <a name="nom2">Titre 2</a> <a name="nom3">Titre 3</a> <a name="nom4">Titre 4</a>Le résultat de l'analyseur devra être :
<option value="-1">nom1</option> <option value="-1">nom2</option> <option value="-1">nom3</option> <option value="-1">nom4</option>Pour l'instant toutes les valeurs de l'attribut
value
seront égales à -1
.
ColoredDiv
,
enregistrez l'ancre avec la valeur d'attribut id
de la division.
Supposons que le fichier initial contienne les ancres nommées suivantes:
<div class="Orange0" id="1"> ... <a name="nom1">Titre 1</a> ... </div> <div class="Yellow0" id="2"> ... <a name="nom2">Titre 2</a> ... </div> <div class="Yellow0" id="3"> ... <a name="nom3">Titre 3</a> ... </div> <div class="Lime0" id="4"> ... <a name="nom4">Titre 4</a> ... </div>Le résultat de l'analyseur devra être :
<option value="1">nom1</option> <option value="2">nom2</option> <option value="3">nom3</option> <option value="4">nom4</option>
doc1-Full.htm
. Créez le fichier
controlFull.htm
obtenir à partir du fichier
control.htm
apèrs insertion du résultat de votre
analyseur dans le corps de la balise select
. Créez le
fichier indexFull.htm
obtenu à partir du fichier
index.htm
en modifiant les noms des fichiers ouverts dans
chacune des frames. Ouvrez ce dernier fichier dans votre
navigateur et testez.
doc1-Full.htm