1: /* 2: * Copyright (c) 1980 Regents of the University of California. 3: * All rights reserved. The Berkeley software License Agreement 4: * specifies the terms and conditions for redistribution. 5: * 6: * @(#)gram.io 5.1 (Berkeley) 6/7/85 7: */ 8: 9: /* Input/Output Statements */ 10: 11: io: io1 12: { endio(); } 13: ; 14: 15: io1: iofmove ioctl 16: | iofmove unpar_fexpr 17: { ioclause(IOSUNIT, $2); endioctl(); } 18: | iofmove SSTAR 19: { ioclause(IOSUNIT, PNULL); endioctl(); } 20: | iofmove SPOWER 21: { ioclause(IOSUNIT, IOSTDERR); endioctl(); } 22: | iofctl ioctl 23: | read ioctl 24: { doio(PNULL); } 25: | read infmt 26: { doio(PNULL); } 27: | read ioctl inlist 28: { doio($3); } 29: | read infmt SCOMMA inlist 30: { doio($4); } 31: | read ioctl SCOMMA inlist 32: { doio($4); } 33: | write ioctl 34: { doio(PNULL); } 35: | write ioctl outlist 36: { doio($3); } 37: | print 38: { doio(PNULL); } 39: | print SCOMMA outlist 40: { doio($3); } 41: ; 42: 43: iofmove: fmkwd end_spec in_ioctl 44: ; 45: 46: fmkwd: SBACKSPACE 47: { iostmt = IOBACKSPACE; } 48: | SREWIND 49: { iostmt = IOREWIND; } 50: | SENDFILE 51: { iostmt = IOENDFILE; } 52: ; 53: 54: iofctl: ctlkwd end_spec in_ioctl 55: ; 56: 57: ctlkwd: SINQUIRE 58: { iostmt = IOINQUIRE; } 59: | SOPEN 60: { iostmt = IOOPEN; } 61: | SCLOSE 62: { iostmt = IOCLOSE; } 63: ; 64: 65: infmt: unpar_fexpr 66: { 67: ioclause(IOSUNIT, PNULL); 68: ioclause(IOSFMT, $1); 69: endioctl(); 70: } 71: | SSTAR 72: { 73: ioclause(IOSUNIT, PNULL); 74: ioclause(IOSFMT, PNULL); 75: endioctl(); 76: } 77: ; 78: 79: ioctl: SLPAR fexpr SRPAR 80: { if($2->headblock.vtype == TYCHAR) 81: { 82: ioclause(IOSUNIT, PNULL); 83: ioclause(IOSFMT, $2); 84: } 85: else 86: ioclause(IOSUNIT, $2); 87: endioctl(); 88: } 89: | SLPAR ctllist SRPAR 90: { endioctl(); } 91: ; 92: 93: ctllist: ioclause 94: | ctllist SCOMMA ioclause 95: ; 96: 97: ioclause: fexpr 98: { ioclause(IOSPOSITIONAL, $1); } 99: | SSTAR 100: { ioclause(IOSPOSITIONAL, PNULL); } 101: | SPOWER 102: { ioclause(IOSPOSITIONAL, IOSTDERR); } 103: | nameeq expr 104: { ioclause($1, $2); } 105: | nameeq SSTAR 106: { ioclause($1, PNULL); } 107: | nameeq SPOWER 108: { ioclause($1, IOSTDERR); } 109: ; 110: 111: nameeq: SNAMEEQ 112: { $$ = iocname(); } 113: ; 114: 115: read: SREAD end_spec in_ioctl 116: { iostmt = IOREAD; } 117: ; 118: 119: write: SWRITE end_spec in_ioctl 120: { iostmt = IOWRITE; } 121: ; 122: 123: print: SPRINT end_spec fexpr in_ioctl 124: { 125: iostmt = IOWRITE; 126: ioclause(IOSUNIT, PNULL); 127: ioclause(IOSFMT, $3); 128: endioctl(); 129: } 130: | SPRINT end_spec SSTAR in_ioctl 131: { 132: iostmt = IOWRITE; 133: ioclause(IOSUNIT, PNULL); 134: ioclause(IOSFMT, PNULL); 135: endioctl(); 136: } 137: ; 138: 139: inlist: inelt 140: { $$ = mkchain($1, CHNULL); } 141: | inlist SCOMMA inelt 142: { $$ = hookup($1, mkchain($3, CHNULL)); } 143: ; 144: 145: inelt: lhs 146: { $$ = (tagptr) $1; } 147: | SLPAR inlist SCOMMA dospec SRPAR 148: { $$ = (tagptr) mkiodo($4,$2); } 149: ; 150: 151: outlist: uexpr 152: { $$ = mkchain($1, CHNULL); } 153: | other 154: { $$ = mkchain($1, CHNULL); } 155: | out2 156: ; 157: 158: out2: uexpr SCOMMA uexpr 159: { $$ = mkchain($1, mkchain($3, CHNULL) ); } 160: | uexpr SCOMMA other 161: { $$ = mkchain($1, mkchain($3, CHNULL) ); } 162: | other SCOMMA uexpr 163: { $$ = mkchain($1, mkchain($3, CHNULL) ); } 164: | other SCOMMA other 165: { $$ = mkchain($1, mkchain($3, CHNULL) ); } 166: | out2 SCOMMA uexpr 167: { $$ = hookup($1, mkchain($3, CHNULL) ); } 168: | out2 SCOMMA other 169: { $$ = hookup($1, mkchain($3, CHNULL) ); } 170: ; 171: 172: other: complex_const 173: { $$ = (tagptr) $1; } 174: | SLPAR uexpr SCOMMA dospec SRPAR 175: { $$ = (tagptr) mkiodo($4, mkchain($2, CHNULL) ); } 176: | SLPAR other SCOMMA dospec SRPAR 177: { $$ = (tagptr) mkiodo($4, mkchain($2, CHNULL) ); } 178: | SLPAR out2 SCOMMA dospec SRPAR 179: { $$ = (tagptr) mkiodo($4, $2); } 180: ; 181: 182: in_ioctl: 183: { startioctl(); } 184: ;