Implémentation dun parseur validant pour YML/DML Travail de Master Présentation finale Catherine...

Post on 04-Apr-2015

103 views 0 download

Transcript of Implémentation dun parseur validant pour YML/DML Travail de Master Présentation finale Catherine...

Implémentation d’un parseur validant pour YML/DML

Travail de MasterPrésentation finale

Catherine Pugin21 avril 2005

catherine.pugin@unifr.ch

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é : &eacute;• 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 !