Как я могу принять «значение по умолчанию» при разборе с использованием boost :: spirit? - PullRequest
3 голосов
/ 17 марта 2010

Допустим, у меня есть грамматика, определенная для чего-то вроде:

some_rule := a b [c [d]]

где c и d являются необязательными и по умолчанию имеют определенное значение (скажем, 14), если не задано. Могу ли я получить значение по умолчанию для 14, если значение не указано? Я хочу, чтобы полученный std::vector всегда был размером 4.

Самое близкое, что я пришел, похоже на следующее:

qi::rule<Iterator, std::vector<int>(), ascii::space_type> some_rule;
some_rule %= int_ >> int_ >> -int_ >> -int_;

// ...

some_other_rule = some_rule[&some_callback_for_int_vectors];

, который затем получит 0 для необязательных значений, которые не отображаются (я полагаю). Затем я меняю последовательные 0 в конце на 14. Это не только ужасно неправильно, но и просто не элегантно. Есть ли лучший способ сделать это?

1 Ответ

7 голосов
/ 17 марта 2010

Похоже, вы можете сделать это с помощью вспомогательного парсера boost::qi::attr.

int default_value = 14;

qi::rule<Iterator, int(),              ascii::space_type> some_optional_rule;
qi::rule<Iterator, std::vector<int>(), ascii::space_type> some_rule;

some_optional_rule %= int_ | attr(default_value);
some_rule          %= repeat(2)[int_] >> repeat(2)[some_optional_rule];

Я все еще не уверен, если это лучший способ сделать это, хотя.

...