- DEBUGSHUNTDO(printf("push operator %s\n", op->op));
- if (!shunt_ops_add(&sy, syop(parser_ctx(parser), op)))
- goto onerr;
+ if (op->id == opid1('(')) {
+ if (wantop) {
+ DEBUGSHUNTDO(printf("push (\n"));
+ ++parens;
+ /* we expected an operator, this is the function-call operator */
+ if (!shunt_ops_add(&sy, syparen(parser_ctx(parser), 'f', sy.out_count-1))) {
+ parseerror(parser, "out of memory");
+ goto onerr;
+ }
+ } else {
+ ++parens;
+ if (!shunt_ops_add(&sy, syparen(parser_ctx(parser), 1, 0))) {
+ parseerror(parser, "out of memory");
+ goto onerr;
+ }
+ DEBUGSHUNTDO(printf("push (\n"));
+ }
+ wantop = false;
+ } else {
+ DEBUGSHUNTDO(printf("push operator %s\n", op->op));
+ if (!shunt_ops_add(&sy, syop(parser_ctx(parser), op)))
+ goto onerr;
+ wantop = false;
+ }