使用 boost spirit x3 解析成一个集合
Parsing into a set using boost spirit x3
我感兴趣的是是否有一种方法可以使用 boost spirit x3 解析成一个集合。背景是我有一串标记,每个标记代表一个枚举值,现在我想创建一个解析器来解析每个标记是否在字符串中最多一次,如果我能得到所有解析的,那将是一个魅力解析时将标记转换为 std::set
。
为了从解析的字符串中取回枚举,我使用了 symbol_table:
enum class foo{bar, baz, bla, huh};
struct enum_table : x3::symbols<foo> {
enum_table() {
add("bar", foo::bar)
("baz", foo::baz)
("huh", foo::huh);
}
} const enum_parser;
I am interested in if there is a way to parse into a set using boost spirit x3.
Spirit 可以开箱即用地解析为 std::set<>
(至少从 Boost 1.61.0 开始),因此以下内容已经适用于您展示的类型:
std::set<foo> foos;
x3::phrase_parse(
input.begin(), input.end(),
+enum_parser,
x3::space,
foos
);
要让您的解析器在遇到重复项时失败,最容易实现的方法是 semantic actions:
std::set<foo> foos;
auto insert_foo_or_fail = [&foos](auto& ctx) {
_pass(ctx) = foos.insert(_attr(ctx)).second;
};
x3::phrase_parse(
input.begin(), input.end(),
+x3::omit[enum_parser[insert_foo_or_fail]],
x3::space
);
我感兴趣的是是否有一种方法可以使用 boost spirit x3 解析成一个集合。背景是我有一串标记,每个标记代表一个枚举值,现在我想创建一个解析器来解析每个标记是否在字符串中最多一次,如果我能得到所有解析的,那将是一个魅力解析时将标记转换为 std::set
。
为了从解析的字符串中取回枚举,我使用了 symbol_table:
enum class foo{bar, baz, bla, huh};
struct enum_table : x3::symbols<foo> {
enum_table() {
add("bar", foo::bar)
("baz", foo::baz)
("huh", foo::huh);
}
} const enum_parser;
I am interested in if there is a way to parse into a set using boost spirit x3.
Spirit 可以开箱即用地解析为 std::set<>
(至少从 Boost 1.61.0 开始),因此以下内容已经适用于您展示的类型:
std::set<foo> foos;
x3::phrase_parse(
input.begin(), input.end(),
+enum_parser,
x3::space,
foos
);
要让您的解析器在遇到重复项时失败,最容易实现的方法是 semantic actions:
std::set<foo> foos;
auto insert_foo_or_fail = [&foos](auto& ctx) {
_pass(ctx) = foos.insert(_attr(ctx)).second;
};
x3::phrase_parse(
input.begin(), input.end(),
+x3::omit[enum_parser[insert_foo_or_fail]],
x3::space
);