Можно ли повторно использовать грамматику boost::spirit::qi в другом определении грамматики?

Можно ли повторно использовать грамматику boost::spirit:qiв другой грамматике (например, как правило)?

Например, если я определяю грамматику для разбора строки текста в структуру, содержащую почтовый адрес.

   template< typename iter >
        struct address_grammar : qi::grammar< iter, address() >
   {
     ...

       qi::rule< iter, std::string() > street_name;
       qi::rule< iter, std::string() > street_number;
       qi::rule< iter, address() > address_;
   }

Я мог бы захотеть повторно использовать эту грамматику в двух других грамматиках, например, для синтаксического анализа вектора адресов, хранящихся в файле. Другое повторное использование может быть в более сложной структуре, где одним из полей является эта структура почтового адреса.

  template< typename iter >
      struct company_grammar : qi::grammar< iter, company() >
  {
     ...
     qi::rule< iter, std::string() > comp_name;
     // can I reuse the address grammar somehow here ???
     qi::rule< iter, company() > company;
  }

Вместо того, чтобы определять всю грамматику в одном месте, я думаю разбить ее на более мелкие повторно используемые блоки, это нормально, если они находятся внутри одного заголовочного файла. Мои структуры данных немного сложнее (пара полей внутри структуры со списком других структур и т. д.), поэтому я не хочу помещать это в одну грамматику.

Можно ли повторно использовать грамматику boost::spirit::qiтаким образом?

РЕДАКТИРОВАТЬ:Думая об этом, могу ли я просто определить qi::rules в пространстве имен, а затем составить грамматику из правил, которые мне нужны?

22
задан Dan Nissenbaum 8 June 2014 в 19:24
поделиться