【问题标题】:Boost Spirit nested componentsBoost Spirit 嵌套组件
【发布时间】:2021-05-22 20:15:01
【问题描述】:

我正在尝试用灵气解析以下消息:

"A/B AND C/D", "A/B", "A/B AND C/D AND E/F"

我能够解析“A/B”,但无法获得其他字符串的正确结果。

我尝试了以下代码:

qi::rule<It, AstNodeVector()> entries;
qi::rule<It, AstNodeVector()> lists;
qi::rule<It, std::string()> element;

this->entries= *(this->lists % " AND ");
this->lists= this->element >> '/' >> this->element;
this->element = qi::char_("A-Z");

我的语法有什么问题?

【问题讨论】:

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


    【解决方案1】:

    看来您没有跳过空格。也许这是一个概念问题(参见Boost spirit skipper issues)。

    不管怎样,它确实会解析:

    Live On Coliru

    #include <boost/spirit/include/qi.hpp>
    #include <iomanip>
    namespace qi = boost::spirit::qi;
    
    using AstNodeVector = std::vector<std::string>;
    
    template <typename It>
    struct P : qi::grammar<It, AstNodeVector()> {
        P() : P::base_type(entries) {
            entries = *(lists % " AND ");
            lists   = element >> '/' >> element;
            element = qi::char_("A-Z");
        }
      private:
        qi::rule<It, AstNodeVector()> entries;
        qi::rule<It, AstNodeVector()> lists;
        qi::rule<It, std::string()> element;
    };
    
    int main() {
        using It = std::string::const_iterator;
        P<It> const p {};
    
        for (std::string const input: {
            "A/B AND C/D",
            "A/B",
            "A/B AND C/D AND E/F",
            })
        {
            It f = begin(input), l = end(input);
            AstNodeVector results;
            if (phrase_parse(f, l, p, qi::space, results)) {
                std::cout << "Success: " << std::quoted(input) << "\n";
                for (auto& el : results) {
                    std::cout << " -- " << std::quoted(el) << "\n";
                }
            } else {
                std::cout << "FAIL: " << std::quoted(input) << "\n";
            }
    
            if (f != l) {
                std::cout << "Remaining input: " << std::quoted(std::string(f,l)) << "\n";
            }
        }
    }
    

    打印

    Success: "A/B AND C/D"
     -- "A"
     -- "B"
     -- "C"
     -- "D"
    Success: "A/B"
     -- "A"
     -- "B"
    Success: "A/B AND C/D AND E/F"
     -- "A"
     -- "B"
     -- "C"
     -- "D"
     -- "E"
     -- "F"
    

    也许您应该包含自包含代码,或者详细说明问题所在。

    【讨论】:

    • 谢谢!由于空间处理而发生错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    相关资源
    最近更新 更多