4

編集:seheの例を拡張して、別のルールで使用したい場合の問題を示しました:http: //liveworkspace.org/code/22lxL7 $ 17

Boost Spiritパーサーのパフォーマンスを改善しようとしていますが、C ++ 11以降、次のような自動ルールを使用できるようになりました。

auto comment = "/*" >> *(char_ - "*/") >> "*/"; 

(またはBOOST_AUTOまたはBOOST_SPIRIT_AUTOを使用)。

私はそのようなルール宣言者を持っています:

qi::rule<lexer::Iterator, ast::SimpleType()> simple_type;

そしてそのように定義されます:

simple_type %=
        const_
    >>  lexer.identifier;

autoで宣言するとコンパイルされますが、他のルールではASTとして使用できません。

自動ルールでASTを作成するルールを定義することは可能ですか?BoostSpiritでのAST作成を高速化する他の方法にも興味があります。

4

2 に答える 2

2

まず最初に、単純な例を試してみましたが、単純な構造体を使用して「うまくいきました」:

struct fixed
{
    int integral;
    unsigned fractional;
};

BOOST_FUSION_ADAPT_STRUCT(fixed, (int, integral)(unsigned, fractional));

template <typename It, typename Skipper = qi::space_type>
    struct parser : qi::grammar<It, std::vector<fixed>(), Skipper>
{
    parser() : parser::base_type(start)
    {
        using namespace qi;

        BOOST_SPIRIT_AUTO(qi, fixed_rule, lexeme [ int_ >> -('.' >> uint_ | attr(0u)) ]);
        start = *fixed_rule;

        BOOST_SPIRIT_DEBUG_NODE(start);
    }

  private:
    qi::rule<It, std::vector<fixed>(), Skipper> start;
};

これは喜んで入力を解析します: http://liveworkspace.org/code/22lxL7$1

属性の互換性が必要な場所を意味していると思いますが、

そのような場合にうまく役立つはずです。

attr_cast (および一般的な属性の互換性) の詳細については、この回答を参照してください:ブースト バリアント再帰ラッパーを使用した文字列パーサー

于 2013-03-10T03:00:45.087 に答える
1

「オートルール」なんてものはありません。そのような式を自動キャプチャすると、すべてのデフォルトを使用してルールが作成されます。したがって、この「自動ルール」の属性は、属性変換なしで、式の属性のみになります。

特別な属性データを作成する必要がある場合 (つまり、入力属性タイプを独自のデータに変換する必要がある場合)、ルールまたはセマンティック アクションを使用する必要があります。

于 2013-03-09T23:22:45.953 に答える