module: depend on ext/standard for more basic constants like INF/NAN
[m6w6/ext-psi] / src / parser_proc_grammar.y
index bb8a9ce89d72faed460782ebd1c97f10707d0af5..5a609b9052add7933aba9ced70c2b7f10f53f3c1 100644 (file)
@@ -456,12 +456,8 @@ block:
        }
 }
 |      lib {
-       if (P->file.ln) {
-               P->error(PSI_DATA(P), $lib, PSI_WARNING,
-                               "Extra 'lib \"%s\"' statement has no effect", $lib->text);
-       } else {
-               P->file.ln = strndup($lib->text, $lib->size);
-       }
+       char *libname = strdup($lib->text);
+       P->file.libnames = psi_plist_add(P->file.libnames, &libname);
 }
 |      constant {
        psi_parser_proc_add_const(P, $constant);
@@ -1115,9 +1111,10 @@ decl_extvar_stmt[list]:
                        if (psi_decl_extvar_is_blacklisted(var->name)) {
                                psi_decl_var_free(&var);
                        } else {
-                               list = psi_plist_add(list, psi_decl_extvar_init(
-                                       psi_decl_arg_init(psi_decl_type_copy($decl_arg->type), var)));
-                               }
+                               struct psi_decl_extvar *evar = psi_decl_extvar_init(
+                                       psi_decl_arg_init(psi_decl_type_copy($decl_arg->type), var));
+                               list = psi_plist_add(list, &evar);
+                       }
                }
                free($vars);
        }
@@ -1250,7 +1247,31 @@ decl_functor_body[decl]:
        func->token = psi_token_copy($NAME);
        
        $decl = psi_decl_init(func, $args);
+}
+|      qualified_decl_type[rval_type] indirection[i] LPAREN indirection[unused1] LPAREN indirection[unused2] name_token[NAME] RPAREN LPAREN decl_args[args] RPAREN RPAREN LPAREN decl_args[rval_args] RPAREN array_size[as] {
+       (void) $unused1;
+       (void) $unused2;
+       $NAME->type = PSI_T_NAME;
        
+       struct psi_token *type_token = psi_token_append("@", psi_token_copy($NAME), 1, "rval");
+       struct psi_decl_arg *rval_func = psi_decl_arg_init($rval_type, psi_decl_var_init(type_token->text, $i, 0));
+       struct psi_decl *rval_decl = psi_decl_init(rval_func, $rval_args);
+       
+       rval_func->var->token = psi_token_copy(type_token);
+       rval_func->token = psi_token_copy(type_token);
+       if ($as) {
+               rval_func->var->pointer_level += 1;
+               rval_func->var->array_size = $as;
+       }
+       
+       struct psi_decl_type *type = psi_decl_type_init(PSI_T_FUNCTION, type_token->text);
+       struct psi_decl_arg *func = psi_decl_arg_init(type, psi_decl_var_init($NAME->text, 1, 0));
+       
+       type->real.func = rval_decl;
+       func->var->token = psi_token_copy($NAME);
+       func->token = psi_token_copy($NAME);
+       
+       $decl = psi_decl_init(func, $args);
 }
 ;