xref: /openbsd/gnu/usr.bin/perl/perly.y (revision e0680481)
1e2e5c5d3Smillert /*    perly.y
2e2e5c5d3Smillert  *
37bfa9f44Smillert  *    Copyright (c) 1991-2002, 2003, 2004, 2005, 2006 Larry Wall
448950c12Ssthen  *    Copyright (c) 2007, 2008, 2009, 2010, 2011 by Larry Wall and others
5e2e5c5d3Smillert  *
6e2e5c5d3Smillert  *    You may distribute under the terms of either the GNU General Public
7e2e5c5d3Smillert  *    License or the Artistic License, as specified in the README file.
8e2e5c5d3Smillert  *
9e2e5c5d3Smillert  */
10e2e5c5d3Smillert 
11e2e5c5d3Smillert /*
12e2e5c5d3Smillert  * 'I see,' laughed Strider.  'I look foul and feel fair.  Is that it?
13e2e5c5d3Smillert  *  All that is gold does not glitter, not all those who wander are lost.'
147bfa9f44Smillert  *
15df042708Smillert  *     [p.171 of _The Lord of the Rings_, I/x: "Strider"]
16df042708Smillert  */
17df042708Smillert 
18df042708Smillert /*
197bfa9f44Smillert  * This file holds the grammar for the Perl language. If edited, you need
20f3142520Smillert  * to run regen_perly.pl, which re-creates the files perly.h, perly.tab
21f3142520Smillert  * and perly.act which are derived from this.
22f3142520Smillert  *
2356d68f1eSafresh1  * The main job of this grammar is to call the various newFOO()
24f3142520Smillert  * functions in op.c to build a syntax tree of OP structs.
25f3142520Smillert  * It relies on the lexer in toke.c to do the tokenizing.
267bfa9f44Smillert  *
277bfa9f44Smillert  * Note: due to the way that the cleanup code works WRT to freeing ops on
287bfa9f44Smillert  * the parse stack, it is dangerous to assign to the $n variables within
297bfa9f44Smillert  * an action.
30f3142520Smillert  */
31f3142520Smillert 
327bfa9f44Smillert /*  Make the parser re-entrant. */
33e2e5c5d3Smillert 
34eac174f2Safresh1 %define api.pure
35e2e5c5d3Smillert 
3648950c12Ssthen %start grammar
37e2e5c5d3Smillert 
38e2e5c5d3Smillert %union {
397bfa9f44Smillert     I32	ival; /* __DEFAULT__ (marker for regen_perly.pl;
407bfa9f44Smillert 				must always be 1st union member) */
41*e0680481Safresh1     void *pval;
42e2e5c5d3Smillert     OP *opval;
43e2e5c5d3Smillert     GV *gvval;
44e2e5c5d3Smillert }
45e2e5c5d3Smillert 
4656d68f1eSafresh1 %token <ival> GRAMPROG GRAMEXPR GRAMBLOCK GRAMBARESTMT GRAMFULLSTMT GRAMSTMTSEQ GRAMSUBSIGNATURE
4748950c12Ssthen 
48*e0680481Safresh1 /* Tokens emitted by toke.c for simple punctiation characters - &, {, }, etc... */
49eac174f2Safresh1 %token <ival> PERLY_AMPERSAND
50eac174f2Safresh1 %token <ival> PERLY_BRACE_OPEN
51eac174f2Safresh1 %token <ival> PERLY_BRACE_CLOSE
52eac174f2Safresh1 %token <ival> PERLY_BRACKET_OPEN
53eac174f2Safresh1 %token <ival> PERLY_BRACKET_CLOSE
54eac174f2Safresh1 %token <ival> PERLY_COMMA
55eac174f2Safresh1 %token <ival> PERLY_DOLLAR
56eac174f2Safresh1 %token <ival> PERLY_DOT
57eac174f2Safresh1 %token <ival> PERLY_EQUAL_SIGN
58eac174f2Safresh1 %token <ival> PERLY_MINUS
59eac174f2Safresh1 %token <ival> PERLY_PERCENT_SIGN
60eac174f2Safresh1 %token <ival> PERLY_PLUS
61eac174f2Safresh1 %token <ival> PERLY_SEMICOLON
62eac174f2Safresh1 %token <ival> PERLY_SLASH
63eac174f2Safresh1 %token <ival> PERLY_SNAIL
64eac174f2Safresh1 %token <ival> PERLY_STAR
65e2e5c5d3Smillert 
66*e0680481Safresh1 /* Tokens emitted by toke.c on simple keywords */
67*e0680481Safresh1 %token <ival> KW_FORMAT KW_PACKAGE KW_CLASS
68*e0680481Safresh1 %token <ival> KW_LOCAL KW_MY KW_FIELD
69*e0680481Safresh1 %token <ival> KW_IF KW_ELSE KW_ELSIF KW_UNLESS
70*e0680481Safresh1 %token <ival> KW_FOR KW_UNTIL KW_WHILE KW_CONTINUE
71*e0680481Safresh1 %token <ival> KW_GIVEN KW_WHEN KW_DEFAULT
72*e0680481Safresh1 %token <ival> KW_TRY KW_CATCH KW_FINALLY KW_DEFER
73*e0680481Safresh1 %token <ival> KW_REQUIRE KW_DO
74*e0680481Safresh1 
75*e0680481Safresh1 /* The 'use' and 'no' keywords both emit this */
76*e0680481Safresh1 %token <ival> KW_USE_or_NO
77*e0680481Safresh1 
78*e0680481Safresh1 /* The 'sub' keyword is a bit special; four different tokens depending on
79*e0680481Safresh1  *   named-vs-anon, and whether signatures are in effect */
80*e0680481Safresh1 %token <ival> KW_SUB_named KW_SUB_named_sig KW_SUB_anon KW_SUB_anon_sig
81*e0680481Safresh1 %token <ival> KW_METHOD_named KW_METHOD_anon
82*e0680481Safresh1 
83*e0680481Safresh1 /* Tokens emitted in other situations */
84*e0680481Safresh1 %token <opval> BAREWORD METHCALL0 METHCALL THING PMFUNC PRIVATEREF QWLIST
8548950c12Ssthen %token <opval> FUNC0OP FUNC0SUB UNIOPSUB LSTOPSUB
860dc2eaceSmillert %token <opval> PLUGEXPR PLUGSTMT
87b46d8ef2Safresh1 %token <opval> LABEL
88b8851fccSafresh1 %token <ival> LOOPEX DOTDOT YADAYADA
89b8851fccSafresh1 %token <ival> FUNC0 FUNC1 FUNC UNIOP LSTOP
90*e0680481Safresh1 %token <ival> POWOP MULOP ADDOP
91*e0680481Safresh1 %token <ival> DOLSHARP HASHBRACK NOAMP
92b8851fccSafresh1 %token <ival> COLONATTR FORMLBRACK FORMRBRACK
9356d68f1eSafresh1 %token <ival> SUBLEXSTART SUBLEXEND
94*e0680481Safresh1 %token <ival> PHASER
9548950c12Ssthen 
9648950c12Ssthen %type <ival> grammar remember mremember
97*e0680481Safresh1 %type <ival>  startsub startanonsub startanonmethod startformsub
98b8851fccSafresh1 
99e9ce3842Safresh1 %type <ival> mintro
1007bfa9f44Smillert 
101*e0680481Safresh1 %type <ival>  sigsub_or_method_named
102eac174f2Safresh1 %type <opval> stmtseq fullstmt labfullstmt barestmt block mblock else finally
103e2e5c5d3Smillert %type <opval> expr term subscripted scalar ary hsh arylen star amper sideff
104eac174f2Safresh1 %type <opval> condition
105*e0680481Safresh1 %type <opval> catch_paren
106eac174f2Safresh1 %type <opval> empty
107e5157e49Safresh1 %type <opval> sliceme kvslice gelem
108b8851fccSafresh1 %type <opval> listexpr nexpr texpr iexpr mexpr mnexpr
109*e0680481Safresh1 %type <opval> optlistexpr optexpr optrepl indirob listop methodname
1109f11ffb7Safresh1 %type <opval> formname subname proto cont my_scalar my_var
111eac174f2Safresh1 %type <opval> list_of_scalars my_list_of_scalars refgen_topic formblock
1127bfa9f44Smillert %type <opval> subattrlist myattrlist myattrterm myterm
113*e0680481Safresh1 %type <pval>  fieldvar /* pval is PADNAME */
114*e0680481Safresh1 %type <opval> optfieldattrlist fielddecl
1159f11ffb7Safresh1 %type <opval> termbinop termunop anonymous termdo
11656d68f1eSafresh1 %type <opval> termrelop relopchain termeqop eqopchain
1179f11ffb7Safresh1 %type <ival>  sigslurpsigil
1189f11ffb7Safresh1 %type <opval> sigvarname sigdefault sigscalarelem sigslurpelem
119eac174f2Safresh1 %type <opval> sigelem siglist optsiglist subsigguts subsignature optsubsignature
1209f11ffb7Safresh1 %type <opval> subbody optsubbody sigsubbody optsigsubbody
121e9ce3842Safresh1 %type <opval> formstmtseq formline formarg
122e2e5c5d3Smillert 
123b8851fccSafresh1 %nonassoc <ival> PREC_LOW
124e2e5c5d3Smillert %nonassoc LOOPEX
125e2e5c5d3Smillert 
126*e0680481Safresh1 %nonassoc <pval> PLUGIN_LOW_OP
127*e0680481Safresh1 %left <ival> OROP <pval> PLUGIN_LOGICAL_OR_LOW_OP
128*e0680481Safresh1 %left <ival> ANDOP <pval> PLUGIN_LOGICAL_AND_LOW_OP
129b8851fccSafresh1 %right <ival> NOTOP
130e2e5c5d3Smillert %nonassoc LSTOP LSTOPSUB
131eac174f2Safresh1 %left PERLY_COMMA
132*e0680481Safresh1 %right <ival> ASSIGNOP <pval> PLUGIN_ASSIGN_OP
133eac174f2Safresh1 %right <ival> PERLY_QUESTION_MARK PERLY_COLON
1349f11ffb7Safresh1 %nonassoc DOTDOT
135*e0680481Safresh1 %left <ival> OROR DORDOR <pval> PLUGIN_LOGICAL_OR_OP
136*e0680481Safresh1 %left <ival> ANDAND <pval> PLUGIN_LOGICAL_AND_OP
137b8851fccSafresh1 %left <ival> BITOROP
138b8851fccSafresh1 %left <ival> BITANDOP
13956d68f1eSafresh1 %left <ival> CHEQOP NCEQOP
14056d68f1eSafresh1 %left <ival> CHRELOP NCRELOP
141*e0680481Safresh1 %nonassoc <pval> PLUGIN_REL_OP
142e2e5c5d3Smillert %nonassoc UNIOP UNIOPSUB
143*e0680481Safresh1 %nonassoc KW_REQUIRE
144b8851fccSafresh1 %left <ival> SHIFTOP
145*e0680481Safresh1 %left ADDOP <pval> PLUGIN_ADD_OP
146*e0680481Safresh1 %left MULOP <pval> PLUGIN_MUL_OP
147b8851fccSafresh1 %left <ival> MATCHOP
148eac174f2Safresh1 %right <ival> PERLY_EXCLAMATION_MARK PERLY_TILDE UMINUS REFGEN
149*e0680481Safresh1 %right POWOP <pval> PLUGIN_POW_OP
150b8851fccSafresh1 %nonassoc <ival> PREINC PREDEC POSTINC POSTDEC POSTJOIN
151*e0680481Safresh1 %nonassoc <pval> PLUGIN_HIGH_OP
152b8851fccSafresh1 %left <ival> ARROW
153eac174f2Safresh1 %nonassoc <ival> PERLY_PAREN_CLOSE
154eac174f2Safresh1 %left <ival> PERLY_PAREN_OPEN
155eac174f2Safresh1 %left PERLY_BRACKET_OPEN PERLY_BRACE_OPEN
156e2e5c5d3Smillert 
157e2e5c5d3Smillert %% /* RULES */
158e2e5c5d3Smillert 
15948950c12Ssthen /* Top-level choice of what kind of thing yyparse was called to parse */
16048950c12Ssthen grammar	:	GRAMPROG
16148950c12Ssthen 			{
162b8851fccSafresh1 			  parser->expect = XSTATE;
1639f11ffb7Safresh1                           $<ival>$ = 0;
16448950c12Ssthen 			}
16548950c12Ssthen 		remember stmtseq
16648950c12Ssthen 			{
167eac174f2Safresh1 			  newPROG(block_end($remember,$stmtseq));
168b8851fccSafresh1 			  PL_compiling.cop_seq = 0;
16948950c12Ssthen 			  $$ = 0;
17048950c12Ssthen 			}
17148950c12Ssthen 	|	GRAMEXPR
17248950c12Ssthen 			{
17348950c12Ssthen 			  parser->expect = XTERM;
1749f11ffb7Safresh1                           $<ival>$ = 0;
17548950c12Ssthen 			}
17648950c12Ssthen 		optexpr
17748950c12Ssthen 			{
178eac174f2Safresh1 			  PL_eval_root = $optexpr;
17948950c12Ssthen 			  $$ = 0;
18048950c12Ssthen 			}
18148950c12Ssthen 	|	GRAMBLOCK
18248950c12Ssthen 			{
18348950c12Ssthen 			  parser->expect = XBLOCK;
1849f11ffb7Safresh1                           $<ival>$ = 0;
18548950c12Ssthen 			}
18648950c12Ssthen 		block
18748950c12Ssthen 			{
18848950c12Ssthen 			  PL_pad_reset_pending = TRUE;
189eac174f2Safresh1 			  PL_eval_root = $block;
19048950c12Ssthen 			  $$ = 0;
19148950c12Ssthen 			  yyunlex();
1929f11ffb7Safresh1 			  parser->yychar = yytoken = YYEOF;
19348950c12Ssthen 			}
19448950c12Ssthen 	|	GRAMBARESTMT
19548950c12Ssthen 			{
19648950c12Ssthen 			  parser->expect = XSTATE;
1979f11ffb7Safresh1                           $<ival>$ = 0;
19848950c12Ssthen 			}
19948950c12Ssthen 		barestmt
20048950c12Ssthen 			{
20148950c12Ssthen 			  PL_pad_reset_pending = TRUE;
202eac174f2Safresh1 			  PL_eval_root = $barestmt;
20348950c12Ssthen 			  $$ = 0;
20448950c12Ssthen 			  yyunlex();
2059f11ffb7Safresh1 			  parser->yychar = yytoken = YYEOF;
20648950c12Ssthen 			}
20748950c12Ssthen 	|	GRAMFULLSTMT
20848950c12Ssthen 			{
20948950c12Ssthen 			  parser->expect = XSTATE;
2109f11ffb7Safresh1                           $<ival>$ = 0;
21148950c12Ssthen 			}
21248950c12Ssthen 		fullstmt
21348950c12Ssthen 			{
21448950c12Ssthen 			  PL_pad_reset_pending = TRUE;
215eac174f2Safresh1 			  PL_eval_root = $fullstmt;
21648950c12Ssthen 			  $$ = 0;
21748950c12Ssthen 			  yyunlex();
2189f11ffb7Safresh1 			  parser->yychar = yytoken = YYEOF;
21948950c12Ssthen 			}
22048950c12Ssthen 	|	GRAMSTMTSEQ
22148950c12Ssthen 			{
22248950c12Ssthen 			  parser->expect = XSTATE;
2239f11ffb7Safresh1                           $<ival>$ = 0;
22448950c12Ssthen 			}
22548950c12Ssthen 		stmtseq
22648950c12Ssthen 			{
227eac174f2Safresh1 			  PL_eval_root = $stmtseq;
22848950c12Ssthen 			  $$ = 0;
22948950c12Ssthen 			}
23056d68f1eSafresh1 	|	GRAMSUBSIGNATURE
23156d68f1eSafresh1 			{
23256d68f1eSafresh1 			  parser->expect = XSTATE;
23356d68f1eSafresh1 			  $<ival>$ = 0;
23456d68f1eSafresh1 			}
23556d68f1eSafresh1 		subsigguts
23656d68f1eSafresh1 			{
237eac174f2Safresh1 			  PL_eval_root = $subsigguts;
23856d68f1eSafresh1 			  $$ = 0;
23956d68f1eSafresh1 			}
240e2e5c5d3Smillert 	;
241e2e5c5d3Smillert 
242*e0680481Safresh1 /* Either a signatured 'sub' or 'method' keyword */
243*e0680481Safresh1 sigsub_or_method_named
244*e0680481Safresh1 	:	KW_SUB_named_sig
245*e0680481Safresh1 			{ $$ = KW_SUB_named_sig; }
246*e0680481Safresh1 	|	KW_METHOD_named
247*e0680481Safresh1 			{ $$ = KW_METHOD_named; }
248*e0680481Safresh1 	;
249*e0680481Safresh1 
25079cd0b9aSmillert /* An ordinary block */
251eac174f2Safresh1 block	:	PERLY_BRACE_OPEN remember stmtseq PERLY_BRACE_CLOSE
252eac174f2Safresh1 			{ if (parser->copline > (line_t)$PERLY_BRACE_OPEN)
253eac174f2Safresh1 			      parser->copline = (line_t)$PERLY_BRACE_OPEN;
254eac174f2Safresh1 			  $$ = block_end($remember, $stmtseq);
2557bfa9f44Smillert 			}
256e2e5c5d3Smillert 	;
257e2e5c5d3Smillert 
258eac174f2Safresh1 empty
259eac174f2Safresh1 	:	%empty          { $$ = NULL; }
260eac174f2Safresh1 	;
261eac174f2Safresh1 
262e9ce3842Safresh1 /* format body */
263eac174f2Safresh1 formblock:	PERLY_EQUAL_SIGN remember PERLY_SEMICOLON FORMRBRACK formstmtseq PERLY_SEMICOLON PERLY_DOT
264eac174f2Safresh1 			{ if (parser->copline > (line_t)$PERLY_EQUAL_SIGN)
265eac174f2Safresh1 			      parser->copline = (line_t)$PERLY_EQUAL_SIGN;
266eac174f2Safresh1 			  $$ = block_end($remember, $formstmtseq);
267e9ce3842Safresh1 			}
268e2e5c5d3Smillert 	;
269e2e5c5d3Smillert 
270eac174f2Safresh1 remember:	%empty	/* start a full lexical scope */
271b8851fccSafresh1 			{ $$ = block_start(TRUE);
272b8851fccSafresh1 			  parser->parsed_sub = 0; }
2737bfa9f44Smillert 	;
2747bfa9f44Smillert 
275eac174f2Safresh1 mblock	:	PERLY_BRACE_OPEN mremember stmtseq PERLY_BRACE_CLOSE
276eac174f2Safresh1 			{ if (parser->copline > (line_t)$PERLY_BRACE_OPEN)
277eac174f2Safresh1 			      parser->copline = (line_t)$PERLY_BRACE_OPEN;
278eac174f2Safresh1 			  $$ = block_end($mremember, $stmtseq);
2797bfa9f44Smillert 			}
280e2e5c5d3Smillert 	;
281e2e5c5d3Smillert 
282eac174f2Safresh1 mremember:	%empty	/* start a partial lexical scope */
283b8851fccSafresh1 			{ $$ = block_start(FALSE);
284b8851fccSafresh1 			  parser->parsed_sub = 0; }
285e2e5c5d3Smillert 	;
286e2e5c5d3Smillert 
287*e0680481Safresh1 /* The parenthesized variable of a catch block */
288*e0680481Safresh1 catch_paren:	empty
289*e0680481Safresh1 			/* not really valid grammar but we detect it in the
290*e0680481Safresh1 			 * action block to throw a nicer error message */
291*e0680481Safresh1 	|	PERLY_PAREN_OPEN
292*e0680481Safresh1 			{ parser->in_my = 1; }
293*e0680481Safresh1 		scalar
294*e0680481Safresh1 			{ parser->in_my = 0; intro_my(); }
295*e0680481Safresh1 		PERLY_PAREN_CLOSE
296*e0680481Safresh1 			{ $$ = $scalar; }
297*e0680481Safresh1 	;
298*e0680481Safresh1 
29948950c12Ssthen /* A sequence of statements in the program */
300eac174f2Safresh1 stmtseq
301eac174f2Safresh1 	:	empty
302eac174f2Safresh1 	|	stmtseq[list] fullstmt
303eac174f2Safresh1 			{   $$ = op_append_list(OP_LINESEQ, $list, $fullstmt);
304e2e5c5d3Smillert 			    PL_pad_reset_pending = TRUE;
305eac174f2Safresh1 			    if ($list && $fullstmt)
3067bfa9f44Smillert 				PL_hints |= HINT_BLOCK_SCOPE;
3077bfa9f44Smillert 			}
308e2e5c5d3Smillert 	;
309e2e5c5d3Smillert 
310e9ce3842Safresh1 /* A sequence of format lines */
311eac174f2Safresh1 formstmtseq
312eac174f2Safresh1 	:	empty
313eac174f2Safresh1 	|	formstmtseq[list] formline
314eac174f2Safresh1 			{   $$ = op_append_list(OP_LINESEQ, $list, $formline);
315e9ce3842Safresh1 			    PL_pad_reset_pending = TRUE;
316eac174f2Safresh1 			    if ($list && $formline)
317e9ce3842Safresh1 				PL_hints |= HINT_BLOCK_SCOPE;
318e9ce3842Safresh1 			}
319e9ce3842Safresh1 	;
320e9ce3842Safresh1 
32148950c12Ssthen /* A statement in the program, including optional labels */
32248950c12Ssthen fullstmt:	barestmt
3237bfa9f44Smillert 			{
324eac174f2Safresh1 			  $$ = $barestmt ? newSTATEOP(0, NULL, $barestmt) : NULL;
32548950c12Ssthen 			}
32648950c12Ssthen 	|	labfullstmt
327eac174f2Safresh1 			{ $$ = $labfullstmt; }
32848950c12Ssthen 	;
32948950c12Ssthen 
33048950c12Ssthen labfullstmt:	LABEL barestmt
33148950c12Ssthen 			{
332eac174f2Safresh1                           SV *label = cSVOPx_sv($LABEL);
333b46d8ef2Safresh1 			  $$ = newSTATEOP(SvFLAGS(label) & SVf_UTF8,
334eac174f2Safresh1                                             savepv(SvPVX_const(label)), $barestmt);
335eac174f2Safresh1                           op_free($LABEL);
33648950c12Ssthen 			}
337eac174f2Safresh1 	|	LABEL labfullstmt[list]
33848950c12Ssthen 			{
339eac174f2Safresh1                           SV *label = cSVOPx_sv($LABEL);
340b46d8ef2Safresh1 			  $$ = newSTATEOP(SvFLAGS(label) & SVf_UTF8,
341eac174f2Safresh1                                             savepv(SvPVX_const(label)), $list);
342eac174f2Safresh1                           op_free($LABEL);
34348950c12Ssthen 			}
34448950c12Ssthen 	;
34548950c12Ssthen 
34648950c12Ssthen /* A bare statement, lacking label and other aspects of state op */
34748950c12Ssthen barestmt:	PLUGSTMT
348eac174f2Safresh1 			{ $$ = $PLUGSTMT; }
349*e0680481Safresh1 	|	KW_FORMAT startformsub formname formblock
35048950c12Ssthen 			{
35148950c12Ssthen 			  CV *fmtcv = PL_compcv;
352eac174f2Safresh1 			  newFORM($startformsub, $formname, $formblock);
3539f11ffb7Safresh1 			  $$ = NULL;
354e9ce3842Safresh1 			  if (CvOUTSIDE(fmtcv) && !CvEVAL(CvOUTSIDE(fmtcv))) {
355b8851fccSafresh1 			      pad_add_weakref(fmtcv);
35648950c12Ssthen 			  }
357b8851fccSafresh1 			  parser->parsed_sub = 1;
35848950c12Ssthen 			}
359*e0680481Safresh1 	|	KW_SUB_named subname startsub
3609f11ffb7Safresh1                     /* sub declaration or definition not within scope
3619f11ffb7Safresh1                        of 'use feature "signatures"'*/
362e9ce3842Safresh1 			{
363eac174f2Safresh1                           init_named_cv(PL_compcv, $subname);
364b8851fccSafresh1 			  parser->in_my = 0;
365b8851fccSafresh1 			  parser->in_my_stash = NULL;
366e9ce3842Safresh1 			}
367e5157e49Safresh1                     proto subattrlist optsubbody
36848950c12Ssthen 			{
36948950c12Ssthen 			  SvREFCNT_inc_simple_void(PL_compcv);
370eac174f2Safresh1 			  $subname->op_type == OP_CONST
371eac174f2Safresh1 			      ? newATTRSUB($startsub, $subname, $proto, $subattrlist, $optsubbody)
372eac174f2Safresh1 			      : newMYSUB($startsub, $subname, $proto, $subattrlist, $optsubbody)
373e9ce3842Safresh1 			  ;
3749f11ffb7Safresh1 			  $$ = NULL;
375e9ce3842Safresh1 			  intro_my();
376b8851fccSafresh1 			  parser->parsed_sub = 1;
377b8851fccSafresh1 			}
378*e0680481Safresh1 	|	sigsub_or_method_named subname startsub
3799f11ffb7Safresh1                     /* sub declaration or definition under 'use feature
3809f11ffb7Safresh1                      * "signatures"'. (Note that a signature isn't
3819f11ffb7Safresh1                      * allowed in a declaration)
3829f11ffb7Safresh1                      */
383b8851fccSafresh1 			{
384eac174f2Safresh1                           init_named_cv(PL_compcv, $subname);
385*e0680481Safresh1 			  if($sigsub_or_method_named == KW_METHOD_named) {
386*e0680481Safresh1 			      croak_kw_unless_class("method");
387*e0680481Safresh1 			      class_prepare_method_parse(PL_compcv);
388*e0680481Safresh1 			  }
389b8851fccSafresh1 			  parser->in_my = 0;
390b8851fccSafresh1 			  parser->in_my_stash = NULL;
391b8851fccSafresh1 			}
3929f11ffb7Safresh1                     subattrlist optsigsubbody
393b8851fccSafresh1 			{
394*e0680481Safresh1 			  OP *body = $optsigsubbody;
395*e0680481Safresh1 
396b8851fccSafresh1 			  SvREFCNT_inc_simple_void(PL_compcv);
397eac174f2Safresh1 			  $subname->op_type == OP_CONST
398*e0680481Safresh1 			      ? newATTRSUB($startsub, $subname, NULL, $subattrlist, body)
399*e0680481Safresh1 			      : newMYSUB(  $startsub, $subname, NULL, $subattrlist, body)
400b8851fccSafresh1 			  ;
4019f11ffb7Safresh1 			  $$ = NULL;
402b8851fccSafresh1 			  intro_my();
403b8851fccSafresh1 			  parser->parsed_sub = 1;
40448950c12Ssthen 			}
405*e0680481Safresh1 	|	PHASER startsub
406*e0680481Safresh1 			{
407*e0680481Safresh1 			  switch($PHASER) {
408*e0680481Safresh1 			      case KEY_ADJUST:
409*e0680481Safresh1 			         croak_kw_unless_class("ADJUST");
410*e0680481Safresh1 			         class_prepare_method_parse(PL_compcv);
411*e0680481Safresh1 			         break;
412*e0680481Safresh1 			      default:
413*e0680481Safresh1 			         NOT_REACHED;
414*e0680481Safresh1 			  }
415*e0680481Safresh1 			}
416*e0680481Safresh1 		    optsubbody
417*e0680481Safresh1 			{
418*e0680481Safresh1 			  OP *body = $optsubbody;
419*e0680481Safresh1 			  SvREFCNT_inc_simple_void(PL_compcv);
420*e0680481Safresh1 
421*e0680481Safresh1 			  CV *cv;
422*e0680481Safresh1 
423*e0680481Safresh1 			  switch($PHASER) {
424*e0680481Safresh1 			      case KEY_ADJUST:
425*e0680481Safresh1 			          cv = newATTRSUB($startsub, NULL, NULL, NULL, body);
426*e0680481Safresh1 			          class_add_ADJUST(PL_curstash, cv);
427*e0680481Safresh1 			          break;
428*e0680481Safresh1 			  }
429*e0680481Safresh1 			  $$ = NULL;
430*e0680481Safresh1 			}
431*e0680481Safresh1 	|	KW_PACKAGE BAREWORD[version] BAREWORD[package] PERLY_SEMICOLON
432*e0680481Safresh1 		    /* version and package appear in the reverse order to what may be
433*e0680481Safresh1 		     * expected, because toke.c has already pushed both of them to a stack
434*e0680481Safresh1 		     * by calling force_next() from within force_version().
435*e0680481Safresh1 		     * When the parser pops them back out again they appear swapped */
43648950c12Ssthen 			{
437eac174f2Safresh1 			  package($package);
438eac174f2Safresh1 			  if ($version)
439eac174f2Safresh1 			      package_version($version);
4409f11ffb7Safresh1 			  $$ = NULL;
44148950c12Ssthen 			}
442*e0680481Safresh1 	|	KW_CLASS BAREWORD[version] BAREWORD[package] subattrlist PERLY_SEMICOLON
443*e0680481Safresh1 			{
444*e0680481Safresh1 			  package($package);
445*e0680481Safresh1 			  if ($version)
446*e0680481Safresh1 			      package_version($version);
447*e0680481Safresh1 			  $$ = NULL;
448*e0680481Safresh1 			  class_setup_stash(PL_curstash);
449*e0680481Safresh1 			  if ($subattrlist) {
450*e0680481Safresh1 			      class_apply_attributes(PL_curstash, $subattrlist);
451*e0680481Safresh1 			  }
452*e0680481Safresh1 			}
453*e0680481Safresh1 	|	KW_USE_or_NO startsub
45448950c12Ssthen 			{ CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ }
455eac174f2Safresh1 		BAREWORD[version] BAREWORD[module] optlistexpr PERLY_SEMICOLON
456*e0680481Safresh1 		    /* version and package appear in reverse order for the same reason as
457*e0680481Safresh1 		     * KW_PACKAGE; see comment above */
45848950c12Ssthen 			{
45948950c12Ssthen 			  SvREFCNT_inc_simple_void(PL_compcv);
460*e0680481Safresh1 			  utilize($KW_USE_or_NO, $startsub, $version, $module, $optlistexpr);
461b8851fccSafresh1 			  parser->parsed_sub = 1;
4629f11ffb7Safresh1 			  $$ = NULL;
46348950c12Ssthen 			}
464*e0680481Safresh1 	|	KW_IF PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock else
46548950c12Ssthen 			{
466eac174f2Safresh1 			  $$ = block_end($remember,
467eac174f2Safresh1 			      newCONDOP(0, $mexpr, op_scope($mblock), $else));
468*e0680481Safresh1 			  parser->copline = (line_t)$KW_IF;
46948950c12Ssthen 			}
470*e0680481Safresh1 	|	KW_UNLESS PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock else
47148950c12Ssthen 			{
472eac174f2Safresh1 			  $$ = block_end($remember,
473eac174f2Safresh1                               newCONDOP(0, $mexpr, $else, op_scope($mblock)));
474*e0680481Safresh1 			  parser->copline = (line_t)$KW_UNLESS;
47548950c12Ssthen 			}
476*e0680481Safresh1 	|	KW_GIVEN PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock
47748950c12Ssthen 			{
478eac174f2Safresh1 			  $$ = block_end($remember, newGIVENOP($mexpr, op_scope($mblock), 0));
479*e0680481Safresh1 			  parser->copline = (line_t)$KW_GIVEN;
48048950c12Ssthen 			}
481*e0680481Safresh1 	|	KW_WHEN PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock
482eac174f2Safresh1 			{ $$ = block_end($remember, newWHENOP($mexpr, op_scope($mblock))); }
483*e0680481Safresh1 	|	KW_DEFAULT block
484eac174f2Safresh1 			{ $$ = newWHENOP(0, op_scope($block)); }
485*e0680481Safresh1 	|	KW_WHILE PERLY_PAREN_OPEN remember texpr PERLY_PAREN_CLOSE mintro mblock cont
48648950c12Ssthen 			{
487eac174f2Safresh1 			  $$ = block_end($remember,
4889f11ffb7Safresh1 				  newWHILEOP(0, 1, NULL,
489eac174f2Safresh1 				      $texpr, $mblock, $cont, $mintro));
490*e0680481Safresh1 			  parser->copline = (line_t)$KW_WHILE;
49148950c12Ssthen 			}
492*e0680481Safresh1 	|	KW_UNTIL PERLY_PAREN_OPEN remember iexpr PERLY_PAREN_CLOSE mintro mblock cont
49348950c12Ssthen 			{
494eac174f2Safresh1 			  $$ = block_end($remember,
4959f11ffb7Safresh1 				  newWHILEOP(0, 1, NULL,
496eac174f2Safresh1 				      $iexpr, $mblock, $cont, $mintro));
497*e0680481Safresh1 			  parser->copline = (line_t)$KW_UNTIL;
49848950c12Ssthen 			}
499*e0680481Safresh1 	|	KW_FOR PERLY_PAREN_OPEN remember mnexpr[init_mnexpr] PERLY_SEMICOLON
500b8851fccSafresh1 			{ parser->expect = XTERM; }
501eac174f2Safresh1 		texpr PERLY_SEMICOLON
502b8851fccSafresh1 			{ parser->expect = XTERM; }
503eac174f2Safresh1 		mintro mnexpr[iterate_mnexpr] PERLY_PAREN_CLOSE
50448950c12Ssthen 		mblock
50548950c12Ssthen 			{
506eac174f2Safresh1 			  OP *initop = $init_mnexpr;
5079f11ffb7Safresh1 			  OP *forop = newWHILEOP(0, 1, NULL,
508eac174f2Safresh1 				      scalar($texpr), $mblock, $iterate_mnexpr, $mintro);
50948950c12Ssthen 			  if (initop) {
51048950c12Ssthen 			      forop = op_prepend_elem(OP_LINESEQ, initop,
51148950c12Ssthen 				  op_append_elem(OP_LINESEQ,
51248950c12Ssthen 				      newOP(OP_UNSTACK, OPf_SPECIAL),
51348950c12Ssthen 				      forop));
51448950c12Ssthen 			  }
515b8851fccSafresh1 			  PL_hints |= HINT_BLOCK_SCOPE;
516eac174f2Safresh1 			  $$ = block_end($remember, forop);
517*e0680481Safresh1 			  parser->copline = (line_t)$KW_FOR;
51848950c12Ssthen 			}
519*e0680481Safresh1 	|	KW_FOR KW_MY remember my_scalar PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock cont
52048950c12Ssthen 			{
521eac174f2Safresh1 			  $$ = block_end($remember, newFOROP(0, $my_scalar, $mexpr, $mblock, $cont));
522*e0680481Safresh1 			  parser->copline = (line_t)$KW_FOR;
52348950c12Ssthen 			}
524*e0680481Safresh1 	|	KW_FOR KW_MY remember PERLY_PAREN_OPEN my_list_of_scalars PERLY_PAREN_CLOSE PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock cont
52548950c12Ssthen 			{
526eac174f2Safresh1                           if ($my_list_of_scalars->op_type == OP_PADSV)
527eac174f2Safresh1                             /* degenerate case of 1 var: for my ($x) ....
528eac174f2Safresh1                                Flag it so it can be special-cased in newFOROP */
529eac174f2Safresh1                                 $my_list_of_scalars->op_flags |= OPf_PARENS;
530eac174f2Safresh1 			  $$ = block_end($remember, newFOROP(0, $my_list_of_scalars, $mexpr, $mblock, $cont));
531*e0680481Safresh1 			  parser->copline = (line_t)$KW_FOR;
532eac174f2Safresh1 			}
533*e0680481Safresh1 	|	KW_FOR scalar PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock cont
534eac174f2Safresh1 			{
535eac174f2Safresh1 			  $$ = block_end($remember, newFOROP(0,
536eac174f2Safresh1 				      op_lvalue($scalar, OP_ENTERLOOP), $mexpr, $mblock, $cont));
537*e0680481Safresh1 			  parser->copline = (line_t)$KW_FOR;
538b8851fccSafresh1 			}
539*e0680481Safresh1 	|	KW_FOR my_refgen remember my_var
540eac174f2Safresh1 			{ parser->in_my = 0; $<opval>$ = my($my_var); }[variable]
541eac174f2Safresh1 		PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock cont
542b8851fccSafresh1 			{
543b8851fccSafresh1 			  $$ = block_end(
544eac174f2Safresh1 				$remember,
545b8851fccSafresh1 				newFOROP(0,
546b8851fccSafresh1 					 op_lvalue(
547b8851fccSafresh1 					    newUNOP(OP_REFGEN, 0,
548eac174f2Safresh1 						    $<opval>variable),
549b8851fccSafresh1 					    OP_ENTERLOOP),
550eac174f2Safresh1 					 $mexpr, $mblock, $cont)
551b8851fccSafresh1 			  );
552*e0680481Safresh1 			  parser->copline = (line_t)$KW_FOR;
553b8851fccSafresh1 			}
554*e0680481Safresh1 	|	KW_FOR REFGEN refgen_topic PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock cont
555b8851fccSafresh1 			{
556eac174f2Safresh1 			  $$ = block_end($remember, newFOROP(
557b8851fccSafresh1 				0, op_lvalue(newUNOP(OP_REFGEN, 0,
558eac174f2Safresh1 						     $refgen_topic),
559eac174f2Safresh1 					     OP_ENTERLOOP), $mexpr, $mblock, $cont));
560*e0680481Safresh1 			  parser->copline = (line_t)$KW_FOR;
56148950c12Ssthen 			}
562*e0680481Safresh1 	|	KW_FOR PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock cont
56348950c12Ssthen 			{
564eac174f2Safresh1 			  $$ = block_end($remember,
565eac174f2Safresh1 				  newFOROP(0, NULL, $mexpr, $mblock, $cont));
566*e0680481Safresh1 			  parser->copline = (line_t)$KW_FOR;
567eac174f2Safresh1 			}
568*e0680481Safresh1 	|       KW_TRY mblock[try] KW_CATCH remember catch_paren[scalar]
569*e0680481Safresh1 			{
570*e0680481Safresh1 			  if(!$scalar) {
571*e0680481Safresh1 			      yyerror("catch block requires a (VAR)");
572*e0680481Safresh1 			      YYERROR;
573*e0680481Safresh1 			  }
574*e0680481Safresh1 			}
575*e0680481Safresh1 		mblock[catch] finally
576eac174f2Safresh1 			{
577eac174f2Safresh1 			  $$ = newTRYCATCHOP(0,
578eac174f2Safresh1 				  $try, $scalar, block_end($remember, op_scope($catch)));
579eac174f2Safresh1 			  if($finally)
580eac174f2Safresh1 			      $$ = op_wrap_finally($$, $finally);
581*e0680481Safresh1 			  parser->copline = (line_t)$KW_TRY;
58248950c12Ssthen 			}
58348950c12Ssthen 	|	block cont
58448950c12Ssthen 			{
58548950c12Ssthen 			  /* a block is a loop that happens once */
5869f11ffb7Safresh1 			  $$ = newWHILEOP(0, 1, NULL,
587eac174f2Safresh1 				  NULL, $block, $cont, 0);
58848950c12Ssthen 			}
589*e0680481Safresh1 	|	KW_PACKAGE BAREWORD[version] BAREWORD[package] PERLY_BRACE_OPEN remember
59048950c12Ssthen 			{
591eac174f2Safresh1 			  package($package);
592eac174f2Safresh1 			  if ($version) {
593eac174f2Safresh1 			      package_version($version);
59448950c12Ssthen 			  }
59548950c12Ssthen 			}
596eac174f2Safresh1 		stmtseq PERLY_BRACE_CLOSE
59748950c12Ssthen 			{
59848950c12Ssthen 			  /* a block is a loop that happens once */
5999f11ffb7Safresh1 			  $$ = newWHILEOP(0, 1, NULL,
600eac174f2Safresh1 				  NULL, block_end($remember, $stmtseq), NULL, 0);
601eac174f2Safresh1 			  if (parser->copline > (line_t)$PERLY_BRACE_OPEN)
602eac174f2Safresh1 			      parser->copline = (line_t)$PERLY_BRACE_OPEN;
60348950c12Ssthen 			}
604*e0680481Safresh1 	|	KW_CLASS BAREWORD[version] BAREWORD[package] subattrlist PERLY_BRACE_OPEN remember
605*e0680481Safresh1 			{
606*e0680481Safresh1 			  package($package);
607*e0680481Safresh1 
608*e0680481Safresh1 			  if ($version) {
609*e0680481Safresh1 			      package_version($version);
610*e0680481Safresh1 			  }
611*e0680481Safresh1 			  class_setup_stash(PL_curstash);
612*e0680481Safresh1 			  if ($subattrlist) {
613*e0680481Safresh1 			      class_apply_attributes(PL_curstash, $subattrlist);
614*e0680481Safresh1 			  }
615*e0680481Safresh1 			}
616*e0680481Safresh1 		stmtseq PERLY_BRACE_CLOSE
617*e0680481Safresh1 			{
618*e0680481Safresh1 			  /* a block is a loop that happens once */
619*e0680481Safresh1 			  $$ = newWHILEOP(0, 1, NULL,
620*e0680481Safresh1 				  NULL, block_end($remember, $stmtseq), NULL, 0);
621*e0680481Safresh1 			  if (parser->copline > (line_t)$PERLY_BRACE_OPEN)
622*e0680481Safresh1 			      parser->copline = (line_t)$PERLY_BRACE_OPEN;
623*e0680481Safresh1 			}
624*e0680481Safresh1 	|	fielddecl PERLY_SEMICOLON
625*e0680481Safresh1 			{
626*e0680481Safresh1 			  $$ = $fielddecl;
627*e0680481Safresh1 			}
628eac174f2Safresh1 	|	sideff PERLY_SEMICOLON
62948950c12Ssthen 			{
630eac174f2Safresh1 			  $$ = $sideff;
631e2e5c5d3Smillert 			}
632*e0680481Safresh1 	|	KW_DEFER mblock
633eac174f2Safresh1 			{
634eac174f2Safresh1 			  $$ = newDEFEROP(0, op_scope($2));
635eac174f2Safresh1 			}
636eac174f2Safresh1 	|	YADAYADA PERLY_SEMICOLON
6379f11ffb7Safresh1 			{
638*e0680481Safresh1                           /* diag_listed_as: Unimplemented */
6399f11ffb7Safresh1 			  $$ = newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0),
6409f11ffb7Safresh1 				newSVOP(OP_CONST, 0, newSVpvs("Unimplemented")));
6419f11ffb7Safresh1 			}
642eac174f2Safresh1 	|	PERLY_SEMICOLON
6437bfa9f44Smillert 			{
6449f11ffb7Safresh1 			  $$ = NULL;
645b8851fccSafresh1 			  parser->copline = NOLINE;
6467bfa9f44Smillert 			}
647e2e5c5d3Smillert 	;
648e2e5c5d3Smillert 
649e9ce3842Safresh1 /* Format line */
650e9ce3842Safresh1 formline:	THING formarg
651e9ce3842Safresh1 			{ OP *list;
652eac174f2Safresh1 			  if ($formarg) {
653eac174f2Safresh1 			      OP *term = $formarg;
654eac174f2Safresh1 			      list = op_append_elem(OP_LIST, $THING, term);
655e9ce3842Safresh1 			  }
656e9ce3842Safresh1 			  else {
657eac174f2Safresh1 			      list = $THING;
658e9ce3842Safresh1 			  }
659b8851fccSafresh1 			  if (parser->copline == NOLINE)
660b8851fccSafresh1 			       parser->copline = CopLINE(PL_curcop)-1;
661b8851fccSafresh1 			  else parser->copline--;
662e9ce3842Safresh1 			  $$ = newSTATEOP(0, NULL,
663b8851fccSafresh1 					  op_convert_list(OP_FORMLINE, 0, list));
664e9ce3842Safresh1 			}
665e9ce3842Safresh1 	;
666e9ce3842Safresh1 
667eac174f2Safresh1 formarg
668eac174f2Safresh1 	:	empty
669e9ce3842Safresh1 	|	FORMLBRACK stmtseq FORMRBRACK
670eac174f2Safresh1 			{ $$ = op_unscope($stmtseq); }
671eac174f2Safresh1 	;
672eac174f2Safresh1 
673eac174f2Safresh1 condition: expr
674e9ce3842Safresh1 ;
675e9ce3842Safresh1 
67679cd0b9aSmillert /* An expression which may have a side-effect */
677e2e5c5d3Smillert sideff	:	error
6789f11ffb7Safresh1 			{ $$ = NULL; }
679eac174f2Safresh1 	|	expr[body]
680eac174f2Safresh1 			{ $$ = $body; }
681*e0680481Safresh1 	|	expr[body] KW_IF condition
682eac174f2Safresh1 			{ $$ = newLOGOP(OP_AND, 0, $condition, $body); }
683*e0680481Safresh1 	|	expr[body] KW_UNLESS condition
684eac174f2Safresh1 			{ $$ = newLOGOP(OP_OR, 0, $condition, $body); }
685*e0680481Safresh1 	|	expr[body] KW_WHILE condition
686eac174f2Safresh1 			{ $$ = newLOOPOP(OPf_PARENS, 1, scalar($condition), $body); }
687*e0680481Safresh1 	|	expr[body] KW_UNTIL iexpr
688eac174f2Safresh1 			{ $$ = newLOOPOP(OPf_PARENS, 1, $iexpr, $body); }
689*e0680481Safresh1 	|	expr[body] KW_FOR condition
690eac174f2Safresh1 			{ $$ = newFOROP(0, NULL, $condition, $body, NULL);
691*e0680481Safresh1 			  parser->copline = (line_t)$KW_FOR; }
692*e0680481Safresh1 	|	expr[body] KW_WHEN condition
693eac174f2Safresh1 			{ $$ = newWHENOP($condition, op_scope($body)); }
694e2e5c5d3Smillert 	;
695e2e5c5d3Smillert 
69679cd0b9aSmillert /* else and elsif blocks */
697eac174f2Safresh1 else
698eac174f2Safresh1 	:	empty
699*e0680481Safresh1 	|	KW_ELSE mblock
70048950c12Ssthen 			{
701eac174f2Safresh1 			  ($mblock)->op_flags |= OPf_PARENS;
702eac174f2Safresh1 			  $$ = op_scope($mblock);
7037bfa9f44Smillert 			}
704*e0680481Safresh1 	|	KW_ELSIF PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock else[else.recurse]
705*e0680481Safresh1 			{ parser->copline = (line_t)$KW_ELSIF;
70648950c12Ssthen 			    $$ = newCONDOP(0,
707eac174f2Safresh1 				newSTATEOP(OPf_SPECIAL,NULL,$mexpr),
708eac174f2Safresh1 				op_scope($mblock), $[else.recurse]);
7097bfa9f44Smillert 			  PL_hints |= HINT_BLOCK_SCOPE;
7107bfa9f44Smillert 			}
711e2e5c5d3Smillert 	;
712e2e5c5d3Smillert 
71379cd0b9aSmillert /* Continue blocks */
714eac174f2Safresh1 cont
715eac174f2Safresh1 	:	empty
716*e0680481Safresh1 	|	KW_CONTINUE block
717eac174f2Safresh1 			{ $$ = op_scope($block); }
718eac174f2Safresh1 	;
719eac174f2Safresh1 
720eac174f2Safresh1 /* Finally blocks */
721eac174f2Safresh1 finally	:	%empty
722eac174f2Safresh1 			{ $$ = NULL; }
723*e0680481Safresh1 	|	KW_FINALLY block
724eac174f2Safresh1 			{ $$ = op_scope($block); }
725e2e5c5d3Smillert 	;
726e2e5c5d3Smillert 
7277bfa9f44Smillert /* determine whether there are any new my declarations */
728eac174f2Safresh1 mintro	:	%empty
7297bfa9f44Smillert 			{ $$ = (PL_min_intro_pending &&
7307bfa9f44Smillert 			    PL_max_intro_pending >=  PL_min_intro_pending);
7317bfa9f44Smillert 			  intro_my(); }
7327bfa9f44Smillert 
73379cd0b9aSmillert /* Normal expression */
734eac174f2Safresh1 nexpr
735eac174f2Safresh1 	:	empty
736e2e5c5d3Smillert 	|	sideff
737e2e5c5d3Smillert 	;
738e2e5c5d3Smillert 
73979cd0b9aSmillert /* Boolean expression */
740eac174f2Safresh1 texpr	:	%empty /* NULL means true */
7417bfa9f44Smillert 			{ YYSTYPE tmplval;
7427bfa9f44Smillert 			  (void)scan_num("1", &tmplval);
7437bfa9f44Smillert 			  $$ = tmplval.opval; }
744e2e5c5d3Smillert 	|	expr
745e2e5c5d3Smillert 	;
746e2e5c5d3Smillert 
74779cd0b9aSmillert /* Inverted boolean expression */
748e2e5c5d3Smillert iexpr	:	expr
749eac174f2Safresh1 			{ $$ = invert(scalar($expr)); }
750e2e5c5d3Smillert 	;
751e2e5c5d3Smillert 
75279cd0b9aSmillert /* Expression with its own lexical scope */
753e2e5c5d3Smillert mexpr	:	expr
754eac174f2Safresh1 			{ $$ = $expr; intro_my(); }
755e2e5c5d3Smillert 	;
756e2e5c5d3Smillert 
757e2e5c5d3Smillert mnexpr	:	nexpr
758eac174f2Safresh1 			{ $$ = $nexpr; intro_my(); }
759e2e5c5d3Smillert 	;
760e2e5c5d3Smillert 
761eac174f2Safresh1 formname:	BAREWORD	{ $$ = $BAREWORD; }
762eac174f2Safresh1 	|	empty
763e2e5c5d3Smillert 	;
764e2e5c5d3Smillert 
765eac174f2Safresh1 startsub:	%empty	/* start a regular subroutine scope */
7667bfa9f44Smillert 			{ $$ = start_subparse(FALSE, 0);
7677bfa9f44Smillert 			    SAVEFREESV(PL_compcv); }
7687bfa9f44Smillert 
769e2e5c5d3Smillert 	;
770e2e5c5d3Smillert 
771eac174f2Safresh1 startanonsub:	%empty	/* start an anonymous subroutine scope */
7727bfa9f44Smillert 			{ $$ = start_subparse(FALSE, CVf_ANON);
7737bfa9f44Smillert 			    SAVEFREESV(PL_compcv); }
774e2e5c5d3Smillert 	;
775e2e5c5d3Smillert 
776*e0680481Safresh1 startanonmethod:	%empty	/* start an anonymous method scope */
777*e0680481Safresh1 			{ $$ = start_subparse(FALSE, CVf_ANON|CVf_IsMETHOD);
778*e0680481Safresh1 			    SAVEFREESV(PL_compcv); }
779*e0680481Safresh1 	;
780*e0680481Safresh1 
781eac174f2Safresh1 startformsub:	%empty	/* start a format subroutine scope */
7827bfa9f44Smillert 			{ $$ = start_subparse(TRUE, 0);
7837bfa9f44Smillert 			    SAVEFREESV(PL_compcv); }
784e2e5c5d3Smillert 	;
785e2e5c5d3Smillert 
78679cd0b9aSmillert /* Name of a subroutine - must be a bareword, could be special */
7879f11ffb7Safresh1 subname	:	BAREWORD
788e9ce3842Safresh1 	|	PRIVATEREF
789e2e5c5d3Smillert 	;
790e2e5c5d3Smillert 
79179cd0b9aSmillert /* Subroutine prototype */
792eac174f2Safresh1 proto
793eac174f2Safresh1 	:	empty
794e2e5c5d3Smillert 	|	THING
795e2e5c5d3Smillert 	;
796e2e5c5d3Smillert 
79779cd0b9aSmillert /* Optional list of subroutine attributes */
798eac174f2Safresh1 subattrlist
799eac174f2Safresh1 	:	empty
800e2e5c5d3Smillert 	|	COLONATTR THING
801*e0680481Safresh1 			{
802*e0680481Safresh1 			  OP *attrlist = $THING;
803*e0680481Safresh1 			  if(attrlist && !PL_parser->sig_seen)
804*e0680481Safresh1 			      attrlist = apply_builtin_cv_attributes(PL_compcv, attrlist);
805*e0680481Safresh1 			  $$ = attrlist;
806*e0680481Safresh1 			}
807e2e5c5d3Smillert 	|	COLONATTR
8089f11ffb7Safresh1 			{ $$ = NULL; }
809e2e5c5d3Smillert 	;
810e2e5c5d3Smillert 
81179cd0b9aSmillert /* List of attributes for a "my" variable declaration */
812e2e5c5d3Smillert myattrlist:	COLONATTR THING
813eac174f2Safresh1 			{ $$ = $THING; }
814e2e5c5d3Smillert 	|	COLONATTR
8159f11ffb7Safresh1 			{ $$ = NULL; }
816e2e5c5d3Smillert 	;
817e2e5c5d3Smillert 
8189f11ffb7Safresh1 
8199f11ffb7Safresh1 
8209f11ffb7Safresh1 /* --------------------------------------
8219f11ffb7Safresh1  * subroutine signature parsing
8229f11ffb7Safresh1  */
8239f11ffb7Safresh1 
8249f11ffb7Safresh1 /* the '' or 'foo' part of a '$' or '@foo' etc signature variable  */
825eac174f2Safresh1 sigvarname:     %empty
8269f11ffb7Safresh1 			{ parser->in_my = 0; $$ = NULL; }
8279f11ffb7Safresh1         |       PRIVATEREF
828eac174f2Safresh1                         { parser->in_my = 0; $$ = $PRIVATEREF; }
8299f11ffb7Safresh1 	;
8309f11ffb7Safresh1 
8319f11ffb7Safresh1 sigslurpsigil:
832eac174f2Safresh1                 PERLY_SNAIL
8339f11ffb7Safresh1                         { $$ = '@'; }
834eac174f2Safresh1         |       PERLY_PERCENT_SIGN
8359f11ffb7Safresh1                         { $$ = '%'; }
8369f11ffb7Safresh1 
8379f11ffb7Safresh1 /* @, %, @foo, %foo */
8389f11ffb7Safresh1 sigslurpelem: sigslurpsigil sigvarname sigdefault/* def only to catch errors */
8399f11ffb7Safresh1                         {
840eac174f2Safresh1                             I32 sigil = $sigslurpsigil;
841eac174f2Safresh1                             OP *var   = $sigvarname;
842*e0680481Safresh1                             OP *defop = $sigdefault;
8439f11ffb7Safresh1 
8449f11ffb7Safresh1                             if (parser->sig_slurpy)
8459f11ffb7Safresh1                                 yyerror("Multiple slurpy parameters not allowed");
8469f11ffb7Safresh1                             parser->sig_slurpy = (char)sigil;
8479f11ffb7Safresh1 
848*e0680481Safresh1                             if (defop)
8499f11ffb7Safresh1                                 yyerror("A slurpy parameter may not have "
8509f11ffb7Safresh1                                         "a default value");
8519f11ffb7Safresh1 
8529f11ffb7Safresh1                             $$ = var ? newSTATEOP(0, NULL, var) : NULL;
8539f11ffb7Safresh1                         }
8549f11ffb7Safresh1 	;
8559f11ffb7Safresh1 
8569f11ffb7Safresh1 /* default part of sub signature scalar element: i.e. '= default_expr' */
857eac174f2Safresh1 sigdefault
858eac174f2Safresh1 	:	empty
8599f11ffb7Safresh1         |       ASSIGNOP
860*e0680481Safresh1                         { $$ = newARGDEFELEMOP(0, newOP(OP_NULL, 0), parser->sig_elems); }
8619f11ffb7Safresh1         |       ASSIGNOP term
862*e0680481Safresh1                         {
863*e0680481Safresh1                             I32 flags = 0;
864*e0680481Safresh1                             if ($ASSIGNOP == OP_DORASSIGN)
865*e0680481Safresh1                                 flags |= OPpARG_IF_UNDEF << 8;
866*e0680481Safresh1                             if ($ASSIGNOP == OP_ORASSIGN)
867*e0680481Safresh1                                 flags |= OPpARG_IF_FALSE << 8;
868*e0680481Safresh1                             $$ = newARGDEFELEMOP(flags, $term, parser->sig_elems);
869*e0680481Safresh1                         }
8709f11ffb7Safresh1 
8719f11ffb7Safresh1 
8729f11ffb7Safresh1 /* subroutine signature scalar element: e.g. '$x', '$=', '$x = $default' */
8739f11ffb7Safresh1 sigscalarelem:
874eac174f2Safresh1                 PERLY_DOLLAR sigvarname sigdefault
8759f11ffb7Safresh1                         {
876eac174f2Safresh1                             OP *var   = $sigvarname;
877*e0680481Safresh1                             OP *defop = $sigdefault;
8789f11ffb7Safresh1 
8799f11ffb7Safresh1                             if (parser->sig_slurpy)
8809f11ffb7Safresh1                                 yyerror("Slurpy parameter not last");
8819f11ffb7Safresh1 
8829f11ffb7Safresh1                             parser->sig_elems++;
8839f11ffb7Safresh1 
884*e0680481Safresh1                             if (defop) {
8859f11ffb7Safresh1                                 parser->sig_optelems++;
8869f11ffb7Safresh1 
887*e0680481Safresh1                                 OP *defexpr = cLOGOPx(defop)->op_first;
888*e0680481Safresh1 
8899f11ffb7Safresh1                                 if (   defexpr->op_type == OP_NULL
8909f11ffb7Safresh1                                     && !(defexpr->op_flags & OPf_KIDS))
8919f11ffb7Safresh1                                 {
8929f11ffb7Safresh1                                     /* handle '$=' special case */
8939f11ffb7Safresh1                                     if (var)
8949f11ffb7Safresh1                                         yyerror("Optional parameter "
8959f11ffb7Safresh1                                                     "lacks default expression");
896*e0680481Safresh1                                     op_free(defop);
8979f11ffb7Safresh1                                 }
8989f11ffb7Safresh1                                 else {
8999f11ffb7Safresh1                                     /* a normal '=default' expression */
9009f11ffb7Safresh1                                     if (var) {
9019f11ffb7Safresh1                                         var->op_flags |= OPf_STACKED;
9029f11ffb7Safresh1                                         (void)op_sibling_splice(var,
9039f11ffb7Safresh1                                                         NULL, 0, defop);
9049f11ffb7Safresh1                                         scalar(defop);
9059f11ffb7Safresh1                                     }
9069f11ffb7Safresh1                                     else
9079f11ffb7Safresh1                                         var = newUNOP(OP_NULL, 0, defop);
9089f11ffb7Safresh1 
9099f11ffb7Safresh1                                     LINKLIST(var);
9109f11ffb7Safresh1                                     /* NB: normally the first child of a
9119f11ffb7Safresh1                                      * logop is executed before the logop,
9129f11ffb7Safresh1                                      * and it pushes a boolean result
9139f11ffb7Safresh1                                      * ready for the logop. For ARGDEFELEM,
9149f11ffb7Safresh1                                      * the op itself does the boolean
9159f11ffb7Safresh1                                      * calculation, so set the first op to
9169f11ffb7Safresh1                                      * it instead.
9179f11ffb7Safresh1                                      */
9189f11ffb7Safresh1                                     var->op_next = defop;
9199f11ffb7Safresh1                                     defexpr->op_next = var;
9209f11ffb7Safresh1                                 }
9219f11ffb7Safresh1                             }
9229f11ffb7Safresh1                             else {
9239f11ffb7Safresh1                                 if (parser->sig_optelems)
9249f11ffb7Safresh1                                     yyerror("Mandatory parameter "
9259f11ffb7Safresh1                                             "follows optional parameter");
9269f11ffb7Safresh1                             }
9279f11ffb7Safresh1 
9289f11ffb7Safresh1                             $$ = var ? newSTATEOP(0, NULL, var) : NULL;
9299f11ffb7Safresh1                         }
9309f11ffb7Safresh1 	;
9319f11ffb7Safresh1 
9329f11ffb7Safresh1 
9339f11ffb7Safresh1 /* subroutine signature element: e.g. '$x = $default' or '%h' */
9349f11ffb7Safresh1 sigelem:        sigscalarelem
935eac174f2Safresh1                         { parser->in_my = KEY_sigvar; $$ = $sigscalarelem; }
9369f11ffb7Safresh1         |       sigslurpelem
937eac174f2Safresh1                         { parser->in_my = KEY_sigvar; $$ = $sigslurpelem; }
9389f11ffb7Safresh1 	;
9399f11ffb7Safresh1 
9409f11ffb7Safresh1 /* list of subroutine signature elements */
9419f11ffb7Safresh1 siglist:
942eac174f2Safresh1 	 	siglist[list] PERLY_COMMA
943eac174f2Safresh1 			{ $$ = $list; }
944eac174f2Safresh1 	|	siglist[list] PERLY_COMMA sigelem[element]
9459f11ffb7Safresh1 			{
946eac174f2Safresh1 			  $$ = op_append_list(OP_LINESEQ, $list, $element);
9479f11ffb7Safresh1 			}
948eac174f2Safresh1         |	sigelem[element]  %prec PREC_LOW
949eac174f2Safresh1 			{ $$ = $element; }
9509f11ffb7Safresh1 	;
9519f11ffb7Safresh1 
9529f11ffb7Safresh1 /* () or (....) */
953eac174f2Safresh1 optsiglist
954eac174f2Safresh1 	:	empty
9559f11ffb7Safresh1 	|	siglist
956eac174f2Safresh1 	;
9579f11ffb7Safresh1 
9589f11ffb7Safresh1 /* optional subroutine signature */
959eac174f2Safresh1 optsubsignature
960eac174f2Safresh1 	:	empty
9619f11ffb7Safresh1 	|	subsignature
962eac174f2Safresh1 	;
9639f11ffb7Safresh1 
964b8851fccSafresh1 /* Subroutine signature */
965eac174f2Safresh1 subsignature:	PERLY_PAREN_OPEN subsigguts PERLY_PAREN_CLOSE
966eac174f2Safresh1 			{ $$ = $subsigguts; }
96756d68f1eSafresh1 
96856d68f1eSafresh1 subsigguts:
969e5157e49Safresh1                         {
9709f11ffb7Safresh1                             ENTER;
9719f11ffb7Safresh1                             SAVEIV(parser->sig_elems);
9729f11ffb7Safresh1                             SAVEIV(parser->sig_optelems);
9739f11ffb7Safresh1                             SAVEI8(parser->sig_slurpy);
9749f11ffb7Safresh1                             parser->sig_elems    = 0;
9759f11ffb7Safresh1                             parser->sig_optelems = 0;
9769f11ffb7Safresh1                             parser->sig_slurpy   = 0;
9779f11ffb7Safresh1                             parser->in_my        = KEY_sigvar;
9789f11ffb7Safresh1                         }
979eac174f2Safresh1                 optsiglist
9809f11ffb7Safresh1 			{
981eac174f2Safresh1                             OP            *sigops = $optsiglist;
98256d68f1eSafresh1                             struct op_argcheck_aux *aux;
9839f11ffb7Safresh1                             OP            *check;
984b8851fccSafresh1 
985*e0680481Safresh1 			    if (!FEATURE_SIGNATURES_IS_ENABLED && !CvIsMETHOD(PL_compcv))
9869f11ffb7Safresh1 			        Perl_croak(aTHX_ "Experimental "
9879f11ffb7Safresh1                                     "subroutine signatures not enabled");
9889f11ffb7Safresh1 
9899f11ffb7Safresh1                             /* We shouldn't get here otherwise */
99056d68f1eSafresh1                             aux = (struct op_argcheck_aux*)
99156d68f1eSafresh1                                     PerlMemShared_malloc(
99256d68f1eSafresh1                                         sizeof(struct op_argcheck_aux));
99356d68f1eSafresh1                             aux->params     = parser->sig_elems;
99456d68f1eSafresh1                             aux->opt_params = parser->sig_optelems;
99556d68f1eSafresh1                             aux->slurpy     = parser->sig_slurpy;
99656d68f1eSafresh1                             check = newUNOP_AUX(OP_ARGCHECK, 0, NULL,
99756d68f1eSafresh1                                             (UNOP_AUX_item *)aux);
9989f11ffb7Safresh1                             sigops = op_prepend_elem(OP_LINESEQ, check, sigops);
9999f11ffb7Safresh1                             sigops = op_prepend_elem(OP_LINESEQ,
10009f11ffb7Safresh1                                                 newSTATEOP(0, NULL, NULL),
10019f11ffb7Safresh1                                                 sigops);
10029f11ffb7Safresh1                             /* a nextstate at the end handles context
10039f11ffb7Safresh1                              * correctly for an empty sub body */
100456d68f1eSafresh1                             sigops = op_append_elem(OP_LINESEQ,
10059f11ffb7Safresh1                                                 sigops,
10069f11ffb7Safresh1                                                 newSTATEOP(0, NULL, NULL));
100756d68f1eSafresh1                             /* wrap the list of arg ops in a NULL aux op.
100856d68f1eSafresh1                               This serves two purposes. First, it makes
100956d68f1eSafresh1                               the arg list a separate subtree from the
101056d68f1eSafresh1                               body of the sub, and secondly the null op
101156d68f1eSafresh1                               may in future be upgraded to an OP_SIGNATURE
101256d68f1eSafresh1                               when implemented. For now leave it as
101356d68f1eSafresh1                               ex-argcheck */
101456d68f1eSafresh1                             $$ = newUNOP_AUX(OP_ARGCHECK, 0, sigops, NULL);
101556d68f1eSafresh1                             op_null($$);
10169f11ffb7Safresh1 
1017eac174f2Safresh1 			    CvSIGNATURE_on(PL_compcv);
1018eac174f2Safresh1 
10199f11ffb7Safresh1                             parser->in_my = 0;
10209f11ffb7Safresh1                             /* tell the toker that attrributes can follow
10219f11ffb7Safresh1                              * this sig, but only so that the toker
10229f11ffb7Safresh1                              * can skip through any (illegal) trailing
10239f11ffb7Safresh1                              * attribute text then give a useful error
10249f11ffb7Safresh1                              * message about "attributes before sig",
10259f11ffb7Safresh1                              * rather than falling over ina mess at
10269f11ffb7Safresh1                              * unrecognised syntax.
10279f11ffb7Safresh1                              */
1028b8851fccSafresh1                             parser->expect = XATTRBLOCK;
10299f11ffb7Safresh1                             parser->sig_seen = TRUE;
10309f11ffb7Safresh1                             LEAVE;
1031e5157e49Safresh1 			}
1032e5157e49Safresh1 	;
1033e5157e49Safresh1 
10349f11ffb7Safresh1 /* Optional subroutine body (for named subroutine declaration) */
1035eac174f2Safresh1 optsubbody
1036eac174f2Safresh1 	:	subbody
1037eac174f2Safresh1 	|	PERLY_SEMICOLON	{ $$ = NULL; }
1038e2e5c5d3Smillert 	;
1039e2e5c5d3Smillert 
10409f11ffb7Safresh1 
10419f11ffb7Safresh1 /* Subroutine body (without signature) */
1042eac174f2Safresh1 subbody:	remember  PERLY_BRACE_OPEN stmtseq PERLY_BRACE_CLOSE
10439f11ffb7Safresh1 			{
1044eac174f2Safresh1 			  if (parser->copline > (line_t)$PERLY_BRACE_OPEN)
1045eac174f2Safresh1 			      parser->copline = (line_t)$PERLY_BRACE_OPEN;
1046eac174f2Safresh1 			  $$ = block_end($remember, $stmtseq);
10479f11ffb7Safresh1 			}
10489f11ffb7Safresh1 	;
10499f11ffb7Safresh1 
10509f11ffb7Safresh1 
10519f11ffb7Safresh1 /* optional [ Subroutine body with optional signature ] (for named
10529f11ffb7Safresh1  * subroutine declaration) */
1053eac174f2Safresh1 optsigsubbody
1054eac174f2Safresh1 	:	sigsubbody
1055eac174f2Safresh1 	|	PERLY_SEMICOLON	   { $$ = NULL; }
1056eac174f2Safresh1 	;
10579f11ffb7Safresh1 
10589f11ffb7Safresh1 /* Subroutine body with optional signature */
1059eac174f2Safresh1 sigsubbody:	remember optsubsignature PERLY_BRACE_OPEN stmtseq PERLY_BRACE_CLOSE
10609f11ffb7Safresh1 			{
1061eac174f2Safresh1 			  if (parser->copline > (line_t)$PERLY_BRACE_OPEN)
1062eac174f2Safresh1 			      parser->copline = (line_t)$PERLY_BRACE_OPEN;
1063eac174f2Safresh1 			  $$ = block_end($remember,
1064eac174f2Safresh1 				op_append_list(OP_LINESEQ, $optsubsignature, $stmtseq));
10659f11ffb7Safresh1  			}
10669f11ffb7Safresh1  	;
10679f11ffb7Safresh1 
10689f11ffb7Safresh1 
106979cd0b9aSmillert /* Ordinary expressions; logical combinations */
1070eac174f2Safresh1 expr	:	expr[lhs] ANDOP expr[rhs]
1071eac174f2Safresh1 			{ $$ = newLOGOP(OP_AND, 0, $lhs, $rhs); }
1072*e0680481Safresh1 	|	expr[lhs] PLUGIN_LOGICAL_AND_LOW_OP[op] expr[rhs]
1073*e0680481Safresh1 			{ $$ = build_infix_plugin($lhs, $rhs, $op); }
1074eac174f2Safresh1 	|	expr[lhs] OROP[operator] expr[rhs]
1075eac174f2Safresh1 			{ $$ = newLOGOP($operator, 0, $lhs, $rhs); }
1076*e0680481Safresh1 	|	expr[lhs] PLUGIN_LOGICAL_OR_LOW_OP[op] expr[rhs]
1077*e0680481Safresh1 			{ $$ = build_infix_plugin($lhs, $rhs, $op); }
107848950c12Ssthen 	|	listexpr %prec PREC_LOW
1079e2e5c5d3Smillert 	;
1080e2e5c5d3Smillert 
108179cd0b9aSmillert /* Expressions are a list of terms joined by commas */
1082eac174f2Safresh1 listexpr:	listexpr[list] PERLY_COMMA
1083eac174f2Safresh1 			{ $$ = $list; }
1084eac174f2Safresh1 	|	listexpr[list] PERLY_COMMA term
10857bfa9f44Smillert 			{
1086eac174f2Safresh1 			  OP* term = $term;
1087eac174f2Safresh1 			  $$ = op_append_elem(OP_LIST, $list, term);
10887bfa9f44Smillert 			}
1089e2e5c5d3Smillert 	|	term %prec PREC_LOW
1090e2e5c5d3Smillert 	;
1091e2e5c5d3Smillert 
109279cd0b9aSmillert /* List operators */
109348950c12Ssthen listop	:	LSTOP indirob listexpr /* map {...} @args or print $fh @args */
1094eac174f2Safresh1 			{ $$ = op_convert_list($LSTOP, OPf_STACKED,
1095eac174f2Safresh1 				op_prepend_elem(OP_LIST, newGVREF($LSTOP,$indirob), $listexpr) );
10967bfa9f44Smillert 			}
1097eac174f2Safresh1 	|	FUNC PERLY_PAREN_OPEN indirob expr PERLY_PAREN_CLOSE      /* print ($fh @args */
1098eac174f2Safresh1 			{ $$ = op_convert_list($FUNC, OPf_STACKED,
1099eac174f2Safresh1 				op_prepend_elem(OP_LIST, newGVREF($FUNC,$indirob), $expr) );
11007bfa9f44Smillert 			}
1101*e0680481Safresh1 	|	term ARROW methodname PERLY_PAREN_OPEN optexpr PERLY_PAREN_CLOSE /* $foo->bar(list) */
1102b8851fccSafresh1 			{ $$ = op_convert_list(OP_ENTERSUB, OPf_STACKED,
110348950c12Ssthen 				op_append_elem(OP_LIST,
1104eac174f2Safresh1 				    op_prepend_elem(OP_LIST, scalar($term), $optexpr),
1105*e0680481Safresh1 				    newMETHOP(OP_METHOD, 0, $methodname)));
11067bfa9f44Smillert 			}
1107*e0680481Safresh1 	|	term ARROW methodname                     /* $foo->bar */
1108b8851fccSafresh1 			{ $$ = op_convert_list(OP_ENTERSUB, OPf_STACKED,
1109eac174f2Safresh1 				op_append_elem(OP_LIST, scalar($term),
1110*e0680481Safresh1 				    newMETHOP(OP_METHOD, 0, $methodname)));
11117bfa9f44Smillert 			}
1112*e0680481Safresh1 	|	METHCALL0 indirob optlistexpr           /* new Class @args */
1113b8851fccSafresh1 			{ $$ = op_convert_list(OP_ENTERSUB, OPf_STACKED,
111448950c12Ssthen 				op_append_elem(OP_LIST,
1115eac174f2Safresh1 				    op_prepend_elem(OP_LIST, $indirob, $optlistexpr),
1116*e0680481Safresh1 				    newMETHOP(OP_METHOD, 0, $METHCALL0)));
11177bfa9f44Smillert 			}
1118*e0680481Safresh1 	|	METHCALL indirob PERLY_PAREN_OPEN optexpr PERLY_PAREN_CLOSE    /* method $object (@args) */
1119b8851fccSafresh1 			{ $$ = op_convert_list(OP_ENTERSUB, OPf_STACKED,
112048950c12Ssthen 				op_append_elem(OP_LIST,
1121eac174f2Safresh1 				    op_prepend_elem(OP_LIST, $indirob, $optexpr),
1122*e0680481Safresh1 				    newMETHOP(OP_METHOD, 0, $METHCALL)));
11237bfa9f44Smillert 			}
112448950c12Ssthen 	|	LSTOP optlistexpr                    /* print @args */
1125eac174f2Safresh1 			{ $$ = op_convert_list($LSTOP, 0, $optlistexpr); }
1126eac174f2Safresh1 	|	FUNC PERLY_PAREN_OPEN optexpr PERLY_PAREN_CLOSE                 /* print (@args) */
1127eac174f2Safresh1 			{ $$ = op_convert_list($FUNC, 0, $optexpr); }
112856d68f1eSafresh1 	|	FUNC SUBLEXSTART optexpr SUBLEXEND          /* uc($arg) from "\U..." */
1129eac174f2Safresh1 			{ $$ = op_convert_list($FUNC, 0, $optexpr); }
1130ad15181aSmillert 	|	LSTOPSUB startanonsub block /* sub f(&@);   f { foo } ... */
11317bfa9f44Smillert 			{ SvREFCNT_inc_simple_void(PL_compcv);
1132eac174f2Safresh1 			  $<opval>$ = newANONATTRSUB($startanonsub, 0, NULL, $block); }[anonattrsub]
113348950c12Ssthen 		    optlistexpr		%prec LSTOP  /* ... @bar */
1134e2e5c5d3Smillert 			{ $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
113548950c12Ssthen 				 op_append_elem(OP_LIST,
1136eac174f2Safresh1 				   op_prepend_elem(OP_LIST, $<opval>anonattrsub, $optlistexpr), $LSTOPSUB));
11377bfa9f44Smillert 			}
1138e2e5c5d3Smillert 	;
1139e2e5c5d3Smillert 
114079cd0b9aSmillert /* Names of methods. May use $object->$methodname */
1141*e0680481Safresh1 methodname:	METHCALL0
1142e2e5c5d3Smillert 	|	scalar
1143e2e5c5d3Smillert 	;
1144e2e5c5d3Smillert 
114579cd0b9aSmillert /* Some kind of subscripted expression */
1146eac174f2Safresh1 subscripted:    gelem PERLY_BRACE_OPEN expr PERLY_SEMICOLON PERLY_BRACE_CLOSE        /* *main::{something} */
1147eac174f2Safresh1                         /* In this and all the hash accessors, PERLY_SEMICOLON is
114879cd0b9aSmillert                          * provided by the tokeniser */
1149eac174f2Safresh1 			{ $$ = newBINOP(OP_GELEM, 0, $gelem, scalar($expr)); }
1150eac174f2Safresh1 	|	scalar[array] PERLY_BRACKET_OPEN expr PERLY_BRACKET_CLOSE          /* $array[$element] */
1151eac174f2Safresh1 			{ $$ = newBINOP(OP_AELEM, 0, oopsAV($array), scalar($expr));
11527bfa9f44Smillert 			}
1153eac174f2Safresh1 	|	term[array_reference] ARROW PERLY_BRACKET_OPEN expr PERLY_BRACKET_CLOSE      /* somearef->[$element] */
1154e2e5c5d3Smillert 			{ $$ = newBINOP(OP_AELEM, 0,
1155eac174f2Safresh1 					ref(newAVREF($array_reference),OP_RV2AV),
1156eac174f2Safresh1 					scalar($expr));
11577bfa9f44Smillert 			}
1158eac174f2Safresh1 	|	subscripted[array_reference] PERLY_BRACKET_OPEN expr PERLY_BRACKET_CLOSE    /* $foo->[$bar]->[$baz] */
1159e2e5c5d3Smillert 			{ $$ = newBINOP(OP_AELEM, 0,
1160eac174f2Safresh1 					ref(newAVREF($array_reference),OP_RV2AV),
1161eac174f2Safresh1 					scalar($expr));
11627bfa9f44Smillert 			}
1163eac174f2Safresh1 	|	scalar[hash] PERLY_BRACE_OPEN expr PERLY_SEMICOLON PERLY_BRACE_CLOSE    /* $foo{bar();} */
1164eac174f2Safresh1 			{ $$ = newBINOP(OP_HELEM, 0, oopsHV($hash), jmaybe($expr));
11657bfa9f44Smillert 			}
1166eac174f2Safresh1 	|	term[hash_reference] ARROW PERLY_BRACE_OPEN expr PERLY_SEMICOLON PERLY_BRACE_CLOSE /* somehref->{bar();} */
1167e2e5c5d3Smillert 			{ $$ = newBINOP(OP_HELEM, 0,
1168eac174f2Safresh1 					ref(newHVREF($hash_reference),OP_RV2HV),
1169eac174f2Safresh1 					jmaybe($expr)); }
1170eac174f2Safresh1 	|	subscripted[hash_reference] PERLY_BRACE_OPEN expr PERLY_SEMICOLON PERLY_BRACE_CLOSE /* $foo->[bar]->{baz;} */
1171e2e5c5d3Smillert 			{ $$ = newBINOP(OP_HELEM, 0,
1172eac174f2Safresh1 					ref(newHVREF($hash_reference),OP_RV2HV),
1173eac174f2Safresh1 					jmaybe($expr)); }
1174eac174f2Safresh1 	|	term[code_reference] ARROW PERLY_PAREN_OPEN PERLY_PAREN_CLOSE          /* $subref->() */
1175e2e5c5d3Smillert 			{ $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
1176eac174f2Safresh1 				   newCVREF(0, scalar($code_reference)));
11779f11ffb7Safresh1 			  if (parser->expect == XBLOCK)
11789f11ffb7Safresh1 			      parser->expect = XOPERATOR;
11799f11ffb7Safresh1 			}
1180eac174f2Safresh1 	|	term[code_reference] ARROW PERLY_PAREN_OPEN expr PERLY_PAREN_CLOSE     /* $subref->(@args) */
1181e2e5c5d3Smillert 			{ $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
1182eac174f2Safresh1 				   op_append_elem(OP_LIST, $expr,
1183eac174f2Safresh1 				       newCVREF(0, scalar($code_reference))));
11849f11ffb7Safresh1 			  if (parser->expect == XBLOCK)
11859f11ffb7Safresh1 			      parser->expect = XOPERATOR;
11869f11ffb7Safresh1 			}
1187e2e5c5d3Smillert 
1188eac174f2Safresh1 	|	subscripted[code_reference] PERLY_PAREN_OPEN expr PERLY_PAREN_CLOSE   /* $foo->{bar}->(@args) */
1189e2e5c5d3Smillert 			{ $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
1190eac174f2Safresh1 				   op_append_elem(OP_LIST, $expr,
1191eac174f2Safresh1 					       newCVREF(0, scalar($code_reference))));
11929f11ffb7Safresh1 			  if (parser->expect == XBLOCK)
11939f11ffb7Safresh1 			      parser->expect = XOPERATOR;
11949f11ffb7Safresh1 			}
1195eac174f2Safresh1 	|	subscripted[code_reference] PERLY_PAREN_OPEN PERLY_PAREN_CLOSE        /* $foo->{bar}->() */
1196e2e5c5d3Smillert 			{ $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
1197eac174f2Safresh1 				   newCVREF(0, scalar($code_reference)));
11989f11ffb7Safresh1 			  if (parser->expect == XBLOCK)
11999f11ffb7Safresh1 			      parser->expect = XOPERATOR;
12009f11ffb7Safresh1 			}
1201eac174f2Safresh1 	|	PERLY_PAREN_OPEN expr[list] PERLY_PAREN_CLOSE PERLY_BRACKET_OPEN expr[slice] PERLY_BRACKET_CLOSE            /* list slice */
1202eac174f2Safresh1 			{ $$ = newSLICEOP(0, $slice, $list); }
1203eac174f2Safresh1 	|	QWLIST PERLY_BRACKET_OPEN expr PERLY_BRACKET_CLOSE            /* list literal slice */
1204eac174f2Safresh1 			{ $$ = newSLICEOP(0, $expr, $QWLIST); }
1205eac174f2Safresh1 	|	PERLY_PAREN_OPEN PERLY_PAREN_CLOSE PERLY_BRACKET_OPEN expr PERLY_BRACKET_CLOSE                 /* empty list slice! */
1206eac174f2Safresh1 			{ $$ = newSLICEOP(0, $expr, NULL); }
120779cd0b9aSmillert     ;
1208e2e5c5d3Smillert 
120979cd0b9aSmillert /* Binary operators between terms */
1210*e0680481Safresh1 termbinop:	term[lhs] PLUGIN_HIGH_OP[op] term[rhs]
1211*e0680481Safresh1 			{ $$ = build_infix_plugin($lhs, $rhs, $op); }
1212*e0680481Safresh1 	|	term[lhs] ASSIGNOP term[rhs]                     /* $x = $y, $x += $y */
1213eac174f2Safresh1 			{ $$ = newASSIGNOP(OPf_STACKED, $lhs, $ASSIGNOP, $rhs); }
1214*e0680481Safresh1 	|	term[lhs] PLUGIN_ASSIGN_OP[op] term[rhs]
1215*e0680481Safresh1 			{ $$ = build_infix_plugin($lhs, $rhs, $op); }
1216eac174f2Safresh1 	|	term[lhs] POWOP term[rhs]                        /* $x ** $y */
1217eac174f2Safresh1 			{ $$ = newBINOP($POWOP, 0, scalar($lhs), scalar($rhs)); }
1218*e0680481Safresh1 	|	term[lhs] PLUGIN_POW_OP[op] term[rhs]
1219*e0680481Safresh1 			{ $$ = build_infix_plugin($lhs, $rhs, $op); }
1220eac174f2Safresh1 	|	term[lhs] MULOP term[rhs]                        /* $x * $y, $x x $y */
1221eac174f2Safresh1 			{   if ($MULOP != OP_REPEAT)
1222eac174f2Safresh1 				scalar($lhs);
1223eac174f2Safresh1 			    $$ = newBINOP($MULOP, 0, $lhs, scalar($rhs));
12247bfa9f44Smillert 			}
1225*e0680481Safresh1 	|	term[lhs] PLUGIN_MUL_OP[op] term[rhs]
1226*e0680481Safresh1 			{ $$ = build_infix_plugin($lhs, $rhs, $op); }
1227eac174f2Safresh1 	|	term[lhs] ADDOP term[rhs]                        /* $x + $y */
1228eac174f2Safresh1 			{ $$ = newBINOP($ADDOP, 0, scalar($lhs), scalar($rhs)); }
1229*e0680481Safresh1 	|	term[lhs] PLUGIN_ADD_OP[op] term[rhs]
1230*e0680481Safresh1 			{ $$ = build_infix_plugin($lhs, $rhs, $op); }
1231eac174f2Safresh1 	|	term[lhs] SHIFTOP term[rhs]                      /* $x >> $y, $x << $y */
1232eac174f2Safresh1 			{ $$ = newBINOP($SHIFTOP, 0, scalar($lhs), scalar($rhs)); }
123356d68f1eSafresh1 	|	termrelop %prec PREC_LOW               /* $x > $y, etc. */
1234eac174f2Safresh1 			{ $$ = $termrelop; }
123556d68f1eSafresh1 	|	termeqop %prec PREC_LOW                /* $x == $y, $x cmp $y */
1236eac174f2Safresh1 			{ $$ = $termeqop; }
1237eac174f2Safresh1 	|	term[lhs] BITANDOP term[rhs]                     /* $x & $y */
1238eac174f2Safresh1 			{ $$ = newBINOP($BITANDOP, 0, scalar($lhs), scalar($rhs)); }
1239eac174f2Safresh1 	|	term[lhs] BITOROP term[rhs]                      /* $x | $y */
1240eac174f2Safresh1 			{ $$ = newBINOP($BITOROP, 0, scalar($lhs), scalar($rhs)); }
1241eac174f2Safresh1 	|	term[lhs] DOTDOT term[rhs]                       /* $x..$y, $x...$y */
1242eac174f2Safresh1 			{ $$ = newRANGE($DOTDOT, scalar($lhs), scalar($rhs)); }
1243eac174f2Safresh1 	|	term[lhs] ANDAND term[rhs]                       /* $x && $y */
1244eac174f2Safresh1 			{ $$ = newLOGOP(OP_AND, 0, $lhs, $rhs); }
1245*e0680481Safresh1 	|	term[lhs] PLUGIN_LOGICAL_AND_OP[op] term[rhs]
1246*e0680481Safresh1 			{ $$ = build_infix_plugin($lhs, $rhs, $op); }
1247eac174f2Safresh1 	|	term[lhs] OROR term[rhs]                         /* $x || $y */
1248eac174f2Safresh1 			{ $$ = newLOGOP(OP_OR, 0, $lhs, $rhs); }
1249*e0680481Safresh1 	|	term[lhs] PLUGIN_LOGICAL_OR_OP[op] term[rhs]
1250*e0680481Safresh1 			{ $$ = build_infix_plugin($lhs, $rhs, $op); }
1251eac174f2Safresh1 	|	term[lhs] DORDOR term[rhs]                       /* $x // $y */
1252eac174f2Safresh1 			{ $$ = newLOGOP(OP_DOR, 0, $lhs, $rhs); }
1253eac174f2Safresh1 	|	term[lhs] MATCHOP term[rhs]                      /* $x =~ /$y/ */
1254eac174f2Safresh1 			{ $$ = bind_match($MATCHOP, $lhs, $rhs); }
1255*e0680481Safresh1 	|	term[lhs] PLUGIN_LOW_OP[op] term[rhs]
1256*e0680481Safresh1 			{ $$ = build_infix_plugin($lhs, $rhs, $op); }
125779cd0b9aSmillert     ;
1258e2e5c5d3Smillert 
125956d68f1eSafresh1 termrelop:	relopchain %prec PREC_LOW
1260eac174f2Safresh1 			{ $$ = cmpchain_finish($relopchain); }
1261eac174f2Safresh1 	|	term[lhs] NCRELOP term[rhs]
1262eac174f2Safresh1 			{ $$ = newBINOP($NCRELOP, 0, scalar($lhs), scalar($rhs)); }
126356d68f1eSafresh1 	|	termrelop NCRELOP
126456d68f1eSafresh1 			{ yyerror("syntax error"); YYERROR; }
126556d68f1eSafresh1 	|	termrelop CHRELOP
126656d68f1eSafresh1 			{ yyerror("syntax error"); YYERROR; }
1267*e0680481Safresh1 	|	term[lhs] PLUGIN_REL_OP[op] term[rhs]
1268*e0680481Safresh1 			{ $$ = build_infix_plugin($lhs, $rhs, $op); }
126956d68f1eSafresh1 	;
127056d68f1eSafresh1 
1271eac174f2Safresh1 relopchain:	term[lhs] CHRELOP term[rhs]
1272eac174f2Safresh1 			{ $$ = cmpchain_start($CHRELOP, $lhs, $rhs); }
1273eac174f2Safresh1 	|	relopchain[lhs] CHRELOP term[rhs]
1274eac174f2Safresh1 			{ $$ = cmpchain_extend($CHRELOP, $lhs, $rhs); }
127556d68f1eSafresh1 	;
127656d68f1eSafresh1 
127756d68f1eSafresh1 termeqop:	eqopchain %prec PREC_LOW
1278eac174f2Safresh1 			{ $$ = cmpchain_finish($eqopchain); }
1279eac174f2Safresh1 	|	term[lhs] NCEQOP term[rhs]
1280eac174f2Safresh1 			{ $$ = newBINOP($NCEQOP, 0, scalar($lhs), scalar($rhs)); }
128156d68f1eSafresh1 	|	termeqop NCEQOP
128256d68f1eSafresh1 			{ yyerror("syntax error"); YYERROR; }
128356d68f1eSafresh1 	|	termeqop CHEQOP
128456d68f1eSafresh1 			{ yyerror("syntax error"); YYERROR; }
128556d68f1eSafresh1 	;
128656d68f1eSafresh1 
1287eac174f2Safresh1 eqopchain:	term[lhs] CHEQOP term[rhs]
1288eac174f2Safresh1 			{ $$ = cmpchain_start($CHEQOP, $lhs, $rhs); }
1289eac174f2Safresh1 	|	eqopchain[lhs] CHEQOP term[rhs]
1290eac174f2Safresh1 			{ $$ = cmpchain_extend($CHEQOP, $lhs, $rhs); }
129156d68f1eSafresh1 	;
129256d68f1eSafresh1 
129379cd0b9aSmillert /* Unary operators and terms */
1294eac174f2Safresh1 termunop : PERLY_MINUS term %prec UMINUS                       /* -$x */
1295eac174f2Safresh1 			{ $$ = newUNOP(OP_NEGATE, 0, scalar($term)); }
1296eac174f2Safresh1 	|	PERLY_PLUS term %prec UMINUS                  /* +$x */
1297eac174f2Safresh1 			{ $$ = $term; }
1298b8851fccSafresh1 
1299eac174f2Safresh1 	|	PERLY_EXCLAMATION_MARK term                               /* !$x */
1300eac174f2Safresh1 			{ $$ = newUNOP(OP_NOT, 0, scalar($term)); }
1301eac174f2Safresh1 	|	PERLY_TILDE term                               /* ~$x */
1302eac174f2Safresh1 			{ $$ = newUNOP($PERLY_TILDE, 0, scalar($term)); }
130379cd0b9aSmillert 	|	term POSTINC                           /* $x++ */
1304e2e5c5d3Smillert 			{ $$ = newUNOP(OP_POSTINC, 0,
1305eac174f2Safresh1 					op_lvalue(scalar($term), OP_POSTINC)); }
130679cd0b9aSmillert 	|	term POSTDEC                           /* $x-- */
1307e2e5c5d3Smillert 			{ $$ = newUNOP(OP_POSTDEC, 0,
1308eac174f2Safresh1 					op_lvalue(scalar($term), OP_POSTDEC));}
1309e5157e49Safresh1 	|	term POSTJOIN    /* implicit join after interpolated ->@ */
1310b8851fccSafresh1 			{ $$ = op_convert_list(OP_JOIN, 0,
1311e5157e49Safresh1 				       op_append_elem(
1312e5157e49Safresh1 					OP_LIST,
1313e5157e49Safresh1 					newSVREF(scalar(
1314e5157e49Safresh1 					    newSVOP(OP_CONST,0,
1315e5157e49Safresh1 						    newSVpvs("\""))
1316e5157e49Safresh1 					)),
1317eac174f2Safresh1 					$term
1318e5157e49Safresh1 				       ));
1319e5157e49Safresh1 			}
132079cd0b9aSmillert 	|	PREINC term                            /* ++$x */
1321e2e5c5d3Smillert 			{ $$ = newUNOP(OP_PREINC, 0,
1322eac174f2Safresh1 					op_lvalue(scalar($term), OP_PREINC)); }
132379cd0b9aSmillert 	|	PREDEC term                            /* --$x */
1324e2e5c5d3Smillert 			{ $$ = newUNOP(OP_PREDEC, 0,
1325eac174f2Safresh1 					op_lvalue(scalar($term), OP_PREDEC)); }
132679cd0b9aSmillert 
132779cd0b9aSmillert     ;
132879cd0b9aSmillert 
132979cd0b9aSmillert /* Constructors for anonymous data */
1330eac174f2Safresh1 anonymous
1331eac174f2Safresh1 	:	PERLY_BRACKET_OPEN optexpr PERLY_BRACKET_CLOSE
1332eac174f2Safresh1 			{ $$ = newANONLIST($optexpr); }
1333eac174f2Safresh1 	|	HASHBRACK optexpr PERLY_SEMICOLON PERLY_BRACE_CLOSE	%prec PERLY_PAREN_OPEN /* { foo => "Bar" } */
1334eac174f2Safresh1 			{ $$ = newANONHASH($optexpr); }
1335*e0680481Safresh1 	|	KW_SUB_anon     startanonsub proto subattrlist subbody    %prec PERLY_PAREN_OPEN
13367bfa9f44Smillert 			{ SvREFCNT_inc_simple_void(PL_compcv);
1337eac174f2Safresh1 			  $$ = newANONATTRSUB($startanonsub, $proto, $subattrlist, $subbody); }
1338*e0680481Safresh1 	|	KW_SUB_anon_sig startanonsub subattrlist sigsubbody %prec PERLY_PAREN_OPEN
13399f11ffb7Safresh1 			{ SvREFCNT_inc_simple_void(PL_compcv);
1340eac174f2Safresh1 			  $$ = newANONATTRSUB($startanonsub, NULL, $subattrlist, $sigsubbody); }
1341*e0680481Safresh1 	|	KW_METHOD_anon startanonmethod subattrlist sigsubbody %prec PERLY_PAREN_OPEN
1342*e0680481Safresh1 			{
1343*e0680481Safresh1 			  SvREFCNT_inc_simple_void(PL_compcv);
1344*e0680481Safresh1 			  $$ = newANONATTRSUB($startanonmethod, NULL, $subattrlist, $sigsubbody);
1345*e0680481Safresh1 			}
134679cd0b9aSmillert     ;
134779cd0b9aSmillert 
134879cd0b9aSmillert /* Things called with "do" */
1349*e0680481Safresh1 termdo	:       KW_DO term	%prec UNIOP                     /* do $filename */
1350*e0680481Safresh1 			{ $$ = dofile($term, $KW_DO);}
1351*e0680481Safresh1 	|	KW_DO block	%prec PERLY_PAREN_OPEN               /* do { code */
1352eac174f2Safresh1 			{ $$ = newUNOP(OP_NULL, OPf_SPECIAL, op_scope($block));}
135379cd0b9aSmillert         ;
135479cd0b9aSmillert 
1355eac174f2Safresh1 term[product]	:	termbinop
135679cd0b9aSmillert 	|	termunop
135779cd0b9aSmillert 	|	anonymous
135879cd0b9aSmillert 	|	termdo
1359eac174f2Safresh1 	|	term[condition] PERLY_QUESTION_MARK term[then] PERLY_COLON term[else]
1360eac174f2Safresh1 			{ $$ = newCONDOP(0, $condition, $then, $else); }
1361eac174f2Safresh1 	|	REFGEN term[operand]                          /* \$x, \@y, \%z */
1362eac174f2Safresh1 			{ $$ = newUNOP(OP_REFGEN, 0, $operand); }
136379cd0b9aSmillert 	|	myattrterm	%prec UNIOP
1364eac174f2Safresh1 			{ $$ = $myattrterm; }
1365*e0680481Safresh1 	|	KW_LOCAL term[operand]	%prec UNIOP
1366eac174f2Safresh1 			{ $$ = localize($operand,0); }
1367eac174f2Safresh1 	|	PERLY_PAREN_OPEN expr PERLY_PAREN_CLOSE
1368eac174f2Safresh1 			{ $$ = sawparens($expr); }
136948950c12Ssthen 	|	QWLIST
1370eac174f2Safresh1 			{ $$ = $QWLIST; }
1371eac174f2Safresh1 	|	PERLY_PAREN_OPEN PERLY_PAREN_CLOSE
1372b8851fccSafresh1 			{ $$ = sawparens(newNULLLIST()); }
1373eac174f2Safresh1 	|	scalar	%prec PERLY_PAREN_OPEN
1374eac174f2Safresh1 			{ $$ = $scalar; }
1375eac174f2Safresh1 	|	star	%prec PERLY_PAREN_OPEN
1376eac174f2Safresh1 			{ $$ = $star; }
1377eac174f2Safresh1 	|	hsh 	%prec PERLY_PAREN_OPEN
1378eac174f2Safresh1 			{ $$ = $hsh; }
1379eac174f2Safresh1 	|	ary 	%prec PERLY_PAREN_OPEN
1380eac174f2Safresh1 			{ $$ = $ary; }
1381eac174f2Safresh1 	|	arylen 	%prec PERLY_PAREN_OPEN                    /* $#x, $#{ something } */
1382eac174f2Safresh1 			{ $$ = newUNOP(OP_AV2ARYLEN, 0, ref($arylen, OP_AV2ARYLEN));}
138379cd0b9aSmillert 	|       subscripted
1384eac174f2Safresh1 			{ $$ = $subscripted; }
1385eac174f2Safresh1 	|	sliceme PERLY_BRACKET_OPEN expr PERLY_BRACKET_CLOSE                     /* array slice */
138648950c12Ssthen 			{ $$ = op_prepend_elem(OP_ASLICE,
138779cd0b9aSmillert 				newOP(OP_PUSHMARK, 0),
138879cd0b9aSmillert 				    newLISTOP(OP_ASLICE, 0,
1389eac174f2Safresh1 					list($expr),
1390eac174f2Safresh1 					ref($sliceme, OP_ASLICE)));
1391eac174f2Safresh1 			  if ($$ && $sliceme)
1392e5157e49Safresh1 			      $$->op_private |=
1393eac174f2Safresh1 				  $sliceme->op_private & OPpSLICEWARNING;
13947bfa9f44Smillert 			}
1395eac174f2Safresh1 	|	kvslice PERLY_BRACKET_OPEN expr PERLY_BRACKET_CLOSE                 /* array key/value slice */
1396e5157e49Safresh1 			{ $$ = op_prepend_elem(OP_KVASLICE,
1397e5157e49Safresh1 				newOP(OP_PUSHMARK, 0),
1398e5157e49Safresh1 				    newLISTOP(OP_KVASLICE, 0,
1399eac174f2Safresh1 					list($expr),
1400eac174f2Safresh1 					ref(oopsAV($kvslice), OP_KVASLICE)));
1401eac174f2Safresh1 			  if ($$ && $kvslice)
1402e5157e49Safresh1 			      $$->op_private |=
1403eac174f2Safresh1 				  $kvslice->op_private & OPpSLICEWARNING;
1404e5157e49Safresh1 			}
1405eac174f2Safresh1 	|	sliceme PERLY_BRACE_OPEN expr PERLY_SEMICOLON PERLY_BRACE_CLOSE                 /* @hash{@keys} */
140648950c12Ssthen 			{ $$ = op_prepend_elem(OP_HSLICE,
140779cd0b9aSmillert 				newOP(OP_PUSHMARK, 0),
140879cd0b9aSmillert 				    newLISTOP(OP_HSLICE, 0,
1409eac174f2Safresh1 					list($expr),
1410eac174f2Safresh1 					ref(oopsHV($sliceme), OP_HSLICE)));
1411eac174f2Safresh1 			  if ($$ && $sliceme)
1412e5157e49Safresh1 			      $$->op_private |=
1413eac174f2Safresh1 				  $sliceme->op_private & OPpSLICEWARNING;
1414e5157e49Safresh1 			}
1415eac174f2Safresh1 	|	kvslice PERLY_BRACE_OPEN expr PERLY_SEMICOLON PERLY_BRACE_CLOSE                 /* %hash{@keys} */
1416e5157e49Safresh1 			{ $$ = op_prepend_elem(OP_KVHSLICE,
1417e5157e49Safresh1 				newOP(OP_PUSHMARK, 0),
1418e5157e49Safresh1 				    newLISTOP(OP_KVHSLICE, 0,
1419eac174f2Safresh1 					list($expr),
1420eac174f2Safresh1 					ref($kvslice, OP_KVHSLICE)));
1421eac174f2Safresh1 			  if ($$ && $kvslice)
1422e5157e49Safresh1 			      $$->op_private |=
1423eac174f2Safresh1 				  $kvslice->op_private & OPpSLICEWARNING;
14247bfa9f44Smillert 			}
1425eac174f2Safresh1 	|	THING	%prec PERLY_PAREN_OPEN
1426eac174f2Safresh1 			{ $$ = $THING; }
142779cd0b9aSmillert 	|	amper                                /* &foo; */
1428eac174f2Safresh1 			{ $$ = newUNOP(OP_ENTERSUB, 0, scalar($amper)); }
1429eac174f2Safresh1 	|	amper PERLY_PAREN_OPEN PERLY_PAREN_CLOSE                 /* &foo() or foo() */
1430eac174f2Safresh1 			{ $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar($amper));
14317bfa9f44Smillert 			}
1432eac174f2Safresh1 	|	amper PERLY_PAREN_OPEN expr PERLY_PAREN_CLOSE          /* &foo(@args) or foo(@args) */
14337bfa9f44Smillert 			{
14347bfa9f44Smillert 			  $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
1435eac174f2Safresh1 				op_append_elem(OP_LIST, $expr, scalar($amper)));
14367bfa9f44Smillert 			}
1437e5157e49Safresh1 	|	NOAMP subname optlistexpr       /* foo @args (no parens) */
143879cd0b9aSmillert 			{ $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
1439eac174f2Safresh1 			    op_append_elem(OP_LIST, $optlistexpr, scalar($subname)));
14407bfa9f44Smillert 			}
1441eac174f2Safresh1 	|	term[operand] ARROW PERLY_DOLLAR PERLY_STAR
1442eac174f2Safresh1 			{ $$ = newSVREF($operand); }
1443eac174f2Safresh1 	|	term[operand] ARROW PERLY_SNAIL PERLY_STAR
1444eac174f2Safresh1 			{ $$ = newAVREF($operand); }
1445eac174f2Safresh1 	|	term[operand] ARROW PERLY_PERCENT_SIGN PERLY_STAR
1446eac174f2Safresh1 			{ $$ = newHVREF($operand); }
1447eac174f2Safresh1 	|	term[operand] ARROW PERLY_AMPERSAND PERLY_STAR
1448e5157e49Safresh1 			{ $$ = newUNOP(OP_ENTERSUB, 0,
1449eac174f2Safresh1 				       scalar(newCVREF($PERLY_AMPERSAND,$operand))); }
1450eac174f2Safresh1 	|	term[operand] ARROW PERLY_STAR PERLY_STAR	%prec PERLY_PAREN_OPEN
1451eac174f2Safresh1 			{ $$ = newGVREF(0,$operand); }
145279cd0b9aSmillert 	|	LOOPEX  /* loop exiting command (goto, last, dump, etc) */
1453eac174f2Safresh1 			{ $$ = newOP($LOOPEX, OPf_SPECIAL);
1454b8851fccSafresh1 			    PL_hints |= HINT_BLOCK_SCOPE; }
1455eac174f2Safresh1 	|	LOOPEX term[operand]
1456eac174f2Safresh1 			{ $$ = newLOOPEX($LOOPEX,$operand); }
145748950c12Ssthen 	|	NOTOP listexpr                       /* not $foo */
1458eac174f2Safresh1 			{ $$ = newUNOP(OP_NOT, 0, scalar($listexpr)); }
145979cd0b9aSmillert 	|	UNIOP                                /* Unary op, $_ implied */
1460eac174f2Safresh1 			{ $$ = newOP($UNIOP, 0); }
14617bfa9f44Smillert 	|	UNIOP block                          /* eval { foo }* */
1462eac174f2Safresh1 			{ $$ = newUNOP($UNIOP, 0, $block); }
1463eac174f2Safresh1 	|	UNIOP term[operand]                           /* Unary op */
1464eac174f2Safresh1 			{ $$ = newUNOP($UNIOP, 0, $operand); }
1465*e0680481Safresh1 	|	KW_REQUIRE                              /* require, $_ implied */
1466*e0680481Safresh1 			{ $$ = newOP(OP_REQUIRE, $KW_REQUIRE ? OPf_SPECIAL : 0); }
1467*e0680481Safresh1 	|	KW_REQUIRE term[operand]                         /* require Foo */
1468*e0680481Safresh1 			{ $$ = newUNOP(OP_REQUIRE, $KW_REQUIRE ? OPf_SPECIAL : 0, $operand); }
14697bfa9f44Smillert 	|	UNIOPSUB
1470eac174f2Safresh1 			{ $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar($UNIOPSUB)); }
1471eac174f2Safresh1 	|	UNIOPSUB term[operand]                        /* Sub treated as unop */
1472e2e5c5d3Smillert 			{ $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
1473eac174f2Safresh1 			    op_append_elem(OP_LIST, $operand, scalar($UNIOPSUB))); }
147479cd0b9aSmillert 	|	FUNC0                                /* Nullary operator */
1475eac174f2Safresh1 			{ $$ = newOP($FUNC0, 0); }
1476eac174f2Safresh1 	|	FUNC0 PERLY_PAREN_OPEN PERLY_PAREN_CLOSE
1477eac174f2Safresh1 			{ $$ = newOP($FUNC0, 0);}
147848950c12Ssthen 	|	FUNC0OP       /* Same as above, but op created in toke.c */
1479eac174f2Safresh1 			{ $$ = $FUNC0OP; }
1480eac174f2Safresh1 	|	FUNC0OP PERLY_PAREN_OPEN PERLY_PAREN_CLOSE
1481eac174f2Safresh1 			{ $$ = $FUNC0OP; }
148279cd0b9aSmillert 	|	FUNC0SUB                             /* Sub treated as nullop */
1483eac174f2Safresh1 			{ $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar($FUNC0SUB)); }
1484eac174f2Safresh1 	|	FUNC1 PERLY_PAREN_OPEN PERLY_PAREN_CLOSE                        /* not () */
1485eac174f2Safresh1 			{ $$ = ($FUNC1 == OP_NOT)
1486eac174f2Safresh1                           ? newUNOP($FUNC1, 0, newSVOP(OP_CONST, 0, newSViv(0)))
1487eac174f2Safresh1                           : newOP($FUNC1, OPf_SPECIAL); }
1488eac174f2Safresh1 	|	FUNC1 PERLY_PAREN_OPEN expr PERLY_PAREN_CLOSE                   /* not($foo) */
1489eac174f2Safresh1 			{ $$ = newUNOP($FUNC1, 0, $expr); }
1490e9ce3842Safresh1 	|	PMFUNC /* m//, s///, qr//, tr/// */
1491e9ce3842Safresh1 			{
1492eac174f2Safresh1 			    if (   $PMFUNC->op_type != OP_TRANS
1493eac174f2Safresh1 			        && $PMFUNC->op_type != OP_TRANSR
1494eac174f2Safresh1 				&& (((PMOP*)$PMFUNC)->op_pmflags & PMf_HAS_CV))
1495e9ce3842Safresh1 			    {
1496e9ce3842Safresh1 				$<ival>$ = start_subparse(FALSE, CVf_ANON);
1497e9ce3842Safresh1 				SAVEFREESV(PL_compcv);
1498e9ce3842Safresh1 			    } else
1499e9ce3842Safresh1 				$<ival>$ = 0;
1500e9ce3842Safresh1 			}
150156d68f1eSafresh1 		    SUBLEXSTART listexpr optrepl SUBLEXEND
1502eac174f2Safresh1 			{ $$ = pmruntime($PMFUNC, $listexpr, $optrepl, 1, $<ival>2); }
15039f11ffb7Safresh1 	|	BAREWORD
1504e2e5c5d3Smillert 	|	listop
15050dc2eaceSmillert 	|	PLUGEXPR
1506e2e5c5d3Smillert 	;
1507e2e5c5d3Smillert 
150879cd0b9aSmillert /* "my" declarations, with optional attributes */
1509eac174f2Safresh1 myattrterm
1510*e0680481Safresh1 	:	KW_MY myterm myattrlist
1511eac174f2Safresh1 			{ $$ = my_attrs($myterm,$myattrlist); }
1512*e0680481Safresh1 	|	KW_MY myterm
1513eac174f2Safresh1 			{ $$ = localize($myterm,1); }
1514*e0680481Safresh1 	|	KW_MY REFGEN myterm myattrlist
1515eac174f2Safresh1 			{ $$ = newUNOP(OP_REFGEN, 0, my_attrs($myterm,$myattrlist)); }
1516*e0680481Safresh1 	|	KW_MY REFGEN term[operand]
1517eac174f2Safresh1 			{ $$ = newUNOP(OP_REFGEN, 0, localize($operand,1)); }
1518e2e5c5d3Smillert 	;
1519e2e5c5d3Smillert 
152079cd0b9aSmillert /* Things that can be "my"'d */
1521eac174f2Safresh1 myterm	:	PERLY_PAREN_OPEN expr PERLY_PAREN_CLOSE
1522eac174f2Safresh1 			{ $$ = sawparens($expr); }
1523eac174f2Safresh1 	|	PERLY_PAREN_OPEN PERLY_PAREN_CLOSE
1524b8851fccSafresh1 			{ $$ = sawparens(newNULLLIST()); }
1525b8851fccSafresh1 
1526eac174f2Safresh1 	|	scalar	%prec PERLY_PAREN_OPEN
1527eac174f2Safresh1 			{ $$ = $scalar; }
1528eac174f2Safresh1 	|	hsh 	%prec PERLY_PAREN_OPEN
1529eac174f2Safresh1 			{ $$ = $hsh; }
1530eac174f2Safresh1 	|	ary 	%prec PERLY_PAREN_OPEN
1531eac174f2Safresh1 			{ $$ = $ary; }
1532e2e5c5d3Smillert 	;
1533e2e5c5d3Smillert 
1534*e0680481Safresh1 /* "field" declarations */
1535*e0680481Safresh1 fieldvar:	scalar	%prec PERLY_PAREN_OPEN
1536*e0680481Safresh1 			{
1537*e0680481Safresh1 			  $$ = PadnamelistARRAY(PL_comppad_name)[$scalar->op_targ];
1538*e0680481Safresh1 			  op_free($scalar);
1539*e0680481Safresh1 			}
1540*e0680481Safresh1 	|	hsh 	%prec PERLY_PAREN_OPEN
1541*e0680481Safresh1 			{
1542*e0680481Safresh1 			  $$ = PadnamelistARRAY(PL_comppad_name)[$hsh->op_targ];
1543*e0680481Safresh1 			  op_free($hsh);
1544*e0680481Safresh1 			}
1545*e0680481Safresh1 	|	ary 	%prec PERLY_PAREN_OPEN
1546*e0680481Safresh1 			{
1547*e0680481Safresh1 			  $$ = PadnamelistARRAY(PL_comppad_name)[$ary->op_targ];
1548*e0680481Safresh1 			  op_free($ary);
1549*e0680481Safresh1 			}
1550*e0680481Safresh1 	;
1551*e0680481Safresh1 
1552*e0680481Safresh1 optfieldattrlist:
1553*e0680481Safresh1 		COLONATTR THING
1554*e0680481Safresh1 			{ $$ = $THING; }
1555*e0680481Safresh1 	|	COLONATTR
1556*e0680481Safresh1 			{ $$ = NULL; }
1557*e0680481Safresh1 	|	empty
1558*e0680481Safresh1 	;
1559*e0680481Safresh1 
1560*e0680481Safresh1 fielddecl
1561*e0680481Safresh1 	:	KW_FIELD fieldvar optfieldattrlist
1562*e0680481Safresh1 			{
1563*e0680481Safresh1 			  parser->in_my = 0;
1564*e0680481Safresh1 			  if($optfieldattrlist)
1565*e0680481Safresh1 			    class_apply_field_attributes((PADNAME *)$fieldvar, $optfieldattrlist);
1566*e0680481Safresh1 			  $$ = newOP(OP_NULL, 0);
1567*e0680481Safresh1 			}
1568*e0680481Safresh1 	|	KW_FIELD fieldvar optfieldattrlist ASSIGNOP
1569*e0680481Safresh1 			{
1570*e0680481Safresh1 			  parser->in_my = 0;
1571*e0680481Safresh1 			  if($optfieldattrlist)
1572*e0680481Safresh1 			    class_apply_field_attributes((PADNAME *)$fieldvar, $optfieldattrlist);
1573*e0680481Safresh1 			  ENTER;
1574*e0680481Safresh1 			  class_prepare_initfield_parse();
1575*e0680481Safresh1 			}
1576*e0680481Safresh1 		term
1577*e0680481Safresh1 			{
1578*e0680481Safresh1 			  class_set_field_defop((PADNAME *)$fieldvar, $ASSIGNOP, $term);
1579*e0680481Safresh1 			  LEAVE;
1580*e0680481Safresh1 			  $$ = newOP(OP_NULL, 0);
1581*e0680481Safresh1 			}
1582*e0680481Safresh1 	;
1583*e0680481Safresh1 
158479cd0b9aSmillert /* Basic list expressions */
1585eac174f2Safresh1 optlistexpr
1586eac174f2Safresh1 	:	empty                   %prec PREC_LOW
158748950c12Ssthen 	|	listexpr                %prec PREC_LOW
1588e2e5c5d3Smillert 	;
1589e2e5c5d3Smillert 
1590eac174f2Safresh1 optexpr
1591eac174f2Safresh1 	:	empty
1592e2e5c5d3Smillert 	|	expr
159348950c12Ssthen 	;
15947bfa9f44Smillert 
1595eac174f2Safresh1 optrepl
1596eac174f2Safresh1 	:	empty
1597eac174f2Safresh1 	|	PERLY_SLASH expr        { $$ = $expr; }
1598b8851fccSafresh1 	;
1599b8851fccSafresh1 
160079cd0b9aSmillert /* A little bit of trickery to make "for my $foo (@bar)" actually be
160179cd0b9aSmillert    lexical */
1602e2e5c5d3Smillert my_scalar:	scalar
1603eac174f2Safresh1 			{ parser->in_my = 0; $$ = my($scalar); }
1604eac174f2Safresh1 	;
1605eac174f2Safresh1 
1606eac174f2Safresh1 /* A list of scalars for "for my ($foo, $bar) (@baz)"  */
1607eac174f2Safresh1 list_of_scalars:	list_of_scalars[list] PERLY_COMMA
1608eac174f2Safresh1 			{ $$ = $list; }
1609eac174f2Safresh1 	|		list_of_scalars[list] PERLY_COMMA scalar
1610eac174f2Safresh1 			{
1611eac174f2Safresh1 			  $$ = op_append_elem(OP_LIST, $list, $scalar);
1612eac174f2Safresh1 			}
1613eac174f2Safresh1 	|		scalar %prec PREC_LOW
1614eac174f2Safresh1 	;
1615eac174f2Safresh1 
1616eac174f2Safresh1 my_list_of_scalars:	list_of_scalars
1617eac174f2Safresh1 			{ parser->in_my = 0; $$ = $list_of_scalars; }
1618b8851fccSafresh1 	;
1619b8851fccSafresh1 
1620b8851fccSafresh1 my_var	:	scalar
1621b8851fccSafresh1 	|	ary
1622b8851fccSafresh1 	|	hsh
1623b8851fccSafresh1 	;
1624b8851fccSafresh1 
1625b8851fccSafresh1 refgen_topic:	my_var
1626b8851fccSafresh1 	|	amper
1627e2e5c5d3Smillert 	;
1628e2e5c5d3Smillert 
1629*e0680481Safresh1 my_refgen:	KW_MY REFGEN
1630*e0680481Safresh1 	|	REFGEN KW_MY
16319f11ffb7Safresh1 	;
16329f11ffb7Safresh1 
1633eac174f2Safresh1 amper	:	PERLY_AMPERSAND indirob
1634eac174f2Safresh1 			{ $$ = newCVREF($PERLY_AMPERSAND,$indirob); }
1635e2e5c5d3Smillert 	;
1636e2e5c5d3Smillert 
1637eac174f2Safresh1 scalar	:	PERLY_DOLLAR indirob
1638eac174f2Safresh1 			{ $$ = newSVREF($indirob); }
1639e2e5c5d3Smillert 	;
1640e2e5c5d3Smillert 
1641eac174f2Safresh1 ary	:	PERLY_SNAIL indirob
1642eac174f2Safresh1 			{ $$ = newAVREF($indirob);
1643eac174f2Safresh1 			  if ($$) $$->op_private |= $PERLY_SNAIL;
16447bfa9f44Smillert 			}
1645e2e5c5d3Smillert 	;
1646e2e5c5d3Smillert 
1647eac174f2Safresh1 hsh	:	PERLY_PERCENT_SIGN indirob
1648eac174f2Safresh1 			{ $$ = newHVREF($indirob);
1649eac174f2Safresh1 			  if ($$) $$->op_private |= $PERLY_PERCENT_SIGN;
16507bfa9f44Smillert 			}
1651e2e5c5d3Smillert 	;
1652e2e5c5d3Smillert 
1653e2e5c5d3Smillert arylen	:	DOLSHARP indirob
1654eac174f2Safresh1 			{ $$ = newAVREF($indirob); }
1655eac174f2Safresh1 	|	term ARROW DOLSHARP PERLY_STAR
1656eac174f2Safresh1 			{ $$ = newAVREF($term); }
1657e2e5c5d3Smillert 	;
1658e2e5c5d3Smillert 
1659eac174f2Safresh1 star	:	PERLY_STAR indirob
1660eac174f2Safresh1 			{ $$ = newGVREF(0,$indirob); }
1661e2e5c5d3Smillert 	;
1662e2e5c5d3Smillert 
1663e5157e49Safresh1 sliceme	:	ary
1664eac174f2Safresh1 	|	term ARROW PERLY_SNAIL
1665eac174f2Safresh1 			{ $$ = newAVREF($term); }
1666e5157e49Safresh1 	;
1667e5157e49Safresh1 
1668e5157e49Safresh1 kvslice	:	hsh
1669eac174f2Safresh1 	|	term ARROW PERLY_PERCENT_SIGN
1670eac174f2Safresh1 			{ $$ = newHVREF($term); }
1671e5157e49Safresh1 	;
1672e5157e49Safresh1 
1673e5157e49Safresh1 gelem	:	star
1674eac174f2Safresh1 	|	term ARROW PERLY_STAR
1675eac174f2Safresh1 			{ $$ = newGVREF(0,$term); }
1676e5157e49Safresh1 	;
1677e5157e49Safresh1 
167879cd0b9aSmillert /* Indirect objects */
16799f11ffb7Safresh1 indirob	:	BAREWORD
1680eac174f2Safresh1 			{ $$ = scalar($BAREWORD); }
1681e2e5c5d3Smillert 	|	scalar %prec PREC_LOW
1682eac174f2Safresh1 			{ $$ = scalar($scalar); }
1683e2e5c5d3Smillert 	|	block
1684eac174f2Safresh1 			{ $$ = op_scope($block); }
1685e2e5c5d3Smillert 
1686e2e5c5d3Smillert 	|	PRIVATEREF
1687eac174f2Safresh1 			{ $$ = $PRIVATEREF; }
1688e2e5c5d3Smillert 	;
1689