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