这是我第一次在这里提问。它已经花了我很多时间和研究来使这个工作,我不能。我真的希望你能帮助我。我是使用Spirit的新手,我不完全理解所有条款;然而,即使阅读了大量的文章和帖子,我也不知道我错过了什么。
所以,我在头文件中有以下结构和类。
typedef std::string::const_iterator iterator_type;
struct GrammarRules
{
qi::rule<iterator_type, ascii::space_type> create_char;
};
class Parser
{
public:
Parser();
bool parse(std::string const& to_parse);
private:
GrammarRules rules_;
gtor::World * world_;
};
然后我在.cpp文件中有以下内容:
Parser::Parser()
: rules_()
, world_(nullptr)
{
world_ = new gtor::World();
qi::rule<iterator_type, std::string(), ascii::space_type> qg_string;
qg_string %= qi::lexeme[ +(ascii::alnum) ];
rules_.create_char =
(
qi::lit("CreateChar")
>> '('
>> qg_string >> ','
>> qg_string >> ','
>> qi::int_
>> ')'
)
[
phx::bind(>or::World::createCharacter, world_, qi::_1, qi::_2, qi::_3)
]
;
}
...
bool Parser::parse(std::string const& to_parse)
{
iterator_type it = to_parse.begin();
iterator_type end = to_parse.end();
bool success = qi::phrase_parse(it, end, rules_.create_char, ascii::space);
/*qi::rule<iterator_type, std::string(), ascii::space_type> qg_string;
qg_string %= qi::lexeme[ +(ascii::alnum) ];
qi::rule<iterator_type, ascii::space_type> create_char1 =
(
qi::lit("CreateChar")
>> '('
>> qg_string >> ','
>> qg_string >> ','
>> qi::int_
>> ')'
)
[
phx::bind(>or::World::createCharacter, world_, qi::_1, qi::_2, qi::_3)
]
;
bool success = qi::phrase_parse(it, end, create_char1, ascii::space);*/
if (success && it == end)
return true;
return false;
}
未在parse()
方法上发表评论的代码不起作用,只要解析器到达Access Violation
规则,我就会得到qg_string
。但是,评论的代码完美无缺。除了明显的差异外,它对我来说看起来完全一样。也许我错过了一些非常明显的东西,但我无法找到它。
如果我将所有内容都用作局部变量,那么我的代码工作已经花了很多时间。而且仍然找不到问题。
提前感谢您的帮助。 对不起,如果帖子中有任何错误(上午5点)。
答案 0 :(得分:2)
我不得不说,我并没有完全理解灵的深度。 但是如果在构造函数中声明了qg_string解析器,则在调用parse方法时它不存在。据我所知,层次结构中的规则仍然相互依赖。它们不会复制到“父”规则中。
答案 1 :(得分:1)
基本上问题是当你写:
rules_.create_char =
(
qi::lit("CreateChar")
>> '('
>> qg_string >> ','
>> qg_string >> ','
>> qi::int_
>> ')'
)
qg_string是一种(我真的不知道精神内部,所以不要引用我)只在rules_.create_char规则中引用(即没有复制),所以当qg_string规则在离开时被销毁构造函数它留下悬挂引用它,导致你遇到的崩溃。
有一个你可能可以使用的copy()函数,但对于你的问题,显而易见的解决方案是成为结构中的规则,就像你说过的那样(看看它们在大多数精神实例中是如何做的)。
(以防万一,您可以查看this example以获取使用copy()函数的示例,但这不适用于您的情况。)