首页 >后端开发 >C++ >为什么分配给'auto”变量的 Spirit 解析器会导致问题,以及如何修复它们?

为什么分配给'auto”变量的 Spirit 解析器会导致问题,以及如何修复它们?

Barbara Streisand
Barbara Streisand原创
2024-11-21 11:23:13532浏览

Why Do Spirit Parsers Assigned to `auto` Variables Cause Issues, and How Can I Fix Them?

管理 Spirit 中的解析表达式

在此查询中,我们探讨将 Spirit 解析器分配给自动变量时遇到的挑战。虽然解析器在直接与 qi::parse() 一起使用时可能会无缝运行,但当解析器被分配给 auto 变量并重用时,就会出现问题。

这种行为的核心在于 Spirit 解析器的实现方式。 Proto 表达式模板构成 Spirit 的基础,维护对临时变量的引用。当解析器分配给 auto 变量时,底层 Proto 表达式也会建立对临时解析器的引用。

要解决此问题,可以使用以下几个选项:

  • qi ::copy(): 这个方法是在 Boost V2 主干中引入的,允许复制解析器,确保不同的副本并破坏引用
  • boost::proto::deep_copy: 该函数提供深度复制功能,也可以解决解析器引用的问题。
  • BOOST_SPIRIT_AUTO: 这个宏在之前的 Stack Overflow 响应中介绍过,可以用作复制的便捷简写

例如:

namespace qi = boost::spirit::qi;

int main()
{
    auto bracketed_z = qi::copy( '[' >> +qi::char_('z') >> ']' ); // Uses qi::copy()

    string line = "[z]";
    auto p = line.cbegin();
    printf("%d", qi::parse(p, line.cend(), bracketed_z)); // Now works with auto variable

    // Alternative using BOOST_SPIRIT_AUTO
    BOOST_SPIRIT_AUTO(bracketed_z, '[' >> +qi::char_('z') >> ']');
}

这些方法通过打破解析器和临时变量之间的引用链来解决问题,允许自动变量在 Spirit 中有效使用解析器。

以上是为什么分配给'auto”变量的 Spirit 解析器会导致问题,以及如何修复它们?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn