gpt4 book ai didi

c++ - 了解 Boost.spirit 的字符串解析器

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:21 24 4
gpt4 key购买 nike

#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。解析器应匹配 aaa。我编写的 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"),

现在哪一个最适用,取决于你的语法。

关于c++ - 了解 Boost.spirit 的字符串解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21959270/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com