我正在尝试使用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 % ".")
的这一部分会消耗整个字符串。
如何更改规则以在结构中正确解析?
答案 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;
问题是p % delimit
是p >> *(delimit >> p)
的简写,即在分隔符后总是消耗一个p
。但是,您想要的是*(p >> delimit)
,以便在分隔符后不会消耗p
,而是留给下一个规则。