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