/* TOKEN is defined inside syntax_error */
%syntax_error {
PSI_ParserSyntaxError(P, P->psi.file.fn, P->line, "Unexpected token '%s'", TOKEN->text);
+ TOKEN->type = PSI_T_NAME;
}
%nonassoc NAME.
set_value(val) ::= set_func(func) LPAREN decl_vars(vars) RPAREN. {
val = init_set_value(func, vars);
}
+set_value(val) ::= set_func(func_) LPAREN decl_vars(vars_) COMMA set_vals(vals) RPAREN. {
+ val = vals;
+ val->func = func_;
+ val->vars = vars_;
+}
+%type set_vals {set_value*}
+%destructor set_vals {free_set_value($$);}
+set_vals(vals) ::= set_value(val). {
+ vals = add_inner_set_value(init_set_value(NULL, NULL), val);
+}
+set_vals(vals) ::= set_vals(vals_) COMMA set_value(val). {
+ vals = add_inner_set_value(vals_, val);
+}
%type set_func {set_func*}
%destructor set_func {free_set_func($$);}
%type return_stmt {return_stmt*}
%destructor return_stmt {free_return_stmt($$);}
-return_stmt(ret) ::= RETURN set_func(func) LPAREN decl_var(var) RPAREN EOS. {
- ret = init_return_stmt(func, var);
+return_stmt(ret) ::= RETURN set_value(val) EOS. {
+ ret = init_return_stmt(val);
}
%type free_stmt {free_stmt*}
%destructor free_stmt {free_free_stmt($$);}
-free_stmt(free) ::= FREE decl_vars(vars) EOS. {
- free = init_free_stmt(vars);
+free_stmt(free) ::= FREE free_calls(calls) EOS. {
+ free = init_free_stmt(calls);
+}
+
+%type free_calls {free_calls*}
+%destructor free_calls {free_free_calls($$);}
+free_calls(calls) ::= free_call(call). {
+ calls = init_free_calls(call);
+}
+free_calls(calls) ::= free_calls(calls_) COMMA free_call(call). {
+ calls = add_free_call(calls_, call);
+}
+
+%type free_call {free_call*}
+%destructor free_call {free_free_call($$);}
+free_call(call) ::= NAME(F) LPAREN decl_vars(vars) RPAREN. {
+ call = init_free_call(F->text, vars);
}
%type impl_type {impl_type*}