用 spirit x3 解析字符串列表后跟字符串列表

Parsing a list of strings followed by a list of strings with 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 % ".") 的这一部分会消耗整个字符串。 我如何更改规则以在结构中正确解析?

假设您的 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 % delimit 对于 p >> *(delimit >> p) 是 shorthand,即它总是在 分隔符之后消耗一个 p .但是,您想要的是 *(p >> delimit),这样在定界符之后就不会消耗 p,而是留给下一个规则使用。