我正在尝试使用 boost::proto 定义一个非常有限的解析器组合器库,并且想知道是否可以通过任何方式定义一个非默认构造的原型(prototype)终端。
我有这样的结构:
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 内部的 proto::lit()
中表达式:
match(symbol("abc") >> (proto::lit(symbol("xyz")) | symbol("klm")))
我想知道我是否可以像这样创建一个原型(prototype)终端:
proto::terminal<symbol>::type sym;
这将能够以某种方式获取字符串参数并将其传递给符号的构造函数。
注意:我知道 Spirit,但我的编译器不太支持它!
最佳答案
您可以使名称 sym
成为返回终端的函数:
proto::terminal<symbol>::type sym(std::string const& s)
{ return { symbol(s) }; }
很像 lit
是一个将它的参数变成终端的函数模板。
关于c++ - 非默认构建的 boost::proto 终端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11909966/