3

さまざまなspirit::x3ルール定義操作が属性の互換性にどのように影響するかを説明するドキュメントはどこかにありますか?

私が驚いたのは:

x3::lexeme[ x3::alpha > *(x3::alnum | x3::char_('_')) ]

Fusion に適応した構造体に移動できませんでした:

struct Name {
    std::string value;
};

とりあえず、最初の必須のアルファベット文字を取り除きましたが、名前の文字列は文字で始まらなければならないことを定義する規則を表現したいと思います。これは、機能するまで追加を試みる必要がある状況の 1 つですepsか、それとも上記が機能しない理由が明確に示されていますか?

見つけられなくてどこかに書いてありましたらすみません。

4

1 に答える 1

7

あなたが開発ブランチにいない場合、その単一要素シーケンス適応バグの修正がないので、おそらくそれです.

属性の変換/伝播の汎用性により、多くの変更の余地がありますが、もちろん、それは文書化され、最終的にはコードに含まれています。つまり、魔法はありません。

qi::as<>Qi の時代には、目的の変換をorで綴るだけでこれを「修正」していましたqi::attr_cast<>。X3 には (まだ) ありませんが、ルールを使用して非常に簡単に模倣できます。

Live On Coliru

#include <iostream>
#include <boost/fusion/adapted/struct.hpp>
#include <boost/spirit/home/x3.hpp>

namespace x3 = boost::spirit::x3;

struct Name {
    std::string value;
};

BOOST_FUSION_ADAPT_STRUCT(Name, value)

int main() {

    std::string const input = "Halleo123_1";
    Name out;

    bool ok = x3::parse(input.begin(), input.end(),
            x3::rule<struct _, std::string>{} =
            x3::alpha >> *(x3::alnum | x3::char_('_')),
            out);

    if (ok)
        std::cout << "Parsed: " << out.value << "\n";
    else
        std::cout << "Parse failed\n";
}

版画:

Parsed: Halleo123_1

自動化する

X3 は C++14 のコア言語機能とうまく連携するため、タイピングを減らすのは難しくありません。

Boost.Spirit のリスト演算子 (%) を理解する

于 2016-05-13T08:26:06.813 に答える