属性传播到嵌套映射

Attribute propagation to nested map

本文关键字:映射 嵌套 传播 属性      更新时间:2023-10-16

我想解析以下内容(第一列是标识符,第二列(日期)对于每个标识符都是唯一的,后面跟着一个浮点元组):

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); 
};

不工作

我做了一个工作示例:

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

我使用了x3的自然属性,以及融合结构映射,使其易于解析为中间ast::Row。

这样,就不需要到处修改rule<>;只有一次。X3完成了将数据转换为中间形式的工作,然后我们很容易编写'store()'方法来将数据转换为最终目的地。

一次只解析一行到中间形式,然后存储并销毁该临时变量。这样我们就不会在中间阶段使用大量内存。