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) 06/07/85 7 */ 8 9 /* Input/Output Statements */ 10 11io: io1 12 { endio(); } 13 ; 14 15io1: 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 43iofmove: fmkwd end_spec in_ioctl 44 ; 45 46fmkwd: SBACKSPACE 47 { iostmt = IOBACKSPACE; } 48 | SREWIND 49 { iostmt = IOREWIND; } 50 | SENDFILE 51 { iostmt = IOENDFILE; } 52 ; 53 54iofctl: ctlkwd end_spec in_ioctl 55 ; 56 57ctlkwd: SINQUIRE 58 { iostmt = IOINQUIRE; } 59 | SOPEN 60 { iostmt = IOOPEN; } 61 | SCLOSE 62 { iostmt = IOCLOSE; } 63 ; 64 65infmt: 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 79ioctl: 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 93ctllist: ioclause 94 | ctllist SCOMMA ioclause 95 ; 96 97ioclause: 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 111nameeq: SNAMEEQ 112 { $$ = iocname(); } 113 ; 114 115read: SREAD end_spec in_ioctl 116 { iostmt = IOREAD; } 117 ; 118 119write: SWRITE end_spec in_ioctl 120 { iostmt = IOWRITE; } 121 ; 122 123print: 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 139inlist: inelt 140 { $$ = mkchain($1, CHNULL); } 141 | inlist SCOMMA inelt 142 { $$ = hookup($1, mkchain($3, CHNULL)); } 143 ; 144 145inelt: lhs 146 { $$ = (tagptr) $1; } 147 | SLPAR inlist SCOMMA dospec SRPAR 148 { $$ = (tagptr) mkiodo($4,$2); } 149 ; 150 151outlist: uexpr 152 { $$ = mkchain($1, CHNULL); } 153 | other 154 { $$ = mkchain($1, CHNULL); } 155 | out2 156 ; 157 158out2: 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 172other: 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 182in_ioctl: 183 { startioctl(); } 184 ; 185