管理 Spirit 中的解析表达式
在此查询中,我们探讨将 Spirit 解析器分配给自动变量时遇到的挑战。虽然解析器在直接与 qi::parse() 一起使用时可能会无缝运行,但当解析器被分配给 auto 变量并重用时,就会出现问题。
这种行为的核心在于 Spirit 解析器的实现方式。 Proto 表达式模板构成 Spirit 的基础,维护对临时变量的引用。当解析器分配给 auto 变量时,底层 Proto 表达式也会建立对临时解析器的引用。
要解决此问题,可以使用以下几个选项:
例如:
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中文网其他相关文章!