relaxed the ;-terminator requirement for parameters
This commit is contained in:
parent
3c221691b3
commit
b1fdacb99c
6 changed files with 25 additions and 42 deletions
|
@ -6,7 +6,6 @@ Lpars.c.dist
|
|||
Lpars.h.dist
|
||||
Makefile
|
||||
alloc.c
|
||||
assert.h
|
||||
check.c
|
||||
compute.c
|
||||
extern.h
|
||||
|
|
|
@ -199,7 +199,7 @@ rule { register p_nont p;
|
|||
acount = 0;
|
||||
p->n_lineno = linecount;
|
||||
}
|
||||
[ params(2) { p->n_flags |= PARAMS;
|
||||
[ params { p->n_flags |= PARAMS;
|
||||
if (nparams > 15) {
|
||||
error(linecount,"Too many parameters");
|
||||
}
|
||||
|
@ -462,7 +462,7 @@ elem (register p_gram pres;)
|
|||
C_IDENT { pe = search(UNKNOWN,lextoken.t_string,BOTH);
|
||||
*pres = *pe;
|
||||
}
|
||||
[ params(0) { if (nparams > 14) {
|
||||
[ params { if (nparams > 14) {
|
||||
error(linecount,"Too many parameters");
|
||||
} else g_setnpar(pres,nparams+1);
|
||||
if (g_gettype(pres) == TERMINAL) {
|
||||
|
@ -480,8 +480,8 @@ elem (register p_gram pres;)
|
|||
action(1)
|
||||
;
|
||||
|
||||
params(int n;)
|
||||
: '(' { copyact('(',')',n,0); }
|
||||
params
|
||||
: '(' { copyact('(',')',0,0); }
|
||||
')'
|
||||
;
|
||||
|
||||
|
@ -541,35 +541,32 @@ copyact(ch1,ch2,flag,level) char ch1,ch2; {
|
|||
/*
|
||||
* Copy an action to file f. Opening bracket is ch1, closing bracket
|
||||
* is ch2.
|
||||
* If flag = 1, copy opening and closing parameters too.
|
||||
* If flag = 2, the copy is a parameter declaration copy.
|
||||
* Give an error message if not ending on a ';'
|
||||
* If flag != 0, copy opening and closing parameters too.
|
||||
*/
|
||||
static int id_seen = 0;
|
||||
register FILE *f;
|
||||
register ch; /* Current char */
|
||||
register match; /* used to read strings */
|
||||
int saved; /* save linecount */
|
||||
int semicolon = 0;
|
||||
|
||||
f = fact;
|
||||
if (!level) {
|
||||
saved = linecount;
|
||||
id_seen = 0;
|
||||
nparams = 0; /* count comma's */
|
||||
putc('\0',f);
|
||||
fprintf(f,"# line %d \"%s\"\n", linecount,f_input);
|
||||
}
|
||||
if (level || flag == 1) putc(ch1,f);
|
||||
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 || flag == 1) putc(ch,f);
|
||||
if ((!level) && flag == 2 && !semicolon) {
|
||||
error(linecount,"Missing ';'");
|
||||
}
|
||||
if (level || flag) putc(ch,f);
|
||||
if (id_seen) nparams++;
|
||||
return;
|
||||
}
|
||||
if (c_class[ch] != ISSPA) semicolon = 0;
|
||||
switch(ch) {
|
||||
case ')':
|
||||
case '}':
|
||||
|
@ -596,14 +593,13 @@ copyact(ch1,ch2,flag,level) char ch1,ch2; {
|
|||
ch = '/';
|
||||
break;
|
||||
case ';':
|
||||
semicolon = 1;
|
||||
/* Fall through */
|
||||
case ',':
|
||||
if (!level) { /*
|
||||
* Only ','s and ';'s on the
|
||||
* outer level are counted
|
||||
*/
|
||||
nparams++;
|
||||
id_seen = 0;
|
||||
}
|
||||
break;
|
||||
case '\'':
|
||||
|
|
|
@ -7,7 +7,7 @@ CFLAGS=-O -DNDEBUG $(INCLUDES) $(PROF)
|
|||
LDFLAGS=
|
||||
OBJECTS = main.o gencode.o compute.o LLgen.o tokens.o check.o reach.o global.o name.o sets.o Lpars.o alloc.o machdep.o cclass.o
|
||||
CFILES = main.c gencode.c compute.c LLgen.c tokens.c check.c reach.c global.c name.c sets.c Lpars.c alloc.c machdep.c cclass.c
|
||||
FILES =types.h tunable.h extern.h io.h sets.h assert.h tokens.g LLgen.g main.c name.c compute.c sets.c gencode.c global.c check.c reach.c alloc.c machdep.c Makefile cclass.c
|
||||
FILES =types.h tunable.h extern.h io.h sets.h tokens.g LLgen.g main.c name.c compute.c sets.c gencode.c global.c check.c reach.c alloc.c machdep.c Makefile cclass.c
|
||||
GFILES = tokens.g LLgen.g
|
||||
LINT = lint -b -DNDEBUG -DNORCSID
|
||||
|
||||
|
@ -52,7 +52,6 @@ distr:
|
|||
# The next lines are generated automatically
|
||||
# AUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTO
|
||||
LLgen.o: Lpars.h
|
||||
LLgen.o: assert.h
|
||||
LLgen.o: cclass.h
|
||||
LLgen.o: extern.h
|
||||
LLgen.o: io.h
|
||||
|
@ -61,17 +60,14 @@ Lpars.o: Lpars.h
|
|||
alloc.o: extern.h
|
||||
alloc.o: types.h
|
||||
cclass.o: cclass.h
|
||||
check.o: assert.h
|
||||
check.o: extern.h
|
||||
check.o: io.h
|
||||
check.o: sets.h
|
||||
check.o: types.h
|
||||
compute.o: assert.h
|
||||
compute.o: extern.h
|
||||
compute.o: io.h
|
||||
compute.o: sets.h
|
||||
compute.o: types.h
|
||||
gencode.o: assert.h
|
||||
gencode.o: cclass.h
|
||||
gencode.o: extern.h
|
||||
gencode.o: io.h
|
||||
|
@ -82,25 +78,20 @@ global.o: io.h
|
|||
global.o: types.h
|
||||
machdep.o: $(EMHOME)/h/em_path.h
|
||||
machdep.o: types.h
|
||||
main.o: assert.h
|
||||
main.o: extern.h
|
||||
main.o: io.h
|
||||
main.o: sets.h
|
||||
main.o: types.h
|
||||
name.o: assert.h
|
||||
name.o: extern.h
|
||||
name.o: io.h
|
||||
name.o: types.h
|
||||
reach.o: assert.h
|
||||
reach.o: extern.h
|
||||
reach.o: io.h
|
||||
reach.o: types.h
|
||||
sets.o: assert.h
|
||||
sets.o: extern.h
|
||||
sets.o: sets.h
|
||||
sets.o: types.h
|
||||
tokens.o: Lpars.h
|
||||
tokens.o: assert.h
|
||||
tokens.o: cclass.h
|
||||
tokens.o: extern.h
|
||||
tokens.o: io.h
|
||||
|
|
|
@ -207,7 +207,7 @@ check(p) register p_gram p; {
|
|||
if (empty(q->t_rule)) {
|
||||
q->t_flags |= EMPTYTERM;
|
||||
retval = 1;
|
||||
error(p->g_lineno, "Term produces empty");
|
||||
error(p->g_lineno, "Term with variable repetition count produces empty");
|
||||
}
|
||||
temp = setalloc();
|
||||
setunion(temp,q->t_first);
|
||||
|
|
|
@ -348,21 +348,28 @@ getparams() {
|
|||
register int l;
|
||||
long ftell();
|
||||
char first;
|
||||
char add_semi = ' ';
|
||||
|
||||
first = ' ';
|
||||
/* save offset in file to be able to copy the declaration later */
|
||||
off = ftell(fact);
|
||||
/* First pass through declaration, find the parameter names */
|
||||
ltext[0] = '\0';
|
||||
while ((l = gettok()) != ENDDECL) {
|
||||
if (l == ';' || l == ',') {
|
||||
if ((l == ';' || l == ',') && ltext[0] != '\0') {
|
||||
/*
|
||||
* The last identifier found before a ';' or a ','
|
||||
* must be a parameter
|
||||
*/
|
||||
fprintf(fpars,"%c%s", first, ltext);
|
||||
first = ',';
|
||||
ltext[0] = '\0';
|
||||
}
|
||||
}
|
||||
if (ltext[0] != '\0') {
|
||||
fprintf(fpars, "%c%s", first, ltext);
|
||||
add_semi = ';';
|
||||
}
|
||||
fputs(") ",fpars);
|
||||
/*
|
||||
* Now copy the declarations
|
||||
|
@ -372,7 +379,7 @@ getparams() {
|
|||
*/
|
||||
fseek(fact,off,0);
|
||||
getaction(0);
|
||||
fputs(" {\n",fpars);
|
||||
fprintf(fpars, "%c {\n",add_semi);
|
||||
}
|
||||
|
||||
STATIC
|
||||
|
|
|
@ -236,7 +236,7 @@ error(lineno,s,t,u) string s,t,u; {
|
|||
|
||||
++nerrors;
|
||||
if (!lineno) lineno = 1;
|
||||
fprintf(stderr,"\"%s\", line %d : ",f_input, lineno);
|
||||
fprintf(stderr,"\"%s\", line %d: ",f_input, lineno);
|
||||
fprintf(stderr,s,t,u);
|
||||
fputs("\n",stderr);
|
||||
}
|
||||
|
@ -249,7 +249,7 @@ warning(lineno,s,t,u) string s,t,u; {
|
|||
|
||||
if (wflag) return;
|
||||
if (!lineno) lineno = 1;
|
||||
fprintf(stderr,"\"%s\", line %d : (Warning) ",f_input, lineno);
|
||||
fprintf(stderr,"\"%s\", line %d: (Warning) ",f_input, lineno);
|
||||
fprintf(stderr,s,t,u);
|
||||
fputs("\n",stderr);
|
||||
}
|
||||
|
@ -339,13 +339,3 @@ install(target, source) string target, source; {
|
|||
RENAME(f_pars,target);
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
badassertion(asstr,file,line) char *asstr, *file; {
|
||||
|
||||
fprintf(stderr,"Assertion \"%s\" failed %s(%d)\n",asstr,file,line);
|
||||
if (fact != NULL) fclose(fact);
|
||||
if (fpars != NULL) fclose(fpars);
|
||||
abort();
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue