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