【问题标题】:How to find n occurences of an expression with boost spirit?如何找到 n 次出现具有增强精神的表达式?
【发布时间】:2015-10-16 15:45:29
【问题描述】:

我已将此语法传递给phrase_parse()

double_[push_back(phoenix::ref(v), _1)] >> *(*blank >> double_[push_back(phoenix::ref(v), _1)])

*(*blank 开头的第二个表达式,找出 0 次或多次出现的 '双倍的'。就我而言,我想确保它完全匹配 6 次出现。有没有可能在提振精神的情况下做到这一点?

【问题讨论】:

    标签: c++ regex boost boost-spirit boost-spirit-qi


    【解决方案1】:

    使用repeat 指令。解析数字列表时也无需使用semantic actions,您只需要% 运算符即可。在这种情况下,由于您的数字由空格分隔,因此您也不需要使用它,传递给 phrase_parse 的船长就可以了。

    auto result = qi::phrase_parse(first, last,
                                   qi::repeat(6)[qi::double_],
                                   qi::space,
                                   v);
    

    Live demo

    完整示例:

    #include <iostream>
    #include <string>
    #include <vector>
    
    #include <boost/spirit/include/qi.hpp>
    namespace qi = boost::spirit::qi;
    
    void parse(std::string const& s)
    {
        auto first = s.cbegin(), last = s.cend();
        std::vector<double> v;
    
        auto result = qi::phrase_parse(first, last,
                                       qi::repeat(6)[qi::double_],
                                       qi::space,
                                       v);
        if(result) {
            if(first == last) {
                std::cout << "Success (complete)  : ";
            } else {
                std::cout << "Success (incomplete): ";
            }
            for(auto d : v) std::cout << d << ' ';
            std::cout << " Remaining: " << std::string{first, last} << '\n';
    
        } else {
            std::cout << "Failed\n";
        }
    }
    
    int main()
    {
        parse("10 20   30 40 50       60      ");
        parse("10 20   30 40 50       60 70 80");
        parse("10 20   30 40");
    }
    

    输出:

    Success (complete)  : 10 20 30 40 50 60  Remaining: 
    Success (incomplete): 10 20 30 40 50 60  Remaining: 70 80
    Failed
    

    【讨论】:

    • 真的需要列表运算符(%' ')吗?由于您使用qi::space 作为船长,它什么也不做,但如果没有船长,它会做错事。
    • @cv_and_he 谢谢!我没有大量使用 Spirit 的经验,也不知道您可以在不使用 % 的情况下进行任何列表解析。更新了答案。
    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多