XMLのEBNF

XMLのEBNF

[2] XML はその構文の定義に EBNF を使っています。 その EBNF の構文と意味も XML の仕様書に説明があります。

仕様書:

構文と意味

[3]


[55] 一般的な正規表現のように、文字の種類を指定します。 [A-Z][#x20-#x7E] のような範囲 (境界を含みます。) の指定、 [ABC] のような列挙による指定、両者の混合が使えます。範囲は何個でも含められます。 XML 1.0 の仕様書で使われている範囲では、範囲を先に、 列挙を後にしています。開き括弧の直後に - という文字を列挙として指定した使用例もありますし、 | を使って '-' にだけ分けているものもあります。 また、先頭に ^ を付けると否定の意味になります。

[56] この文字の種類の指定は生成規則 Char の中の文字から選んだり除外したりするのだと説明されていますが、 その Char も四角括弧による指定が使われているので、 定義が再帰的になってしまっています。

[57] なお、 XML 1.0 第3版や XML 1.1 の参考でも文字の範囲の指定に四角括弧が使われていますが、 そこで #x が欠落していて、正誤表で訂正されています。

[58] XML 以外の仕様書XMLのEBNF を採用している場合に、 この XMLChar の範囲における文字の範囲であるという規定が (無自覚に) 無視されている可能性もあって、要注意です。

にその件が指摘されている。

[60] 之以前に指摘されたことあるのだろうか? 見たことがない。 XMLは出版から20年以上たってるのにまだまだ十分理解されていないってことか (闇が深い)。


なお、一般に大文字・小文字は区別されるようです (特に規定はありません)

XML 1 の仕様書の構文の規定は文書型定義における引数実体参照が表現されていません (自然言語による規定のみ)。この他構文で表現されない (できない) 制約は整形式制約、妥当性制約、その他の自然言語による規定になっています。

採用例

[10] XML 1.0 の定義を採用している仕様書:

なお、 XMLEBNF を採用しているとしている仕様書で WFCVC を使っているものは現時点で XML 本体以外には存在しません。

XML 表現

[4] XML 自体の仕様書や他の関連仕様の仕様書は元々 XMLspec で記述されています。 XMLspec にはこの XMLEBNF を記述するための語彙があります。とは言っても、 >>3 のような構造を記述する語彙ではなく、式の右辺と左辺や注釈や他の記号の参照をマークするだけの語彙です。 HTML 版の仕様書ではこのマークに基づき式番号やリンクなどが生成されます。

詳しくは XMLspecのEBNF の項を参照してください。

変種

[11] 記号名が小文字から始まる変種: WebCGMEBNF を使うとしながら詳細は説明していませんが、 実際には XML 1.0 と同じものが使われているようです。 ただし記号名はすべて小文字から始まっています。 なお、第1版には文字列終端で一部引用符で括られていませんが、 第2版では修正されています。 (詳しくはWebCGMのEBNFの項を参照してください。)

SOAP 1.2 第2部は XML 1.0 SEEBNF を使うとしていますが、記号名がすべて小文字から始まっています。

なお、 SOAP 1.2 第2部では間隔が含まれる記号名がありますが、 右辺値で使われる時は間隔は入っていないので、 単なるミスと思われます。

[24] SVG Tiny 1.2ISO/IEC 14977:1996 を引用していますが、 「XML 1.0 の部分集合を使っています」などとわけのわからないことを言っています。

それなら 14977 引用する必要ないじゃん

[25]

[5] XML 名前空間の変種: XML名前空間 1.0XML名前空間 1.1 は明記していませんが同じ EBNF を使っています。 XML の WFC および WFC の代わりに、 NSC (名前空間制約) の注記があります。

仕様書:

[1] XPath 1.0 の変種: XPath 1.0 の仕様書で使われている生成規則の文法は、 XML の EBNF と同じですが、 非終端の名前は必ず大文字から始まることになっています。

XPath 1.0 の仕様書の構文の規定は字句化した結果について表されていて、 実際には字句間に空白が挿入できます。 また、構文によって演算子の優先度が表現されています。

XSLT 1 も同じ EBNF を使っていると思われますが、明記されていません。

仕様書:

[6] XML Scheme の変種: XML Schema 第2部では base64Binary の定義に XML 1.0 第2版の EBNF を使っています。

また、正規表現の定義にも同じ EBNF のようなものを使っていますが、こちらはその式が何なのかの説明がありません (同じく XML 1.0 の EBNF なのでしょうが)Base64 の方の記号名の最初の文字はすべて大文字で、 実際正規言語でもありました。正規表現の方の記号名はどうやら正規言語か否かとは関係が無く、 非終端だけで定義されていれば大文字から始まり、 それ以外であれば小文字から始まるようです。 ただし大文字から始まる記号ばかりの選択として定義されている IsCategory は大文字から始まっています。

仕様書:

[7] XPointer の変種: XPointer 仕様書は XML 1.0 第2版の EBNF を使っているといっていますが、 そのうちの枠組み仕様書は文字の範囲指定で Char を逸脱していますし、 正規言語か否かに関わらず記号名はすべて大文字で始まっています。 xpointer() scheme も XML の EBNF を使っているといっていますが、 XPath 1.0 (>>1) の規則を参照していますし、やはりすべて大文字で始まる記号名です。

仕様書:

[9] RDF/XML の変種: RDF の1999年版仕様では、 RDF/XML の構文が XML 1.0 初版の EBNF により定義されていました。とはいっても規則名の大文字・ 小文字の区別についての規定は無視しているようですし、 規則の右辺が英語の説明の直書きで定義されている規則もあります。 直書きではなく丸括弧 (...) で囲んであるものもあります。

RDF/XML の構文はこの仕様書で EBNF で定義されてはいますが、 そこでは正確に表現されない XMLXML名前空間の仕様における規定も適用されると説明があります。 特に名前空間接頭辞は自由であることを示すために斜体で表示されるようにマークされています。

仕様書:

[8] RDF/N-Triples の変種: RDF 試験事例仕様書で N-Triples の定義に使われているのは XML 1.0 第2版の EBNF と説明がありますが、実際には規則名がすべて小文字で始まりますし、 右辺が英語の説明の直書きで定義されている規則もあります。

仕様書:

[9] SRGS の変種: SRGSABNF(自然言語の文法記述のための書式で、名前の通り BNF の一種ですが、 XML の EBNF のような計算機言語の構文記述のための書式ではありません。) の定義のために XML 1.0 の EBNF を使っています。

もとが XML 系仕様書のような XMLspec によるマーク付けされた EBNF ではないので、 HTML 版仕様書のマーク付け上はかなり違っています。 また、式番号がついていません。整形式制約などの代わりに Additional Constraints として追加の制約が英語で記述されています。

仕様書の中で構文が規定されている附属書の前半は字句文法として基本的な字句が定義されています。 これに該当する規則の名前は大文字から始まっています。また、 ここでは規則の定義がそのまま解釈されると説明されています。 一方で残りの構文的文法の部分の規則の名前は小文字から始まっています。 また、字句解釈結果の構文として記述されており、 字句間に挿入できる空白注釈は省略されています。

仕様書:

[22] SMIL1 の変種: SMIL 1.0 仕様書は XML 1.0EBNF の定義を参照していますが、 実際には逸脱があります。

仕様書:

[12] SMIL2 の変種: SMIL 2.1仕様書はXML 1.1EBNFの定義を参照していますが、 実際には多少の逸脱があります。

[23] SMIL 3.0 ではなんとなおっています! 違反ではない次の3つは残っています。

仕様書:

[13] DC-Text の変種: DC-Text構文XML 1.0EBNF を使って定義されていることになっていますが、 実際には次の差異があります:

仕様書:

[14] WS-Topics の変種

WS-Topics 1.3 は、構文のために XML 1.0EBNF を採用しています。

形式的に記述できない要件を指定するために、 [ vc: ...] という書式を用いています。 (XML の仕様書では ...妥当性制約の名前ですが、この仕様書では制約そのものの文章です。)

終端記号引用符にはが用いられています。

終端記号の後に ? をつけるとき、 ()でくくってから?をつけた例と、 くくらずにつけている例が混在しています。

仕様書:

[15] XQuery 1.0 / XPath 2.0 の変種

XQuery 1.0 / XPath 2.0 は冒頭で XML 1.0EBNF を使うといいながら、附属書 A で完全に EBNF を定義しています。ほとんど XML 1.0 と同じことを繰り返しているだけですが、 いくつか違いがあります:

[61] LBRY というプロトコル仕様書はなぜか XQueryEBNF を使っています。

SML の ABNF

[26] SML 1.1 仕様書は RFC 2234のABNF を採用していると記述されていますが、実際には XMLのEBNF を使っています。

[27] 「変種」といえるかは微妙ですが、記号名に「.」を含めている例があります。

仕様書

XSPARQL の変種

[28] XSPARQLXQuery の構文の規定をベースに変更を加えていますが、 変更を加えた非終端記号には末尾に「'」をつけて区別しています。

仕様書

InkML の変種

[37] InkML の仕様書では XMLEBNF を使うとしつつも同じものを独自に説明しています。 また、 wsp の自由な挿入を認めています。

Turtle の変種

[42] Turtle/TriG の仕様書は XMLEBNF を使うとしつつも幾つかの変更を加えています。

  • [43] 生成規則の番号は整数または整数 + 「s」で、「s」がつくものは SPARQL を参照しています。
  • [44] ' で括ったリテラルは大文字・小文字の区別をしますが、 " で括ったリテラルは区別しません。
  • [45] 字句化の際には最長一致とします。
  • [46] 大文字のみの名前は字句化の単位となる終端記号として扱われるものまたはそれ以下の単位、 それ以外の名前はそれ以上の単位として使い分けられています。
  • [47] 字句間の空白注釈EBNF では表現されていません。

メモ

[29] XQuery 1.0 and XPath 2.0 Formal Semantics (Second Edition) ( ( 版)) http://www.w3.org/TR/2010/REC-xquery-semantics-20101214/#sec_grammar_notations

[30] XQuery 1.0 and XPath 2.0 Formal Semantics (Second Edition) ( ( 版)) http://www.w3.org/TR/2010/REC-xquery-semantics-20101214/#sec_core_grammar

[31] XQuery 1.0: An XML Query Language (Second Edition) ( ( 版)) http://www.w3.org/TR/2010/REC-xquery-20101214/#id-introduction

[32] XQuery 1.0: An XML Query Language (Second Edition) ( ( 版)) http://www.w3.org/TR/2010/REC-xquery-20101214/#id-grammar

[33] XML Path Language (XPath) 2.0 (Second Edition) ( ( 版)) http://www.w3.org/TR/2010/REC-xpath20-20101214/#id-introduction

[34] XML Path Language (XPath) 2.0 (Second Edition) ( ( 版)) http://www.w3.org/TR/2010/REC-xpath20-20101214/#id-grammar

[35] Basic Data Types and Interfaces – SVG 1.1 (Second Edition) ( ( 版)) http://www.w3.org/TR/2011/REC-SVG11-20110816/types.html#syntax

[38] W3C XML Schema Definition Language (XSD) 1.1 Part 2: Datatypes ( ( 版)) http://www.w3.org/TR/2012/REC-xmlschema11-2-20120405/#intro-relatedWork

[39] SPARQL 1.1 Query Language ( ( 版)) http://www.w3.org/TR/2013/REC-sparql11-query-20130321/#sparqlGrammar

[40] PROV-N: The Provenance Notation ( ( 版)) http://www.w3.org/TR/2013/REC-prov-n-20130430/#grammar-notation

[51] XQuery 3.1: An XML Query Language () https://www.w3.org/TR/2017/REC-xquery-31-20170321/#id-grammar

[52] XML Path Language (XPath) 3.1 () https://www.w3.org/TR/2017/REC-xpath-31-20170321/#id-grammar

[53] XFA FormCalc Specification, https://www.w3.org/1999/05/XFA/xfa-formcalc-19990614#xtocid867381