]> ocean-lang.org Git - ocean/commitdiff
parergen: fix bug in deriving itemsets
authorNeilBrown <neil@brown.name>
Fri, 5 Mar 2021 10:17:51 +0000 (21:17 +1100)
committerNeilBrown <neil@brown.name>
Wed, 10 Mar 2021 01:00:31 +0000 (12:00 +1100)
The code to check if an item had already been added, was wrong.

Signed-off-by: NeilBrown <neil@brown.name>
csrc/parsergen.mdc

index fc95688efff4332384acd7034472d9b78a287d41..a6486df26025ab252fd4fc446aea2c3dda02e9aa 100644 (file)
@@ -1488,18 +1488,21 @@ itemsets (or merged with a pre-existing itemset).
                                continue;
                        if (pr->body[bp] != sym)
                                continue;
                                continue;
                        if (pr->body[bp] != sym)
                                continue;
+
+                       bp += 1;
                        if (type >= LALR)
                                la = is->items.data[j];
                        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;
                        }
                            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)
                        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];
                        else if (type >= LALR) {
                                // Need to merge la set.
                                int la2 = newitemset.data[pos];