我应该包括哪些头文件,以便在boost spirit中使用limit_d指令
What header files should i include in order to use limit_d directive in boost spirit?
我是使用boost spirit
的初学者。
我要做的就是解析一个具有以下格式的时间的文本:
HH: MM: SS
,这很容易通过使用以下规则(boost文档)
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
命名空间下:
增加/精神/home/经典/核心/复合/directives.hpp
我已经包含了这个标题。
所以我对我应该包括哪个头感到困惑,以便获得代码编译(我使用VS2013)
注:我的代码在没有limit_d
指令的情况下正常工作,所以问题肯定是由limit_d
引起的。
您应该在<boost/spirit/include/...>
中使用头,以便Boost可以在不影响客户端代码的情况下改变其内部。
include <boost/spirit/include/classic_directives.hpp>
仅仅是对使用的的包装,因此除了忽略一层抽象之外,您的头文件没有任何问题。
真正的问题是您使用的命名空间—boost::spirit
与您应该使用的—boost::spirit::classic
。
IIRC,他们把以前的boost::spirit
变成了boost::spirit::classic
几个版本,当新的Spirit v2 API出来的时候,他们试图修复Spirit的"Header Hell"。
#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>
并完成它。: -)
使用@DevSolar发布的答案,我可以看到limit_d
,但这会引入另一个编译错误,说明我们不能使用
boost::spirit::qi::uint_parser<int, 10, 2, 2> uint2_p;
with 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
等效
如前所述,在Spirit 2中没有对应的limit_d
。X,而你必须使用语义动作,这是我的问题的解决方案。
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)]
];
- Boost Spirit,获取迭代器内部语义动作
- boost::spirit::karma 替代生成器,带有 boost::variant 由字符串和字符串别名组成
- boost::spirit::x3 中的通用解析器生成器
- Boost.Spirit将表达转换为AST
- 使用 Boost.Spirit 解析具有混合数据类型的 OBJ 文件?
- 如何处理Boost Spirit X3导致Visual Studio 2019 "static initialization order fiasco"?
- Boost Spirit X3:将(一些)空格解析为枚举
- Boost Spirit x3 条件(三元)运算符解析器
- 你如何从 Boost Spirit X3 词法解析器中获取字符串?
- 将 Boost.Spirit.X3 解析器拆分为多个 TU
- boost::spirit::x3 中的简单字符串解析器不起作用
- boost::spirit指针属性是用nullptr初始化的吗?
- Boost.Spirit Alternative Parser parallelization
- Qt Creator 在执行步骤 "make" 时出现编译错误,-fno-stack-limit
- 如何在 boost::spirit::qi 中将某些语义操作排除在 AST 之外
- 自定义预期失败的完整错误消息(boost::spirit::x3)
- boost::spirit--试图编译大多数简单代码的编译器错误
- Boost.Spirit.Qi 语法,用于 Boost.Fusion 自适应结构中的默认值
- 使用 Boost.Spirit 解析嵌套列表
- (如何)我可以在不安装完整的提升库的情况下使用 boost::spirit X3 吗?