PageRenderTime 74ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/perl-5.16.0/perly.y

#
Happy | 1385 lines | 1309 code | 76 blank | 0 comment | 0 complexity | 5dc6959d7586687e89070704593aef87 MD5 | raw file
Possible License(s): AGPL-1.0
  1. /* perly.y
  2. *
  3. * Copyright (c) 1991-2002, 2003, 2004, 2005, 2006 Larry Wall
  4. * Copyright (c) 2007, 2008, 2009, 2010, 2011 by Larry Wall and others
  5. *
  6. * You may distribute under the terms of either the GNU General Public
  7. * License or the Artistic License, as specified in the README file.
  8. *
  9. */
  10. /*
  11. * 'I see,' laughed Strider. 'I look foul and feel fair. Is that it?
  12. * All that is gold does not glitter, not all those who wander are lost.'
  13. *
  14. * [p.171 of _The Lord of the Rings_, I/x: "Strider"]
  15. */
  16. /*
  17. * This file holds the grammar for the Perl language. If edited, you need
  18. * to run regen_perly.pl, which re-creates the files perly.h, perly.tab
  19. * and perly.act which are derived from this.
  20. *
  21. * Note that these derived files are included and compiled twice; once
  22. * from perly.c, and once from madly.c. The second time, a number of MAD
  23. * macros are defined, which compile in extra code that allows the parse
  24. * tree to be accurately dumped. In particular:
  25. *
  26. * MAD defined if compiling madly.c
  27. * DO_MAD(A) expands to A under madly.c, to null otherwise
  28. * IF_MAD(a,b) expands to A under madly.c, to B otherwise
  29. * TOKEN_GETMAD() expands to token_getmad() under madly.c, to null otherwise
  30. * TOKEN_FREE() similarly
  31. * OP_GETMAD() similarly
  32. * IVAL(i) expands to (i)->tk_lval.ival or (i)
  33. * PVAL(p) expands to (p)->tk_lval.pval or (p)
  34. *
  35. * The main job of of this grammar is to call the various newFOO()
  36. * functions in op.c to build a syntax tree of OP structs.
  37. * It relies on the lexer in toke.c to do the tokenizing.
  38. *
  39. * Note: due to the way that the cleanup code works WRT to freeing ops on
  40. * the parse stack, it is dangerous to assign to the $n variables within
  41. * an action.
  42. */
  43. /* Make the parser re-entrant. */
  44. %pure_parser
  45. /* FIXME for MAD - is the new mintro on while and until important? */
  46. %start grammar
  47. %union {
  48. I32 ival; /* __DEFAULT__ (marker for regen_perly.pl;
  49. must always be 1st union member) */
  50. char *pval;
  51. OP *opval;
  52. GV *gvval;
  53. #ifdef PERL_IN_MADLY_C
  54. TOKEN* p_tkval;
  55. TOKEN* i_tkval;
  56. #else
  57. char *p_tkval;
  58. I32 i_tkval;
  59. #endif
  60. #ifdef PERL_MAD
  61. TOKEN* tkval;
  62. #endif
  63. }
  64. %token <ival> GRAMPROG GRAMEXPR GRAMBLOCK GRAMBARESTMT GRAMFULLSTMT GRAMSTMTSEQ
  65. %token <i_tkval> '{' '}' '[' ']' '-' '+' '$' '@' '%' '*' '&' ';'
  66. %token <opval> WORD METHOD FUNCMETH THING PMFUNC PRIVATEREF QWLIST
  67. %token <opval> FUNC0OP FUNC0SUB UNIOPSUB LSTOPSUB
  68. %token <opval> PLUGEXPR PLUGSTMT
  69. %token <p_tkval> LABEL
  70. %token <i_tkval> FORMAT SUB ANONSUB PACKAGE USE
  71. %token <i_tkval> WHILE UNTIL IF UNLESS ELSE ELSIF CONTINUE FOR
  72. %token <i_tkval> GIVEN WHEN DEFAULT
  73. %token <i_tkval> LOOPEX DOTDOT YADAYADA
  74. %token <i_tkval> FUNC0 FUNC1 FUNC UNIOP LSTOP
  75. %token <i_tkval> RELOP EQOP MULOP ADDOP
  76. %token <i_tkval> DOLSHARP DO HASHBRACK NOAMP
  77. %token <i_tkval> LOCAL MY MYSUB REQUIRE
  78. %token <i_tkval> COLONATTR
  79. %type <i_tkval> lpar_or_qw
  80. %type <ival> grammar remember mremember
  81. %type <ival> startsub startanonsub startformsub
  82. /* FIXME for MAD - are these two ival? */
  83. %type <ival> mydefsv mintro
  84. %type <opval> stmtseq fullstmt labfullstmt barestmt block mblock else
  85. %type <opval> expr term subscripted scalar ary hsh arylen star amper sideff
  86. %type <opval> listexpr nexpr texpr iexpr mexpr mnexpr miexpr
  87. %type <opval> optlistexpr optexpr indirob listop method
  88. %type <opval> formname subname proto subbody cont my_scalar
  89. %type <opval> subattrlist myattrlist myattrterm myterm
  90. %type <opval> termbinop termunop anonymous termdo
  91. %nonassoc <i_tkval> PREC_LOW
  92. %nonassoc LOOPEX
  93. %left <i_tkval> OROP DOROP
  94. %left <i_tkval> ANDOP
  95. %right <i_tkval> NOTOP
  96. %nonassoc LSTOP LSTOPSUB
  97. %left <i_tkval> ','
  98. %right <i_tkval> ASSIGNOP
  99. %right <i_tkval> '?' ':'
  100. %nonassoc DOTDOT YADAYADA
  101. %left <i_tkval> OROR DORDOR
  102. %left <i_tkval> ANDAND
  103. %left <i_tkval> BITOROP
  104. %left <i_tkval> BITANDOP
  105. %nonassoc EQOP
  106. %nonassoc RELOP
  107. %nonassoc UNIOP UNIOPSUB
  108. %nonassoc REQUIRE
  109. %left <i_tkval> SHIFTOP
  110. %left ADDOP
  111. %left MULOP
  112. %left <i_tkval> MATCHOP
  113. %right <i_tkval> '!' '~' UMINUS REFGEN
  114. %right <i_tkval> POWOP
  115. %nonassoc <i_tkval> PREINC PREDEC POSTINC POSTDEC
  116. %left <i_tkval> ARROW
  117. %nonassoc <i_tkval> ')'
  118. %left <i_tkval> '('
  119. %left '[' '{'
  120. %token <i_tkval> PEG
  121. %% /* RULES */
  122. /* Top-level choice of what kind of thing yyparse was called to parse */
  123. grammar : GRAMPROG
  124. {
  125. PL_parser->expect = XSTATE;
  126. }
  127. remember stmtseq
  128. {
  129. newPROG(block_end($3,$4));
  130. $$ = 0;
  131. }
  132. | GRAMEXPR
  133. {
  134. parser->expect = XTERM;
  135. }
  136. optexpr
  137. {
  138. PL_eval_root = $3;
  139. $$ = 0;
  140. }
  141. | GRAMBLOCK
  142. {
  143. parser->expect = XBLOCK;
  144. }
  145. block
  146. {
  147. PL_pad_reset_pending = TRUE;
  148. PL_eval_root = $3;
  149. $$ = 0;
  150. yyunlex();
  151. parser->yychar = YYEOF;
  152. }
  153. | GRAMBARESTMT
  154. {
  155. parser->expect = XSTATE;
  156. }
  157. barestmt
  158. {
  159. PL_pad_reset_pending = TRUE;
  160. PL_eval_root = $3;
  161. $$ = 0;
  162. yyunlex();
  163. parser->yychar = YYEOF;
  164. }
  165. | GRAMFULLSTMT
  166. {
  167. parser->expect = XSTATE;
  168. }
  169. fullstmt
  170. {
  171. PL_pad_reset_pending = TRUE;
  172. PL_eval_root = $3;
  173. $$ = 0;
  174. yyunlex();
  175. parser->yychar = YYEOF;
  176. }
  177. | GRAMSTMTSEQ
  178. {
  179. parser->expect = XSTATE;
  180. }
  181. stmtseq
  182. {
  183. PL_eval_root = $3;
  184. $$ = 0;
  185. }
  186. ;
  187. /* An ordinary block */
  188. block : '{' remember stmtseq '}'
  189. { if (PL_parser->copline > (line_t)IVAL($1))
  190. PL_parser->copline = (line_t)IVAL($1);
  191. $$ = block_end($2, $3);
  192. TOKEN_GETMAD($1,$$,'{');
  193. TOKEN_GETMAD($4,$$,'}');
  194. }
  195. ;
  196. remember: /* NULL */ /* start a full lexical scope */
  197. { $$ = block_start(TRUE); }
  198. ;
  199. mydefsv: /* NULL */ /* lexicalize $_ */
  200. { $$ = (I32) Perl_allocmy(aTHX_ STR_WITH_LEN("$_"), 0); }
  201. ;
  202. mblock : '{' mremember stmtseq '}'
  203. { if (PL_parser->copline > (line_t)IVAL($1))
  204. PL_parser->copline = (line_t)IVAL($1);
  205. $$ = block_end($2, $3);
  206. TOKEN_GETMAD($1,$$,'{');
  207. TOKEN_GETMAD($4,$$,'}');
  208. }
  209. ;
  210. mremember: /* NULL */ /* start a partial lexical scope */
  211. { $$ = block_start(FALSE); }
  212. ;
  213. /* A sequence of statements in the program */
  214. stmtseq : /* NULL */
  215. { $$ = (OP*)NULL; }
  216. | stmtseq fullstmt
  217. { $$ = op_append_list(OP_LINESEQ, $1, $2);
  218. PL_pad_reset_pending = TRUE;
  219. if ($1 && $2)
  220. PL_hints |= HINT_BLOCK_SCOPE;
  221. }
  222. ;
  223. /* A statement in the program, including optional labels */
  224. fullstmt: barestmt
  225. {
  226. if($1) {
  227. $$ = newSTATEOP(0, NULL, $1);
  228. } else {
  229. $$ = IF_MAD(newOP(OP_NULL, 0), NULL);
  230. }
  231. }
  232. | labfullstmt
  233. { $$ = $1; }
  234. ;
  235. labfullstmt: LABEL barestmt
  236. {
  237. $$ = newSTATEOP(SvUTF8(((SVOP*)$1)->op_sv),
  238. savepv(SvPVX(((SVOP*)$1)->op_sv)), $2);
  239. TOKEN_GETMAD($1,
  240. $2 ? cLISTOPx($$)->op_first : $$, 'L');
  241. }
  242. | LABEL labfullstmt
  243. {
  244. $$ = newSTATEOP(SvUTF8(((SVOP*)$1)->op_sv),
  245. savepv(SvPVX(((SVOP*)$1)->op_sv)), $2);
  246. TOKEN_GETMAD($1, cLISTOPx($$)->op_first, 'L');
  247. }
  248. ;
  249. /* A bare statement, lacking label and other aspects of state op */
  250. barestmt: PLUGSTMT
  251. { $$ = $1; }
  252. | PEG
  253. {
  254. $$ = newOP(OP_NULL,0);
  255. TOKEN_GETMAD($1,$$,'p');
  256. }
  257. | FORMAT startformsub formname block
  258. {
  259. CV *fmtcv = PL_compcv;
  260. SvREFCNT_inc_simple_void(PL_compcv);
  261. #ifdef MAD
  262. $$ = newFORM($2, $3, $4);
  263. prepend_madprops($1->tk_mad, $$, 'F');
  264. $1->tk_mad = 0;
  265. token_free($1);
  266. #else
  267. newFORM($2, $3, $4);
  268. $$ = (OP*)NULL;
  269. #endif
  270. if (CvOUTSIDE(fmtcv) && !CvUNIQUE(CvOUTSIDE(fmtcv))) {
  271. SvREFCNT_inc_simple_void(fmtcv);
  272. pad_add_anon(fmtcv, OP_NULL);
  273. }
  274. }
  275. | SUB startsub subname proto subattrlist subbody
  276. {
  277. SvREFCNT_inc_simple_void(PL_compcv);
  278. #ifdef MAD
  279. {
  280. OP* o = newSVOP(OP_ANONCODE, 0,
  281. (SV*)newATTRSUB($2, $3, $4, $5, $6));
  282. $$ = newOP(OP_NULL,0);
  283. op_getmad(o,$$,'&');
  284. op_getmad($3,$$,'n');
  285. op_getmad($4,$$,'s');
  286. op_getmad($5,$$,'a');
  287. token_getmad($1,$$,'d');
  288. append_madprops($6->op_madprop, $$, 0);
  289. $6->op_madprop = 0;
  290. }
  291. #else
  292. newATTRSUB($2, $3, $4, $5, $6);
  293. $$ = (OP*)NULL;
  294. #endif
  295. }
  296. | MYSUB startsub subname proto subattrlist subbody
  297. {
  298. /* Unimplemented "my sub foo { }" */
  299. SvREFCNT_inc_simple_void(PL_compcv);
  300. #ifdef MAD
  301. $$ = newMYSUB($2, $3, $4, $5, $6);
  302. token_getmad($1,$$,'d');
  303. #else
  304. newMYSUB($2, $3, $4, $5, $6);
  305. $$ = (OP*)NULL;
  306. #endif
  307. }
  308. | PACKAGE WORD WORD ';'
  309. {
  310. #ifdef MAD
  311. $$ = package($3);
  312. token_getmad($1,$$,'o');
  313. if ($2)
  314. package_version($2);
  315. token_getmad($4,$$,';');
  316. #else
  317. package($3);
  318. if ($2)
  319. package_version($2);
  320. $$ = (OP*)NULL;
  321. #endif
  322. }
  323. | USE startsub
  324. { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ }
  325. WORD WORD optlistexpr ';'
  326. {
  327. SvREFCNT_inc_simple_void(PL_compcv);
  328. #ifdef MAD
  329. $$ = utilize(IVAL($1), $2, $4, $5, $6);
  330. token_getmad($1,$$,'o');
  331. token_getmad($7,$$,';');
  332. if (PL_parser->rsfp_filters &&
  333. AvFILLp(PL_parser->rsfp_filters) >= 0)
  334. append_madprops(newMADPROP('!', MAD_NULL, NULL, 0), $$, 0);
  335. #else
  336. utilize(IVAL($1), $2, $4, $5, $6);
  337. $$ = (OP*)NULL;
  338. #endif
  339. }
  340. | IF lpar_or_qw remember mexpr ')' mblock else
  341. {
  342. $$ = block_end($3,
  343. newCONDOP(0, $4, op_scope($6), $7));
  344. TOKEN_GETMAD($1,$$,'I');
  345. TOKEN_GETMAD($2,$$,'(');
  346. TOKEN_GETMAD($5,$$,')');
  347. PL_parser->copline = (line_t)IVAL($1);
  348. }
  349. | UNLESS lpar_or_qw remember miexpr ')' mblock else
  350. {
  351. $$ = block_end($3,
  352. newCONDOP(0, $4, op_scope($6), $7));
  353. TOKEN_GETMAD($1,$$,'I');
  354. TOKEN_GETMAD($2,$$,'(');
  355. TOKEN_GETMAD($5,$$,')');
  356. PL_parser->copline = (line_t)IVAL($1);
  357. }
  358. | GIVEN lpar_or_qw remember mydefsv mexpr ')' mblock
  359. {
  360. $$ = block_end($3,
  361. newGIVENOP($5, op_scope($7), (PADOFFSET)$4));
  362. PL_parser->copline = (line_t)IVAL($1);
  363. }
  364. | WHEN lpar_or_qw remember mexpr ')' mblock
  365. { $$ = block_end($3, newWHENOP($4, op_scope($6))); }
  366. | DEFAULT block
  367. { $$ = newWHENOP(0, op_scope($2)); }
  368. | WHILE lpar_or_qw remember texpr ')' mintro mblock cont
  369. {
  370. $$ = block_end($3,
  371. newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
  372. $4, $7, $8, $6));
  373. TOKEN_GETMAD($1,$$,'W');
  374. TOKEN_GETMAD($2,$$,'(');
  375. TOKEN_GETMAD($5,$$,')');
  376. PL_parser->copline = (line_t)IVAL($1);
  377. }
  378. | UNTIL lpar_or_qw remember iexpr ')' mintro mblock cont
  379. {
  380. $$ = block_end($3,
  381. newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
  382. $4, $7, $8, $6));
  383. TOKEN_GETMAD($1,$$,'W');
  384. TOKEN_GETMAD($2,$$,'(');
  385. TOKEN_GETMAD($5,$$,')');
  386. PL_parser->copline = (line_t)IVAL($1);
  387. }
  388. | FOR lpar_or_qw remember mnexpr ';' texpr ';' mintro mnexpr ')'
  389. mblock
  390. {
  391. OP *initop = IF_MAD($4 ? $4 : newOP(OP_NULL, 0), $4);
  392. OP *forop = newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
  393. scalar($6), $11, $9, $8);
  394. if (initop) {
  395. forop = op_prepend_elem(OP_LINESEQ, initop,
  396. op_append_elem(OP_LINESEQ,
  397. newOP(OP_UNSTACK, OPf_SPECIAL),
  398. forop));
  399. }
  400. DO_MAD({ forop = newUNOP(OP_NULL, 0, forop); })
  401. $$ = block_end($3, forop);
  402. TOKEN_GETMAD($1,$$,'3');
  403. TOKEN_GETMAD($2,$$,'(');
  404. TOKEN_GETMAD($5,$$,'1');
  405. TOKEN_GETMAD($7,$$,'2');
  406. TOKEN_GETMAD($10,$$,')');
  407. PL_parser->copline = (line_t)IVAL($1);
  408. }
  409. | FOR MY remember my_scalar lpar_or_qw mexpr ')' mblock cont
  410. {
  411. $$ = block_end($3, newFOROP(0, $4, $6, $8, $9));
  412. TOKEN_GETMAD($1,$$,'W');
  413. TOKEN_GETMAD($2,$$,'d');
  414. TOKEN_GETMAD($5,$$,'(');
  415. TOKEN_GETMAD($7,$$,')');
  416. PL_parser->copline = (line_t)IVAL($1);
  417. }
  418. | FOR scalar lpar_or_qw remember mexpr ')' mblock cont
  419. {
  420. $$ = block_end($4, newFOROP(0,
  421. op_lvalue($2, OP_ENTERLOOP), $5, $7, $8));
  422. TOKEN_GETMAD($1,$$,'W');
  423. TOKEN_GETMAD($3,$$,'(');
  424. TOKEN_GETMAD($6,$$,')');
  425. PL_parser->copline = (line_t)IVAL($1);
  426. }
  427. | FOR lpar_or_qw remember mexpr ')' mblock cont
  428. {
  429. $$ = block_end($3,
  430. newFOROP(0, (OP*)NULL, $4, $6, $7));
  431. TOKEN_GETMAD($1,$$,'W');
  432. TOKEN_GETMAD($2,$$,'(');
  433. TOKEN_GETMAD($5,$$,')');
  434. PL_parser->copline = (line_t)IVAL($1);
  435. }
  436. | block cont
  437. {
  438. /* a block is a loop that happens once */
  439. $$ = newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
  440. (OP*)NULL, $1, $2, 0);
  441. }
  442. | PACKAGE WORD WORD '{' remember
  443. {
  444. int save_3_latefree = $3->op_latefree;
  445. $3->op_latefree = 1;
  446. package($3);
  447. $3->op_latefree = save_3_latefree;
  448. if ($2) {
  449. int save_2_latefree = $2->op_latefree;
  450. $2->op_latefree = 1;
  451. package_version($2);
  452. $2->op_latefree = save_2_latefree;
  453. }
  454. }
  455. stmtseq '}'
  456. {
  457. /* a block is a loop that happens once */
  458. $$ = newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
  459. (OP*)NULL, block_end($5, $7), (OP*)NULL, 0);
  460. op_free($3);
  461. if ($2)
  462. op_free($2);
  463. TOKEN_GETMAD($4,$$,'{');
  464. TOKEN_GETMAD($8,$$,'}');
  465. if (PL_parser->copline > (line_t)IVAL($4))
  466. PL_parser->copline = (line_t)IVAL($4);
  467. }
  468. | sideff ';'
  469. {
  470. PL_parser->expect = XSTATE;
  471. $$ = $1;
  472. TOKEN_GETMAD($2,$$,';');
  473. }
  474. | ';'
  475. {
  476. PL_parser->expect = XSTATE;
  477. $$ = IF_MAD(newOP(OP_NULL, 0), (OP*)NULL);
  478. TOKEN_GETMAD($1,$$,';');
  479. PL_parser->copline = NOLINE;
  480. }
  481. ;
  482. /* An expression which may have a side-effect */
  483. sideff : error
  484. { $$ = (OP*)NULL; }
  485. | expr
  486. { $$ = $1; }
  487. | expr IF expr
  488. { $$ = newLOGOP(OP_AND, 0, $3, $1);
  489. TOKEN_GETMAD($2,$$,'i');
  490. }
  491. | expr UNLESS expr
  492. { $$ = newLOGOP(OP_OR, 0, $3, $1);
  493. TOKEN_GETMAD($2,$$,'i');
  494. }
  495. | expr WHILE expr
  496. { $$ = newLOOPOP(OPf_PARENS, 1, scalar($3), $1);
  497. TOKEN_GETMAD($2,$$,'w');
  498. }
  499. | expr UNTIL iexpr
  500. { $$ = newLOOPOP(OPf_PARENS, 1, $3, $1);
  501. TOKEN_GETMAD($2,$$,'w');
  502. }
  503. | expr FOR expr
  504. { $$ = newFOROP(0, (OP*)NULL, $3, $1, (OP*)NULL);
  505. TOKEN_GETMAD($2,$$,'w');
  506. PL_parser->copline = (line_t)IVAL($2);
  507. }
  508. | expr WHEN expr
  509. { $$ = newWHENOP($3, op_scope($1)); }
  510. ;
  511. /* else and elsif blocks */
  512. else : /* NULL */
  513. { $$ = (OP*)NULL; }
  514. | ELSE mblock
  515. {
  516. ($2)->op_flags |= OPf_PARENS;
  517. $$ = op_scope($2);
  518. TOKEN_GETMAD($1,$$,'o');
  519. }
  520. | ELSIF lpar_or_qw mexpr ')' mblock else
  521. { PL_parser->copline = (line_t)IVAL($1);
  522. $$ = newCONDOP(0,
  523. newSTATEOP(OPf_SPECIAL,NULL,$3),
  524. op_scope($5), $6);
  525. PL_hints |= HINT_BLOCK_SCOPE;
  526. TOKEN_GETMAD($1,$$,'I');
  527. TOKEN_GETMAD($2,$$,'(');
  528. TOKEN_GETMAD($4,$$,')');
  529. }
  530. ;
  531. /* Continue blocks */
  532. cont : /* NULL */
  533. { $$ = (OP*)NULL; }
  534. | CONTINUE block
  535. {
  536. $$ = op_scope($2);
  537. TOKEN_GETMAD($1,$$,'o');
  538. }
  539. ;
  540. /* determine whether there are any new my declarations */
  541. mintro : /* NULL */
  542. { $$ = (PL_min_intro_pending &&
  543. PL_max_intro_pending >= PL_min_intro_pending);
  544. intro_my(); }
  545. /* Normal expression */
  546. nexpr : /* NULL */
  547. { $$ = (OP*)NULL; }
  548. | sideff
  549. ;
  550. /* Boolean expression */
  551. texpr : /* NULL means true */
  552. { YYSTYPE tmplval;
  553. (void)scan_num("1", &tmplval);
  554. $$ = tmplval.opval; }
  555. | expr
  556. ;
  557. /* Inverted boolean expression */
  558. iexpr : expr
  559. { $$ = invert(scalar($1)); }
  560. ;
  561. /* Expression with its own lexical scope */
  562. mexpr : expr
  563. { $$ = $1; intro_my(); }
  564. ;
  565. mnexpr : nexpr
  566. { $$ = $1; intro_my(); }
  567. ;
  568. miexpr : iexpr
  569. { $$ = $1; intro_my(); }
  570. ;
  571. formname: WORD { $$ = $1; }
  572. | /* NULL */ { $$ = (OP*)NULL; }
  573. ;
  574. startsub: /* NULL */ /* start a regular subroutine scope */
  575. { $$ = start_subparse(FALSE, 0);
  576. SAVEFREESV(PL_compcv); }
  577. ;
  578. startanonsub: /* NULL */ /* start an anonymous subroutine scope */
  579. { $$ = start_subparse(FALSE, CVf_ANON);
  580. SAVEFREESV(PL_compcv); }
  581. ;
  582. startformsub: /* NULL */ /* start a format subroutine scope */
  583. { $$ = start_subparse(TRUE, 0);
  584. SAVEFREESV(PL_compcv); }
  585. ;
  586. /* Name of a subroutine - must be a bareword, could be special */
  587. subname : WORD { const char *const name = SvPV_nolen_const(((SVOP*)$1)->op_sv);
  588. if (strEQ(name, "BEGIN") || strEQ(name, "END")
  589. || strEQ(name, "INIT") || strEQ(name, "CHECK")
  590. || strEQ(name, "UNITCHECK"))
  591. CvSPECIAL_on(PL_compcv);
  592. $$ = $1; }
  593. ;
  594. /* Subroutine prototype */
  595. proto : /* NULL */
  596. { $$ = (OP*)NULL; }
  597. | THING
  598. ;
  599. /* Optional list of subroutine attributes */
  600. subattrlist: /* NULL */
  601. { $$ = (OP*)NULL; }
  602. | COLONATTR THING
  603. { $$ = $2;
  604. TOKEN_GETMAD($1,$$,':');
  605. }
  606. | COLONATTR
  607. { $$ = IF_MAD(
  608. newOP(OP_NULL, 0),
  609. (OP*)NULL
  610. );
  611. TOKEN_GETMAD($1,$$,':');
  612. }
  613. ;
  614. /* List of attributes for a "my" variable declaration */
  615. myattrlist: COLONATTR THING
  616. { $$ = $2;
  617. TOKEN_GETMAD($1,$$,':');
  618. }
  619. | COLONATTR
  620. { $$ = IF_MAD(
  621. newOP(OP_NULL, 0),
  622. (OP*)NULL
  623. );
  624. TOKEN_GETMAD($1,$$,':');
  625. }
  626. ;
  627. /* Subroutine body - either null or a block */
  628. subbody : block { $$ = $1; }
  629. | ';' { $$ = IF_MAD(
  630. newOP(OP_NULL,0),
  631. (OP*)NULL
  632. );
  633. PL_parser->expect = XSTATE;
  634. TOKEN_GETMAD($1,$$,';');
  635. }
  636. ;
  637. /* Ordinary expressions; logical combinations */
  638. expr : expr ANDOP expr
  639. { $$ = newLOGOP(OP_AND, 0, $1, $3);
  640. TOKEN_GETMAD($2,$$,'o');
  641. }
  642. | expr OROP expr
  643. { $$ = newLOGOP(IVAL($2), 0, $1, $3);
  644. TOKEN_GETMAD($2,$$,'o');
  645. }
  646. | expr DOROP expr
  647. { $$ = newLOGOP(OP_DOR, 0, $1, $3);
  648. TOKEN_GETMAD($2,$$,'o');
  649. }
  650. | listexpr %prec PREC_LOW
  651. ;
  652. /* Expressions are a list of terms joined by commas */
  653. listexpr: listexpr ','
  654. {
  655. #ifdef MAD
  656. OP* op = newNULLLIST();
  657. token_getmad($2,op,',');
  658. $$ = op_append_elem(OP_LIST, $1, op);
  659. #else
  660. $$ = $1;
  661. #endif
  662. }
  663. | listexpr ',' term
  664. {
  665. OP* term = $3;
  666. DO_MAD(
  667. term = newUNOP(OP_NULL, 0, term);
  668. token_getmad($2,term,',');
  669. )
  670. $$ = op_append_elem(OP_LIST, $1, term);
  671. }
  672. | term %prec PREC_LOW
  673. ;
  674. /* List operators */
  675. listop : LSTOP indirob listexpr /* map {...} @args or print $fh @args */
  676. { $$ = convert(IVAL($1), OPf_STACKED,
  677. op_prepend_elem(OP_LIST, newGVREF(IVAL($1),$2), $3) );
  678. TOKEN_GETMAD($1,$$,'o');
  679. }
  680. | FUNC '(' indirob expr ')' /* print ($fh @args */
  681. { $$ = convert(IVAL($1), OPf_STACKED,
  682. op_prepend_elem(OP_LIST, newGVREF(IVAL($1),$3), $4) );
  683. TOKEN_GETMAD($1,$$,'o');
  684. TOKEN_GETMAD($2,$$,'(');
  685. TOKEN_GETMAD($5,$$,')');
  686. }
  687. | term ARROW method lpar_or_qw optexpr ')' /* $foo->bar(list) */
  688. { $$ = convert(OP_ENTERSUB, OPf_STACKED,
  689. op_append_elem(OP_LIST,
  690. op_prepend_elem(OP_LIST, scalar($1), $5),
  691. newUNOP(OP_METHOD, 0, $3)));
  692. TOKEN_GETMAD($2,$$,'A');
  693. TOKEN_GETMAD($4,$$,'(');
  694. TOKEN_GETMAD($6,$$,')');
  695. }
  696. | term ARROW method /* $foo->bar */
  697. { $$ = convert(OP_ENTERSUB, OPf_STACKED,
  698. op_append_elem(OP_LIST, scalar($1),
  699. newUNOP(OP_METHOD, 0, $3)));
  700. TOKEN_GETMAD($2,$$,'A');
  701. }
  702. | METHOD indirob optlistexpr /* new Class @args */
  703. { $$ = convert(OP_ENTERSUB, OPf_STACKED,
  704. op_append_elem(OP_LIST,
  705. op_prepend_elem(OP_LIST, $2, $3),
  706. newUNOP(OP_METHOD, 0, $1)));
  707. }
  708. | FUNCMETH indirob '(' optexpr ')' /* method $object (@args) */
  709. { $$ = convert(OP_ENTERSUB, OPf_STACKED,
  710. op_append_elem(OP_LIST,
  711. op_prepend_elem(OP_LIST, $2, $4),
  712. newUNOP(OP_METHOD, 0, $1)));
  713. TOKEN_GETMAD($3,$$,'(');
  714. TOKEN_GETMAD($5,$$,')');
  715. }
  716. | LSTOP optlistexpr /* print @args */
  717. { $$ = convert(IVAL($1), 0, $2);
  718. TOKEN_GETMAD($1,$$,'o');
  719. }
  720. | FUNC '(' optexpr ')' /* print (@args) */
  721. { $$ = convert(IVAL($1), 0, $3);
  722. TOKEN_GETMAD($1,$$,'o');
  723. TOKEN_GETMAD($2,$$,'(');
  724. TOKEN_GETMAD($4,$$,')');
  725. }
  726. | LSTOPSUB startanonsub block /* sub f(&@); f { foo } ... */
  727. { SvREFCNT_inc_simple_void(PL_compcv);
  728. $<opval>$ = newANONATTRSUB($2, 0, (OP*)NULL, $3); }
  729. optlistexpr %prec LSTOP /* ... @bar */
  730. { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
  731. op_append_elem(OP_LIST,
  732. op_prepend_elem(OP_LIST, $<opval>4, $5), $1));
  733. }
  734. ;
  735. /* Names of methods. May use $object->$methodname */
  736. method : METHOD
  737. | scalar
  738. ;
  739. /* Some kind of subscripted expression */
  740. subscripted: star '{' expr ';' '}' /* *main::{something} */
  741. /* In this and all the hash accessors, ';' is
  742. * provided by the tokeniser */
  743. { $$ = newBINOP(OP_GELEM, 0, $1, scalar($3));
  744. PL_parser->expect = XOPERATOR;
  745. TOKEN_GETMAD($2,$$,'{');
  746. TOKEN_GETMAD($4,$$,';');
  747. TOKEN_GETMAD($5,$$,'}');
  748. }
  749. | scalar '[' expr ']' /* $array[$element] */
  750. { $$ = newBINOP(OP_AELEM, 0, oopsAV($1), scalar($3));
  751. TOKEN_GETMAD($2,$$,'[');
  752. TOKEN_GETMAD($4,$$,']');
  753. }
  754. | term ARROW '[' expr ']' /* somearef->[$element] */
  755. { $$ = newBINOP(OP_AELEM, 0,
  756. ref(newAVREF($1),OP_RV2AV),
  757. scalar($4));
  758. TOKEN_GETMAD($2,$$,'a');
  759. TOKEN_GETMAD($3,$$,'[');
  760. TOKEN_GETMAD($5,$$,']');
  761. }
  762. | subscripted '[' expr ']' /* $foo->[$bar]->[$baz] */
  763. { $$ = newBINOP(OP_AELEM, 0,
  764. ref(newAVREF($1),OP_RV2AV),
  765. scalar($3));
  766. TOKEN_GETMAD($2,$$,'[');
  767. TOKEN_GETMAD($4,$$,']');
  768. }
  769. | scalar '{' expr ';' '}' /* $foo{bar();} */
  770. { $$ = newBINOP(OP_HELEM, 0, oopsHV($1), jmaybe($3));
  771. PL_parser->expect = XOPERATOR;
  772. TOKEN_GETMAD($2,$$,'{');
  773. TOKEN_GETMAD($4,$$,';');
  774. TOKEN_GETMAD($5,$$,'}');
  775. }
  776. | term ARROW '{' expr ';' '}' /* somehref->{bar();} */
  777. { $$ = newBINOP(OP_HELEM, 0,
  778. ref(newHVREF($1),OP_RV2HV),
  779. jmaybe($4));
  780. PL_parser->expect = XOPERATOR;
  781. TOKEN_GETMAD($2,$$,'a');
  782. TOKEN_GETMAD($3,$$,'{');
  783. TOKEN_GETMAD($5,$$,';');
  784. TOKEN_GETMAD($6,$$,'}');
  785. }
  786. | subscripted '{' expr ';' '}' /* $foo->[bar]->{baz;} */
  787. { $$ = newBINOP(OP_HELEM, 0,
  788. ref(newHVREF($1),OP_RV2HV),
  789. jmaybe($3));
  790. PL_parser->expect = XOPERATOR;
  791. TOKEN_GETMAD($2,$$,'{');
  792. TOKEN_GETMAD($4,$$,';');
  793. TOKEN_GETMAD($5,$$,'}');
  794. }
  795. | term ARROW '(' ')' /* $subref->() */
  796. { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
  797. newCVREF(0, scalar($1)));
  798. TOKEN_GETMAD($2,$$,'a');
  799. TOKEN_GETMAD($3,$$,'(');
  800. TOKEN_GETMAD($4,$$,')');
  801. }
  802. | term ARROW '(' expr ')' /* $subref->(@args) */
  803. { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
  804. op_append_elem(OP_LIST, $4,
  805. newCVREF(0, scalar($1))));
  806. TOKEN_GETMAD($2,$$,'a');
  807. TOKEN_GETMAD($3,$$,'(');
  808. TOKEN_GETMAD($5,$$,')');
  809. }
  810. | subscripted lpar_or_qw expr ')' /* $foo->{bar}->(@args) */
  811. { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
  812. op_append_elem(OP_LIST, $3,
  813. newCVREF(0, scalar($1))));
  814. TOKEN_GETMAD($2,$$,'(');
  815. TOKEN_GETMAD($4,$$,')');
  816. }
  817. | subscripted lpar_or_qw ')' /* $foo->{bar}->() */
  818. { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
  819. newCVREF(0, scalar($1)));
  820. TOKEN_GETMAD($2,$$,'(');
  821. TOKEN_GETMAD($3,$$,')');
  822. }
  823. | '(' expr ')' '[' expr ']' /* list slice */
  824. { $$ = newSLICEOP(0, $5, $2);
  825. TOKEN_GETMAD($1,$$,'(');
  826. TOKEN_GETMAD($3,$$,')');
  827. TOKEN_GETMAD($4,$$,'[');
  828. TOKEN_GETMAD($6,$$,']');
  829. }
  830. | QWLIST '[' expr ']' /* list literal slice */
  831. { $$ = newSLICEOP(0, $3, $1);
  832. TOKEN_GETMAD($2,$$,'[');
  833. TOKEN_GETMAD($4,$$,']');
  834. }
  835. | '(' ')' '[' expr ']' /* empty list slice! */
  836. { $$ = newSLICEOP(0, $4, (OP*)NULL);
  837. TOKEN_GETMAD($1,$$,'(');
  838. TOKEN_GETMAD($2,$$,')');
  839. TOKEN_GETMAD($3,$$,'[');
  840. TOKEN_GETMAD($5,$$,']');
  841. }
  842. ;
  843. /* Binary operators between terms */
  844. termbinop: term ASSIGNOP term /* $x = $y */
  845. { $$ = newASSIGNOP(OPf_STACKED, $1, IVAL($2), $3);
  846. TOKEN_GETMAD($2,$$,'o');
  847. }
  848. | term POWOP term /* $x ** $y */
  849. { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3));
  850. TOKEN_GETMAD($2,$$,'o');
  851. }
  852. | term MULOP term /* $x * $y, $x x $y */
  853. { if (IVAL($2) != OP_REPEAT)
  854. scalar($1);
  855. $$ = newBINOP(IVAL($2), 0, $1, scalar($3));
  856. TOKEN_GETMAD($2,$$,'o');
  857. }
  858. | term ADDOP term /* $x + $y */
  859. { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3));
  860. TOKEN_GETMAD($2,$$,'o');
  861. }
  862. | term SHIFTOP term /* $x >> $y, $x << $y */
  863. { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3));
  864. TOKEN_GETMAD($2,$$,'o');
  865. }
  866. | term RELOP term /* $x > $y, etc. */
  867. { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3));
  868. TOKEN_GETMAD($2,$$,'o');
  869. }
  870. | term EQOP term /* $x == $y, $x eq $y */
  871. { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3));
  872. TOKEN_GETMAD($2,$$,'o');
  873. }
  874. | term BITANDOP term /* $x & $y */
  875. { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3));
  876. TOKEN_GETMAD($2,$$,'o');
  877. }
  878. | term BITOROP term /* $x | $y */
  879. { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3));
  880. TOKEN_GETMAD($2,$$,'o');
  881. }
  882. | term DOTDOT term /* $x..$y, $x...$y */
  883. {
  884. $$ = newRANGE(IVAL($2), scalar($1), scalar($3));
  885. DO_MAD({
  886. UNOP *op;
  887. op = (UNOP*)$$;
  888. op = (UNOP*)op->op_first; /* get to flop */
  889. op = (UNOP*)op->op_first; /* get to flip */
  890. op = (UNOP*)op->op_first; /* get to range */
  891. token_getmad($2,(OP*)op,'o');
  892. })
  893. }
  894. | term ANDAND term /* $x && $y */
  895. { $$ = newLOGOP(OP_AND, 0, $1, $3);
  896. TOKEN_GETMAD($2,$$,'o');
  897. }
  898. | term OROR term /* $x || $y */
  899. { $$ = newLOGOP(OP_OR, 0, $1, $3);
  900. TOKEN_GETMAD($2,$$,'o');
  901. }
  902. | term DORDOR term /* $x // $y */
  903. { $$ = newLOGOP(OP_DOR, 0, $1, $3);
  904. TOKEN_GETMAD($2,$$,'o');
  905. }
  906. | term MATCHOP term /* $x =~ /$y/ */
  907. { $$ = bind_match(IVAL($2), $1, $3);
  908. TOKEN_GETMAD($2,
  909. ($$->op_type == OP_NOT
  910. ? ((UNOP*)$$)->op_first : $$),
  911. '~');
  912. }
  913. ;
  914. /* Unary operators and terms */
  915. termunop : '-' term %prec UMINUS /* -$x */
  916. { $$ = newUNOP(OP_NEGATE, 0, scalar($2));
  917. TOKEN_GETMAD($1,$$,'o');
  918. }
  919. | '+' term %prec UMINUS /* +$x */
  920. { $$ = IF_MAD(
  921. newUNOP(OP_NULL, 0, $2),
  922. $2
  923. );
  924. TOKEN_GETMAD($1,$$,'+');
  925. }
  926. | '!' term /* !$x */
  927. { $$ = newUNOP(OP_NOT, 0, scalar($2));
  928. TOKEN_GETMAD($1,$$,'o');
  929. }
  930. | '~' term /* ~$x */
  931. { $$ = newUNOP(OP_COMPLEMENT, 0, scalar($2));
  932. TOKEN_GETMAD($1,$$,'o');
  933. }
  934. | term POSTINC /* $x++ */
  935. { $$ = newUNOP(OP_POSTINC, 0,
  936. op_lvalue(scalar($1), OP_POSTINC));
  937. TOKEN_GETMAD($2,$$,'o');
  938. }
  939. | term POSTDEC /* $x-- */
  940. { $$ = newUNOP(OP_POSTDEC, 0,
  941. op_lvalue(scalar($1), OP_POSTDEC));
  942. TOKEN_GETMAD($2,$$,'o');
  943. }
  944. | PREINC term /* ++$x */
  945. { $$ = newUNOP(OP_PREINC, 0,
  946. op_lvalue(scalar($2), OP_PREINC));
  947. TOKEN_GETMAD($1,$$,'o');
  948. }
  949. | PREDEC term /* --$x */
  950. { $$ = newUNOP(OP_PREDEC, 0,
  951. op_lvalue(scalar($2), OP_PREDEC));
  952. TOKEN_GETMAD($1,$$,'o');
  953. }
  954. ;
  955. /* Constructors for anonymous data */
  956. anonymous: '[' expr ']'
  957. { $$ = newANONLIST($2);
  958. TOKEN_GETMAD($1,$$,'[');
  959. TOKEN_GETMAD($3,$$,']');
  960. }
  961. | '[' ']'
  962. { $$ = newANONLIST((OP*)NULL);
  963. TOKEN_GETMAD($1,$$,'[');
  964. TOKEN_GETMAD($2,$$,']');
  965. }
  966. | HASHBRACK expr ';' '}' %prec '(' /* { foo => "Bar" } */
  967. { $$ = newANONHASH($2);
  968. TOKEN_GETMAD($1,$$,'{');
  969. TOKEN_GETMAD($3,$$,';');
  970. TOKEN_GETMAD($4,$$,'}');
  971. }
  972. | HASHBRACK ';' '}' %prec '(' /* { } (';' by tokener) */
  973. { $$ = newANONHASH((OP*)NULL);
  974. TOKEN_GETMAD($1,$$,'{');
  975. TOKEN_GETMAD($2,$$,';');
  976. TOKEN_GETMAD($3,$$,'}');
  977. }
  978. | ANONSUB startanonsub proto subattrlist block %prec '('
  979. { SvREFCNT_inc_simple_void(PL_compcv);
  980. $$ = newANONATTRSUB($2, $3, $4, $5);
  981. TOKEN_GETMAD($1,$$,'o');
  982. OP_GETMAD($3,$$,'s');
  983. OP_GETMAD($4,$$,'a');
  984. }
  985. ;
  986. /* Things called with "do" */
  987. termdo : DO term %prec UNIOP /* do $filename */
  988. { $$ = dofile($2, IVAL($1));
  989. TOKEN_GETMAD($1,$$,'o');
  990. }
  991. | DO block %prec '(' /* do { code */
  992. { $$ = newUNOP(OP_NULL, OPf_SPECIAL, op_scope($2));
  993. TOKEN_GETMAD($1,$$,'D');
  994. }
  995. | DO WORD lpar_or_qw ')' /* do somesub() */
  996. { $$ = newUNOP(OP_ENTERSUB,
  997. OPf_SPECIAL|OPf_STACKED,
  998. op_prepend_elem(OP_LIST,
  999. scalar(newCVREF(
  1000. (OPpENTERSUB_AMPER<<8),
  1001. scalar($2)
  1002. )),(OP*)NULL)); dep();
  1003. TOKEN_GETMAD($1,$$,'o');
  1004. TOKEN_GETMAD($3,$$,'(');
  1005. TOKEN_GETMAD($4,$$,')');
  1006. }
  1007. | DO WORD lpar_or_qw expr ')' /* do somesub(@args) */
  1008. { $$ = newUNOP(OP_ENTERSUB,
  1009. OPf_SPECIAL|OPf_STACKED,
  1010. op_append_elem(OP_LIST,
  1011. $4,
  1012. scalar(newCVREF(
  1013. (OPpENTERSUB_AMPER<<8),
  1014. scalar($2)
  1015. )))); dep();
  1016. TOKEN_GETMAD($1,$$,'o');
  1017. TOKEN_GETMAD($3,$$,'(');
  1018. TOKEN_GETMAD($5,$$,')');
  1019. }
  1020. | DO scalar lpar_or_qw ')' /* do $subref () */
  1021. { $$ = newUNOP(OP_ENTERSUB, OPf_SPECIAL|OPf_STACKED,
  1022. op_prepend_elem(OP_LIST,
  1023. scalar(newCVREF(0,scalar($2))), (OP*)NULL)); dep();
  1024. TOKEN_GETMAD($1,$$,'o');
  1025. TOKEN_GETMAD($3,$$,'(');
  1026. TOKEN_GETMAD($4,$$,')');
  1027. }
  1028. | DO scalar lpar_or_qw expr ')' /* do $subref (@args) */
  1029. { $$ = newUNOP(OP_ENTERSUB, OPf_SPECIAL|OPf_STACKED,
  1030. op_prepend_elem(OP_LIST,
  1031. $4,
  1032. scalar(newCVREF(0,scalar($2))))); dep();
  1033. TOKEN_GETMAD($1,$$,'o');
  1034. TOKEN_GETMAD($3,$$,'(');
  1035. TOKEN_GETMAD($5,$$,')');
  1036. }
  1037. ;
  1038. term : termbinop
  1039. | termunop
  1040. | anonymous
  1041. | termdo
  1042. | term '?' term ':' term
  1043. { $$ = newCONDOP(0, $1, $3, $5);
  1044. TOKEN_GETMAD($2,$$,'?');
  1045. TOKEN_GETMAD($4,$$,':');
  1046. }
  1047. | REFGEN term /* \$x, \@y, \%z */
  1048. { $$ = newUNOP(OP_REFGEN, 0, op_lvalue($2,OP_REFGEN));
  1049. TOKEN_GETMAD($1,$$,'o');
  1050. }
  1051. | myattrterm %prec UNIOP
  1052. { $$ = $1; }
  1053. | LOCAL term %prec UNIOP
  1054. { $$ = localize($2,IVAL($1));
  1055. TOKEN_GETMAD($1,$$,'k');
  1056. }
  1057. | '(' expr ')'
  1058. { $$ = sawparens(IF_MAD(newUNOP(OP_NULL,0,$2), $2));
  1059. TOKEN_GETMAD($1,$$,'(');
  1060. TOKEN_GETMAD($3,$$,')');
  1061. }
  1062. | QWLIST
  1063. { $$ = IF_MAD(newUNOP(OP_NULL,0,$1), $1); }
  1064. | '(' ')'
  1065. { $$ = sawparens(newNULLLIST());
  1066. TOKEN_GETMAD($1,$$,'(');
  1067. TOKEN_GETMAD($2,$$,')');
  1068. }
  1069. | scalar %prec '('
  1070. { $$ = $1; }
  1071. | star %prec '('
  1072. { $$ = $1; }
  1073. | hsh %prec '('
  1074. { $$ = $1; }
  1075. | ary %prec '('
  1076. { $$ = $1; }
  1077. | arylen %prec '(' /* $#x, $#{ something } */
  1078. { $$ = newUNOP(OP_AV2ARYLEN, 0, ref($1, OP_AV2ARYLEN));}
  1079. | subscripted
  1080. { $$ = $1; }
  1081. | ary '[' expr ']' /* array slice */
  1082. { $$ = op_prepend_elem(OP_ASLICE,
  1083. newOP(OP_PUSHMARK, 0),
  1084. newLISTOP(OP_ASLICE, 0,
  1085. list($3),
  1086. ref($1, OP_ASLICE)));
  1087. TOKEN_GETMAD($2,$$,'[');
  1088. TOKEN_GETMAD($4,$$,']');
  1089. }
  1090. | ary '{' expr ';' '}' /* @hash{@keys} */
  1091. { $$ = op_prepend_elem(OP_HSLICE,
  1092. newOP(OP_PUSHMARK, 0),
  1093. newLISTOP(OP_HSLICE, 0,
  1094. list($3),
  1095. ref(oopsHV($1), OP_HSLICE)));
  1096. PL_parser->expect = XOPERATOR;
  1097. TOKEN_GETMAD($2,$$,'{');
  1098. TOKEN_GETMAD($4,$$,';');
  1099. TOKEN_GETMAD($5,$$,'}');
  1100. }
  1101. | THING %prec '('
  1102. { $$ = $1; }
  1103. | amper /* &foo; */
  1104. { $$ = newUNOP(OP_ENTERSUB, 0, scalar($1)); }
  1105. | amper lpar_or_qw ')' /* &foo() */
  1106. { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar($1));
  1107. TOKEN_GETMAD($2,$$,'(');
  1108. TOKEN_GETMAD($3,$$,')');
  1109. }
  1110. | amper lpar_or_qw expr ')' /* &foo(@args) */
  1111. {
  1112. $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
  1113. op_append_elem(OP_LIST, $3, scalar($1)));
  1114. DO_MAD({
  1115. OP* op = $$;
  1116. if (op->op_type == OP_CONST) { /* defeat const fold */
  1117. op = (OP*)op->op_madprop->mad_val;
  1118. }
  1119. token_getmad($2,op,'(');
  1120. token_getmad($4,op,')');
  1121. })
  1122. }
  1123. | NOAMP WORD optlistexpr /* foo(@args) */
  1124. { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
  1125. op_append_elem(OP_LIST, $3, scalar($2)));
  1126. TOKEN_GETMAD($1,$$,'o');
  1127. }
  1128. | LOOPEX /* loop exiting command (goto, last, dump, etc) */
  1129. { $$ = newOP(IVAL($1), OPf_SPECIAL);
  1130. PL_hints |= HINT_BLOCK_SCOPE;
  1131. TOKEN_GETMAD($1,$$,'o');
  1132. }
  1133. | LOOPEX term
  1134. { $$ = newLOOPEX(IVAL($1),$2);
  1135. TOKEN_GETMAD($1,$$,'o');
  1136. }
  1137. | NOTOP listexpr /* not $foo */
  1138. { $$ = newUNOP(OP_NOT, 0, scalar($2));
  1139. TOKEN_GETMAD($1,$$,'o');
  1140. }
  1141. | UNIOP /* Unary op, $_ implied */
  1142. { $$ = newOP(IVAL($1), 0);
  1143. TOKEN_GETMAD($1,$$,'o');
  1144. }
  1145. | UNIOP block /* eval { foo }* */
  1146. { $$ = newUNOP(IVAL($1), 0, $2);
  1147. TOKEN_GETMAD($1,$$,'o');
  1148. }
  1149. | UNIOP term /* Unary op */
  1150. { $$ = newUNOP(IVAL($1), 0, $2);
  1151. TOKEN_GETMAD($1,$$,'o');
  1152. }
  1153. | REQUIRE /* require, $_ implied */
  1154. { $$ = newOP(OP_REQUIRE, $1 ? OPf_SPECIAL : 0);
  1155. TOKEN_GETMAD($1,$$,'o');
  1156. }
  1157. | REQUIRE term /* require Foo */
  1158. { $$ = newUNOP(OP_REQUIRE, $1 ? OPf_SPECIAL : 0, $2);
  1159. TOKEN_GETMAD($1,$$,'o');
  1160. }
  1161. | UNIOPSUB
  1162. { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar($1)); }
  1163. | UNIOPSUB term /* Sub treated as unop */
  1164. { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
  1165. op_append_elem(OP_LIST, $2, scalar($1))); }
  1166. | FUNC0 /* Nullary operator */
  1167. { $$ = newOP(IVAL($1), 0);
  1168. TOKEN_GETMAD($1,$$,'o');
  1169. }
  1170. | FUNC0 '(' ')'
  1171. { $$ = newOP(IVAL($1), 0);
  1172. TOKEN_GETMAD($1,$$,'o');
  1173. TOKEN_GETMAD($2,$$,'(');
  1174. TOKEN_GETMAD($3,$$,')');
  1175. }
  1176. | FUNC0OP /* Same as above, but op created in toke.c */
  1177. { $$ = $1; }
  1178. | FUNC0OP '(' ')'
  1179. { $$ = $1;
  1180. TOKEN_GETMAD($2,$$,'(');
  1181. TOKEN_GETMAD($3,$$,')');
  1182. }
  1183. | FUNC0SUB /* Sub treated as nullop */
  1184. { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
  1185. scalar($1)); }
  1186. | FUNC1 '(' ')' /* not () */
  1187. { $$ = (IVAL($1) == OP_NOT)
  1188. ? newUNOP(IVAL($1), 0, newSVOP(OP_CONST, 0, newSViv(0)))
  1189. : newOP(IVAL($1), OPf_SPECIAL);
  1190. TOKEN_GETMAD($1,$$,'o');
  1191. TOKEN_GETMAD($2,$$,'(');
  1192. TOKEN_GETMAD($3,$$,')');
  1193. }
  1194. | FUNC1 '(' expr ')' /* not($foo) */
  1195. { $$ = newUNOP(IVAL($1), 0, $3);
  1196. TOKEN_GETMAD($1,$$,'o');
  1197. TOKEN_GETMAD($2,$$,'(');
  1198. TOKEN_GETMAD($4,$$,')');
  1199. }
  1200. | PMFUNC '(' listexpr ')' /* m//, s///, tr/// */
  1201. { $$ = pmruntime($1, $3, 1);
  1202. TOKEN_GETMAD($2,$$,'(');
  1203. TOKEN_GETMAD($4,$$,')');
  1204. }
  1205. | WORD
  1206. | listop
  1207. | YADAYADA
  1208. {
  1209. $$ = newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0),
  1210. newSVOP(OP_CONST, 0, newSVpvs("Unimplemented")));
  1211. TOKEN_GETMAD($1,$$,'X');
  1212. }
  1213. | PLUGEXPR
  1214. ;
  1215. /* "my" declarations, with optional attributes */
  1216. myattrterm: MY myterm myattrlist
  1217. { $$ = my_attrs($2,$3);
  1218. DO_MAD(
  1219. token_getmad($1,$$,'d');
  1220. append_madprops($3->op_madprop, $$, 'a');
  1221. $3->op_madprop = 0;
  1222. )
  1223. }
  1224. | MY myterm
  1225. { $$ = localize($2,IVAL($1));
  1226. TOKEN_GETMAD($1,$$,'d');
  1227. }
  1228. ;
  1229. /* Things that can be "my"'d */
  1230. myterm : '(' expr ')'
  1231. { $$ = sawparens($2);
  1232. TOKEN_GETMAD($1,$$,'(');
  1233. TOKEN_GETMAD($3,$$,')');
  1234. }
  1235. | '(' ')'
  1236. { $$ = sawparens(newNULLLIST());
  1237. TOKEN_GETMAD($1,$$,'(');
  1238. TOKEN_GETMAD($2,$$,')');
  1239. }
  1240. | scalar %prec '('
  1241. { $$ = $1; }
  1242. | hsh %prec '('
  1243. { $$ = $1; }
  1244. | ary %prec '('
  1245. { $$ = $1; }
  1246. ;
  1247. /* Basic list expressions */
  1248. optlistexpr: /* NULL */ %prec PREC_LOW
  1249. { $$ = (OP*)NULL; }
  1250. | listexpr %prec PREC_LOW
  1251. { $$ = $1; }
  1252. ;
  1253. optexpr: /* NULL */
  1254. { $$ = (OP*)NULL; }
  1255. | expr
  1256. { $$ = $1; }
  1257. ;
  1258. lpar_or_qw: '('
  1259. { $$ = $1; }
  1260. | QWLIST
  1261. { munge_qwlist_to_paren_list($1); }
  1262. '('
  1263. { $$ = $3; }
  1264. ;
  1265. /* A little bit of trickery to make "for my $foo (@bar)" actually be
  1266. lexical */
  1267. my_scalar: scalar
  1268. { PL_parser->in_my = 0; $$ = my($1); }
  1269. ;
  1270. amper : '&' indirob
  1271. { $$ = newCVREF(IVAL($1),$2);
  1272. TOKEN_GETMAD($1,$$,'&');
  1273. }
  1274. ;
  1275. scalar : '$' indirob
  1276. { $$ = newSVREF($2);
  1277. TOKEN_GETMAD($1,$$,'$');
  1278. }
  1279. ;
  1280. ary : '@' indirob
  1281. { $$ = newAVREF($2);
  1282. TOKEN_GETMAD($1,$$,'@');
  1283. }
  1284. ;
  1285. hsh : '%' indirob
  1286. { $$ = newHVREF($2);
  1287. TOKEN_GETMAD($1,$$,'%');
  1288. }
  1289. ;
  1290. arylen : DOLSHARP indirob
  1291. { $$ = newAVREF($2);
  1292. TOKEN_GETMAD($1,$$,'l');
  1293. }
  1294. ;
  1295. star : '*' indirob
  1296. { $$ = newGVREF(0,$2);
  1297. TOKEN_GETMAD($1,$$,'*');
  1298. }
  1299. ;
  1300. /* Indirect objects */
  1301. indirob : WORD
  1302. { $$ = scalar($1); }
  1303. | scalar %prec PREC_LOW
  1304. { $$ = scalar($1); }
  1305. | block
  1306. { $$ = op_scope($1); }
  1307. | PRIVATEREF
  1308. { $$ = $1; }
  1309. ;