Commit | Line | Data |
8d063cd8 |
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" |