2
中間值給定一個語法,其合成一個用戶定義的類型,如何可以寫另一個語法是:再合成與升壓::精神::氣
- 重用第一語法。
- 使用底層第一個類型的值合成第二個不同的類型?
在下面的例子中,我已經按照升壓精神文檔來創建一個解析器,foo_parser
,其合成foo_struct
類型的值。我想寫第二個解析器,bar_parser
,重用foo_parser
但合成了一個不同的(但明顯類似)的值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;
};
*/
我沒有時間通過編譯器來運行它,但我認爲富在你bar_parser的聲明錯誤。如果不是:'foo_parser foo' –
2012-04-10 08:11:13
@AndréNo.'foo_parser'只能獲取一個模板參數 – sehe 2012-04-10 09:01:38