2012-08-10 30 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