属性传播到嵌套映射
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>;
是否可以创建具有属性传播的有效语法(没有语义操作 and/or 稍后复制到此结构)?
解析语法可能如下所示:
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。
这样一来,就不需要处处都是右规则<>;只有一次。 x3做的是把它取到中间形式的工作,那我们就很容易写'store()'方法把数据取到最终目的地
我们一次只将一行解析为中间形式,然后存储并销毁该临时变量。这样我们就不会在中间阶段耗尽大量内存。
我想解析以下内容(第一列是标识符,第二列(日期)对于每个标识符都是唯一的,后跟浮点数的元组):
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>;
是否可以创建具有属性传播的有效语法(没有语义操作 and/or 稍后复制到此结构)?
解析语法可能如下所示:
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。
这样一来,就不需要处处都是右规则<>;只有一次。 x3做的是把它取到中间形式的工作,那我们就很容易写'store()'方法把数据取到最终目的地
我们一次只将一行解析为中间形式,然后存储并销毁该临时变量。这样我们就不会在中间阶段耗尽大量内存。