本家「@IT」にはない内容をエンジニアライフで技術紹介するコラム。広く議論する場になることを目指します。

第015回_構文の整理2_検討不要なもの

»

XML構文の整理

LL (1)で実装するXMLの構文は次の4種類に別けて検討すると良いと思います。
 種類1: トークンとして切り出すだけのもの
 種類2: SYMBOLやWORD、LITERALへの置き換えだけで済むもの
 種類3: 簡単な検討を要するもの
 種類4: W3C勧告を詳しく読まないといけないもの
種類4についてはW3C勧告を解説しながら後々、実装したいと思います。

トークンとして切り出すだけのもの

トークン粒度の説明時に解説したものは次のようになります。
クラス名整理した構文
EbnfWhiteSpaceNodeS ::= WHITE_SPACEトークン
EbnfSystemLiteralNodeSystemLiteral ::= LITERALトークン
EbnfCommentNodeComment ::= COMMENTトークン
EbnfPIWordNodePI_WORD ::= PI_WORDトークン
※このトークンの前後で字句解析器の処理変更通知を行うため、個別のクラスとして用意します。
EbnfNormalTokenA1NodeNormalTokenA1 ::= NORMAL_TOKEN_A1トークン
EbnfNormalTokenA2NodeNormalTokenA2 ::= NORMAL_TOKEN_A2トークン
EbnfNormalTokenB1NodeNormalTokenB1 ::= NORMAL_TOKEN_B1トークン
EbnfNormalTokenB2NodeNormalTokenB2 ::= NORMAL_TOKEN_B2トークン
EbnfCharDataNodeCharData ::= CHAR_DATAトークン
※このトークンの前後で字句解析器の処理変更通知を行うため、個別のクラスとして用意します。
EbnfCDataNodeCData ::= CDataトークン
※このトークンの前後で字句解析器の処理変更通知を行うため、個別のクラスとして用意します。
EbnfIgnoreNodeIgnore ::= IGNORE_WORDトークン
※このトークンの前後で字句解析器の処理変更通知を行うため、個別のクラスとして用意します。

SYMBOLやWORD、LITERALへの置き換えだけで済むもの

SYMBOLやWORD、LITERALへの置き換えだけで済むものについて以下に示します。

クラス名整理した構文
EbnfDocumentNodedocument ::= prolog element Misc*
EbnfNameNodeName ::= WORD (NameStartChar (NameChar)*)
EbnfNmtokenNodeNmtoken ::= WORD ((NameChar)+)
EbnfEntityValueNode EntityValue ::= EntityValueDoubleQuoteStart        | EntityValueQuoteStart
EbnfEntityValueDoubleQuoteStartNode EntityValueDoubleQuoteStart
::= DoubleQuote EntityValueDoubleQuoteSection
EbnfDoubleQuoteNodeDoubleQuote ::= SYMBOL ('"')
※ このNodeの前後で字句解析器の処理変更通知を行います
EbnfEntityValueDoubleQuoteSectionNode EntityValueDoubleQuoteSection
::= (NORMAL_TOKEN_B1 | PEReference | Reference)* SYMBOL ('"')
※ このNodeの前後で字句解析器の処理変更通知を行います
EbnfEntityValueQuoteStartNodeEntityValueQuoteStart ::= Quote EntityValueQuoteSection
EbnfQuoteNodeQuote ::= SYMBOL ("'")
※ このNodeの前後で字句解析器の処理変更通知を行います
EbnfEntityValueQuoteSectionNodeEntityValueQuoteSection
::= (NORMAL_TOKEN_B2 | PEReference | Reference)* SYMBOL ("'")
※ このNodeの前後で字句解析器の処理変更通知を行います
EbnfAttValueNodeAttValue ::= AttValueDoubleQuoteStart
      | AttValueQuoteStart
