Module CS22 - Partie Traduction, 2eme controle : Traitements XML simples

XML est un format de contenu de fichier, pour representer des contenus a structure d'arbre
dont les noeuds sont nommes. Utilisations : web, presentation, deploiement, PAO...
Exemple (fichier decrivant la preparation d'une application par le logiciel Ant)

Deux pre-traitements frequents sont :
- un "formattage", par exemple indentation correcte (aligner sur une meme
  colonne les debuts de balise ouvrante et fermante correspondantes)
- verifier que le document est bien forme, cad. que les balises s'accordent

Pour cet exercice : - on ne vise pas un pre-traitement complet !
                    - des etapes de realisation graduelle sont indiquees
                    - on utilisera seulement l'outil "flex"

ATTENTION, dans ce texte l'espace initial dans chaque balise < xxx> de a ete ajoute !

1 - FORMATTAGE/VERIFICATION, sur CONTENU SIMPLIFIE

- hypothese H1 : on suppose que le document est syntaxiquement correct :
  a toute balise ouvrante correspond bien une balise fermante ;
  si en fin de texte ce n'est pas le cas, on pourra signaler l'erreur (Q1.2a)

- dans une premiere version (Q1.1), on ne verifiera pas les labels des balises, puis
  une 2eme version (Q1.2) verifiera les correspondances de labels ( = document "bien forme")

- hypothese H2 (pour le titre 1 seulement) : on suppose que le fichier ne comporte :
  ni balise < ?xml ...>, ni commentaires < !-- .... --> ni balise speciale < ![ .... ]]>
  Alors les seules balise possibles sont :
  < xxx  ...>  balise ouvrante
  < /xxx ...>  balise fermante homologue
  < yyyy... /> balise "isolee"

- ignorant largement la mise en page du fichier de depart, on devra :
. afficher chaque balise <...> quel que soit son type sur une seule ligne
. en partant d'une colonne correspondant a son niveau d'imbrication (2 espaces par niveau ;
  pour simplifier, supposer que le fichier ne contient pas de caractere '\')

  Par exemple un fichier contenant :
  < truc> < machin1 /> < bidule1 > < choseA /> < choseB /> < /bidule2> < /truc>

  devra etre affiche, malgre le manque d'accord entre les bidulesXX, comme ceci  :
  < truc>
    < machin1 />
    < bidule1 >
      < choseA />
      < choseB />
    < /bidule2>
  < /truc>
1.1) Formattage seul
     Q1.1 - Donnez un analyseur 1.1.flex realisant ce formattage
            Indication : utiliser une variable de niveau
1.2) Formattage + verifications
1.2a) Verification syntaxique seule

     Q1.2a - Deduire un analyseur 1.2a.flex realisant formattage + verification     
             Indication : ajouter une fonction yywrap(), executee automatiquement
             en fin de fichier d'entree
     
1.2b) Verification semantique (question pouvant etre sautee dans un 1er temps)

     On veut verifier que pour deux balises supposees correspondantes les labels sont les memes.
           
      Q1.2b - Donnez un analyseur 1.2b.flex      
              Indications
              - pour une balise "ouvrante" ou fermante, extraire du fragment le label
              - gerer ces labels dans une pile
              - en cas de non correspondance, signaler l'erreur et arreter     

2) CONTENU MOINS SIMPLE : TRAITEMENT DES COMMENTAIRES

  On veut accepter des commentaires XML, de la forme:  . Ils ne peuvent pas etre imbriques,
  mais peuvent s'etendre sur plusieurs lignes. On ne doit pas prendre un ensemble de commentaires (separes
  par des balises non commentees) pour un seul commentaire. On propose des etapes progressives.
2.1 - Traitement d'un fichier ne contenant que des commentaires XML
  Traitement demande :
  - formatter chaque balise commentaire et son contenu : si la balise s'etend sur plusieurs lignes,
    chaque ligne en sortie doit debuter dans la meme colonne que le '<' du debut de commentaire
    Exemple de resultat :
    < !-- Commentaires 1
    blablablablabla ... -->
        < !-- Commentaires 2
        mais mais non mais non; quoique... -->

  Q2.1 - Donnez un analyseur 2.1.flex. Indications :
       - utiliser une start condition
       - gerer une variable entiere 'col', position dans la ligne courante
       - traiter separement les caracteres '\n'
2.2 - Combinaison des traitement balises + balises commentaires
  Q2.2 - Donner l'analyseur 2.2.flex, en combinant les precedents :
       - votre version XX pour la question 1 : 1.XX.flex
       - votre analyseur 2.1.flex       
       La colonne "debut" d'impression d'un commentaire doit etre celle calculee en 2.1
       Indications - il des debuts de ligne tabules differemment

3) CONTENU GENERAL : balises speciales < ![ ... ]>

  Ces balises  peuvent contenir des balises HTML, a ne pas interpreter comme balises du document
  XML. EX. ci-dessous : les balises HTML dans < ![CDATA ... ]> ne sont pas a interpreter

        < bottom>
        	< ![CDATA[COPYRIGHT 2006, University of Lisbon
For updates and related information please see < A HREF="http://appia.di.fc.ul.pt/">Appia Home Page or < A HREF="http://appia.continuent.org">Continuent GForge
Send questions, sugestions or remarks to < A HREF="mailto:appia@di.fc.ul.pt">appia@di.fc.ul.pt]]> < /bottom>
3.1 - Prise en compte dans un contexte simplifie (pas de commentaires XML dans le fichier)
   Q3.1 - Analyseur 3.1.flex devant 
             - traitant les balises XML
             - reconnaissant les balises speciales, en les signalant en sortie
               (encadrees par des delimiteurs visuels)
        
3.2 - Integration d'ensemble
        Q3.2 - Integrer l'ensemble de vos regles lexicales dans un analyseur 3.2.flex