Introduction
Lorem ipsum
Grammaire Simplifiée
Voici une grammaire simplifiée en notation EBNF
pour le sous-ensemble de YAML que nous allons considérer:
document ::= element+
element ::= sequence | mapping | scalar
sequence ::= "-" [space] scalar
mapping ::= scalar ":" [space] scalar
scalar ::= [a-zA-Z0-9]+
space ::= " "
Cette grammaire permet de représenter des documents YAML contenant des scalaires simples, des séquences et des mappages sans imbrication.
Construction de l’Automate à Pile
Un automate à pile (AP) est défini par les éléments suivants:
- Q: ensemble fini d’états
- Σ: alphabet d’entrée (symboles du langage)
- Γ: alphabet de pile (symboles utilisés dans la pile)
- δ: fonction de transition (Q×(Σ∪{ϵ})×Γ→Q×Γ∗)
- q0: état initial
- Z0: symbole initial de pile
- F: ensemble d’états acceptants
États (Q)
Nous définirons les états suivants:
- q0: État initial
- qscalar: Lecture d’un scalaire
- qsequence: Lecture d’une séquence
- qmapping: Lecture d’un mapping
- qaccept : État acceptant
Alphabet d’Entrée (Σ)
Les symboles d’entrée seront:
-
: indique le début d’un élément de séquence
:
: Séparateur clé-valeur dans un mapping
[a-zA-Z0-9]
: Caractères alphanumériques pour les scalaires
: Espace
Alphabet de Pile (Γ)
Les symboles de pile seront:
- Z0: Symbole initial de pile
- S: Indique que nous sommes en train de lire une séquence
- M: Indique que nous sommes en train de lire un mapping
État Initial et État Acceptant
- État initial (q0): q0
- Symbole initial de pile (Z0): Z0
- États acceptants (F): {qaccept}
Fonction de Transition (δ)
Nous allons définir les transitions de l’automate en fonction de l’état actuel, du symbole d’entrée, et du sommet de la pile.
Transitions
-
Début du document
- (q0,ϵ,Z0)→(q0,Z0)
-
Lecture d’un scalaire
- (q0,caracteˋre,X)→(qscalar,X)
- (qscalar,caracteˋre,X)→(qscalar,X)
- (qscalar,ϵ,X)→(qaccept,X)
-
Lecture d’une séquence
- (q0,−,X)→(qsequence,SX)
- (qsequence,’ ’,S)→(qsequence,S)
- (qsequence,caracteˋre,S)→(qscalar,S)
- (qscalar,caracteˋre,S)→(qscalar,S)
- (qscalar,ϵ,S)→(qsequence,S)
- (qsequence,−,S)→(qsequence,S)
- (qsequence,ϵ,S)→(qaccept,X)
-
Lecture d’un mapping
- (q0,caracteˋre,X)→(qmapping,MX)
- (qmapping,caracteˋre,M)→(qmapping,M)
- (qmapping,’:’,M)→(qmapping,M)
- (qmapping,’ ’,M)→(qmapping,M)
- (qmapping,caracteˋre,M)→(qscalar,M)
- (qscalar,caracteˋre,M)→(qscalar,M)
- (qscalar,ϵ,M)→(qaccept,X)
Explications
- (q0,−,X)→(qsequence,SX): Lorsqu’on lit un
-
, on passe à l’état de séquence et on empile S
pour indiquer que nous sommes dans une séquence.
- (qsequence,”,S)→(qsequence,S): On ingore les espaces après
-
.
- (qsequence,caracteˋres,S)→(qscalar,S): Après le
-
, on attend un scalaire.
- (qscalaire,ϵ,S)→(qsequence,S): Après avoir lu un scalaire dans une séquence, on peut revenir à l’état de séquence pour éventuellement lire un autre élément.
- (qsequence,−,S)→(qsequence,S): On peut lire un autre
-
pour un nouvel élément de séquence.
- (qsequence,ϵ,S)→(qaccept,X): Si on a fini de lire la séquence on dépile
S
et on passe à l’état acceptant.
Pour le mapping, c’est similaire mais avec le symbole M
pour indiquer qu’on est dans un mapping.
Exemple de Fonctionnement
Prenons le document YAML simplifié suivant:
- apple
- banana
Étapes de traitement
- État initial: (q0, Entrée = ”- apple - banana”, Pile = [Z0])
- Lecture du
-
- Transition: (q0,−,Z0)→(qsequence,SZ0)
- Pile: [S,Z0]
- Entrée restante:
apple - banana
- Lecture de l’espace
- Transition: (qsequence,”,S)→(qsequence,S)
- Pile: [S,Z0]
- Entrée restante:
apple - banana
- Lecture du scalaire
apple
- Transition : (qsequence,a,S)→(qscalar,S)
- Continue de lire les caractères ‘p’, ‘p’, ‘l’, ‘e’ en restant dans qscalar.
- Pile : [S,Z0]
- Entrée restante :
- banana