update Changes, patchlevel etc.
[p5sagit/p5-mst-13.2.git] / perly.y
CommitLineData
a0d0e21e 1/* perly.y
a687059c 2 *
9607fc9c 3 * Copyright (c) 1991-1997, 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 *
a0d0e21e 8 */
9
10/*
11 * 'I see,' laughed Strider. 'I look foul and feel fair. Is that it?
14a38fd5 12 * All that is gold does not glitter, not all those who wander are lost.'
8d063cd8 13 */
14
15%{
79072805 16#include "EXTERN.h"
864dbfa3 17#define PERL_IN_PERLY_C
8d063cd8 18#include "perl.h"
378cc40b 19
864dbfa3 20#define dep() deprecate("\"do\" to call subroutines")
f0fcb552 21
09bef843 22/* stuff included here to make perly_c.diff apply better */
23
24#define yydebug PL_yydebug
25#define yynerrs PL_yynerrs
26#define yyerrflag PL_yyerrflag
27#define yychar PL_yychar
28#define yyval PL_yyval
29#define yylval PL_yylval
30
31struct ysv {
32 short* yyss;
33 YYSTYPE* yyvs;
34 int oldyydebug;
35 int oldyynerrs;
36 int oldyyerrflag;
37 int oldyychar;
38 YYSTYPE oldyyval;
39 YYSTYPE oldyylval;
40};
41
c76ac1ee 42static void yydestruct(void *ptr);
43
44static void
45yydestruct(void *ptr)
46{
47 struct ysv* ysave = (struct ysv*)ptr;
48 if (ysave->yyss) Safefree(ysave->yyss);
49 if (ysave->yyvs) Safefree(ysave->yyvs);
50 yydebug = ysave->oldyydebug;
51 yynerrs = ysave->oldyynerrs;
52 yyerrflag = ysave->oldyyerrflag;
53 yychar = ysave->oldyychar;
54 yyval = ysave->oldyyval;
55 yylval = ysave->oldyylval;
56 Safefree(ysave);
57}
09bef843 58
8d063cd8 59%}
60
61%start prog
62
9d116dd7 63%{
09bef843 64#if 0 /* get this from perly.h instead */
9d116dd7 65%}
66
8d063cd8 67%union {
79072805 68 I32 ival;
69 char *pval;
70 OP *opval;
71 GV *gvval;
8d063cd8 72}
73
9d116dd7 74%{
09bef843 75#endif /* 0 */
a1a0e61e 76
77#ifdef USE_PURE_BISON
78#define YYLEX_PARAM (&yychar)
79#endif
09bef843 80
9d116dd7 81%}
82
fad39ff1 83%token <ival> '{'
f0fcb552 84
a0d0e21e 85%token <opval> WORD METHOD FUNCMETH THING PMFUNC PRIVATEREF
4633a7c4 86%token <opval> FUNC0SUB UNIOPSUB LSTOPSUB
79072805 87%token <pval> LABEL
a0d0e21e 88%token <ival> FORMAT SUB ANONSUB PACKAGE USE
79072805 89%token <ival> WHILE UNTIL IF UNLESS ELSE ELSIF CONTINUE FOR
90%token <ival> LOOPEX DOTDOT
36477c24 91%token <ival> FUNC0 FUNC1 FUNC UNIOP LSTOP
79072805 92%token <ival> RELOP EQOP MULOP ADDOP
55497cff 93%token <ival> DOLSHARP DO HASHBRACK NOAMP
09bef843 94%token <ival> LOCAL MY MYSUB
95%token COLONATTR
79072805 96
09bef843 97%type <ival> prog decl format startsub startanonsub startformsub
28757baa 98%type <ival> remember mremember '&'
bbce6d69 99%type <opval> block mblock lineseq line loop cond else
fad39ff1 100%type <opval> expr term subscripted scalar ary hsh arylen star amper sideff
bbce6d69 101%type <opval> argexpr nexpr texpr iexpr mexpr mnexpr mtexpr miexpr
44a8e56a 102%type <opval> listexpr listexprcom indirob listop method
103%type <opval> formname subname proto subbody cont my_scalar
09bef843 104%type <opval> subattrlist myattrlist mysubrout myattrterm myterm
79072805 105%type <pval> label
79072805 106
fad39ff1 107%nonassoc PREC_LOW
108%nonassoc LOOPEX
109
a0d0e21e 110%left <ival> OROP
463ee0b2 111%left ANDOP
c07a80fd 112%right NOTOP
36477c24 113%nonassoc LSTOP LSTOPSUB
8d063cd8 114%left ','
a0d0e21e 115%right <ival> ASSIGNOP
8d063cd8 116%right '?' ':'
117%nonassoc DOTDOT
118%left OROR
119%left ANDAND
79072805 120%left <ival> BITOROP
121%left <ival> BITANDOP
a687059c 122%nonassoc EQOP
123%nonassoc RELOP
36477c24 124%nonassoc UNIOP UNIOPSUB
79072805 125%left <ival> SHIFTOP
a687059c 126%left ADDOP
127%left MULOP
8990e307 128%left <ival> MATCHOP
79072805 129%right '!' '~' UMINUS REFGEN
130%right <ival> POWOP
131%nonassoc PREINC PREDEC POSTINC POSTDEC
8990e307 132%left ARROW
fad39ff1 133%nonassoc <ival> ')'
8d063cd8 134%left '('
fad39ff1 135%left '[' '{'
8d063cd8 136
137%% /* RULES */
138
ae986130 139prog : /* NULL */
140 {
141#if defined(YYDEBUG) && defined(DEBUGGING)
3280af22 142 yydebug = (PL_debug & 1);
ae986130 143#endif
3280af22 144 PL_expect = XSTATE;
ae986130 145 }
146 /*CONTINUED*/ lineseq
a0d0e21e 147 { newPROG($2); }
8d063cd8 148 ;
149
a687059c 150block : '{' remember lineseq '}'
3280af22 151 { if (PL_copline > (line_t)$1)
152 PL_copline = $1;
36477c24 153 $$ = block_end($2, $3); }
a0d0e21e 154 ;
155
55497cff 156remember: /* NULL */ /* start a full lexical scope */
157 { $$ = block_start(TRUE); }
158 ;
159
bbce6d69 160mblock : '{' mremember lineseq '}'
3280af22 161 { if (PL_copline > (line_t)$1)
162 PL_copline = $1;
36477c24 163 $$ = block_end($2, $3); }
55497cff 164 ;
165
166mremember: /* NULL */ /* start a partial lexical scope */
167 { $$ = block_start(FALSE); }
8d063cd8 168 ;
169
170lineseq : /* NULL */
79072805 171 { $$ = Nullop; }
172 | lineseq decl
173 { $$ = $1; }
8d063cd8 174 | lineseq line
463ee0b2 175 { $$ = append_list(OP_LINESEQ,
a0d0e21e 176 (LISTOP*)$1, (LISTOP*)$2);
3280af22 177 PL_pad_reset_pending = TRUE;
178 if ($1 && $2) PL_hints |= HINT_BLOCK_SCOPE; }
8d063cd8 179 ;
180
79072805 181line : label cond
182 { $$ = newSTATEOP(0, $1, $2); }
8d063cd8 183 | loop /* loops add their own labels */
184 | label ';'
185 { if ($1 != Nullch) {
79072805 186 $$ = newSTATEOP(0, $1, newOP(OP_NULL, 0));
450a55e4 187 }
188 else {
79072805 189 $$ = Nullop;
3280af22 190 PL_copline = NOLINE;
32c2e4fb 191 }
3280af22 192 PL_expect = XSTATE; }
8d063cd8 193 | label sideff ';'
79072805 194 { $$ = newSTATEOP(0, $1, $2);
3280af22 195 PL_expect = XSTATE; }
8d063cd8 196 ;
197
a687059c 198sideff : error
79072805 199 { $$ = Nullop; }
a687059c 200 | expr
79072805 201 { $$ = $1; }
a687059c 202 | expr IF expr
79072805 203 { $$ = newLOGOP(OP_AND, 0, $3, $1); }
a687059c 204 | expr UNLESS expr
79072805 205 { $$ = newLOGOP(OP_OR, 0, $3, $1); }
a687059c 206 | expr WHILE expr
8990e307 207 { $$ = newLOOPOP(OPf_PARENS, 1, scalar($3), $1); }
55497cff 208 | expr UNTIL iexpr
209 { $$ = newLOOPOP(OPf_PARENS, 1, $3, $1);}
ecca16b0 210 | expr FOR expr
211 { $$ = newFOROP(0, Nullch, $2,
212 Nullop, $3, $1, Nullop); }
79072805 213 ;
214
215else : /* NULL */
216 { $$ = Nullop; }
55497cff 217 | ELSE mblock
38a230cb 218 { ($2)->op_flags |= OPf_PARENS; $$ = scope($2); }
55497cff 219 | ELSIF '(' mexpr ')' mblock else
3280af22 220 { PL_copline = $1;
2c15bef3 221 $$ = newCONDOP(0, $3, scope($5), $6);
3280af22 222 PL_hints |= HINT_BLOCK_SCOPE; }
79072805 223 ;
224
55497cff 225cond : IF '(' remember mexpr ')' mblock else
3280af22 226 { PL_copline = $1;
36477c24 227 $$ = block_end($3,
bbce6d69 228 newCONDOP(0, $4, scope($6), $7)); }
55497cff 229 | UNLESS '(' remember miexpr ')' mblock else
3280af22 230 { PL_copline = $1;
36477c24 231 $$ = block_end($3,
bbce6d69 232 newCONDOP(0, $4, scope($6), $7)); }
79072805 233 ;
234
235cont : /* NULL */
236 { $$ = Nullop; }
237 | CONTINUE block
238 { $$ = scope($2); }
239 ;
240
55497cff 241loop : label WHILE '(' remember mtexpr ')' mblock cont
3280af22 242 { PL_copline = $2;
36477c24 243 $$ = block_end($4,
55497cff 244 newSTATEOP(0, $1,
bbce6d69 245 newWHILEOP(0, 1, (LOOP*)Nullop,
fb73857a 246 $2, $5, $7, $8))); }
55497cff 247 | label UNTIL '(' remember miexpr ')' mblock cont
3280af22 248 { PL_copline = $2;
36477c24 249 $$ = block_end($4,
55497cff 250 newSTATEOP(0, $1,
bbce6d69 251 newWHILEOP(0, 1, (LOOP*)Nullop,
fb73857a 252 $2, $5, $7, $8))); }
bbce6d69 253 | label FOR MY remember my_scalar '(' mexpr ')' mblock cont
36477c24 254 { $$ = block_end($4,
bbce6d69 255 newFOROP(0, $1, $2, $5, $7, $9, $10)); }
256 | label FOR scalar '(' remember mexpr ')' mblock cont
36477c24 257 { $$ = block_end($5,
bbce6d69 258 newFOROP(0, $1, $2, mod($3, OP_ENTERLOOP),
259 $6, $8, $9)); }
260 | label FOR '(' remember mexpr ')' mblock cont
36477c24 261 { $$ = block_end($4,
55497cff 262 newFOROP(0, $1, $2, Nullop, $5, $7, $8)); }
bbce6d69 263 | label FOR '(' remember mnexpr ';' mtexpr ';' mnexpr ')' mblock
8d063cd8 264 /* basically fake up an initialize-while lineseq */
fb73857a 265 { OP *forop = append_elem(OP_LINESEQ,
266 scalar($5),
267 newWHILEOP(0, 1, (LOOP*)Nullop,
268 $2, scalar($7),
269 $11, scalar($9)));
3280af22 270 PL_copline = $2;
fb73857a 271 $$ = block_end($4, newSTATEOP(0, $1, forop)); }
79072805 272 | label block cont /* a block is a loop that happens once */
fb73857a 273 { $$ = newSTATEOP(0, $1,
274 newWHILEOP(0, 1, (LOOP*)Nullop,
275 NOLINE, Nullop, $2, $3)); }
8d063cd8 276 ;
277
278nexpr : /* NULL */
79072805 279 { $$ = Nullop; }
8d063cd8 280 | sideff
281 ;
282
283texpr : /* NULL means true */
79072805 284 { (void)scan_num("1"); $$ = yylval.opval; }
8d063cd8 285 | expr
286 ;
287
55497cff 288iexpr : expr
289 { $$ = invert(scalar($1)); }
290 ;
291
292mexpr : expr
bbce6d69 293 { $$ = $1; intro_my(); }
294 ;
295
296mnexpr : nexpr
297 { $$ = $1; intro_my(); }
55497cff 298 ;
299
300mtexpr : texpr
bbce6d69 301 { $$ = $1; intro_my(); }
55497cff 302 ;
303
304miexpr : iexpr
bbce6d69 305 { $$ = $1; intro_my(); }
55497cff 306 ;
307
8d063cd8 308label : /* empty */
309 { $$ = Nullch; }
32c2e4fb 310 | LABEL
8d063cd8 311 ;
312
8d063cd8 313decl : format
314 { $$ = 0; }
315 | subrout
316 { $$ = 0; }
09bef843 317 | mysubrout
318 { $$ = 0; }
a687059c 319 | package
320 { $$ = 0; }
a0d0e21e 321 | use
85e6fe83 322 { $$ = 0; }
8d063cd8 323 ;
324
44a8e56a 325format : FORMAT startformsub formname block
a0d0e21e 326 { newFORM($2, $3, $4); }
44a8e56a 327 ;
328
329formname: WORD { $$ = $1; }
330 | /* NULL */ { $$ = Nullop; }
8d063cd8 331 ;
332
09bef843 333mysubrout: MYSUB startsub subname proto subattrlist subbody
334 { newMYSUB($2, $3, $4, $5, $6); }
335 ;
336
337subrout : SUB startsub subname proto subattrlist subbody
338 { newATTRSUB($2, $3, $4, $5, $6); }
28757baa 339 ;
340
fa83b5b6 341startsub: /* NULL */ /* start a regular subroutine scope */
774d564b 342 { $$ = start_subparse(FALSE, 0); }
28757baa 343 ;
344
345startanonsub: /* NULL */ /* start an anonymous subroutine scope */
774d564b 346 { $$ = start_subparse(FALSE, CVf_ANON); }
28757baa 347 ;
348
44a8e56a 349startformsub: /* NULL */ /* start a format subroutine scope */
774d564b 350 { $$ = start_subparse(TRUE, 0); }
44a8e56a 351 ;
352
2d8e6c8d 353subname : WORD { STRLEN n_a; char *name = SvPV(((SVOP*)$1)->op_sv,n_a);
e858de61 354 if (strEQ(name, "BEGIN") || strEQ(name, "END")
7d07dbc2 355 || strEQ(name, "INIT"))
1aff0e91 356 CvSPECIAL_on(PL_compcv);
28757baa 357 $$ = $1; }
a0d0e21e 358 ;
359
4633a7c4 360proto : /* NULL */
361 { $$ = Nullop; }
362 | THING
363 ;
28757baa 364
09bef843 365subattrlist: /* NULL */
366 { $$ = Nullop; }
367 | COLONATTR THING
368 { $$ = $2; }
369 | COLONATTR
370 { $$ = Nullop; }
371 ;
372
373myattrlist: COLONATTR THING
374 { $$ = $2; }
375 | COLONATTR
376 { $$ = Nullop; }
377 ;
378
28757baa 379subbody : block { $$ = $1; }
3280af22 380 | ';' { $$ = Nullop; PL_expect = XSTATE; }
8d063cd8 381 ;
382
a687059c 383package : PACKAGE WORD ';'
79072805 384 { package($2); }
93a17b20 385 | PACKAGE ';'
386 { package(Nullop); }
a687059c 387 ;
388
28757baa 389use : USE startsub
1aff0e91 390 { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ }
28757baa 391 WORD WORD listexpr ';'
392 { utilize($1, $2, $4, $5, $6); }
85e6fe83 393 ;
394
a0d0e21e 395expr : expr ANDOP expr
396 { $$ = newLOGOP(OP_AND, 0, $1, $3); }
397 | expr OROP expr
398 { $$ = newLOGOP($2, 0, $1, $3); }
fad39ff1 399 | argexpr %prec PREC_LOW
a0d0e21e 400 ;
401
402argexpr : argexpr ','
403 { $$ = $1; }
404 | argexpr ',' term
79072805 405 { $$ = append_elem(OP_LIST, $1, $3); }
fad39ff1 406 | term %prec PREC_LOW
8d063cd8 407 ;
408
a0d0e21e 409listop : LSTOP indirob argexpr
79072805 410 { $$ = convert($1, OPf_STACKED,
a0d0e21e 411 prepend_elem(OP_LIST, newGVREF($1,$2), $3) ); }
412 | FUNC '(' indirob expr ')'
79072805 413 { $$ = convert($1, OPf_STACKED,
a0d0e21e 414 prepend_elem(OP_LIST, newGVREF($1,$3), $4) ); }
415 | term ARROW method '(' listexprcom ')'
4633a7c4 416 { $$ = convert(OP_ENTERSUB, OPf_STACKED,
a0d0e21e 417 append_elem(OP_LIST,
55497cff 418 prepend_elem(OP_LIST, scalar($1), $5),
a0d0e21e 419 newUNOP(OP_METHOD, 0, $3))); }
b1524f17 420 | term ARROW method
421 { $$ = convert(OP_ENTERSUB, OPf_STACKED,
422 append_elem(OP_LIST, scalar($1),
423 newUNOP(OP_METHOD, 0, $3))); }
79072805 424 | METHOD indirob listexpr
4633a7c4 425 { $$ = convert(OP_ENTERSUB, OPf_STACKED,
a0d0e21e 426 append_elem(OP_LIST,
4633a7c4 427 prepend_elem(OP_LIST, $2, $3),
a0d0e21e 428 newUNOP(OP_METHOD, 0, $1))); }
429 | FUNCMETH indirob '(' listexprcom ')'
4633a7c4 430 { $$ = convert(OP_ENTERSUB, OPf_STACKED,
a0d0e21e 431 append_elem(OP_LIST,
4633a7c4 432 prepend_elem(OP_LIST, $2, $4),
a0d0e21e 433 newUNOP(OP_METHOD, 0, $1))); }
79072805 434 | LSTOP listexpr
435 { $$ = convert($1, 0, $2); }
a0d0e21e 436 | FUNC '(' listexprcom ')'
79072805 437 { $$ = convert($1, 0, $3); }
28757baa 438 | LSTOPSUB startanonsub block
09bef843 439 { $3 = newANONATTRSUB($2, 0, Nullop, $3); }
28757baa 440 listexpr %prec LSTOP
4633a7c4 441 { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
28757baa 442 append_elem(OP_LIST,
443 prepend_elem(OP_LIST, $3, $5), $1)); }
a687059c 444 ;
445
a0d0e21e 446method : METHOD
447 | scalar
448 ;
449
fad39ff1 450subscripted: star '{' expr ';' '}'
451 { $$ = newBINOP(OP_GELEM, 0, $1, scalar($3)); }
452 | scalar '[' expr ']'
453 { $$ = newBINOP(OP_AELEM, 0, oopsAV($1), scalar($3)); }
454 | term ARROW '[' expr ']'
455 { $$ = newBINOP(OP_AELEM, 0,
456 ref(newAVREF($1),OP_RV2AV),
457 scalar($4));}
458 | subscripted '[' expr ']'
459 { $$ = newBINOP(OP_AELEM, 0,
460 ref(newAVREF($1),OP_RV2AV),
461 scalar($3));}
462 | scalar '{' expr ';' '}'
463 { $$ = newBINOP(OP_HELEM, 0, oopsHV($1), jmaybe($3));
464 PL_expect = XOPERATOR; }
465 | term ARROW '{' expr ';' '}'
466 { $$ = newBINOP(OP_HELEM, 0,
467 ref(newHVREF($1),OP_RV2HV),
468 jmaybe($4));
469 PL_expect = XOPERATOR; }
470 | subscripted '{' expr ';' '}'
471 { $$ = newBINOP(OP_HELEM, 0,
472 ref(newHVREF($1),OP_RV2HV),
473 jmaybe($3));
474 PL_expect = XOPERATOR; }
475 | term ARROW '(' ')'
476 { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
477 newCVREF(0, scalar($1))); }
478 | term ARROW '(' expr ')'
479 { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
480 append_elem(OP_LIST, $4,
481 newCVREF(0, scalar($1)))); }
482
483 | subscripted '(' expr ')'
484 { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
485 append_elem(OP_LIST, $3,
486 newCVREF(0, scalar($1)))); }
487 | subscripted '(' ')'
488 { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
489 newCVREF(0, scalar($1))); }
490
491
492
a0d0e21e 493term : term ASSIGNOP term
494 { $$ = newASSIGNOP(OPf_STACKED, $1, $2, $3); }
495 | term POWOP term
79072805 496 { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
a0d0e21e 497 | term MULOP term
79072805 498 { if ($2 != OP_REPEAT)
499 scalar($1);
500 $$ = newBINOP($2, 0, $1, scalar($3)); }
a0d0e21e 501 | term ADDOP term
79072805 502 { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
a0d0e21e 503 | term SHIFTOP term
79072805 504 { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
a0d0e21e 505 | term RELOP term
79072805 506 { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
a0d0e21e 507 | term EQOP term
79072805 508 { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
a0d0e21e 509 | term BITANDOP term
79072805 510 { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
a0d0e21e 511 | term BITOROP term
79072805 512 { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
a0d0e21e 513 | term DOTDOT term
79072805 514 { $$ = newRANGE($2, scalar($1), scalar($3));}
a0d0e21e 515 | term ANDAND term
463ee0b2 516 { $$ = newLOGOP(OP_AND, 0, $1, $3); }
a0d0e21e 517 | term OROR term
463ee0b2 518 { $$ = newLOGOP(OP_OR, 0, $1, $3); }
a0d0e21e 519 | term '?' term ':' term
79072805 520 { $$ = newCONDOP(0, $1, $3, $5); }
a0d0e21e 521 | term MATCHOP term
79072805 522 { $$ = bind_match($2, $1, $3); }
8d063cd8 523
a0d0e21e 524 | '-' term %prec UMINUS
79072805 525 { $$ = newUNOP(OP_NEGATE, 0, scalar($2)); }
a687059c 526 | '+' term %prec UMINUS
527 { $$ = $2; }
8d063cd8 528 | '!' term
79072805 529 { $$ = newUNOP(OP_NOT, 0, scalar($2)); }
8d063cd8 530 | '~' term
79072805 531 { $$ = newUNOP(OP_COMPLEMENT, 0, scalar($2));}
532 | REFGEN term
a0d0e21e 533 { $$ = newUNOP(OP_REFGEN, 0, mod($2,OP_REFGEN)); }
79072805 534 | term POSTINC
535 { $$ = newUNOP(OP_POSTINC, 0,
463ee0b2 536 mod(scalar($1), OP_POSTINC)); }
79072805 537 | term POSTDEC
538 { $$ = newUNOP(OP_POSTDEC, 0,
463ee0b2 539 mod(scalar($1), OP_POSTDEC)); }
79072805 540 | PREINC term
541 { $$ = newUNOP(OP_PREINC, 0,
463ee0b2 542 mod(scalar($2), OP_PREINC)); }
79072805 543 | PREDEC term
544 { $$ = newUNOP(OP_PREDEC, 0,
463ee0b2 545 mod(scalar($2), OP_PREDEC)); }
09bef843 546 | myattrterm %prec UNIOP
547 { $$ = $1; }
548 | LOCAL term %prec UNIOP
93a17b20 549 { $$ = localize($2,$1); }
a0d0e21e 550 | '(' expr ')'
79072805 551 { $$ = sawparens($2); }
8d063cd8 552 | '(' ')'
8990e307 553 { $$ = sawparens(newNULLLIST()); }
fad39ff1 554 | '[' expr ']'
79072805 555 { $$ = newANONLIST($2); }
fad39ff1 556 | '[' ']'
79072805 557 { $$ = newANONLIST(Nullop); }
a0d0e21e 558 | HASHBRACK expr ';' '}' %prec '('
79072805 559 { $$ = newANONHASH($2); }
560 | HASHBRACK ';' '}' %prec '('
561 { $$ = newANONHASH(Nullop); }
09bef843 562 | ANONSUB startanonsub proto subattrlist block %prec '('
563 { $$ = newANONATTRSUB($2, $3, $4, $5); }
79072805 564 | scalar %prec '('
8d063cd8 565 { $$ = $1; }
79072805 566 | star %prec '('
8d063cd8 567 { $$ = $1; }
79072805 568 | hsh %prec '('
8d063cd8 569 { $$ = $1; }
79072805 570 | ary %prec '('
8d063cd8 571 { $$ = $1; }
79072805 572 | arylen %prec '('
573 { $$ = newUNOP(OP_AV2ARYLEN, 0, ref($1, OP_AV2ARYLEN));}
fad39ff1 574 | subscripted
575 { $$ = $1; }
576 | '(' expr ')' '[' expr ']'
79072805 577 { $$ = newSLICEOP(0, $5, $2); }
fad39ff1 578 | '(' ')' '[' expr ']'
79072805 579 { $$ = newSLICEOP(0, $4, Nullop); }
fad39ff1 580 | ary '[' expr ']'
79072805 581 { $$ = prepend_elem(OP_ASLICE,
582 newOP(OP_PUSHMARK, 0),
79072805 583 newLISTOP(OP_ASLICE, 0,
584 list($3),
a0d0e21e 585 ref($1, OP_ASLICE))); }
fad39ff1 586 | ary '{' expr ';' '}'
79072805 587 { $$ = prepend_elem(OP_HSLICE,
588 newOP(OP_PUSHMARK, 0),
79072805 589 newLISTOP(OP_HSLICE, 0,
590 list($3),
a0d0e21e 591 ref(oopsHV($1), OP_HSLICE)));
3280af22 592 PL_expect = XOPERATOR; }
79072805 593 | THING %prec '('
594 { $$ = $1; }
595 | amper
c07a80fd 596 { $$ = newUNOP(OP_ENTERSUB, 0, scalar($1)); }
79072805 597 | amper '(' ')'
a0d0e21e 598 { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar($1)); }
599 | amper '(' expr ')'
600 { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
4633a7c4 601 append_elem(OP_LIST, $3, scalar($1))); }
93a17b20 602 | NOAMP WORD listexpr
a0d0e21e 603 { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
a5f75d66 604 append_elem(OP_LIST, $3, scalar($2))); }
a0d0e21e 605 | DO term %prec UNIOP
78ca652e 606 { $$ = dofile($2); }
79072805 607 | DO block %prec '('
608 { $$ = newUNOP(OP_NULL, OPf_SPECIAL, scope($2)); }
8d063cd8 609 | DO WORD '(' ')'
c07a80fd 610 { $$ = newUNOP(OP_ENTERSUB,
611 OPf_SPECIAL|OPf_STACKED,
4633a7c4 612 prepend_elem(OP_LIST,
c07a80fd 613 scalar(newCVREF(
614 (OPpENTERSUB_AMPER<<8),
615 scalar($2)
616 )),Nullop)); dep();}
a0d0e21e 617 | DO WORD '(' expr ')'
c07a80fd 618 { $$ = newUNOP(OP_ENTERSUB,
619 OPf_SPECIAL|OPf_STACKED,
4633a7c4 620 append_elem(OP_LIST,
a0d0e21e 621 $4,
c07a80fd 622 scalar(newCVREF(
623 (OPpENTERSUB_AMPER<<8),
624 scalar($2)
625 )))); dep();}
79072805 626 | DO scalar '(' ')'
a0d0e21e 627 { $$ = newUNOP(OP_ENTERSUB, OPf_SPECIAL|OPf_STACKED,
4633a7c4 628 prepend_elem(OP_LIST,
c07a80fd 629 scalar(newCVREF(0,scalar($2))), Nullop)); dep();}
a0d0e21e 630 | DO scalar '(' expr ')'
631 { $$ = newUNOP(OP_ENTERSUB, OPf_SPECIAL|OPf_STACKED,
4633a7c4 632 prepend_elem(OP_LIST,
a0d0e21e 633 $4,
c07a80fd 634 scalar(newCVREF(0,scalar($2))))); dep();}
8d063cd8 635 | LOOPEX
85e6fe83 636 { $$ = newOP($1, OPf_SPECIAL);
3280af22 637 PL_hints |= HINT_BLOCK_SCOPE; }
a0d0e21e 638 | LOOPEX term
8990e307 639 { $$ = newLOOPEX($1,$2); }
c07a80fd 640 | NOTOP argexpr
641 { $$ = newUNOP(OP_NOT, 0, scalar($2)); }
8d063cd8 642 | UNIOP
79072805 643 { $$ = newOP($1, 0); }
f0fcb552 644 | UNIOP block
79072805 645 { $$ = newUNOP($1, 0, $2); }
a0d0e21e 646 | UNIOP term
79072805 647 { $$ = newUNOP($1, 0, $2); }
4633a7c4 648 | UNIOPSUB term
649 { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
650 append_elem(OP_LIST, $2, scalar($1))); }
8d063cd8 651 | FUNC0
79072805 652 { $$ = newOP($1, 0); }
ae986130 653 | FUNC0 '(' ')'
79072805 654 { $$ = newOP($1, 0); }
4633a7c4 655 | FUNC0SUB
28757baa 656 { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
4633a7c4 657 scalar($1)); }
03a14243 658 | FUNC1 '(' ')'
79072805 659 { $$ = newOP($1, OPf_SPECIAL); }
8d063cd8 660 | FUNC1 '(' expr ')'
79072805 661 { $$ = newUNOP($1, 0, $3); }
a0d0e21e 662 | PMFUNC '(' term ')'
79072805 663 { $$ = pmruntime($1, $3, Nullop); }
a0d0e21e 664 | PMFUNC '(' term ',' term ')'
79072805 665 { $$ = pmruntime($1, $3, $5); }
666 | WORD
378cc40b 667 | listop
8d063cd8 668 ;
669
09bef843 670myattrterm: MY myterm myattrlist
671 { $$ = my_attrs($2,$3); }
672 | MY myterm
673 { $$ = localize($2,$1); }
674 ;
675
676myterm : '(' expr ')'
677 { $$ = sawparens($2); }
678 | '(' ')'
679 { $$ = sawparens(newNULLLIST()); }
680 | scalar %prec '('
681 { $$ = $1; }
682 | hsh %prec '('
683 { $$ = $1; }
684 | ary %prec '('
685 { $$ = $1; }
686 ;
687
fad39ff1 688listexpr: /* NULL */ %prec PREC_LOW
8990e307 689 { $$ = Nullop; }
fad39ff1 690 | argexpr %prec PREC_LOW
a0d0e21e 691 { $$ = $1; }
692 ;
693
694listexprcom: /* NULL */
695 { $$ = Nullop; }
79072805 696 | expr
697 { $$ = $1; }
a0d0e21e 698 | expr ','
699 { $$ = $1; }
79072805 700 ;
701
55497cff 702my_scalar: scalar
3280af22 703 { PL_in_my = 0; $$ = my($1); }
55497cff 704 ;
705
79072805 706amper : '&' indirob
c07a80fd 707 { $$ = newCVREF($1,$2); }
a687059c 708 ;
709
79072805 710scalar : '$' indirob
711 { $$ = newSVREF($2); }
a687059c 712 ;
713
79072805 714ary : '@' indirob
715 { $$ = newAVREF($2); }
716 ;
717
718hsh : '%' indirob
719 { $$ = newHVREF($2); }
720 ;
721
722arylen : DOLSHARP indirob
723 { $$ = newAVREF($2); }
724 ;
725
726star : '*' indirob
a0d0e21e 727 { $$ = newGVREF(0,$2); }
79072805 728 ;
729
730indirob : WORD
731 { $$ = scalar($1); }
fad39ff1 732 | scalar %prec PREC_LOW
463ee0b2 733 { $$ = scalar($1); }
79072805 734 | block
a0d0e21e 735 { $$ = scope($1); }
79072805 736
93a17b20 737 | PRIVATEREF
738 { $$ = $1; }
8d063cd8 739 ;
740
741%% /* PROGRAM */
09bef843 742
743/* more stuff added to make perly_c.diff easier to apply */
744
745#ifdef yyparse
746#undef yyparse
747#endif
748#define yyparse() Perl_yyparse(pTHX)
749