remove empty-producing nonterminals
authorceriel <none@none>
Tue, 23 Aug 1988 16:05:19 +0000 (16:05 +0000)
committerceriel <none@none>
Tue, 23 Aug 1988 16:05:19 +0000 (16:05 +0000)
util/LLgen/src/gencode.c
util/LLgen/src/reach.c

index 7373834..35b32ac 100644 (file)
@@ -253,6 +253,10 @@ generate(f) p_file f; {
                 * of synchronisation with the action file
                 */
                while (p->n_count--) getaction(1);
+               if (g_gettype(p->n_rule) == EORULE &&
+                   getntparams(p) == 0) {
+                       continue;
+               }
                fprintf(fpars,"L%d_%s (\n",s->o_index,p->n_name);
                if (p->n_flags & PARAMS) {
                        controlline();
@@ -487,12 +491,6 @@ rulecode(p,safety,mustscan,mustpop) register p_gram p; {
                             getntsafe(n) <= SAFESCANDONE)) {
                                genpop(findindex(n->n_contains));
                        }
-                       if (g_gettype(n->n_rule) == EORULE &&
-                           safety <= getntout(n) &&
-                           ! g_getnpar(p)) {
-                               safety = getntout(n);
-                               break;
-                       }
                        fprintf(f,"L%d_%s(\n",g_getcont(p), n->n_name);
                        if (g_getnpar(p)) {
                                controlline();
index 0604c2c..3fa5110 100644 (file)
@@ -102,9 +102,21 @@ reachwalk(p) register p_gram p; {
                  case TERM :
                        reachwalk(g_getterm(p)->t_rule);
                        break;
-                 case NONTERM :
-                       reachable(&nonterms[g_getcont(p)]);
+                 case NONTERM : {
+                       register p_nont n = &nonterms[g_getcont(p)];
+
+                       reachable(n);
+                       if (g_gettype(n->n_rule) == EORULE &&
+                           ! g_getnpar(p) && (getntparams(n) == 0)) {
+                               register p_gram np = p;
+                               do {
+                                       *np = *(np + 1);
+                                       np++;
+                               } while (g_gettype(np) != EORULE);
+                               continue;
+                       }
                        break;
+                 }
                  case EORULE :
                        return;
                }