我是使用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
引起的。
答案 0 :(得分:3)
您<boost/spirit/include/...>
使用<boost/spirit/include/classic_directives.hpp>
中的标头,以便Boost可以在内部移动而不会影响客户端代码。
include boost::spirit
只是一个你所使用的包装器,但是,除了忽略一层抽象之外,你的标题没有任何问题。
真正的问题是您使用的名称空间 - boost::spirit::classic
- 与您应使用的名称相比 - - boost::spirit
。
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_d
与Boost::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)]
];