カスタム属性解析でスピリットルールをブーストします
-
30-09-2019 - |
質問
私は、これらの構造体のベクトルにテキストを解析するために、ブーストスピリットの文法を書いています。
struct Pair
{
double a;
double b;
};
BOOST_FUSION_ADAPT_STRUCT(
Pair,
(double, a)
(double, a)
)
この文法には次のようなルールがあります。
qi::rule<Iterator, Pair()> pairSequence;
ただし、実際の文法 pairSequence
これは:
double_ % separator
この文法に生産してもらいたい Pair
と a
ダブルに等しい b
ある定数に等しい。このようなことをしたい:
pairSequence = double_[_val = Pair(_1, DEFAULT_B)] % separator;
もちろん、上記はコンパイルされません。コンストラクターを追加しようとしました Pair
, 、しかし、私はまだエラーをコンパイルします(「ペア::ペアへの呼び出しの一致関数はありません(const boost :: phoenix :: actor>&、double)」).
解決
まず第一に、の署名 pairSequence
必要があります:
qi::rule<Iterator, std::vector<Pair>()> pairSequence;
リスト演算子がaを公開すると std::vector<Pair>
その属性として。
内部のセマンティックアクションから呼び出されるすべての関数は「怠zy」でなければならないため、Phoenixを利用する必要があります。
namespace phx = boost::phoenix;
pairSequence =
double_[
phx::push_back(_val,
phx::construct<Pair>(_1, phx::val(DEFAULT_B))
)
] % separator
;
別の可能性は、(非明示的な)コンストラクターを追加することです Pair
:
struct Pair
{
Pair(double a) : a(a), b(DEFAULT_B) {}
double a;
double b;
};
これにより、文法を簡素化できます。
pairSequence = double_ % separator;
スピリットの組み込み属性伝播ルールに完全に依存しています。
ところで、これが機能するためには、適応する必要はありません Pair
融合シーケンスとして。
所属していません StackOverflow