1: /* $Header: perl.y,v 1.0.1.1 88/01/28 10:25:31 root Exp $ 2: * 3: * $Log: perl.y,v $ 4: * Revision 1.0.1.1 88/01/28 10:25:31 root 5: * patch8: added eval operator. 6: * 7: * Revision 1.0 87/12/18 15:48:59 root 8: * Initial revision 9: * 10: */ 11: 12: %{ 13: #include "handy.h" 14: #include "EXTERN.h" 15: #include "search.h" 16: #include "util.h" 17: #include "INTERN.h" 18: #include "perl.h" 19: char *tokename[] = { 20: "256", 21: "word", 22: "append","open","write","select","close","loopctl", 23: "using","format","do","shift","push","pop","chop", 24: "while","until","if","unless","else","elsif","continue","split","sprintf", 25: "for", "eof", "tell", "seek", "stat", 26: "function(no args)","function(1 arg)","function(2 args)","function(3 args)","array function", 27: "join", "sub", 28: "format lines", 29: "register","array_length", "array", 30: "s","pattern", 31: "string","y", 32: "print", "unary operation", 33: "..", 34: "||", 35: "&&", 36: "==","!=", "EQ", "NE", 37: "<=",">=", "LT", "GT", "LE", "GE", 38: "<<",">>", 39: "=~","!~", 40: "unary -", 41: "++", "--", 42: "???" 43: }; 44: 45: %} 46: 47: %start prog 48: 49: %union { 50: int ival; 51: char *cval; 52: ARG *arg; 53: CMD *cmdval; 54: struct compcmd compval; 55: STAB *stabval; 56: FCMD *formval; 57: } 58: 59: %token <cval> WORD 60: %token <ival> APPEND OPEN WRITE SELECT CLOSE LOOPEX 61: %token <ival> USING FORMAT DO SHIFT PUSH POP CHOP 62: %token <ival> WHILE UNTIL IF UNLESS ELSE ELSIF CONTINUE SPLIT SPRINTF 63: %token <ival> FOR FEOF TELL SEEK STAT 64: %token <ival> FUNC0 FUNC1 FUNC2 FUNC3 STABFUN 65: %token <ival> JOIN SUB 66: %token <formval> FORMLIST 67: %token <stabval> REG ARYLEN ARY 68: %token <arg> SUBST PATTERN 69: %token <arg> RSTRING TRANS 70: 71: %type <ival> prog decl format 72: %type <stabval> 73: %type <cmdval> block lineseq line loop cond sideff nexpr else 74: %type <arg> expr sexpr term 75: %type <arg> condmod loopmod cexpr 76: %type <arg> texpr print 77: %type <cval> label 78: %type <compval> compblock 79: 80: %nonassoc <ival> PRINT 81: %left ',' 82: %nonassoc <ival> UNIOP 83: %right '=' 84: %right '?' ':' 85: %nonassoc DOTDOT 86: %left OROR 87: %left ANDAND 88: %left '|' '^' 89: %left '&' 90: %nonassoc EQ NE SEQ SNE 91: %nonassoc '<' '>' LE GE SLT SGT SLE SGE 92: %left LS RS 93: %left '+' '-' '.' 94: %left '*' '/' '%' 'x' 95: %left MATCH NMATCH 96: %right '!' '~' UMINUS 97: %nonassoc INC DEC 98: %left '(' 99: 100: %% /* RULES */ 101: 102: prog : lineseq 103: { if (in_eval) 104: eval_root = block_head($1); 105: else 106: main_root = block_head($1); } 107: ; 108: 109: compblock: block CONTINUE block 110: { $$.comp_true = $1; $$.comp_alt = $3; } 111: | block else 112: { $$.comp_true = $1; $$.comp_alt = $2; } 113: ; 114: 115: else : /* NULL */ 116: { $$ = Nullcmd; } 117: | ELSE block 118: { $$ = $2; } 119: | ELSIF '(' expr ')' compblock 120: { $$ = make_ccmd(C_IF,$3,$5); } 121: ; 122: 123: block : '{' lineseq '}' 124: { $$ = block_head($2); } 125: ; 126: 127: lineseq : /* NULL */ 128: { $$ = Nullcmd; } 129: | lineseq line 130: { $$ = append_line($1,$2); } 131: ; 132: 133: line : decl 134: { $$ = Nullcmd; } 135: | label cond 136: { $$ = add_label($1,$2); } 137: | loop /* loops add their own labels */ 138: | label ';' 139: { if ($1 != Nullch) { 140: $$ = add_label(make_acmd(C_EXPR, Nullstab, 141: Nullarg, Nullarg) ); 142: } else 143: $$ = Nullcmd; } 144: | label sideff ';' 145: { $$ = add_label($1,$2); } 146: ; 147: 148: sideff : expr 149: { $$ = make_acmd(C_EXPR, Nullstab, $1, Nullarg); } 150: | expr condmod 151: { $$ = addcond( 152: make_acmd(C_EXPR, Nullstab, Nullarg, $1), $2); } 153: | expr loopmod 154: { $$ = addloop( 155: make_acmd(C_EXPR, Nullstab, Nullarg, $1), $2); } 156: ; 157: 158: cond : IF '(' expr ')' compblock 159: { $$ = make_ccmd(C_IF,$3,$5); } 160: | UNLESS '(' expr ')' compblock 161: { $$ = invert(make_ccmd(C_IF,$3,$5)); } 162: | IF block compblock 163: { $$ = make_ccmd(C_IF,cmd_to_arg($2),$3); } 164: | UNLESS block compblock 165: { $$ = invert(make_ccmd(C_IF,cmd_to_arg($2),$3)); } 166: ; 167: 168: loop : label WHILE '(' texpr ')' compblock 169: { $$ = wopt(add_label($1, 170: make_ccmd(C_WHILE,$4,$6) )); } 171: | label UNTIL '(' expr ')' compblock 172: { $$ = wopt(add_label($1, 173: invert(make_ccmd(C_WHILE,$4,$6)) )); } 174: | label WHILE block compblock 175: { $$ = wopt(add_label($1, 176: make_ccmd(C_WHILE, cmd_to_arg($3),$4) )); } 177: | label UNTIL block compblock 178: { $$ = wopt(add_label($1, 179: invert(make_ccmd(C_WHILE, cmd_to_arg($3),$4)) )); } 180: | label FOR '(' nexpr ';' texpr ';' nexpr ')' block 181: /* basically fake up an initialize-while lineseq */ 182: { yyval.compval.comp_true = $10; 183: yyval.compval.comp_alt = $8; 184: $$ = append_line($4,wopt(add_label($1, 185: make_ccmd(C_WHILE,$6,yyval.compval) ))); } 186: | label compblock /* a block is a loop that happens once */ 187: { $$ = add_label($1,make_ccmd(C_BLOCK,Nullarg,$2)); } 188: ; 189: 190: nexpr : /* NULL */ 191: { $$ = Nullcmd; } 192: | sideff 193: ; 194: 195: texpr : /* NULL means true */ 196: { scanstr("1"); $$ = yylval.arg; } 197: | expr 198: ; 199: 200: label : /* empty */ 201: { $$ = Nullch; } 202: | WORD ':' 203: ; 204: 205: loopmod : WHILE expr 206: { $$ = $2; } 207: | UNTIL expr 208: { $$ = make_op(O_NOT,1,$2,Nullarg,Nullarg,0); } 209: ; 210: 211: condmod : IF expr 212: { $$ = $2; } 213: | UNLESS expr 214: { $$ = make_op(O_NOT,1,$2,Nullarg,Nullarg,0); } 215: ; 216: 217: decl : format 218: { $$ = 0; } 219: | subrout 220: { $$ = 0; } 221: ; 222: 223: format : FORMAT WORD '=' FORMLIST '.' 224: { stabent($2,TRUE)->stab_form = $4; safefree($2); } 225: | FORMAT '=' FORMLIST '.' 226: { stabent("stdout",TRUE)->stab_form = $3; } 227: ; 228: 229: subrout : SUB WORD block 230: { stabent($2,TRUE)->stab_sub = $3; } 231: ; 232: 233: expr : print 234: | cexpr 235: ; 236: 237: cexpr : sexpr ',' cexpr 238: { $$ = make_op(O_COMMA, 2, $1, $3, Nullarg,0); } 239: | sexpr 240: ; 241: 242: sexpr : sexpr '=' sexpr 243: { $1 = listish($1); 244: if ($1->arg_type == O_LIST) 245: $3 = listish($3); 246: $$ = l(make_op(O_ASSIGN, 2, $1, $3, Nullarg,1)); } 247: | sexpr '*' '=' sexpr 248: { $$ = l(make_op(O_MULTIPLY, 2, $1, $4, Nullarg,0)); } 249: | sexpr '/' '=' sexpr 250: { $$ = l(make_op(O_DIVIDE, 2, $1, $4, Nullarg,0)); } 251: | sexpr '%' '=' sexpr 252: { $$ = l(make_op(O_MODULO, 2, $1, $4, Nullarg,0)); } 253: | sexpr 'x' '=' sexpr 254: { $$ = l(make_op(O_REPEAT, 2, $1, $4, Nullarg,0)); } 255: | sexpr '+' '=' sexpr 256: { $$ = l(make_op(O_ADD, 2, $1, $4, Nullarg,0)); } 257: | sexpr '-' '=' sexpr 258: { $$ = l(make_op(O_SUBTRACT, 2, $1, $4, Nullarg,0)); } 259: | sexpr LS '=' sexpr 260: { $$ = l(make_op(O_LEFT_SHIFT, 2, $1, $4, Nullarg,0)); } 261: | sexpr RS '=' sexpr 262: { $$ = l(make_op(O_RIGHT_SHIFT, 2, $1, $4, Nullarg,0)); } 263: | sexpr '&' '=' sexpr 264: { $$ = l(make_op(O_BIT_AND, 2, $1, $4, Nullarg,0)); } 265: | sexpr '^' '=' sexpr 266: { $$ = l(make_op(O_XOR, 2, $1, $4, Nullarg,0)); } 267: | sexpr '|' '=' sexpr 268: { $$ = l(make_op(O_BIT_OR, 2, $1, $4, Nullarg,0)); } 269: | sexpr '.' '=' sexpr 270: { $$ = l(make_op(O_CONCAT, 2, $1, $4, Nullarg,0)); } 271: 272: 273: | sexpr '*' sexpr 274: { $$ = make_op(O_MULTIPLY, 2, $1, $3, Nullarg,0); } 275: | sexpr '/' sexpr 276: { $$ = make_op(O_DIVIDE, 2, $1, $3, Nullarg,0); } 277: | sexpr '%' sexpr 278: { $$ = make_op(O_MODULO, 2, $1, $3, Nullarg,0); } 279: | sexpr 'x' sexpr 280: { $$ = make_op(O_REPEAT, 2, $1, $3, Nullarg,0); } 281: | sexpr '+' sexpr 282: { $$ = make_op(O_ADD, 2, $1, $3, Nullarg,0); } 283: | sexpr '-' sexpr 284: { $$ = make_op(O_SUBTRACT, 2, $1, $3, Nullarg,0); } 285: | sexpr LS sexpr 286: { $$ = make_op(O_LEFT_SHIFT, 2, $1, $3, Nullarg,0); } 287: | sexpr RS sexpr 288: { $$ = make_op(O_RIGHT_SHIFT, 2, $1, $3, Nullarg,0); } 289: | sexpr '<' sexpr 290: { $$ = make_op(O_LT, 2, $1, $3, Nullarg,0); } 291: | sexpr '>' sexpr 292: { $$ = make_op(O_GT, 2, $1, $3, Nullarg,0); } 293: | sexpr LE sexpr 294: { $$ = make_op(O_LE, 2, $1, $3, Nullarg,0); } 295: | sexpr GE sexpr 296: { $$ = make_op(O_GE, 2, $1, $3, Nullarg,0); } 297: | sexpr EQ sexpr 298: { $$ = make_op(O_EQ, 2, $1, $3, Nullarg,0); } 299: | sexpr NE sexpr 300: { $$ = make_op(O_NE, 2, $1, $3, Nullarg,0); } 301: | sexpr SLT sexpr 302: { $$ = make_op(O_SLT, 2, $1, $3, Nullarg,0); } 303: | sexpr SGT sexpr 304: { $$ = make_op(O_SGT, 2, $1, $3, Nullarg,0); } 305: | sexpr SLE sexpr 306: { $$ = make_op(O_SLE, 2, $1, $3, Nullarg,0); } 307: | sexpr SGE sexpr 308: { $$ = make_op(O_SGE, 2, $1, $3, Nullarg,0); } 309: | sexpr SEQ sexpr 310: { $$ = make_op(O_SEQ, 2, $1, $3, Nullarg,0); } 311: | sexpr SNE sexpr 312: { $$ = make_op(O_SNE, 2, $1, $3, Nullarg,0); } 313: | sexpr '&' sexpr 314: { $$ = make_op(O_BIT_AND, 2, $1, $3, Nullarg,0); } 315: | sexpr '^' sexpr 316: { $$ = make_op(O_XOR, 2, $1, $3, Nullarg,0); } 317: | sexpr '|' sexpr 318: { $$ = make_op(O_BIT_OR, 2, $1, $3, Nullarg,0); } 319: | sexpr DOTDOT sexpr 320: { $$ = make_op(O_FLIP, 4, 321: flipflip($1), 322: flipflip($3), 323: Nullarg,0);} 324: | sexpr ANDAND sexpr 325: { $$ = make_op(O_AND, 2, $1, $3, Nullarg,0); } 326: | sexpr OROR sexpr 327: { $$ = make_op(O_OR, 2, $1, $3, Nullarg,0); } 328: | sexpr '?' sexpr ':' sexpr 329: { $$ = make_op(O_COND_EXPR, 3, $1, $3, $5,0); } 330: | sexpr '.' sexpr 331: { $$ = make_op(O_CONCAT, 2, $1, $3, Nullarg,0); } 332: | sexpr MATCH sexpr 333: { $$ = mod_match(O_MATCH, $1, $3); } 334: | sexpr NMATCH sexpr 335: { $$ = mod_match(O_NMATCH, $1, $3); } 336: | term INC 337: { $$ = addflags(1, AF_POST|AF_UP, 338: l(make_op(O_ITEM,1,$1,Nullarg,Nullarg,0))); } 339: | term DEC 340: { $$ = addflags(1, AF_POST, 341: l(make_op(O_ITEM,1,$1,Nullarg,Nullarg,0))); } 342: | INC term 343: { $$ = addflags(1, AF_PRE|AF_UP, 344: l(make_op(O_ITEM,1,$2,Nullarg,Nullarg,0))); } 345: | DEC term 346: { $$ = addflags(1, AF_PRE, 347: l(make_op(O_ITEM,1,$2,Nullarg,Nullarg,0))); } 348: | term 349: { $$ = $1; } 350: ; 351: 352: term : '-' term %prec UMINUS 353: { $$ = make_op(O_NEGATE, 1, $2, Nullarg, Nullarg,0); } 354: | '!' term 355: { $$ = make_op(O_NOT, 1, $2, Nullarg, Nullarg,0); } 356: | '~' term 357: { $$ = make_op(O_COMPLEMENT, 1, $2, Nullarg, Nullarg,0);} 358: | '(' expr ')' 359: { $$ = make_list(hide_ary($2)); } 360: | '(' ')' 361: { $$ = make_list(Nullarg); } 362: | DO block %prec '(' 363: { $$ = cmd_to_arg($2); } 364: | REG %prec '(' 365: { $$ = stab_to_arg(A_STAB,$1); } 366: | REG '[' expr ']' %prec '(' 367: { $$ = make_op(O_ARRAY, 2, 368: $3, stab_to_arg(A_STAB,aadd($1)), Nullarg,0); } 369: | ARY %prec '(' 370: { $$ = make_op(O_ARRAY, 1, 371: stab_to_arg(A_STAB,$1), 372: Nullarg, Nullarg, 1); } 373: | REG '{' expr '}' %prec '(' 374: { $$ = make_op(O_HASH, 2, 375: $3, stab_to_arg(A_STAB,hadd($1)), Nullarg,0); } 376: | ARYLEN %prec '(' 377: { $$ = stab_to_arg(A_ARYLEN,$1); } 378: | RSTRING %prec '(' 379: { $$ = $1; } 380: | PATTERN %prec '(' 381: { $$ = $1; } 382: | SUBST %prec '(' 383: { $$ = $1; } 384: | TRANS %prec '(' 385: { $$ = $1; } 386: | DO WORD '(' expr ')' 387: { $$ = make_op(O_SUBR, 2, 388: make_list($4), 389: stab_to_arg(A_STAB,stabent($2,TRUE)), 390: Nullarg,1); } 391: | DO WORD '(' ')' 392: { $$ = make_op(O_SUBR, 2, 393: make_list(Nullarg), 394: stab_to_arg(A_STAB,stabent($2,TRUE)), 395: Nullarg,1); } 396: | LOOPEX 397: { $$ = make_op($1,0,Nullarg,Nullarg,Nullarg,0); } 398: | LOOPEX WORD 399: { $$ = make_op($1,1,cval_to_arg($2), 400: Nullarg,Nullarg,0); } 401: | UNIOP 402: { $$ = make_op($1,1,Nullarg,Nullarg,Nullarg,0); } 403: | UNIOP sexpr 404: { $$ = make_op($1,1,$2,Nullarg,Nullarg,0); } 405: | WRITE 406: { $$ = make_op(O_WRITE, 0, 407: Nullarg, Nullarg, Nullarg,0); } 408: | WRITE '(' ')' 409: { $$ = make_op(O_WRITE, 0, 410: Nullarg, Nullarg, Nullarg,0); } 411: | WRITE '(' WORD ')' 412: { $$ = l(make_op(O_WRITE, 1, 413: stab_to_arg(A_STAB,stabent($3,TRUE)), 414: Nullarg, Nullarg,0)); safefree($3); } 415: | WRITE '(' expr ')' 416: { $$ = make_op(O_WRITE, 1, $3, Nullarg, Nullarg,0); } 417: | SELECT '(' WORD ')' 418: { $$ = l(make_op(O_SELECT, 1, 419: stab_to_arg(A_STAB,stabent($3,TRUE)), 420: Nullarg, Nullarg,0)); safefree($3); } 421: | SELECT '(' expr ')' 422: { $$ = make_op(O_SELECT, 1, $3, Nullarg, Nullarg,0); } 423: | OPEN WORD %prec '(' 424: { $$ = make_op(O_OPEN, 2, 425: stab_to_arg(A_STAB,stabent($2,TRUE)), 426: stab_to_arg(A_STAB,stabent($2,TRUE)), 427: Nullarg,0); } 428: | OPEN '(' WORD ')' 429: { $$ = make_op(O_OPEN, 2, 430: stab_to_arg(A_STAB,stabent($3,TRUE)), 431: stab_to_arg(A_STAB,stabent($3,TRUE)), 432: Nullarg,0); } 433: | OPEN '(' WORD ',' expr ')' 434: { $$ = make_op(O_OPEN, 2, 435: stab_to_arg(A_STAB,stabent($3,TRUE)), 436: $5, Nullarg,0); } 437: | CLOSE '(' WORD ')' 438: { $$ = make_op(O_CLOSE, 1, 439: stab_to_arg(A_STAB,stabent($3,TRUE)), 440: Nullarg, Nullarg,0); } 441: | CLOSE WORD %prec '(' 442: { $$ = make_op(O_CLOSE, 1, 443: stab_to_arg(A_STAB,stabent($2,TRUE)), 444: Nullarg, Nullarg,0); } 445: | FEOF '(' WORD ')' 446: { $$ = make_op(O_EOF, 1, 447: stab_to_arg(A_STAB,stabent($3,TRUE)), 448: Nullarg, Nullarg,0); } 449: | FEOF '(' ')' 450: { $$ = make_op(O_EOF, 0, 451: stab_to_arg(A_STAB,stabent("ARGV",TRUE)), 452: Nullarg, Nullarg,0); } 453: | FEOF 454: { $$ = make_op(O_EOF, 0, 455: Nullarg, Nullarg, Nullarg,0); } 456: | TELL '(' WORD ')' 457: { $$ = make_op(O_TELL, 1, 458: stab_to_arg(A_STAB,stabent($3,TRUE)), 459: Nullarg, Nullarg,0); } 460: | TELL 461: { $$ = make_op(O_TELL, 0, 462: Nullarg, Nullarg, Nullarg,0); } 463: | SEEK '(' WORD ',' sexpr ',' expr ')' 464: { $$ = make_op(O_SEEK, 3, 465: stab_to_arg(A_STAB,stabent($3,TRUE)), 466: $5, $7,1); } 467: | PUSH '(' WORD ',' expr ')' 468: { $$ = make_op($1, 2, 469: make_list($5), 470: stab_to_arg(A_STAB,aadd(stabent($3,TRUE))), 471: Nullarg,1); } 472: | PUSH '(' ARY ',' expr ')' 473: { $$ = make_op($1, 2, 474: make_list($5), 475: stab_to_arg(A_STAB,$3), 476: Nullarg,1); } 477: | POP WORD %prec '(' 478: { $$ = make_op(O_POP, 1, 479: stab_to_arg(A_STAB,aadd(stabent($2,TRUE))), 480: Nullarg, Nullarg,0); } 481: | POP '(' WORD ')' 482: { $$ = make_op(O_POP, 1, 483: stab_to_arg(A_STAB,aadd(stabent($3,TRUE))), 484: Nullarg, Nullarg,0); } 485: | POP ARY %prec '(' 486: { $$ = make_op(O_POP, 1, 487: stab_to_arg(A_STAB,$2), 488: Nullarg, 489: Nullarg, 490: 0); } 491: | POP '(' ARY ')' 492: { $$ = make_op(O_POP, 1, 493: stab_to_arg(A_STAB,$3), 494: Nullarg, 495: Nullarg, 496: 0); } 497: | SHIFT WORD %prec '(' 498: { $$ = make_op(O_SHIFT, 1, 499: stab_to_arg(A_STAB,aadd(stabent($2,TRUE))), 500: Nullarg, Nullarg,0); } 501: | SHIFT '(' WORD ')' 502: { $$ = make_op(O_SHIFT, 1, 503: stab_to_arg(A_STAB,aadd(stabent($3,TRUE))), 504: Nullarg, Nullarg,0); } 505: | SHIFT ARY %prec '(' 506: { $$ = make_op(O_SHIFT, 1, 507: stab_to_arg(A_STAB,$2), Nullarg, Nullarg,0); } 508: | SHIFT '(' ARY ')' 509: { $$ = make_op(O_SHIFT, 1, 510: stab_to_arg(A_STAB,$3), Nullarg, Nullarg,0); } 511: | SHIFT %prec '(' 512: { $$ = make_op(O_SHIFT, 1, 513: stab_to_arg(A_STAB,aadd(stabent("ARGV",TRUE))), 514: Nullarg, Nullarg,0); } 515: | SPLIT %prec '(' 516: { scanpat("/[ \t\n]+/"); 517: $$ = make_split(defstab,yylval.arg); } 518: | SPLIT '(' WORD ')' 519: { scanpat("/[ \t\n]+/"); 520: $$ = make_split(stabent($3,TRUE),yylval.arg); } 521: | SPLIT '(' WORD ',' PATTERN ')' 522: { $$ = make_split(stabent($3,TRUE),$5); } 523: | SPLIT '(' WORD ',' PATTERN ',' sexpr ')' 524: { $$ = mod_match(O_MATCH, 525: $7, 526: make_split(stabent($3,TRUE),$5) ); } 527: | SPLIT '(' sexpr ',' sexpr ')' 528: { $$ = mod_match(O_MATCH, $5, make_split(defstab,$3) ); } 529: | SPLIT '(' sexpr ')' 530: { $$ = mod_match(O_MATCH, 531: stab_to_arg(A_STAB,defstab), 532: make_split(defstab,$3) ); } 533: | JOIN '(' WORD ',' expr ')' 534: { $$ = make_op(O_JOIN, 2, 535: $5, 536: stab_to_arg(A_STAB,aadd(stabent($3,TRUE))), 537: Nullarg,0); } 538: | JOIN '(' sexpr ',' expr ')' 539: { $$ = make_op(O_JOIN, 2, 540: $3, 541: make_list($5), 542: Nullarg,2); } 543: | SPRINTF '(' expr ')' 544: { $$ = make_op(O_SPRINTF, 1, 545: make_list($3), 546: Nullarg, 547: Nullarg,1); } 548: | STAT '(' WORD ')' 549: { $$ = l(make_op(O_STAT, 1, 550: stab_to_arg(A_STAB,stabent($3,TRUE)), 551: Nullarg, Nullarg,0)); } 552: | STAT '(' expr ')' 553: { $$ = make_op(O_STAT, 1, $3, Nullarg, Nullarg,0); } 554: | CHOP 555: { $$ = l(make_op(O_CHOP, 1, 556: stab_to_arg(A_STAB,defstab), 557: Nullarg, Nullarg,0)); } 558: | CHOP '(' expr ')' 559: { $$ = l(make_op(O_CHOP, 1, $3, Nullarg, Nullarg,0)); } 560: | FUNC0 561: { $$ = make_op($1, 0, Nullarg, Nullarg, Nullarg,0); } 562: | FUNC1 '(' expr ')' 563: { $$ = make_op($1, 1, $3, Nullarg, Nullarg,0); } 564: | FUNC2 '(' sexpr ',' expr ')' 565: { $$ = make_op($1, 2, $3, $5, Nullarg, 0); } 566: | FUNC3 '(' sexpr ',' sexpr ',' expr ')' 567: { $$ = make_op($1, 3, $3, $5, $7, 0); } 568: | STABFUN '(' WORD ')' 569: { $$ = make_op($1, 1, 570: stab_to_arg(A_STAB,hadd(stabent($3,TRUE))), 571: Nullarg, 572: Nullarg, 0); } 573: ; 574: 575: print : PRINT 576: { $$ = make_op($1,2, 577: stab_to_arg(A_STAB,defstab), 578: stab_to_arg(A_STAB,Nullstab), 579: Nullarg,0); } 580: | PRINT expr 581: { $$ = make_op($1,2,make_list($2), 582: stab_to_arg(A_STAB,Nullstab), 583: Nullarg,1); } 584: | PRINT WORD 585: { $$ = make_op($1,2, 586: stab_to_arg(A_STAB,defstab), 587: stab_to_arg(A_STAB,stabent($2,TRUE)), 588: Nullarg,1); } 589: | PRINT WORD expr 590: { $$ = make_op($1,2,make_list($3), 591: stab_to_arg(A_STAB,stabent($2,TRUE)), 592: Nullarg,1); } 593: ; 594: 595: %% /* PROGRAM */ 596: #include "perly.c"