Soit Σ un ensemble fini de symboles non vides, appelé alphabet . Alors Σ * est l’ensemble infini dénombrable de mots finis qui peuvent être formés en concaténant zéro ou plusieurs symboles de. Tout sous-ensemble bien défini L * est un langage .
Appliquons ceci à XML. Son alphabet est le jeu de caractères Unicode U , qui est non vide et fini. Toute concaténation de zéro ou de plusieurs caractères Unicode n’est pas un document XML bien formé, par exemple, la chaîne
<tag> soup &; not <//good>
est clairement pas. Le sous-ensemble XML ⊂ U * qui forme des documents XML bien formés est décidable (ou «récursif»). Il existe une machine (algorithme ou programme informatique) qui prend en entrée n'importe quel mot w ∈ U * et après un laps de temps fini, renvoie 1 si w ∈ XML et 0 sinon. Un tel algorithme est une sous-routine de tout logiciel de traitement XML. Toutes les langues ne sont pas décidables. Par exemple, l’ensemble des programmes C valides qui se terminent dans un laps de temps déterminé n’est pas (c’est ce que l’on appelle le problème d’arrêt). Lorsque l’on conçoit une nouvelle langue, il est important de décider si elle doit être aussi puissante que possible ou si l’expressivité serait mieux restreinte en faveur de la décidabilité.
Certaines langues peuvent être définies à l'aide d'une grammaire dite productrice . Une grammaire comprend
- un ensemble fini de littéraux (également appelés symboles terminaux ),
- un ensemble fini disjoint de variables de la grammaire (également appelé symboles non terminaux ),
- un symbole de départ distingué , tiré de l'ensemble des variables et
- un ensemble fini de règles (dites productions ) autorisant certains types de remplacement.
Tout mot composé exclusivement de littéraux et pouvant être dérivé en commençant par le symbole de départ, puis en appliquant les règles données, appartient à la langue produite par la grammaire.
Par exemple, la grammaire suivante (en notation plutôt informelle) vous permet de dériver exactement les entiers en notation décimale.
- Les littéraux de la grammaire sont les chiffres
1
, 2
, 3
, 4
, 5
, 6
, 7
, 8
, 9
et 0
.
- Les variables sont les symboles S et D .
- S est le symbole de départ.
- Toute occurrence de la variable S peut être remplacée
- avec le littéral
0
ou
- par l' un des littéraux autres que
0
suivie par la variable D .
- Toute occurrence de la variable D peut être remplacée
- par l'un des littéraux suivi d'une autre instance de la variable D ou
- par la chaîne vide.
Voici comment nous dérivons 42
:
S - (applique la règle 4, 2 ème variante) → 4
D - (applique la règle 5, 1 re variante) → 42
D - (applique la règle 5, 2 ème variante) → 42
.
Selon les règles élaborées que vous autorisez dans votre grammaire, des machines sophistiquées différentes sont nécessaires pour prouver qu'un mot donné peut réellement être produit par la grammaire. L'exemple donné ci-dessus est une grammaire régulière , la plus simple et la moins puissante. La prochaine classe puissante de grammaires s'appelle sans contexte . Ces grammaires sont également très simples à vérifier. XML (à moins que j'ignore une fonction obscure dont je ne suis pas au courant) peut être décrit par une grammaire sans contexte. La classification des grammaires forme la hiérarchie de Chomsky des grammaires (et donc des langues). Toute langue pouvant être décrite par une grammaire est au moins semi-décidable(ou "récursivement énumérable"). C'est-à-dire qu'il existe une machine qui, étant donné un mot qui appartient réellement à la langue, tire la preuve qu'elle peut être produite par la grammaire en un temps fini et ne produira jamais une preuve fausse. Une telle machine s'appelle un vérificateur . Notez que la machine peut ne jamais s'arrêter quand on vous donne un mot qui n'appartient pas réellement à la langue. Il est clair que nous souhaitons que nos langages de programmation soient décrits par des grammaires moins puissantes, afin de pouvoir rejeter les programmes non valides dans un temps fini.
Les schémas sont un ajout au XML qui permet d'affiner l'ensemble des documents bien formés. Un document bien formé qui suit un certain schéma est appelé valide en fonction de ce schéma. Par exemple, la chaîne
<?xml version="1.0" encoding="utf-8" ?>
<root>all evil</root>
est un document XML bien formé mais pas un document XHTML valide. Il existe des schémas pour XHTML , SVG , XSLT et quoi encore. La validation de schéma peut également être effectuée par un algorithme dont l’arrêt après chaque étape est limité pour chaque entrée. Un tel programme s'appelle un validateur ou un analyseur de validation. Les schémas sont définis par les langages de définition de scema , qui permettent de définir formellement les grammaires. XSD est le langage officiel de définition de schéma pour XML et est lui-même basé sur XML. RELAX NG est une alternative plus élégante, beaucoup plus simple et légèrement moins puissante que XSD.
Comme vous pouvez définir vos propres schémas, XML est appelé un langage extensible , qui est l’origine du «X» dans «XML».
Vous pouvez définir un ensemble de règles donnant une interprétation aux documents XML sous forme de descriptions de programmes informatiques. XSLT, mentionné précédemment, est un exemple d'un tel langage de programmation construit avec XML. Plus généralement, vous pouvez sérialiser l'arborescence de syntaxe abstraite de presque tous les langages de programmation en XML, si vous le souhaitez.