X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fparser_proc.y;h=57fc968bab2b8226a8e7323cc0864ef3c83a0e26;hp=b4bf9600f9d2e2b675439d50dd0c1d9fa0dbe2f6;hb=8b652242a4ef920f2ab82bfb822596de25bc5a63;hpb=b6a04e85779e14399f03e91939b8cb47eb330ef7 diff --git a/src/parser_proc.y b/src/parser_proc.y index b4bf960..57fc968 100644 --- a/src/parser_proc.y +++ b/src/parser_proc.y @@ -700,6 +700,35 @@ 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_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. +%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); +} + +%type callback_arg_list {set_values *} +%destructor callback_arg_list {free_set_values($$);} +callback_arg_list ::= . +callback_arg_list(args) ::= COMMA 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); +} +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. { @@ -714,21 +743,12 @@ let_val(val) ::= CALLOC LPAREN let_calloc(alloc) RPAREN. { 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. -%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_val(val) ::= CALLBACK let_func_token(F) LPAREN impl_var(var) callback_arg_list(args_) 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. {