提升精神规则的赋值运算符

时间:2012-03-01 13:11:46

标签: c++ parsing boost-spirit boost-spirit-qi

这是我第一次在这里提问。它已经花了我很多时间和研究来使这个工作,我不能。我真的希望你能帮助我。我是使用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(&gtor::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(&gtor::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点)。

2 个答案:

答案 0 :(得分:2)

我不得不说,我并没有完全理解灵的深度。 但是如果在构造函数中声明了qg_string解析器,则在调用parse方法时它不存在。据我所知,层次结构中的规则仍然相互依赖。它们不会复制到“父”规则中。

答案 1 :(得分:1)

像Smittii所说的那样,问题是当调用parse时规则不再存在,因为它在构造函数中被声明为本地(在调用parse时将执行它)。评论中的那个仍然存在于整个解析中,因此它起作用。

基本上问题是当你写:

rules_.create_char =
        (
            qi::lit("CreateChar")
            >> '('
            >> qg_string >> ','
            >> qg_string >> ','
            >> qi::int_
            >> ')'
        )

qg_string是一种(我真的不知道精神内部,所以不要引用我)只在rules_.create_char规则中引用(即没有复制),所以当qg_string规则在离开时被销毁构造函数它留下悬挂引用它,导致你遇到的崩溃。

有一个你可能可以使用的copy()函数,但对于你的问题,显而易见的解决方案是成为结构中的规则,就像你说过的那样(看看它们在大多数精神实例中是如何做的)。

(以防万一,您可以查看this example以获取使用copy()函数的示例,但这不适用于您的情况。)