5

Spirit X3 でパーサーを書こうとしていますが、理解できないコンパイル エラーが発生しているため、あまり進んでいません。コンパイラが不満を言っていることはわかっていると思いますが、理解できないのは、コンパイラが気にする理由です。次のコードはコンパイルされ (clang 3.9、Boost 1.62.0)、機能します。(構造が不十分であり、定数用の組み込みパーサーがあることに気付きました。問題を実証しようとしているだけです。)

#define BOOST_SPIRIT_X3_DEBUG

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

using namespace std;
namespace x3 = boost::spirit::x3;

namespace lang {

    using namespace x3;

    struct Constant {
    };

    rule<class constant_id, Constant> const constant = "constant";

    auto const integer_literal = -char_('-') >> +digit;
    auto const float_literal = -char_('-') >> +digit >> -(char_('.') >> *digit);

    auto const constant_def = (integer_literal)[([](auto &ctx) { _val(ctx) = Constant(); })];

    BOOST_SPIRIT_DEFINE(constant);
}

int main(int argc, char *argv[]) {

    string s("3.14159");
    if (x3::phrase_parse(s.begin(), s.end(), lang::constant, x3::space)) {
        cout << "Ok!";
    } else {
        cout << "Error!";
    }

    return 0;
}

ただし、integer_literal の代わりに float_literal を使用するように constant_def を変更すると、次のようになります。

auto const constant_def = (float_literal)[([](auto &ctx) { _val(ctx) = Constant(); })];

コンパイルエラーが発生し始めます。

sequence.hpp:143:9: error: static_assert failed "Attribute does not have the expected size."
    static_assert(
    ^

ソースを見ると、次のメッセージが表示されます。

// If you got an error here, then you are trying to pass
// a fusion sequence with the wrong number of elements
// as that expected by the (sequence) parser.

このエラーは、float_literal の定義にオプションが存在することに関係していると思います。の属性タイプinteger_literalは次のようなものだと思いvector<char>ますが、オプションにより、の属性は次のfloat_literalようになりますtuple<vector<char>, optional<vector<char>>>か?そして、どこかでそれを文字列か何かに強制しようとしていますが、2タプルを1タプルに変換しようとしているために失敗しています。float_literal解決策は、定義をラップして、raw[]代わりに基になる文字列を取得することだと思いますが、とにかく欲しいです。しかし、これは私の最初の X3 パーサーであるため、別のコンテキストで発生した場合に診断できるように、コンパイラーがこのエラーを発生させている理由を理解したいと考えています。

私が本当に理解していないのは、コンパイラが の型を気にする理由ですfloat_literal。定数ルールの属性型である Constant のインスタンスを生成するセマンティック アクションをアタッチしましたが、属性 of を参照する必要はfloat_literalありませfloat_literalん。どこで不等長シーケンスの割り当てを行おうとしているのか、また何の目的でしょうか?

ありがとう!

4

0 に答える 0