1

boost::proto を使用して非常に限定されたパーサー コンビネーター ライブラリを定義しようとしていますが、デフォルトではない構築済みのプロト ターミナルを定義することが何らかの方法で可能かどうか疑問に思っていました。

私はこのような構造を持っています:

struct symbol
{
   symbol(const string &str): str_(str) {}
   bool operator()(const string &str) const {
      return (str == str_);
   }

   string str_;
};

プロト式のブースト プロト ターミナルとして使用したいです。の助けを借りて動作させることができましたが、プロト式の内側BOOST_PROTO_DEFINE_OPERATORSで頻繁にラップする必要があるのはやや不便です。proto::lit()

match(symbol("abc") >> (proto::lit(symbol("xyz")) | symbol("klm")))

次のようなプロト端末を作成できるかどうか疑問に思っていました。

proto::terminal<symbol>::type sym;

どういうわけか文字列引数を取り、それをシンボルのコンストラクターに渡すことができます。

注: Spirit については知っていますが、私のコンパイラは完全にサポートしていません!

4

1 に答える 1

5

名前symを端末を返す関数にすることができます。

proto::terminal<symbol>::type sym(std::string const& s)
{ return { symbol(s) }; }

litパラメータをターミナルに変換する関数テンプレートとよく似ています。

于 2012-08-10T22:21:23.860 に答える