X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fparser_proc_grammar.y;h=7b57269ac6279492afc7eda278b89c635f36cd3f;hp=f1205accbc8f509b4ecb8be05a2c1b391e762f41;hb=4926283fa0589f3f9c25616304672018dba77429;hpb=c5b2de8ed1d92dd42f910d4347d9175f27e3acbb diff --git a/src/parser_proc_grammar.y b/src/parser_proc_grammar.y index f1205ac..7b57269 100644 --- a/src/parser_proc_grammar.y +++ b/src/parser_proc_grammar.y @@ -311,8 +311,8 @@ struct psi_parser; %destructor {psi_decl_type_free(&$$);} decl_type const_decl_type decl_type_complex %type 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 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 decl_typedef decl_func decl_functor decl_arg typedef +%destructor {psi_decl_arg_free(&$$);} decl_typedef decl_func decl_functor decl_arg typedef %type decl_var %destructor {psi_decl_var_free(&$$);} decl_var %type decl_struct @@ -981,6 +981,15 @@ decl_ext_var_list: } ; +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 { @@ -1182,19 +1191,41 @@ struct_args_block[args]: ; struct_args[args]: - struct_arg[arg] { + typedef[arg] decl_layout[layout] EOS { + $arg->layout = $layout; $args = psi_plist_add(psi_plist_init((psi_plist_dtor) psi_decl_arg_free), &$arg); } -| struct_args[args_] struct_arg[arg] { - $args = psi_plist_add($args_, &$arg); +| typedef[arg] COMMA decl_vars[vars] EOS { + $args = psi_plist_add(psi_plist_init((psi_plist_dtor) psi_decl_arg_free), &$arg); + { + size_t i = 0; + struct psi_decl_var *var; + + while (psi_plist_get($vars, i++, &var)) { + struct psi_decl_arg *arg = psi_decl_arg_init(psi_decl_type_copy($arg->type), var); + + $args = psi_plist_add($args, &arg); + } + } + free($vars); } -; - -struct_arg[arg]: - typedef[arg_] decl_layout[layout] EOS { - $arg = $arg_; +| struct_args[args_] typedef[arg] decl_layout[layout] EOS { $arg->layout = $layout; - psi_parser_proc_add_from_typedef(P, $arg); + $args = psi_plist_add($args_, &$arg); +} +| struct_args[args_] typedef[arg] COMMA decl_vars[vars] EOS { + $args = psi_plist_add($args_, &$arg); + { + size_t i = 0; + struct psi_decl_var *var; + + while (psi_plist_get($vars, i++, &var)) { + struct psi_decl_arg *arg = psi_decl_arg_init(psi_decl_type_copy($arg->type), var); + + $args = psi_plist_add($args, &arg); + } + } + free($vars); } ; @@ -1719,15 +1750,6 @@ free_exp[exp]: } ; -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;