我应该包含哪些头文件才能在boost spirit中使用limit_d指令?

时间:2015-08-18 13:32:20

标签: c++ parsing boost-spirit

我是使用boost spirit的初学者。

我想要做的只是解析具有以下格式时间的文本:

  

HH:MM :: SS

使用以下规则(提升文档)

非常容易
uint_parser<int, 10, 2, 2> uint2_p;

r = lexeme_d
    [
        boost::spirit::limit_d(0u, 23u)[uint2_p] >> ':' 
        >>  boost::spirit::limit_d(0u, 59u)[uint2_p] >> ':' 
        >>  boost::spirit::limit_d(0u, 59u)[uint2_p]           
    ];

问题是我收到编译器错误,指出limit_d不是boost spirit命名空间的成员,即使limit_d指令位于boost::spirit命名空间下面以下标题:

  

升压/精神/家/经典/芯/复合/ directives.hpp

我已经加入了这个标题。

所以我很困惑我应该包含哪个标题以便编译代码(我正在使用VS2013)

P.S。我的代码在没有limit_d指令的情况下正常工作,因此问题肯定是由limit_d引起的。

2 个答案:

答案 0 :(得分:3)

<boost/spirit/include/...>使用<boost/spirit/include/classic_directives.hpp>中的标头,以便Boost可以在内部移动而不会影响客户端代码。

include boost::spirit只是一个所使用的包装器,但是,除了忽略一层抽象之外,你的标题没有任何问题。

真正的问题是您使用的名称空间 - boost::spirit::classic - 与您使用的名称相比 - - boost::spirit

IIRC,当新的Spirit v2 API出来并且他们试图修复精神supposed时,他们将前boost::spirit::classic转移到#include <boost/spirit/include/classic_directives.hpp> namespace bspirit = boost::spirit::classic; int main() { bspirit::limit_d( 0u, 23u ); } 几个版本。

#include <boost/spirit/include/classic.hpp>

如果你不害怕更高的编译时间并且不想确定使用完全的标题,你当然可以简单children并完成它。 ; - )

答案 1 :(得分:0)

使用@DevSolar发布的答案我可以看到limit_d但是这会引入另一个编译错误,指出我们无法使用

boost::spirit::qi::uint_parser<int, 10, 2, 2> uint2_p;

limit_d所以我将其更改为

boost::spirit::classic::uint_parser<uint16, 10, 2, 2> uint2_p;

因此,时间解析器规则如下:

boost::spirit::classic::uint_parser<uint16, 10, 2, 2>           uint2_p;
boost::spirit::qi::rule<std::string::const_iterator, Time(), qi::space> Time_;

Time_ = lexeme_d
    [
            boost::spirit::classic::limit_d(0u, 23u)[uint2_p] >> ':'
        >>  boost::spirit::classic::limit_d(0u, 59u)[uint2_p] >> ':'
        >>  boost::spirit::classic::limit_d(0u, 59u)[uint2_p]
    ];

此代码的问题在于我们无法将limit_dBoost::Spirit::QI一起使用,因为您已注意到QI命名空间中的规则。

所以我搜索了与Spirit 2.x

兼容的limit_d等效词

如上所述here,Spirit 2.x中没有limit_d的等效内容,相反,您必须使用语义操作来解决我的问题。

所以工作代码应如下所示:

    namespace qi = boost::spirit::qi;
    struct Time
    {
        unsigned Hour;
        unsigned Minute;
        unsigned Second;
    };

    boost::spirit::qi::rule<std::string::const_iterator, Time(), qi::space> Time_;

    Time_ = lexeme_d
        [
                    qi::uint_[qi::_pass = (0 <= qi::_1 && qi::_1 <= 23)] >> ':'
                >>  qi::uint_[qi::_pass = (0 <= qi::_1 && qi::_1 <= 59)] >> ':'
                >>  qi::uint_[qi::_pass = (0 <= qi::_1 && qi::_1 <= 59)]
        ];