+typedef_anon_decl[def]:
+ typedef_decl %dprec 2
+| qualified_decl_type[type] %dprec 1 {
+ $def = psi_decl_arg_init($type, psi_decl_var_init(NULL, 0, 0));
+ $def->var->token = psi_token_copy($type->token);
+}
+| decl_enum[enum] {
+ $def = psi_decl_arg_init(
+ psi_decl_type_init(PSI_T_ENUM, $enum->name),
+ psi_decl_var_init(NULL, 0, 0)
+ );
+ $def->var->token = psi_token_copy($enum->token);
+ $def->type->token = psi_token_copy($enum->token);
+ $def->type->real.enm = $enum;
+ psi_parser_proc_add_enum(P, $enum);
+}
+| struct_name[struct] align_and_size[as] struct_args_block[args] {
+ $def = psi_decl_arg_init(psi_decl_type_init(PSI_T_STRUCT, $struct->text), psi_decl_var_init(NULL, 0, 0));
+ $def->type->token = $struct;
+ $def->type->real.strct = psi_decl_struct_init($struct->text, $args);
+ $def->type->real.strct->token = psi_token_copy($struct);
+ $def->type->real.strct->align = $as.pos;
+ $def->type->real.strct->size = $as.len;
+ psi_parser_proc_add_struct(P, $def->type->real.strct);
+}
+| union_name[union] align_and_size[as] struct_args_block[args] {
+ $def = psi_decl_arg_init(psi_decl_type_init(PSI_T_UNION, $union->text), psi_decl_var_init(NULL, 0, 0));
+ $def->type->token = $union;
+ $def->type->real.unn = psi_decl_union_init($union->text, $args);
+ $def->type->real.unn->token = psi_token_copy($union);
+ $def->type->real.unn->align = $as.pos;
+ $def->type->real.unn->size = $as.len;
+ psi_parser_proc_add_union(P, $def->type->real.unn);
+}
+;
+
+qualified_decl_type[type]: