【问题标题】:Boost Spirit Rule's assignment operatorBoost Spirit Rule 的赋值运算符
【发布时间】: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(&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() 方法上未注释的代码不起作用,只要解析器到达qg_string 规则,我就会得到一个Access Violation。但是,注释的代码可以完美运行。除了明显的差异外,它对我来说看起来完全一样。也许我遗漏了一些非常明显的东西,但我找不到它。

如果我将所有内容都用作局部变量,我已经花了很多时间才发现我的代码可以工作。还是找不到问题。

提前感谢您的帮助。 抱歉,如果帖子中有任何错误(早上 5 点)。

【问题讨论】:

  • 我通过在结构中添加qg_string 规则解决了这个问题。虽然我不完全理解为什么会解决它。任何提示将不胜感激。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    就像 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() 函数的示例,但这对于您的情况应该不是必需的)。

    【讨论】:

      猜你喜欢
      • 2011-04-05
      • 1970-01-01
      • 2011-08-02
      • 2019-10-06
      • 2011-11-16
      • 1970-01-01
      • 2013-11-30
      • 2015-10-02
      • 1970-01-01
      相关资源
      最近更新 更多