【发布时间】:2012-03-01 13:11:45
【问题描述】:
这是我第一次在这里提问。我已经花了很多时间和研究来完成这项工作,但我做不到。我真的希望你能帮助我。我是使用 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() 方法上未注释的代码不起作用,只要解析器到达qg_string 规则,我就会得到一个Access Violation。但是,注释的代码可以完美运行。除了明显的差异外,它对我来说看起来完全一样。也许我遗漏了一些非常明显的东西,但我找不到它。
如果我将所有内容都用作局部变量,我已经花了很多时间才发现我的代码可以工作。还是找不到问题。
提前感谢您的帮助。 抱歉,如果帖子中有任何错误(早上 5 点)。
【问题讨论】:
-
我通过在结构中添加
qg_string规则解决了这个问题。虽然我不完全理解为什么会解决它。任何提示将不胜感激。
标签: c++ parsing boost-spirit boost-spirit-qi