C++ 在Boost Spirit 2.5.2中按层次划分语法

C++ 在Boost Spirit 2.5.2中按层次划分语法,c++,parsing,boost-spirit,C++,Parsing,Boost 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); ...

我有以下经典精神的代码:

/// _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;
    ...
};
//\u BasicRules.h
模板类{
公众:
_BasicRules(){
//ALPHA=%x41-5A/%x61-7A;A-Z/A-Z
α=范围p(0x41,0x5A)|范围p(0x61,0x7A);
...
}
受保护的:
精神:规则阿尔法;
...
};
//共同规则
模板类_CommonRules:public _BasicRules{…};
//_.h
模板类_UriRules:public _CommonRules{…};
//_HeaderRules.h
模板类_HeaderRules:public _UriRules{…};
//_.h
模板类SipGrammar::定义:public\u HeaderRules{
公众:
定义(语法常量和自我){
SIP|消息=请求|响应;
请求=请求行>>*(消息头)>>CRLF>>!消息体;
...
}
常量规则&start()常量
{
返回SIP_消息;
}
私人:
boost::spirit::rule SIP_消息;
使用_BasicRules::DIGIT;
使用_CommonRules::token;
...
};
我正在将基于RFC3261的SIP消息解析器从Spirt Classic转换为新的Spirit 2.5.2。 我已经将整个语法分割成多个继承文件,因为语法非常庞大

我正在写这段代码

....
template <typename Iterator> struct _HeaderRules:grammar<Iterator>, _UriRules<Iterator> {...}
template <typename Iterator> struct SipGrammar:grammar<Iterator>, _HeaderRules<Iterator> {
    SipGrammar():SipGrammar::base_type(SIP_Message){...}
    ...
};
。。。。
模板结构_HeaderRules:语法,_UriRules{…}
模板结构SIPGRAMORM:语法,头规则{
SipGrammar():SipGrammar::基本类型(SIP_消息){…}
...
};

这是行不通的。您是否可以推荐Spirit 2.5.2中分层语法的来源

无论如何,继承在这里不是一个合乎逻辑的选择(从任何意义上讲,SipGrammar都不能用Liskov代替HeaderRules)

通常的方法是聚合:

template <typename Iterator> struct SipGrammar : grammar<Iterator>
{
    SipGrammar() : SipGrammar::base_type(SIP_Message)
    {
        ...
    }

  private:

     HeaderRule<Iterator> _headerRules;
    ...
};
模板结构SipGrammar:语法
{
SipGrammar():SipGrammar::基本类型(SIP\u消息)
{
...
}
私人:
头部规则(headerRules);;
...
};
Boost Spirit源代码树中的编译器示例包含几个示例,说明如何在同时拆分hpp/cpp文件的同时执行此操作,从而减少编译时间:


您可能想进一步说明“这不起作用”。此外。您的程序的行为在技术上是未定义的编译器示例将语法拆分为不同的编译单元(例如,请参见calc7文件夹,表达式类)。它只是有点难以理解,因为它很大。