INT / CC21 / 2002 - 2003 - NOTIONS SUR LA COMPILATION

TP 5.6 (note)


  Le but est de traiter des fichiers directement issus de MS PowerPoint, pour
  faciliter la realisation d'ensembles de pages web. Cet objectif operationnel
  implique les possibilites basiques de flex, et aussi de les renforcer un peu
  en utilisant les macro definitions et "start conditions", pour lesquelles des
  indications sont fournies. La progression est tres graduelle et guidee.

* Fichiers de donnees et traitements a effectuer

- il s'agit d'operer sur des fichiers .htm produits par PowerPoint quand on sauve une presentation
  en "format web". Des exemples se trouvent dans le repertoire http://www-inf.int-evry.fr/~meunier/CC21/TPNote2003/
  ou bien dans les fichiers INT-MCI a /mci/inf/meunier/CC21/PPointFiles).
  Deux fichiers sont a traiter : sld001.txt, index.txt.

- on se limite a des suppressions ciblees (on pourrait facilement etendre a des
  editions simples). Ce que doit fournir l'analyseur final est montre dans:
  sld001.resu.txt, index.resu.txt. 

- en general il faut eviter de faire, en plus des suppressions voulues, des suppressions
  intempestives, ceci au moins sur les exemples fournis. On veut aussi que le resultat aie
  une "mise en lignes" correcte: pour les questions 3 et suivantes, les fragments a supprimer
  doivent l'etre avec la fin de ligne qui les suit

* Conventions
  Meme si vous ne traitez pas toutes les questions, il est demande:
- de nommer vos specifs lexXX.l, avec XX: numero correspondant a l'enonce
- que l'analyseur N+1 realise, outre sa fonction propre, toutes celles des
  analyseurs precedemment realises. En effet il faut tester qu'aucune regle
  lexicale expression/action ne perturbe les autres, et que l'ordre choisi
  permet aux regles de s'appliquer correctement.
- de ne fournir QUE votre derniere specification, celle realisant le plus de
  fonctionnalites, avec tout commentaire utile

* Suggestions 
- des mises au point intermediaires ciblees sont souvent necessaires, en testant
  separement des sous-ensembles reduits, sur des extraits de donnees, jusqu'a
  resolution des problemes (mais ces essais intermediaires ne sont pas a rendre)
- un editeur facilitant la tache est important ! Kate est nettement preferable
  a emacs pour travailler sur de nombreux fichiers a la fois, comme ici
- a l'usage il est assez efficace de rediriger le resultat d'analyse toujours
  vers un meme fichier (nomme p.ex. resu), en permanence ouvert sous l'editeur
  Kate (qui, lorsque vous reselectionnez le fichier, vous previent si le
  contenu a change)

New Lines and Co

1 - SUPPRESSION DES '\r'  (specif lex1.l)

Le codage d'une fin de ligne differe selon les systemes (Unix: \n seul,
Windows: \r\n,  MacOS: \r seul). On veut supprimmer les \r de fin de ligne
introduits par Windows/PowerPoint. Les caracteres \r sont affiches par certains
editeurs (p.ex. Kate). On peut aussi les voir par "octal dump": od -xc fileName
Comme mise en train, vous pouvez essayer une solution triviale qui supprimme
tous les \r.

Mais ce qui est demande, c'est de supprimmer les seuls \r de fin de ligne (il
pourrait y avoir d'autres caracteres \r sans signification de fin de ligne),
s'il y en a. La solution doit s'appliquer a des fichiers produits sous Windows
ou Unix, sans traiter le cas MacOS.

2 - SUPPRESSION DES LIGNES VIDES  (specif lex2.l)

a) Ajouter a votre specification precedente le filtrage de lignes "vides",
   cad. pouvant contenir des espaces, tabulations. La definition de fin de
   ligne doit traiter les cas Windows et Unix, comme ci-dessus.

b) Variante directe. Comme dans la suite vous en aurez besoin repetitivement,
   caracterisez la fin de ligne par une "macro definition", cf. Memento flex 4.1.

Suppression de lignes isolees particulieres

3 - SUPPRESSION D'UNE BALISE META PARTICULIERE (specif lex3.l)

Ajouter a votre specification precedente la suppression d'une balise commencant
par: <meta name="GENERATOR" (suppose figurer tel quel), puis contenant : soit
'Presentation' puis 'Microsoft' dans cet ordre, soit 'Microsoft' puis 'PowerPoint'
dans cet ordre, ces mots pouvant debuter par une majuscule ou une minuscule.
(Le fichier sld001.htm contient par ailleurs 'Presentation' puis 'Microsoft', dans
un commentaire HTML qui sera supprimme dans la question 10)

4 - SUPPRESSION DE BALISES <TITLE> </TITLE>  (specif lex4.l)

On suppose que chacun des 2 marqueurs peut etre ecrit indifferemment: soit tout
en majuscules, soit tout en minuscules. Votre analyseur doit supprimer la balise,
ainsi que le contenu entre marqueurs, en supposant le tout ecrit sur une seule
ligne

