}
P->enums = psi_plist_add(P->enums, &e);
}
+static inline void psi_parser_proc_deanon_typedef(struct psi_decl_arg *def)
+{
+ switch (def->type->type) {
+ case PSI_T_STRUCT:
+ if (!psi_decl_type_is_anon(def->type->name, "struct")) {
+ return;
+ }
+ break;
+ case PSI_T_UNION:
+ if (!psi_decl_type_is_anon(def->type->name, "union")) {
+ return;
+ }
+ break;
+ case PSI_T_ENUM:
+ if (!psi_decl_type_is_anon(def->type->name, "enum")) {
+ return;
+ }
+ break;
+ default:
+ return;
+ }
+ free(def->type->name);
+ def->type->name = strdup(def->var->name);
+}
static inline void psi_parser_proc_add_typedef(struct psi_parser *P, struct psi_decl_arg *def)
{
assert(def);
if (!P->types) {
P->types = psi_plist_init((psi_plist_dtor) psi_decl_arg_free);
}
+ psi_parser_proc_deanon_typedef(def);
P->types = psi_plist_add(P->types, &def);
}
static inline void psi_parser_proc_add_const(struct psi_parser *P, struct psi_const *cnst) {
#include "plist.h"
#include "types/layout.h"
+#define yytokentype psi_token_type
+
+#define PSI_T_CAST PSI_T_EQUALS
+#define PSI_T_POINTER PSI_T_ASTERISK
+
struct psi_parser;
}
%token <struct psi_token *> CPP_RESTRICT
%token <struct psi_token *> CPP_ASM
+/* virtual tokens */
+%token <struct psi_token *> BSLASH
+%token <struct psi_token *> LONG_DOUBLE
+%token <struct psi_token *> INT8
+%token <struct psi_token *> UINT8
+%token <struct psi_token *> INT16
+%token <struct psi_token *> UINT16
+%token <struct psi_token *> INT32
+%token <struct psi_token *> UINT32
+%token <struct psi_token *> INT64
+%token <struct psi_token *> UINT64
+%token <struct psi_token *> INT128
+%token <struct psi_token *> UINT128
+
+
%precedence IIF COLON
%precedence OR
%precedence AND
%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 struct_arg_var_list decl_enum_items decl_vars decl_vars_with_layout call_decl_vars
-%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 call_decl_vars
+%type <struct psi_plist *> decl_args decl_arg_list decl_struct_args struct_args_block struct_args struct_arg_var_list decl_enum_items decl_vars decl_vars_with_layout call_decl_vars
+%destructor {psi_plist_free($$);} decl_args decl_arg_list decl_struct_args struct_args_block struct_args struct_arg_var_list decl_enum_items decl_vars decl_vars_with_layout call_decl_vars
%type <struct psi_layout> align_and_size
%destructor {} align_and_size
| VOID {
$args = NULL;
}
-| decl_anon_arg[arg] {
+| decl_arg_list[args_] {
+ $args = $args_;
+}
+;
+
+decl_arg_list[args]:
+ decl_anon_arg[arg] {
$args = psi_plist_add(psi_plist_init((psi_plist_dtor) psi_decl_arg_free), &$arg);
}
-| decl_args[args_] COMMA decl_anon_arg[arg] {
+| decl_arg_list[args_] COMMA decl_anon_arg[arg] {
$args = psi_plist_add($args_, &$arg);
}
;
;
decl_enum[enum]:
- enum_name LBRACE decl_enum_items[list] RBRACE {
+ enum_name LBRACE decl_enum_items[list] optional_comma RBRACE {
$enum = psi_decl_enum_init($enum_name->text, $list);
$enum->token = $enum_name;
}
if ($indirection) {
int8_t sizeof_void_p = sizeof(void *);
$sizeof = psi_number_init(PSI_T_INT8, &sizeof_void_p, 0);
+ psi_decl_type_free(&$decl_type);
} else {
$sizeof = psi_number_init(PSI_T_SIZEOF, $decl_type, 0);
}
}
;
+optional_comma:
+ %empty
+| COMMA
+;
+
decl_layout[l]:
%empty {
$l = NULL;
| LBRACKET RBRACKET {
$as = 0;
}
+| LBRACKET CPP_RESTRICT RBRACKET {
+ $as = 0;
+}
| LBRACKET num_exp RBRACKET {
if (psi_num_exp_validate(PSI_DATA(P), $num_exp, NULL, NULL, NULL, NULL, NULL)) {
$as = psi_long_num_exp($num_exp, NULL, &P->preproc->defs);
} else {
$as = 0;
}
+ psi_num_exp_free(&$num_exp);
}
;
let_callback[callback]:
CALLBACK callback_rval[func] LPAREN impl_var[var] LPAREN callback_arg_list[args] RPAREN RPAREN {
- $callback = psi_let_callback_init(psi_let_func_init($func->type, $func->text, $var), $args);
+ $callback = psi_let_callback_init(psi_let_func_init($func->type, $func->text, $var), $args, NULL);
+ $callback->func->token = psi_token_copy($func);
+ $callback->token = psi_token_copy($CALLBACK);
+}
+| CALLBACK LPAREN call_decl_vars[cb_args] RPAREN AS callback_rval[func] LPAREN impl_var[var] LPAREN callback_arg_list[args] RPAREN RPAREN {
+ $callback = psi_let_callback_init(psi_let_func_init($func->type, $func->text, $var), $args, $cb_args);
$callback->func->token = psi_token_copy($func);
$callback->token = psi_token_copy($CALLBACK);
}