使用 boost spirit x3 解析为具有布尔值或枚举成员的结构
parsing into structs with boolean or enum members with boost spirit x3
如果我有一个结构:
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。
如果这个人不是女性,如果只明确说出性别会是什么样子?
For using boost spirit x3 as parser, visit this link.
针对问题:
How would it look like if the gender is only explicit said if the person is not female?
我认为使用enum class Gender : uint8_t
更灵活,因为你可以添加未指定的性别。
这正是 Spirit 的符号 table 的用途 – 事实上,它是 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)
N.b。我已经改变了成员的顺序——因为我们想要解析名称 -> 性别 -> 朋友,如果我们也以这种方式构建我们的类型,那将是最简单的。现在,解析:
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;
}
(如果您不想更改数据成员的顺序以方便解析,那么 here 是一种让所有这些都变得非侵入性的方法。)
如果我有一个结构:
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。 如果这个人不是女性,如果只明确说出性别会是什么样子?
For using boost spirit x3 as parser, visit this link.
针对问题:
How would it look like if the gender is only explicit said if the person is not female?
我认为使用enum class Gender : uint8_t
更灵活,因为你可以添加未指定的性别。
这正是 Spirit 的符号 table 的用途 – 事实上,它是 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)
N.b。我已经改变了成员的顺序——因为我们想要解析名称 -> 性别 -> 朋友,如果我们也以这种方式构建我们的类型,那将是最简单的。现在,解析:
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;
}
(如果您不想更改数据成员的顺序以方便解析,那么 here 是一种让所有这些都变得非侵入性的方法。)