Fixed problem with parameter counts

This commit is contained in:
ceriel 1991-09-13 09:15:36 +00:00
parent 86e38c87fb
commit b10eadb10e
2 changed files with 18 additions and 13 deletions

View file

@ -462,9 +462,9 @@ elem (register p_gram pres;)
C_IDENT { pe = search(UNKNOWN,lextoken.t_string,BOTH);
*pres = *pe;
}
[ params { if (nparams > 14) {
[ params { if (nparams > 15) {
error(linecount,"Too many parameters");
} else g_setnpar(pres,nparams+1);
} else g_setnpar(pres,nparams);
if (g_gettype(pres) == TERMINAL) {
error(linecount,
"Terminal with parameters");
@ -543,7 +543,7 @@ copyact(ch1,ch2,flag,level) char ch1,ch2; {
* is ch2.
* If flag != 0, copy opening and closing parameters too.
*/
static int id_seen = 0;
static int text_seen = 0;
register FILE *f;
register ch; /* Current char */
register match; /* used to read strings */
@ -552,7 +552,7 @@ copyact(ch1,ch2,flag,level) char ch1,ch2; {
f = fact;
if (!level) {
saved = linecount;
id_seen = 0;
text_seen = 0;
nparams = 0; /* count comma's */
putc('\0',f);
fprintf(f,"# line %d \"%s\"\n", linecount,f_input);
@ -560,11 +560,12 @@ copyact(ch1,ch2,flag,level) char ch1,ch2; {
if (level || flag) putc(ch1,f);
for (;;) {
ch = input();
if (c_class[ch] == ISLET) id_seen = 1;
if (ch == ch2) {
if (!level) unput(ch);
if (!level) {
unput(ch);
if (text_seen) nparams++;
}
if (level || flag) putc(ch,f);
if (id_seen) nparams++;
return;
}
switch(ch) {
@ -574,12 +575,15 @@ copyact(ch1,ch2,flag,level) char ch1,ch2; {
error(linecount,"Parentheses mismatch");
break;
case '(':
text_seen = 1;
copyact('(',')',flag,level+1);
continue;
case '{':
text_seen = 1;
copyact('{','}',flag,level+1);
continue;
case '[':
text_seen = 1;
copyact('[',']',flag,level+1);
continue;
case '/':
@ -591,15 +595,13 @@ copyact(ch1,ch2,flag,level) char ch1,ch2; {
continue;
}
ch = '/';
text_seen = 1;
break;
case ';':
case ',':
if (!level) { /*
* Only ','s and ';'s on the
* outer level are counted
*/
if (! level && text_seen) {
text_seen = 0;
nparams++;
id_seen = 0;
}
break;
case '\'':
@ -608,6 +610,7 @@ copyact(ch1,ch2,flag,level) char ch1,ch2; {
* watch out for brackets in strings, they do not
* count !
*/
text_seen = 1;
match = ch;
putc(ch,f);
while((ch = input())) {
@ -627,6 +630,8 @@ copyact(ch1,ch2,flag,level) char ch1,ch2; {
case EOF :
if (!level) error(saved,"Action does not terminate");
return;
default:
if (c_class[ch] != ISSPA) text_seen = 1;
}
putc(ch,f);
}

View file

@ -189,7 +189,7 @@ check(p) register p_gram p; {
n = &nonterms[g_getcont(p)];
if (g_getnpar(p) != getntparams(n)) {
error(p->g_lineno,
"Call of %s : parameter count mismatch",
"Call of %s: parameter count mismatch",
n->n_name);
}
break; }