implémentation dun parseur validant pour yml/dml travail de master présentation finale catherine...
TRANSCRIPT
Implémentation d’un parseur validant pour YML/DML
Travail de MasterPrésentation finale
Catherine Pugin21 avril 2005
2
Plan
Introduction générale Rappel sur les langages YML et DML Aspects théoriques de la validation Conception du parseur Tests et gestion des erreurs Conclusion générale
3
Introduction générale (1)
Projet YML+ Révision des langages de la famille XML.
4
Introduction générale (2) Situation du projet
Révision du langage XML et des langages de modélisation (DTD / XML Schema).
Création du langage YML et du langage de modélisation DML.
Adaptation du parseur Xerces pour tester la conformité des documents.
Implémentation d’un parseur conformant spécifique aux langages YML et DML.
Implémentation du parseur validant spécifique.
5
Le langage YML (1) Critiques adressées à XML
Nœuds textes• <element>
du texte sur deux lignes
<element/> Balises
• Asymétrie : <element> <element/>• Balises complexes :
• Entité : é• Commentaire : <!-- commentaire -->
6
Le langage YML (2) Solutions apportées par YML
Balises symétriques• <=element> <element=> / <=element=>• <* commentaire *>• {entité}
Nœuds textes clairs• <=element>
[un texte][un texte]#
<element=> Relation entre instance et modèle simplifiée
• <=yml:dml uri="modele.dml"=>
7
Le langage DML (1)
Critique des DTD Syntaxe non-XML. Aucune possibilité de typage. Mauvaise définition du contenu mixte.
Critique de XML Schema Manque de simplicité.
8
Le langage DML (2) Objectifs du langage DML
Syntaxe simple, basée sur YML. Meilleure définition du contenu mixte Minimum de types prédéfinis
• Un seul type prédéfini : string• Possibilité de définir ses propres types.
Favoriser la modularité. Écrire un méta-modèle, un DML auto-
descriptif.
9
Un exemple simple (1)movie.dml
<* déclarations préliminaires *>
<=yml:decl version="1.0" encoding="UTF-8"=> <=yml:dml uri="ymldml.dml"=> <=import prefix="yml" uri="yml.dml"=> <=import prefix="per" uri="person.dml"=>
<* racine du document *>
<=root> <=struct> <=structref ref="yml:prolog"=> <=eltref name="movie" ref="movie-ref"=> <struct=><root=>
<* définitions *>
<=elt name="movie-ref" occurs="many"> <=struct> <=elt name="title"> <=text=> <elt=> <=eltref name="director" ref="per:person"=> <struct=><elt=><=entity name="eacute" value="é"=>
10
Un exemple simple (2)person.dml
<=yml:decl version="1.0" encoding="UTF-8"=><=yml:dml uri="ymldml.dml"=> <=import prefix="yml" uri="yml.dml"=>
<=elt name="person"> <=attrs> <=attr name="id" type="int" use="required"=> <attrs=> <=struct> <=elt name="firstName"> <=text=> <elt=> <=elt name="familyName"> <=text=> <elt=> <struct=><elt=>
<=type name="int" pattern=" [0-9] "=>
11
Un exemple simple (3)movie.yml
<=yml:decl version="1.0" encoding="UTF-8"=>
<* définition de l'espace de nommage du modèle *> <=yml:dml uri="movie.dml"=> <=yml:dml prefix="person" uri="person.dml"=>
<=movie> <=title>[Star Wars]<title=> <=director person:id="1"> <=person:firstName>[Georges]<person:firstName=> <=person:familyName>[Lucas]<person:familyName=> <director=> <movie=>
<=movie> <=title>[Indiana Jones]<title=> <=director person:id="2"> <=person:firstName>[Steven]<person:firstName=> <=person:familyName>[Spielberg]<person:familyName=> <director=> <movie=>
12
La validation (1) Aspects théoriques
DML = langage formel. Les lettres de son alphabet sont les valeurs
des attributs name des déclarations d’élément.<=elt name="movie"=>
Un document DML peut donc être représenté par une grammaire d’arbre et à partir de là par un automate d’arbre.
13
La validation (2) L’implémentation des automates d’arbres est
relativement complexe. On utilise donc à la place une hiérarchie
d’automates déterministes à états finis. Un automate est construit pour chaque
déclaration d’élément <=elt=> et pour la déclaration de la racine <=root=>.
Il représente le sous-arbre de la déclaration qui s’étend jusqu’aux premières déclarations d’élément.
14
La validation (3) Un automate est décrit par
<Q, Σ, δ, q0, F>
<=elt name="element"> <=struct> <=elt name="child-1"=> <=elt name="child-2"=> <struct=><elt=>
Q = {0,1,2}
Σ = {child-1, child-2}
δ = 0 x child-1 -> 1 ; 1 x child-2 -> 2
q0 = 0;
F = {2}
0 1
child-1
2
child-2
15
La validation (4)
L’instance YML est le mot qui doit être accepté par l’ensemble des automates.
Chaque automate accepte un sous-mot, une partie de l’instance.
Quand tous les sous-mots sont acceptés, l’instance est validée.
16
Conception Informations nécessaires
Quelles sont les informations utiles dans un document DML ? Séquence et occurrence des éléments Attributs associés à chaque élément Types définis Entités définies Importations
17
ConceptionArchitecture générale
Document
YMLParseur conformant
Modèle DML principal
Trois phases de validation
Parseur conformant
18
ConceptionValidation en trois phases
Traitement du document DML Création des automates Validation de l’instance YML
19
ConceptionPhase 1 : Traitement du DML
But : récupération des informations contenues dans les documents importés. Référencement d’élément, de structure,
d’attributs. Définitions de types, d’entités.
Gestion des préfixes. Construction d’un arbre complet à partir
de la racine root.
20
Traitement du DMLCorrespondance entre préfixes (1)
Les documents importés dans le modèle principal doivent être définis comme espaces de nommage dans l’instance.
Instance YML
<=yml:dml uri="movie.dml"=>
<=yml:dml prefix="person" uri="person.dml"=>
Modèle DML principal
<=import prefix="per" uri="person.dml"=>
21
Traitement du DMLCorrespondance entre préfixes (2)
Les préfixes ne sont pas obligatoirement les mêmes.
Il faut garder une table de correspondance entre les préfixes.
Préfixe YML Préfixe DML URI
person per person.dml
22
Traitement du DMLRéférencement Les référencements concernent :
Les structures Les listes d’attributs Les éléments
Quand on rencontre une déclaration de type <=structref=>, <=attrsref=> ou <=eltref=>, il faut la remplacer par la définition correspondante.
La correspondance se fait entre l’attribut ref de la déclaration appelante et l’attribut name de la définition.
23
Traitement du DMLRéférencement
<=eltref name="director" ref="per:person"=>
<=elt name="person">
per:firstName per:familyName
firstName familyName
id
per:id
<=elt name="director">
24
<=root> <=struct> <=structref ref="yml:prolog"=> <=elt name="movie"> <=struct> <=elt name="title"><=text=><elt=> <=elt name="director"> <=attrs> <=attr name="per:id" type="int" use="required"=> <attrs=> <=struct> <=elt name="per:firstName"><=text=><elt=> <=elt name="per:familyName"><=text=><elt=> <struct=> <elt=> <struct=> <elt=> <struct=><root=>
Traitement du DMLRésultat
<=root> <=struct> <=structref ref="yml:prolog"=> <=eltref name="movie" ref="movie-ref"=><struct=><root=>
<=root> <=struct> <=structref ref="yml:prolog"=> <=elt name="movie"> <=struct> <=elt name="title"><=text=><elt=> <=eltref name="director" ref="per:person"=> <struct=> <elt=> <struct=><root=>
25
Traitement du DMLTypes
<=attrs>
<=attr name="id" type="int" use="required"=>
<=attr name="id2" type="yml:string" use="implied"=>
<attrs=>
…
<=type name="int" pattern="[0-9]"=>
Name Pattern
int [0-9]
yml:string \w*
26
ConceptionPhase 2 : Création des automates
But : représentation de la séquentialité et de l’occurrence des déclarations d’éléments.
Un automate est construit pour chaque déclaration <=elt=>. Il représente le sous-arbre de l’élément, qui s’étend jusqu’aux premières déclarations d’élément.
Construction récursive des automates.
27
Création des automatesAutomates simples
4 automates simples pour chacune des 4 occurrences (once, optional, many, free).
0 1
0 1
0 1
0 1
ONCE OPTIONAL
MANY FREE
28
Création des automatesIllustration (1)
<=elt name="element"=>
<=elt name="fils2"=> <=elt name="fils3"=>
<=choice=>
<=struct occurs="many"=>
<=elt name="fils1"=>
29
Création des automatesIllustration (2)
0 1
fils1
30
Création des automatesIllustration (3)
<=elt name="element"=>
<=elt name="fils2"=> <=elt name="fils3"=>
<=choice=>
<=struct occurs="many"=>
<=elt name="fils1"=>
31
Création des automatesIllustration (4)
2 3
fils2
4 5
fils3
32
Création des automatesIllustration (5)
<=elt name="element"=>
<=elt name="fils2"=> <=elt name="fils3"=>
<=choice=>
<=struct occurs="many"=>
<=elt name="fils1"=>
33
Création des automatesIllustration (6)
2 3
fils2
4 5
fils3
6
34
Création des automatesIllustration (7)
<=elt name="element"=>
<=elt name="fils2"=> <=elt name="fils3"=>
<=choice=>
<=struct occurs="many"=>
<=elt name="fils1"=>
35
Création des automatesIllustration (8)
3fils2
5fils3
0 1
fils1
null
null
6
36
Création des automatesApplication à l’exemple
<=elt name="director"> <=attrs> <=attr name="per:id" type="int" use="required"=> <attrs=> <=struct> <=elt name="per:firstName"><=text=><elt=> <=elt name="per:familyName"><=text=><elt=> <struct=><elt=>
0 1
per:firstName
3
per:familyName
0textNode = true
37
Création des automates
Les automates sont stockés dans une table avec : Le nom de l’élément qu’ils représentent. Le nom du père de cet élément.
0
Nom de l’élément Nom du père Automate
per:firstName director
38
ConceptionRécupération des données (1)
Les attributs sont également stockés dans une table.
Nom de l’attribut
Nom de l’élément
Nom de l’élément père
Type Pattern Utilisation
per:id director movie int [0-9] required
<=attrs> <=attr name="per:id" type="int" use="required"=><attrs=>
39
ConceptionRécupération des données (2)
Les entités définies dans le DML principal sont stockées dans une table.
<=entity name="eacute" value="é"=>
Nom de l’entité Valeur
eacute é
40
ConceptionRécupération des données (3)
Les nœuds textes peuvent être typés. On stocke dans une table l’élément père du
nœud texte et le type.
Nom de l’élément Type du texte
element text-type
<=elt name="element"> <=text type="text-type"=><elt=>
41
ConceptionPhase 3 : Validation
Pour la validation de l’instance, nous disposons : des automates des différentes tables
• Attributs• Entités• Correspondance entre les préfixes• Nœuds textes
42
Validation Généralités
Le parcours de l’arbre YML se fait de manière top-down.
Pour chaque noeud : Choix de l’automate correspondant. Itération sur les fils du nœud. Modification du préfixe si nécessaire. Validation de l’élément. Validation des attributs.
43
Validation Illustration (1)
Choix de l’automate : état courant = 0.
<=movie> <=title>[Star Wars]<title=> <=director person:id="1"> <=person:firstName>[Georges]<person:firstName=> <=person:familyName>[Lucas]<person:familyName=> <director=> <movie=>
0 1
title
3
director
44
Validation Illustration (2)
Itération sur les nœuds fils. L’élément title est accepté par l’automate.
<=movie> <=title>[Star Wars]<title=> <=director person:id="1"> <=person:firstName>[Georges]<person:firstName=> <=person:familyName>[Lucas]<person:familyName=> <director=> <movie=>
0 1
title
3
director
45
Validation Illustration (3)
L’élément director est accepté par l’automate.
<=movie> <=title>[Star Wars]<title=> <=director person:id="1"> <=person:firstName>[Georges]<person:firstName=> <=person:familyName>[Lucas]<person:familyName=> <director=> <movie=>
0 1
title
3
director
46
Validation Illustration (4)
Validation des attributs. Modification du préfixe : person:id -> per:id Recherche de l’attribut dans la table.
<=movie> <=title>[Star Wars]<title=> <=director person:id="1"> <=person:firstName>[Georges]<person:firstName=> <=person:familyName>[Lucas]<person:familyName=> <director=> <movie=>
per:id director movie int [0-9] required
47
Validation Illustration (5)
Validation des attributs. Vérification de la valeur de l’attribut [0-9] -> 1
<=movie> <=title>[Star Wars]<title=> <=director person:id="1"> <=person:firstName>[Georges]<person:firstName=> <=person:familyName>[Lucas]<person:familyName=> <director=> <movie=>
per:id director movie int [0-9] required
48
<=movie> <=title>[Star Wars]<title=> <=director person:id="1"> <=person:firstName>[Georges]<person:firstName=> <=person:familyName>[Lucas]<person:familyName=> <director=> <movie=>
Validation Illustration (6)
Validation du sous-arbre Modification des préfixes
• person:firstName
-> per:firstName• person:familyName
-> per:familyName
0 1
per:firstName
3
per:familyName
49
Validation Illustration (7)
L’état courant est terminal. Le sous-arbre est accepté.
<=movie> <=title>[Star Wars]<title=> <=director person:id="1"> <=person:firstName>[Georges]<person:firstName=> <=person:familyName>[Lucas]<person:familyName=> <director=> <movie=>
0 2
title
3
director
50
Implémentation en 2 mots
Implémentation en Java. Utilisation de l’API JDOM. Quelques adaptations sont nécessaires :
Nœud root supérieur : YML_ROOT. Séquence -- interdite dans les
commentaires. Output XML.
51
Gestion des erreurs
2 gestions des erreurs possibles : Arrêt à la première erreur Lors d’une erreur, on remonte d’un niveau et
on continue la validation sur les frères. La seconde solution a été choisie.
Vision globale du document.
52
Tests Une base de test a été créée spécialement pour
le parseur. Elle comporte une série d’applications YML
pour tester les différentes erreurs possibles. Une application complète et réaliste traitant de
la Formule 1 en fait également partie. Créée initialement en XML et XML Schema. Traduite et adaptée aux langages YML et DML.
53
Tests (erreurs)
La difficulté de tester un parseur validant vient du fait qu’il faut répertorier toutes les erreurs possibles.
Une très bonne connaissance du DML est donc indispensable.
54
Conclusion générale (1) Des modifications ont été apportées au DML en
cours de route afin de rendre le méta-modèle déterministe.
On a ainsi pu constater la simplicité d’adaptation du parseur.
On peut donc valider une instance par rapport à son modèle DML, ou un modèle DML par rapport au méta-modèle de la même manière.
55
Conclusion générale (2)
Des améliorations sont encore envisageables pour le parseur : Meilleure gestion des préfixes. Meilleure localisation des automates. Meilleure relation entre les 2 parseurs.
Les versions futures des langages YML et DML entraîneront bien évidemment des modifications pour les deux parseurs.
56
Conclusion générale (3)
Malgré ces remarques, la combinaison des deux parseurs rend les langages YML et DML complètement fonctionnels.
Ils répondent complètement à l’utilisation requise actuellement qui est la validation des instances et des modèles.
57
Merci de votre attention !