allow decl_vars as struct args
[m6w6/ext-psi] / src / parser_proc_grammar.y
index 442f93d84f070bf037e73d216e831ac48a694c77..7b57269ac6279492afc7eda278b89c635f36cd3f 100644 (file)
@@ -309,10 +309,10 @@ struct psi_parser;
 
 %type          <struct psi_decl_type *>                        decl_type const_decl_type decl_type_complex
 %destructor    {psi_decl_type_free(&$$);}                      decl_type const_decl_type decl_type_complex
-%type          <struct psi_decl *>                                     decl_stmt decl
-%destructor    {psi_decl_free(&$$);}                           decl_stmt decl
-%type          <struct psi_decl_arg *>                         decl_typedef decl_fn decl_func decl_functor decl_arg struct_arg typedef
-%destructor    {psi_decl_arg_free(&$$);}                       decl_typedef decl_fn decl_func decl_functor decl_arg struct_arg typedef
+%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 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
@@ -737,7 +737,7 @@ decl_typedef[def]:
 
 typedef[def]:
        decl_arg
-|      decl {
+|      decl_func_body[decl] {
        $def = psi_decl_arg_init(
                psi_decl_type_init(PSI_T_FUNCTION, $decl->func->var->name),
                psi_decl_var_copy($decl->func->var)
@@ -981,31 +981,56 @@ 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_fn[func] LPAREN decl_args[args] RPAREN array_size[as] {
-       $decl = psi_decl_init(psi_decl_abi_init("default"), $func, $args);
+       decl_body
+|      NAME[abi] decl_body {
+       $decl = $decl_body;
+       $decl->abi = psi_decl_abi_init($abi->text);
+}
+;
+
+decl_body:
+       decl_func_body
+|      decl_functor_body
+;
+
+decl_func_body[decl]:
+       decl_func[func] LPAREN decl_args[args] RPAREN array_size[as] {
+       $decl = psi_decl_init($func, $args);
        if ($as) {
                $decl->func->var->pointer_level += 1;
                $decl->func->var->array_size = $as;
        }
 }
-|      decl_fn[func] LPAREN decl_args[args] COMMA ELLIPSIS RPAREN array_size[as] {
-       $decl = psi_decl_init(psi_decl_abi_init("default"), $func, $args);
+|      decl_func[func] LPAREN decl_args[args] COMMA ELLIPSIS RPAREN array_size[as] {
+       $decl = psi_decl_init($func, $args);
        $decl->varargs = 1;
        if ($as) {
                $decl->func->var->pointer_level += 1;
                $decl->func->var->array_size = $as;
        }
 }
-|      NAME[abi] decl_fn[func] LPAREN decl_args[args] RPAREN array_size[as] {
-       $decl = psi_decl_init(psi_decl_abi_init($abi->text), $func, $args);
+;
+
+decl_functor_body[decl]:
+       decl_functor[func] LPAREN decl_args[args] RPAREN array_size[as] {
+       $decl = psi_decl_init($func, $args);
        if ($as) {
                $decl->func->var->pointer_level += 1;
                $decl->func->var->array_size = $as;
        }
 }
-|      NAME[abi] decl_fn[func] LPAREN decl_args[args] COMMA ELLIPSIS RPAREN array_size[as] {
-       $decl = psi_decl_init(psi_decl_abi_init($abi->text), $func, $args);
+|      decl_functor[func] LPAREN decl_args[args] COMMA ELLIPSIS RPAREN array_size[as] {
+       $decl = psi_decl_init($func, $args);
        $decl->varargs = 1;
        if ($as) {
                $decl->func->var->pointer_level += 1;
@@ -1014,11 +1039,6 @@ decl:
 }
 ;
 
-decl_fn:
-       decl_func
-|      decl_functor
-;
-
 decl_functor[arg]:
        const_decl_type[type] indirection[i] LPAREN indirection[unused1] name_token[NAME] RPAREN {
        (void) $unused1;
@@ -1091,7 +1111,15 @@ decl_args[args]:
 ;
 
 decl_arg[arg]:
-       const_decl_type[type] decl_var[var] {
+       decl_functor_body[decl] {
+       $arg = psi_decl_arg_init(
+               psi_decl_type_init(PSI_T_FUNCTION, $decl->func->var->name),
+               psi_decl_var_copy($decl->func->var)
+       );
+       $arg->type->token = psi_token_copy($decl->func->token);
+       $arg->type->real.func = $decl;
+}
+|      const_decl_type[type] decl_var[var] {
        $arg = psi_decl_arg_init($type, $var);
 }
 |      CONST VOID pointers name_token[NAME] {
@@ -1163,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);
 }
 ;
 
@@ -1700,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;