C++ 使用boost spirit x3解析为具有布尔或枚举成员的结构

C++ 使用boost spirit x3解析为具有布尔或枚举成员的结构,c++,parsing,c++14,boost-spirit,boost-spirit-x3,C++,Parsing,C++14,Boost Spirit,Boost Spirit X3,如果我有一个结构: struct person{ bool is_male; std::string name; std::vector<std::string> friends; } struct-person{ 布尔是男性; std::字符串名; 病媒朋友; } 或 enum类性别{男,女} 结构人{ 性别与性别; std::字符串名; 病媒朋友; } 如何使用boost.spirit X3解析此结构? 规则解析一个类似“alice-male-bob

如果我有一个结构:

struct person{
    bool is_male;
    std::string name;
    std::vector<std::string> friends;
}
struct-person{
布尔是男性;
std::字符串名;
病媒朋友;
}

enum类性别{男,女}
结构人{
性别与性别;
std::字符串名;
病媒朋友;
}
如何使用boost.spirit X3解析此结构? 规则解析一个类似“alice-male-bob”的字符串,解析器返回一个名为alice的对象,该对象是男性,有一个朋友bob。 如果只有在对方不是女性的情况下才明确说出性别,那会是什么样子

要使用boost spirit x3作为解析器,请访问以下内容

关于问题:

如果这个人不是女性,那么性别只是明确的说出来,那会是什么样子


我认为更灵活地使用
枚举类性别:uint8_t
,因为您可以添加未指定的性别。这正是Spirit的符号表的用途–事实上,它是Spirit文档()中的主要教程之一

首先,您需要适当调整您的类型:

struct person {
    std::string name;
    gender_t gender;
    std::vector<std::string> friends;
};
BOOST_FUSION_ADAPT_STRUCT(person, name, gender, friends)
struct-person{
std::字符串名;
性别与性别;
病媒朋友;
};
增强融合适应结构(个人、姓名、性别、朋友)
注意,我已经改变了成员的顺序——因为我们想要解析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;
}
person解析_person(std::string const&str){
名称空间x3=boost::spirit::x3;
结构性别表:x3::符号{
性别(表){
添加(“男性”,性别:男性)
(“女性”,性别:女性);
}
}性别常数;
auto const word=x3::lexeme[+~x3::space];
自动常量分析器
=单词//名称
>>(性别| x3::attr(性别| t::女性))//性别
>>*word;//朋友
人{};
x3::短语解析(str.cbegin(),str.cend(),解析器,x3::space,ret);
返回ret;
}


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

我不明白这个问题。。。为了解决这个问题,您编写了哪些代码?它只是拆分一个空格分隔的字符串。您尝试了什么?我认为您不太可能找到愿意为您编写代码的人,但如果您向我们展示您迄今为止所做的尝试,那么可能会有人愿意帮助您。解析到结构不是问题,但我不知道如何解析到带有枚举的结构,这就是问题所在,我甚至没有想法。我实际上对使用boost spirit x3直接解析到带有枚举或布尔成员的结构中很感兴趣。我的例子就是一个MCVEI think
parser=word>>(genders | x3::attr(gender|t::female))>+word
也可以工作。@jv|是的,改进了很多,谢谢!我的解决方案没有让我满意,但我无法立即想到一个不涉及
x3::rule
的替代方案。现在很明显…;-]哇,对于x3::attr(),这个答案太完美了,正是我想要的。非常感谢。
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;
}