属性传播到嵌套映射
Attribute propagation to nested map
我想解析以下内容(第一列是标识符,第二列(日期)对于每个标识符都是唯一的,后面跟着一个浮点元组):
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()'方法来将数据转换为最终目的地。
一次只解析一行到中间形式,然后存储并销毁该临时变量。这样我们就不会在中间阶段使用大量内存。
相关文章:
- 在C++中搜索嵌套多映射值
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 如果我将嵌套映射作为多重映射的值,如何将值插入内部映射?
- 迭代嵌套映射与范围为循环:没有名为"first"的成员
- 如何在嵌套映射(C++)中高效地查找密钥
- c++ 嵌套结构映射找不到成员
- 在结构的嵌套映射上链接运算符 []
- 访问range_expression中的嵌套元素会返回不完整的映射(段错误)
- 如何同时从嵌套映射中检索键字符串
- YAML-cpp 解析嵌套映射和序列错误
- 嵌套映射迭代器
- 引用映射中嵌套对中的值
- 插入到C++中的嵌套映射中
- 在嵌套的 STL 映射中插入和迭代
- c++中嵌套的无序映射
- 访问嵌套类内的空映射时发生访问冲突
- C++通过引用传递嵌套的无序映射并对其进行操作
- 嵌套的映射括号初始化无法编译
- 如何将数据插入嵌套的多映射/映射中
- c++中嵌套三个映射Vs单独映射的性能