1

我正在尝试使用 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,但我的编译器不太支持它!

4

1 回答 1

5

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

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

很像lit一个函数模板,它把它的参数变成一个终端。

于 2012-08-10T22:21:23.860 回答