X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Fparser_proc.y;h=8ec585d162200253c8bda828adc888468b8f076d;hb=9f42fcc5b2a31e074bebed0f0f906c1e54b51b95;hp=4ae2b33d2fe24d3e4967541a6d46c0f3a6410170;hpb=c5f1eb3b7e969dde73a6e485a19d5a2766651970;p=m6w6%2Fext-psi diff --git a/src/parser_proc.y b/src/parser_proc.y index 4ae2b33..8ec585d 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 LIB STRING. +%fallback NAME TEMP FREE SET LET RETURN CALLOC CALLBACK ZVAL LIB STRING. file ::= blocks. @@ -315,27 +315,37 @@ 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); } -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); } @@ -373,14 +383,19 @@ 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); } @@ -700,45 +715,28 @@ let_stmt(let) ::= TEMP decl_var(var) EQUALS decl_var(val) EOS. { let = init_let_stmt(var, init_let_val(PSI_LET_TMP, val)); } -%type let_val {let_val*} -%destructor let_val {free_let_val($$);} -let_val(val) ::= NULL. { - val = init_let_val(PSI_LET_NULL, NULL); -} -let_val(val) ::= num_exp(exp). { - val = init_let_val(PSI_LET_NUMEXP, exp); -} -let_val(val) ::= CALLOC LPAREN let_calloc(alloc) RPAREN. { - val = init_let_val(PSI_LET_CALLOC, alloc); -} -let_val(val) ::= let_func(func). { - val = init_let_val(PSI_LET_FUNC, func); -} - %type let_calloc {let_calloc*} %destructor let_calloc {free_let_calloc($$);} 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. { func = init_let_func(T->type, T->text, var); free(T); } -let_func(func_) ::= CALLBACK let_func_token(T) LPAREN impl_var(var) callback_arg_list(args_) RPAREN. { - func_ = init_let_func(T->type, T->text, var); - func_->callback.func = func_; - func_->callback.args = args_; - free(T); -} +%type callback_arg_list {set_values *} +%destructor callback_arg_list {free_set_values($$);} callback_arg_list ::= . -callback_arg_list(args) ::= COMMA callback_args(args_). { +callback_arg_list(args) ::= callback_args(args_). { args = args_; } +%type callback_args {set_values *} +%destructor callback_args {free_set_values($$);} callback_args(args) ::= set_value(val). { args = init_set_values(val); } @@ -746,6 +744,26 @@ callback_args(args) ::= callback_args(args_) COMMA set_value(val). { args = add_set_value(args_, val); } +%type let_val {let_val*} +%destructor let_val {free_let_val($$);} +let_val(val) ::= NULL. { + val = init_let_val(PSI_LET_NULL, NULL); +} +let_val(val) ::= num_exp(exp). { + val = init_let_val(PSI_LET_NUMEXP, exp); +} +let_val(val) ::= CALLOC LPAREN let_calloc(alloc) RPAREN. { + val = init_let_val(PSI_LET_CALLOC, alloc); +} +let_val(val) ::= let_func(func). { + val = init_let_val(PSI_LET_FUNC, func); +} +let_val(val) ::= CALLBACK let_func_token(F) LPAREN impl_var(var) LPAREN callback_arg_list(args_) RPAREN RPAREN. { + val = init_let_val(PSI_LET_CALLBACK, init_let_callback( + init_let_func(F->type, F->text, var), args_)); + free(F); +} + %type set_stmt {set_stmt*} %destructor set_stmt {free_set_stmt($$);} set_stmt(set) ::= SET impl_var(var) EQUALS set_value(val) EOS. { @@ -786,7 +804,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). {