X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Fparser_proc.y;h=b46053a108832a148d48b3a0cb9f83978a036ea1;hb=6b2e6562e64a263a42910d28e23b6ca94f3ecb65;hp=50d54dab01a79b42e962ab5b9b1308578a816834;hpb=b9193a8d80bf7ea8d768b9521bcd298a03974c9d;p=m6w6%2Fext-psi diff --git a/src/parser_proc.y b/src/parser_proc.y index 50d54da..b46053a 100644 --- a/src/parser_proc.y +++ b/src/parser_proc.y @@ -29,7 +29,7 @@ void psi_error(int, const char *, int, const char *, ...); %nonassoc NAME. %left PLUS MINUS. %left SLASH ASTERISK. -%fallback NAME TEMP FREE SET LET RETURN CALLOC CALLBACK LIB STRING. +%fallback NAME TEMP FREE SET LET RETURN CALLOC CALLBACK ZVAL LIB STRING. file ::= blocks. @@ -57,11 +57,22 @@ block ::= impl(impl). { } block ::= decl_typedef(def). { P->defs = add_decl_typedef(P->defs, def); - if (def->type->strct) { - P->structs = add_decl_struct(P->structs, def->type->strct); - } - if (def->type->enm) { - P->enums = add_decl_enum(P->enums, def->type->enm); + switch (def->type->type) { + case PSI_T_STRUCT: + if (def->type->real.strct) { + P->structs = add_decl_struct(P->structs, def->type->real.strct); + } + break; + case PSI_T_UNION: + if (def->type->real.unn) { + P->unions = add_decl_union(P->unions, def->type->real.unn); + } + break; + case PSI_T_ENUM: + if (def->type->real.enm) { + P->enums = add_decl_enum(P->enums, def->type->real.enm); + } + break; } } block ::= constant(constant). { @@ -208,16 +219,16 @@ constant(constant) ::= CONST const_type(type) NSNAME(T) EQUALS impl_def_val(val) %type decl_typedef {decl_arg*} %destructor decl_typedef { - free_decl_arg($$); - if ($$->type->strct) { - free_decl_struct($$->type->strct); - } - if ($$->type->enm) { - free_decl_enum($$->type->enm); + free_decl_arg($$);/* + if ($$->type->real.strct) { + free_decl_struct($$->type->real.strct); } - if ($$->type->func) { - free_decl($$->type->func); + if ($$->type->real.enm) { + free_decl_enum($$->type->real.enm); } + if ($$->type->real.func) { + free_decl($$->type->real.func); + }*/ } decl_typedef(def) ::= TYPEDEF(T) decl_typedef_body(def_) EOS. { def = def_; @@ -225,57 +236,57 @@ decl_typedef(def) ::= TYPEDEF(T) decl_typedef_body(def_) EOS. { } %type decl_typedef_body_ex {decl_arg*} %destructor decl_typedef_body_ex { - free_decl_arg($$); - if ($$->type->strct) { - free_decl_struct($$->type->strct); - } - if ($$->type->enm) { - free_decl_enum($$->type->enm); + free_decl_arg($$);/* + if ($$->type->real.strct) { + free_decl_struct($$->type->real.strct); } - if ($$->type->unn) { - free_decl_union($$->type->unn); + if ($$->type->real.enm) { + free_decl_enum($$->type->real.enm); } - if ($$->type->func) { - free_decl($$->type->func); + if ($$->type->real.unn) { + free_decl_union($$->type->real.unn); } + if ($$->type->real.func) { + free_decl($$->type->real.func); + }*/ } decl_typedef_body_ex(def) ::= struct_name(N) align_and_size(as) decl_struct_args_block(args) decl_var(var). { def = init_decl_arg(init_decl_type(PSI_T_STRUCT, N->text), var); def->type->token = PSI_TokenCopy(N); - def->type->strct = init_decl_struct(N->text, args); - def->type->strct->token = N; - def->type->strct->align = as.a; - def->type->strct->size = as.s; + def->type->real.strct = init_decl_struct(N->text, args); + def->type->real.strct->token = N; + def->type->real.strct->align = as.a; + def->type->real.strct->size = as.s; } decl_typedef_body_ex(def) ::= union_name(N) align_and_size(as) decl_struct_args_block(args) decl_var(var). { def = init_decl_arg(init_decl_type(PSI_T_UNION, N->text), var); def->type->token = PSI_TokenCopy(N); - def->type->unn = init_decl_union(N->text, args); - def->type->unn->token = N; - def->type->unn->align = as.a; - def->type->unn->size = as.s; + def->type->real.unn = init_decl_union(N->text, args); + def->type->real.unn->token = N; + def->type->real.unn->align = as.a; + def->type->real.unn->size = as.s; } decl_typedef_body_ex(def) ::= decl_enum(e) NAME(ALIAS). { def = init_decl_arg(init_decl_type(PSI_T_ENUM, e->name), init_decl_var(ALIAS->text, 0, 0)); def->var->token = ALIAS; def->type->token = PSI_TokenCopy(e->token); - def->type->enm = e; + def->type->real.enm = e; } %type decl_typedef_body {decl_arg*} %destructor decl_typedef_body { - free_decl_arg($$); - if ($$->type->strct) { - free_decl_struct($$->type->strct); - } - if ($$->type->enm) { - free_decl_enum($$->type->enm); + free_decl_arg($$);/* + if ($$->type->real.strct) { + free_decl_struct($$->type->real.strct); } - if ($$->type->unn) { - free_decl_union($$->type->unn); + if ($$->type->real.enm) { + free_decl_enum($$->type->real.enm); } - if ($$->type->func) { - free_decl($$->type->func); + if ($$->type->real.unn) { + free_decl_union($$->type->real.unn); } + if ($$->type->real.func) { + free_decl($$->type->real.func); + }*/ } decl_typedef_body(def) ::= decl_typedef_body_ex(def_). { def = def_; @@ -288,7 +299,7 @@ decl_typedef_body_fn_args(args) ::= LPAREN decl_args(args_) RPAREN. { decl_typedef_body(def) ::= decl_func(func_) decl_typedef_body_fn_args(args). { def = init_decl_arg(init_decl_type(PSI_T_FUNCTION, func_->var->name), copy_decl_var(func_->var)); def->type->token = PSI_TokenCopy(func_->token); - def->type->func = init_decl(init_decl_abi("default"), func_, args); + def->type->real.func = init_decl(init_decl_abi("default"), func_, args); } decl_typedef_body(def) ::= decl_arg(arg). { def = arg; @@ -315,29 +326,39 @@ decl_func(func) ::= VOID(T) NAME(N). { func->var->token = N; func->token = N; } -decl_typedef_body(def) ::= VOID(T) indirection(i) LPAREN ASTERISK NAME(N) RPAREN decl_typedef_body_fn_args(args). { +decl_typedef_body(def) ::= VOID(T) indirection(decl_i) LPAREN indirection(type_i) NAME(N) RPAREN decl_typedef_body_fn_args(args). { decl_arg *func_ = init_decl_arg( init_decl_type(T->type, T->text), - init_decl_var(N->text, i, 0) + init_decl_var(N->text, decl_i, 0) ); func_->type->token = T; func_->var->token = N; func_->token = N; - def = init_decl_arg(init_decl_type(PSI_T_FUNCTION, func_->var->name), copy_decl_var(func_->var)); + + def = init_decl_arg( + init_decl_type(PSI_T_FUNCTION, func_->var->name), + copy_decl_var(func_->var) + ); + def->var->pointer_level = type_i; def->type->token = PSI_TokenCopy(func_->token); - def->type->func = init_decl(init_decl_abi("default"), func_, args); + def->type->real.func = init_decl(init_decl_abi("default"), func_, args); } -decl_typedef_body(def) ::= CONST VOID(T) pointers(i) LPAREN ASTERISK NAME(N) RPAREN decl_typedef_body_fn_args(args). { +decl_typedef_body(def) ::= CONST VOID(T) pointers(decl_i) LPAREN indirection(type_i) NAME(N) RPAREN decl_typedef_body_fn_args(args). { decl_arg *func_ = init_decl_arg( init_decl_type(T->type, T->text), - init_decl_var(N->text, i, 0) + init_decl_var(N->text, decl_i, 0) ); func_->type->token = T; func_->var->token = N; func_->token = N; - def = init_decl_arg(init_decl_type(PSI_T_FUNCTION, func_->var->name), copy_decl_var(func_->var)); + + def = init_decl_arg( + init_decl_type(PSI_T_FUNCTION, func_->var->name), + copy_decl_var(func_->var) + ); + def->var->pointer_level = type_i; def->type->token = PSI_TokenCopy(func_->token); - def->type->func = init_decl(init_decl_abi("default"), func_, args); + def->type->real.func = init_decl(init_decl_abi("default"), func_, args); } %type decl_abi {decl_abi*} @@ -373,16 +394,21 @@ decl_vars(vars) ::= decl_vars(vars_) COMMA decl_var(var). { decl_arg(arg_) ::= const_decl_type(type) decl_var(var). { arg_ = init_decl_arg(type, var); } -decl_typedef_body(def) ::= const_decl_type(type_) indirection(i) LPAREN ASTERISK NAME(N) RPAREN decl_typedef_body_fn_args(args). { +decl_typedef_body(def) ::= const_decl_type(type_) indirection(decl_i) LPAREN indirection(type_i) NAME(N) RPAREN decl_typedef_body_fn_args(args). { decl_arg *func_ = init_decl_arg( type_, - init_decl_var(N->text, i, 0) + init_decl_var(N->text, decl_i, 0) ); func_->var->token = N; func_->token = N; - def = init_decl_arg(init_decl_type(PSI_T_FUNCTION, func_->var->name), copy_decl_var(func_->var)); + + def = init_decl_arg( + init_decl_type(PSI_T_FUNCTION, func_->var->name), + copy_decl_var(func_->var) + ); + def->var->pointer_level = type_i; def->type->token = PSI_TokenCopy(func_->token); - def->type->func = init_decl(init_decl_abi("default"), func_, args); + def->type->real.func = init_decl(init_decl_abi("default"), func_, args); } /* void pointers need a specific rule */ @@ -430,23 +456,35 @@ struct_args(args) ::= struct_args(args_) struct_arg(arg). { %type struct_arg {decl_arg*} %destructor struct_arg { free_decl_arg($$); - if ($$->type->strct) { - free_decl_struct($$->type->strct); + /* + if ($$->type->real.strct) { + free_decl_struct($$->type->real.strct); } - if ($$->type->enm) { - free_decl_enum($$->type->enm); - } - if ($$->type->func) { - free_decl($$->type->func); + if ($$->type->real.enm) { + free_decl_enum($$->type->real.enm); } + if ($$->type->real.func) { + free_decl($$->type->real.func); + }*/ } struct_arg(arg_) ::= decl_typedef_body_ex(def) EOS. { arg_ = def; - if (def->type->strct) { - P->structs = add_decl_struct(P->structs, def->type->strct); - } - if (def->type->enm) { - P->enums = add_decl_enum(P->enums, def->type->enm); + switch (def->type->type) { + case PSI_T_STRUCT: + if (def->type->real.strct) { + P->structs = add_decl_struct(P->structs, def->type->real.strct); + } + break; + case PSI_T_UNION: + if (def->type->real.unn) { + P->unions = add_decl_union(P->unions, def->type->real.unn); + } + break; + case PSI_T_ENUM: + if (def->type->real.enm) { + P->enums = add_decl_enum(P->enums, def->type->real.enm); + } + break; } } struct_arg(arg) ::= decl_arg(arg_) struct_layout(layout_) EOS. { @@ -705,7 +743,7 @@ let_stmt(let) ::= TEMP decl_var(var) EQUALS decl_var(val) EOS. { let_calloc(alloc) ::= num_exp(nmemb) COMMA num_exp(size). { alloc = init_let_calloc(nmemb, size); } -%token_class let_func_token OBJVAL ARRVAL PATHVAL STRLEN STRVAL FLOATVAL INTVAL BOOLVAL. +%token_class let_func_token ZVAL OBJVAL ARRVAL PATHVAL STRLEN STRVAL FLOATVAL INTVAL BOOLVAL. %type let_func {let_func*} %destructor let_func {free_let_func($$);} let_func(func) ::= let_func_token(T) LPAREN impl_var(var) RPAREN. { @@ -789,7 +827,7 @@ set_vals(vals) ::= set_vals(vals_) COMMA set_value(val). { vals = add_inner_set_value(vals_, val); } -%token_class set_func_token TO_OBJECT TO_ARRAY TO_STRING TO_INT TO_FLOAT TO_BOOL VOID. +%token_class set_func_token TO_OBJECT TO_ARRAY TO_STRING TO_INT TO_FLOAT TO_BOOL ZVAL VOID. %type set_func {set_func*} %destructor set_func {free_set_func($$);} set_func(func) ::= set_func_token(T). {