2016-06-21 31 views
2

我有兴趣,如果有一种方法来解析成一套使用助推精神x3。背景是我有一串标记,每个标记代表一个枚举值,现在我想创建一个解析器,解析每个标记是否至多在字符串中最多一次,如果我能够获得所有解析,这将是一种魅力令牌在分析时分成std::set。 要获得枚举从我使用的是symbol_table解析字符串返回:使用助推精神解析为一套x3

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

I am interested in if there is a way to parse into a set using boost spirit x3.

精神可以解析为std::set<>开箱(至少在升压1.61.0的),所以按照已经

std::set<foo> foos; 
x3::phrase_parse(
    input.begin(), input.end(), 
    +enum_parser, 
    x3::space, 
    foos 
); 

Online Demo

为了让你:你已经证明了作品类型[R解析器在遇到重复失败了,这是最容易实现的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

+0

哇哦didnt知道它可以解析为一组开箱。感谢与语义行动的技巧 – Exagon

+1

这不适用于boost版本1.60.0我得到一个错误:»class std :: set «没有名为»push_back«'的成员,所以这真的可以工作,因为升压版本1.61 0.0 – Exagon