[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]] を参照。) - [CITE[Authorizing Read Access to XML Content Using the Processing Instruction 1.0]] ([[XML 1.0]] [[TE]] を参照。) なお、 [[XML]] の [[EBNF]] を採用しているとしている仕様書で [Q[WFC]] や [Q[VC]] を使っているものは現時点で [[XML]] 本体以外には存在しません。 [[#comment]] * 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]] の部分集合を使っています」などとわけのわからないことを言っています。 ;; それなら 14977 引用する必要ないじゃん [25] - [[WebCGM]] -- 第1版: [CITE[WebCGM Intelligent Content]] -- 第2版: [CITE[WebCGM Intelligent Content]] - [[SOAP 1.2]] 第2部 -- [CSECTION[1.1 Notational Conventions]] -[CITE[References – SVG Tiny 1.2]] ([TIME[2008-12-20 10:37:51 +09:00]] 版) [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]] [22] '''SMIL1 の変種''': [[SMIL 1.0]] 仕様書は [[XML 1.0]] の [[EBNF]] の定義を参照していますが、 実際には逸脱があります。 - [[正規言語]]を定義しているにも関わらず[[小文字]]から始まる[[生成規則]]があります (例えば [CODE@en[[[id-ref]]]])。 - [[注釈]]は [CODE[[[;]]]]~[[改行]]という形で表します。 [CODE[[[;]]]] の前には多くの場合[[空白]]が来ますが、来ないこともあります。 - [[XML]]では明確に規定されていないので違反とは言えませんが、 先頭文字を[[数字]]にしている[[非終端記号]]があります ([CODE[[[2DIGIT]]]])。 - [[省略可能]]な部分を表すために [[ABNF]] 風に [CODE['''[''']]~[CODE[''']''']] を使っていることがあります 仕様書: -[[SMIL 1.0]] -- [CSECTION@en[1 Specification Approach]] [12] '''SMIL2 の変種''': [[SMIL 2.1]]仕様書は[[XML 1.1]]の[[EBNF]]の定義を参照していますが、 実際には多少の逸脱があります。 - 先頭の文字の[[大文字]]・[[小文字]]と[[正規性]]に関する規定は無視されています。 - [[XML]]では明確に規定されていないので違反とは言えませんが、 先頭文字を[[数字]]にしている[[非終端記号]]があります。 - [[XML]]では明確に規定されていないので違反とは言えませんが、 [[非終端記号]]の[[名前]]に[CODE(charname)@en[[[HYPHEN-MINUS]]]]が含まれていることがあります。 [[右辺]]では[[差]][[演算子]]に使われているので、 [[空白]]に囲まれているかの差異があるとは言え、多少の曖昧性が生じます。 - [CODE(charname)@en[[[SEMICOLON]]]]からはじまる、[[注釈]]らしきものが含まれた[[生成規則]]があります。 しかもその[CODE(charname)@en[[[SEMICOLON]]]]の前は[[空白]]なしで[[右辺]]と続いています。 - 他にも、[[空白]]があってもよさそうな[[字句]]間に[[空白]]がなかったり、 [[出現標識]]を[[非終端記号]]につけるために冗長な[[括弧]]が挟まれていたりしています。 [23] [[SMIL 3.0]] ではなんとなおっています! 違反ではない次の3つは残っています。 - [[XML]]では明確に規定されていないので違反とは言えませんが、 先頭文字を[[数字]]にしている[[非終端記号]]があります。 - [[XML]]では明確に規定されていないので違反とは言えませんが、 [[非終端記号]]の[[名前]]に[CODE(charname)@en[[[HYPHEN-MINUS]]]]が含まれていることがあります。 [[右辺]]では[[差]][[演算子]]に使われているので、 [[空白]]に囲まれているかの差異があるとは言え、多少の曖昧性が生じます。 - 他にも、[[空白]]があってもよさそうな[[字句]]間に[[空白]]がなかったり、 [[出現標識]]を[[非終端記号]]につけるために冗長な[[括弧]]が挟まれていたりしています。 仕様書: - [[SMIL 2.1]] -- - [[SMIL 3.0]] -- [13] '''DC-Text の変種''': [[DC-Text]] の[[構文]]は [[XML 1.0]] の [[EBNF]] を使って定義されていることになっていますが、 実際には次の差異があります: - [CODE@en[#x[VAR[h]]-#x[VAR[h]]]] のような表記 (括弧なし) で[[文字]]の範囲を指定します。 - [[生成規則]]の[[名前]]は常に[[小文字]]からはじめます。 仕様書: - [[DC-Text]] -- [CITE@en[Architecture Working Group - DCText/2006-05-24]] [14] '''WS-Topics の変種''' [[WS-Topics]] 1.3 は、[[式]]の[[構文]]のために [[XML 1.0]] の [[EBNF]] を採用しています。 形式的に記述できない要件を指定するために、 [CODE@en['''[''' vc: [VAR[...]]''']''']] という書式を用いています。 ([[XML]] の仕様書では [VAR[...]] は[[妥当性制約]]の名前ですが、この仕様書では制約そのものの文章です。) [[終端記号]]の[[引用符]]には[CODE[‘]]と[CODE[’]]が用いられています。 [[終端記号]]の後に [CODE[?]] をつけるとき、 [CODE[(]]と[CODE[)]]でくくってから[CODE[?]]をつけた例と、 くくらずにつけている例が混在しています。 仕様書: - [[WS-Topics]] 1.3 [15] '''XQuery 1.0 / XPath 2.0 の変種''' [[XQuery 1.0]] / [[XPath 2.0]] は冒頭で [[XML 1.0]] の [[EBNF]] を使うといいながら、附属書 A で完全に [[EBNF]] を定義しています。ほとんど [[XML 1.0]] と同じことを繰り返しているだけですが、 いくつか違いがあります: -[16] [[XML 1.0]] とは異なり、[[非終端記号]]の[[名前]]の先頭は常に[[大文字]]とします。 -[17] [[非終端記号]]として外部の仕様で定義されているものを[[参照]]するための、[CODE(example syntax)['''['''[VAR@en[uri]]''']''']] という構文があります。 --実際には、[[参照]]している仕様書の略称が添えられて、 [CODE(example syntax)['''['''[VAR@en[uri]]''']'''[SUP[[VAR@en[spec]]]]]] のような形で示されています。 --また、実際には外部の仕様で定義されている[[非終端記号]]への[[参照]]は附属書内にまとめられており、 仕様書本文内の [[EBNF]] [[式]]には登場しません。 -[18] [[構文]]で表せない[[制約]]や注記への[[参照]]として、 [CODE(example syntax)[/* [VAR@en[type]]:[VAR@en[constraint-id]] */]] のような[[注釈]]があります。 -[19] >>18 の[[注釈]]で明記されている場合を''除き''、 定義された構文の[[字句]]間には[[空白]]や[[注釈]]が暗黙のうちに認められていると規定されています。 -[20] [[形式的意味論]]の仕様書では、 [[式]]の番号を表す括弧内に、 [CODE(example syntax)@en['''['''[VAR[n]] ([VAR[spec]])''']''']] のように出典・分類を添えています。 -[21] [[形式的意味論]]内の [CODE(ABNF)@en[[[Char]]]] の定義は[[文字クラス]]らしきものが括弧なしで表われますが、 typo でしょうか。 仕様書: - [CITE@EN[XQuery 1.0: An XML Query Language]] -- [CSECTION@en[1 Introduction]] -- [CSECTION@en[A.1 EBNF]] -[CITE@EN[XML Path Language (XPath) 2.0]] -- [CSECTION@en[1 Introduction]] -- [CSECTION@en[A.1 EBNF]] - [CITE@en[XQuery 1.0 and XPath 2.0 Formal Semantics]] -- [CSECTION@en[2.1.1 Notations from grammar productions]] -- [CSECTION@en[A Normalized core and formal grammars]] ** SML の ABNF [26] [[SML 1.1]] 仕様書は [[RFC 2234のABNF]] を採用していると記述されていますが、実際には [[XMLのEBNF]] を使っています。 [27] 「変種」といえるかは微妙ですが、[[記号名]]に「[CODE(char)[[[.]]]]」を含めている例があります。 *** 仕様書 - [CITE@en-US[Service Modeling Language, Version 1.1]] ([[W3C]] [[勧告]]) -- *** XSPARQL の変種 [28] [[XSPARQL]] は [[XQuery]] の構文の規定をベースに変更を加えていますが、 変更を加えた[[非終端記号]]には末尾に「'」をつけて区別しています。 *** 仕様書 - [CITE[XSPARQL Language Specification]] ([TIME[2009-06-12 18:52:37 +09:00]] 版) [29] [CITE@EN[XQuery 1.0 and XPath 2.0 Formal Semantics (Second Edition)]] ( ([TIME[2010-12-17 00:07:45 +09:00]] 版)) [30] [CITE@EN[XQuery 1.0 and XPath 2.0 Formal Semantics (Second Edition)]] ( ([TIME[2010-12-17 00:07:45 +09:00]] 版)) [31] [CITE@EN[XQuery 1.0: An XML Query Language (Second Edition)]] ( ([TIME[2011-01-05 01:29:08 +09:00]] 版))