理解 Boost.spirit 的字符串解析器

2023-11-26

#include <iostream>
#include <boost/spirit/include/qi.hpp>

namespace qi = boost::spirit::qi;
int main ()
{
    using qi::string;

    std::string input("a");
    std::string::iterator strbegin = input.begin();
    std::string p;
    bool ok = qi::phrase_parse(strbegin, input.end(),
            ((string("a")  >> string("a")) | string("a")),
            qi::space,                  
            p);                               

    if (ok && strbegin == input.end()) {
        std::cout << p << std::endl;
        std::cout << p.size() << std::endl;
    } else {
        std::cout << "fail" << std::endl;
        std::cout << std::string(strbegin, input.end()) << std::endl;
    }
}

该程序输出aa。这怎么可能?输入字符串是a。解析器应该匹配aa or a。我已经写了string("a")仅供测试操作员使用。

使用时也是一样char_代替string.


它本身不是字符串匹配器。它的作用是[属性传播]+[回溯]。

字符串属性是一个容器属性,许多元素可以通过不同的解析器子表达式分配给它。现在,出于效率原因,Spirit 不会在回溯时回滚发出的属性值。

通常这根本不是问题,但正如您所看到的,替代方案失败的第一个分支中的“a”仍然存在。

要么改写,要么使用“大枪”qi::hold[]指示:

(qi::hold [ string("a")  >> string("a") ] | string("a")),

改写可能如下所示:

qi::string("a") >> -qi::string("a"),

另外,如果您真的只是想匹配某些文本字符串,请考虑:

(qi::raw [ qi::lit("aa") | "a" ]), 
// or even just
qi::string("aa") | qi::string("a"),

现在哪一项最适用,取决于您的语法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

理解 Boost.spirit 的字符串解析器 的相关文章

随机推荐