我有一个结构列表,该结构有一个定义它的类型的字段(假设它是名称)。我会有一个如下宏:
MYKEEP <name>.<field> <ANY KEEP>;
这将被翻译为:
keep value(mylist.has(it.name == <name>)) => mylist.first(it.name == <name>).<field> <ANY KEEP>
是否可以在没有“计算”宏的情况下做到这一点?
我有一个结构列表,该结构有一个定义它的类型的字段(假设它是名称)。我会有一个如下宏:
MYKEEP <name>.<field> <ANY KEEP>;
这将被翻译为:
keep value(mylist.has(it.name == <name>)) => mylist.first(it.name == <name>).<field> <ANY KEEP>
是否可以在没有“计算”宏的情况下做到这一点?
看起来您想要获取结构列表作为输入,检查结构的某些字段的值,然后根据该值将常量值分配给不同的结构字段。
考虑到性能,这两个字段之间的这种“内射”关系应该是过程代码而不是生成的。(最有可能在 post_generate() 中)。
考虑使用如下所示的宏定义:
define <name_induced_field'struct_member> "MYKEEP <name'exp> <field'exp> <ANY_KEEP'exp>" as{
post_generate() is also{
for each in l{
if (it.t==<name'exp>){
it.<field'exp> = <ANY_KEEP'exp>;
};
};
};
};
然后在代码中使用它,如下所示:
type mytype: [AA,BB];
struct s {
t:mytype;
!i:int;
};
extend sys{
MYKEEP AA i 1;
MYKEEP BB i 2;
l:list of s;
keep l.size()==5;
};
注意:如果结构字段在其他情况下与其名称具有相同的关系,请考虑从结构内限制字段,例如:
define <name_induced_field'struct_member> "MYKEEP <name'exp> <field'exp> <ANY_KEEP'exp>" as{
keep value(t==<name'exp>) => (<field'exp>==<ANY_KEEP'exp>);
};
type mytype: [AA,BB];
struct s {
MYKEEP AA i 1;
MYKEEP BB i 2;
t:mytype;
i:int;
post_generate() is also{
print me;
};
};
过程代码对我没有帮助,因为这些字段可能会在生成时影响其他字段。我设法找到了一个似乎有效的宏:
define <ana_packet_gen_con_keep1'exp> "KEEP_CON [(<WORD>soft) ]<type'exp>\.<field'any> <exp>" as {
keep for each (con) in it.containers {
<WORD> (con.con_type==<type'exp>) => con.as_a(<type'exp>'con_type ana_container).<field'any> <exp>;
};
};
有几个“为每个保留”是否对性能影响太大?