1 /* $RCSfile: perly.y,v $$Revision: 4.0.1.4 $$Date: 92/06/08 17:33:25 $
3 * Copyright (c) 1991, Larry Wall
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.
9 * Revision 4.0.1.4 92/06/08 17:33:25 lwall
10 * patch20: one of the backdoors to expectterm was on the wrong reduction
12 * Revision 4.0.1.3 92/06/08 15:18:16 lwall
13 * patch20: an expression may now start with a bareword
14 * patch20: relaxed requirement for semicolon at the end of a block
15 * patch20: added ... as variant on ..
16 * patch20: fixed double debug break in foreach with implicit array assignment
17 * patch20: if {block} {block} didn't work any more
18 * patch20: deleted some minor memory leaks
20 * Revision 4.0.1.2 91/11/05 18:17:38 lwall
21 * patch11: extra comma at end of list is now allowed in more places (Hi, Felix!)
22 * patch11: once-thru blocks didn't display right in the debugger
23 * patch11: debugger got confused over nested subroutine definitions
25 * Revision 4.0.1.1 91/06/07 11:42:34 lwall
26 * patch4: new copyright notice
28 * Revision 4.0 91/03/20 01:38:40 lwall
42 ARG *arg4; /* rarely used arguments to make_op() */
54 struct compcmd compval;
61 %token <cval> WORD LABEL
62 %token <ival> APPEND OPEN SSELECT LOOPEX DOTDOT
63 %token <ival> USING FORMAT DO SHIFT PUSH POP LVALFUN
64 %token <ival> WHILE UNTIL IF UNLESS ELSE ELSIF CONTINUE SPLIT FLIST
65 %token <ival> FOR FILOP FILOP2 FILOP3 FILOP4 FILOP22 FILOP25
66 %token <ival> FUNC0 FUNC1 FUNC2 FUNC2x FUNC3 FUNC4 FUNC5 HSHFUN HSHFUN3
67 %token <ival> FLIST2 SUB FILETEST LOCAL DELETE
68 %token <ival> RELOP EQOP MULOP ADDOP PACKAGE AMPER
69 %token <formval> FORMLIST
70 %token <stabval> REG ARYLEN ARY HSH STAR
71 %token <arg> SUBST PATTERN
72 %token <arg> RSTRING TRANS
74 %type <ival> prog decl format remember crp
75 %type <cmdval> block lineseq line loop cond sideff nexpr else
76 %type <arg> expr sexpr cexpr csexpr term handle aryword hshword
77 %type <arg> texpr listop bareword
79 %type <compval> compblock
81 %nonassoc <ival> LISTOP
92 %nonassoc <ival> UNIOP
107 #if defined(YYDEBUG) && defined(DEBUGGING)
108 yydebug = (debug & 1);
112 /*CONTINUED*/ lineseq
114 eval_root = block_head($2);
116 main_root = block_head($2); }
119 compblock: block CONTINUE block
120 { $$.comp_true = $1; $$.comp_alt = $3; }
122 { $$.comp_true = $1; $$.comp_alt = $2; }
129 | ELSIF '(' expr ')' compblock
131 $$ = make_ccmd(C_ELSIF,1,$3,$5); }
134 block : '{' remember lineseq '}'
135 { $$ = block_head($3);
136 if (cmdline > (line_t)$1)
138 if (savestack->ary_fill > $2)
143 remember: /* NULL */ /* in case they push a package name */
144 { $$ = savestack->ary_fill; }
150 { $$ = append_line($1,$2); }
156 { $$ = add_label($1,$2); }
157 | loop /* loops add their own labels */
159 { if ($1 != Nullch) {
160 $$ = add_label($1, make_acmd(C_EXPR, Nullstab,
169 { $$ = add_label($1,$2);
176 { $$ = make_acmd(C_EXPR, Nullstab, $1, Nullarg); }
179 make_acmd(C_EXPR, Nullstab, Nullarg, $1), $3); }
181 { $$ = addcond(invert(
182 make_acmd(C_EXPR, Nullstab, Nullarg, $1)), $3); }
185 make_acmd(C_EXPR, Nullstab, Nullarg, $1), $3); }
187 { $$ = addloop(invert(
188 make_acmd(C_EXPR, Nullstab, Nullarg, $1)), $3); }
191 cond : IF '(' expr ')' compblock
193 $$ = make_icmd(C_IF,$3,$5); }
194 | UNLESS '(' expr ')' compblock
196 $$ = invert(make_icmd(C_IF,$3,$5)); }
199 $$ = make_icmd(C_IF,cmd_to_arg($2),$3); }
200 | UNLESS block compblock
202 $$ = invert(make_icmd(C_IF,cmd_to_arg($2),$3)); }
205 loop : label WHILE '(' texpr ')' compblock
207 $$ = wopt(add_label($1,
208 make_ccmd(C_WHILE,1,$4,$6) )); }
209 | label UNTIL '(' expr ')' compblock
211 $$ = wopt(add_label($1,
212 invert(make_ccmd(C_WHILE,1,$4,$6)) )); }
213 | label WHILE block compblock
215 $$ = wopt(add_label($1,
216 make_ccmd(C_WHILE, 1, cmd_to_arg($3),$4) )); }
217 | label UNTIL block compblock
219 $$ = wopt(add_label($1,
220 invert(make_ccmd(C_WHILE,1,cmd_to_arg($3),$4)) )); }
221 | label FOR REG '(' expr crp compblock
224 * The following gobbledygook catches EXPRs that
225 * aren't explicit array refs and translates
226 * foreach VAR (EXPR) {
229 * foreach VAR (@ary) {
230 * where @ary is a hidden array made by genstab().
231 * (Note that @ary may become a local array if
232 * it is determined that it might be called
233 * recursively. See cmd_tosave().)
235 if ($5->arg_type != O_ARRAY) {
236 scrstab = aadd(genstab());
238 make_acmd(C_EXPR, Nullstab,
239 l(make_op(O_ASSIGN,2,
240 listish(make_op(O_ARRAY, 1,
241 stab2arg(A_STAB,scrstab),
243 listish(make_list($5)),
246 wopt(over($3,add_label($1,
247 make_ccmd(C_WHILE, 0,
249 stab2arg(A_STAB,scrstab),
253 $$->c_head->c_line = $2;
256 $$ = wopt(over($3,add_label($1,
257 make_ccmd(C_WHILE,1,$5,$7) )));
260 | label FOR '(' expr crp compblock
262 if ($4->arg_type != O_ARRAY) {
263 scrstab = aadd(genstab());
265 make_acmd(C_EXPR, Nullstab,
266 l(make_op(O_ASSIGN,2,
267 listish(make_op(O_ARRAY, 1,
268 stab2arg(A_STAB,scrstab),
270 listish(make_list($4)),
273 wopt(over(defstab,add_label($1,
274 make_ccmd(C_WHILE, 0,
276 stab2arg(A_STAB,scrstab),
280 $$->c_head->c_line = $2;
282 else { /* lisp, anyone? */
283 $$ = wopt(over(defstab,add_label($1,
284 make_ccmd(C_WHILE,1,$4,$6) )));
287 | label FOR '(' nexpr ';' texpr ';' nexpr ')' block
288 /* basically fake up an initialize-while lineseq */
289 { yyval.compval.comp_true = $10;
290 yyval.compval.comp_alt = $8;
292 $$ = append_line($4,wopt(add_label($1,
293 make_ccmd(C_WHILE,1,$6,yyval.compval) ))); }
294 | label compblock /* a block is a loop that happens once */
295 { $$ = add_label($1,make_ccmd(C_BLOCK,1,Nullarg,$2)); }
303 texpr : /* NULL means true */
304 { (void)scanstr("1",SCAN_DEF); $$ = yylval.arg; }
321 format : FORMAT WORD '=' FORMLIST
322 { if (strEQ($2,"stdout"))
323 make_form(stabent("STDOUT",TRUE),$4);
324 else if (strEQ($2,"stderr"))
325 make_form(stabent("STDERR",TRUE),$4);
327 make_form(stabent($2,TRUE),$4);
328 Safefree($2); $2 = Nullch; }
329 | FORMAT '=' FORMLIST
330 { make_form(stabent("STDOUT",TRUE),$3); }
333 subrout : SUB WORD block
336 if (savestack->ary_fill > $1)
340 package : PACKAGE WORD ';'
346 str_set(curstname,$2);
347 sprintf(tmpbuf,"'_%s",$2);
348 tmpstab = stabent(tmpbuf,TRUE);
349 if (!stab_xhash(tmpstab))
350 stab_xhash(tmpstab) = hnew(0);
351 curstash = stab_xhash(tmpstab);
352 if (!curstash->tbl_name)
353 curstash->tbl_name = savestr($2);
354 curstash->tbl_coeffsize = 0;
355 Safefree($2); $2 = Nullch;
365 expr : expr ',' sexpr
366 { $$ = make_op(O_COMMA, 2, $1, $3, Nullarg); }
374 sexpr : sexpr '=' sexpr
376 if ($1->arg_type == O_ASSIGN && $1->arg_len == 1)
377 $1->arg_type = O_ITEM; /* a local() */
378 if ($1->arg_type == O_LIST)
380 $$ = l(make_op(O_ASSIGN, 2, $1, $3, Nullarg)); }
381 | sexpr POW '=' sexpr
382 { $$ = l(make_op(O_POW, 2, $1, $4, Nullarg)); }
383 | sexpr MULOP '=' sexpr
384 { $$ = l(make_op($2, 2, $1, $4, Nullarg)); }
385 | sexpr ADDOP '=' sexpr
386 { $$ = rcatmaybe(l(make_op($2, 2, $1, $4, Nullarg)));}
388 { $$ = l(make_op(O_LEFT_SHIFT, 2, $1, $4, Nullarg)); }
390 { $$ = l(make_op(O_RIGHT_SHIFT, 2, $1, $4, Nullarg)); }
391 | sexpr '&' '=' sexpr
392 { $$ = l(make_op(O_BIT_AND, 2, $1, $4, Nullarg)); }
393 | sexpr '^' '=' sexpr
394 { $$ = l(make_op(O_XOR, 2, $1, $4, Nullarg)); }
395 | sexpr '|' '=' sexpr
396 { $$ = l(make_op(O_BIT_OR, 2, $1, $4, Nullarg)); }
400 { $$ = make_op(O_POW, 2, $1, $3, Nullarg); }
402 { if ($2 == O_REPEAT)
404 $$ = make_op($2, 2, $1, $3, Nullarg);
405 if ($2 == O_REPEAT) {
406 if ($$[1].arg_type != A_EXPR ||
407 $$[1].arg_ptr.arg_arg->arg_type != O_LIST)
408 $$[1].arg_flags &= ~AF_ARYOK;
411 { $$ = make_op($2, 2, $1, $3, Nullarg); }
413 { $$ = make_op(O_LEFT_SHIFT, 2, $1, $3, Nullarg); }
415 { $$ = make_op(O_RIGHT_SHIFT, 2, $1, $3, Nullarg); }
417 { $$ = make_op($2, 2, $1, $3, Nullarg); }
419 { $$ = make_op($2, 2, $1, $3, Nullarg); }
421 { $$ = make_op(O_BIT_AND, 2, $1, $3, Nullarg); }
423 { $$ = make_op(O_XOR, 2, $1, $3, Nullarg); }
425 { $$ = make_op(O_BIT_OR, 2, $1, $3, Nullarg); }
428 $$ = make_op(O_F_OR_R, 4, $1, $3, Nullarg);
429 $$[0].arg_flags |= $2; }
431 { $$ = make_op(O_AND, 2, $1, $3, Nullarg); }
433 { $$ = make_op(O_OR, 2, $1, $3, Nullarg); }
434 | sexpr '?' sexpr ':' sexpr
435 { $$ = make_op(O_COND_EXPR, 3, $1, $3, $5); }
437 { $$ = mod_match(O_MATCH, $1, $3); }
439 { $$ = mod_match(O_NMATCH, $1, $3); }
444 term : '-' term %prec UMINUS
445 { $$ = make_op(O_NEGATE, 1, $2, Nullarg, Nullarg); }
446 | '+' term %prec UMINUS
449 { $$ = make_op(O_NOT, 1, $2, Nullarg, Nullarg); }
451 { $$ = make_op(O_COMPLEMENT, 1, $2, Nullarg, Nullarg);}
453 { $$ = addflags(1, AF_POST|AF_UP,
454 l(make_op(O_ITEM,1,$1,Nullarg,Nullarg))); }
456 { $$ = addflags(1, AF_POST,
457 l(make_op(O_ITEM,1,$1,Nullarg,Nullarg))); }
459 { $$ = addflags(1, AF_PRE|AF_UP,
460 l(make_op(O_ITEM,1,$2,Nullarg,Nullarg))); }
462 { $$ = addflags(1, AF_PRE,
463 l(make_op(O_ITEM,1,$2,Nullarg,Nullarg))); }
465 { opargs[$1] = 0; /* force it special */
467 stab2arg(A_STAB,stabent($2,TRUE)),
469 Safefree($2); $2 = Nullch;
473 $$ = make_op($1, 1, $2, Nullarg, Nullarg); }
475 { opargs[$1] = ($1 != O_FTTTY);
478 $1 == O_FTTTY?stabent("STDIN",TRUE):defstab),
481 { $$ = l(localize(make_op(O_ASSIGN, 1,
482 localize(listish(make_list($3))),
483 Nullarg,Nullarg))); }
485 { $$ = make_list($2); }
487 { $$ = make_list(Nullarg); }
488 | DO sexpr %prec FILETEST
489 { $$ = make_op(O_DOFILE,2,$2,Nullarg,Nullarg);
492 { $$ = cmd_to_arg($2); }
494 { $$ = stab2arg(A_STAB,$1); }
496 { $$ = stab2arg(A_STAR,$1); }
497 | REG '[' expr ']' %prec '('
498 { $$ = make_op(O_AELEM, 2,
499 stab2arg(A_STAB,aadd($1)), $3, Nullarg); }
501 { $$ = make_op(O_HASH, 1,
505 { $$ = make_op(O_ARRAY, 1,
508 | REG '{' expr ';' '}' %prec '('
509 { $$ = make_op(O_HELEM, 2,
510 stab2arg(A_STAB,hadd($1)),
513 expectterm = FALSE; }
514 | '(' expr crp '[' expr ']' %prec '('
515 { $$ = make_op(O_LSLICE, 3,
517 listish(make_list($5)),
518 listish(make_list($2))); }
519 | '(' ')' '[' expr ']' %prec '('
520 { $$ = make_op(O_LSLICE, 3,
522 listish(make_list($4)),
524 | ARY '[' expr ']' %prec '('
525 { $$ = make_op(O_ASLICE, 2,
526 stab2arg(A_STAB,aadd($1)),
527 listish(make_list($3)),
529 | ARY '{' expr ';' '}' %prec '('
530 { $$ = make_op(O_HSLICE, 2,
531 stab2arg(A_STAB,hadd($1)),
532 listish(make_list($3)),
534 expectterm = FALSE; }
535 | DELETE REG '{' expr ';' '}' %prec '('
536 { $$ = make_op(O_DELETE, 2,
537 stab2arg(A_STAB,hadd($2)),
540 expectterm = FALSE; }
541 | DELETE '(' REG '{' expr ';' '}' ')' %prec '('
542 { $$ = make_op(O_DELETE, 2,
543 stab2arg(A_STAB,hadd($3)),
546 expectterm = FALSE; }
548 { $$ = stab2arg(A_ARYLEN,$1); }
557 | DO WORD '(' expr crp
558 { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
559 stab2arg(A_WORD,stabent($2,MULTI)),
561 Nullarg); Safefree($2); $2 = Nullch;
562 $$->arg_flags |= AF_DEPR; }
563 | AMPER WORD '(' expr crp
564 { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
565 stab2arg(A_WORD,stabent($2,MULTI)),
567 Nullarg); Safefree($2); $2 = Nullch; }
569 { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
570 stab2arg(A_WORD,stabent($2,MULTI)),
573 Safefree($2); $2 = Nullch;
574 $$->arg_flags |= AF_DEPR; }
576 { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
577 stab2arg(A_WORD,stabent($2,MULTI)),
580 Safefree($2); $2 = Nullch;
583 { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
584 stab2arg(A_WORD,stabent($2,MULTI)),
587 Safefree($2); $2 = Nullch;
589 | DO REG '(' expr crp
590 { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
594 $$->arg_flags |= AF_DEPR; }
595 | AMPER REG '(' expr crp
596 { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
601 { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
605 $$->arg_flags |= AF_DEPR; }
607 { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
612 { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
617 { $$ = make_op($1,0,Nullarg,Nullarg,Nullarg); }
619 { $$ = make_op($1,1,cval_to_arg($2),
622 { $$ = make_op($1,0,Nullarg,Nullarg,Nullarg); }
624 { $$ = make_op($1,1,cmd_to_arg($2),Nullarg,Nullarg); }
626 { $$ = make_op($1,1,$2,Nullarg,Nullarg); }
628 { $$ = make_op(O_SELECT, 0, Nullarg, Nullarg, Nullarg);}
630 { $$ = make_op(O_SELECT, 1,
631 stab2arg(A_WORD,stabent($2,TRUE)),
634 Safefree($2); $2 = Nullch; }
635 | SSELECT '(' handle ')'
636 { $$ = make_op(O_SELECT, 1, $3, Nullarg, Nullarg); }
637 | SSELECT '(' sexpr csexpr csexpr csexpr ')'
639 $$ = make_op(O_SSELECT, 4, $3, $4, $5); }
640 | OPEN WORD %prec '('
641 { $$ = make_op(O_OPEN, 2,
642 stab2arg(A_WORD,stabent($2,TRUE)),
643 stab2arg(A_STAB,stabent($2,TRUE)),
645 Safefree($2); $2 = Nullch;
648 { $$ = make_op(O_OPEN, 2,
649 stab2arg(A_WORD,stabent($3,TRUE)),
650 stab2arg(A_STAB,stabent($3,TRUE)),
652 Safefree($3); $3 = Nullch;
654 | OPEN '(' handle cexpr ')'
655 { $$ = make_op(O_OPEN, 2,
658 | FILOP '(' handle ')'
659 { $$ = make_op($1, 1,
663 { $$ = make_op($1, 1,
664 stab2arg(A_WORD,stabent($2,TRUE)),
666 Safefree($2); $2 = Nullch; }
668 { $$ = make_op($1, 1,
672 { $$ = make_op($1, 1,
673 stab2arg(A_WORD,Nullstab),
676 { $$ = make_op($1, 0,
677 Nullarg, Nullarg, Nullarg); }
678 | FILOP2 '(' handle cexpr ')'
679 { $$ = make_op($1, 2, $3, $4, Nullarg); }
680 | FILOP3 '(' handle csexpr cexpr ')'
681 { $$ = make_op($1, 3, $3, $4, make_list($5)); }
682 | FILOP22 '(' handle ',' handle ')'
683 { $$ = make_op($1, 2, $3, $5, Nullarg); }
684 | FILOP4 '(' handle csexpr csexpr cexpr ')'
685 { arg4 = $6; $$ = make_op($1, 4, $3, $4, $5); }
686 | FILOP25 '(' handle ',' handle csexpr csexpr cexpr ')'
687 { arg4 = $7; arg5 = $8;
688 $$ = make_op($1, 5, $3, $5, $6); }
689 | PUSH '(' aryword ',' expr crp
690 { $$ = make_op($1, 2,
694 | POP aryword %prec '('
695 { $$ = make_op(O_POP, 1, $2, Nullarg, Nullarg); }
696 | POP '(' aryword ')'
697 { $$ = make_op(O_POP, 1, $3, Nullarg, Nullarg); }
698 | SHIFT aryword %prec '('
699 { $$ = make_op(O_SHIFT, 1, $2, Nullarg, Nullarg); }
700 | SHIFT '(' aryword ')'
701 { $$ = make_op(O_SHIFT, 1, $3, Nullarg, Nullarg); }
703 { $$ = make_op(O_SHIFT, 1,
705 aadd(stabent(subline ? "_" : "ARGV", TRUE))),
708 { static char p[]="/\\s+/";
709 char *oldend = bufend;
710 ARG *oldarg = yylval.arg;
715 $$ = make_split(defstab,yylval.arg,Nullarg);
716 yylval.arg = oldarg; }
717 | SPLIT '(' sexpr csexpr csexpr ')'
718 { $$ = mod_match(O_MATCH, $4,
719 make_split(defstab,$3,$5));}
720 | SPLIT '(' sexpr csexpr ')'
721 { $$ = mod_match(O_MATCH, $4,
722 make_split(defstab,$3,Nullarg) ); }
723 | SPLIT '(' sexpr ')'
724 { $$ = mod_match(O_MATCH,
725 stab2arg(A_STAB,defstab),
726 make_split(defstab,$3,Nullarg) ); }
727 | FLIST2 '(' sexpr cexpr ')'
728 { $$ = make_op($1, 2,
730 listish(make_list($4)),
733 { $$ = make_op($1, 1,
737 | LVALFUN sexpr %prec '('
738 { $$ = l(make_op($1, 1, fixl($1,$2),
739 Nullarg, Nullarg)); }
741 { $$ = l(make_op($1, 1,
742 stab2arg(A_STAB,defstab),
743 Nullarg, Nullarg)); }
745 { $$ = make_op($1, 0, Nullarg, Nullarg, Nullarg); }
747 { $$ = make_op($1, 0, Nullarg, Nullarg, Nullarg); }
749 { $$ = make_op($1, 0, Nullarg, Nullarg, Nullarg); }
751 { $$ = make_op($1, 1, $3, Nullarg, Nullarg); }
752 | FUNC2 '(' sexpr cexpr ')'
753 { $$ = make_op($1, 2, $3, $4, Nullarg);
754 if ($1 == O_INDEX && $$[2].arg_type == A_SINGLE)
755 fbmcompile($$[2].arg_ptr.arg_str,0); }
756 | FUNC2x '(' sexpr csexpr ')'
757 { $$ = make_op($1, 2, $3, $4, Nullarg);
758 if ($1 == O_INDEX && $$[2].arg_type == A_SINGLE)
759 fbmcompile($$[2].arg_ptr.arg_str,0); }
760 | FUNC2x '(' sexpr csexpr cexpr ')'
761 { $$ = make_op($1, 3, $3, $4, $5);
762 if ($1 == O_INDEX && $$[2].arg_type == A_SINGLE)
763 fbmcompile($$[2].arg_ptr.arg_str,0); }
764 | FUNC3 '(' sexpr csexpr cexpr ')'
765 { $$ = make_op($1, 3, $3, $4, $5); }
766 | FUNC4 '(' sexpr csexpr csexpr cexpr ')'
768 $$ = make_op($1, 4, $3, $4, $5); }
769 | FUNC5 '(' sexpr csexpr csexpr csexpr cexpr ')'
770 { arg4 = $6; arg5 = $7;
771 $$ = make_op($1, 5, $3, $4, $5); }
772 | HSHFUN '(' hshword ')'
773 { $$ = make_op($1, 1,
778 { $$ = make_op($1, 1,
782 | HSHFUN3 '(' hshword csexpr cexpr ')'
783 { $$ = make_op($1, 3, $3, $4, $5); }
790 stab2arg(A_WORD,Nullstab),
791 stab2arg(A_STAB,defstab),
795 stab2arg(A_WORD,Nullstab),
796 maybelistish($1,make_list($2)),
800 stab2arg(A_WORD,stabent($2,TRUE)),
801 stab2arg(A_STAB,defstab),
803 Safefree($2); $2 = Nullch;
807 stab2arg(A_WORD,stabent($2,TRUE)),
808 maybelistish($1,make_list($3)),
809 Nullarg); Safefree($2); $2 = Nullch; }
813 maybelistish($1,make_list($3)),
818 maybelistish($1,make_list($3)),
823 { $$ = stab2arg(A_WORD,stabent($1,TRUE));
824 Safefree($1); $1 = Nullch;}
829 { $$ = stab2arg(A_WORD,aadd(stabent($1,TRUE)));
830 Safefree($1); $1 = Nullch; }
832 { $$ = stab2arg(A_STAB,$1); }
836 { $$ = stab2arg(A_WORD,hadd(stabent($1,TRUE)));
837 Safefree($1); $1 = Nullch; }
839 { $$ = stab2arg(A_STAB,$1); }
849 * NOTE: The following entry must stay at the end of the file so that
850 * reduce/reduce conflicts resolve to it only if it's the only option.
856 $$->arg_type = O_ITEM;
857 $$[1].arg_type = A_SINGLE;
858 $$[1].arg_ptr.arg_str = str_make($1,0);
859 for (s = $1; *s && isLOWER(*s); s++) ;
862 "\"%s\" may clash with future reserved word",
864 Safefree($1); $1 = Nullch;