Boost Spirit Qi Re-Establish Пропуск с пользовательской грамматикой пропуска

У меня есть грамматика, которая до сих пор использовала стандартный 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 существует не просто так, потому что мой двоичный сегмент почти сразу же отказал.

Как мне это использовать?

Спасибо

7
задан jtolds 18 February 2011 в 04:52
поделиться