У меня есть грамматика, которая до сих пор использовала стандартный boost :: spirit: : ascii :: space
/ boost :: spirit :: ascii :: space_type
шкипер.
У меня есть некоторые правила, которые используют шкипер, а некоторые нет, например
qi::rule<Iterator, PTR<Expression>(), ascii::space_type> expression;
qi::rule<Iterator, PTR<Term>()> term;
Когда я использую непропускающий нетерминал (например, термин
) внутри пропускающего нетерминала (например, выражение
), все работает так, как я ожидал - пробелы имеют значение только внутри термина
нетерминал.
Кроме того, до сих пор я был в порядке, включая нетерминалы, которые используют шкипер внутри нетерминалов, которые не используют qi :: skip
для восстановления пропускания, например
index = (qi::lit('[') >> qi::skip(ascii::space)[explist >> qi::lit(']')]);
Таким образом, пробелы не имеет значения внутри скобок []
, но находится снаружи.
Однако теперь я хочу добавить своего собственного мастера (я хочу сделать новые строки значимыми, а позже добавить пропуск комментариев). Моя грамматика шкипера выглядит так:
struct skip_grammar : qi::grammar<Iterator> {
qi::rule<Iterator> start;
skip_grammar() : skip_grammar::base_type(start) {
start = qi::char_("\t\r ");
}
};
Я смог добавить ее в свои определения правил, как
qi::rule<Iterator, PTR<Expression>(), skip_grammar> expression;
, но я не могу понять, как использовать мою грамматику пропуска в качестве аргумента для qi: : пропустить
(и заменить ascii :: space
). Я пробовал использовать тип, локальную переменную экземпляра и глобальную переменную экземпляра. Самое большее, что у меня получилось, - это заставить clang пожаловаться, что моему skip_grammar нужен конструктор копирования.Итак, я попытался добавить конструктор копирования в свою грамматику пропуска, но, очевидно, базовый класс boost :: noncopyable
существует не просто так, потому что мой двоичный сегмент почти сразу же отказал.
Как мне это использовать?
Спасибо