CS22 - TP note - Reconnaissance d'un sous-ensemble de SVG (sans passage de valeurs)

Une presentation du langage SVG est disponible ici.
La demarche est tres progressive et guidee ; une analyse detaillee est fournie.
Pour remettre votre travail, suivez ces indications.

I - ANALYSE LEXICALE : UNITES DE BASE : valeurs, symboles, attributs

- Pour cette question 1, se placer dans un sous-repertoire Units
- Utiliser les noms lex1X.flex, gram1X.bison... Exemple de fichier-test : q1.data.

a) Valeurs numeriques : categories lexicales usuelles INT et FLOAT
    On admettra des valeurs positives ou negatives, de type entier ou reel
    Exemples : 15 -2 0.5  .999 -0.3 1. (correctes) - 3   0.1. (erronnees)

b) Tailles pour les fontes
    Une taille de fonte est une valeur entiere suffixee de "pt". Exemple : 14pt    
    Une categorie FT_SIZE_VAL sera retournee a l'analyseur syntaxique.  

c) Valeurs de couleurs. Reconnaitre la categorie COLOR dans 3 cas :
  - entier positif sur 3 ou 6 caracteres hexadecimaux precedes de '#': #999 #2244CC
  - valeur definie par les pourcentages rouge, vert, bleu : rgb(20%, 30%, 50%)
  - valeur predefinie indiquee par un mot-cle: black gray red green yellow blue	
    auxquels on ajoute le mot-cle none signifiant l'absence de couleur 
  Exemples  #040 red #2244CC  green none rgb(20%, 30%, 50%)  (correctes)
            #9999 grey  rgb( 20% 30% 50%)                    (erronnees)

d) Noms d'attributs. En SVG certaines entites ont des attributs. On reconnaitra ainsi
   fill stroke font-family font-size points transform style href
        
   A la rencontre d'un tel nom, reconnaitre une categorie lexicale de nom similaire
   (Note : dans les noms de "token", ne pas utiliser de '-') :   
    fill -> FILL      font-family -> FONT_FAMILY      points -> POINTS      ... etc

e) Autres valeurs simples possibles pour les attributs
   Beaucoup d'attributs prenant des valeurs simples deja prises en compte ci-dessus, p.ex.:
   fill -> COLOR  font-size -> FT_SIZE_VAL ...  etc

   Pour d'autres attributs les valeurs possibles sont des mots-cle (symboles reserves), p.ex.
   pour font-family les valeurs possibles sont serif sans-serif 
   A la rencontre d'un de ces mots-cles l'analyseur lexical considerera qu'il s'agit de
   la categorie lexicale FONT_FAM_VAL
 
f) Symboles definis par le programmeur. References a ces symboles
   L'analyseur doit retourner :
   - pour des symboles alphanumeriques qui ne sont pas des mots-cle, la categorie SYMB
   - pour une reference a un tel symbole, de la forme #xxxx, la categorie REFERENCE
   - pour le mot-cle href, la categorie HREF 
   EX.: dans la balise <g id="voies">, "voies" est un symbole du programmeur
        dans la balise  <use xlink:href="#voies" ... >, #voies est une reference
   
-------------------------------------------------------------------------------
Q1 - Reconnaissance des unites de base

1.1 - Analyseur lexical seul (lex11.flex)
   Pour chaque valeur reconnue, faire une impression de controle du type [C:V],
   C categorie et V valeur. Signaler tout autre element X (non separateur).
   
1.2 - Analyseur combine (lex12.flex, gram12.bison)
   L'analyseur lexical retourne les categories a l'analyseur syntaxique, qui reconnait une suite
   de categories lexicales, dans n'importe quel ordre, avec impression de controle pour chacune 
   

