]> ocean-lang.org Git - ocean/blobdiff - csrc/parsergen.mdc
parsergen: do not create empty goto arrays
[ocean] / csrc / parsergen.mdc
index fc95688efff4332384acd7034472d9b78a287d41..5d2e164221fb38488948210128bf007390f0e561 100644 (file)
@@ -1488,18 +1488,21 @@ itemsets (or merged with a pre-existing itemset).
                                continue;
                        if (pr->body[bp] != sym)
                                continue;
+
+                       bp += 1;
                        if (type >= LALR)
                                la = is->items.data[j];
-                       pos = symset_find(&newitemset, pr->head->num);
-                       if (bp + 1 == pr->body_size &&
+                       if (bp == pr->body_size &&
                            pr->precedence > 0 &&
                            pr->precedence > precedence) {
                                // new itemset is reducible and has a precedence.
                                precedence = pr->precedence;
                                assoc = pr->assoc;
                        }
+                       pos = symset_find(&newitemset, item_num(p, bp));
+
                        if (pos < 0)
-                               symset_add(&newitemset, item_num(p, bp+1), la);
+                               symset_add(&newitemset, item_num(p, bp), la);
                        else if (type >= LALR) {
                                // Need to merge la set.
                                int la2 = newitemset.data[pos];
@@ -2062,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]);
@@ -2096,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");