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

Hai*_*Gad 1 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_;
};
Run Code Online (Sandbox Code Playgroud)

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

match(symbol("abc") >> (proto::lit(symbol("xyz")) | symbol("klm")))
Run Code Online (Sandbox Code Playgroud)

我想知道我是否可以像这样创建一个proto终端:

proto::terminal<symbol>::type sym;
Run Code Online (Sandbox Code Playgroud)

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

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

Luc*_*ton 5

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

proto::terminal<symbol>::type sym(std::string const& s)
{ return { symbol(s) }; }
Run Code Online (Sandbox Code Playgroud)

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