From: NeilBrown Date: Sun, 15 Jun 2014 07:59:27 +0000 (+1000) Subject: parsergen: fix return of final result. X-Git-Tag: workingparser~28 X-Git-Url: https://ocean-lang.org/code/?p=ocean;a=commitdiff_plain;h=1c4f8cfc5db843715598120335310472621a49a4 parsergen: fix return of final result. We cannot really shift the final result onto the stack, because there is not 'goto' for '$eof' in that final state. So if the shift() fails, hold onto the result and ultimately return it. This means we don't need to pop it off the stack at the end. Signed-off-by: NeilBrown --- diff --git a/csrc/parsergen.mdc b/csrc/parsergen.mdc index fbb561c..47cbfc2 100644 --- a/csrc/parsergen.mdc +++ b/csrc/parsergen.mdc @@ -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;