第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