1exec: iffable 2 | SDO end_spec label opt_comma dospec 3 { 4 if($3->labdefined) 5 execerr("no backward DO loops"); 6 $3->blklevel = blklevel+1; 7 exdo($3->labelno, $5); 8 } 9 | logif iffable 10 { exendif(); thiswasbranch = NO; } 11 | logif STHEN 12 | SELSEIF end_spec SLPAR expr SRPAR STHEN 13 { exelif($4); lastwasbranch = NO; } 14 | SELSE end_spec 15 { exelse(); lastwasbranch = NO; } 16 | SENDIF end_spec 17 { exendif(); lastwasbranch = NO; } 18 ; 19 20logif: SLOGIF end_spec SLPAR expr SRPAR 21 { exif($4); } 22 ; 23 24dospec: name SEQUALS exprlist 25 { $$ = mkchain($1, $3); } 26 ; 27 28iffable: let lhs SEQUALS expr 29 { exequals($2, $4); } 30 | SASSIGN end_spec labelval STO name 31 { exassign($5, $3); } 32 | SCONTINUE end_spec 33 | goto 34 | io 35 { inioctl = NO; } 36 | SARITHIF end_spec SLPAR expr SRPAR label SCOMMA label SCOMMA label 37 { exarif($4, $6, $8, $10); thiswasbranch = YES; } 38 | call 39 { excall($1, 0, 0, labarray); } 40 | call SLPAR SRPAR 41 { excall($1, 0, 0, labarray); } 42 | call SLPAR callarglist SRPAR 43 { excall($1, mklist($3), nstars, labarray); } 44 | SRETURN end_spec opt_expr 45 { exreturn($3); thiswasbranch = YES; } 46 | stop end_spec opt_expr 47 { exstop($1, $3); thiswasbranch = $1; } 48 ; 49 50let: SLET 51 { if(parstate == OUTSIDE) 52 { 53 newproc(); 54 startproc(0, CLMAIN); 55 } 56 } 57 ; 58 59goto: SGOTO end_spec label 60 { exgoto($3); thiswasbranch = YES; } 61 | SASGOTO end_spec name 62 { exasgoto($3); thiswasbranch = YES; } 63 | SASGOTO end_spec name opt_comma SLPAR labellist SRPAR 64 { exasgoto($3); thiswasbranch = YES; } 65 | SCOMPGOTO end_spec SLPAR labellist SRPAR opt_comma expr 66 { putcmgo(fixtype($7), nstars, labarray); } 67 ; 68 69opt_comma: 70 | SCOMMA 71 ; 72 73call: SCALL end_spec name 74 { nstars = 0; $$ = $3; } 75 ; 76 77callarglist: callarg 78 { $$ = ($1 ? mkchain($1,0) : 0); } 79 | callarglist SCOMMA callarg 80 { if($3) { 81 if($1) $$ = hookup($1, mkchain($3,0)); 82 else $$ = mkchain($3,0); 83 } 84 } 85 ; 86 87callarg: expr 88 | SSTAR label 89 { labarray[nstars++] = $2; $$ = 0; } 90 ; 91 92stop: SPAUSE 93 { $$ = 0; } 94 | SSTOP 95 { $$ = 1; } 96 ; 97 98exprlist: expr 99 { $$ = mkchain($1, 0); } 100 | exprlist SCOMMA expr 101 { $$ = hookup($1, mkchain($3,0) ); } 102 ; 103 104end_spec: 105 { if(parstate == OUTSIDE) 106 { 107 newproc(); 108 startproc(0, CLMAIN); 109 } 110 if(parstate < INDATA) enddcl(); 111 } 112 ; 113