From caac8a86d23d6d058a4234e265c2f50e7e7c9b84 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Wed, 24 Feb 2021 19:57:08 +1100 Subject: [PATCH] parsergen: do not create empty goto arrays These empty arrays are a waste of space ... assuming they take up any(?). Using NULL is more ideomatic. Signed-off-by: NeilBrown --- csrc/parsergen.mdc | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/csrc/parsergen.mdc b/csrc/parsergen.mdc index a6486df..5d2e164 100644 --- a/csrc/parsergen.mdc +++ b/csrc/parsergen.mdc @@ -2065,10 +2065,13 @@ The go to table is stored in a simple array of `sym` and corresponding int i; fprintf(f, "#line 0 \"gen_goto\"\n"); for (i = 0; i < g->states; i++) { + struct symset gt = g->statetab[i]->go_to; int j; + + if (gt.cnt == 0) + continue; fprintf(f, "static const struct lookup goto_%d[] = {\n", i); - struct symset gt = g->statetab[i]->go_to; for (j = 0; j < gt.cnt; j++) fprintf(f, "\t{ %d, %d },\n", gt.syms[j], gt.data[j]); @@ -2099,18 +2102,21 @@ The go to table is stored in a simple array of `sym` and corresponding prod_len = pr->body_size; } } - - if (prod >= 0) - fprintf(f, "\t[%d] = { %d, goto_%d, %d, %d, %d, %d, %d, %d },\n", - i, is->go_to.cnt, i, prod, - g->productions[prod]->body_size, - g->productions[prod]->head->num, + if (is->go_to.cnt) + fprintf(f, "\t[%d] = { %d, goto_%d, ", + i, is->go_to.cnt, i); + else + fprintf(f, "\t[%d] = { 0, NULL, ", i); + if (prod >= 0) { + struct production *pr = g->productions[prod]; + fprintf(f, "%d, %d, %d, %d, %d, %d },\n", prod, + pr->body_size, + pr->head->num, is->starts_line, - g->productions[prod]->line_like, + pr->line_like, is->min_prefix); - else - fprintf(f, "\t[%d] = { %d, goto_%d, -1, -1, -1, %d, 0, %d },\n", - i, is->go_to.cnt, i, + } else + fprintf(f, "-1, -1, -1, %d, 0, %d },\n", is->starts_line, is->min_prefix); } fprintf(f, "};\n\n"); -- 2.43.0