给定一个合成用户定义类型的语法,我如何编写另一个语法:
- 重用第一个语法。
- 使用第一种类型的基础值合成第二种不同的类型?
在下面的示例中,我按照 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;
};
*/