У меня есть грамматика, которая до сих пор использовала стандартный boost::spirit::ascii::space
/ boost::spirit::ascii::space_type
шкипер.
У меня есть некоторые правила, которые используют шкипер, а некоторые нет, например
qi::rule<Iterator, PTR<Expression>(), ascii::space_type> expression;
qi::rule<Iterator, PTR<Term>()> term;
Когда я использую не пропускающий нетерминал (например, term
) внутри пропускающего нетерминала (например, expression
), все работает так, как я и ожидал - пробел имеет значение только внутри term
нетерминала.
Кроме того, до сих пор у меня все было в порядке, включая нетерминалы, которые используют шкипер внутри нетерминалов, которые не используют qi::skip
для восстановления пропуска, например
index = (qi::lit('[') >> qi::skip(ascii::space)[explist >> qi::lit(']')]);
ThisКстати, пробелы не являются значительными внутри скобок []
, но находятся за их пределами.
Однако теперь я хочу добавить свой собственный шкипер (я хочу сделать новые строки значительными, а позже добавить пропуск комментариев).Моя грамматика шкипера выглядит следующим образом:
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::skip
(и замена ascii::space
).Я попытался использовать тип, локальную переменную экземпляра и глобальную переменную экземпляра.Самое большее, что я получил, - это заставил clang пожаловаться на то, что моему skip_grammar нужен конструктор копирования.Поэтому я попытался добавить конструктор копирования в мою пропущенную грамматику, но, очевидно, базовый класс boost::noncopyable
существует по какой-то причине, потому что мой двоичный файл вышел из строя почти сразу.
Как мне использовать это?
Спасибо