Commit | Line | Data |
---|---|---|
a687059c LW |
1 | /* $Header: perl.y,v 3.0 89/10/18 15:22:04 lwall Locked $ |
2 | * | |
3 | * Copyright (c) 1989, Larry Wall | |
4 | * | |
5 | * You may distribute under the terms of the GNU General Public License | |
6 | * as specified in the README file that comes with the perl 3.0 kit. | |
8d063cd8 LW |
7 | * |
8 | * $Log: perl.y,v $ | |
a687059c LW |
9 | * Revision 3.0 89/10/18 15:22:04 lwall |
10 | * 3.0 baseline | |
8d063cd8 LW |
11 | * |
12 | */ | |
13 | ||
14 | %{ | |
8d063cd8 LW |
15 | #include "INTERN.h" |
16 | #include "perl.h" | |
378cc40b | 17 | |
378cc40b | 18 | STAB *scrstab; |
a687059c LW |
19 | ARG *arg4; /* rarely used arguments to make_op() */ |
20 | ARG *arg5; | |
378cc40b | 21 | |
8d063cd8 LW |
22 | %} |
23 | ||
24 | %start prog | |
25 | ||
26 | %union { | |
27 | int ival; | |
28 | char *cval; | |
29 | ARG *arg; | |
30 | CMD *cmdval; | |
31 | struct compcmd compval; | |
32 | STAB *stabval; | |
33 | FCMD *formval; | |
34 | } | |
35 | ||
36 | %token <cval> WORD | |
a687059c | 37 | %token <ival> APPEND OPEN SELECT LOOPEX |
378cc40b | 38 | %token <ival> USING FORMAT DO SHIFT PUSH POP LVALFUN |
a687059c LW |
39 | %token <ival> WHILE UNTIL IF UNLESS ELSE ELSIF CONTINUE SPLIT FLIST |
40 | %token <ival> FOR FILOP FILOP2 FILOP3 FILOP4 FILOP22 FILOP25 | |
41 | %token <ival> FUNC0 FUNC1 FUNC2 FUNC3 HSHFUN HSHFUN3 | |
42 | %token <ival> FLIST2 SUB FILETEST LOCAL DELETE | |
43 | %token <ival> RELOP EQOP MULOP ADDOP PACKAGE AMPER LFUNC4 | |
8d063cd8 | 44 | %token <formval> FORMLIST |
a687059c | 45 | %token <stabval> REG ARYLEN ARY HSH STAR |
8d063cd8 LW |
46 | %token <arg> SUBST PATTERN |
47 | %token <arg> RSTRING TRANS | |
48 | ||
a687059c | 49 | %type <ival> prog decl format remember |
8d063cd8 LW |
50 | %type <stabval> |
51 | %type <cmdval> block lineseq line loop cond sideff nexpr else | |
a687059c | 52 | %type <arg> expr sexpr cexpr csexpr term handle aryword hshword |
378cc40b | 53 | %type <arg> texpr listop |
8d063cd8 LW |
54 | %type <cval> label |
55 | %type <compval> compblock | |
56 | ||
378cc40b | 57 | %nonassoc <ival> LISTOP |
8d063cd8 | 58 | %left ',' |
8d063cd8 LW |
59 | %right '=' |
60 | %right '?' ':' | |
61 | %nonassoc DOTDOT | |
62 | %left OROR | |
63 | %left ANDAND | |
64 | %left '|' '^' | |
65 | %left '&' | |
a687059c LW |
66 | %nonassoc EQOP |
67 | %nonassoc RELOP | |
378cc40b LW |
68 | %nonassoc <ival> UNIOP |
69 | %nonassoc FILETEST | |
8d063cd8 | 70 | %left LS RS |
a687059c LW |
71 | %left ADDOP |
72 | %left MULOP | |
8d063cd8 LW |
73 | %left MATCH NMATCH |
74 | %right '!' '~' UMINUS | |
a687059c | 75 | %right POW |
8d063cd8 LW |
76 | %nonassoc INC DEC |
77 | %left '(' | |
78 | ||
79 | %% /* RULES */ | |
80 | ||
81 | prog : lineseq | |
a559c259 LW |
82 | { if (in_eval) |
83 | eval_root = block_head($1); | |
84 | else | |
85 | main_root = block_head($1); } | |
8d063cd8 LW |
86 | ; |
87 | ||
88 | compblock: block CONTINUE block | |
89 | { $$.comp_true = $1; $$.comp_alt = $3; } | |
90 | | block else | |
91 | { $$.comp_true = $1; $$.comp_alt = $2; } | |
92 | ; | |
93 | ||
94 | else : /* NULL */ | |
95 | { $$ = Nullcmd; } | |
96 | | ELSE block | |
97 | { $$ = $2; } | |
98 | | ELSIF '(' expr ')' compblock | |
378cc40b | 99 | { cmdline = $1; |
a687059c | 100 | $$ = make_ccmd(C_ELSIF,$3,$5); } |
8d063cd8 LW |
101 | ; |
102 | ||
a687059c LW |
103 | block : '{' remember lineseq '}' |
104 | { $$ = block_head($3); | |
105 | if (savestack->ary_fill > $2) | |
106 | restorelist($2); } | |
107 | ; | |
108 | ||
109 | remember: /* NULL */ /* in case they push a package name */ | |
110 | { $$ = savestack->ary_fill; } | |
8d063cd8 LW |
111 | ; |
112 | ||
113 | lineseq : /* NULL */ | |
114 | { $$ = Nullcmd; } | |
115 | | lineseq line | |
116 | { $$ = append_line($1,$2); } | |
117 | ; | |
118 | ||
119 | line : decl | |
120 | { $$ = Nullcmd; } | |
121 | | label cond | |
122 | { $$ = add_label($1,$2); } | |
123 | | loop /* loops add their own labels */ | |
124 | | label ';' | |
125 | { if ($1 != Nullch) { | |
378cc40b | 126 | $$ = add_label($1, make_acmd(C_EXPR, Nullstab, |
8d063cd8 LW |
127 | Nullarg, Nullarg) ); |
128 | } else | |
129 | $$ = Nullcmd; } | |
130 | | label sideff ';' | |
131 | { $$ = add_label($1,$2); } | |
132 | ; | |
133 | ||
a687059c LW |
134 | sideff : error |
135 | { $$ = Nullcmd; } | |
136 | | expr | |
8d063cd8 | 137 | { $$ = make_acmd(C_EXPR, Nullstab, $1, Nullarg); } |
a687059c | 138 | | expr IF expr |
8d063cd8 | 139 | { $$ = addcond( |
a687059c LW |
140 | make_acmd(C_EXPR, Nullstab, Nullarg, $1), $3); } |
141 | | expr UNLESS expr | |
142 | { $$ = addcond(invert( | |
143 | make_acmd(C_EXPR, Nullstab, Nullarg, $1)), $3); } | |
144 | | expr WHILE expr | |
8d063cd8 | 145 | { $$ = addloop( |
a687059c LW |
146 | make_acmd(C_EXPR, Nullstab, Nullarg, $1), $3); } |
147 | | expr UNTIL expr | |
148 | { $$ = addloop(invert( | |
149 | make_acmd(C_EXPR, Nullstab, Nullarg, $1)), $3); } | |
8d063cd8 LW |
150 | ; |
151 | ||
152 | cond : IF '(' expr ')' compblock | |
378cc40b | 153 | { cmdline = $1; |
a687059c | 154 | $$ = make_icmd(C_IF,$3,$5); } |
8d063cd8 | 155 | | UNLESS '(' expr ')' compblock |
378cc40b | 156 | { cmdline = $1; |
a687059c | 157 | $$ = invert(make_icmd(C_IF,$3,$5)); } |
8d063cd8 | 158 | | IF block compblock |
378cc40b LW |
159 | { cmdline = $1; |
160 | $$ = make_ccmd(C_IF,cmd_to_arg($2),$3); } | |
8d063cd8 | 161 | | UNLESS block compblock |
378cc40b LW |
162 | { cmdline = $1; |
163 | $$ = invert(make_ccmd(C_IF,cmd_to_arg($2),$3)); } | |
8d063cd8 LW |
164 | ; |
165 | ||
166 | loop : label WHILE '(' texpr ')' compblock | |
378cc40b LW |
167 | { cmdline = $2; |
168 | $$ = wopt(add_label($1, | |
8d063cd8 LW |
169 | make_ccmd(C_WHILE,$4,$6) )); } |
170 | | label UNTIL '(' expr ')' compblock | |
378cc40b LW |
171 | { cmdline = $2; |
172 | $$ = wopt(add_label($1, | |
8d063cd8 LW |
173 | invert(make_ccmd(C_WHILE,$4,$6)) )); } |
174 | | label WHILE block compblock | |
378cc40b LW |
175 | { cmdline = $2; |
176 | $$ = wopt(add_label($1, | |
8d063cd8 LW |
177 | make_ccmd(C_WHILE, cmd_to_arg($3),$4) )); } |
178 | | label UNTIL block compblock | |
378cc40b LW |
179 | { cmdline = $2; |
180 | $$ = wopt(add_label($1, | |
8d063cd8 | 181 | invert(make_ccmd(C_WHILE, cmd_to_arg($3),$4)) )); } |
378cc40b LW |
182 | | label FOR REG '(' expr ')' compblock |
183 | { cmdline = $2; | |
184 | /* | |
185 | * The following gobbledygook catches EXPRs that | |
186 | * aren't explicit array refs and translates | |
187 | * foreach VAR (EXPR) { | |
188 | * into | |
189 | * @ary = EXPR; | |
190 | * foreach VAR (@ary) { | |
191 | * where @ary is a hidden array made by genstab(). | |
a687059c LW |
192 | * (Note that @ary may become a local array if |
193 | * it is determined that it might be called | |
194 | * recursively. See cmd_tosave().) | |
378cc40b LW |
195 | */ |
196 | if ($5->arg_type != O_ARRAY) { | |
197 | scrstab = aadd(genstab()); | |
198 | $$ = append_line( | |
199 | make_acmd(C_EXPR, Nullstab, | |
200 | l(make_op(O_ASSIGN,2, | |
201 | listish(make_op(O_ARRAY, 1, | |
202 | stab2arg(A_STAB,scrstab), | |
203 | Nullarg,Nullarg, 1)), | |
a687059c LW |
204 | listish(make_list($5)), |
205 | Nullarg)), | |
378cc40b LW |
206 | Nullarg), |
207 | wopt(over($3,add_label($1, | |
208 | make_ccmd(C_WHILE, | |
209 | make_op(O_ARRAY, 1, | |
210 | stab2arg(A_STAB,scrstab), | |
a687059c | 211 | Nullarg,Nullarg ), |
378cc40b LW |
212 | $7))))); |
213 | } | |
214 | else { | |
215 | $$ = wopt(over($3,add_label($1, | |
216 | make_ccmd(C_WHILE,$5,$7) ))); | |
217 | } | |
218 | } | |
219 | | label FOR '(' expr ')' compblock | |
220 | { cmdline = $2; | |
221 | if ($4->arg_type != O_ARRAY) { | |
222 | scrstab = aadd(genstab()); | |
223 | $$ = append_line( | |
224 | make_acmd(C_EXPR, Nullstab, | |
225 | l(make_op(O_ASSIGN,2, | |
226 | listish(make_op(O_ARRAY, 1, | |
227 | stab2arg(A_STAB,scrstab), | |
228 | Nullarg,Nullarg, 1 )), | |
a687059c LW |
229 | listish(make_list($4)), |
230 | Nullarg)), | |
378cc40b LW |
231 | Nullarg), |
232 | wopt(over(defstab,add_label($1, | |
233 | make_ccmd(C_WHILE, | |
234 | make_op(O_ARRAY, 1, | |
235 | stab2arg(A_STAB,scrstab), | |
a687059c | 236 | Nullarg,Nullarg ), |
378cc40b LW |
237 | $6))))); |
238 | } | |
239 | else { /* lisp, anyone? */ | |
240 | $$ = wopt(over(defstab,add_label($1, | |
241 | make_ccmd(C_WHILE,$4,$6) ))); | |
242 | } | |
243 | } | |
8d063cd8 LW |
244 | | label FOR '(' nexpr ';' texpr ';' nexpr ')' block |
245 | /* basically fake up an initialize-while lineseq */ | |
246 | { yyval.compval.comp_true = $10; | |
247 | yyval.compval.comp_alt = $8; | |
378cc40b | 248 | cmdline = $2; |
8d063cd8 LW |
249 | $$ = append_line($4,wopt(add_label($1, |
250 | make_ccmd(C_WHILE,$6,yyval.compval) ))); } | |
251 | | label compblock /* a block is a loop that happens once */ | |
252 | { $$ = add_label($1,make_ccmd(C_BLOCK,Nullarg,$2)); } | |
253 | ; | |
254 | ||
255 | nexpr : /* NULL */ | |
256 | { $$ = Nullcmd; } | |
257 | | sideff | |
258 | ; | |
259 | ||
260 | texpr : /* NULL means true */ | |
a687059c | 261 | { (void)scanstr("1"); $$ = yylval.arg; } |
8d063cd8 LW |
262 | | expr |
263 | ; | |
264 | ||
265 | label : /* empty */ | |
266 | { $$ = Nullch; } | |
267 | | WORD ':' | |
268 | ; | |
269 | ||
8d063cd8 LW |
270 | decl : format |
271 | { $$ = 0; } | |
272 | | subrout | |
273 | { $$ = 0; } | |
a687059c LW |
274 | | package |
275 | { $$ = 0; } | |
8d063cd8 LW |
276 | ; |
277 | ||
a687059c LW |
278 | format : FORMAT WORD '=' FORMLIST |
279 | { stab_form(stabent($2,TRUE)) = $4; Safefree($2);} | |
280 | | FORMAT '=' FORMLIST | |
281 | { stab_form(stabent("STDOUT",TRUE)) = $3; } | |
8d063cd8 LW |
282 | ; |
283 | ||
284 | subrout : SUB WORD block | |
378cc40b | 285 | { make_sub($2,$3); } |
8d063cd8 LW |
286 | ; |
287 | ||
a687059c LW |
288 | package : PACKAGE WORD ';' |
289 | { char tmpbuf[256]; | |
290 | ||
291 | savehptr(&curstash); | |
292 | saveitem(curstname); | |
293 | str_set(curstname,$2); | |
294 | sprintf(tmpbuf,"'_%s",$2); | |
295 | curstash = stab_xhash(hadd(stabent(tmpbuf,TRUE))); | |
296 | curstash->tbl_coeffsize = 0; | |
297 | Safefree($2); | |
298 | } | |
299 | ; | |
300 | ||
301 | cexpr : ',' expr | |
302 | { $$ = $2; } | |
303 | ; | |
304 | ||
305 | expr : expr ',' sexpr | |
306 | { $$ = make_op(O_COMMA, 2, $1, $3, Nullarg); } | |
8d063cd8 LW |
307 | | sexpr |
308 | ; | |
309 | ||
a687059c LW |
310 | csexpr : ',' sexpr |
311 | { $$ = $2; } | |
312 | ; | |
313 | ||
8d063cd8 LW |
314 | sexpr : sexpr '=' sexpr |
315 | { $1 = listish($1); | |
a687059c LW |
316 | if ($1->arg_type == O_ASSIGN && $1->arg_len == 1) |
317 | $1->arg_type = O_ITEM; /* a local() */ | |
8d063cd8 LW |
318 | if ($1->arg_type == O_LIST) |
319 | $3 = listish($3); | |
a687059c LW |
320 | $$ = l(make_op(O_ASSIGN, 2, $1, $3, Nullarg)); } |
321 | | sexpr POW '=' sexpr | |
322 | { $$ = l(make_op(O_POW, 2, $1, $4, Nullarg)); } | |
323 | | sexpr MULOP '=' sexpr | |
324 | { $$ = l(make_op($2, 2, $1, $4, Nullarg)); } | |
325 | | sexpr ADDOP '=' sexpr | |
326 | { $$ = rcatmaybe(l(make_op($2, 2, $1, $4, Nullarg)));} | |
8d063cd8 | 327 | | sexpr LS '=' sexpr |
a687059c | 328 | { $$ = l(make_op(O_LEFT_SHIFT, 2, $1, $4, Nullarg)); } |
8d063cd8 | 329 | | sexpr RS '=' sexpr |
a687059c | 330 | { $$ = l(make_op(O_RIGHT_SHIFT, 2, $1, $4, Nullarg)); } |
8d063cd8 | 331 | | sexpr '&' '=' sexpr |
a687059c | 332 | { $$ = l(make_op(O_BIT_AND, 2, $1, $4, Nullarg)); } |
8d063cd8 | 333 | | sexpr '^' '=' sexpr |
a687059c | 334 | { $$ = l(make_op(O_XOR, 2, $1, $4, Nullarg)); } |
8d063cd8 | 335 | | sexpr '|' '=' sexpr |
a687059c LW |
336 | { $$ = l(make_op(O_BIT_OR, 2, $1, $4, Nullarg)); } |
337 | ||
338 | ||
339 | | sexpr POW sexpr | |
340 | { $$ = make_op(O_POW, 2, $1, $3, Nullarg); } | |
341 | | sexpr MULOP sexpr | |
342 | { $$ = make_op($2, 2, $1, $3, Nullarg); } | |
343 | | sexpr ADDOP sexpr | |
344 | { $$ = make_op($2, 2, $1, $3, Nullarg); } | |
8d063cd8 | 345 | | sexpr LS sexpr |
a687059c | 346 | { $$ = make_op(O_LEFT_SHIFT, 2, $1, $3, Nullarg); } |
8d063cd8 | 347 | | sexpr RS sexpr |
a687059c LW |
348 | { $$ = make_op(O_RIGHT_SHIFT, 2, $1, $3, Nullarg); } |
349 | | sexpr RELOP sexpr | |
350 | { $$ = make_op($2, 2, $1, $3, Nullarg); } | |
351 | | sexpr EQOP sexpr | |
352 | { $$ = make_op($2, 2, $1, $3, Nullarg); } | |
8d063cd8 | 353 | | sexpr '&' sexpr |
a687059c | 354 | { $$ = make_op(O_BIT_AND, 2, $1, $3, Nullarg); } |
8d063cd8 | 355 | | sexpr '^' sexpr |
a687059c | 356 | { $$ = make_op(O_XOR, 2, $1, $3, Nullarg); } |
8d063cd8 | 357 | | sexpr '|' sexpr |
a687059c | 358 | { $$ = make_op(O_BIT_OR, 2, $1, $3, Nullarg); } |
8d063cd8 | 359 | | sexpr DOTDOT sexpr |
a687059c LW |
360 | { arg4 = Nullarg; |
361 | $$ = make_op(O_F_OR_R, 4, $1, $3, Nullarg); } | |
8d063cd8 | 362 | | sexpr ANDAND sexpr |
a687059c | 363 | { $$ = make_op(O_AND, 2, $1, $3, Nullarg); } |
8d063cd8 | 364 | | sexpr OROR sexpr |
a687059c | 365 | { $$ = make_op(O_OR, 2, $1, $3, Nullarg); } |
8d063cd8 | 366 | | sexpr '?' sexpr ':' sexpr |
a687059c | 367 | { $$ = make_op(O_COND_EXPR, 3, $1, $3, $5); } |
8d063cd8 LW |
368 | | sexpr MATCH sexpr |
369 | { $$ = mod_match(O_MATCH, $1, $3); } | |
370 | | sexpr NMATCH sexpr | |
371 | { $$ = mod_match(O_NMATCH, $1, $3); } | |
372 | | term INC | |
373 | { $$ = addflags(1, AF_POST|AF_UP, | |
a687059c | 374 | l(make_op(O_ITEM,1,$1,Nullarg,Nullarg))); } |
8d063cd8 LW |
375 | | term DEC |
376 | { $$ = addflags(1, AF_POST, | |
a687059c | 377 | l(make_op(O_ITEM,1,$1,Nullarg,Nullarg))); } |
8d063cd8 LW |
378 | | INC term |
379 | { $$ = addflags(1, AF_PRE|AF_UP, | |
a687059c | 380 | l(make_op(O_ITEM,1,$2,Nullarg,Nullarg))); } |
8d063cd8 LW |
381 | | DEC term |
382 | { $$ = addflags(1, AF_PRE, | |
a687059c | 383 | l(make_op(O_ITEM,1,$2,Nullarg,Nullarg))); } |
8d063cd8 LW |
384 | | term |
385 | { $$ = $1; } | |
386 | ; | |
387 | ||
388 | term : '-' term %prec UMINUS | |
a687059c LW |
389 | { $$ = make_op(O_NEGATE, 1, $2, Nullarg, Nullarg); } |
390 | | '+' term %prec UMINUS | |
391 | { $$ = $2; } | |
8d063cd8 | 392 | | '!' term |
a687059c | 393 | { $$ = make_op(O_NOT, 1, $2, Nullarg, Nullarg); } |
8d063cd8 | 394 | | '~' term |
a687059c | 395 | { $$ = make_op(O_COMPLEMENT, 1, $2, Nullarg, Nullarg);} |
378cc40b LW |
396 | | FILETEST WORD |
397 | { opargs[$1] = 0; /* force it special */ | |
398 | $$ = make_op($1, 1, | |
399 | stab2arg(A_STAB,stabent($2,TRUE)), | |
a687059c | 400 | Nullarg, Nullarg); |
378cc40b LW |
401 | } |
402 | | FILETEST sexpr | |
403 | { opargs[$1] = 1; | |
a687059c | 404 | $$ = make_op($1, 1, $2, Nullarg, Nullarg); } |
378cc40b LW |
405 | | FILETEST |
406 | { opargs[$1] = ($1 != O_FTTTY); | |
407 | $$ = make_op($1, 1, | |
408 | stab2arg(A_STAB, | |
a687059c LW |
409 | $1 == O_FTTTY?stabent("STDIN",TRUE):defstab), |
410 | Nullarg, Nullarg); } | |
378cc40b | 411 | | LOCAL '(' expr ')' |
a687059c LW |
412 | { $$ = l(make_op(O_ITEM, 1, |
413 | localize(listish(make_list($3))), | |
414 | Nullarg,Nullarg)); } | |
8d063cd8 LW |
415 | | '(' expr ')' |
416 | { $$ = make_list(hide_ary($2)); } | |
417 | | '(' ')' | |
418 | { $$ = make_list(Nullarg); } | |
378cc40b | 419 | | DO sexpr %prec FILETEST |
a687059c LW |
420 | { $$ = fixeval( |
421 | make_op(O_DOFILE,2,$2,Nullarg,Nullarg) ); | |
422 | allstabs = TRUE;} | |
8d063cd8 LW |
423 | | DO block %prec '(' |
424 | { $$ = cmd_to_arg($2); } | |
425 | | REG %prec '(' | |
378cc40b | 426 | { $$ = stab2arg(A_STAB,$1); } |
a687059c LW |
427 | | STAR %prec '(' |
428 | { $$ = stab2arg(A_STAR,$1); } | |
8d063cd8 | 429 | | REG '[' expr ']' %prec '(' |
a687059c LW |
430 | { $$ = make_op(O_AELEM, 2, |
431 | stab2arg(A_STAB,aadd($1)), $3, Nullarg); } | |
432 | | HSH %prec '(' | |
433 | { $$ = make_op(O_HASH, 1, | |
434 | stab2arg(A_STAB,$1), | |
435 | Nullarg, Nullarg); } | |
8d063cd8 LW |
436 | | ARY %prec '(' |
437 | { $$ = make_op(O_ARRAY, 1, | |
378cc40b | 438 | stab2arg(A_STAB,$1), |
a687059c | 439 | Nullarg, Nullarg); } |
8d063cd8 | 440 | | REG '{' expr '}' %prec '(' |
a687059c LW |
441 | { $$ = make_op(O_HELEM, 2, |
442 | stab2arg(A_STAB,hadd($1)), | |
443 | jmaybe($3), | |
444 | Nullarg); } | |
445 | | ARY '[' expr ']' %prec '(' | |
446 | { $$ = make_op(O_ASLICE, 2, | |
447 | stab2arg(A_STAB,aadd($1)), | |
448 | listish(make_list($3)), | |
449 | Nullarg); } | |
450 | | ARY '{' expr '}' %prec '(' | |
451 | { $$ = make_op(O_HSLICE, 2, | |
452 | stab2arg(A_STAB,hadd($1)), | |
453 | listish(make_list($3)), | |
454 | Nullarg); } | |
378cc40b LW |
455 | | DELETE REG '{' expr '}' %prec '(' |
456 | { $$ = make_op(O_DELETE, 2, | |
a687059c LW |
457 | stab2arg(A_STAB,hadd($2)), |
458 | jmaybe($4), | |
459 | Nullarg); } | |
8d063cd8 | 460 | | ARYLEN %prec '(' |
378cc40b | 461 | { $$ = stab2arg(A_ARYLEN,$1); } |
8d063cd8 LW |
462 | | RSTRING %prec '(' |
463 | { $$ = $1; } | |
464 | | PATTERN %prec '(' | |
465 | { $$ = $1; } | |
466 | | SUBST %prec '(' | |
467 | { $$ = $1; } | |
468 | | TRANS %prec '(' | |
469 | { $$ = $1; } | |
470 | | DO WORD '(' expr ')' | |
a687059c LW |
471 | { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, |
472 | stab2arg(A_WORD,stabent($2,TRUE)), | |
8d063cd8 | 473 | make_list($4), |
a687059c LW |
474 | Nullarg); Safefree($2); } |
475 | | AMPER WORD '(' expr ')' | |
476 | { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, | |
378cc40b | 477 | stab2arg(A_WORD,stabent($2,TRUE)), |
a687059c LW |
478 | make_list($4), |
479 | Nullarg); Safefree($2); } | |
8d063cd8 | 480 | | DO WORD '(' ')' |
a687059c LW |
481 | { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, |
482 | stab2arg(A_WORD,stabent($2,TRUE)), | |
8d063cd8 | 483 | make_list(Nullarg), |
a687059c LW |
484 | Nullarg); } |
485 | | AMPER WORD '(' ')' | |
486 | { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, | |
378cc40b | 487 | stab2arg(A_WORD,stabent($2,TRUE)), |
a687059c LW |
488 | make_list(Nullarg), |
489 | Nullarg); } | |
490 | | AMPER WORD | |
491 | { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, | |
492 | stab2arg(A_WORD,stabent($2,TRUE)), | |
493 | Nullarg, | |
494 | Nullarg); } | |
378cc40b | 495 | | DO REG '(' expr ')' |
a687059c LW |
496 | { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, |
497 | stab2arg(A_STAB,$2), | |
378cc40b | 498 | make_list($4), |
a687059c LW |
499 | Nullarg); } |
500 | | AMPER REG '(' expr ')' | |
501 | { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, | |
378cc40b | 502 | stab2arg(A_STAB,$2), |
a687059c LW |
503 | make_list($4), |
504 | Nullarg); } | |
378cc40b | 505 | | DO REG '(' ')' |
a687059c LW |
506 | { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, |
507 | stab2arg(A_STAB,$2), | |
378cc40b | 508 | make_list(Nullarg), |
a687059c LW |
509 | Nullarg); } |
510 | | AMPER REG '(' ')' | |
511 | { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, | |
378cc40b | 512 | stab2arg(A_STAB,$2), |
a687059c LW |
513 | make_list(Nullarg), |
514 | Nullarg); } | |
515 | | AMPER REG | |
516 | { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, | |
517 | stab2arg(A_STAB,$2), | |
518 | Nullarg, | |
519 | Nullarg); } | |
8d063cd8 | 520 | | LOOPEX |
a687059c | 521 | { $$ = make_op($1,0,Nullarg,Nullarg,Nullarg); } |
8d063cd8 LW |
522 | | LOOPEX WORD |
523 | { $$ = make_op($1,1,cval_to_arg($2), | |
a687059c | 524 | Nullarg,Nullarg); } |
8d063cd8 | 525 | | UNIOP |
a687059c LW |
526 | { $$ = make_op($1,1,Nullarg,Nullarg,Nullarg); |
527 | if ($1 == O_EVAL || $1 == O_RESET) | |
528 | $$ = fixeval($$); } | |
8d063cd8 | 529 | | UNIOP sexpr |
a687059c LW |
530 | { $$ = make_op($1,1,$2,Nullarg,Nullarg); |
531 | if ($1 == O_EVAL || $1 == O_RESET) | |
532 | $$ = fixeval($$); } | |
533 | | SELECT | |
534 | { $$ = make_op(O_SELECT, 0, Nullarg, Nullarg, Nullarg);} | |
535 | | SELECT '(' handle ')' | |
536 | { $$ = make_op(O_SELECT, 1, $3, Nullarg, Nullarg); } | |
537 | | SELECT '(' sexpr csexpr csexpr csexpr ')' | |
538 | { arg4 = $6; | |
539 | $$ = make_op(O_SSELECT, 4, $3, $4, $5); } | |
8d063cd8 LW |
540 | | OPEN WORD %prec '(' |
541 | { $$ = make_op(O_OPEN, 2, | |
378cc40b LW |
542 | stab2arg(A_WORD,stabent($2,TRUE)), |
543 | stab2arg(A_STAB,stabent($2,TRUE)), | |
a687059c | 544 | Nullarg); } |
8d063cd8 LW |
545 | | OPEN '(' WORD ')' |
546 | { $$ = make_op(O_OPEN, 2, | |
378cc40b LW |
547 | stab2arg(A_WORD,stabent($3,TRUE)), |
548 | stab2arg(A_STAB,stabent($3,TRUE)), | |
a687059c LW |
549 | Nullarg); } |
550 | | OPEN '(' handle cexpr ')' | |
378cc40b LW |
551 | { $$ = make_op(O_OPEN, 2, |
552 | $3, | |
a687059c LW |
553 | $4, Nullarg); } |
554 | | FILOP '(' handle ')' | |
555 | { $$ = make_op($1, 1, | |
378cc40b | 556 | $3, |
a687059c LW |
557 | Nullarg, Nullarg); } |
558 | | FILOP WORD | |
559 | { $$ = make_op($1, 1, | |
378cc40b | 560 | stab2arg(A_WORD,stabent($2,TRUE)), |
a687059c LW |
561 | Nullarg, Nullarg); |
562 | Safefree($2); } | |
563 | | FILOP REG | |
564 | { $$ = make_op($1, 1, | |
565 | stab2arg(A_STAB,$2), | |
566 | Nullarg, Nullarg); } | |
567 | | FILOP '(' ')' | |
568 | { $$ = make_op($1, 1, | |
378cc40b | 569 | stab2arg(A_WORD,Nullstab), |
a687059c LW |
570 | Nullarg, Nullarg); } |
571 | | FILOP %prec '(' | |
572 | { $$ = make_op($1, 0, | |
573 | Nullarg, Nullarg, Nullarg); } | |
574 | | FILOP2 '(' handle cexpr ')' | |
575 | { $$ = make_op($1, 2, $3, $4, Nullarg); } | |
576 | | FILOP3 '(' handle csexpr cexpr ')' | |
577 | { $$ = make_op($1, 3, $3, $4, $5); } | |
578 | | FILOP22 '(' handle ',' handle ')' | |
579 | { $$ = make_op($1, 2, $3, $5, Nullarg); } | |
580 | | FILOP4 '(' handle csexpr csexpr cexpr ')' | |
581 | { arg4 = $6; $$ = make_op($1, 4, $3, $4, $5); } | |
582 | | FILOP25 '(' handle ',' handle csexpr csexpr cexpr ')' | |
583 | { arg4 = $7; arg5 = $8; | |
584 | $$ = make_op($1, 5, $3, $5, $6); } | |
585 | | PUSH '(' aryword cexpr ')' | |
8d063cd8 | 586 | { $$ = make_op($1, 2, |
a687059c LW |
587 | $3, |
588 | make_list($4), | |
589 | Nullarg); } | |
590 | | POP aryword %prec '(' | |
591 | { $$ = make_op(O_POP, 1, $2, Nullarg, Nullarg); } | |
592 | | POP '(' aryword ')' | |
593 | { $$ = make_op(O_POP, 1, $3, Nullarg, Nullarg); } | |
594 | | SHIFT aryword %prec '(' | |
595 | { $$ = make_op(O_SHIFT, 1, $2, Nullarg, Nullarg); } | |
596 | | SHIFT '(' aryword ')' | |
597 | { $$ = make_op(O_SHIFT, 1, $3, Nullarg, Nullarg); } | |
8d063cd8 LW |
598 | | SHIFT %prec '(' |
599 | { $$ = make_op(O_SHIFT, 1, | |
a687059c LW |
600 | stab2arg(A_STAB, |
601 | aadd(stabent(subline ? "_" : "ARGV", TRUE))), | |
602 | Nullarg, Nullarg); } | |
8d063cd8 | 603 | | SPLIT %prec '(' |
a687059c LW |
604 | { (void)scanpat("/\\s+/"); |
605 | $$ = make_split(defstab,yylval.arg,Nullarg); } | |
606 | | SPLIT '(' sexpr csexpr csexpr ')' | |
607 | { $$ = mod_match(O_MATCH, $4, | |
608 | make_split(defstab,$3,$5));} | |
609 | | SPLIT '(' sexpr csexpr ')' | |
610 | { $$ = mod_match(O_MATCH, $4, | |
611 | make_split(defstab,$3,Nullarg) ); } | |
8d063cd8 LW |
612 | | SPLIT '(' sexpr ')' |
613 | { $$ = mod_match(O_MATCH, | |
378cc40b | 614 | stab2arg(A_STAB,defstab), |
a687059c LW |
615 | make_split(defstab,$3,Nullarg) ); } |
616 | | FLIST2 '(' sexpr cexpr ')' | |
617 | { $$ = make_op($1, 2, | |
8d063cd8 | 618 | $3, |
a687059c LW |
619 | listish(make_list($4)), |
620 | Nullarg); } | |
621 | | FLIST '(' expr ')' | |
622 | { $$ = make_op($1, 1, | |
8d063cd8 LW |
623 | make_list($3), |
624 | Nullarg, | |
a687059c LW |
625 | Nullarg); } |
626 | | LVALFUN sexpr %prec '(' | |
627 | { $$ = l(make_op($1, 1, fixl($1,$2), | |
628 | Nullarg, Nullarg)); } | |
378cc40b LW |
629 | | LVALFUN |
630 | { $$ = l(make_op($1, 1, | |
631 | stab2arg(A_STAB,defstab), | |
a687059c | 632 | Nullarg, Nullarg)); } |
8d063cd8 | 633 | | FUNC0 |
a687059c | 634 | { $$ = make_op($1, 0, Nullarg, Nullarg, Nullarg); } |
8d063cd8 | 635 | | FUNC1 '(' expr ')' |
a687059c LW |
636 | { $$ = make_op($1, 1, $3, Nullarg, Nullarg); |
637 | if ($1 == O_EVAL || $1 == O_RESET) | |
638 | $$ = fixeval($$); } | |
639 | | FUNC2 '(' sexpr cexpr ')' | |
640 | { $$ = make_op($1, 2, $3, $4, Nullarg); | |
378cc40b | 641 | if ($1 == O_INDEX && $$[2].arg_type == A_SINGLE) |
a687059c LW |
642 | fbmcompile($$[2].arg_ptr.arg_str,0); } |
643 | | FUNC3 '(' sexpr csexpr cexpr ')' | |
644 | { $$ = make_op($1, 3, $3, $4, $5); } | |
645 | | LFUNC4 '(' sexpr csexpr csexpr cexpr ')' | |
646 | { arg4 = $6; $$ = make_op($1, 4, l($3), $4, $5); } | |
647 | | HSHFUN '(' hshword ')' | |
648 | { $$ = make_op($1, 1, | |
649 | $3, | |
650 | Nullarg, | |
651 | Nullarg); } | |
652 | | HSHFUN hshword | |
8d063cd8 | 653 | { $$ = make_op($1, 1, |
a687059c | 654 | $2, |
8d063cd8 | 655 | Nullarg, |
a687059c LW |
656 | Nullarg); } |
657 | | HSHFUN3 '(' hshword csexpr cexpr ')' | |
658 | { $$ = make_op($1, 3, $3, $4, $5); } | |
378cc40b | 659 | | listop |
8d063cd8 LW |
660 | ; |
661 | ||
378cc40b | 662 | listop : LISTOP |
8d063cd8 | 663 | { $$ = make_op($1,2, |
378cc40b | 664 | stab2arg(A_WORD,Nullstab), |
a687059c LW |
665 | stab2arg(A_STAB,defstab), |
666 | Nullarg); } | |
378cc40b | 667 | | LISTOP expr |
a687059c | 668 | { $$ = make_op($1,2, |
378cc40b | 669 | stab2arg(A_WORD,Nullstab), |
a687059c LW |
670 | maybelistish($1,make_list($2)), |
671 | Nullarg); } | |
378cc40b | 672 | | LISTOP WORD |
8d063cd8 | 673 | { $$ = make_op($1,2, |
378cc40b | 674 | stab2arg(A_WORD,stabent($2,TRUE)), |
a687059c LW |
675 | stab2arg(A_STAB,defstab), |
676 | Nullarg); } | |
378cc40b | 677 | | LISTOP WORD expr |
a687059c | 678 | { $$ = make_op($1,2, |
378cc40b | 679 | stab2arg(A_WORD,stabent($2,TRUE)), |
a687059c LW |
680 | maybelistish($1,make_list($3)), |
681 | Nullarg); Safefree($2); } | |
378cc40b | 682 | | LISTOP REG expr |
a687059c | 683 | { $$ = make_op($1,2, |
378cc40b | 684 | stab2arg(A_STAB,$2), |
a687059c LW |
685 | maybelistish($1,make_list($3)), |
686 | Nullarg); } | |
687 | ; | |
688 | ||
689 | handle : WORD | |
690 | { $$ = stab2arg(A_WORD,stabent($1,TRUE)); Safefree($1);} | |
691 | | sexpr | |
692 | ; | |
693 | ||
694 | aryword : WORD | |
695 | { $$ = stab2arg(A_WORD,aadd(stabent($1,TRUE))); | |
696 | Safefree($1); } | |
697 | | ARY | |
698 | { $$ = stab2arg(A_STAB,$1); } | |
699 | ; | |
700 | ||
701 | hshword : WORD | |
702 | { $$ = stab2arg(A_WORD,hadd(stabent($1,TRUE))); | |
703 | Safefree($1); } | |
704 | | HSH | |
705 | { $$ = stab2arg(A_STAB,$1); } | |
8d063cd8 LW |
706 | ; |
707 | ||
708 | %% /* PROGRAM */ |