Sei Σ eine nicht leere, endliche Menge von Symbolen, die als Alphabet bezeichnet wird . Dann ist Σ * die abzählbare unendliche Menge von endlichen Wörtern, die durch Verketten von null oder mehr Symbolen aus Σ gebildet werden können. Jede genau definierte Teilmenge L ⊆ ⊆ * ist eine Sprache .
Wenden wir dies auf XML an. Sein Alphabet ist der Unicode- Zeichensatz U , der nicht leer und endlich ist. Nicht jede Verkettung von null oder mehr Unicode-Zeichen ist ein wohlgeformtes XML-Dokument, beispielsweise die Zeichenfolge
<tag> soup &; not <//good>
ist eindeutig nicht. Die Teilmenge XML ⊂ U *, die wohlgeformte XML- Dokumente bildet, ist entscheidbar (oder „rekursiv“). Es gibt eine Maschine (Algorithmus oder Computerprogramm), die ein beliebiges Wort w ∈ U * als Eingabe verwendet und nach einer begrenzten Zeit entweder 1 ausgibt, wenn w ∈ XML ist, oder 0, wenn nicht. Ein solcher Algorithmus ist eine Subroutine jeder XML-Verarbeitungssoftware. Nicht alle Sprachen sind entscheidbar. Zum Beispiel ist die Menge der gültigen C-Programme, die in einer begrenzten Zeitspanne enden, nicht (dies wird als Stopp-Problem bezeichnet)). Wenn man eine neue Sprache entwirft, ist es wichtig zu entscheiden, ob sie so mächtig wie möglich sein soll oder ob die Ausdruckskraft zugunsten der Entscheidbarkeit eingeschränkt werden soll.
Einige Sprachen können mit Hilfe einer Grammatik definiert werden , die die Sprache hervorbringen soll . Eine Grammatik besteht aus
- eine endliche Menge von Literalen (auch Terminalsymbole genannt ),
- eine disjunkte endliche Menge von Variablen der Grammatik (auch nicht-terminale Symbole genannt),
- ein unterschiedliches Startsymbol aus dem Satz von Variablen und
- ein endliches Regelwerk (sogenannte Produktionen ), das bestimmte Arten von Ersetzungen zulässt.
Jedes Wort, das ausschließlich aus Literalen besteht und abgeleitet werden kann, indem man mit dem Startsymbol beginnt und dann die angegebenen Regeln anwendet, gehört zu der Sprache, die von der Grammatik erzeugt wird.
Mit der folgenden Grammatik (in eher informeller Notation) können Sie beispielsweise genau die Ganzzahlen in Dezimalnotation ableiten.
- Die Literale der Grammatik sind die Ziffern
1
, 2
, 3
, 4
, 5
, 6
, 7
, 8
, 9
, und 0
.
- Die Variablen sind die Symbole S und D .
- S ist das Startsymbol.
- Jedes Auftreten der Variablen S kann ersetzt werden
- mit dem wörtlichen
0
oder
- durch eines der anderen Literale als
0
durch die Variable D gefolgt .
- Jedes Auftreten der Variablen D kann ersetzt werden
- von einem der Literale gefolgt von einer anderen Instanz der Variablen D oder
- durch die leere Zeichenfolge.
So leiten wir ab 42
:
S - (Regel 4 gilt, 2 nd Variante) → 4
D - (gilt Regel 5, 1 st Variante) → 42
D - (Regel 5 gilt, 2 nd Variante) → 42
.
Je nachdem, wie ausgefeilte Regeln Sie in Ihrer Grammatik zulassen, sind unterschiedlich ausgefeilte Maschinen erforderlich, um zu beweisen, dass ein bestimmtes Wort tatsächlich von der Grammatik erzeugt werden kann. Das obige Beispiel ist eine reguläre Grammatik, die am einfachsten und am wenigsten mächtig ist. Die nächste mächtige Klasse von Grammatiken heißt kontextfrei . Diese Grammatiken sind auch sehr einfach zu überprüfen. XML kann durch eine kontextfreie Grammatik beschrieben werden (es sei denn, ich übersehe eine unbekannte Funktion, die mir nicht bekannt ist). Die Klassifikation der Grammatiken bildet die Chomsky-Hierarchie der Grammatiken (und damit der Sprachen). Jede Sprache, die durch eine Grammatik beschrieben werden kann, ist zumindest halbentscheidbar(oder "rekursiv aufzählbar"). Das heißt, es gibt eine Maschine, die angesichts eines Wortes, das tatsächlich zur Sprache gehört, einen Beweis herleitet, dass es von der Grammatik innerhalb einer begrenzten Zeit erzeugt werden kann, und niemals einen falschen Beweis ausgibt. Eine solche Maschine wird als Verifizierer bezeichnet . Beachten Sie, dass die Maschine möglicherweise nie anhält, wenn ein Wort eingegeben wird, das nicht zur Sprache gehört. Natürlich möchten wir, dass unsere Programmiersprachen durch weniger leistungsfähige Grammatiken beschrieben werden, damit ungültige Programme innerhalb einer begrenzten Zeit abgelehnt werden können.
Schemata sind eine Ergänzung zu XML, mit der sich die wohlgeformten Dokumente verfeinern lassen. Ein wohlgeformtes Dokument, das einem bestimmten Schema folgt, wird gemäß diesem Schema als gültig bezeichnet . Zum Beispiel die Zeichenfolge
<?xml version="1.0" encoding="utf-8" ?>
<root>all evil</root>
ist ein wohlgeformtes XML-Dokument, aber kein gültiges XHTML-Dokument. Es gibt Schemata für XHTML , SVG , XSLT und was nicht. Die Schemaüberprüfung kann auch durch einen Algorithmus erfolgen, der bei jeder Eingabe nach einer begrenzten Anzahl von Schritten angehalten wird. Ein solches Programm wird Validator oder Validierungsparser genannt. Schemata werden durch sogenannte Scema-Definitionssprachen definiert , die eine Möglichkeit darstellen, Grammatiken formal zu definieren. XSD ist die offizielle Schemadefinitionssprache für XML und selbst XML-basiert. RELAX NG ist eine elegantere, viel einfachere und etwas weniger leistungsstarke Alternative zu XSD.
Da Sie Ihre eigenen Schemata definieren können, wird XML als erweiterbare Sprache bezeichnet. Dies ist der Ursprung des "X" in "XML".
Sie können einen Regelsatz definieren, der XML-Dokumenten eine Interpretation als Beschreibung von Computerprogrammen gibt. Das bereits erwähnte XSLT ist ein Beispiel für eine solche mit XML erstellte Programmiersprache. Im Allgemeinen können Sie den abstrakten Syntaxbaum fast jeder Programmiersprache ganz natürlich in XML serialisieren, wenn Sie dies möchten.