xml_g.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 186 行

HPP
186
字号
//  Copyright (c) 2005 Carl Barron. Distributed under the Boost//  Software License, Version 1.0. (See accompanying file//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)#ifndef XML_G_H#define XML_G_H#define BOOST_SPIRIT_DEBUG#ifndef BOOST_SPIRIT_CLOSURE_LIMIT#define BOOST_SPIRIT_CLOSURE_LIMIT  10#endif#ifndef PHOENIX_LIMIT#define PHOENIX_LIMIT   10#endif#if BOOST_SPIRIT_CLOSURE_LIMIT < 6#undef BOOST_SPIRIT_CLOSURE_LIMIT#define BOOST_SPIRIT_CLOSURE_LIMIT  6#endif#if PHOENIX_LIMIT < BOOST_SPIRIT_CLOSURE_LIMIT#undef PHOENIX_LIMIT#define PHOENIX_LIMIT BOOST_SPIRIT_CLOSURE_LIMIT#endif#if 0#ifdef BOOST_SPIRIT_DEBUG_FLAGS#undef BOOST_SPIRIT_DEBUG_FLAGS#endif#define BOOST_SPIRIT_DEBUG_FLAGS (BOOST_SPIRIT_DEBUG_FLAGS_MAX - BOOST_SPIRIT_DEBUG_FLAGS_CLOSURES)#endif#include <boost/spirit/include/classic_core.hpp>#include <boost/spirit/include/classic_attribute.hpp>#include <boost/spirit/include/phoenix1.hpp>#include "tag.hpp"#include "actions.hpp"#include <boost/variant.hpp>#include <string>#include <utility>namespace SP = BOOST_SPIRIT_CLASSIC_NS;using phoenix::arg1;using phoenix::arg2;using phoenix::construct_;using phoenix::var;struct str_cls:SP::closure<str_cls,std::string>{ member1 value;};struct attrib_cls:SP::closure<    attrib_cls,    std::pair<std::string,std::string>,    std::string,    std::string>{    member1 value;    member2 first;    member3 second;};struct tagged_cls:SP::closure<    tagged_cls,    tag,    std::string,    std::map<std::string,std::string>,    std::list<typename tag::variant_type>>{    member1 value;    member2 ID;    member3 attribs;    member4 children;};struct xml_g:SP::grammar<xml_g>{    std::list<tag>  &tags;    xml_g(std::list<tag> &a):tags(a){}    template <class Scan>    struct definition    {        definition(const xml_g &s)        {            white = +SP::space_p                ;            tagged = (start_tag                >> *inner                >> end_tag                | simple_start_tag                )                [store_tag(tagged.value,tagged.ID,tagged.attribs,                    tagged.children)]                ;            end_tag = SP::str_p("</")                >> SP::f_str_p(tagged.ID)                >> '>'                ;            inner = (tagged                | str)  [push_child(tagged.children,arg1)]                ;            str = SP::lexeme_d[+(SP::anychar_p - '<')]                [str.value=construct_<std::string>(arg1,arg2)]                              ;            top = +tagged                [push_back(var(s.tags),arg1)]                ;            starter = SP::ch_p('<')                >> SP::lexeme_d[+SP::alpha_p]        [tagged.ID = construct_<std::string>(arg1,arg2)]                >> *attrib                [store_in_map(tagged.attribs,arg1)]                >> !white                ;            start_tag = starter                >> '>'                ;            simple_start_tag = starter                >> "/>"                ;                            attrib = white                >>SP::lexeme_d[+SP::alpha_p]                [attrib.first = construct_<std::string>(arg1,arg2)]                >> !white                >> '='                >> !white                >> '"'                >> SP::lexeme_d[+(SP::anychar_p - '"')]                    [attrib.second = construct_<std::string>(arg1,arg2)]                >> SP::ch_p('"')                    [attrib.value = construct_                    <                        std::pair                        <                            std::string,                            std::string                        >                    >(attrib.first,attrib.second)]                ;        BOOST_SPIRIT_DEBUG_RULE(tagged);        BOOST_SPIRIT_DEBUG_RULE(end_tag);        BOOST_SPIRIT_DEBUG_RULE(inner);        BOOST_SPIRIT_DEBUG_RULE(str);        BOOST_SPIRIT_DEBUG_RULE(top);        BOOST_SPIRIT_DEBUG_RULE(start_tag);        BOOST_SPIRIT_DEBUG_RULE(attrib);        BOOST_SPIRIT_DEBUG_RULE(white);        BOOST_SPIRIT_DEBUG_RULE(starter);        BOOST_SPIRIT_DEBUG_RULE(simple_start_tag);        }                // actions        push_back_f     push_back;        push_child_f    push_child;        store_in_map_f  store_in_map;        store_tag_f     store_tag;        // rules        SP::rule<Scan,tagged_cls::context_t>    tagged;        SP::rule<Scan>                          end_tag;        SP::rule<Scan>                          inner;        SP::rule<Scan,str_cls::context_t>       str;        SP::rule<Scan>                          top;        SP::rule<Scan>                          starter;        SP::rule<Scan>                          simple_start_tag;        SP::rule<Scan>                          start_tag;        SP::rule<Scan>                          white;        SP::rule<Scan,attrib_cls::context_t>    attrib;        SP::rule<Scan> const &start() const        { return top;}    };};#endif                            

⌨️ 快捷键说明

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