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.hppとb.hppをテストすることができ
- テスト
を容易にするために、別のパーサを注入したパーサを代用することできる