From 45238eea0fd016948fae9aab9faadd8fa169ce40 Mon Sep 17 00:00:00 2001 From: ceriel Date: Fri, 16 Jan 1987 13:51:42 +0000 Subject: [PATCH] Some bug fixes and minor extensions --- util/ncgg/Makefile | 18 ++++---- util/ncgg/cgg.y | 104 ++++++++++++++++++++++++++++++++++--------- util/ncgg/expr.c | 9 ++-- util/ncgg/instruct.c | 2 + util/ncgg/iocc.c | 22 ++++++++- util/ncgg/output.c | 13 +++--- util/ncgg/set.c | 9 ++++ util/ncgg/subr.c | 2 +- util/ncgg/var.c | 2 +- 9 files changed, 140 insertions(+), 41 deletions(-) diff --git a/util/ncgg/Makefile b/util/ncgg/Makefile index 9f40e92a7..5732f4a4c 100644 --- a/util/ncgg/Makefile +++ b/util/ncgg/Makefile @@ -3,23 +3,25 @@ CFILES=cgg.c subr.c main.c coerc.c enterkeyw.c error.c emlookup.c expr.c instruct.c iocc.c lookup.c output.c set.c strlookup.c var.c hall.c OFILES=cgg.o subr.o main.o coerc.o enterkeyw.o error.o emlookup.o expr.o instruct.o iocc.o lookup.o set.o strlookup.o var.o hall.o SOURCES=*.h cgg.y scan.l cvtkeywords keywords coerc.c emlookup.c error.c expr.c hall.c instruct.c iocc.c lookup.c main.c output.c set.c strlookup.c subr.c var.c -EMH=../../h -CFLAGS=-I$(EMH) +EMHOME=../.. +EMH=$(EMHOME)/h +CFLAGS=-O -I$(EMH) YFLAGS=-v -d LDFLAGS=-i cgg: cgg.o $(OFILES) output.o - cc $(LDFLAGS) $(OFILES) output.o ../../lib/em_data.a -ll -o cgg + cc $(LDFLAGS) $(OFILES) output.o $(EMHOME)/lib/em_data.a -ll -o cgg install: cgg - cp cgg ../../lib/ncgg + rm -f $(EMHOME)/lib/ncgg + cp cgg $(EMHOME)/lib/ncgg cmp: cgg - cmp cgg ../../lib/ncgg + cmp cgg $(EMHOME)/lib/ncgg debugcgg: cgg.o $(OFILES) debugoutput.o - cc $(LDFLAGS) $(OFILES) debugoutput.o ../../lib/em_data.a -ll -o cgg + cc $(LDFLAGS) $(OFILES) debugoutput.o $(EMHOME)/lib/em_data.a -ll -o cgg cgg.o: scan.c @@ -43,8 +45,8 @@ clean: pr: pr $(SOURCES) -lpr: - make pr|lpr +opr: + -make pr|opr depend: makedepend diff --git a/util/ncgg/cgg.y b/util/ncgg/cgg.y index 5bce1787c..1edca6219 100644 --- a/util/ncgg/cgg.y +++ b/util/ncgg/cgg.y @@ -18,6 +18,7 @@ extern int lineno; int instline,saveline; int startline; int npatterns; +int att_type; int patindex[MAXPATTERNS]; int emhere=0; /* lexical analyzer flag */ @@ -27,6 +28,9 @@ int saferulefound=0; int maxempatlen=0; int maxrule=0; struct varinfo *defcost; +int Xstackflag=0; /* set in coercions, moves, and tests. %1 means something + different then. + */ struct varinfo *gen_inst(),*gen_move(),*gen_test(),*gen_preturn(),*gen_tlab(); struct varinfo *make_erase(); @@ -35,7 +39,7 @@ expr_t perc_ident_expr(),sum_expr(),regvar_expr(); set_t ident_to_set(),setproduct(),setsum(),setdiff(); -iocc_t subr_iocc(),tokm_iocc(),ident_iocc(),all_iocc(),descr_iocc(); +iocc_t subr_iocc(),tokm_iocc(),ident_iocc(),all_iocc(),percident_iocc(), descr_iocc(); extern int narexpr; extern expr_t arexp[]; @@ -81,7 +85,7 @@ iocc_t iops[20]; %token TIMEFACTOR SIZEFACTOR %token COST %type prop_list property ident_list ident_list_el -%type att_list att_list_el structdecl optcost optformat +%type att_list att_list_el att_list_el_list structdecl optcost optformat %type kills allocates yields leaving %type generates kill_list kill_list_el uselist uselist_el genlist yieldlist %type leavelist leavelist_el gen_instruction @@ -300,10 +304,24 @@ att_list { $1->vi_next = $2; $$ = $1; } ; att_list_el - : att_list_el_type IDENT ';' - { NEW ($$,struct varinfo); - $$->vi_next = 0; - $$->vi_int[0] = $1; + : att_list_el_type IDENT + { NEW ($$,struct varinfo); + $$->vi_int[0] = $1; + $$->vi_str[0] = $2; + att_type = $1; + } + att_list_el_list ';' + { $3->vi_next = $4; + $$ = $3; + } + ; +att_list_el_list + : /* empty */ + { $$ = 0; } + | ',' IDENT att_list_el_list + { NEW($$, struct varinfo); + $$->vi_next = $3; + $$->vi_int[0] = att_type; $$->vi_str[0] = $2; } ; @@ -446,7 +464,8 @@ erase_list_el /* Now the moves */ moves - : MOVES movedeflist + : MOVES + movedeflist | /* empty */ ; movedeflist @@ -457,19 +476,30 @@ movedeflist_el : FROM {startline = lineno; } tokenset_no - { cursetno = $3; } - optexpr TO tokenset_no - { cursetno = $7; + { Xstackflag = 1; + cursetno = $3; + } + optexpr + { Xstackflag = 0; + cursetno = -1; + } + TO tokenset_no + { cursetno = $8; tokpatlen=2; tokpatset[0] = $3; - tokpatset[1] = $7; + tokpatset[1] = $8; tokpatro[0] = 1; + Xstackflag = 1; } - optexpr GEN genlist + optexpr + { Xstackflag = 0; + cursetno = -1; + } + GEN genlist { tokpatlen=0; tokpatro[0]=0; - n_move($3,$5,$7,$9,$11); - freevi($11); + n_move($3,$5,$8,$10,$13); + freevi($13); } | error ; @@ -477,7 +507,10 @@ movedeflist_el /* Now the test part */ tests - : TESTS testdeflist + : TESTS + { Xstackflag = 1; } + testdeflist + { Xstackflag = 0; } | /* empty */ ; testdeflist @@ -498,6 +531,7 @@ testdeflist_el tokpatro[0] = 0; n_test($4,$6,$8); freevi($8); + cursetno = -1; } | error ; @@ -505,7 +539,10 @@ testdeflist_el /* Now the stacks */ stacks - : STACKINGRULES stackdeflist + : STACKINGRULES + { Xstackflag = 1; } + stackdeflist + { Xstackflag = 0; } ; stackdeflist : stackdeflist_el @@ -524,6 +561,7 @@ stackdeflist_el { tokpatro[0] = 0; n_stack($3,$5,$8,$10); freevi($10); + cursetno = -1; } ; optuses @@ -536,7 +574,10 @@ optuses /* Now the one-to-one coercion rules */ coercs - : COERCIONS coercdeflist + : COERCIONS + { Xstackflag = 1; } + coercdeflist + { Xstackflag = 0; } ; coercdeflist : coercdeflist_el @@ -566,6 +607,7 @@ coercdeflist_el n_coerc($3,$5,$6,$7,$8); freevi($6); freevi($7); + cursetno = -1; } ; @@ -722,6 +764,7 @@ kill_list_el $$->vi_next = 0; $$->vi_int[0]=$1; $$->vi_int[1]=$3; + cursetno = -1; } ; allocates @@ -864,6 +907,13 @@ tokeninstance { $$ = ident_iocc($1); free($1);} | allreg subreg { $$ = all_iocc($1,$2); } + | PERC_IDENT + { if (cursetno < 0) { + error("%% not allowed here"); + } + $$ = percident_iocc($1); + free($1); + } | '{' IDENT attlist '}' { $$ = descr_iocc($2); free($2); } ; @@ -883,12 +933,12 @@ emarg ; tokarg : PERCENT - { if ($1<1 || $1>tokpatlen) { + { $$ = $1; + if ($1<1 || $1>tokpatlen) { error("Only %d tokens in stackpattern",tokpatlen); $$ =1; - } else { - $$ = $1; } + if (Xstackflag) $$ = 0; } ; subreg @@ -928,7 +978,12 @@ expr | allreg subreg { $$ = all_expr($1,$2); } | PERC_IDENT - { $$ = perc_ident_expr($1); free($1); } + { if (cursetno < 0) { + error("%% not allowed here"); + } + $$ = perc_ident_expr($1); + free($1); + } | DEFINED '(' expr ')' { $$ = make_expr(TYPBOOL,EX_DEFINED,i_expr($3),0); } | SAMESIGN '(' expr ',' expr ')' @@ -943,6 +998,13 @@ expr { $$ = make_expr(TYPINT,EX_LOWW,$3-1,0); } | HIGHW '(' emarg ')' { $$ = make_expr(TYPINT,EX_HIGHW,$3-1,0); } +/* Excluded, because it causes a shift-reduce conflict + (problems with a tokenset_no followed by an optexpr) + | '-' expr %prec UMINUS + { $$ = make_expr(TYPINT,EX_CON, 0, 0); + $$ = make_expr(TYPINT,EX_MINUS,i_expr($$),i_expr($2)); + } +*/ | '(' expr ')' { $$ = $2; } | expr CMPEQ expr diff --git a/util/ncgg/expr.c b/util/ncgg/expr.c index 77dd1a09b..df3d48bd3 100644 --- a/util/ncgg/expr.c +++ b/util/ncgg/expr.c @@ -68,7 +68,8 @@ expr_t subreg_expr(tokarg,subreg) { expr_t result; result.ex_typ = TYPREG; - subregset(l_sets[tokpatset[tokarg-1]].set_val,subreg,result.ex_regset); + subregset(l_sets[tokpatset[tokarg > 0 ? tokarg-1 : tokarg]].set_val, + subreg,result.ex_regset); result.ex_index = ex_lookup(EX_SUBREG,tokarg,subreg); return(result); } @@ -106,6 +107,7 @@ int *typp; int typesdiffer=0; int res_j= -1; + if (setno < 0) return 0; sp = l_sets[setno].set_val; for (i=1;i 0 ? tokarg : 1; - sprintf(app,"%%%d.%s",tokarg,name); - return(memb_expr(tokpatset[tokarg-1],name,app,tokarg)); + sprintf(app,"%%%d.%s",tokarg1,name); + return(memb_expr(tokpatset[tokarg1-1],name,app,tokarg)); } expr_t perc_ident_expr(name) char *name; { diff --git a/util/ncgg/instruct.c b/util/ncgg/instruct.c index d09974614..62b2c4662 100644 --- a/util/ncgg/instruct.c +++ b/util/ncgg/instruct.c @@ -55,6 +55,7 @@ onlyreg(argno) { register bitno; register short *sp; + if (! argno) argno++; sp = l_sets[tokpatset[argno-1]].set_val; for(bitno=nregs;bitno1 Coercions",ncoercs,MAXCOERCS); used("Splitting coercions",nsplit,MAXSPLCOERC); used("Register variables",maxregvars,MAXREGVAR); - used("Pat bytes",npatbytes,MAXPATBYTES); + used("Pat bytes",npatbytes+1,MAXPATBYTES); if (tabledebug) used("Source lines",maxline,MAXSOURCELINES); fprintf(stderr,"%ldK heap used\n",((long) (sbrk(0)-end+1023))/1024); diff --git a/util/ncgg/set.c b/util/ncgg/set.c index 54e3f1f1d..6234ac0eb 100644 --- a/util/ncgg/set.c +++ b/util/ncgg/set.c @@ -114,5 +114,14 @@ set_t setdiff(s1,s2) set_t s1,s2; { result.set_size = 0; for(i=0;isy_value.syv_procoff = npatbytes; + sy_p->sy_value.syv_procoff = npatbytes + 1; } struct varinfo * diff --git a/util/ncgg/var.c b/util/ncgg/var.c index 97ba265d1..186cdc2e3 100644 --- a/util/ncgg/var.c +++ b/util/ncgg/var.c @@ -23,7 +23,7 @@ int empatlen,emmnem[EMPATMAX]; int empatexpr; int tokpatlen,tokpatset[TOKPATMAX],tokpatro[TOKPATMAX]; int nallreg,allreg[MAXALLREG]; -int cursetno; +int cursetno = -1; int allsetno; int inproc=0; /* scanning "procedure" */ int callproc=0; -- 2.34.1