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