$Id: PRODUCTIONS,v 1.3 2003/01/19 14:35:49 katsu Exp $ == 実装の完了しているもの。 これらの生成規則にマッチすることが期待される文脈において、期待される生成規則に マッチしなかった場合は、常に parse error となる。 XMLScan::XMLScanner で実装されているもの。 [10] AttValue ::= '"' ([^<&"] | Reference)* '"' | ("'" ([^<&'] | Reference)* "'") [14] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*) [15] Comment ::= '' [16] PI ::= '' Char*)))? '?>' [18] CDSect ::= CDStart CData CDEnd [19] CDStart ::= '' Char*)) [21] CDEnd ::= ']]>' [22] prolog ::= XMLDecl? Misc* (doctypedecl Misc*)? [23] XMLDecl ::= '' [24] VersionInfo ::= S 'version' Eq ("'" VersionNum "'" | '"' VersionNum '"') [32] SDDecl ::= S 'standalone' Eq (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"')) [40] STag ::= '<' Name (S Attribute)* S? '>' [41] Attribute ::= Name Eq AttValue [42] ETag ::= '' [44] EmptyElemTag ::= '<' Name (S Attribute)* S? '/>' [66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';' [68] EntityRef ::= '&' Name ';' [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' | "'" EncName "'") XMLScan::XMLParser で実装されているもの。 [1] document ::= prolog element Misc* [17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l')) [43] content ::= CharData? ((element | Reference | CDSect | PI | Comment) CharData?)* [39] element ::= EmptyElemTag | STag content ETag == 実装しているが、他の生成規則中にインラインで展開したもの。 XMLScan::XMLScanner で実装されているもの。 [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'") [12] PubidLiteral ::= '"' PubidChar* '"' | "'" (PubidChar - "'")* "'" [25] Eq ::= S? '=' S? [27] Misc ::= Comment | PI | S [67] Reference ::= EntityRef | CharRef [75] ExternalID ::= 'SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral == 実装しているが、生成規則に若干変更を加えているもの。 XMLScan::XMLScanner は ExternalID の生成規則を ExternalID ::= 'SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral? として解析。XMLScan::XMLParser が SystemLiteral を持たない公開識別子の チェックを行う。 [28] doctypedecl ::= '' == 未着手だが着手予定のもの。 内部 DTD サブセットに関するもの。 [9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"' | ("'" ([^%&'] | PEReference | Reference)* "'") [28a] DeclSep ::= PEReference | S [29] markupdecl ::= elementdecl | AttlistDecl | EntityDecl | NotationDecl | PI | Comment [45] elementdecl ::= '' [52] AttlistDecl ::= '' [53] AttDef ::= S Name S AttType S DefaultDecl [54] AttType ::= StringType | TokenizedType | EnumeratedType [55] StringType ::= 'CDATA' [56] TokenizedType ::= 'ID' [57] EnumeratedType ::= NotationType | Enumeration [58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')' [59] Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')' [60] DefaultDecl ::= '#REQUIRED' | '#IMPLIED' | (('#FIXED' S)? AttValue [69] PEReference ::= '%' Name ';' [70] EntityDecl ::= GEDecl | PEDecl [71] GEDecl ::= '' [72] PEDecl ::= '' [73] EntityDef ::= EntityValue | (ExternalID NDataDecl?) [74] PEDef ::= EntityValue | ExternalID [76] NDataDecl ::= S 'NDATA' S Name [82] NotationDecl ::= '' [83] PublicID ::= 'PUBLIC' S PubidLiteral == 着手予定無かったけど着手しちゃったもの。 要素内容モデルの正確な構文解析はやらないかも。 って言ってたのに(笑)。> contentspec.ry [46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children [47] children ::= (choice | seq) ('?' | '*' | '+')? [48] cp ::= (Name | choice | seq) ('?' | '*' | '+')? [49] choice ::= '(' S? cp ( S? '|' S? cp )+ S? ')' [50] seq ::= '(' S? cp ( S? ',' S? cp )* S? ')' [51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*' | '(' S? '#PCDATA' S? ')' == 未着手で着手予定のないもの。 外部実体に関するもの等。 これらは外部DTDサブセットでないと用無し。 [30] extSubset ::= TextDecl? extSubsetDecl [31] extSubsetDecl ::= ( markupdecl | conditionalSect | DeclSep)* [61] conditionalSect ::= includeSect | ignoreSect [62] includeSect ::= '' [63] ignoreSect ::= '' [64] ignoreSectContents ::= Ignore ('' Ignore)* [65] Ignore ::= Char* - (Char* ('') Char*) これらは外部解析対象実体でないと用無し。 [77] TextDecl ::= '' [78] extParsedEnt ::= TextDecl? content これらは属性値の妥当性を検証しないなら用無し。 [6] Names ::= Name (S Name)* [8] Nmtokens ::= Nmtoken (S Nmtoken)* == 文字や名前に関するもの。 /[ \t\n\r]+/ として他の生成規則内に展開される。 Ruby の \s は #xC を含んでしまうので厳密には S と一致しないことに注意。 [3] S ::= (#x20 | #x9 | #xD | #xA)+ 以下は厳密に実装すると負荷がかかって嫌なのでデフォルトでは無効。 オプションとして選択することができる。 XMLScan::XMLChar::valid_char? [2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] XMLScan::XMLChar::valid_nmtoken? [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender [7] Nmtoken ::= (NameChar)+ [84] Letter ::= BaseChar | Ideographic [85] BaseChar ::= ... [86] Ideographic ::= ... [87] CombiningChar ::= ... [88] Digit ::= ... [89] Extender ::= ... XMLScan::XMLChar::valid_name? [5] Name ::= (Letter | '_' | ':') (NameChar)* XMLScan::XMLChar::valid_pubid? [13] PubidChar ::= #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%] XMLScan::XMLChar::valid_versionnum? [26] VersionNum ::= ([a-zA-Z0-9_.:] | '-')+ XMLScan::XMLChar::valid_encname? [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')*