【发布时间】:2015-10-25 01:36:50
【问题描述】:
在过去的几个月里,我经常使用spirit::qi。但是,这次我遇到了一个我真的无法理解的段错误。
我已经把它简化为一个极少的测试用例,语法定义是 12 行代码。
这感觉很像 earlier question,但那里的解决方案,将 .alias() 添加到某些终端,以便 qi 不会复制它们,似乎无法解决这个问题。
我担心我在这里遗漏了一些基本的东西,因为我已经设法制作出比这更复杂的语法来完全按照我的预期进行测试。
我现在唯一想到的是,也许 qi 只是不喜欢主语法返回类型是 boost 变体?我不知道我以前是否做过任何语法。我想我接下来会测试这个,但老实说,我已经在旋转轮子上摆弄类似的东西有一段时间了。
我可以确认,如果设置mod_规则的那一行被注释掉了,那么就不会出现段错误,程序正常运行到完成。
编辑:实际上,即使删除了所有语法属性,它也会出现段错误。
#define BOOST_SPIRIT_USE_PHOENIX_V3
#include <boost/spirit/include/qi.hpp>
#include <iostream>
typedef unsigned int uint;
namespace qi = boost::spirit::qi;
/***
* Grammar
*/
template <typename Iterator>
struct op_grammar : qi::grammar<Iterator> {
qi::rule<Iterator> constant_;
qi::rule<Iterator> mod_;
qi::rule<Iterator> expr_;
op_grammar() : op_grammar::base_type(expr_) {
constant_ = qi::uint_;
expr_ = mod_ | constant_;
mod_ = expr_ >> qi::lit('%') >> expr_;
}
};
/***
* Test
*/
int main() {
// std::string str{"n % 2"};
std::string str{"2"};
typedef std::string::const_iterator str_it;
str_it it = str.begin();
str_it end = str.end();
op_grammar<str_it> grammar;
if (qi::parse(it, end, grammar) && it == end) {
std::cerr << "Good\n";
} else {
std::cerr << "Bad\n";
}
}
【问题讨论】:
标签: c++ parsing c++11 boost-spirit boost-spirit-qi