I have the following code in Classic Spirit:
/// _BasicRules.h
template <typename scanT> class _BasicRules {
public:
_BasicRules() {
// ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
ALPHA = range_p(0x41, 0x5A) | range_p(0x61, 0x7A);
...
}
protected:
boost::spirit::rule<scanT> ALPHA;
...
};
// CommonRules.h
template <typename scanT> class _CommonRules : public _BasicRules<scanT> {...};
// _UriRules.h
template <typename scanT> class _UriRules : public _CommonRules<scanT> {...};
// _HeaderRules.h
template <class scanT> class _HeaderRules : public _UriRules<scanT> {...};
// _SipRules.h
template <typename scanT> class SipGrammar::definition : public _HeaderRules<scanT> {
public:
definition(SipGrammar const& self) {
SIP_message = Request | Response;
Request = Request_Line >> *(message_header) >> CRLF >> !message_body;
...
}
const rule<scanT> & start() const
{
return SIP_message;
}
private:
boost::spirit::rule<scanT> SIP_message;
using _BasicRules<scanT>::DIGIT;
using _CommonRules<scanT>::token;
...
};
I am just converting RFC3261 based SIP Message parser from Spirirt Classic to new Spirit 2.5.2. I have splitted whole grammar into multiple inherited files as grammar is really huge.
I am writing this code;
....
template <typename Iterator> struct _HeaderRules:grammar<Iterator>, _UriRules<Iterator> {...}
template <typename Iterator> struct SipGrammar:grammar<Iterator>, _HeaderRules<Iterator> {
SipGrammar():SipGrammar::base_type(SIP_Message){...}
...
};
This does not work. Would you suggest a source for hierarchically splitting grammar in Spirit 2.5.2.