作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
> space >> str >>-6ren">
我有一个奇怪的麻烦:
qi::rule <Iterator, std::string ()> str = +alnum;
// will not parse given input
//param = "WELL" >> space >> str >> ((space >> no_case[control]) || (space >> no_case[limit])) >> space >> qi::eol;
// will parse given input ok
param = "WELL" >> space >> +alnum >> ((space >> no_case[control]) || (space >> no_case[limit])) >> space >> qi::eol;
expression = qi::no_skip[param];
输入是“WELL name3 PROD OIL\n”。控制和限制是符号表。
我做错了什么?
更新:
定义了 BOOST_SPIRIT_QI_DEBUG 并在表达式前使用 BOOST_SPIRIT_DEBUG_NODE(参数),如果使用 str,我得到以下输出:
<param>
<try>WELL name3 PROD OIL </try>
Segmentation fault
在 +alnum 的情况下我得到了:
<param>
<try>WELL name3 PROD OIL </try>
<success></success>
<attributes>[]</attributes>
</param>
回溯:
<param>
<try>WELL name3 PROD OIL </try>
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff64db290 in boost::function4<bool, char*&, char* const&, boost::spirit::context<boost::fusion::cons<std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, boost::fusion::nil>, boost::fusion::vector0<void> >&, boost::spirit::unused_type const&>::operator() (this=
0x7fffffffd700, a0=@0x7fffffffd2d0, a1=@0x7fffffffda20, a2=..., a3=...)
at /opt/libs/boost/boost/function/function_template.hpp:1013
1013 (this->functor BOOST_FUNCTION_COMMA BOOST_FUNCTION_ARGS);
最佳答案
问题是您在堆栈上定义了规则 str
(作为构造函数中的局部变量)。当退出语法的构造函数时,此变量超出范围,从而使 param
规则带有对它的悬空引用。如果您将 str
移动为语法的成员变量,一切都会按预期进行。
此外,您似乎想跳过输入元素之间的空格。我建议查看 phrase_parse
API 以及如何使用 skippers。
关于c++ - qi::rule<It, std::string ()> 不解析输入字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5351316/
我是一名优秀的程序员,十分优秀!