]> ocean-lang.org Git - ocean/commitdiff
parsergen: don't report conflicts resolved by precedence.
authorNeilBrown <neil@brown.name>
Mon, 10 Jun 2019 06:34:55 +0000 (16:34 +1000)
committerNeilBrown <neil@brown.name>
Mon, 10 Jun 2019 06:59:08 +0000 (16:59 +1000)
If precedence information has been given which can resolve
a conflict, then don't report it.

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

index d12a4000d3712f6a44eaf486a284793073e1abf8..6d291312547f0aad1ddadc57ee2affeb7e8b3802 100644 (file)
@@ -1800,14 +1800,20 @@ counted, and are reported as non-critical.  This will not affect a
                                int p = item_prod(itm);
                                int bp = item_index(itm);
                                struct production *pr = g->productions[p];
+                               struct symbol *s;
 
-                               if (bp < pr->body_size &&
-                                   pr->body[bp]->type == Terminal) {
-                                       /* shiftable */
-                                       int sym = pr->body[bp]->num;
-                                       if (symset_find(&shifts, sym) < 0)
-                                               symset_add(&shifts, sym, itm);
-                               }
+                               if (bp >= pr->body_size ||
+                                   pr->body[bp]->type != Terminal)
+                                       /* not shiftable */
+                                       continue;
+
+                               s = pr->body[bp];
+                               if (s->precedence && is->precedence)
+                                       /* Precedence resolves this, so no conflict */
+                                       continue;
+
+                               if (symset_find(&shifts, s->num) < 0)
+                                       symset_add(&shifts, s->num, itm);
                        }
                        /* Now look for reductions and conflicts */
                        for (j = 0; j < is->items.cnt; j++) {