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> ())
)
>> ')';