Commit | Line | Data |
9ef589d8 |
1 | /* $RCSfile: perly.y,v $$Revision: 4.0.1.1 $$Date: 91/06/07 11:42:34 $ |
a687059c |
2 | * |
9ef589d8 |
3 | * Copyright (c) 1991, Larry Wall |
a687059c |
4 | * |
9ef589d8 |
5 | * You may distribute under the terms of either the GNU General Public |
6 | * License or the Artistic License, as specified in the README file. |
8d063cd8 |
7 | * |
fe14fcc3 |
8 | * $Log: perly.y,v $ |
9ef589d8 |
9 | * Revision 4.0.1.1 91/06/07 11:42:34 lwall |
10 | * patch4: new copyright notice |
11 | * |
fe14fcc3 |
12 | * Revision 4.0 91/03/20 01:38:40 lwall |
13 | * 4.0 baseline. |
8d063cd8 |
14 | * |
15 | */ |
16 | |
17 | %{ |
8d063cd8 |
18 | #include "INTERN.h" |
19 | #include "perl.h" |
378cc40b |
20 | |
378cc40b |
21 | STAB *scrstab; |
a687059c |
22 | ARG *arg4; /* rarely used arguments to make_op() */ |
23 | ARG *arg5; |
378cc40b |
24 | |
8d063cd8 |
25 | %} |
26 | |
27 | %start prog |
28 | |
29 | %union { |
30 | int ival; |
31 | char *cval; |
32 | ARG *arg; |
33 | CMD *cmdval; |
34 | struct compcmd compval; |
35 | STAB *stabval; |
36 | FCMD *formval; |
37 | } |
38 | |
39 | %token <cval> WORD |
450a55e4 |
40 | %token <ival> APPEND OPEN SSELECT LOOPEX |
378cc40b |
41 | %token <ival> USING FORMAT DO SHIFT PUSH POP LVALFUN |
a687059c |
42 | %token <ival> WHILE UNTIL IF UNLESS ELSE ELSIF CONTINUE SPLIT FLIST |
43 | %token <ival> FOR FILOP FILOP2 FILOP3 FILOP4 FILOP22 FILOP25 |
d9d8d8de |
44 | %token <ival> FUNC0 FUNC1 FUNC2 FUNC2x FUNC3 FUNC4 FUNC5 HSHFUN HSHFUN3 |
a687059c |
45 | %token <ival> FLIST2 SUB FILETEST LOCAL DELETE |
d9d8d8de |
46 | %token <ival> RELOP EQOP MULOP ADDOP PACKAGE AMPER |
8d063cd8 |
47 | %token <formval> FORMLIST |
a687059c |
48 | %token <stabval> REG ARYLEN ARY HSH STAR |
8d063cd8 |
49 | %token <arg> SUBST PATTERN |
50 | %token <arg> RSTRING TRANS |
51 | |
a687059c |
52 | %type <ival> prog decl format remember |
8d063cd8 |
53 | %type <cmdval> block lineseq line loop cond sideff nexpr else |
a687059c |
54 | %type <arg> expr sexpr cexpr csexpr term handle aryword hshword |
450a55e4 |
55 | %type <arg> texpr listop bareword |
8d063cd8 |
56 | %type <cval> label |
57 | %type <compval> compblock |
58 | |
378cc40b |
59 | %nonassoc <ival> LISTOP |
8d063cd8 |
60 | %left ',' |
8d063cd8 |
61 | %right '=' |
62 | %right '?' ':' |
63 | %nonassoc DOTDOT |
64 | %left OROR |
65 | %left ANDAND |
66 | %left '|' '^' |
67 | %left '&' |
a687059c |
68 | %nonassoc EQOP |
69 | %nonassoc RELOP |
378cc40b |
70 | %nonassoc <ival> UNIOP |
71 | %nonassoc FILETEST |
8d063cd8 |
72 | %left LS RS |
a687059c |
73 | %left ADDOP |
74 | %left MULOP |
8d063cd8 |
75 | %left MATCH NMATCH |
76 | %right '!' '~' UMINUS |
a687059c |
77 | %right POW |
8d063cd8 |
78 | %nonassoc INC DEC |
79 | %left '(' |
80 | |
81 | %% /* RULES */ |
82 | |
ae986130 |
83 | prog : /* NULL */ |
84 | { |
85 | #if defined(YYDEBUG) && defined(DEBUGGING) |
86 | yydebug = (debug & 1); |
87 | #endif |
88 | } |
89 | /*CONTINUED*/ lineseq |
a559c259 |
90 | { if (in_eval) |
ae986130 |
91 | eval_root = block_head($2); |
a559c259 |
92 | else |
ae986130 |
93 | main_root = block_head($2); } |
8d063cd8 |
94 | ; |
95 | |
96 | compblock: block CONTINUE block |
97 | { $$.comp_true = $1; $$.comp_alt = $3; } |
98 | | block else |
99 | { $$.comp_true = $1; $$.comp_alt = $2; } |
100 | ; |
101 | |
102 | else : /* NULL */ |
103 | { $$ = Nullcmd; } |
104 | | ELSE block |
105 | { $$ = $2; } |
106 | | ELSIF '(' expr ')' compblock |
378cc40b |
107 | { cmdline = $1; |
a687059c |
108 | $$ = make_ccmd(C_ELSIF,$3,$5); } |
8d063cd8 |
109 | ; |
110 | |
a687059c |
111 | block : '{' remember lineseq '}' |
112 | { $$ = block_head($3); |
113 | if (savestack->ary_fill > $2) |
114 | restorelist($2); } |
115 | ; |
116 | |
117 | remember: /* NULL */ /* in case they push a package name */ |
118 | { $$ = savestack->ary_fill; } |
8d063cd8 |
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) { |
378cc40b |
134 | $$ = add_label($1, make_acmd(C_EXPR, Nullstab, |
8d063cd8 |
135 | Nullarg, Nullarg) ); |
450a55e4 |
136 | } |
137 | else { |
138 | $$ = Nullcmd; |
139 | cmdline = NOLINE; |
140 | } } |
8d063cd8 |
141 | | label sideff ';' |
142 | { $$ = add_label($1,$2); } |
143 | ; |
144 | |
a687059c |
145 | sideff : error |
146 | { $$ = Nullcmd; } |
147 | | expr |
8d063cd8 |
148 | { $$ = make_acmd(C_EXPR, Nullstab, $1, Nullarg); } |
a687059c |
149 | | expr IF expr |
8d063cd8 |
150 | { $$ = addcond( |
a687059c |
151 | make_acmd(C_EXPR, Nullstab, Nullarg, $1), $3); } |
152 | | expr UNLESS expr |
153 | { $$ = addcond(invert( |
154 | make_acmd(C_EXPR, Nullstab, Nullarg, $1)), $3); } |
155 | | expr WHILE expr |
8d063cd8 |
156 | { $$ = addloop( |
a687059c |
157 | make_acmd(C_EXPR, Nullstab, Nullarg, $1), $3); } |
158 | | expr UNTIL expr |
159 | { $$ = addloop(invert( |
160 | make_acmd(C_EXPR, Nullstab, Nullarg, $1)), $3); } |
8d063cd8 |
161 | ; |
162 | |
163 | cond : IF '(' expr ')' compblock |
378cc40b |
164 | { cmdline = $1; |
a687059c |
165 | $$ = make_icmd(C_IF,$3,$5); } |
8d063cd8 |
166 | | UNLESS '(' expr ')' compblock |
378cc40b |
167 | { cmdline = $1; |
a687059c |
168 | $$ = invert(make_icmd(C_IF,$3,$5)); } |
8d063cd8 |
169 | | IF block compblock |
378cc40b |
170 | { cmdline = $1; |
171 | $$ = make_ccmd(C_IF,cmd_to_arg($2),$3); } |
8d063cd8 |
172 | | UNLESS block compblock |
378cc40b |
173 | { cmdline = $1; |
174 | $$ = invert(make_ccmd(C_IF,cmd_to_arg($2),$3)); } |
8d063cd8 |
175 | ; |
176 | |
177 | loop : label WHILE '(' texpr ')' compblock |
378cc40b |
178 | { cmdline = $2; |
179 | $$ = wopt(add_label($1, |
8d063cd8 |
180 | make_ccmd(C_WHILE,$4,$6) )); } |
181 | | label UNTIL '(' expr ')' compblock |
378cc40b |
182 | { cmdline = $2; |
183 | $$ = wopt(add_label($1, |
8d063cd8 |
184 | invert(make_ccmd(C_WHILE,$4,$6)) )); } |
185 | | label WHILE block compblock |
378cc40b |
186 | { cmdline = $2; |
187 | $$ = wopt(add_label($1, |
8d063cd8 |
188 | make_ccmd(C_WHILE, cmd_to_arg($3),$4) )); } |
189 | | label UNTIL block compblock |
378cc40b |
190 | { cmdline = $2; |
191 | $$ = wopt(add_label($1, |
8d063cd8 |
192 | invert(make_ccmd(C_WHILE, cmd_to_arg($3),$4)) )); } |
378cc40b |
193 | | label FOR REG '(' expr ')' compblock |
194 | { cmdline = $2; |
195 | /* |
196 | * The following gobbledygook catches EXPRs that |
197 | * aren't explicit array refs and translates |
198 | * foreach VAR (EXPR) { |
199 | * into |
200 | * @ary = EXPR; |
201 | * foreach VAR (@ary) { |
202 | * where @ary is a hidden array made by genstab(). |
a687059c |
203 | * (Note that @ary may become a local array if |
204 | * it is determined that it might be called |
205 | * recursively. See cmd_tosave().) |
378cc40b |
206 | */ |
207 | if ($5->arg_type != O_ARRAY) { |
208 | scrstab = aadd(genstab()); |
209 | $$ = append_line( |
210 | make_acmd(C_EXPR, Nullstab, |
211 | l(make_op(O_ASSIGN,2, |
212 | listish(make_op(O_ARRAY, 1, |
213 | stab2arg(A_STAB,scrstab), |
450a55e4 |
214 | Nullarg,Nullarg )), |
a687059c |
215 | listish(make_list($5)), |
216 | Nullarg)), |
378cc40b |
217 | Nullarg), |
218 | wopt(over($3,add_label($1, |
219 | make_ccmd(C_WHILE, |
220 | make_op(O_ARRAY, 1, |
221 | stab2arg(A_STAB,scrstab), |
a687059c |
222 | Nullarg,Nullarg ), |
378cc40b |
223 | $7))))); |
ac58e20f |
224 | $$->c_line = $2; |
225 | $$->c_head->c_line = $2; |
378cc40b |
226 | } |
227 | else { |
228 | $$ = wopt(over($3,add_label($1, |
229 | make_ccmd(C_WHILE,$5,$7) ))); |
230 | } |
231 | } |
232 | | label FOR '(' expr ')' compblock |
233 | { cmdline = $2; |
234 | if ($4->arg_type != O_ARRAY) { |
235 | scrstab = aadd(genstab()); |
236 | $$ = append_line( |
237 | make_acmd(C_EXPR, Nullstab, |
238 | l(make_op(O_ASSIGN,2, |
239 | listish(make_op(O_ARRAY, 1, |
240 | stab2arg(A_STAB,scrstab), |
450a55e4 |
241 | Nullarg,Nullarg )), |
a687059c |
242 | listish(make_list($4)), |
243 | Nullarg)), |
378cc40b |
244 | Nullarg), |
245 | wopt(over(defstab,add_label($1, |
246 | make_ccmd(C_WHILE, |
247 | make_op(O_ARRAY, 1, |
248 | stab2arg(A_STAB,scrstab), |
a687059c |
249 | Nullarg,Nullarg ), |
378cc40b |
250 | $6))))); |
ac58e20f |
251 | $$->c_line = $2; |
252 | $$->c_head->c_line = $2; |
378cc40b |
253 | } |
254 | else { /* lisp, anyone? */ |
255 | $$ = wopt(over(defstab,add_label($1, |
256 | make_ccmd(C_WHILE,$4,$6) ))); |
257 | } |
258 | } |
8d063cd8 |
259 | | label FOR '(' nexpr ';' texpr ';' nexpr ')' block |
260 | /* basically fake up an initialize-while lineseq */ |
261 | { yyval.compval.comp_true = $10; |
262 | yyval.compval.comp_alt = $8; |
378cc40b |
263 | cmdline = $2; |
8d063cd8 |
264 | $$ = append_line($4,wopt(add_label($1, |
265 | make_ccmd(C_WHILE,$6,yyval.compval) ))); } |
266 | | label compblock /* a block is a loop that happens once */ |
267 | { $$ = add_label($1,make_ccmd(C_BLOCK,Nullarg,$2)); } |
268 | ; |
269 | |
270 | nexpr : /* NULL */ |
271 | { $$ = Nullcmd; } |
272 | | sideff |
273 | ; |
274 | |
275 | texpr : /* NULL means true */ |
a687059c |
276 | { (void)scanstr("1"); $$ = yylval.arg; } |
8d063cd8 |
277 | | expr |
278 | ; |
279 | |
280 | label : /* empty */ |
281 | { $$ = Nullch; } |
282 | | WORD ':' |
283 | ; |
284 | |
8d063cd8 |
285 | decl : format |
286 | { $$ = 0; } |
287 | | subrout |
288 | { $$ = 0; } |
a687059c |
289 | | package |
290 | { $$ = 0; } |
8d063cd8 |
291 | ; |
292 | |
a687059c |
293 | format : FORMAT WORD '=' FORMLIST |
03a14243 |
294 | { if (strEQ($2,"stdout")) |
0f85fab0 |
295 | make_form(stabent("STDOUT",TRUE),$4); |
03a14243 |
296 | else if (strEQ($2,"stderr")) |
0f85fab0 |
297 | make_form(stabent("STDERR",TRUE),$4); |
03a14243 |
298 | else |
0f85fab0 |
299 | make_form(stabent($2,TRUE),$4); |
fe14fcc3 |
300 | Safefree($2); $2 = Nullch; } |
a687059c |
301 | | FORMAT '=' FORMLIST |
0f85fab0 |
302 | { make_form(stabent("STDOUT",TRUE),$3); } |
8d063cd8 |
303 | ; |
304 | |
305 | subrout : SUB WORD block |
378cc40b |
306 | { make_sub($2,$3); } |
8d063cd8 |
307 | ; |
308 | |
a687059c |
309 | package : PACKAGE WORD ';' |
310 | { char tmpbuf[256]; |
450a55e4 |
311 | STAB *tmpstab; |
a687059c |
312 | |
313 | savehptr(&curstash); |
314 | saveitem(curstname); |
315 | str_set(curstname,$2); |
316 | sprintf(tmpbuf,"'_%s",$2); |
c623bd54 |
317 | tmpstab = stabent(tmpbuf,TRUE); |
318 | if (!stab_xhash(tmpstab)) |
319 | stab_xhash(tmpstab) = hnew(0); |
450a55e4 |
320 | curstash = stab_xhash(tmpstab); |
d9d8d8de |
321 | if (!curstash->tbl_name) |
322 | curstash->tbl_name = savestr($2); |
a687059c |
323 | curstash->tbl_coeffsize = 0; |
fe14fcc3 |
324 | Safefree($2); $2 = Nullch; |
d9d8d8de |
325 | cmdline = NOLINE; |
a687059c |
326 | } |
327 | ; |
328 | |
329 | cexpr : ',' expr |
330 | { $$ = $2; } |
331 | ; |
332 | |
333 | expr : expr ',' sexpr |
334 | { $$ = make_op(O_COMMA, 2, $1, $3, Nullarg); } |
8d063cd8 |
335 | | sexpr |
336 | ; |
337 | |
a687059c |
338 | csexpr : ',' sexpr |
339 | { $$ = $2; } |
340 | ; |
341 | |
8d063cd8 |
342 | sexpr : sexpr '=' sexpr |
343 | { $1 = listish($1); |
a687059c |
344 | if ($1->arg_type == O_ASSIGN && $1->arg_len == 1) |
345 | $1->arg_type = O_ITEM; /* a local() */ |
8d063cd8 |
346 | if ($1->arg_type == O_LIST) |
347 | $3 = listish($3); |
a687059c |
348 | $$ = l(make_op(O_ASSIGN, 2, $1, $3, Nullarg)); } |
349 | | sexpr POW '=' sexpr |
350 | { $$ = l(make_op(O_POW, 2, $1, $4, Nullarg)); } |
351 | | sexpr MULOP '=' sexpr |
352 | { $$ = l(make_op($2, 2, $1, $4, Nullarg)); } |
353 | | sexpr ADDOP '=' sexpr |
354 | { $$ = rcatmaybe(l(make_op($2, 2, $1, $4, Nullarg)));} |
8d063cd8 |
355 | | sexpr LS '=' sexpr |
a687059c |
356 | { $$ = l(make_op(O_LEFT_SHIFT, 2, $1, $4, Nullarg)); } |
8d063cd8 |
357 | | sexpr RS '=' sexpr |
a687059c |
358 | { $$ = l(make_op(O_RIGHT_SHIFT, 2, $1, $4, Nullarg)); } |
8d063cd8 |
359 | | sexpr '&' '=' sexpr |
a687059c |
360 | { $$ = l(make_op(O_BIT_AND, 2, $1, $4, Nullarg)); } |
8d063cd8 |
361 | | sexpr '^' '=' sexpr |
a687059c |
362 | { $$ = l(make_op(O_XOR, 2, $1, $4, Nullarg)); } |
8d063cd8 |
363 | | sexpr '|' '=' sexpr |
a687059c |
364 | { $$ = l(make_op(O_BIT_OR, 2, $1, $4, Nullarg)); } |
365 | |
366 | |
367 | | sexpr POW sexpr |
368 | { $$ = make_op(O_POW, 2, $1, $3, Nullarg); } |
369 | | sexpr MULOP sexpr |
fe14fcc3 |
370 | { if ($2 == O_REPEAT) |
371 | $1 = listish($1); |
372 | $$ = make_op($2, 2, $1, $3, Nullarg); |
373 | if ($2 == O_REPEAT) { |
374 | if ($$[1].arg_type != A_EXPR || |
375 | $$[1].arg_ptr.arg_arg->arg_type != O_LIST) |
376 | $$[1].arg_flags &= ~AF_ARYOK; |
377 | } } |
a687059c |
378 | | sexpr ADDOP sexpr |
379 | { $$ = make_op($2, 2, $1, $3, Nullarg); } |
8d063cd8 |
380 | | sexpr LS sexpr |
a687059c |
381 | { $$ = make_op(O_LEFT_SHIFT, 2, $1, $3, Nullarg); } |
8d063cd8 |
382 | | sexpr RS sexpr |
a687059c |
383 | { $$ = make_op(O_RIGHT_SHIFT, 2, $1, $3, Nullarg); } |
384 | | sexpr RELOP sexpr |
385 | { $$ = make_op($2, 2, $1, $3, Nullarg); } |
386 | | sexpr EQOP sexpr |
387 | { $$ = make_op($2, 2, $1, $3, Nullarg); } |
8d063cd8 |
388 | | sexpr '&' sexpr |
a687059c |
389 | { $$ = make_op(O_BIT_AND, 2, $1, $3, Nullarg); } |
8d063cd8 |
390 | | sexpr '^' sexpr |
a687059c |
391 | { $$ = make_op(O_XOR, 2, $1, $3, Nullarg); } |
8d063cd8 |
392 | | sexpr '|' sexpr |
a687059c |
393 | { $$ = make_op(O_BIT_OR, 2, $1, $3, Nullarg); } |
8d063cd8 |
394 | | sexpr DOTDOT sexpr |
a687059c |
395 | { arg4 = Nullarg; |
396 | $$ = make_op(O_F_OR_R, 4, $1, $3, Nullarg); } |
8d063cd8 |
397 | | sexpr ANDAND sexpr |
a687059c |
398 | { $$ = make_op(O_AND, 2, $1, $3, Nullarg); } |
8d063cd8 |
399 | | sexpr OROR sexpr |
a687059c |
400 | { $$ = make_op(O_OR, 2, $1, $3, Nullarg); } |
8d063cd8 |
401 | | sexpr '?' sexpr ':' sexpr |
a687059c |
402 | { $$ = make_op(O_COND_EXPR, 3, $1, $3, $5); } |
8d063cd8 |
403 | | sexpr MATCH sexpr |
404 | { $$ = mod_match(O_MATCH, $1, $3); } |
405 | | sexpr NMATCH sexpr |
406 | { $$ = mod_match(O_NMATCH, $1, $3); } |
8d063cd8 |
407 | | term |
408 | { $$ = $1; } |
409 | ; |
410 | |
411 | term : '-' term %prec UMINUS |
a687059c |
412 | { $$ = make_op(O_NEGATE, 1, $2, Nullarg, Nullarg); } |
413 | | '+' term %prec UMINUS |
414 | { $$ = $2; } |
8d063cd8 |
415 | | '!' term |
a687059c |
416 | { $$ = make_op(O_NOT, 1, $2, Nullarg, Nullarg); } |
8d063cd8 |
417 | | '~' term |
a687059c |
418 | { $$ = make_op(O_COMPLEMENT, 1, $2, Nullarg, Nullarg);} |
ae986130 |
419 | | term INC |
420 | { $$ = addflags(1, AF_POST|AF_UP, |
421 | l(make_op(O_ITEM,1,$1,Nullarg,Nullarg))); } |
422 | | term DEC |
423 | { $$ = addflags(1, AF_POST, |
424 | l(make_op(O_ITEM,1,$1,Nullarg,Nullarg))); } |
425 | | INC term |
426 | { $$ = addflags(1, AF_PRE|AF_UP, |
427 | l(make_op(O_ITEM,1,$2,Nullarg,Nullarg))); } |
428 | | DEC term |
429 | { $$ = addflags(1, AF_PRE, |
430 | l(make_op(O_ITEM,1,$2,Nullarg,Nullarg))); } |
378cc40b |
431 | | FILETEST WORD |
432 | { opargs[$1] = 0; /* force it special */ |
433 | $$ = make_op($1, 1, |
434 | stab2arg(A_STAB,stabent($2,TRUE)), |
a687059c |
435 | Nullarg, Nullarg); |
378cc40b |
436 | } |
437 | | FILETEST sexpr |
438 | { opargs[$1] = 1; |
a687059c |
439 | $$ = make_op($1, 1, $2, Nullarg, Nullarg); } |
378cc40b |
440 | | FILETEST |
441 | { opargs[$1] = ($1 != O_FTTTY); |
442 | $$ = make_op($1, 1, |
443 | stab2arg(A_STAB, |
a687059c |
444 | $1 == O_FTTTY?stabent("STDIN",TRUE):defstab), |
445 | Nullarg, Nullarg); } |
378cc40b |
446 | | LOCAL '(' expr ')' |
ae986130 |
447 | { $$ = l(localize(make_op(O_ASSIGN, 1, |
a687059c |
448 | localize(listish(make_list($3))), |
ae986130 |
449 | Nullarg,Nullarg))); } |
79a0689e |
450 | | '(' expr ',' ')' |
fe14fcc3 |
451 | { $$ = make_list($2); } |
8d063cd8 |
452 | | '(' expr ')' |
fe14fcc3 |
453 | { $$ = make_list($2); } |
8d063cd8 |
454 | | '(' ')' |
455 | { $$ = make_list(Nullarg); } |
378cc40b |
456 | | DO sexpr %prec FILETEST |
d9d8d8de |
457 | { $$ = make_op(O_DOFILE,2,$2,Nullarg,Nullarg); |
a687059c |
458 | allstabs = TRUE;} |
8d063cd8 |
459 | | DO block %prec '(' |
460 | { $$ = cmd_to_arg($2); } |
461 | | REG %prec '(' |
378cc40b |
462 | { $$ = stab2arg(A_STAB,$1); } |
a687059c |
463 | | STAR %prec '(' |
464 | { $$ = stab2arg(A_STAR,$1); } |
8d063cd8 |
465 | | REG '[' expr ']' %prec '(' |
a687059c |
466 | { $$ = make_op(O_AELEM, 2, |
467 | stab2arg(A_STAB,aadd($1)), $3, Nullarg); } |
468 | | HSH %prec '(' |
469 | { $$ = make_op(O_HASH, 1, |
470 | stab2arg(A_STAB,$1), |
471 | Nullarg, Nullarg); } |
8d063cd8 |
472 | | ARY %prec '(' |
473 | { $$ = make_op(O_ARRAY, 1, |
378cc40b |
474 | stab2arg(A_STAB,$1), |
a687059c |
475 | Nullarg, Nullarg); } |
8d063cd8 |
476 | | REG '{' expr '}' %prec '(' |
a687059c |
477 | { $$ = make_op(O_HELEM, 2, |
478 | stab2arg(A_STAB,hadd($1)), |
479 | jmaybe($3), |
480 | Nullarg); } |
79a0689e |
481 | | '(' expr ')' '[' expr ']' %prec '(' |
482 | { $$ = make_op(O_LSLICE, 3, |
483 | Nullarg, |
484 | listish(make_list($5)), |
485 | listish(make_list($2))); } |
fe14fcc3 |
486 | | '(' ')' '[' expr ']' %prec '(' |
487 | { $$ = make_op(O_LSLICE, 3, |
488 | Nullarg, |
489 | listish(make_list($4)), |
490 | Nullarg); } |
a687059c |
491 | | ARY '[' expr ']' %prec '(' |
492 | { $$ = make_op(O_ASLICE, 2, |
493 | stab2arg(A_STAB,aadd($1)), |
494 | listish(make_list($3)), |
495 | Nullarg); } |
496 | | ARY '{' expr '}' %prec '(' |
497 | { $$ = make_op(O_HSLICE, 2, |
498 | stab2arg(A_STAB,hadd($1)), |
499 | listish(make_list($3)), |
500 | Nullarg); } |
378cc40b |
501 | | DELETE REG '{' expr '}' %prec '(' |
502 | { $$ = make_op(O_DELETE, 2, |
a687059c |
503 | stab2arg(A_STAB,hadd($2)), |
504 | jmaybe($4), |
505 | Nullarg); } |
8d063cd8 |
506 | | ARYLEN %prec '(' |
378cc40b |
507 | { $$ = stab2arg(A_ARYLEN,$1); } |
8d063cd8 |
508 | | RSTRING %prec '(' |
509 | { $$ = $1; } |
510 | | PATTERN %prec '(' |
511 | { $$ = $1; } |
512 | | SUBST %prec '(' |
513 | { $$ = $1; } |
514 | | TRANS %prec '(' |
515 | { $$ = $1; } |
516 | | DO WORD '(' expr ')' |
a687059c |
517 | { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, |
518 | stab2arg(A_WORD,stabent($2,TRUE)), |
8d063cd8 |
519 | make_list($4), |
fe14fcc3 |
520 | Nullarg); Safefree($2); $2 = Nullch; |
521 | $$->arg_flags |= AF_DEPR; } |
a687059c |
522 | | AMPER WORD '(' expr ')' |
523 | { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, |
378cc40b |
524 | stab2arg(A_WORD,stabent($2,TRUE)), |
a687059c |
525 | make_list($4), |
fe14fcc3 |
526 | Nullarg); Safefree($2); $2 = Nullch; } |
8d063cd8 |
527 | | DO WORD '(' ')' |
a687059c |
528 | { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, |
529 | stab2arg(A_WORD,stabent($2,TRUE)), |
8d063cd8 |
530 | make_list(Nullarg), |
fe14fcc3 |
531 | Nullarg); |
532 | $$->arg_flags |= AF_DEPR; } |
a687059c |
533 | | AMPER WORD '(' ')' |
534 | { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, |
378cc40b |
535 | stab2arg(A_WORD,stabent($2,TRUE)), |
a687059c |
536 | make_list(Nullarg), |
537 | Nullarg); } |
538 | | AMPER WORD |
539 | { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, |
540 | stab2arg(A_WORD,stabent($2,TRUE)), |
541 | Nullarg, |
542 | Nullarg); } |
378cc40b |
543 | | DO REG '(' expr ')' |
a687059c |
544 | { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, |
545 | stab2arg(A_STAB,$2), |
378cc40b |
546 | make_list($4), |
fe14fcc3 |
547 | Nullarg); |
548 | $$->arg_flags |= AF_DEPR; } |
a687059c |
549 | | AMPER REG '(' expr ')' |
550 | { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, |
378cc40b |
551 | stab2arg(A_STAB,$2), |
a687059c |
552 | make_list($4), |
553 | Nullarg); } |
378cc40b |
554 | | DO REG '(' ')' |
a687059c |
555 | { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, |
556 | stab2arg(A_STAB,$2), |
378cc40b |
557 | make_list(Nullarg), |
fe14fcc3 |
558 | Nullarg); |
559 | $$->arg_flags |= AF_DEPR; } |
a687059c |
560 | | AMPER REG '(' ')' |
561 | { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, |
378cc40b |
562 | stab2arg(A_STAB,$2), |
a687059c |
563 | make_list(Nullarg), |
564 | Nullarg); } |
565 | | AMPER REG |
566 | { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, |
567 | stab2arg(A_STAB,$2), |
568 | Nullarg, |
569 | Nullarg); } |
8d063cd8 |
570 | | LOOPEX |
a687059c |
571 | { $$ = make_op($1,0,Nullarg,Nullarg,Nullarg); } |
8d063cd8 |
572 | | LOOPEX WORD |
573 | { $$ = make_op($1,1,cval_to_arg($2), |
a687059c |
574 | Nullarg,Nullarg); } |
8d063cd8 |
575 | | UNIOP |
d9d8d8de |
576 | { $$ = make_op($1,0,Nullarg,Nullarg,Nullarg); } |
8d063cd8 |
577 | | UNIOP sexpr |
d9d8d8de |
578 | { $$ = make_op($1,1,$2,Nullarg,Nullarg); } |
450a55e4 |
579 | | SSELECT |
a687059c |
580 | { $$ = make_op(O_SELECT, 0, Nullarg, Nullarg, Nullarg);} |
450a55e4 |
581 | | SSELECT '(' handle ')' |
a687059c |
582 | { $$ = make_op(O_SELECT, 1, $3, Nullarg, Nullarg); } |
450a55e4 |
583 | | SSELECT '(' sexpr csexpr csexpr csexpr ')' |
a687059c |
584 | { arg4 = $6; |
585 | $$ = make_op(O_SSELECT, 4, $3, $4, $5); } |
8d063cd8 |
586 | | OPEN WORD %prec '(' |
587 | { $$ = make_op(O_OPEN, 2, |
378cc40b |
588 | stab2arg(A_WORD,stabent($2,TRUE)), |
589 | stab2arg(A_STAB,stabent($2,TRUE)), |
a687059c |
590 | Nullarg); } |
8d063cd8 |
591 | | OPEN '(' WORD ')' |
592 | { $$ = make_op(O_OPEN, 2, |
378cc40b |
593 | stab2arg(A_WORD,stabent($3,TRUE)), |
594 | stab2arg(A_STAB,stabent($3,TRUE)), |
a687059c |
595 | Nullarg); } |
596 | | OPEN '(' handle cexpr ')' |
378cc40b |
597 | { $$ = make_op(O_OPEN, 2, |
598 | $3, |
a687059c |
599 | $4, Nullarg); } |
600 | | FILOP '(' handle ')' |
601 | { $$ = make_op($1, 1, |
378cc40b |
602 | $3, |
a687059c |
603 | Nullarg, Nullarg); } |
604 | | FILOP WORD |
605 | { $$ = make_op($1, 1, |
378cc40b |
606 | stab2arg(A_WORD,stabent($2,TRUE)), |
a687059c |
607 | Nullarg, Nullarg); |
fe14fcc3 |
608 | Safefree($2); $2 = Nullch; } |
a687059c |
609 | | FILOP REG |
610 | { $$ = make_op($1, 1, |
611 | stab2arg(A_STAB,$2), |
612 | Nullarg, Nullarg); } |
613 | | FILOP '(' ')' |
614 | { $$ = make_op($1, 1, |
378cc40b |
615 | stab2arg(A_WORD,Nullstab), |
a687059c |
616 | Nullarg, Nullarg); } |
617 | | FILOP %prec '(' |
618 | { $$ = make_op($1, 0, |
619 | Nullarg, Nullarg, Nullarg); } |
620 | | FILOP2 '(' handle cexpr ')' |
621 | { $$ = make_op($1, 2, $3, $4, Nullarg); } |
622 | | FILOP3 '(' handle csexpr cexpr ')' |
663a0e37 |
623 | { $$ = make_op($1, 3, $3, $4, make_list($5)); } |
a687059c |
624 | | FILOP22 '(' handle ',' handle ')' |
625 | { $$ = make_op($1, 2, $3, $5, Nullarg); } |
626 | | FILOP4 '(' handle csexpr csexpr cexpr ')' |
627 | { arg4 = $6; $$ = make_op($1, 4, $3, $4, $5); } |
628 | | FILOP25 '(' handle ',' handle csexpr csexpr cexpr ')' |
629 | { arg4 = $7; arg5 = $8; |
630 | $$ = make_op($1, 5, $3, $5, $6); } |
631 | | PUSH '(' aryword cexpr ')' |
8d063cd8 |
632 | { $$ = make_op($1, 2, |
a687059c |
633 | $3, |
634 | make_list($4), |
635 | Nullarg); } |
636 | | POP aryword %prec '(' |
637 | { $$ = make_op(O_POP, 1, $2, Nullarg, Nullarg); } |
638 | | POP '(' aryword ')' |
639 | { $$ = make_op(O_POP, 1, $3, Nullarg, Nullarg); } |
640 | | SHIFT aryword %prec '(' |
641 | { $$ = make_op(O_SHIFT, 1, $2, Nullarg, Nullarg); } |
642 | | SHIFT '(' aryword ')' |
643 | { $$ = make_op(O_SHIFT, 1, $3, Nullarg, Nullarg); } |
8d063cd8 |
644 | | SHIFT %prec '(' |
645 | { $$ = make_op(O_SHIFT, 1, |
a687059c |
646 | stab2arg(A_STAB, |
647 | aadd(stabent(subline ? "_" : "ARGV", TRUE))), |
648 | Nullarg, Nullarg); } |
8d063cd8 |
649 | | SPLIT %prec '(' |
c623bd54 |
650 | { static char p[]="/\\s+/"; |
651 | char *oldend = bufend; |
27e2fb84 |
652 | ARG *oldarg = yylval.arg; |
c623bd54 |
653 | |
654 | bufend=p+5; |
655 | (void)scanpat(p); |
656 | bufend=oldend; |
657 | $$ = make_split(defstab,yylval.arg,Nullarg); |
658 | yylval.arg = oldarg; } |
a687059c |
659 | | SPLIT '(' sexpr csexpr csexpr ')' |
660 | { $$ = mod_match(O_MATCH, $4, |
661 | make_split(defstab,$3,$5));} |
662 | | SPLIT '(' sexpr csexpr ')' |
663 | { $$ = mod_match(O_MATCH, $4, |
664 | make_split(defstab,$3,Nullarg) ); } |
8d063cd8 |
665 | | SPLIT '(' sexpr ')' |
666 | { $$ = mod_match(O_MATCH, |
378cc40b |
667 | stab2arg(A_STAB,defstab), |
a687059c |
668 | make_split(defstab,$3,Nullarg) ); } |
669 | | FLIST2 '(' sexpr cexpr ')' |
670 | { $$ = make_op($1, 2, |
8d063cd8 |
671 | $3, |
a687059c |
672 | listish(make_list($4)), |
673 | Nullarg); } |
674 | | FLIST '(' expr ')' |
675 | { $$ = make_op($1, 1, |
8d063cd8 |
676 | make_list($3), |
677 | Nullarg, |
a687059c |
678 | Nullarg); } |
679 | | LVALFUN sexpr %prec '(' |
680 | { $$ = l(make_op($1, 1, fixl($1,$2), |
681 | Nullarg, Nullarg)); } |
378cc40b |
682 | | LVALFUN |
683 | { $$ = l(make_op($1, 1, |
684 | stab2arg(A_STAB,defstab), |
a687059c |
685 | Nullarg, Nullarg)); } |
8d063cd8 |
686 | | FUNC0 |
a687059c |
687 | { $$ = make_op($1, 0, Nullarg, Nullarg, Nullarg); } |
ae986130 |
688 | | FUNC0 '(' ')' |
689 | { $$ = make_op($1, 0, Nullarg, Nullarg, Nullarg); } |
03a14243 |
690 | | FUNC1 '(' ')' |
d9d8d8de |
691 | { $$ = make_op($1, 0, Nullarg, Nullarg, Nullarg); } |
8d063cd8 |
692 | | FUNC1 '(' expr ')' |
d9d8d8de |
693 | { $$ = make_op($1, 1, $3, Nullarg, Nullarg); } |
a687059c |
694 | | FUNC2 '(' sexpr cexpr ')' |
695 | { $$ = make_op($1, 2, $3, $4, Nullarg); |
378cc40b |
696 | if ($1 == O_INDEX && $$[2].arg_type == A_SINGLE) |
a687059c |
697 | fbmcompile($$[2].arg_ptr.arg_str,0); } |
d9d8d8de |
698 | | FUNC2x '(' sexpr csexpr ')' |
699 | { $$ = make_op($1, 2, $3, $4, Nullarg); |
700 | if ($1 == O_INDEX && $$[2].arg_type == A_SINGLE) |
701 | fbmcompile($$[2].arg_ptr.arg_str,0); } |
702 | | FUNC2x '(' sexpr csexpr cexpr ')' |
703 | { $$ = make_op($1, 3, $3, $4, $5); |
704 | if ($1 == O_INDEX && $$[2].arg_type == A_SINGLE) |
705 | fbmcompile($$[2].arg_ptr.arg_str,0); } |
a687059c |
706 | | FUNC3 '(' sexpr csexpr cexpr ')' |
707 | { $$ = make_op($1, 3, $3, $4, $5); } |
d9d8d8de |
708 | | FUNC4 '(' sexpr csexpr csexpr cexpr ')' |
709 | { arg4 = $6; |
710 | $$ = make_op($1, 4, $3, $4, $5); } |
711 | | FUNC5 '(' sexpr csexpr csexpr csexpr cexpr ')' |
712 | { arg4 = $6; arg5 = $7; |
713 | $$ = make_op($1, 5, $3, $4, $5); } |
a687059c |
714 | | HSHFUN '(' hshword ')' |
715 | { $$ = make_op($1, 1, |
716 | $3, |
717 | Nullarg, |
718 | Nullarg); } |
719 | | HSHFUN hshword |
8d063cd8 |
720 | { $$ = make_op($1, 1, |
a687059c |
721 | $2, |
8d063cd8 |
722 | Nullarg, |
a687059c |
723 | Nullarg); } |
724 | | HSHFUN3 '(' hshword csexpr cexpr ')' |
725 | { $$ = make_op($1, 3, $3, $4, $5); } |
450a55e4 |
726 | | bareword |
378cc40b |
727 | | listop |
8d063cd8 |
728 | ; |
729 | |
378cc40b |
730 | listop : LISTOP |
8d063cd8 |
731 | { $$ = make_op($1,2, |
378cc40b |
732 | stab2arg(A_WORD,Nullstab), |
a687059c |
733 | stab2arg(A_STAB,defstab), |
734 | Nullarg); } |
378cc40b |
735 | | LISTOP expr |
a687059c |
736 | { $$ = make_op($1,2, |
378cc40b |
737 | stab2arg(A_WORD,Nullstab), |
a687059c |
738 | maybelistish($1,make_list($2)), |
739 | Nullarg); } |
378cc40b |
740 | | LISTOP WORD |
8d063cd8 |
741 | { $$ = make_op($1,2, |
378cc40b |
742 | stab2arg(A_WORD,stabent($2,TRUE)), |
a687059c |
743 | stab2arg(A_STAB,defstab), |
744 | Nullarg); } |
378cc40b |
745 | | LISTOP WORD expr |
a687059c |
746 | { $$ = make_op($1,2, |
378cc40b |
747 | stab2arg(A_WORD,stabent($2,TRUE)), |
a687059c |
748 | maybelistish($1,make_list($3)), |
fe14fcc3 |
749 | Nullarg); Safefree($2); $2 = Nullch; } |
378cc40b |
750 | | LISTOP REG expr |
a687059c |
751 | { $$ = make_op($1,2, |
378cc40b |
752 | stab2arg(A_STAB,$2), |
a687059c |
753 | maybelistish($1,make_list($3)), |
754 | Nullarg); } |
755 | ; |
756 | |
757 | handle : WORD |
fe14fcc3 |
758 | { $$ = stab2arg(A_WORD,stabent($1,TRUE)); |
759 | Safefree($1); $1 = Nullch;} |
a687059c |
760 | | sexpr |
761 | ; |
762 | |
763 | aryword : WORD |
764 | { $$ = stab2arg(A_WORD,aadd(stabent($1,TRUE))); |
fe14fcc3 |
765 | Safefree($1); $1 = Nullch; } |
a687059c |
766 | | ARY |
767 | { $$ = stab2arg(A_STAB,$1); } |
768 | ; |
769 | |
770 | hshword : WORD |
771 | { $$ = stab2arg(A_WORD,hadd(stabent($1,TRUE))); |
fe14fcc3 |
772 | Safefree($1); $1 = Nullch; } |
a687059c |
773 | | HSH |
774 | { $$ = stab2arg(A_STAB,$1); } |
8d063cd8 |
775 | ; |
776 | |
450a55e4 |
777 | /* |
778 | * NOTE: The following entry must stay at the end of the file so that |
779 | * reduce/reduce conflicts resolve to it only if it's the only option. |
780 | */ |
781 | |
782 | bareword: WORD |
6eb13c3b |
783 | { char *s; |
450a55e4 |
784 | $$ = op_new(1); |
785 | $$->arg_type = O_ITEM; |
786 | $$[1].arg_type = A_SINGLE; |
787 | $$[1].arg_ptr.arg_str = str_make($1,0); |
6eb13c3b |
788 | for (s = $1; *s && islower(*s); s++) ; |
450a55e4 |
789 | if (dowarn && !*s) |
6eb13c3b |
790 | warn( |
791 | "\"%s\" may clash with future reserved word", |
792 | $1 ); |
450a55e4 |
793 | } |
9ef589d8 |
794 | ; |
8d063cd8 |
795 | %% /* PROGRAM */ |