使用boost spirit x3解析为集合

时间:2016-06-21 23:09:19

标签: c++ parsing c++14 boost-spirit 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;

1 个答案:

答案 0 :(得分:4)

  

我感兴趣的是,如果有一种方法可以使用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
);

Online Demo

为了让您的解析器在遇到重复项时失败,使用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
);

Online Demo