]> ocean-lang.org Git - ocean/blobdiff - csrc/parsergen.mdc
parsergen: don't report conflicts resolved by precedence.
[ocean] / 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++) {