This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
remove useless 'rcsid' (extension of a suggestion by
[perl5.git] / perly.y
1 /*    perly.y
2  *
3  *    Copyright (c) 1991-1997, Larry Wall
4  *
5  *    You may distribute under the terms of either the GNU General Public
6  *    License or the Artistic License, as specified in the README file.
7  *
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
15 %{
16 #include "EXTERN.h"
17 #include "perl.h"
18
19 static void
20 dep(void)
21 {
22     deprecate("\"do\" to call subroutines");
23 }
24
25 %}
26
27 %start prog
28
29 %{
30 #ifndef OEMVS
31 %}
32
33 %union {
34     I32 ival;
35     char *pval;
36     OP *opval;
37     GV *gvval;
38 }
39
40 %{
41 #endif /* OEMVS */
42 %}
43
44 %token <ival> '{' ')'
45
46 %token <opval> WORD METHOD FUNCMETH THING PMFUNC PRIVATEREF
47 %token <opval> FUNC0SUB UNIOPSUB LSTOPSUB
48 %token <pval> LABEL
49 %token <ival> FORMAT SUB ANONSUB PACKAGE USE
50 %token <ival> WHILE UNTIL IF UNLESS ELSE ELSIF CONTINUE FOR
51 %token <ival> LOOPEX DOTDOT
52 %token <ival> FUNC0 FUNC1 FUNC UNIOP LSTOP
53 %token <ival> RELOP EQOP MULOP ADDOP
54 %token <ival> DOLSHARP DO HASHBRACK NOAMP
55 %token LOCAL MY
56
57 %type <ival> prog decl local format startsub startanonsub startformsub
58 %type <ival> remember mremember '&'
59 %type <opval> block mblock lineseq line loop cond else
60 %type <opval> expr term scalar ary hsh arylen star amper sideff
61 %type <opval> argexpr nexpr texpr iexpr mexpr mnexpr mtexpr miexpr
62 %type <opval> listexpr listexprcom indirob listop method
63 %type <opval> formname subname proto subbody cont my_scalar
64 %type <pval> label
65
66 %left <ival> OROP
67 %left ANDOP
68 %right NOTOP
69 %nonassoc LSTOP LSTOPSUB
70 %left ','
71 %right <ival> ASSIGNOP
72 %right '?' ':'
73 %nonassoc DOTDOT
74 %left OROR
75 %left ANDAND
76 %left <ival> BITOROP
77 %left <ival> BITANDOP
78 %nonassoc EQOP
79 %nonassoc RELOP
80 %nonassoc UNIOP UNIOPSUB
81 %left <ival> SHIFTOP
82 %left ADDOP
83 %left MULOP
84 %left <ival> MATCHOP
85 %right '!' '~' UMINUS REFGEN
86 %right <ival> POWOP
87 %nonassoc PREINC PREDEC POSTINC POSTDEC
88 %left ARROW
89 %left '('
90
91 %% /* RULES */
92
93 prog    :       /* NULL */
94                 {
95 #if defined(YYDEBUG) && defined(DEBUGGING)
96                     yydebug = (PL_debug & 1);
97 #endif
98                     PL_expect = XSTATE;
99                 }
100         /*CONTINUED*/   lineseq
101                         { newPROG($2); }
102         ;
103
104 block   :       '{' remember lineseq '}'
105                         { if (PL_copline > (line_t)$1)
106                               PL_copline = $1;
107                           $$ = block_end($2, $3); }
108         ;
109
110 remember:       /* NULL */      /* start a full lexical scope */
111                         { $$ = block_start(TRUE); }
112         ;
113
114 mblock  :       '{' mremember lineseq '}'
115                         { if (PL_copline > (line_t)$1)
116                               PL_copline = $1;
117                           $$ = block_end($2, $3); }
118         ;
119
120 mremember:      /* NULL */      /* start a partial lexical scope */
121                         { $$ = block_start(FALSE); }
122         ;
123
124 lineseq :       /* NULL */
125                         { $$ = Nullop; }
126         |       lineseq decl
127                         { $$ = $1; }
128         |       lineseq line
129                         {   $$ = append_list(OP_LINESEQ,
130                                 (LISTOP*)$1, (LISTOP*)$2);
131                             PL_pad_reset_pending = TRUE;
132                             if ($1 && $2) PL_hints |= HINT_BLOCK_SCOPE; }
133         ;
134
135 line    :       label cond
136                         { $$ = newSTATEOP(0, $1, $2); }
137         |       loop    /* loops add their own labels */
138         |       label ';'
139                         { if ($1 != Nullch) {
140                               $$ = newSTATEOP(0, $1, newOP(OP_NULL, 0));
141                             }
142                             else {
143                               $$ = Nullop;
144                               PL_copline = NOLINE;
145                             }
146                             PL_expect = XSTATE; }
147         |       label sideff ';'
148                         { $$ = newSTATEOP(0, $1, $2);
149                           PL_expect = XSTATE; }
150         ;
151
152 sideff  :       error
153                         { $$ = Nullop; }
154         |       expr
155                         { $$ = $1; }
156         |       expr IF expr
157                         { $$ = newLOGOP(OP_AND, 0, $3, $1); }
158         |       expr UNLESS expr
159                         { $$ = newLOGOP(OP_OR, 0, $3, $1); }
160         |       expr WHILE expr
161                         { $$ = newLOOPOP(OPf_PARENS, 1, scalar($3), $1); }
162         |       expr UNTIL iexpr
163                         { $$ = newLOOPOP(OPf_PARENS, 1, $3, $1);}
164         |       expr FOR expr
165                         { $$ = newFOROP(0, Nullch, $2,
166                                         Nullop, $3, $1, Nullop); }
167         ;
168
169 else    :       /* NULL */
170                         { $$ = Nullop; }
171         |       ELSE mblock
172                         { $$ = scope($2); }
173         |       ELSIF '(' mexpr ')' mblock else
174                         { PL_copline = $1;
175                             $$ = newSTATEOP(0, Nullch,
176                                    newCONDOP(0, $3, scope($5), $6));
177                             PL_hints |= HINT_BLOCK_SCOPE; }
178         ;
179
180 cond    :       IF '(' remember mexpr ')' mblock else
181                         { PL_copline = $1;
182                             $$ = block_end($3,
183                                    newCONDOP(0, $4, scope($6), $7)); }
184         |       UNLESS '(' remember miexpr ')' mblock else
185                         { PL_copline = $1;
186                             $$ = block_end($3,
187                                    newCONDOP(0, $4, scope($6), $7)); }
188         ;
189
190 cont    :       /* NULL */
191                         { $$ = Nullop; }
192         |       CONTINUE block
193                         { $$ = scope($2); }
194         ;
195
196 loop    :       label WHILE '(' remember mtexpr ')' mblock cont
197                         { PL_copline = $2;
198                             $$ = block_end($4,
199                                    newSTATEOP(0, $1,
200                                      newWHILEOP(0, 1, (LOOP*)Nullop,
201                                                 $2, $5, $7, $8))); }
202         |       label UNTIL '(' remember miexpr ')' mblock cont
203                         { PL_copline = $2;
204                             $$ = block_end($4,
205                                    newSTATEOP(0, $1,
206                                      newWHILEOP(0, 1, (LOOP*)Nullop,
207                                                 $2, $5, $7, $8))); }
208         |       label FOR MY remember my_scalar '(' mexpr ')' mblock cont
209                         { $$ = block_end($4,
210                                  newFOROP(0, $1, $2, $5, $7, $9, $10)); }
211         |       label FOR scalar '(' remember mexpr ')' mblock cont
212                         { $$ = block_end($5,
213                                  newFOROP(0, $1, $2, mod($3, OP_ENTERLOOP),
214                                           $6, $8, $9)); }
215         |       label FOR '(' remember mexpr ')' mblock cont
216                         { $$ = block_end($4,
217                                  newFOROP(0, $1, $2, Nullop, $5, $7, $8)); }
218         |       label FOR '(' remember mnexpr ';' mtexpr ';' mnexpr ')' mblock
219                         /* basically fake up an initialize-while lineseq */
220                         { OP *forop = append_elem(OP_LINESEQ,
221                                         scalar($5),
222                                         newWHILEOP(0, 1, (LOOP*)Nullop,
223                                                    $2, scalar($7),
224                                                    $11, scalar($9)));
225                           PL_copline = $2;
226                           $$ = block_end($4, newSTATEOP(0, $1, forop)); }
227         |       label block cont  /* a block is a loop that happens once */
228                         { $$ = newSTATEOP(0, $1,
229                                  newWHILEOP(0, 1, (LOOP*)Nullop,
230                                             NOLINE, Nullop, $2, $3)); }
231         ;
232
233 nexpr   :       /* NULL */
234                         { $$ = Nullop; }
235         |       sideff
236         ;
237
238 texpr   :       /* NULL means true */
239                         { (void)scan_num("1"); $$ = yylval.opval; }
240         |       expr
241         ;
242
243 iexpr   :       expr
244                         { $$ = invert(scalar($1)); }
245         ;
246
247 mexpr   :       expr
248                         { $$ = $1; intro_my(); }
249         ;
250
251 mnexpr  :       nexpr
252                         { $$ = $1; intro_my(); }
253         ;
254
255 mtexpr  :       texpr
256                         { $$ = $1; intro_my(); }
257         ;
258
259 miexpr  :       iexpr
260                         { $$ = $1; intro_my(); }
261         ;
262
263 label   :       /* empty */
264                         { $$ = Nullch; }
265         |       LABEL
266         ;
267
268 decl    :       format
269                         { $$ = 0; }
270         |       subrout
271                         { $$ = 0; }
272         |       package
273                         { $$ = 0; }
274         |       use
275                         { $$ = 0; }
276         ;
277
278 format  :       FORMAT startformsub formname block
279                         { newFORM($2, $3, $4); }
280         ;
281
282 formname:       WORD            { $$ = $1; }
283         |       /* NULL */      { $$ = Nullop; }
284         ;
285
286 subrout :       SUB startsub subname proto subbody
287                         { newSUB($2, $3, $4, $5); }
288         ;
289
290 startsub:       /* NULL */      /* start a regular subroutine scope */
291                         { $$ = start_subparse(FALSE, 0); }
292         ;
293
294 startanonsub:   /* NULL */      /* start an anonymous subroutine scope */
295                         { $$ = start_subparse(FALSE, CVf_ANON); }
296         ;
297
298 startformsub:   /* NULL */      /* start a format subroutine scope */
299                         { $$ = start_subparse(TRUE, 0); }
300         ;
301
302 subname :       WORD    { char *name = SvPV(((SVOP*)$1)->op_sv, PL_na);
303                           if (strEQ(name, "BEGIN") || strEQ(name, "END")
304                               || strEQ(name, "INIT"))
305                               CvUNIQUE_on(PL_compcv);
306                           $$ = $1; }
307         ;
308
309 proto   :       /* NULL */
310                         { $$ = Nullop; }
311         |       THING
312         ;
313
314 subbody :       block   { $$ = $1; }
315         |       ';'     { $$ = Nullop; PL_expect = XSTATE; }
316         ;
317
318 package :       PACKAGE WORD ';'
319                         { package($2); }
320         |       PACKAGE ';'
321                         { package(Nullop); }
322         ;
323
324 use     :       USE startsub
325                         { CvUNIQUE_on(PL_compcv); /* It's a BEGIN {} */ }
326                     WORD WORD listexpr ';'
327                         { utilize($1, $2, $4, $5, $6); }
328         ;
329
330 expr    :       expr ANDOP expr
331                         { $$ = newLOGOP(OP_AND, 0, $1, $3); }
332         |       expr OROP expr
333                         { $$ = newLOGOP($2, 0, $1, $3); }
334         |       argexpr
335         ;
336
337 argexpr :       argexpr ','
338                         { $$ = $1; }
339         |       argexpr ',' term
340                         { $$ = append_elem(OP_LIST, $1, $3); }
341         |       term
342         ;
343
344 listop  :       LSTOP indirob argexpr
345                         { $$ = convert($1, OPf_STACKED,
346                                 prepend_elem(OP_LIST, newGVREF($1,$2), $3) ); }
347         |       FUNC '(' indirob expr ')'
348                         { $$ = convert($1, OPf_STACKED,
349                                 prepend_elem(OP_LIST, newGVREF($1,$3), $4) ); }
350         |       term ARROW method '(' listexprcom ')'
351                         { $$ = convert(OP_ENTERSUB, OPf_STACKED,
352                                 append_elem(OP_LIST,
353                                     prepend_elem(OP_LIST, scalar($1), $5),
354                                     newUNOP(OP_METHOD, 0, $3))); }
355         |       METHOD indirob listexpr
356                         { $$ = convert(OP_ENTERSUB, OPf_STACKED,
357                                 append_elem(OP_LIST,
358                                     prepend_elem(OP_LIST, $2, $3),
359                                     newUNOP(OP_METHOD, 0, $1))); }
360         |       FUNCMETH indirob '(' listexprcom ')'
361                         { $$ = convert(OP_ENTERSUB, OPf_STACKED,
362                                 append_elem(OP_LIST,
363                                     prepend_elem(OP_LIST, $2, $4),
364                                     newUNOP(OP_METHOD, 0, $1))); }
365         |       LSTOP listexpr
366                         { $$ = convert($1, 0, $2); }
367         |       FUNC '(' listexprcom ')'
368                         { $$ = convert($1, 0, $3); }
369         |       LSTOPSUB startanonsub block
370                         { $3 = newANONSUB($2, 0, $3); }
371                     listexpr            %prec LSTOP
372                         { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
373                                  append_elem(OP_LIST,
374                                    prepend_elem(OP_LIST, $3, $5), $1)); }
375         ;
376
377 method  :       METHOD
378         |       scalar
379         ;
380
381 term    :       term ASSIGNOP term
382                         { $$ = newASSIGNOP(OPf_STACKED, $1, $2, $3); }
383         |       term POWOP term
384                         { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
385         |       term MULOP term
386                         {   if ($2 != OP_REPEAT)
387                                 scalar($1);
388                             $$ = newBINOP($2, 0, $1, scalar($3)); }
389         |       term ADDOP term
390                         { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
391         |       term SHIFTOP term
392                         { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
393         |       term RELOP term
394                         { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
395         |       term EQOP term
396                         { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
397         |       term BITANDOP term
398                         { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
399         |       term BITOROP term
400                         { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
401         |       term DOTDOT term
402                         { $$ = newRANGE($2, scalar($1), scalar($3));}
403         |       term ANDAND term
404                         { $$ = newLOGOP(OP_AND, 0, $1, $3); }
405         |       term OROR term
406                         { $$ = newLOGOP(OP_OR, 0, $1, $3); }
407         |       term '?' term ':' term
408                         { $$ = newCONDOP(0, $1, $3, $5); }
409         |       term MATCHOP term
410                         { $$ = bind_match($2, $1, $3); }
411
412         |       '-' term %prec UMINUS
413                         { $$ = newUNOP(OP_NEGATE, 0, scalar($2)); }
414         |       '+' term %prec UMINUS
415                         { $$ = $2; }
416         |       '!' term
417                         { $$ = newUNOP(OP_NOT, 0, scalar($2)); }
418         |       '~' term
419                         { $$ = newUNOP(OP_COMPLEMENT, 0, scalar($2));}
420         |       REFGEN term
421                         { $$ = newUNOP(OP_REFGEN, 0, mod($2,OP_REFGEN)); }
422         |       term POSTINC
423                         { $$ = newUNOP(OP_POSTINC, 0,
424                                         mod(scalar($1), OP_POSTINC)); }
425         |       term POSTDEC
426                         { $$ = newUNOP(OP_POSTDEC, 0,
427                                         mod(scalar($1), OP_POSTDEC)); }
428         |       PREINC term
429                         { $$ = newUNOP(OP_PREINC, 0,
430                                         mod(scalar($2), OP_PREINC)); }
431         |       PREDEC term
432                         { $$ = newUNOP(OP_PREDEC, 0,
433                                         mod(scalar($2), OP_PREDEC)); }
434         |       local term      %prec UNIOP
435                         { $$ = localize($2,$1); }
436         |       '(' expr ')'
437                         { $$ = sawparens($2); }
438         |       '(' ')'
439                         { $$ = sawparens(newNULLLIST()); }
440         |       '[' expr ']'                            %prec '('
441                         { $$ = newANONLIST($2); }
442         |       '[' ']'                                 %prec '('
443                         { $$ = newANONLIST(Nullop); }
444         |       HASHBRACK expr ';' '}'                  %prec '('
445                         { $$ = newANONHASH($2); }
446         |       HASHBRACK ';' '}'                               %prec '('
447                         { $$ = newANONHASH(Nullop); }
448         |       ANONSUB startanonsub proto block                %prec '('
449                         { $$ = newANONSUB($2, $3, $4); }
450         |       scalar  %prec '('
451                         { $$ = $1; }
452         |       star '{' expr ';' '}'
453                         { $$ = newBINOP(OP_GELEM, 0, $1, scalar($3)); }
454         |       star    %prec '('
455                         { $$ = $1; }
456         |       scalar '[' expr ']'     %prec '('
457                         { $$ = newBINOP(OP_AELEM, 0, oopsAV($1), scalar($3)); }
458         |       term ARROW '[' expr ']' %prec '('
459                         { $$ = newBINOP(OP_AELEM, 0,
460                                         ref(newAVREF($1),OP_RV2AV),
461                                         scalar($4));}
462         |       term '[' expr ']'       %prec '('
463                         { assertref($1); $$ = newBINOP(OP_AELEM, 0,
464                                         ref(newAVREF($1),OP_RV2AV),
465                                         scalar($3));}
466         |       hsh     %prec '('
467                         { $$ = $1; }
468         |       ary     %prec '('
469                         { $$ = $1; }
470         |       arylen  %prec '('
471                         { $$ = newUNOP(OP_AV2ARYLEN, 0, ref($1, OP_AV2ARYLEN));}
472         |       scalar '{' expr ';' '}' %prec '('
473                         { $$ = newBINOP(OP_HELEM, 0, oopsHV($1), jmaybe($3));
474                             PL_expect = XOPERATOR; }
475         |       term ARROW '{' expr ';' '}'     %prec '('
476                         { $$ = newBINOP(OP_HELEM, 0,
477                                         ref(newHVREF($1),OP_RV2HV),
478                                         jmaybe($4));
479                             PL_expect = XOPERATOR; }
480         |       term '{' expr ';' '}'   %prec '('
481                         { assertref($1); $$ = newBINOP(OP_HELEM, 0,
482                                         ref(newHVREF($1),OP_RV2HV),
483                                         jmaybe($3));
484                             PL_expect = XOPERATOR; }
485         |       '(' expr ')' '[' expr ']'       %prec '('
486                         { $$ = newSLICEOP(0, $5, $2); }
487         |       '(' ')' '[' expr ']'    %prec '('
488                         { $$ = newSLICEOP(0, $4, Nullop); }
489         |       ary '[' expr ']'        %prec '('
490                         { $$ = prepend_elem(OP_ASLICE,
491                                 newOP(OP_PUSHMARK, 0),
492                                     newLISTOP(OP_ASLICE, 0,
493                                         list($3),
494                                         ref($1, OP_ASLICE))); }
495         |       ary '{' expr ';' '}'    %prec '('
496                         { $$ = prepend_elem(OP_HSLICE,
497                                 newOP(OP_PUSHMARK, 0),
498                                     newLISTOP(OP_HSLICE, 0,
499                                         list($3),
500                                         ref(oopsHV($1), OP_HSLICE)));
501                             PL_expect = XOPERATOR; }
502         |       THING   %prec '('
503                         { $$ = $1; }
504         |       amper
505                         { $$ = newUNOP(OP_ENTERSUB, 0, scalar($1)); }
506         |       amper '(' ')'
507                         { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar($1)); }
508         |       amper '(' expr ')'
509                         { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
510                             append_elem(OP_LIST, $3, scalar($1))); }
511         |       NOAMP WORD listexpr
512                         { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
513                             append_elem(OP_LIST, $3, scalar($2))); }
514         |       DO term %prec UNIOP
515                         { $$ = newUNOP(OP_DOFILE, 0, scalar($2)); }
516         |       DO block        %prec '('
517                         { $$ = newUNOP(OP_NULL, OPf_SPECIAL, scope($2)); }
518         |       DO WORD '(' ')'
519                         { $$ = newUNOP(OP_ENTERSUB,
520                             OPf_SPECIAL|OPf_STACKED,
521                             prepend_elem(OP_LIST,
522                                 scalar(newCVREF(
523                                     (OPpENTERSUB_AMPER<<8),
524                                     scalar($2)
525                                 )),Nullop)); dep();}
526         |       DO WORD '(' expr ')'
527                         { $$ = newUNOP(OP_ENTERSUB,
528                             OPf_SPECIAL|OPf_STACKED,
529                             append_elem(OP_LIST,
530                                 $4,
531                                 scalar(newCVREF(
532                                     (OPpENTERSUB_AMPER<<8),
533                                     scalar($2)
534                                 )))); dep();}
535         |       DO scalar '(' ')'
536                         { $$ = newUNOP(OP_ENTERSUB, OPf_SPECIAL|OPf_STACKED,
537                             prepend_elem(OP_LIST,
538                                 scalar(newCVREF(0,scalar($2))), Nullop)); dep();}
539         |       DO scalar '(' expr ')'
540                         { $$ = newUNOP(OP_ENTERSUB, OPf_SPECIAL|OPf_STACKED,
541                             prepend_elem(OP_LIST,
542                                 $4,
543                                 scalar(newCVREF(0,scalar($2))))); dep();}
544         |       term ARROW '(' ')'      %prec '('
545                         { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
546                                    newCVREF(0, scalar($1))); }
547         |       term ARROW '(' expr ')' %prec '('
548                         { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
549                                    append_elem(OP_LIST, $4,
550                                        newCVREF(0, scalar($1)))); }
551         |       LOOPEX
552                         { $$ = newOP($1, OPf_SPECIAL);
553                             PL_hints |= HINT_BLOCK_SCOPE; }
554         |       LOOPEX term
555                         { $$ = newLOOPEX($1,$2); }
556         |       NOTOP argexpr
557                         { $$ = newUNOP(OP_NOT, 0, scalar($2)); }
558         |       UNIOP
559                         { $$ = newOP($1, 0); }
560         |       UNIOP block
561                         { $$ = newUNOP($1, 0, $2); }
562         |       UNIOP term
563                         { $$ = newUNOP($1, 0, $2); }
564         |       UNIOPSUB term
565                         { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
566                             append_elem(OP_LIST, $2, scalar($1))); }
567         |       FUNC0
568                         { $$ = newOP($1, 0); }
569         |       FUNC0 '(' ')'
570                         { $$ = newOP($1, 0); }
571         |       FUNC0SUB
572                         { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
573                                 scalar($1)); }
574         |       FUNC1 '(' ')'
575                         { $$ = newOP($1, OPf_SPECIAL); }
576         |       FUNC1 '(' expr ')'
577                         { $$ = newUNOP($1, 0, $3); }
578         |       PMFUNC '(' term ')'
579                         { $$ = pmruntime($1, $3, Nullop); }
580         |       PMFUNC '(' term ',' term ')'
581                         { $$ = pmruntime($1, $3, $5); }
582         |       WORD
583         |       listop
584         ;
585
586 listexpr:       /* NULL */
587                         { $$ = Nullop; }
588         |       argexpr
589                         { $$ = $1; }
590         ;
591
592 listexprcom:    /* NULL */
593                         { $$ = Nullop; }
594         |       expr
595                         { $$ = $1; }
596         |       expr ','
597                         { $$ = $1; }
598         ;
599
600 local   :       LOCAL   { $$ = 0; }
601         |       MY      { $$ = 1; }
602         ;
603
604 my_scalar:      scalar
605                         { PL_in_my = 0; $$ = my($1); }
606         ;
607
608 amper   :       '&' indirob
609                         { $$ = newCVREF($1,$2); }
610         ;
611
612 scalar  :       '$' indirob
613                         { $$ = newSVREF($2); }
614         ;
615
616 ary     :       '@' indirob
617                         { $$ = newAVREF($2); }
618         ;
619
620 hsh     :       '%' indirob
621                         { $$ = newHVREF($2); }
622         ;
623
624 arylen  :       DOLSHARP indirob
625                         { $$ = newAVREF($2); }
626         ;
627
628 star    :       '*' indirob
629                         { $$ = newGVREF(0,$2); }
630         ;
631
632 indirob :       WORD
633                         { $$ = scalar($1); }
634         |       scalar
635                         { $$ = scalar($1);  }
636         |       block
637                         { $$ = scope($1); }
638
639         |       PRIVATEREF
640                         { $$ = $1; }
641         ;
642
643 %% /* PROGRAM */