2017-02-17 26 views
1

我想實現一個語法要求解析實例名稱和路徑,其中的路徑是由分隔分隔實例名稱的列表。分隔可以是.在輸入文件中給出(週期)或/(斜線)的路徑列之前,例如:升壓精神:解析char_不斷變化的局部變量值

DIVIDER . 
a.b.c 
x.y.z 

一旦設定,除法器從不改變整個文件(如果設置爲即.,遇到類似的路徑應該a/b/c不能正確解析)。因爲我不知道分頻器是事先什麼,我想將它存儲在我的語法的變量,並在相應的char_解析器(當然使用該值,實際的語法要複雜得多,但這是我遇到麻煩的部分)。

這有點類似於這個問題:Boost spirit using local variables但不是我想要的,因爲使用Nabialek技巧可以在設置分隔符後解析「無效」路徑。

我不要求一個完整的解決方案在這裏,但我的問題基本上是這樣的:我可以分析值代入我的語法的成員,然後使用這些值,其餘輸入的進一步分析?

回答

3

我會用繼承的屬性:

qi::rule<It, std::string(char)> element = *~qi::char_(qi::_r1); 
qi::rule<It, std::vector<std::string>(char)> path = element(qi::_r1) % qi::char_(qi::_r1); 

// use it like: 
std::vector<std::string> data; 
bool ok = qi::parse(f, l, path('/'), data); 

或者你/可/的確綁定到一個局部變量:

char delim = '/'; 
qi::rule<It, std::string()> element = *~qi::char_(delim); 
qi::rule<It, std::vector<std::string>()> path = element % qi::char_(delim); 

// use it like: 
std::vector<std::string> data; 
bool ok = qi::parse(f, l, path, data); 

如果你需要它是動態的,使用boost::phoenix::ref

char delim = '/'; 
qi::rule<It, std::string()> element = *~qi::char_(boost::phoenix::ref(delim)); 
qi::rule<It, std::vector<std::string>()> path = element % qi::char_(boost::phoenix::ref(delim)); 

// use it like: 
std::vector<std::string> data; 
bool ok = qi::parse(f, l, path, data); 
+0

謝謝你,我的第一種方法差不多這個樣子,但我遇到了某種無限循環的。至少我現在知道這是可能的。將在星期一嘗試並報告。 – tickferno

+0

是的,它運作得非常好。非常感謝!編輯:使用具有繼承屬性的第一個變體。看起來像對我來說最乾淨可讀的解決方案。 – tickferno