2

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

1 回答 1

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

为了让您的解析器在遇到重复项时失败,这最容易通过语义操作来完成:

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

于 2016-06-22T01:18:38.133 回答