143 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| exec:	  iffable
 | |
| 	| SDO end_spec intonlyon label intonlyoff opt_comma dospecw
 | |
| 		{
 | |
| 		if($4->labdefined)
 | |
| 			execerr("no backward DO loops", CNULL);
 | |
| 		$4->blklevel = blklevel+1;
 | |
| 		exdo($4->labelno, NPNULL, $7);
 | |
| 		}
 | |
| 	| SDO end_spec opt_comma dospecw
 | |
| 		{
 | |
| 		exdo((int)(ctls - ctlstack - 2), NPNULL, $4);
 | |
| 		NOEXT("DO without label");
 | |
| 		}
 | |
| 	| SENDDO
 | |
| 		{ exenddo(NPNULL); }
 | |
| 	| logif iffable
 | |
| 		{ exendif();  thiswasbranch = NO; }
 | |
| 	| logif STHEN
 | |
| 	| SELSEIF end_spec SLPAR expr SRPAR STHEN
 | |
| 		{ exelif($4); lastwasbranch = NO; }
 | |
| 	| SELSE end_spec
 | |
| 		{ exelse(); lastwasbranch = NO; }
 | |
| 	| SENDIF end_spec
 | |
| 		{ exendif(); lastwasbranch = NO; }
 | |
| 	;
 | |
| 
 | |
| logif:	  SLOGIF end_spec SLPAR expr SRPAR
 | |
| 		{ exif($4); }
 | |
| 	;
 | |
| 
 | |
| dospec:	  name SEQUALS exprlist
 | |
| 		{ $$ = mkchain((char *)$1, $3); }
 | |
| 	;
 | |
| 
 | |
| dospecw:  dospec
 | |
| 	| SWHILE SLPAR expr SRPAR
 | |
| 		{ $$ = mkchain(CNULL, (chainp)$3); }
 | |
| 	;
 | |
| 
 | |
| iffable:  let lhs SEQUALS expr
 | |
| 		{ exequals((struct Primblock *)$2, $4); }
 | |
| 	| SASSIGN end_spec assignlabel STO name
 | |
| 		{ exassign($5, $3); }
 | |
| 	| SCONTINUE end_spec
 | |
| 	| goto
 | |
| 	| io
 | |
| 		{ inioctl = NO; }
 | |
| 	| SARITHIF end_spec SLPAR expr SRPAR label SCOMMA label SCOMMA label
 | |
| 		{ exarif($4, $6, $8, $10);  thiswasbranch = YES; }
 | |
| 	| call
 | |
| 		{ excall($1, LBNULL, 0, labarray); }
 | |
| 	| call SLPAR SRPAR
 | |
| 		{ excall($1, LBNULL, 0, labarray); }
 | |
| 	| call SLPAR callarglist SRPAR
 | |
| 		{ if(nstars < MAXLABLIST)
 | |
| 			excall($1, mklist(revchain($3)), nstars, labarray);
 | |
| 		  else
 | |
| 			err("too many alternate returns");
 | |
| 		}
 | |
| 	| SRETURN end_spec opt_expr
 | |
| 		{ exreturn($3);  thiswasbranch = YES; }
 | |
| 	| stop end_spec opt_expr
 | |
| 		{ exstop($1, $3);  thiswasbranch = $1; }
 | |
| 	;
 | |
| 
 | |
| assignlabel:   SICON
 | |
| 		{ $$ = mklabel( convci(toklen, token) ); }
 | |
| 	;
 | |
| 
 | |
| let:	  SLET
 | |
| 		{ if(parstate == OUTSIDE)
 | |
| 			{
 | |
| 			newproc();
 | |
| 			startproc(ESNULL, CLMAIN);
 | |
| 			}
 | |
| 		}
 | |
| 	;
 | |
| 
 | |
| goto:	  SGOTO end_spec label
 | |
| 		{ exgoto($3);  thiswasbranch = YES; }
 | |
| 	| SASGOTO end_spec name
 | |
| 		{ exasgoto($3);  thiswasbranch = YES; }
 | |
| 	| SASGOTO end_spec name opt_comma SLPAR labellist SRPAR
 | |
| 		{ exasgoto($3);  thiswasbranch = YES; }
 | |
| 	| SCOMPGOTO end_spec SLPAR labellist SRPAR opt_comma expr
 | |
| 		{ if(nstars < MAXLABLIST)
 | |
| 			putcmgo(putx(fixtype($7)), nstars, labarray);
 | |
| 		  else
 | |
| 			err("computed GOTO list too long");
 | |
| 		}
 | |
| 	;
 | |
| 
 | |
| opt_comma:
 | |
| 	| SCOMMA
 | |
| 	;
 | |
| 
 | |
| call:	  SCALL end_spec name
 | |
| 		{ nstars = 0; $$ = $3; }
 | |
| 	;
 | |
| 
 | |
| callarglist:  callarg
 | |
| 		{ $$ = $1 ? mkchain((char *)$1,CHNULL) : CHNULL; }
 | |
| 	| callarglist SCOMMA callarg
 | |
| 		{ $$ = $3 ? mkchain((char *)$3, $1) : $1; }
 | |
| 	;
 | |
| 
 | |
| callarg:  expr
 | |
| 	| SSTAR label
 | |
| 		{ if(nstars<MAXLABLIST) labarray[nstars++] = $2; $$ = 0; }
 | |
| 	;
 | |
| 
 | |
| stop:	  SPAUSE
 | |
| 		{ $$ = 0; }
 | |
| 	| SSTOP
 | |
| 		{ $$ = 1; }
 | |
| 	;
 | |
| 
 | |
| exprlist:  expr
 | |
| 		{ $$ = mkchain((char *)$1, CHNULL); }
 | |
| 	| exprlist SCOMMA expr
 | |
| 		{ $$ = hookup($1, mkchain((char *)$3,CHNULL) ); }
 | |
| 	;
 | |
| 
 | |
| end_spec:
 | |
| 		{ if(parstate == OUTSIDE)
 | |
| 			{
 | |
| 			newproc();
 | |
| 			startproc(ESNULL, CLMAIN);
 | |
| 			}
 | |
| 
 | |
| /* This next statement depends on the ordering of the state table encoding */
 | |
| 
 | |
| 		  if(parstate < INDATA) enddcl();
 | |
| 		}
 | |
| 	;
 | |
| 
 | |
| intonlyon:
 | |
| 		{ intonly = YES; }
 | |
| 	;
 | |
| 
 | |
| intonlyoff:
 | |
| 		{ intonly = NO; }
 | |
| 	;
 |