5 - SUPPRESSION du fragment <P>Diapositive XX sur XX</P>  (specif lex5.l)

Supprimmer la portion contenant "<P>Diapositive..." (supposee tel quelle), un
entier, la chaine 'sur', un entier, la chaine </P>, avec des espaces intermediaires
(mais sans admettre le \n)

Ce qu'on peut faire en combinant des macro-definitions

6 - SUPPRESSION DE LA DATE (dans le fichier index.htm)  (specif lex6.l)

Il s'agit du fragment: <h4>02/05/2003</h4>
On veut une caracterisation plus generale que seulement "litterale" figee.
Utiliser des macro definitions auxiliaires: HBEG, HEND, pour caracteriser
respectivement <Hx> et </Hx> (x=1 a 6), en autorisant majuscule
/minuscule, et des espaces eventuels avant '>'. La partie xx/xx/xxxx est
supposee sans espaces intermediaires.

7 - SUPPRESSION DE LA LIGNE "Table des matieres" (fichier index.htm) (specif lex7.l)

Il s'agit de la ligne: <h3><u>Table des mati�es</u></h3>

Ajouter a votre specification precedente:
* des macro definitions :
- pour les marqueurs <u> et </u> (meme conditions que ci-dessus)
- pour la chaine "Table des mati�es" en toutes lettres
  (a copier/coller pour recuperer le code du e accent grave)
* une regle supprimant le fragment, en considerant qu'il pourrait y avoir des
  espaces entre les items, mais pas de \n

8 - SUPPRESSION DU FRAGMENT "Auteur" (specif lex8.l)

Il s'agit de :

   <td valign=top width=50%>
	 <strong>Auteur:</strong>fhmeunier
   </td>

On definira des macro definitions Lex pour les marqueurs <td>,</td>,
<strong>,</strong>
(memes conditions qu'a la question 6). Reconnaitre litteralement la chaine
 "Auteur :", et accepter tout nom d'auteur forme de caracteres usuels.
Indication. Etant donne que le fragment est etale sur plusieurs lignes, il faut
utiliser la macro-definition formulee en 2.b)

9 - SUPPRESSION DE FRAGMENTS CONTENANT CERTAINS HYPERLIENS (lex9a.l,lex9b.l)

a) Dans index.htm, on veut supprimmer le fragment :
<br><h2> <A HREF="sldXXX.htm">Cliquez ici pour d�arrer</A> </h2><br>

Pour le caracteriser de facon non pas triviale, on utilisera des macro definitions Lex auxiliaires:

- HBEG, HEND (comme ci-dessus question 3)
- BR pour representer <BR> ou <br> avec des espaces eventuels avant '>'
- HBEGBR (resp.HENDBR) pour caracteriser respectivement la presence d'un HBEG
  (resp.HEND), soit precede, soit suivi d'un BR, avec d'eventuels espaces
  intermediaires
- AHR pour caracteriser <A HREF= avec possibilite de maj./minuscules, et
  d'espaces entre A et HREF
- AHSLDX pour caracteriser <A HREF="sldXXX.htm"> avec XXX=3 chiffres decimaux
- CLKTXT pour le texte "Cliquez ici pour d�arrer" (avec eventuellement des
  espaces ou \n supplementaires)

b) Dans sld001.htm, on veut supprimmer :
<A HREF="tsld001.htm"><IMG SRC="text.gif" BORDER=0 ALT="Texte "></A>

Caracteriser ce fragment par la presence de: la macro.def. AHR precedente,
la chaine tsldXXX.htm (ce n'est pas sldXXX.htm), d'une balise <IMG ...>
et de la balise </A> . A nouveau, on a interet:
- a utiliser des macro definitions, comme p.ex.:
  IMG		pour caracteriser une balise IMG
  AEND 		pour caracteriser </A> en majuscule ou minuscule
  DOT_HTM 	pour .HTM ou .htm, avec un L ou l eventuel
- a proceder par tests progressifs.

Les start conditions etendent les possibilites

10 - SUPPRESSION DE COMMENTAIRES HTML (specif lex10.l)

Il s'agit des fragments "<!-- ... --> qui peuvent s'etendre sur plusieurs
lignes. Comme il peut y en avoir plusieurs dans le fichier, l'expression
"attrappe-tout" (.|\n)* ne peut etre utilisee. Ici il est indique d'utiliser
les "start conditions", voir Memento flex, 2.5.b.

Utiliser une start condition GOT_COMMENT_BEG. S'y placer quand on rencontre le 1er
marqueur, par l'action: BEGIN GOT_COMMENT_BEG. Puis, etant dans ce "macro-etat",
on en sort a la rencontre du 2eme marqueur, en revenant a la start condition
initiale, par BEGIN INITIAL.

Pour que la suppression des lignes vides du 2 continue a fonctionner on
aura peut-etre besoin de prefixer les regles correspondantes par la start
condition <INITIAL>