Boost Spirit x3 разобрать в структуру с пропуском члена, если он пуст

Я пытаюсь выяснить способ разбора следующих текстов

function() {body ...}
function(args_) {body...}

Должен ли я использовать одну и ту же структуру для обоих вариантов, или это можно сделать только с одной структурой

struct function
{
    std::string name_;
    std::vector<std::string> args_;
    statement_list body_;
};

Способ, которым я сейчас разбираю (как пропустить аргументы, если аргументов нет):

auto const identifier_def = raw[lexeme[(alpha | '_') >> *(alnum | '_')]];
auto const function_def  =
        lexeme["function" >> !(alnum | '_')] >> identifier
     >> '(' >> ((identifier % ',') )>> ')'
     >> '{' >> statement  >> '}'
        ;

И я мог бы разобрать вариант с аргументами, но не тот без аргументов!

Я пытаюсь использовать что-то вроде оператора OR, но безуспешно.

Спасибо!

1 ответ

Как подсказка, обычно это работает:

 >> '(' >> -(identifier % ',') >> ')'

В зависимости от конкретных типов (особенно объявление identifier) у вас может быть такой твик:

 >> '(' >> (-identifier % ',') >> ')'

Идея заставить его:

 x3::rule<struct arglist_, std::vector<std::string> > { "arglist" }
         = '(' >> (
                       identifier % ','
                     | x3::attr(std::vector<std::string> ())
                   )
         >> ')';
Другие вопросы по тегам