Σを、アルファベットと呼ばれる、空ではない有限のシンボルセットとします。Σ*は、Σからのゼロ個以上のシンボルを連結することにより形成できる可算無限語の有限集合です。どれでも明確に定義されたサブセットのL ⊆のΣ*がある言語。
これをXMLに適用しましょう。そのアルファベットはUnicode文字セットUで、空ではなく有限です。ゼロ個以上のUnicode文字の連結がすべて、整形式のXMLドキュメントではありません。たとえば、文字列
<tag> soup &; not <//good>
明らかにそうではありません。サブセットXML⊂ U *形成していることがよく形成されたXML文書は、決定可能(または「再帰」)。入力として任意の単語取る機械(アルゴリズム又はコンピュータプログラム)が存在するW ∈ Uを *と有限の時間の後に、場合のいずれかで出力1 ワットさもなければ∈XMLおよび0。このようなアルゴリズムは、XML処理ソフトウェアのサブルーチンです。すべての言語が決定可能というわけではありません。たとえば、有限の時間で終了する有効なCプログラムのセットはそうではありません(これは停止問題として知られています))。新しい言語を設計する場合、重要な決定は、それが可能な限り強力であるべきかどうか、または決定可能性を優先して表現力を制限するかどうかです。
一部の言語は、言語を生成すると言われる文法によって定義できます。文法は
- リテラルの有限セット(終端記号とも呼ばれます)、
- 互いに素有限集合変数(とも呼ばれる文法の非終端記号)、
- 変数のセットから取られた識別可能な開始記号、および
- 特定の種類の置換を許可するルールのセット(いわゆるプロダクション)。
リテラルのみで構成され、開始記号から開始して特定の規則を適用することで派生できる単語は、文法によって生成された言語に属します。
たとえば、次の文法(やや非公式の表記法)を使用すると、整数を正確に10進表記法で導出できます。
- 文法のリテラルは数字です
1
、2
、3
、4
、5
、6
、7
、8
、9
、と0
。
- 変数は、シンボルSおよびDです。
- Sは開始記号です。
- 変数Sの出現はすべて置き換えられます
- リテラル
0
または
0
変数Dが後に続く以外のリテラルのいずれかによって。
- 変数Dの出現はすべて置き換えられます
- リテラルの後に変数Dの別のインスタンスが続く、または
- 空の文字列によって。
導出方法は42
次のとおりです。
S - (適用ルール4、2 番目 →変異体)4
D - (適用ルール5、1 回目の変異体)→ 42
D - (適用ルール5、2 番目の変異体)→ 42
。
文法でどのように複雑な規則を許可するかに応じて、特定の単語が実際に文法によって生成されることを証明するために、高度に異なるマシンが必要です。上記の例は通常の文法であり、最も単純で最も強力ではありません。次の強力な文法クラスは、コンテキストフリーと呼ばれます。これらの文法も検証が非常に簡単です。XML(私が知らないいくつかのあいまいな機能を見落としていない限り)は、文脈自由文法で記述できます。文法の分類は、文法(および言語)のチョムスキー階層を形成します。文法で記述できるすべての言語は、少なくとも半決定的です(または「再帰的に列挙可能」)。つまり、実際にその言語に属する単語が与えられると、有限時間内に文法によって生成できるという証明を導き出し、間違った証明を決して出力しないマシンが存在します。そのようなマシンはベリファイアと呼ばれます。実際に言語に属さない単語が与えられた場合、マシンは決して停止しないことに注意してください。明らかに、限られた時間内に無効なプログラムを拒否できるという利点のために、プログラミング言語をより強力な文法で記述したいのです。
スキーマは、整形式ドキュメントのセットを洗練できるようにするXMLへの追加機能です。特定のスキーマに従う整形式のドキュメントは、そのスキーマに従って有効と呼ばれます。たとえば、文字列
<?xml version="1.0" encoding="utf-8" ?>
<root>all evil</root>
は整形式のXMLドキュメントですが、有効なXHTMLドキュメントではありません。XHTML、SVG、XSLTなどのスキーマがあります。スキーマ検証は、すべての入力に対して有限量のステップの後に停止することが保証されているアルゴリズムによって実行することもできます。このようなプログラムは、バリデーターまたは検証パーサーと呼ばれます。スキーマは、いわゆるスキーマ定義言語によって定義されます。これは、文法を正式に定義する方法です。XSDは、XMLの公式のスキーマ定義言語であり、それ自体がXMLベースです。RELAX NGは、XSDに代わるよりエレガントで、はるかに単純で、やや強力ではありません。
独自のスキーマを定義できるため、XMLは拡張可能言語と呼ばれ、「XML」の「X」の起源です。
XMLドキュメントにコンピュータープログラムの説明としての解釈を与える一連のルールを定義できます。前述のXSLTは、XMLで構築されたこのようなプログラミング言語の例です。より一般的には、必要に応じて、ほとんどすべてのプログラミング言語の抽象構文ツリーを非常に自然にXMLにシリアル化できます。