【问题标题】:parsing into structs with boolean or enum members with boost spirit x3使用boolean或enum成员解析为具有boolean精神x3的结构
【发布时间】:2016-06-10 13:18:41
【问题描述】:

如果我有一个结构:

struct person{
    bool is_male;
    std::string name;
    std::vector<std::string> friends;
}

enum class gender_t{male, female}
struct person{
        gender_t gender;
        std::string name;
        std::vector<std::string> friends;
}

如何使用 boost.spirit X3 解析到这个结构? 规则如何解析像“alice male bob”这样的字符串,解析器返回一个名为 alice 的对象,该对象是男性并且有一个朋友 bob。 如果仅在此人不是女性的情况下明确表示性别,那会是什么样子?

【问题讨论】:

  • 我不明白这个问题...您编写了哪些代码来尝试解决这个问题?它只是分割一个空格分隔的字符串。
  • 你试过什么?我认为您不太可能找到愿意为您编写代码的人,但如果您向我们展示您迄今为止所做的尝试,那么有人可能会愿意帮助您。
  • 解析成结构不是问题,但我不知道如何用枚举解析成结构,这就是我什至不知道的问题

标签: c++ parsing c++14 boost-spirit boost-spirit-x3


【解决方案1】:

这正是 Spirit 符号表的用途——事实上,它是 Spirit 文档 (Spirit.X3: Roman Numerals) 中的主要教程之一。

首先你需要适当地调整你的类型:

struct person {
    std::string name;
    gender_t gender;
    std::vector<std::string> friends;
};
BOOST_FUSION_ADAPT_STRUCT(person, name, gender, friends)

注意我已经改变了成员的顺序——因为我们想要解析名字 -> 性别 -> 朋友,如果我们也以这种方式构造我们的类型是最简单的。现在,解析:

person parse_person(std::string const& str) {
    namespace x3 = boost::spirit::x3;

    struct gender_table : x3::symbols<gender_t> {
        gender_table() {
            add ("male"   , gender_t::male)
                ("female" , gender_t::female);
        }
    } const gender;
    auto const word = x3::lexeme[+~x3::space];
    auto const parser
      =    word                                  // name
        >> (gender | x3::attr(gender_t::female)) // gender
        >> *word;                                // friends

    person ret{};
    x3::phrase_parse(str.cbegin(), str.cend(), parser, x3::space, ret);
    return ret;
}

Online Demo

(如果您不想更改数据成员的顺序以方便解析,那么here 是一种让所有这些都成为非侵入性的方法。)

【讨论】:

  • 我认为parser = word &gt;&gt; (genders | x3::attr(gender_t::female)) &gt;&gt; +word 也可以。
  • @jv_ :是的,改进很多,谢谢!我的解决方案没有让我满意,但我想不出不涉及x3::rule 的替代方案。现在很明显...... ;-]
  • 哇,x3::attr() 这个答案很完美,正是我想要的。谢谢
【解决方案2】:

如需使用 boost spirit x3 作为解析器,请访问link

The documentation of boost::Spirit

关于问题:

如果仅在此人不是女性的情况下明确表示性别,会是什么样子?

我认为使用enum class Gender : uint8_t 更灵活,因为您可以添加例如未指定的性别。

【讨论】:

  • 我实际上有兴趣将 boost spirit x3 直接解析为带有 enum 或 bool 成员的结构,我的示例只是一个 MCVE
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多