EbnfAttValueDoubleQuoteStartNodeAttValueDoubleQuoteStart
::= DoubleQuote AttValueDoubleQuoteSection
EbnfAttValueDoubleQuoteSectionNodeAttValueDoubleQuoteSection ::= (NORMAL_TOKEN_A1 | Reference)* SYMBOL ('"')
※ このNodeの前後で字句解析器の処理変更通知を行います
EbnfAttValueQuoteStartNodeAttValueQuoteStart
::= Quote AttValueQuoteSection
EbnfAttValueQuoteSectionNodeAttValueQuoteSection ::=
(NORMAL_TOKEN_A2 | Reference)* SYMBOL ("'")
※ このNodeの前後で字句解析器の処理変更通知を行います
EbnfPubidLiteralNodePubidLiteral ::= LITERAL (PubidChar*)
EbnfPINode PI::=SYMBOL ('<?') PITarget (S PI_WORD)?
   SYMBOL ('?>')
EbnfCDSectNodeCDSect ::= CDStart CData CDEnd
EbnfCDStartNodeCDStart ::= SYMBOL ('<![CDATA[')
EbnfCDEndNodeCDEnd ::= SYMBOL (']]>')
EbnfPrologNodeprolog ::= XMLDecl Misc* (doctypedecl Misc*)?
EbnfXMLDeclNodeXMLDecl ::=
SYMBOL ('<?xml') VersionInfo EncodingDecl? SDDecl? S? SYMBOL ('?>')
EbnfVersionInfoNodeVersionInfo ::= S WORD ('version') Eq VersionNum
EbnfEqNodeEq ::= S? SYMBOL S?
EbnfVersionNumNodeVersionNum ::= LITERAL ('1.1')
EbnfMiscNodeMisc ::= Comment | PI | S
EbnfDeclSepNodeDeclSep ::= PEReference | S
EbnfExtSubsetNodeextSubset ::= TextDecl? extSubsetDecl
EbnfSDDeclNodeSDDecl ::=
S WORD ('standalone') Eq
(LITERAL ('yes') | LITERAL ('no'))
EbnfAttributeNodeAttribute ::= Name Eq AttValue
EbnfETagNodeETag ::= SYMBOL ('</') Name S? SYMBOL ('>')
EbnfContentNodecontent ::=
CharData?
((element | Reference | CDSect | PI | Comment)
CharData?)*
※ このNodeの前後で字句解析器の処理変更通知を行います
EbnfStringTypeNodeStringType ::= WORD ('CDATA')
EbnfTokenizedTypeNodeTokenizedType ::= WORD ('ID')
        | WORD ('IDREF')
        | WORD ('IDREFS')
        | WORD ('ENTITY')
        | WORD ('ENTITIES')
        | WORD ('NMTOKEN')
        | WORD ('NMTOKENS')
EbnfCharRefNodeCharRef ::= CharRefDecimal | CharRefHex
EbnfCharRefDecimalNodeCharRefDecimal ::=
      SYMBOL ('&#') CharRefDecimalSection
EbnfCharRefDecimalSectionNodeCharRefDecimalSection ::=
        WORD ([0-9]+) SYMBOL (';')
※ このNodeの前後で字句解析器の処理変更通知を行います
EbnfCharRefHexNodeCharRefHex ::= SYMBOL ('&#x') CharRefHexSection
EbnfCharRefHexSectionNodeCharRefHexSection ::=
       WORD ([0-9a-fA-F]+) SYMBOL (';')
※ このNodeの前後で字句解析器の処理変更通知を行います
EbnfReferenceNodeReference ::= EntityRef | CharRef
EbnfEntityRefNodeEntityRef ::= SYMBOL ('&') EntityRefSection
EbnfEntityRefSectionNodeEntityRefSection ::= WORD (Name) SYMBOL (';')
※ このNodeの前後で字句解析器の処理変更通知を行います
EbnfPEReferenceNodePEReference ::= SYMBOL ('%') PEReferenceSection
EbnfPEReferenceSectionNodePEReferenceSection ::= WORD SYMBOL
※ このNodeの前後で字句解析器の処理変更通知を行います
EbnfTextDeclNodeTextDecl ::=
SYMBOL ('<?xml') VersionInfo? EncodingDecl S? SYMBOL ('?>')
EbnfExtParsedEntNodeextParsedEnt ::= TextDecl? content
EbnfEncodingDeclNodeEncodingDecl ::=
  S WORD ('encoding') Eq LITERAL (EncName)
Comment(0)

コメント

コメントを投稿する