Разбор списка строк с последующим списком строк с 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 ответ
Предполагая ваш 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
потребляется после разделителя и вместо этого остается для следующего правила.