【问题标题】:access violation when parsing spirit rule with `alias()`使用“alias()”解析精神规则时访问冲突
【发布时间】:2012-12-05 10:41:55
【问题描述】:

我尝试使用由以下规则构造的语法来解析字符串“1-2”:

spirit::qi::rule<Iterator, spirit::utf8_symbol_type()> op1 = "-";
spirit::qi::rule<Iterator, spirit::utf8_symbol_type()> op2 = "+";

spirit::qi::rule<Iterator, spirit::utree(), spirit::qi::space_type> numberParser = boost::spirit::qi::double_;

spirit::qi::rule<Iterator, spirit::utree(), spirit::qi::space_type> expressionParser;
expressionParser = numberParser >> -( (op1 >> expressionParser) | (op2 >> expressionParser)); 

start = expressionParser.alias();

start 是我的语法课的成员:

spirit::qi::rule<Iterator, spirit::utree(), spirit::qi::space_type> start;

按照这里的规则,我想为每个二进制操作+和-从左到右创建一个节点。

当我现在使用以下方法解析字符串“1-2”时:

void Parse(const std::string& testString, const CDynamicExpressionSyntaxParser<const char*>& parser)  
{
    char const* first = testString.c_str();
    char const* last = &first[testString.size()];
    boost::spirit::utree tree;
    bool success = boost::spirit::qi::phrase_parse(first,last,parser, boost::spirit::qi::space,tree);
    std::cout << "tree: " << tree << '\n'; 
}

我在 rule.hpp 中遇到访问冲突。我做错了什么?

【问题讨论】:

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


    【解决方案1】:

    我认为原因可以在这里找到:Copy or reference semantics of boost::spirit's rule<>? - 特别是:

    当在 EBNF 表达式右侧的任何位置引用规则时,该规则通过引用由表达式持有。客户端有责任确保被引用的规则保持在范围内并且在被引用时不会被破坏。

    事实并非如此。

    【讨论】:

    • +1 获取良好信息。这可能对其他人有帮助。我将在 SEO 的标题或标签中偷偷提及rule::alias()
    【解决方案2】:

    而不是这个....

    char const* last = &first[testString.size()];
    

    试试这个....

    char const* last = &first[testString.size()-1];
    

    【讨论】:

    • 否 - 通过此修复,其他示例不再正确解析(并且无法修复访问冲突)
    猜你喜欢
    • 1970-01-01
    • 2013-01-14
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多