2016-08-21 37 views
1

我想分析如下(第一列是標識,第二列(日期)爲每個標識,然後將float的元組唯一):屬性傳播到嵌套地圖

Max,2016-02-01,1.0,2.0,3.0 
Max,2016-02-02,1.0,2.0,3.0 
Rob,2016-02-01,1.0,2.0,3.0 
Max,2016-02-03,1.0,2.0,3.0 

我最喜歡的結構將是

using ValueType = std::tuple<float, float, float>; 
using ValueMap = std::map<std::time_t, ValueType>; 
using DataType = std::unordered_map<std::string, ValueMap>; 

這是可以通過屬性傳播創建一個有效的語法(沒有語義操作和/或後來複製到這個結構)嗎?

解析語法可能看起來像:

namespace grammar 
{ 
     using namespace x3; 

     auto str2date = [](auto& ctx) 
     { 
       int y,m,d; 
       auto tub = std::tie(y,m,d); 
       fusion::copy(_attr(ctx), tub); 

       std::tm t{}; 
       t.tm_year = y - 1900; 
       t.tm_mon = m - 1; 
       t.tm_mday = d; 

       auto time = std::mktime(&t); 
       _val(ctx) = time; 
       _pass(ctx) = time > 0; 
     }; 

     auto date_ = rule<struct date_, std::time_t>{"date"} 
           = (int_ >> '-' >> int_ >> int_)[str2date]; 

     auto values_= rule<struct values_, ValueType>{"values"} 
           = float_ >> ',' >> float_ >> ',' >> float_; 

     auto line_ = rule<struct line_, std::pair<std::time_t, ValueType>>{"line"} 
           = date_ >> ',' >> values_; 

     auto start_ = rule<struct start_, DataType>{"start"} 
           = (+~char_(',') >> ',' >> line_) % eol >> (eol | eoi); 

}; 

not working live example at coliru

+0

添加相關標籤,如[tag:C++],[tag:boost]或[tag:boost-spirit]可以幫助您的問題獲得更多的可見性,因此您將有更好的機會獲得幫助。 – llonesmiz

回答

0

我做了一個工作示例:

http://coliru.stacked-crooked.com/a/70ba89f254467f9e

我用X3的自然屬性,隨着融合結構映射,使其可以輕鬆解析爲中間行ast :: Row。

這樣,就沒有必要對規則<>無處不在;只有一次。 x3將其轉化爲中介形式,然後我們很容易編寫'store()'方法來獲取數據到最終目的地。

我們只將一行一次解析成中介形式,然後存儲並銷燬該臨時可用空間。這樣我們就不會爲中間階段消耗大量的記憶。