%{
/* $RCSfile: a2p.y,v $$Revision: 4.1 $$Date: 92/08/07 18:29:12 $
*
- * Copyright (c) 1991-2001, Larry Wall
+ * Copyright (C) 1991, 1992, 1993, 1994, 1996, 1997, 1999, 2000,
+ * by Larry Wall and others
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
%left NOT
%right '^'
%left INCR DECR
-%left FIELD VFIELD
+%left FIELD VFIELD SVFIELD
%%
| expr '?' expr ':' expr
{ $$ = oper3(OCOND,$1,$3,$5); }
| variable ASGNOP cond
- { $$ = oper3(OASSIGN,$2,$1,$3);
- if ((ops[$1].ival & 255) == OFLD)
- lval_field = TRUE;
- if ((ops[$1].ival & 255) == OVFLD)
- lval_field = TRUE;
+ {
+ $$ = oper3(OASSIGN,$2,$1,$3);
+ if ((ops[$1].ival & 255) == OFLD)
+ lval_field = TRUE;
+ else if ((ops[$1].ival & 255) == OVFLD)
+ lval_field = TRUE;
}
;
| term IN VAR
{ $$ = oper2(ODEFINED,aryrefarg($3),$1); }
| variable INCR
- { $$ = oper1(OPOSTINCR,$1); }
+ {
+ $$ = oper1(OPOSTINCR,$1);
+ if ((ops[$1].ival & 255) == OFLD)
+ lval_field = TRUE;
+ else if ((ops[$1].ival & 255) == OVFLD)
+ lval_field = TRUE;
+ }
| variable DECR
- { $$ = oper1(OPOSTDECR,$1); }
+ {
+ $$ = oper1(OPOSTDECR,$1);
+ if ((ops[$1].ival & 255) == OFLD)
+ lval_field = TRUE;
+ else if ((ops[$1].ival & 255) == OVFLD)
+ lval_field = TRUE;
+ }
| INCR variable
- { $$ = oper1(OPREINCR,$2); }
+ {
+ $$ = oper1(OPREINCR,$2);
+ if ((ops[$2].ival & 255) == OFLD)
+ lval_field = TRUE;
+ else if ((ops[$2].ival & 255) == OVFLD)
+ lval_field = TRUE;
+ }
| DECR variable
- { $$ = oper1(OPREDECR,$2); }
+ {
+ $$ = oper1(OPREDECR,$2);
+ if ((ops[$2].ival & 255) == OFLD)
+ lval_field = TRUE;
+ else if ((ops[$2].ival & 255) == OVFLD)
+ lval_field = TRUE;
+ }
| '-' term %prec UMINUS
{ $$ = oper1(OUMINUS,$2); }
| '+' term %prec UMINUS
{ $$ = oper2(OVAR,aryrefarg($1),$3); }
| FIELD
{ $$ = oper1(OFLD,$1); }
+ | SVFIELD
+ { $$ = oper1(OVFLD,oper1(OVAR,$1)); }
| VFIELD term
{ $$ = oper1(OVFLD,$2); }
;