2017-09-21 18 views
1

時々、パーサー間の密接な結合/循環依存関係があります。しかし、私はそれが小さいコンパイル時間Iユニットテストのために、複数のを持つために作るように、異なるヘッダにこれらを分離したいX3を使用したパーサーの依存性注入

parser.hpp

#pragma once 

namespace parser { 
    using a_type = x3::rule<class a_class>; 
    a_type const a = "a"; 

    using b_type = x3::rule<class b_class>; 
    b_type const b = "b"; 

    auto const a_def = "(" >> b >> ")"; 
    auto const b_def = "<" >> a >> ">"; 

    BOOST_SPIRIT_DEFINE(a, b); 
} 

:私はこのような何かを持っているかもしれませんヘッダーファイル(1つのモノリシックファイルではなく)。実際には、2つ以上のパーサしか持っていません。

が、私はこのような何かを行うことができるようにしたい:

#pragma once 

namespace parser { 
    template <auto Injected> 
    struct b_wrapper { 
     using b_type = x3::rule<class b_class>; 
     static b_type const b = "b"; 
     static auto const b_def = "(" >> Injected >> ")"; 

     BOOST_SPIRIT_DEFINE(b); 
    }; 
} 

当然

a.hpp

#pragma once 

#include "b.hpp" 

namespace parser { 
    using a_type = x3::rule<class a_class>; 
    a_type const a = "a"; 
    auto const a_def = "(" >> b_wrapper<a>::b >> ")"; 

    BOOST_SPIRIT_DEFINE(a); 
} 

b.hppを、これは動作しません。 。どのようにしてパーサに依存性注入を行うことができますか?


注射の正確な構文は気にしません。しかし、私は実際にこれらのポイントが必要:

aは簡単にその依存関係があまりにも注入さ持たせることができる)の両方のテスト・ファイルの両方のヘッダーを含めずにa.hppb.hppをテストすることができ
  • テスト

を容易にするために、別のパーサを注入したパーサを代用す​​ることできる

  • 私は定型の束に私は別のパーサを注入するたびを持っている必要があれば、私は大丈夫ですよ。

  • 答えて

    0

    foo_defオブジェクトは、関数を使用して生成できます。

    #pragma once 
    
    namespace parser { 
        template <typename Injected> 
        auto b_impl(Injected const& injected) { 
         return "(" >> injected >> ")"; 
        } 
    } 
    

    そして、あなたは実際のパーサを注入する場所、あなたが行うことができます:それは、b.hppは次のようになり、ある

    using b_type = x3::rule<class b_class>; 
    b_type const b = "b"; 
    auto const b_def = b_impl(a); 
    
    BOOST_SPIRIT_DEFINE(b); 
    

    注定型のビットがまだあることをパーサーを作成するときに使用します。

    関連する問題