+static bool parser_close_call(parser_t *parser, shunt *sy)
+{
+ /* was a function call */
+ ast_expression *fun;
+ ast_call *call;
+
+ size_t fid;
+
+ sy->ops_count--;
+ fid = sy->ops[sy->ops_count].off;
+
+ /* out[fid] is the function
+ * everything above is parameters...
+ * 0 params = nothing
+ * 1 params = ast_expression
+ * more = ast_block
+ */
+
+ if (sy->out_count < 1 || sy->out_count <= fid) {
+ parseerror(parser, "internal error: function call needs function and parameter list...");
+ return false;
+ }
+
+ fun = sy->out[fid].out;
+
+ call = ast_call_new(sy->ops[sy->ops_count].ctx, fun);
+ if (!call) {
+ parseerror(parser, "out of memory");
+ return false;
+ }
+
+ printf("fid = %i, out_count = %i\n", (int)fid, (int)sy->out_count);
+
+ if (fid+1 == sy->out_count) {
+ /* no arguments */
+ } else if (fid+2 == sy->out_count) {
+ ast_block *params;
+ sy->out_count--;
+ params = sy->out[sy->out_count].block;
+ if (!params) {
+ /* 1 param */
+ if (!ast_call_params_add(call, sy->out[sy->out_count].out)) {
+ ast_delete(sy->out[sy->out_count].out);
+ parseerror(parser, "out of memory");
+ return false;
+ }
+ } else {
+ MEM_VECTOR_MOVE(params, exprs, call, params);
+ ast_delete(params);
+ }
+ } else {
+ parseerror(parser, "invalid function call");
+ return false;
+ }
+
+ /* overwrite fid, the function, with a call */
+ sy->out[fid] = syexp(call->expression.node.context, (ast_expression*)call);
+ return true;
+}
+
+static bool parser_close_paren(parser_t *parser, shunt *sy, bool functions_only)