非默认构造的boost :: proto终端

时间:2012-08-10 22:15:21

标签: c++ boost boost-proto

我正在尝试使用boost :: proto定义一个非常有限的解析器组合库,并且想知道是否可以通过任何方式定义非默认构造的proto终端。

我有这样的结构:

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

   string str_;
};

我想在proto表达式中用作boost proto终端。我能够在BOOST_PROTO_DEFINE_OPERATORS的帮助下使其工作,但我发现经常不得不将它包装在proto::lit()内部proto表达式中有点不方便:

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

我想知道我是否可以创建这样的原型终端:

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

以某种方式能够获取字符串参数并将其传递给符号的构造函数。

注意:我知道Spirit,但我的编译器不太支持它!

1 个答案:

答案 0 :(得分:5)

您可以将名称sym设为返回终端的函数:

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

很像lit是一个将其参数转换为终端的函数模板。