[2] [[XML]] はその構文の定義に [[EBNF]] を使っています。 その EBNF の構文と意味も XML の仕様書に説明があります。 仕様書: - [[XML]] 1 -- [CSECTION[6 Notation]] [[#comment]] * 構文と意味 [3] -[CODE[[VAR[記号]] ::= [VAR[式]]]]: 右辺で左辺を定義します。記号名は右辺が[[正規言語]]を定義するなら[[大文字]]、 そうでないなら[[小文字]]から始めます。実際の XML 1 で定義されている生成規則の中では、 [CODE[content]] ([[要素]]の[[内容]]) など[[入れ子]]な構造があり得る部分で正規言語になっていません。 XML 1.0 の仕様書では、記号の前に四角括弧で囲んだ式番号がつけられています。 また、右辺の式で他の記号を参照する時にはリンクになっています。 -[CODE[#x[VAR[N]]]]: [[ISO/IEC 10646]] で[[符号位置]]が 16進数で [CODE[[VAR[N]]]] の[[文字]]を表します。 [[先導0]]は無視します。 -[CODE['''['''[VAR[...]]''']''']]: 一般的な[[正規表現]]のように、文字の種類を指定します。 [SAMP['''['''A-Z''']''']] や [SAMP['''['''#x20-#x7E''']''']] のような範囲 (境界を含みます。) の指定、 [SAMP['''['''ABC''']''']] のような列挙による指定、両者の混合が使えます。範囲は何個でも含められます。 XML 1.0 の仕様書で使われている範囲では、範囲を先に、 列挙を後にしています。開き括弧の直後に [CODE(char)[-]] という文字を列挙として指定した使用例もありますし、 [CODE[|]] を使って [CODE['-']] にだけ分けているものもあります。 また、先頭に [CODE[^]] を付けると否定の意味になります。 この文字の種類の指定は生成規則 [CODE[[[Char]]]] の中の文字から選んだり除外したりするのだと説明されていますが、 その [CODE[Char]] も四角括弧による指定が使われているので、 定義が再帰的になってしまっています。なお、 XML 1.0 第3版や XML 1.1 の参考でも文字の範囲の指定に四角括弧が使われていますが、 そこで [CODE[#x]] が欠落していて、正誤表で訂正されています。 -[CODE["[VAR[...]]"]], [CODE['[VAR[...]]']]: [[終端]]文字列表記です。引用符で囲まれた部分がそのままです。 XML 1.0 仕様書では中身で使われる引用符でない方を使い、 どちらも使わない時はアポストロフィを採用しているようです。 -[CODE[([VAR[式]])]]: 集団化。 -[CODE[[VAR[A]] [VAR[B]]]]: [VAR[A]] の後に [VAR[B]]。 -[CODE[[VAR[A]] | [VAR[B]]]]: [VAR[A]] または [VAR[B]]。 -[CODE[[VAR[A]] - [VAR[B]]]]: [VAR[A]] に一致するものの [VAR[B]] には一致しないもの。 -[CODE[[VAR[A]]?]]: 省略可能。 -[CODE[[VAR[A]]*]]: 零個以上。[CODE[|]] よりも優先します。 -[CODE[[VAR[A]]+]]: 一個以上。[CODE[|]] よりも優先します。 -[CODE[/* [VAR[...]] */]]: [[注釈]]。 -[CODE['''[''' wfc: [VAR[...]] ''']''']]: [[整形式制約]]。 実際には第1版から一貫して [CODE['''['''WFC: [VAR[...]]''']''']] になっています。 -[CODE['''[''' vc: [VAR[...]] ''']''']]: [[妥当性制約]]。 実際には第1版から一貫して [CODE['''['''VC: [VAR[...]]''']''']] になっています。 なお、一般に大文字・小文字は区別されるようです [WEAK[(特に規定はありません)]]。 XML 1 の仕様書の構文の規定は[[文書型定義]]における[[引数実体参照]]が表現されていません (自然言語による規定のみ)。この他構文で表現されない (できない) 制約は整形式制約、妥当性制約、その他の自然言語による規定になっています。 [[#comment]] * 採用例 [10] [[XML 1.0]] の定義を採用している仕様書: - [[XML 1.0]] および [[XML 1.1]] -[CITE[Associating Style Sheets with XML documents]] ([[XML 1.0]] [[SE]] を参照。) なお、 [[XML]] の [[EBNF]] を採用しているとしている仕様書で [Q[WFC]] や [Q[VC]] を使っているものは現時点で [[XML]] 本体以外には存在しません。 [[#comment]] * XML 表現 [4] [[XML]] 自体の仕様書や他の関連仕様の仕様書は元々 [[XMLspec]] で記述されています。 [[XMLspec]] にはこの [[XML]] 式 [[EBNF]] を記述するための語彙があります。とは言っても、 >>3 のような構造を記述する語彙ではなく、式の右辺と左辺や注釈や他の記号の参照をマークするだけの語彙です。 [[HTML]] 版の仕様書ではこのマークに基づき式番号やリンクなどが生成されます。 [[#comment]] * 変種 [11] '''記号名が小文字から始まる変種''': [[WebCGM]] は [[EBNF]] を使うとしながら詳細は説明していませんが、 実際には [[XML 1.0]] と同じものが使われているようです。 ただし記号名はすべて小文字から始まっています。 なお、第1版には文字列終端で一部引用符で括られていませんが、 第2版では修正されています。 [[SOAP 1.2]] 第2部は [[XML 1.0]] [[SE]] の [[EBNF]] を使うとしていますが、記号名がすべて小文字から始まっています。 なお、 SOAP 1.2 第2部では[[間隔]]が含まれる記号名がありますが、 右辺値で使われる時は[[間隔]]は入っていないので、 単なるミスと思われます。 - [[SOAP 1.2]] 第2部 --[CSECTION[1.1 Notational Conventions]] - [[WebCGM]] -- 第1版: [CITE[WebCGM Intelligent Content]] -- 第2版: [CITE[WebCGM Intelligent Content]] [5] '''XML 名前空間の変種''': [[XML名前空間 1.0]] と [[XML名前空間 1.1]] は明記していませんが同じ EBNF を使っています。 XML の [Q[WFC]] および [Q[WFC]] の代わりに、 [Q[NSC]] ([[名前空間制約]]) の注記があります。 仕様書: -[[XML名前空間 1.0]] --[CSECTION[1.1 A Note on Notation and Usage]] -[[XML名前空間 1.1]] --[CSECTION[1.1 A Note on Notation and Usage]] [1] '''XPath 1.0 の変種''': [[XPath 1.0]] の仕様書で使われている生成規則の文法は、 XML の EBNF と同じですが、 [[非終端]]の名前は必ず大文字から始まることになっています。 XPath 1.0 の仕様書の構文の規定は[[字句化]]した結果について表されていて、 実際には字句間に[[空白]]が挿入できます。 また、構文によって[[演算子]]の優先度が表現されています。 [[XSLT 1]] も同じ EBNF を使っていると思われますが、明記されていません。 仕様書: - [[XPath 1.0]] --[CSECTION[1 Introduction]] - [[XSLT 1]] --[CSECTION[5.2 Patterns]] [6] '''XML Scheme の変種''': [[XML Schema]] 第2部では [CODE(XML)[[[base64Binary]]]] の定義に XML 1.0 第2版の EBNF を使っています。 また、[[正規表現]]の定義にも同じ EBNF のようなものを使っていますが、こちらはその式が何なのかの説明がありません [WEAK[(同じく XML 1.0 の EBNF なのでしょうが)]]。 [[Base64]] の方の記号名の最初の文字はすべて大文字で、 実際[[正規言語]]でもありました。正規表現の方の記号名はどうやら正規言語か否かとは関係が無く、 非終端だけで定義されていれば大文字から始まり、 それ以外であれば小文字から始まるようです。 ただし大文字から始まる記号ばかりの選択として定義されている [CODE[IsCategory]] は大文字から始まっています。 仕様書: - [[XML Schema]] 第2部 データ型 -- [7] '''XPointer の変種''': [[XPointer]] 仕様書は XML 1.0 第2版の EBNF を使っているといっていますが、 そのうちの枠組み仕様書は文字の範囲指定で [CODE[Char]] を逸脱していますし、 [[正規言語]]か否かに関わらず記号名はすべて大文字で始まっています。 [CODE(XPointerScheme)[[[xpointer]]()]] scheme も XML の EBNF を使っているといっていますが、 XPath 1.0 (>>1) の規則を参照していますし、やはりすべて大文字で始まる記号名です。 仕様書: - [[XPointer]] 枠組み -- [CSECTION[1.1 Notation]] - [[XPointer]] [CODE(XPointerScheme)[[[xmlns]]()]] --[CSECTION[1 Introduction]] - [[XPointer]] [CODE(XPointerScheme)[[[element]]()]] --[CSECTION[1 Introduction]] -[[XPointer]] [CODE(XPointerScheme)[[[xpointer]]()]] --[CSECTION[1.2 Notation and Document Conventions]] [9] '''RDF/XML の変種''': [[RDF]] の1999年版仕様では、 [[RDF/XML]] の構文が XML 1.0 初版の EBNF により定義されていました。とはいっても規則名の大文字・ 小文字の区別についての規定は無視しているようですし、 規則の右辺が[[英語]]の説明の直書きで定義されている規則もあります。 直書きではなく丸括弧 [SAMP[([VAR[...]])]] で囲んであるものもあります。 [[RDF/XML]] の構文はこの仕様書で EBNF で定義されてはいますが、 そこでは正確に表現されない [[XML]] や [[XML名前空間]]の仕様における規定も適用されると説明があります。 特に[[名前空間接頭辞]]は自由であることを示すために[[斜体]]で表示されるようにマークされています。 仕様書: - [[RDF]] (1999年版仕様) --[CSECTION[2. Basic RDF]] [8] '''RDF/N-Triples の変種''': [[RDF]] 試験事例仕様書で [[N-Triples]] の定義に使われているのは XML 1.0 第2版の EBNF と説明がありますが、実際には規則名がすべて小文字で始まりますし、 右辺が[[英語]]の説明の直書きで定義されている規則もあります。 仕様書: - [[RDF]] 試験事例 --[CSECTION[3.1. Extended Backus-Naur Form (EBNF) Grammar]] [9] '''SRGS の変種''': [[SRGS]] は [[ABNF]] 形 [WEAK[(自然言語の文法記述のための書式で、名前の通り [[BNF]] の一種ですが、 XML の EBNF のような計算機言語の構文記述のための書式ではありません。)]] の定義のために XML 1.0 の EBNF を使っています。 もとが XML 系仕様書のような [[XMLspec]] によるマーク付けされた EBNF ではないので、 HTML 版仕様書のマーク付け上はかなり違っています。 また、式番号がついていません。整形式制約などの代わりに [Q[Additional Constraints]] として追加の制約が[[英語]]で記述されています。 仕様書の中で構文が規定されている附属書の前半は字句文法として基本的な字句が定義されています。 これに該当する規則の名前は大文字から始まっています。また、 ここでは規則の定義がそのまま解釈されると説明されています。 一方で残りの構文的文法の部分の規則の名前は小文字から始まっています。 また、字句解釈結果の構文として記述されており、 字句間に挿入できる[[空白]]や[[注釈]]は省略されています。 仕様書: -[[SRGS]] --[CSECTION[Appendix D: Formal Syntax for Augmented BNF Form Grammars]] [[#comment]] * メモ