From 2deb5cafced7025e4a75418981f948b11d421d6c Mon Sep 17 00:00:00 2001 From: ceriel Date: Tue, 23 Aug 1988 16:05:19 +0000 Subject: [PATCH] remove empty-producing nonterminals --- util/LLgen/src/gencode.c | 10 ++++------ util/LLgen/src/reach.c | 16 ++++++++++++++-- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/util/LLgen/src/gencode.c b/util/LLgen/src/gencode.c index 7373834bf..35b32acc6 100644 --- a/util/LLgen/src/gencode.c +++ b/util/LLgen/src/gencode.c @@ -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(); diff --git a/util/LLgen/src/reach.c b/util/LLgen/src/reach.c index 0604c2c51..3fa5110da 100644 --- a/util/LLgen/src/reach.c +++ b/util/LLgen/src/reach.c @@ -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; } -- 2.34.1