Я бы хотел разобрать следующий текст:
group RGB
group RRGB
group GBBB
group RRGGG
Результирующий AST будет структурой, которая представляет количество каждого символа:
struct group
{
int r;
int g;
int b;
};
Для входов выше это будет 1,1,1
, 2,1,1
, 0,1,3
, 2,3,0
.
Я не могу прийти с какой-либо грамматикой, которая бы удобно подсчитывала символы и обеспечивала их порядок (GBR
должен не выполнять синтаксический анализ).
https://www.boost.org/doc/libs/develop/libs/spirit/doc/x3/html/spirit_x3/quick_reference/directive.html
Существует парсер x3::repeat
, но он содержит только определенное количество символов, его атрибут является контейнером.
x3::matches[a]
имеет атрибут bool
, но я не знаю, сколько раз персонаж может появляться
Нет парсера, который бы считал появление и возвращал количество совпадений. Мне нужна грамматика типа x3::lit("group") >> count['R'] >> count['G'] >> count['B']
, но я не знаю, как определить count
.
На данный момент единственным рабочим решением, о котором я могу подумать, будет x3::lit("group") >> (*x3::char_['R'] >> *x3::char_['G'] >> *x3::char_['B'])[func]
, который затем вызывает func
, который будет просто работать со строкой. ИМО, это не чистое решение, оно требует семантических действий и создает ненужные строки.