II - GROUPES : paires attribut-valeur (P.A.V.), listes - Pour cette question, se placer dans un sous-repertoire Groups - Fichier de test fourni : q2.data. Utiliser les noms lex2X.flex, gram2X.bison... Une P.A.V. est de la forme nom_attribut '=' valeur. Une P.A.V. peut apparaitre separement, auquel cas la valeur est encadree entre '"'. Pour certains attributs, la valeur possible est une liste entre '"' : . listes de paires d'entiers EX: points="108 62, 90 10, 70 45, 50 10, 32 62" . listes d'appels de fonctions EX: transform="scale(-1,1) translate(-140 0)" Enfin certains attributs (par exemple style) ont pour valeurs des listes de PAV : chacune delimitee par ';', la liste etant encadree entre '"'. Dans tous les cas, le niveau lexical passera successivement chaque categorie lexicale au niveau syntaxique, qui reconnaitra l'ensemble 2 - ANALYSEUR COMBINE lexical + syntaxique (sans passage de valeurs) - Analyseur lexical : doit passer les caracteres maintenant necessaires : ',' '"' etc... - Modifier l'analyseur syntaxique pour reconnaitre successivement chaque groupe possible (ci-dessous) avec impression de controle. Une fonction de "pause" sera utile. L'analyseur lexical devrait provoquer une erreur syntaxique a chaque caractere non reconnu (mais ne pas chercher a "recuperer" des erreurs d'analyse : si l'analyseur s'arrete, on sait qu'il faut corriger l'entree a cet endroit, ou/et la grammaire) Q2 - Groupements : elaboration progressive d'un analyseur 2.1 - Reconnaitre les listes auxiliaires : - les "IntList", liste d'INTs (au moins un), separes par des virgules - les "IntPair", soit 2 entiers successifs separes par un ou des espaces - les IntPairList, liste de (au moins 1) IntPair's separees par des virgules 2.2 - Reconnaitre les "SeparateAttrVal" : paires attribut-valeur definies separement (cad. en dehors d'un "style"), de la forme : nom_attribut '=' '"' valeur '"' Se limiter aux cas stroke et fill, ou la valeur est une COLOR. Exemple : fill="#339933" 2.3 - Reconnaitre les appels de fonction : - les "FuncCall", appel de fonction (nom alphanumerique quelqonque) a arguments entiers, avec 2 variantes selon la liste d'arguments : soit une IntList, soit une IntPair - les "FuncCallList", listes de FuncCall separes par des espaces 2.4 - P.A.V. particulieres impliquant des listes : - "PointList", de la forme points="....", le contenu entre '"' etant une IntPairList. - "Transform", de la forme transform="..." le contenu entre '"' etant une FuncCallList 2.5 - Paires attribut-valeurs groupees en "style". Reconnaitre ; - les "AttrValue", paire attribut-valeur de la forme XX ':' YYY ';' - les "AttrValueList", suite de AttrValue's separees par des espaces [sans verification de doublon, etc] - les "Style", de la forme : style="....." le contenu entre '"' etant une AttrValueList
III - ANALYSE DU CODE SVG D'UN GRAPHISME - Pour cette question 3, se placer dans un sous-repertoire Drawing - Utiliser les noms lex3X.flex, gram3X.bison... Exemple de fichier de test : q3.data. En ajoutant progressivement des categories lexicales et regles syntaxiques, on peut arriver ou presque a traiter un exemple SVG complet (fichier q3.data). Indications : a) balises ou paires de balises "simples" </g> </svg> <title>...</title> <desc>...<desc>. Reconnaitre chacune entierement au niveau lexical, comme occurence de nouvelles categories a creer : G_END, SVG_END, TITLE, DESC b) balises "complexes" : <g...> <svg...> <circle...> <line...> <polyline...> A traiter comme plusieurs unites lexicales, successivement passees au niveau syntaxique, qui aura a reconnaitre l'ensemble b1 - analyseur lexical : - reconnaitre seulement leur fragment "ouvrant" comme une nouvelle categorie, p. ex. <g comme G_BEG, <svg comme SVG_BEG, <circle comme CIRC_OP ... - pour les fragments "fermants" de ces balises, reconnaitre aussi une categorie : pour ">", la categorie peut-etre '>' lui-meme pour "/>" definir une categorie, p.ex appelee TAG_CL - pour le contenu de la balise, creer de nouvelles categories lexicales pour les mots-cle qui peuvent y figurer. Par exemple : pour la balise <svg...> reconnaitre width et passer la categorie WIDTH ... pour la balise <circ...> reconnaitre cx et passer la categorie CX ... b2 - analyseur syntaxique . ajouter des variantes a la regle SeparateAttrValue . ajouter une regle pour reconnaitre chaque balise complexe dans son ensemble --------------------------------------------------------------------------------- Q3 Elaboration progressive (On ne demande pas de reconnaitre une forme syntaxique complete de "groupe" mais seulement ses balises debut et fin) Q3.1 - Balises simples : - analyseur lexical seul lex31S.flex - analyseur combine lex31C.flex gram31C.bison Q3.2 - Balises <svg...> <circle...> <line...> et leur contenu Q3.4 - Balises <use...> <polyline...> avec leur contenu