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