⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xml_grammar.hpp

📁 著名的Parser库Spirit在VC6上的Port
💻 HPP
📖 第 1 页 / 共 2 页
字号:
                | Comment;

            extSubset =
                !TextDecl >> extSubsetDecl;

            extSubsetDecl =
                *(
                    markupdecl 
                  | conditionalSect 
                  | DeclSep
                );

            SDDecl = 
                S >> L"standalone" >> Eq >> 
                (
                   (L'\'' >> (str_p(L"yes") | L"no") >> L'\'')
                 | (L'"' >> (str_p(L"yes") | L"no") >> L'"')
                );

            element =
                  EmptyElemTag
                | STag >> spirit::spflush >> content >> ETag;

            STag =
                L'<' >> Name >> *(S >> Attribute) >> !S >> L'>';

            Attribute =
                Name >> Eq >> AttValue;

            ETag =
                L"</" >> Name >> !S >> L'>';

            content =
                !CharData >> 
                *(
                  (
                     element 
                   | Reference 
                   | CDSect 
                   | PI 
                   | Comment
                  ) >> !CharData
                 );

            EmptyElemTag =
                L'<' >> Name >> *(S >> Attribute) >> !S >> L"/>";

            elementdecl = 
                L"<!ELEMENT" >> S >> Name >> S >> contentspec >> !S >> L'>';

            contentspec = 
                  str_p(L"EMPTY") 
                | L"ANY" 
                | Mixed 
                | children;

            children =
                (choice | seq) >> !(ch_p(L'?') | L'*' | L'+');

            cp = 
                (Name | choice | seq) >> !(ch_p(L'?') | L'*' | L'+');

            choice = 
                L'(' >> !S >> cp 
                  >> +(!S >> L'|' >> !S >> cp) 
                  >> !S >> L')';

            seq =
                L'(' >> !S >> cp >> 
                  *(!S >> L',' >> !S >> cp) 
                  >> !S >> L')';

            Mixed =
                  L'(' >> !S >> L"#PCDATA" 
                      >> *(!S >> L'|' >> !S >> Name) 
                      >> !S >> L")*"
                | L'(' >> !S >> L"#PCDATA" >> !S >> L')';

            AttlistDecl =
                L"<!ATTLIST" >> S >> Name >> *AttDef >> !S >> L'>';

            AttDef =
                S >> Name >> S >> AttType >> S >> DefaultDecl;

            AttType =
                  StringType 
                | TokenizedType 
                | EnumeratedType;

            StringType =
                str_p(L"CDATA");

            TokenizedType =
                longest[ 
                      str_p(L"ID") 
                    | L"IDREF" 
                    | L"IDREFS" 
                    | L"ENTITY" 
                    | L"ENTITIES" 
                    | L"NMTOKEN"
                    | L"NMTOKENS" 
                ];

            EnumeratedType =
                  NotationType 
                | Enumeration;

            NotationType =
                L"NOTATION" >> S >> L'(' >> !S >> Name 
                  >> *(!S >> L'|' >> !S >> Name) 
                  >> !S >> L')';

            Enumeration = 
                L'(' >> !S >> Nmtoken 
                >> *(!S >> L'|' >> !S >> Nmtoken) 
                >> !S >> L')';

            DefaultDecl =
                  str_p(L"#REQUIRED") 
                | L"#IMPLIED" 
                | !(L"#FIXED" >> S) >> AttValue;

            conditionalSect =
                  includeSect 
                | ignoreSect;

            includeSect =
                L"<![" >> !S >> L"INCLUDE" >> !S 
                >> L'[' >> extSubsetDecl >> L"]]>";

            ignoreSect = 
                L"<![" >> !S >> L"IGNORE"  >> !S 
                >> L'[' >> *ignoreSectContents >> L"]]>";

            ignoreSectContents = 
                Ignore >> *(L"<![" >> ignoreSectContents >> L"]]>" >> Ignore);

            Ignore = 
                *(Char - (str_p(L"<![") | L"]]>"));

            CharRef = 
                  L"&#"  >> +digit  >> L';'
                | L"&#x" >> +xdigit >> L';';

            Reference =
                  EntityRef 
                | CharRef;

            EntityRef =
                L'&' >> Name >> L';';

            PEReference =
                L'%' >> Name >> L';';

            EntityDecl =
                  GEDecl 
                | PEDecl;

            GEDecl =
                L"<!ENTITY" >> S >> Name >> S >> EntityDef >> !S >> L'>';

            PEDecl =
                L"<!ENTITY" >> S >> L'%' >> S >> Name >> S >> PEDef 
                >> !S >> L'>';

            EntityDef =
                  EntityValue
                | ExternalID >> !NDataDecl;

            PEDef =
                  EntityValue 
                | ExternalID;

            ExternalID =
                  L"SYSTEM" >> S >> SystemLiteral
                | L"PUBLIC" >> S >> PubidLiteral >> S >> SystemLiteral;

            NDataDecl =
                S >> L"NDATA" >> S >> Name;

            TextDecl =
                L"<?xml" >> !VersionInfo >> EncodingDecl >> !S >> L"?>";

            extParsedEnt =
                !TextDecl >> content;

            EncodingDecl =
                S >> L"encoding" >> Eq 
                >> (  L'"' >> EncName >> L'"' 
                    | L'\'' >> EncName >> L'\''
                   );

            EncName =
                alpha >> *(alnum | L'.' | L'_' | L'-');

            NotationDecl =
                L"<!NOTATION" >> S >> Name >> S 
                >> (ExternalID | PublicID) >> !S >> L'>';

            PublicID =
                L"PUBLIC" >> S >> PubidLiteral;


            SPIRIT_DEBUG_RULE(document);
            SPIRIT_DEBUG_RULE(prolog);
            SPIRIT_DEBUG_RULE(element);
            SPIRIT_DEBUG_RULE(Misc);
            SPIRIT_DEBUG_RULE(PEReference);
            SPIRIT_DEBUG_RULE(Reference);
            SPIRIT_DEBUG_RULE(PITarget);
            SPIRIT_DEBUG_RULE(CData);
            SPIRIT_DEBUG_RULE(doctypedecl);
            SPIRIT_DEBUG_RULE(XMLDecl);
            SPIRIT_DEBUG_RULE(SDDecl);
            SPIRIT_DEBUG_RULE(VersionInfo);
            SPIRIT_DEBUG_RULE(EncodingDecl);
            SPIRIT_DEBUG_RULE(VersionNum);
            SPIRIT_DEBUG_RULE(Eq);
            SPIRIT_DEBUG_RULE(DeclSep);
            SPIRIT_DEBUG_RULE(ExternalID);
            SPIRIT_DEBUG_RULE(markupdecl);
            SPIRIT_DEBUG_RULE(NotationDecl);
            SPIRIT_DEBUG_RULE(EntityDecl);
            SPIRIT_DEBUG_RULE(AttlistDecl);
            SPIRIT_DEBUG_RULE(elementdecl);
            SPIRIT_DEBUG_RULE(TextDecl);
            SPIRIT_DEBUG_RULE(extSubsetDecl);
            SPIRIT_DEBUG_RULE(conditionalSect);
            SPIRIT_DEBUG_RULE(EmptyElemTag);
            SPIRIT_DEBUG_RULE(STag);
            SPIRIT_DEBUG_RULE(content);
            SPIRIT_DEBUG_RULE(ETag);
            SPIRIT_DEBUG_RULE(Attribute);
            SPIRIT_DEBUG_RULE(contentspec);
            SPIRIT_DEBUG_RULE(Mixed);
            SPIRIT_DEBUG_RULE(children);
            SPIRIT_DEBUG_RULE(choice);
            SPIRIT_DEBUG_RULE(seq);
            SPIRIT_DEBUG_RULE(cp);
            SPIRIT_DEBUG_RULE(AttDef);
            SPIRIT_DEBUG_RULE(AttType);
            SPIRIT_DEBUG_RULE(DefaultDecl);
            SPIRIT_DEBUG_RULE(StringType);
            SPIRIT_DEBUG_RULE(TokenizedType);
            SPIRIT_DEBUG_RULE(EnumeratedType);
            SPIRIT_DEBUG_RULE(NotationType);
            SPIRIT_DEBUG_RULE(Enumeration);
            SPIRIT_DEBUG_RULE(EntityValue);
            SPIRIT_DEBUG_RULE(AttValue);
            SPIRIT_DEBUG_RULE(SystemLiteral);
            SPIRIT_DEBUG_RULE(PubidLiteral);
            SPIRIT_DEBUG_RULE(CharDataChar);
            SPIRIT_DEBUG_RULE(CharData);
            SPIRIT_DEBUG_RULE(Comment);
            SPIRIT_DEBUG_RULE(PI);
            SPIRIT_DEBUG_RULE(CDSect);
            SPIRIT_DEBUG_RULE(extSubset);
            SPIRIT_DEBUG_RULE(includeSect);
            SPIRIT_DEBUG_RULE(ignoreSect);
            SPIRIT_DEBUG_RULE(ignoreSectContents);
            SPIRIT_DEBUG_RULE(Ignore);
            SPIRIT_DEBUG_RULE(CharRef);
            SPIRIT_DEBUG_RULE(EntityRef);
            SPIRIT_DEBUG_RULE(GEDecl);
            SPIRIT_DEBUG_RULE(PEDecl);
            SPIRIT_DEBUG_RULE(EntityDef);
            SPIRIT_DEBUG_RULE(PEDef);
            SPIRIT_DEBUG_RULE(NDataDecl);
            SPIRIT_DEBUG_RULE(extParsedEnt);
            SPIRIT_DEBUG_RULE(EncName);
            SPIRIT_DEBUG_RULE(PublicID);
            SPIRIT_DEBUG_RULE(document);
            SPIRIT_DEBUG_RULE(S);
            SPIRIT_DEBUG_RULE(Name);
            SPIRIT_DEBUG_RULE(Names);
            SPIRIT_DEBUG_RULE(Nmtoken);
            SPIRIT_DEBUG_RULE(Nmtokens);

        }

        spirit::rule<IteratorT> const&
        start() const
        {
            return document;
        }

    };
};

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -