%{
-/* $Header: a2p.y,v 3.0 89/10/18 15:34:29 lwall Locked $
+/* $RCSfile: a2p.y,v $$Revision: 4.1 $$Date: 92/08/07 18:29:12 $
*
- * Copyright (c) 1989, Larry Wall
+ * Copyright (c) 1991-1997, Larry Wall
*
- * You may distribute under the terms of the GNU General Public License
- * as specified in the README file that comes with the perl 3.0 kit.
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
*
* $Log: a2p.y,v $
- * Revision 3.0 89/10/18 15:34:29 lwall
- * 3.0 baseline
- *
*/
#include "INTERN.h"
%token REGEX
%token SEMINEW NEWLINE COMMENT
%token FUN1 FUNN GRGR
-%token PRINT PRINTF SPRINTF SPLIT
+%token PRINT PRINTF SPRINTF_OLD SPRINTF_NEW SPLIT
%token IF ELSE WHILE FOR IN
%token EXIT NEXT BREAK CONTINUE RET
%token GETLINE DO SUB GSUB MATCH
{ $$ = rememberargs($$); }
;
-patpat : pat
+patpat : cond
{ $$ = oper1(OPAT,$1); }
- | pat ',' pat
+ | cond ',' cond
{ $$ = oper2(ORANGE,$1,$3); }
;
-pat : match
- | rel
- | compound_pat
- ;
-
-compound_pat
- : '(' compound_pat ')'
- { $$ = oper1(OPPAREN,$2); }
- | pat ANDAND maybe pat
- { $$ = oper3(OPANDAND,$1,$3,$4); }
- | pat OROR maybe pat
- { $$ = oper3(OPOROR,$1,$3,$4); }
- | NOT pat
- { $$ = oper1(OPNOT,$2); }
- ;
-
cond : expr
| match
| rel
| compound_cond
+ | cond '?' expr ':' expr
+ { $$ = oper3(OCOND,$1,$3,$5); }
;
compound_cond
{ $$ = $1; }
| expr term
{ $$ = oper2(OCONCAT,$1,$2); }
- | variable ASGNOP expr
+ | 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;
}
;
+sprintf : SPRINTF_NEW
+ | SPRINTF_OLD ;
+
term : variable
{ $$ = $1; }
| NUMBER
{ $$ = oper2(OPOW,$1,$3); }
| term IN VAR
{ $$ = oper2(ODEFINED,aryrefarg($3),$1); }
- | term '?' term ':' term
- { $$ = oper2(OCOND,$1,$3,$5); }
| variable INCR
{ $$ = oper1(OPOSTINCR,$1); }
| variable DECR
{ $$ = oper1(OUMINUS,$2); }
| '+' term %prec UMINUS
{ $$ = oper1(OUPLUS,$2); }
- | '(' expr ')'
+ | '(' cond ')'
{ $$ = oper1(OPAREN,$2); }
| GETLINE
{ $$ = oper0(OGETLINE); }
- | GETLINE VAR
+ | GETLINE variable
{ $$ = oper1(OGETLINE,$2); }
| GETLINE '<' expr
{ $$ = oper3(OGETLINE,Nullop,string("<",1),$3);
if (ops[$3].ival != OSTR + (1<<8)) do_fancy_opens = TRUE; }
- | GETLINE VAR '<' expr
+ | GETLINE variable '<' expr
{ $$ = oper3(OGETLINE,$2,string("<",1),$4);
if (ops[$4].ival != OSTR + (1<<8)) do_fancy_opens = TRUE; }
| term 'p' GETLINE
{ $$ = oper3(OGETLINE,Nullop,string("|",1),$1);
if (ops[$1].ival != OSTR + (1<<8)) do_fancy_opens = TRUE; }
- | term 'p' GETLINE VAR
+ | term 'p' GETLINE variable
{ $$ = oper3(OGETLINE,$4,string("|",1),$1);
if (ops[$1].ival != OSTR + (1<<8)) do_fancy_opens = TRUE; }
| FUN1
{ $$ = oper1($1,$3); }
| USERFUN '(' expr_list ')'
{ $$ = oper2(OUSERFUN,$1,$3); }
- | SPRINTF expr_list
+ | SPRINTF_NEW '(' expr_list ')'
+ { $$ = oper1(OSPRINTF,$3); }
+ | sprintf expr_list
{ $$ = oper1(OSPRINTF,$2); }
| SUBSTR '(' expr ',' expr ',' expr ')'
{ $$ = oper3(OSUBSTR,$3,$5,$7); }
{ $$ = oper2(OSUBSTR,$3,$5); }
| SPLIT '(' expr ',' VAR ',' expr ')'
{ $$ = oper3(OSPLIT,$3,aryrefarg(numary($5)),$7); }
+ | SPLIT '(' expr ',' VAR ',' REGEX ')'
+ { $$ = oper3(OSPLIT,$3,aryrefarg(numary($5)),oper1(OREGEX,$7));}
| SPLIT '(' expr ',' VAR ')'
{ $$ = oper2(OSPLIT,$3,aryrefarg(numary($5))); }
| INDEX '(' expr ',' expr ')'
{ $$ = oper0(ORETURN); }
| RET expr
{ $$ = oper1(ORETURN,$2); }
- | DELETE VAR '[' expr ']'
+ | DELETE VAR '[' expr_list ']'
{ $$ = oper2(ODELETE,aryrefarg($2),$4); }
;
redir : '>' %prec FIELD
- { $$ = oper1(OREDIR,$1); }
+ { $$ = oper1(OREDIR,string(">",1)); }
| GRGR
{ $$ = oper1(OREDIR,string(">>",2)); }
| '|'
;
%%
+
+int yyparse _((void));
+
#include "a2py.c"