第015回_構文の整理2_検討不要なもの
»
XML構文の整理
LL (1)で実装するXMLの構文は次の4種類に別けて検討すると良いと思います。種類1: トークンとして切り出すだけのもの
種類2: SYMBOLやWORD、LITERALへの置き換えだけで済むもの
種類3: 簡単な検討を要するもの
種類4: W3C勧告を詳しく読まないといけないもの
種類4についてはW3C勧告を解説しながら後々、実装したいと思います。
トークンとして切り出すだけのもの
トークン粒度の説明時に解説したものは次のようになります。
| クラス名 | 整理した構文 |
| EbnfWhiteSpaceNode | S ::= WHITE_SPACEトークン |
| EbnfSystemLiteralNode | SystemLiteral ::= LITERALトークン |
| EbnfCommentNode | Comment ::= COMMENTトークン |
| EbnfPIWordNode | PI_WORD ::= PI_WORDトークン |
| ※このトークンの前後で字句解析器の処理変更通知を行うため、個別のクラスとして用意します。 | |
| EbnfNormalTokenA1Node | NormalTokenA1 ::= NORMAL_TOKEN_A1トークン |
| EbnfNormalTokenA2Node | NormalTokenA2 ::= NORMAL_TOKEN_A2トークン |
| EbnfNormalTokenB1Node | NormalTokenB1 ::= NORMAL_TOKEN_B1トークン |
| EbnfNormalTokenB2Node | NormalTokenB2 ::= NORMAL_TOKEN_B2トークン |
| EbnfCharDataNode | CharData ::= CHAR_DATAトークン |
| ※このトークンの前後で字句解析器の処理変更通知を行うため、個別のクラスとして用意します。 | |
| EbnfCDataNode | CData ::= CDataトークン |
| ※このトークンの前後で字句解析器の処理変更通知を行うため、個別のクラスとして用意します。 | |
| EbnfIgnoreNode | Ignore ::= IGNORE_WORDトークン |
| ※このトークンの前後で字句解析器の処理変更通知を行うため、個別のクラスとして用意します。 |
SYMBOLやWORD、LITERALへの置き換えだけで済むもの
SYMBOLやWORD、LITERALへの置き換えだけで済むものについて以下に示します。
| クラス名 | 整理した構文 |
| EbnfDocumentNode | document ::= prolog element Misc* |
| EbnfNameNode | Name ::= WORD (NameStartChar (NameChar)*) |
| EbnfNmtokenNode | Nmtoken ::= WORD ((NameChar)+) |
| EbnfEntityValueNode | EntityValue ::= EntityValueDoubleQuoteStart | EntityValueQuoteStart |
| EbnfEntityValueDoubleQuoteStartNode | EntityValueDoubleQuoteStart ::= DoubleQuote EntityValueDoubleQuoteSection |
| EbnfDoubleQuoteNode | DoubleQuote ::= SYMBOL ('"') |
| ※ このNodeの前後で字句解析器の処理変更通知を行います | |
| EbnfEntityValueDoubleQuoteSectionNode | EntityValueDoubleQuoteSection ::= (NORMAL_TOKEN_B1 | PEReference | Reference)* SYMBOL ('"') |
| ※ このNodeの前後で字句解析器の処理変更通知を行います | |
| EbnfEntityValueQuoteStartNode | EntityValueQuoteStart ::= Quote EntityValueQuoteSection |
| EbnfQuoteNode | Quote ::= SYMBOL ("'") |
| ※ このNodeの前後で字句解析器の処理変更通知を行います | |
| EbnfEntityValueQuoteSectionNode | EntityValueQuoteSection ::= (NORMAL_TOKEN_B2 | PEReference | Reference)* SYMBOL ("'") |
| ※ このNodeの前後で字句解析器の処理変更通知を行います | |
| EbnfAttValueNode | AttValue ::= AttValueDoubleQuoteStart | AttValueQuoteStart |
| EbnfAttValueDoubleQuoteStartNode | AttValueDoubleQuoteStart ::= DoubleQuote AttValueDoubleQuoteSection |
| EbnfAttValueDoubleQuoteSectionNode | AttValueDoubleQuoteSection ::= (NORMAL_TOKEN_A1 | Reference)* SYMBOL ('"') |
| ※ このNodeの前後で字句解析器の処理変更通知を行います | |
| EbnfAttValueQuoteStartNode | AttValueQuoteStart ::= Quote AttValueQuoteSection |
| EbnfAttValueQuoteSectionNode | AttValueQuoteSection ::= (NORMAL_TOKEN_A2 | Reference)* SYMBOL ("'") |
| ※ このNodeの前後で字句解析器の処理変更通知を行います | |
| EbnfPubidLiteralNode | PubidLiteral ::= LITERAL (PubidChar*) |
| EbnfPINode | PI::=SYMBOL ('<?') PITarget (S PI_WORD)? SYMBOL ('?>') |
| EbnfCDSectNode | CDSect ::= CDStart CData CDEnd |
| EbnfCDStartNode | CDStart ::= SYMBOL ('<![CDATA[') |
| EbnfCDEndNode | CDEnd ::= SYMBOL (']]>') |
| EbnfPrologNode | prolog ::= XMLDecl Misc* (doctypedecl Misc*)? |
| EbnfXMLDeclNode | XMLDecl ::= SYMBOL ('<?xml') VersionInfo EncodingDecl? SDDecl? S? SYMBOL ('?>') |
| EbnfVersionInfoNode | VersionInfo ::= S WORD ('version') Eq VersionNum |
| EbnfEqNode | Eq ::= S? SYMBOL S? |
| EbnfVersionNumNode | VersionNum ::= LITERAL ('1.1') |
| EbnfMiscNode | Misc ::= Comment | PI | S |
| EbnfDeclSepNode | DeclSep ::= PEReference | S |
| EbnfExtSubsetNode | extSubset ::= TextDecl? extSubsetDecl |
| EbnfSDDeclNode | SDDecl ::= S WORD ('standalone') Eq (LITERAL ('yes') | LITERAL ('no')) |
| EbnfAttributeNode | Attribute ::= Name Eq AttValue |
| EbnfETagNode | ETag ::= SYMBOL ('</') Name S? SYMBOL ('>') |
| EbnfContentNode | content ::= CharData? ((element | Reference | CDSect | PI | Comment) CharData?)* |
| ※ このNodeの前後で字句解析器の処理変更通知を行います | |
| EbnfStringTypeNode | StringType ::= WORD ('CDATA') |
| EbnfTokenizedTypeNode | TokenizedType ::= WORD ('ID') | WORD ('IDREF') | WORD ('IDREFS') | WORD ('ENTITY') | WORD ('ENTITIES') | WORD ('NMTOKEN') | WORD ('NMTOKENS') |
| EbnfCharRefNode | CharRef ::= CharRefDecimal | CharRefHex |
| EbnfCharRefDecimalNode | CharRefDecimal ::= SYMBOL ('&#') CharRefDecimalSection |
| EbnfCharRefDecimalSectionNode | CharRefDecimalSection ::= WORD ([0-9]+) SYMBOL (';') |
| ※ このNodeの前後で字句解析器の処理変更通知を行います | |
| EbnfCharRefHexNode | CharRefHex ::= SYMBOL ('&#x') CharRefHexSection |
| EbnfCharRefHexSectionNode | CharRefHexSection ::= WORD ([0-9a-fA-F]+) SYMBOL (';') |
| ※ このNodeの前後で字句解析器の処理変更通知を行います | |
| EbnfReferenceNode | Reference ::= EntityRef | CharRef |
| EbnfEntityRefNode | EntityRef ::= SYMBOL ('&') EntityRefSection |
| EbnfEntityRefSectionNode | EntityRefSection ::= WORD (Name) SYMBOL (';') |
| ※ このNodeの前後で字句解析器の処理変更通知を行います | |
| EbnfPEReferenceNode | PEReference ::= SYMBOL ('%') PEReferenceSection |
| EbnfPEReferenceSectionNode | PEReferenceSection ::= WORD SYMBOL |
| ※ このNodeの前後で字句解析器の処理変更通知を行います | |
| EbnfTextDeclNode | TextDecl ::= SYMBOL ('<?xml') VersionInfo? EncodingDecl S? SYMBOL ('?>') |
| EbnfExtParsedEntNode | extParsedEnt ::= TextDecl? content |
| EbnfEncodingDeclNode | EncodingDecl ::= S WORD ('encoding') Eq LITERAL (EncName) |
コメント
コメントを投稿する
SpecialPR