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

Другие вопросы по тегам