-only generate warnings when there are conflict resolvers but no conflicts,

-handle "onerror" differently
This commit is contained in:
ceriel 1987-04-13 16:11:50 +00:00
parent 218c1c46c4
commit 4805d67ca1
3 changed files with 36 additions and 6 deletions

View file

@ -228,9 +228,8 @@ check(p) register p_gram p; {
else { else {
if (q->t_flags & RESOLVER) { if (q->t_flags & RESOLVER) {
q->t_flags |= NOCONF; q->t_flags |= NOCONF;
error(p->g_lineno, warning(p->g_lineno,
"%%while, no conflict"); "%%while without conflict");
retval = 1;
} }
} }
free((p_mem) temp); free((p_mem) temp);
@ -255,9 +254,8 @@ check(p) register p_gram p; {
} else { } else {
if (l->l_flag & (COND|PREFERING|AVOIDING)) { if (l->l_flag & (COND|PREFERING|AVOIDING)) {
l->l_flag |= NOCONF; l->l_flag |= NOCONF;
error(p->g_lineno, warning(p->g_lineno,
"Conflict resolver without conflict"); "Conflict resolver without conflict");
retval = 1;
} }
} }
free( (p_mem) temp); free( (p_mem) temp);

View file

@ -195,6 +195,13 @@ genrecovery() {
} }
fputs(c_arrend, f); fputs(c_arrend, f);
free((p_mem) index); free((p_mem) index);
if (onerror) {
fputs("short LLtok[] = {\n", f);
for (t = tokens; t < maxt; t++) {
fprintf(f, t->t_tokno<0400 ? "'%s',\n" : "%s,\n",t->t_string);
}
fputs(c_arrend, f);
}
fputs("#define LL_NEWMESS\n", f); fputs("#define LL_NEWMESS\n", f);
copyfile(rec_file); copyfile(rec_file);
if (ferror(f) != 0) { if (ferror(f) != 0) {
@ -526,6 +533,9 @@ alternation(p, safety, mustscan, mustpop, lb) register p_gram p; {
lb, hulp2); lb, hulp2);
} }
if (l->l_flag & COND) { if (l->l_flag & COND) {
if (l->l_flag & NOCONF) {
fputs("#ifdef ___NOCONFLICT___\n", f);
}
set = setalloc(); set = setalloc();
setunion(set, l->l_others); setunion(set, l->l_others);
setintersect(set, l->l_symbs); setintersect(set, l->l_symbs);
@ -536,6 +546,10 @@ alternation(p, safety, mustscan, mustpop, lb) register p_gram p; {
fputs("if (!",f); fputs("if (!",f);
getaction(0); getaction(0);
fprintf(f,") goto L_%d;\n", hulp); fprintf(f,") goto L_%d;\n", hulp);
if (l->l_flag & NOCONF) {
fputs("#endif\n", f);
free((p_mem) set);
}
} }
if (!haddefault && (l->l_flag & DEF)) { if (!haddefault && (l->l_flag & DEF)) {
haddefault = 1; haddefault = 1;
@ -551,7 +565,7 @@ alternation(p, safety, mustscan, mustpop, lb) register p_gram p; {
} }
rulecode(l->l_rule, nsafe, mustscan, mustpop); rulecode(l->l_rule, nsafe, mustscan, mustpop);
fputs(c_break,f); fputs(c_break,f);
if (l->l_flag & COND) { if ((l->l_flag & COND) && !(l->l_flag & NOCONF)) {
p++; p++;
fprintf(f,"L_%d : ;\n",hulp); fprintf(f,"L_%d : ;\n",hulp);
if (g_gettype(p+1) == EORULE) { if (g_gettype(p+1) == EORULE) {
@ -813,6 +827,9 @@ genswhead(q, rep, cnt, safety, ispushed) register p_term q; {
fprintf(f, "L_%d : ", hulp2); fprintf(f, "L_%d : ", hulp2);
fputs("switch(LLcsymb) {\n", f); fputs("switch(LLcsymb) {\n", f);
if (q->t_flags & RESOLVER) { if (q->t_flags & RESOLVER) {
if (q->t_flags & NOCONF) {
fputs("#ifdef ___NOCONFLICT___\n", f);
}
hulp1 = nlabel++; hulp1 = nlabel++;
p1 = setalloc(); p1 = setalloc();
setunion(p1,q->t_first); setunion(p1,q->t_first);
@ -830,6 +847,9 @@ genswhead(q, rep, cnt, safety, ispushed) register p_term q; {
fputs("if (", f); fputs("if (", f);
getaction(0); getaction(0);
fprintf(f, ") goto L_%d;\n", hulp1); fprintf(f, ") goto L_%d;\n", hulp1);
if (q->t_flags & NOCONF) {
fputs("#endif ___NOCONFLICT___\n", f);
}
} }
if (safeterm == 0 || (!onerror && safeterm <= SAFESCANDONE)) { if (safeterm == 0 || (!onerror && safeterm <= SAFESCANDONE)) {
fputs("default:\n", f); fputs("default:\n", f);

View file

@ -206,6 +206,18 @@ error(lineno,s,t,u) string s,t,u; {
fputs("\n",stderr); fputs("\n",stderr);
} }
/* VARARGS1 */
warning(lineno,s,t,u) string s,t,u; {
/*
* Just a warning
*/
if (!lineno) lineno = 1;
fprintf(stderr,"\"%s\", line %d : (Warning) ",f_input, lineno);
fprintf(stderr,s,t,u);
fputs("\n",stderr);
}
/* VARARGS1 */ /* VARARGS1 */
fatal(lineno,s,t,u) string s,t,u; { fatal(lineno,s,t,u) string s,t,u; {
/* /*