解析字符串列表,后跟精灵x3的字符串列表

时间:2016-07-22 14:41:38

标签: c++ parsing c++14 boost-spirit boost-spirit-x3

我正在尝试使用boost spirit x3将字符串解析为结构:

struct identifier {
    std::vector<std::string> namespaces;
    std::vector<std::string> classes;
    std::string identifier;

};

现在我有一个解析器规则来匹配这样的字符串:

foo::bar::baz.bla.blub
foo.bar
boo::bar
foo

我的解析器规则看起来像这样。

auto const nested_identifier_def =
        x3::lexeme[
                -(id_string % "::")
                >> -(id_string % ".")
                >> id_string
        ];

其中id_string解析alphanum的组合。 我知道这个规则不能解析我想要的,因为在解析foo.bar时,例如规则-(id_string % ".")的这一部分会消耗整个字符串。 如何更改规则以在结构中正确解析?

1 个答案:

答案 0 :(得分:3)

假设您的id_string是这样的:

auto const id_string = x3::rule<struct id_string_tag, std::string>{} =
    x3::lexeme[
            (x3::alpha | '_')
        >> *(x3::alnum | '_')
    ];

然后我认为这就是你之后的事情:

auto const nested_identifier_def =
       *(id_string >> "::")
    >> *(id_string >> '.')
    >>  id_string;

Online Demo

问题是p % delimitp >> *(delimit >> p)的简写,即在分隔符后总是消耗一个p 。但是,您想要的是*(p >> delimit),以便在分隔符后不会消耗p,而是留给下一个规则。