1

私はspirit::qiを使用してパーサーを作成しており、さまざまな文字サイズと互換性を持たせることを目指しています。

template < typename Iterator >
struct grammar : qi::grammar < Iterator >
{
    grammar () : grammar::base_type ( file, alter_string_size_to < Iterator::value_type > ( _szFile ) )
    {

    }

    qi::rule < Iterator > file;
};

とすれば

alter_string_size_to < Iterator::value_type > ( _szFile )

必要な文字サイズの_szFileを含む文字列へのポインタを正常に返します。

でコンパイルすると

Iterator = std::wstring::const_iterator

次のエラーメッセージが表示されます

cannot convert parameter 2 from 'unsigned short *' to 'const std::string &'

したがって、.. grammar :: base_typeは、2番目のパラメーターとしてconst std :: string&のみを期待しています。私の質問は、qi :: grammarにイテレータのvalue_typeサイズの文字列を期待するように指示するにはどうすればよいですか?

前もって感謝します !

4

1 に答える 1

0

ソースでは次のように定義されています。

    grammar(
        start_type const& start
      , std::string const& name_ = "unnamed-grammar")
    : proto::extends<terminal, base_type>(terminal::make(reference_(start)))
    , name_(name_)
    {}

    std::string name_;

だから、できません。ドキュメントに記載されているように:

name は、文法に名前を付けるオプションの文字列で、デバッグやエラー処理に役立ちます。

したがって、それに基づいて独自のルックアップを作成する必要があります。

于 2012-01-28T03:46:44.370 に答える