ユーザー定義の型を合成する文法がある場合、次のような別の文法を作成するにはどうすればよいですか。
- 最初の文法を再利用します。
- 最初のタイプの基礎となる値を使用して、2番目の別個のタイプを合成しますか?
以下の例では、Boost Spiritのドキュメントに従って、foo_parser
タイプの値を合成するパーサーを作成しましたfoo_struct
。bar_parser
タイプの異なる(しかし明らかに類似した)値を再利用するfoo_parser
が合成する2番目のパーサーを作成したいと思い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;
};
*/