570 likes | 652 Views
Implémentation d’un parseur validant pour YML/DML. Travail de Master Présentation finale Catherine Pugin 21 avril 2005 catherine.pugin@unifr.ch. Plan. Introduction générale Rappel sur les langages YML et DML Aspects théoriques de la validation Conception du parseur
E N D
Implémentation d’un parseur validant pour YML/DML Travail de Master Présentation finale Catherine Pugin 21 avril 2005 catherine.pugin@unifr.ch
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
Introduction générale (1) • Projet YML+ • Révision des langages de la famille XML.
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.
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 -->
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"=>
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é.
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.
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="é"=>
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] "=>
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=>
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.
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.
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 2 1 child-1 child-2
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.
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
ConceptionArchitecture générale Document YML Parseur conformant Modèle DML principal Parseur conformant Trois phases de validation
ConceptionValidation en trois phases • Traitement du document DML • Création des automates • Validation de l’instance YML
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.
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. Modèle DML principal <=import prefix="per" uri="person.dml"=> Instance YML <=yml:dml uri="movie.dml"=> <=yml:dml prefix="person" uri="person.dml"=>
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.
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.
Traitement du DMLRéférencement <=eltref name="director" ref="per:person"=> <=elt name="person"> <=elt name="director"> id per:id firstName familyName per:firstName per:familyName
Traitement du DMLRésultat <=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=> <=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=> <=root> <=struct> <=structref ref="yml:prolog"=> <=eltref name="movie" ref="movie-ref"=> <struct=> <root=>
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]"=>
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.
0 1 0 1 0 1 0 1 Création des automatesAutomates simples • 4 automates simples pour chacune des 4 occurrences (once, optional, many, free). ONCE OPTIONAL FREE MANY
Création des automatesIllustration (1) <=elt name="element"=> <=struct occurs="many"=> <=choice=> <=elt name="fils1"=> <=elt name="fils2"=> <=elt name="fils3"=>
0 1 Création des automatesIllustration (2) fils1
Création des automatesIllustration (3) <=elt name="element"=> <=struct occurs="many"=> <=choice=> <=elt name="fils1"=> <=elt name="fils2"=> <=elt name="fils3"=>
2 4 3 5 Création des automatesIllustration (4) fils2 fils3
Création des automatesIllustration (5) <=elt name="element"=> <=struct occurs="many"=> <=choice=> <=elt name="fils1"=> <=elt name="fils2"=> <=elt name="fils3"=>
Création des automatesIllustration (6) fils2 2 3 6 4 5 fils3
Création des automatesIllustration (7) <=elt name="element"=> <=struct occurs="many"=> <=choice=> <=elt name="fils1"=> <=elt name="fils2"=> <=elt name="fils3"=>
Création des automatesIllustration (8) null fils2 3 fils1 6 1 0 5 fils3 null
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=> per:firstName 0 0 3 1 textNode = true per:familyName
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
ConceptionRécupération des données (1) • Les attributs sont également stockés dans une table. <=attrs> <=attr name="per:id" type="int" use="required"=> <attrs=>
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="é"=>
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. <=elt name="element"> <=text type="text-type"=> <elt=>
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
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.
Validation Illustration (1) <=movie> <=title>[Star Wars]<title=> <=director person:id="1"> <=person:firstName>[Georges]<person:firstName=> <=person:familyName>[Lucas]<person:familyName=> <director=> <movie=> • Choix de l’automate : état courant = 0. 3 0 1 title director
Validation Illustration (2) <=movie> <=title>[Star Wars]<title=> <=director person:id="1"> <=person:firstName>[Georges]<person:firstName=> <=person:familyName>[Lucas]<person:familyName=> <director=> <movie=> • Itération sur les nœuds fils. • L’élément title est accepté par l’automate. 3 0 1 title director
Validation Illustration (3) <=movie> <=title>[Star Wars]<title=> <=director person:id="1"> <=person:firstName>[Georges]<person:firstName=> <=person:familyName>[Lucas]<person:familyName=> <director=> <movie=> • L’élément director est accepté par l’automate. 3 0 1 title director
Validation Illustration (4) <=movie> <=title>[Star Wars]<title=> <=director person:id="1"> <=person:firstName>[Georges]<person:firstName=> <=person:familyName>[Lucas]<person:familyName=> <director=> <movie=> • Validation des attributs. • Modification du préfixe : person:id -> per:id • Recherche de l’attribut dans la table.
Validation Illustration (5) <=movie> <=title>[Star Wars]<title=> <=director person:id="1"> <=person:firstName>[Georges]<person:firstName=> <=person:familyName>[Lucas]<person:familyName=> <director=> <movie=> • Validation des attributs. • Vérification de la valeur de l’attribut • [0-9] -> 1
Validation Illustration (6) <=movie> <=title>[Star Wars]<title=> <=director person:id="1"> <=person:firstName>[Georges]<person:firstName=> <=person:familyName>[Lucas]<person:familyName=> <director=> <movie=> • Validation du sous-arbre • Modification des préfixes • person:firstName -> per:firstName • person:familyName -> per:familyName per:firstName 0 3 1 per:familyName
Validation Illustration (7) <=movie> <=title>[Star Wars]<title=> <=director person:id="1"> <=person:firstName>[Georges]<person:firstName=> <=person:familyName>[Lucas]<person:familyName=> <director=> <movie=> • L’état courant est terminal. Le sous-arbre est accepté. 3 0 2 title director
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.