将解析器分配给自动变量

mst*_*one 7 c++ parsing boost-spirit-qi

灵魂解析器是不是意味着使用auto

传递给qi::parse()内联时,一个简单的解析器工作正常,但如果通过auto变量传递则崩溃为segfault :

#include <cstdio>
#include <string>
#include <boost/spirit/include/qi.hpp>

using namespace std;

namespace qi = boost::spirit::qi;

int main()
{
    string line = "[z]";

    auto bracketed_z = '[' >> +qi::char_('z') >> ']';

    auto p = line.cbegin();
    printf("%d", qi::parse(p, line.cend(), '[' >> +qi::char_('z') >> ']'));  // Works

    p = line.cbegin();
    printf("%d", qi::parse(p, line.cend(), bracketed_z));                    // Crashes
}
Run Code Online (Sandbox Code Playgroud)

用g ++ - 4.8和VC13重新编写代码.

更新:原始代码中修复了错误(p在第二次调用之前未重新初始化parse()).

seh*_*ehe 10

Spirit Parsers不适用于autoSpirit V2.

这是因为底层的Proto表达式模板包含对临时表的引用.

您可以使用

  • qi::copy() (在boost_1_55_0之后存在于主干中,此时不在任何已发布的版本中)
  • boost::proto::deep_copy
  • 或者BOOST_SPIRIT_AUTO(这里首先创造)

我在SO上经常写这些东西:https://stackoverflow.com/search? q = user%3A85371+ deep_copy,具体来说,这个:

提升精神X3不会有这个限制.

  • 最近遇到这个错误太频繁了。因此,需要拥有现代版本的 Boost.Spirit Qi 库,它必须完全启用 C++11/C++1y(我认为它至少应该包含对 move-semantic 的支持)。 (2认同)
  • @Dukales这似乎是一个需要引用的意见:)如果你的意思是你渴望看到Spirit X3,+ 1 (2认同)