[2] XML はその構文の定義に EBNF を使っています。 その EBNF の構文と意味も XML の仕様書に説明があります。
仕様書:
記号 ::= 式
:
右辺で左辺を定義します。記号名は右辺が正規言語を定義するなら大文字、
そうでないなら小文字から始めます。実際の XML 1
で定義されている生成規則の中では、 content
(要素の内容) など入れ子な構造があり得る部分で正規言語になっていません。
XML 1.0 の仕様書では、記号の前に四角括弧で囲んだ式番号がつけられています。
また、右辺の式で他の記号を参照する時にはリンクになっています。#xN
: ISO/IEC 10646 で符号位置が
16進数で N
の文字を表します。
先導0は無視します。[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
を採用している場合に、
この XML の Char
の範囲における文字の範囲であるという規定が
(無自覚に) 無視されている可能性もあって、要注意です。
[60] 之以前に指摘されたことあるのだろうか? 見たことがない。 XMLは出版から20年以上たってるのにまだまだ十分理解されていないってことか (闇が深い)。
"..."
, '...'
:
終端文字列表記です。引用符で囲まれた部分がそのままです。
XML 1.0 仕様書では中身で使われる引用符でない方を使い、
どちらも使わない時はアポストロフィを採用しているようです。(式)
: 集団化。A B
: A の後に B。A | B
: A または B。A - B
: A に一致するものの B
には一致しないもの。A?
: 省略可能。A*
: 零個以上。|
よりも優先します。A+
: 一個以上。|
よりも優先します。/* ... */
: 注釈。[ wfc: ... ]
: 整形式制約。
実際には第1版から一貫して [WFC: ...]
になっています。[ vc: ... ]
: 妥当性制約。
実際には第1版から一貫して [VC: ...]
になっています。なお、一般に大文字・小文字は区別されるようです (特に規定はありません)。
XML 1 の仕様書の構文の規定は文書型定義における引数実体参照が表現されていません (自然言語による規定のみ)。この他構文で表現されない (できない) 制約は整形式制約、妥当性制約、その他の自然言語による規定になっています。
なお、 XML の EBNF を採用しているとしている仕様書で
WFC
や VC
を使っているものは現時点で XML
本体以外には存在しません。
[4] XML 自体の仕様書や他の関連仕様の仕様書は元々 XMLspec で記述されています。 XMLspec にはこの XML 式 EBNF を記述するための語彙があります。とは言っても、 >>3 のような構造を記述する語彙ではなく、式の右辺と左辺や注釈や他の記号の参照をマークするだけの語彙です。 HTML 版の仕様書ではこのマークに基づき式番号やリンクなどが生成されます。
詳しくは XMLspecのEBNF の項を参照してください。
[11] 記号名が小文字から始まる変種: WebCGM は EBNF を使うとしながら詳細は説明していませんが、 実際には XML 1.0 と同じものが使われているようです。 ただし記号名はすべて小文字から始まっています。 なお、第1版には文字列終端で一部引用符で括られていませんが、 第2版では修正されています。 (詳しくはWebCGMのEBNFの項を参照してください。)
SOAP 1.2 第2部は XML 1.0 SE の EBNF を使うとしていますが、記号名がすべて小文字から始まっています。
なお、 SOAP 1.2 第2部では間隔が含まれる記号名がありますが、 右辺値で使われる時は間隔は入っていないので、 単なるミスと思われます。
[24] SVG Tiny 1.2 は ISO/IEC 14977:1996 を引用していますが、 「XML 1.0 の部分集合を使っています」などとわけのわからないことを言っています。
[5] XML 名前空間の変種:
XML名前空間 1.0 と XML名前空間 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)
の規則を参照していますし、やはりすべて大文字で始まる記号名です。
仕様書:
xmlns()
element()
xpointer()
[9] RDF/XML の変種: RDF の1999年版仕様では、 RDF/XML の構文が XML 1.0 初版の EBNF により定義されていました。とはいっても規則名の大文字・ 小文字の区別についての規定は無視しているようですし、 規則の右辺が英語の説明の直書きで定義されている規則もあります。 直書きではなく丸括弧 (...) で囲んであるものもあります。
RDF/XML の構文はこの仕様書で EBNF で定義されてはいますが、 そこでは正確に表現されない XML や XML名前空間の仕様における規定も適用されると説明があります。 特に名前空間接頭辞は自由であることを示すために斜体で表示されるようにマークされています。
仕様書:
[8] RDF/N-Triples の変種: RDF 試験事例仕様書で N-Triples の定義に使われているのは XML 1.0 第2版の EBNF と説明がありますが、実際には規則名がすべて小文字で始まりますし、 右辺が英語の説明の直書きで定義されている規則もあります。
仕様書:
[9] SRGS の変種: SRGS は ABNF 形 (自然言語の文法記述のための書式で、名前の通り BNF の一種ですが、 XML の EBNF のような計算機言語の構文記述のための書式ではありません。) の定義のために XML 1.0 の EBNF を使っています。
もとが XML 系仕様書のような XMLspec によるマーク付けされた EBNF
ではないので、 HTML 版仕様書のマーク付け上はかなり違っています。
また、式番号がついていません。整形式制約などの代わりに
Additional Constraints
として追加の制約が英語で記述されています。
仕様書の中で構文が規定されている附属書の前半は字句文法として基本的な字句が定義されています。 これに該当する規則の名前は大文字から始まっています。また、 ここでは規則の定義がそのまま解釈されると説明されています。 一方で残りの構文的文法の部分の規則の名前は小文字から始まっています。 また、字句解釈結果の構文として記述されており、 字句間に挿入できる空白や注釈は省略されています。
仕様書:
[22] SMIL1 の変種: SMIL 1.0 仕様書は XML 1.0 の EBNF の定義を参照していますが、 実際には逸脱があります。
id-ref
)。;
~改行という形で表します。
;
の前には多くの場合空白が来ますが、来ないこともあります。2DIGIT
)。[
~]
を使っていることがあります仕様書:
[12] SMIL2 の変種: SMIL 2.1仕様書はXML 1.1のEBNFの定義を参照していますが、 実際には多少の逸脱があります。
HYPHEN-MINUS
が含まれていることがあります。
右辺では差演算子に使われているので、
空白に囲まれているかの差異があるとは言え、多少の曖昧性が生じます。SEMICOLON
からはじまる、注釈らしきものが含まれた生成規則があります。
しかもそのSEMICOLON
の前は空白なしで右辺と続いています。[23] SMIL 3.0 ではなんとなおっています! 違反ではない次の3つは残っています。
HYPHEN-MINUS
が含まれていることがあります。
右辺では差演算子に使われているので、
空白に囲まれているかの差異があるとは言え、多少の曖昧性が生じます。仕様書:
[13] DC-Text の変種: DC-Text の構文は XML 1.0 の EBNF を使って定義されていることになっていますが、 実際には次の差異があります:
仕様書:
[14] WS-Topics の変種
WS-Topics 1.3 は、式の構文のために XML 1.0 の EBNF を採用しています。
形式的に記述できない要件を指定するために、 [ vc: ...]
という書式を用いています。 (XML の仕様書では ...
は妥当性制約の名前ですが、この仕様書では制約そのものの文章です。)
終端記号の後に ?
をつけるとき、
(
と)
でくくってから?
をつけた例と、
くくらずにつけている例が混在しています。
仕様書:
[15] XQuery 1.0 / XPath 2.0 の変種
XQuery 1.0 / XPath 2.0 は冒頭で XML 1.0 の EBNF を使うといいながら、附属書 A で完全に EBNF を定義しています。ほとんど XML 1.0 と同じことを繰り返しているだけですが、 いくつか違いがあります:
[uri]
という構文があります。/* type:constraint-id */
のような注釈があります。[n (spec)]
のように出典・分類を添えています。Char
の定義は文字クラスらしきものが括弧なしで表われますが、
typo でしょうか。[61] LBRY というプロトコルの仕様書はなぜか XQuery の EBNF を使っています。
[26] SML 1.1 仕様書は RFC 2234のABNF を採用していると記述されていますが、実際には XMLのEBNF を使っています。
[27] 「変種」といえるかは微妙ですが、記号名に「.
」を含めている例があります。
[28] XSPARQL は XQuery の構文の規定をベースに変更を加えていますが、 変更を加えた非終端記号には末尾に「'」をつけて区別しています。
[37] InkML の仕様書では XML の EBNF を使うとしつつも同じものを独自に説明しています。
また、 wsp
の自由な挿入を認めています。
[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