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