我正在尝试使用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,但我的编译器不太支持它!
答案 0 :(得分:5)
您可以将名称sym
设为返回终端的函数:
proto::terminal<symbol>::type sym(std::string const& s)
{ return { symbol(s) }; }
很像lit
是一个将其参数转换为终端的函数模板。