|
|
1.1 ! root 1: exec: beginexec exec1 ! 2: { TEST fprintf(diagfile, "exec done\n"); } ! 3: ; ! 4: ! 5: beginexec: ! 6: { $$ = bgnexec(); if(ncases > 0) ncases = 0; } ! 7: ; ! 8: ! 9: exec1: lhs ASGNOP expr ! 10: { ! 11: if(((struct headbits *)$1)->tag==TCALL) ! 12: { ! 13: dclerr("no statement functions in EFL", ! 14: ((struct stentry *)((struct defblock /*|| struct labelblock|| struct varblock|| struct keyblock|| struct typeblock */ *)$1)->sthead)->namep); ! 15: frexpr($1); ! 16: frexpr($3); ! 17: } ! 18: else exasgn($1,$2,$3); ! 19: } ! 20: | DOUBLEADDOP lhs ! 21: { exasgn($2, $1, mkint(1) ); } ! 22: | lhs1 ! 23: { excall($1); } ! 24: | CALL lhs1 ! 25: { excall($2); } ! 26: | debug exec enddebug ! 27: | LBRACK beginblock stats endblock RBRACK ! 28: { TEST fprintf(diagfile, "exec: { stats }\n"); ! 29: addexec(); } ! 30: | labels exec1 ! 31: { ((struct execblock *)thisexec)->labeled = 1; } ! 32: | control ! 33: { ((struct execblock *)thisexec)->uniffable = 1; popctl(); } ! 34: | branch ! 35: { ((struct execblock *)thisexec)->brnchend = 1; } ! 36: | iostat ! 37: { exio($1, 0); } ! 38: | null ! 39: { exnull(); } ! 40: | ESCAPE ! 41: { ! 42: exnull(); ! 43: putsii(ICCOMMENT, $1); ! 44: cfree($1); ! 45: exnull(); ! 46: } ! 47: ; ! 48: ! 49: null: ! 50: { TEST fprintf(diagfile, "exec:empty\n"); } ! 51: | CONTINUE ! 52: { TEST fprintf(diagfile, "exec: continue\n"); } ! 53: ; ! 54: ! 55: beginblock: ! 56: { ! 57: ((struct execblock *)thisexec)->copylab = 1; ! 58: ++blklevel; ! 59: dclsect = 1; ! 60: ndecl[blklevel] = 0; ! 61: nhid [blklevel] = 0; ! 62: } ! 63: ; ! 64: ! 65: endblock: ! 66: { ! 67: if(ndecl[blklevel]) unhide(); ! 68: --blklevel; ! 69: dclsect = 0; ! 70: } ! 71: ; ! 72: ! 73: labels: NAME COLON contnu ! 74: { mklabel($1,YES); } ! 75: | CONST contnu ! 76: { mklabel(mkilab($1),YES); } ! 77: | CONST contnu COLON contnu ! 78: { mklabel(mkilab($1),YES); } ! 79: | DEFAULT COLON contnu ! 80: { brkcase(); mkcase(PNULL,1); } ! 81: | CASE { brkcase(); } caselist COLON contnu ! 82: ; ! 83: ! 84: caselist: expr ! 85: { mkcase($1,1); } ! 86: | caselist COMMA expr ! 87: { mkcase($3,1); } ! 88: ; ! 89: ! 90: control: ifclause contnu exec EOS ELSE elsecode contnu exec ! 91: { TEST fprintf(diagfile, "if-then-else\n"); ! 92: i = ((struct labelblock /*|| struct caseblock|| struct execblock */ *)$3)->brnchend & ((struct labelblock /*|| struct caseblock|| struct execblock */ *)$8)->brnchend; ! 93: addexec(); ! 94: $$ = addexec(); ! 95: ((struct execblock *)thisexec)->brnchend = i; ! 96: TEST fprintf(diagfile, "exec: if(expr) exec else exec\n"); } ! 97: | ifclause contnu exec EOS ! 98: { TEST fprintf(diagfile, "if-then\n"); ! 99: pushlex = 1; ! 100: yyclearin; ! 101: $$ = ifthen(); ! 102: TEST fprintf(diagfile, "exec: if(expr) exec\n"); } ! 103: | repeat contnu exec until ! 104: { TEST fprintf(diagfile, "repeat done\n"); } ! 105: | leftcont contnu exec ! 106: { TEST fprintf(diagfile, "exec: control exec\n"); $$ = addexec(); } ! 107: ; ! 108: ! 109: ifclause: IF LPAR expr RPAR ! 110: { pushctl(STIF,$3); } ! 111: ; ! 112: ! 113: elsecode: ! 114: { ! 115: if(((struct ctlblock *)thisctl)->breaklab == 0) ! 116: ((struct ctlblock *)thisctl)->breaklab = nextlab(); ! 117: /* if(thisexec->prevexec->brnchend == 0) */ ! 118: exgoto(((struct ctlblock *)thisctl)->breaklab); ! 119: exlab( indifs[((struct ctlblock *)thisctl)->indifn] = nextlab() ); ! 120: } ! 121: ; ! 122: ! 123: repeat: REPEAT ! 124: { pushctl(STREPEAT, PNULL); } ! 125: ; ! 126: ! 127: until: EOS ! 128: { pushlex = 1; ! 129: yyclearin; ! 130: $$ = addexec(); ! 131: exgoto(((struct ctlblock *)thisctl)->xlab); ! 132: TEST fprintf(diagfile, " no until\n"); } ! 133: | EOS UNTIL LPAR expr RPAR ! 134: { $$ = addexec(); ! 135: exnull(); ! 136: exlab( indifs[((struct ctlblock *)thisctl)->indifn] = nextlab() ); ! 137: exifgo(mknode(TNOTOP,OPNOT,$4,PNULL), ((struct ctlblock *)thisctl)->xlab); ! 138: TEST fprintf(diagfile, "until\n"); ! 139: } ! 140: ; ! 141: ! 142: branch: RETURN ! 143: { exretn(PNULL); } ! 144: | RETURN expr ! 145: { exretn($2); } ! 146: | break ! 147: | GOTO label ! 148: { exgoto($2); } ! 149: | GO NAME label ! 150: { if( !equals(((struct stentry *)$2)->namep, "to") ) ! 151: execerr("go %s ??\n", ((struct stentry *)$2)->namep); ! 152: else exgoto($3); ! 153: } ! 154: | GOTO parlablist compgotoindex ! 155: { excompgoto($2, $3); } ! 156: | GO NAME parlablist compgotoindex ! 157: { if(!equals(((struct stentry *)$2)->namep, "to") ) ! 158: execerr("go %s ??\n", ((struct stentry *)$2)->namep); ! 159: else excompgoto($3, $4); ! 160: } ! 161: ; ! 162: ! 163: parlablist: LPAR lablist RPAR ! 164: { $$ = $2; } ! 165: ; ! 166: ! 167: ! 168: lablist: label ! 169: { $$ = (int *)mkchain($1,CHNULL); } ! 170: | lablist COMMA label ! 171: { $$ = (int *)hookup($1, mkchain($3,CHNULL) ); } ! 172: ; ! 173: ! 174: compgotoindex: expr ! 175: | COMMA expr ! 176: { $$ = $2; } ! 177: ; ! 178: ! 179: ! 180: label: NAME ! 181: { $$ = mklabel($1,NO); } ! 182: | CONST ! 183: { $$ = mklabel(mkilab($1),NO); } ! 184: | CASE expr ! 185: { $$ = mkcase($2,0); } ! 186: | DEFAULT ! 187: { $$ = mkcase(PNULL,0); } ! 188: ; ! 189: ! 190: break: brk ! 191: { exbrk($1, PNULL, 0); } ! 192: | brk CONST ! 193: { exbrk($1, $2, 0); } ! 194: | brk blocktype ! 195: { exbrk($1, PNULL, $2); } ! 196: | brk CONST blocktype ! 197: { exbrk($1,$2,$3); } ! 198: | brk blocktype CONST ! 199: { exbrk($1,$3,$2); } ! 200: ; ! 201: ! 202: brk: NEXT { $$ = 1; } ! 203: | BREAK { $$ = 0; } ! 204: | EXIT { $$ = 0; } ! 205: ; ! 206: ! 207: blocktype: WHILE { $$ = STWHILE; } ! 208: | FOR { $$ = STFOR; } ! 209: | DO { $$ = STDO; } ! 210: | REPEAT { $$ = STREPEAT; } ! 211: | SWITCH { $$ = STSWITCH; } ! 212: | PROCEDURE { $$ = STPROC; } ! 213: ; ! 214: ! 215: leftcont: WHILE LPAR exprnull RPAR ! 216: { pushctl(STWHILE, $3); ! 217: TEST fprintf(diagfile, "while(expr)\n"); } ! 218: | for forinit fortest forincr ! 219: { exlab(((struct ctlblock *)thisctl)->xlab); ! 220: if($3) ! 221: exifgo(mknode(TNOTOP,OPNOT,$3,PNULL), ! 222: ((struct ctlblock *)thisctl)->breaklab = nextlab() ); ! 223: else exnull(); ! 224: TEST fprintf(diagfile, "for (forlist)\n"); } ! 225: | SWITCH LPAR expr RPAR ! 226: { pushctl(STSWITCH, simple(LVAL,$3)); ! 227: TEST fprintf(diagfile, "switch (expr)\n"); } ! 228: | do ! 229: { pushctl(STDO, $1); ! 230: TEST fprintf(diagfile, "do loop\n"); } ! 231: ; ! 232: ! 233: do: DO expr EOS contnu ! 234: { $$ = doloop($2, PNULL, PNULL); } ! 235: | DO expr contnu ! 236: { $$ = doloop($2, PNULL, PNULL); } ! 237: | DO expr COMMA expr EOS contnu ! 238: { $$ = doloop($2, $4, PNULL); } ! 239: | DO expr COMMA expr contnu ! 240: { $$ = doloop($2, $4, PNULL); } ! 241: | DO expr COMMA expr COMMA expr EOS contnu ! 242: { $$ = doloop($2,$4,$6); } ! 243: | DO expr COMMA expr COMMA expr contnu ! 244: { $$ = doloop($2,$4,$6); } ! 245: ; ! 246: ! 247: for: FOR LPAR ! 248: { pushctl(STFOR, PNULL); } ! 249: ; ! 250: ! 251: forinit: exec COMMA ! 252: { exgoto(((struct ctlblock *)thisctl)->xlab); ! 253: exlab(((struct ctlblock *)thisctl)->nextlab); ! 254: addexec(); ! 255: } ! 256: | exec EOS contnu COMMA ! 257: { exgoto(((struct ctlblock *)thisctl)->xlab); ! 258: exlab(((struct ctlblock *)thisctl)->nextlab); ! 259: addexec(); ! 260: } ! 261: ; ! 262: ! 263: fortest: exprnull COMMA ! 264: ; ! 265: ! 266: forincr: exec RPAR ! 267: { addexec(); } ! 268: | exec EOS contnu RPAR ! 269: { addexec(); } ! 270: ; ! 271: ! 272: exprnull: { $$ = 0; } ! 273: | expr ! 274: ; ! 275: ! 276: debug: DEBUG contnu ! 277: { if(dbgopt) ++dbglevel; } ! 278: ; ! 279: ! 280: enddebug: ! 281: { if(dbgopt) --dbglevel; } ! 282: ; ! 283: ! 284: iostat: iokwd LPAR iounit COMMA iolist RPAR ! 285: { $$ = mkiost($1, $3, $5); } ! 286: ; ! 287: ! 288: iokwd: READBIN { $$ = 0; } ! 289: | WRITEBIN { $$ = 1; } ! 290: | READ { $$ = 2; } ! 291: | WRITE { $$ = 3; } ! 292: ; ! 293: ! 294: iounit: expr ! 295: | { $$ = NULL; } ! 296: ; ! 297: ! 298: iolist: ioitem { $$ = (int *)mkchain($1,CHNULL); } ! 299: | iolist COMMA ioitem { hookup($1, mkchain($3,CHNULL)); } ! 300: ; ! 301: ! 302: ioitem: expr { $$ = mkioitem($1,CNULL); } ! 303: | expr COLON format { $$ = mkioitem($1,$3); } ! 304: | COLON format { $$ = mkioitem(PNULL,$2); } ! 305: | iobrace { $$ = mkiogroup($1, CNULL, PNULL); } ! 306: | do iobrace { $$ = mkiogroup($2, CNULL, $1); } ! 307: | do iobrace COLON format { $$ = mkiogroup($2,$4,$1); } ! 308: | iobrace COLON format { $$ = mkiogroup($1,$3,PNULL); } ! 309: ; ! 310: ! 311: iobrace: LBRACK { ++iobrlevel; } iolist RBRACK ! 312: { --iobrlevel; $$ = $3; } ! 313: ; ! 314: ! 315: format: letter ! 316: { $$ = mkformat($1, PNULL, PNULL); } ! 317: | letter LPAR expr RPAR ! 318: { $$ = mkformat($1, $3, PNULL); } ! 319: | letter LPAR expr COMMA expr RPAR ! 320: { $$ = mkformat($1,$3,$5); } ! 321: | letton CONST lettoff ! 322: { $$ = ((struct iostblock /*|| struct exprblock */ *)$2)->leftp; frexpblock($2); } ! 323: ; ! 324: ! 325: letter: letton LETTER lettoff { $$ = $2; } ! 326: ; ! 327: ! 328: letton: { lettneed = YES;} ! 329: ; ! 330: ! 331: lettoff: { lettneed = NO; } ! 332: ; ! 333: %% ! 334: ! 335: setyydeb() ! 336: { ! 337: #ifdef YYDEBUG ! 338: yydebug = 1; ! 339: #endif ! 340: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.