提升精神替代干员

问题描述 投票:0回答:1

请告知升压精神替代运营商。

test_parser()已发布在官网上。

test_parser("Hello", string("Hell") | string("Hello"));

输出

fail

我认为 string("Hell") 失败,然后下一步 尝试 字符串(“你好”)就可以了

boost boost-spirit boost-spirit-qi
1个回答
0
投票

文档示例不同:https://www.boost.org/doc/libs/1_86_0/libs/spirit/doc/html/spirit/qi/reference/operator/alternative.html#spirit.qi.reference。运算符.alternative.example

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
© www.soinside.com 2019 - 2024. All rights reserved.