给定一个合成用户定义类型的语法,我如何编写另一个语法:
- 重用第一个语法。
- 使用第一种类型的基础值合成第二种不同的类型?
在下面的示例中,我按照 Boost Spirit 文档创建了一个解析器,foo_parser它合成了一个 type 的值foo_struct。我想编写第二个解析器,bar_parser它重用foo_parser但合成一个不同(但显然相似)的 type 值bar_struct。注释掉的我的幼稚示例会导致壮观的 g++ 烟花。:)
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
namespace s  {
  using namespace boost::spirit;
  using namespace boost::spirit::qi;
  using namespace boost::spirit::ascii;
}
struct foo_struct {
  int i;
  char c;
};
BOOST_FUSION_ADAPT_STRUCT(
  foo_struct,
  (int, i)
  (char, c)
)
struct bar_struct {
  int i;
  char c;
  int j;
};
template <typename Iterator>
struct foo_parser : s::grammar<Iterator, foo_struct()>
{
  foo_parser() : foo_parser::base_type(start) {
    start %= s::int_ >> s::char_ ;
  }
  s::rule<Iterator, foo_struct()> start;
};
/*
BOOST_FUSION_ADAPT_STRUCT(
  bar_struct,
  (int, i)
  (char, c)
  (int, j)
)
template <typename Iterator>
struct bar_parser : s::grammar<Iterator, bar_struct()>
{
  bar_parser() : bar_parser::base_type(start) {
    // reuse a foo_parser
    start %= foo >> s::int_ ;
  }
  foo_parser<Iterator> foo;
  s::rule<Iterator, bar_struct()> start;
};
*/