Sia Σ un insieme di simboli finito non vuoto, chiamato alfabeto . Quindi Σ * è l'insieme infinito numerabile di parole finite che può essere formato concatenando zero o più simboli da Σ. Qualsiasi sottoinsieme ben definito L ⊆ Σ * è una lingua .
Appliciamo questo a XML. Il suo alfabeto è il set di caratteri Unicode U , che è non vuoto e finito. Non tutte le concatenazioni di zero o più caratteri Unicode sono un documento XML ben formato, ad esempio la stringa
<tag> soup &; not <//good>
chiaramente non lo è. Il sottoinsieme XML ⊂ U * che forma documenti XML ben formati è decidibile (o "ricorsivo"). Esiste una macchina (algoritmo o programma per computer) che accetta come input qualsiasi parola w ∈ U * e dopo un tempo limitato, genera 1 se w ∈ XML e 0 altrimenti. Tale algoritmo è una sub-routine di qualsiasi software di elaborazione XML. Non tutte le lingue sono decidibili. Ad esempio, l'insieme di programmi C validi che terminano in un tempo limitato, non lo è (questo è noto come problema di arresto). Quando si progetta un nuovo linguaggio, una decisione importante da prendere è se dovrebbe essere il più potente possibile o se l'espressività sarebbe meglio essere limitata a favore della decidibilità.
Alcune lingue possono essere definite mediante una grammatica che si dice produca la lingua. Una grammatica è composta da
- un insieme finito di letterali (chiamati anche simboli terminali ),
- un insieme finito disgiunto di variabili della grammatica (chiamato anche simboli non terminali ),
- un distinto simbolo iniziale , preso dall'insieme di variabili e
- un insieme finito di regole (le cosiddette produzioni ) che consentono determinati tipi di sostituzioni.
Qualsiasi parola che consiste esclusivamente di letterali e può essere derivata iniziando con il simbolo iniziale e quindi applicando le regole date appartiene alla lingua prodotta dalla grammatica.
Ad esempio, la seguente grammatica (in notazione piuttosto informale) consente di derivare esattamente gli interi in notazione decimale.
- I letterali della grammatica sono le cifre
1
, 2
, 3
, 4
, 5
, 6
, 7
, 8
, 9
, e 0
.
- Le variabili sono i simboli S e D .
- S è il simbolo iniziale.
- Qualsiasi occorrenza della variabile S può essere sostituita
- con il letterale
0
o
- da qualsiasi letterali diversi
0
seguita dalla variabile D .
- Qualsiasi occorrenza della variabile D può essere sostituita
- da uno qualsiasi dei letterali seguito da un'altra istanza della variabile D o
- dalla stringa vuota.
Ecco come deriviamo 42
:
S - (applicare regola 4, 2 ° variante) → 4
D - (applicare regola 5, 1 st variante) → 42
D - (applicare regola 5, 2 nd variante) → 42
.
A seconda di come regole elaborate consentite nella vostra grammatica, sono necessarie macchine diversamente sofisticate per dimostrare che una determinata parola può effettivamente essere prodotta dalla grammatica. L'esempio sopra riportato è una grammatica regolare , che è la più semplice e meno potente. La prossima potente classe di grammatiche è chiamata senza contesto . Queste grammatiche sono anche molto semplici da verificare. XML (a meno che non stia trascurando alcune funzionalità oscure di cui non sono a conoscenza) può essere descritto da una grammatica senza contesto. La classificazione delle grammatiche costituisce la Gerarchia delle grammatiche di Chomsky (e quindi le lingue). Ogni lingua che può essere descritta da una grammatica è almeno semi-decidibile(o "ricorsivamente enumerabile"). Cioè, esiste una macchina che, data una parola che appartiene effettivamente alla lingua, deriva una prova che può essere prodotta dalla grammatica entro un tempo finito e non produrrà mai una prova sbagliata. Tale macchina si chiama verificatore . Si noti che la macchina potrebbe non arrestarsi mai quando viene data una parola che non appartiene alla lingua. Chiaramente, vogliamo che i nostri linguaggi di programmazione siano descritti da grammatiche meno potenti a beneficio della possibilità di rifiutare programmi non validi entro un tempo limitato.
Gli schemi sono un'aggiunta a XML che consente di perfezionare l'insieme di documenti ben formati. Un documento ben formato che segue un determinato schema viene chiamato valido secondo tale schema. Ad esempio, la stringa
<?xml version="1.0" encoding="utf-8" ?>
<root>all evil</root>
è un documento XML ben formato ma non un documento XHTML valido. Esistono schemi per XHTML , SVG , XSLT e cos'altro. La convalida dello schema può anche essere eseguita da un algoritmo che è garantito per arrestarsi dopo una quantità finita di passaggi per ogni input. Tale programma è chiamato validatore o parser di validazione. Gli schemi sono definiti dai cosiddetti linguaggi di definizione scema , che sono un modo per definire formalmente le grammatiche. XSD è il linguaggio ufficiale di definizione dello schema per XML ed è esso stesso basato su XML. RELAX NG è un'alternativa più elegante, molto più semplice e leggermente meno potente a XSD.
Poiché è possibile definire i propri schemi, XML è chiamato un linguaggio estensibile , che è l'origine della "X" in "XML".
È possibile definire un insieme di regole che dia ai documenti XML un'interpretazione come descrizioni di programmi per computer. XSLT, menzionato in precedenza, è un esempio di tale linguaggio di programmazione creato con XML. Più in generale, è possibile serializzare l'albero di sintassi astratto di quasi tutti i linguaggi di programmazione in modo abbastanza naturale in XML, se questo è ciò che si desidera.