]> ocean-lang.org Git - ocean/blobdiff - csrc/parsergen.mdc
parsergen: fix return of final result.
[ocean] / csrc / parsergen.mdc
index fbb561cfe7f2a796927474df4f08cad1225fda09..47cbfc2e48c641ebf49c081ff95346110561cb02 100644 (file)
@@ -2629,6 +2629,7 @@ since the last state which could have been at the start of a line.
                        }
                        if (states[p.next.state].reduce_prod >= 0) {
                                void **body;
+                               void *res;
                                int prod = states[p.next.state].reduce_prod;
                                int size = states[p.next.state].reduce_size;
                                int bufsize;
@@ -2641,10 +2642,13 @@ since the last state which could have been at the start of a line.
                                bufsize = do_reduce(prod, body, config, buf);
 
                                pop(&p, size, do_free);
-                               shift(&p, memdup(buf, bufsize), states);
+                               res = memdup(buf, bufsize);
                                memset(buf, 0, bufsize);
-                               if (prod == 0)
+                               if (!shift(&p, res, states)) {
+                                       if (prod != 0) abort();
                                        accepted = 1;
+                                       ret = res;
+                               }
                                continue;
                        }
                        if (tk->num == TK_out) {
@@ -2691,10 +2695,7 @@ since the last state which could have been at the start of a line.
                                break;
                }
                free(tk);
-               if (accepted)
-                       ret = p.asn_stack[0];
-               else
-                       pop(&p, p.tos, do_free);
+               pop(&p, p.tos, do_free);
                free(p.asn_stack);
                free(p.stack);
                return ret;