#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
或a
匹配。我只为测试运营商编写了string("a")
。
使用char_
代替string
时也一样。
答案 0 :(得分:6)
这不是字符串匹配器本身。它的[属性传播] + [回溯]在行动中。
字符串属性是容器属性,可以通过不同的解析器子表达式将许多元素分配给它。现在出于效率原因,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"),
现在哪一个最适用,取决于你的语法。