%destructor {psi_decl_type_free(&$$);} decl_type const_decl_type decl_type_complex
%type <struct psi_decl *> decl_stmt decl decl_body decl_func_body decl_functor_body
%destructor {psi_decl_free(&$$);} decl_stmt decl decl_body decl_func_body decl_functor_body
-%type <struct psi_decl_arg *> decl_typedef decl_func decl_functor decl_arg struct_arg typedef
-%destructor {psi_decl_arg_free(&$$);} decl_typedef decl_func decl_functor decl_arg struct_arg typedef
+%type <struct psi_decl_arg *> decl_typedef decl_func decl_functor decl_arg typedef
+%destructor {psi_decl_arg_free(&$$);} decl_typedef decl_func decl_functor decl_arg typedef
%type <struct psi_decl_var *> decl_var
%destructor {psi_decl_var_free(&$$);} decl_var
%type <struct psi_decl_struct *> decl_struct
%destructor {psi_decl_enum_free(&$$);} decl_enum
%type <struct psi_decl_enum_item *> decl_enum_item
%destructor {psi_decl_enum_item_free(&$$);} decl_enum_item
-%type <struct psi_plist *> decl_args decl_struct_args struct_args_block struct_args decl_enum_items decl_vars
-%destructor {psi_plist_free($$);} decl_args decl_struct_args struct_args_block struct_args decl_enum_items decl_vars
+%type <struct psi_plist *> decl_args decl_struct_args struct_args_block struct_args struct_arg_var_list decl_enum_items decl_vars decl_vars_with_layout
+%destructor {psi_plist_free($$);} decl_args decl_struct_args struct_args_block struct_args struct_arg_var_list decl_enum_items decl_vars decl_vars_with_layout
%type <struct psi_layout> align_and_size
%destructor {} align_and_size
}
;
+decl_vars[vars]:
+ decl_var[var] {
+ $vars = psi_plist_add(psi_plist_init((psi_plist_dtor) psi_decl_var_free), &$var);
+}
+| decl_vars[vars_] COMMA decl_var[var] {
+ $vars = psi_plist_add($vars_, &$var);
+}
+;
+
decl:
decl_body
| NAME[abi] decl_body {
;
struct_args[args]:
- struct_arg[arg] {
+ typedef[arg] decl_layout[layout] struct_arg_var_list[vars] EOS {
+ $arg->layout = $layout;
$args = psi_plist_add(psi_plist_init((psi_plist_dtor) psi_decl_arg_free), &$arg);
+ if ($vars) {
+ size_t i = 0;
+ struct psi_decl_arg *arg;
+
+ while (psi_plist_get($vars, i++, &arg)) {
+ arg->type = psi_decl_type_copy($arg->type);
+ $args = psi_plist_add($args, &arg);
+ }
+ free($vars);
+ }
}
-| struct_args[args_] struct_arg[arg] {
+| struct_args[args_] typedef[arg] decl_layout[layout] struct_arg_var_list[vars] EOS {
+ $arg->layout = $layout;
$args = psi_plist_add($args_, &$arg);
+ if ($vars) {
+ size_t i = 0;
+ struct psi_decl_arg *arg;
+
+ while (psi_plist_get($vars, i++, &arg)) {
+ arg->type = psi_decl_type_copy($arg->type);
+ $args = psi_plist_add($args, &arg);
+ }
+ free($vars);
+ }
}
;
-struct_arg[arg]:
- typedef[arg_] decl_layout[layout] EOS {
- $arg = $arg_;
- $arg->layout = $layout;
- psi_parser_proc_add_from_typedef(P, $arg);
+struct_arg_var_list[vars]:
+ %empty {
+ $vars = NULL;
+}
+| COMMA decl_vars_with_layout[vars_] {
+ $vars = $vars_;
+}
+;
+
+decl_vars_with_layout[vars]:
+ decl_var[var] decl_layout[layout] {
+ {
+ struct psi_decl_arg *arg = psi_decl_arg_init(NULL, $var);
+ arg->layout = $layout;
+ $vars = psi_plist_add(psi_plist_init((psi_plist_dtor) psi_decl_arg_free), &arg);
+ }
+}
+| decl_vars_with_layout[vars_] COMMA decl_var[var] decl_layout[layout] {
+ {
+ struct psi_decl_arg *arg = psi_decl_arg_init(NULL, $var);
+ arg->layout = $layout;
+ $vars = psi_plist_add($vars_, &arg);
+ }
}
;
%empty {
$l = NULL;
}
+| COLON NUMBER[width] {
+ $l = psi_layout_init(0, 0, psi_layout_init(0, atol($width->text), NULL));
+}
| COLON COLON LPAREN NUMBER[align] COMMA NUMBER[size] RPAREN {
- $l = psi_layout_init(atol($align->text), atol($size->text));
+ $l = psi_layout_init(atol($align->text), atol($size->text), NULL);
+}
+| COLON NUMBER[width] COLON COLON LPAREN NUMBER[align] COMMA NUMBER[size] RPAREN {
+ $l = psi_layout_init(atol($align->text), atol($size->text), psi_layout_init(0, atol($width->text), NULL));
}
;
}
;
-decl_vars[vars]:
- decl_var[var] {
- $vars = psi_plist_add(psi_plist_init((psi_plist_dtor) psi_decl_var_free), &$var);
-}
-| decl_vars[vars_] COMMA decl_var[var] {
- $vars = psi_plist_add($vars_, &$var);
-}
-;
-
reference:
%empty {
$reference = false;