2012-08-10 79 views
1

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

我有这样的结构:

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

    string str_; 
}; 

,我想在原表达式升压原终端使用。我能得到它的BOOST_PROTO_DEFINE_OPERATORS帮助工作,但我觉得有些不方便,经常要包装在一个proto::lit()原始表达式中:

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

我在想,如果我可以创建一个原终端像这样:

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

这将以某种方式能够接受一个字符串参数并将其传递给符号的构造函数。

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

回答

5

可以使名称sym返回终端的功能:

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

很像​​3210是变成它的参数为终端的功能模板。

+0

正是!多么愚蠢的我:)谢谢! – 2012-08-10 23:19:25