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