请告知升压精神替代运营商。
test_parser()已发布在官网上。
test_parser("Hello", string("Hell") | string("Hello"));
输出
fail
我认为 string("Hell") 失败,然后下一步 尝试 字符串(“你好”)就可以了
test_parser("Hello", string("Hello") | int_);
test_parser("123", string("Hello") | int_);
简而言之,
a | b
只能解析 b
IFF a
失败。原因是 PEG(解析器表达式语法)从左到右贪婪地解析。这是在这里记录的:https://www.boost.org/doc/libs/1_86_0/libs/spirit/doc/html/spirit/abstracts/parsing_expression_grammar.html(注意指向_Difference
解析器的链接 ).
所以在你的例子中
string("Hello")
永远不会匹配,因为它总是首先匹配string("Hell")
。重新排序有帮助:
test_parser("Hello", qi::string("Hell") | qi::string("Hello"));
test_parser("Hello", qi::string("Hello") | qi::string("Hell"));
打印
Matched: Hell
Matched: Hello
您还可以考虑
qi::symbols
它将自动按照找到最长可能匹配的顺序尝试元素:
住在科里鲁
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
template <typename Expr> void test_parser(std::string_view input, Expr const& parser) {
std::string result;
if (qi::parse(input.begin(), input.end(), parser, result)) {
std::cout << "Matched: " << result << std::endl;
} else {
std::cout << "Failed to match" << std::endl;
}
}
int main() {
test_parser("Hello", qi::string("Hell") | qi::string("Hello"));
test_parser("Hello", qi::string("Hello") | qi::string("Hell"));
std::cout << "\nUsing symbols" << std::endl;
qi::symbols<char, std::string> sym;
sym.add("Hello", "Hello");
sym.add("World", "World");
sym.add("Hell", "Hell");
sym.add("Wor", "Wor");
test_parser("Hell", sym);
test_parser("Hello", sym);
test_parser("World", sym);
test_parser("Wor", sym);
test_parser("Worst", sym);
}
打印
Matched: Hell
Matched: Hello
Using symbols
Matched: Hell
Matched: Hello
Matched: World
Matched: Wor
Matched: Wor