微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Boost Spirit 嵌套组件

如何解决Boost Spirit 嵌套组件

我正在尝试使用 Spirit Qi 解析以下消息:

"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");

我的语法有什么问题?

解决方法

看来您没有跳过空格。也许这是一个概念上的问题(参见 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"

也许您应该包含自包含的代码,或者详细说明问题究竟出在哪里。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?