This is my patch patch.1m for perl5.001.
[p5sagit/p5-mst-13.2.git] / toke.c
1 /*    toke.c
2  *
3  *    Copyright (c) 1991-1994, Larry Wall
4  *
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.
7  *
8  */
9
10 /*
11  *   "It all comes from here, the stench and the peril."  --Frodo
12  */
13
14 #include "EXTERN.h"
15 #include "perl.h"
16
17 static void check_uni _((void));
18 static void  force_next _((I32 type));
19 static char *force_word _((char *start, int token, int check_keyword, int allow_pack, int allow_tick));
20 static SV *q _((SV *sv));
21 static char *scan_const _((char *start));
22 static char *scan_formline _((char *s));
23 static char *scan_heredoc _((char *s));
24 static char *scan_ident _((char *s, char *send, char *dest, I32 ck_uni));
25 static char *scan_inputsymbol _((char *start));
26 static char *scan_pat _((char *start));
27 static char *scan_str _((char *start));
28 static char *scan_subst _((char *start));
29 static char *scan_trans _((char *start));
30 static char *scan_word _((char *s, char *dest, int allow_package, STRLEN *slp));
31 static char *skipspace _((char *s));
32 static void checkcomma _((char *s, char *name, char *what));
33 static void force_ident _((char *s, int kind));
34 static void incline _((char *s));
35 static int intuit_method _((char *s, GV *gv));
36 static int intuit_more _((char *s));
37 static I32 lop _((I32 f, expectation x, char *s));
38 static void missingterm _((char *s));
39 static void no_op _((char *what, char *s));
40 static void set_csh _((void));
41 static I32 sublex_done _((void));
42 static I32 sublex_start _((void));
43 #ifdef CRIPPLED_CC
44 static int uni _((I32 f, char *s));
45 #endif
46 static char * filter_gets _((SV *sv, FILE *fp));
47
48 /* The following are arranged oddly so that the guard on the switch statement
49  * can get by with a single comparison (if the compiler is smart enough).
50  */
51
52 #define LEX_NORMAL              9
53 #define LEX_INTERPNORMAL        8
54 #define LEX_INTERPCASEMOD       7
55 #define LEX_INTERPSTART         6
56 #define LEX_INTERPEND           5
57 #define LEX_INTERPENDMAYBE      4
58 #define LEX_INTERPCONCAT        3
59 #define LEX_INTERPCONST         2
60 #define LEX_FORMLINE            1
61 #define LEX_KNOWNEXT            0
62
63 #ifdef I_FCNTL
64 #include <fcntl.h>
65 #endif
66 #ifdef I_SYS_FILE
67 #include <sys/file.h>
68 #endif
69
70 #ifdef ff_next
71 #undef ff_next
72 #endif
73
74 #include "keywords.h"
75
76 #ifdef CLINE
77 #undef CLINE
78 #endif
79 #define CLINE (copline = (curcop->cop_line < copline ? curcop->cop_line : copline))
80
81 #define TOKEN(retval) return (bufptr = s,(int)retval)
82 #define OPERATOR(retval) return (expect = XTERM,bufptr = s,(int)retval)
83 #define AOPERATOR(retval) return ao((expect = XTERM,bufptr = s,(int)retval))
84 #define PREBLOCK(retval) return (expect = XBLOCK,bufptr = s,(int)retval)
85 #define PRETERMBLOCK(retval) return (expect = XTERMBLOCK,bufptr = s,(int)retval)
86 #define PREREF(retval) return (expect = XREF,bufptr = s,(int)retval)
87 #define TERM(retval) return (CLINE, expect = XOPERATOR,bufptr = s,(int)retval)
88 #define LOOPX(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)LOOPEX)
89 #define FTST(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)UNIOP)
90 #define FUN0(f) return(yylval.ival = f,expect = XOPERATOR,bufptr = s,(int)FUNC0)
91 #define FUN1(f) return(yylval.ival = f,expect = XOPERATOR,bufptr = s,(int)FUNC1)
92 #define BOop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)BITOROP))
93 #define BAop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)BITANDOP))
94 #define SHop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)SHIFTOP))
95 #define PWop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)POWOP))
96 #define PMop(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)MATCHOP)
97 #define Aop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)ADDOP))
98 #define Mop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)MULOP))
99 #define Eop(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)EQOP)
100 #define Rop(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)RELOP)
101
102 /* This bit of chicanery makes a unary function followed by
103  * a parenthesis into a function with one argument, highest precedence.
104  */
105 #define UNI(f) return(yylval.ival = f, \
106         expect = XTERM, \
107         bufptr = s, \
108         last_uni = oldbufptr, \
109         last_lop_op = f, \
110         (*s == '(' || (s = skipspace(s), *s == '(') ? (int)FUNC1 : (int)UNIOP) )
111
112 #define UNIBRACK(f) return(yylval.ival = f, \
113         bufptr = s, \
114         last_uni = oldbufptr, \
115         (*s == '(' || (s = skipspace(s), *s == '(') ? (int)FUNC1 : (int)UNIOP) )
116
117 /* grandfather return to old style */
118 #define OLDLOP(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)LSTOP)
119
120 static int
121 ao(toketype)
122 int toketype;
123 {
124     if (*bufptr == '=') {
125         bufptr++;
126         if (toketype == ANDAND)
127             yylval.ival = OP_ANDASSIGN;
128         else if (toketype == OROR)
129             yylval.ival = OP_ORASSIGN;
130         toketype = ASSIGNOP;
131     }
132     return toketype;
133 }
134
135 static void
136 no_op(what, s)
137 char *what;
138 char *s;
139 {
140     char tmpbuf[128];
141     char *oldbp = bufptr;
142     bool is_first = (oldbufptr == SvPVX(linestr));
143     bufptr = s;
144     sprintf(tmpbuf, "%s found where operator expected", what);
145     yywarn(tmpbuf);
146     if (is_first)
147         warn("\t(Missing semicolon on previous line?)\n");
148     else if (oldoldbufptr && isIDFIRST(*oldoldbufptr)) {
149         char *t;
150         for (t = oldoldbufptr; *t && (isALNUM(*t) || *t == ':'); t++) ;
151         if (t < bufptr && isSPACE(*t))
152             warn("\t(Do you need to predeclare %.*s?)\n",
153                 t - oldoldbufptr, oldoldbufptr);
154
155     }
156     else
157         warn("\t(Missing operator before %.*s?)\n", s - oldbp, oldbp);
158     bufptr = oldbp;
159 }
160
161 static void
162 missingterm(s)
163 char *s;
164 {
165     char tmpbuf[3];
166     char q;
167     if (s) {
168         char *nl = strrchr(s,'\n');
169         if (nl)
170             *nl = '\0';
171     }
172     else if (multi_close < 32 || multi_close == 127) {
173         *tmpbuf = '^';
174         tmpbuf[1] = multi_close ^ 64;
175         s = "\\n";
176         tmpbuf[2] = '\0';
177         s = tmpbuf;
178     }
179     else {
180         *tmpbuf = multi_close;
181         tmpbuf[1] = '\0';
182         s = tmpbuf;
183     }
184     q = strchr(s,'"') ? '\'' : '"';
185     croak("Can't find string terminator %c%s%c anywhere before EOF",q,s,q);
186 }
187
188 void
189 deprecate(s)
190 char *s;
191 {
192     if (dowarn)
193         warn("Use of %s is deprecated", s);
194 }
195
196 static void
197 depcom()
198 {
199     deprecate("comma-less variable list");
200 }
201
202 void
203 lex_start(line)
204 SV *line;
205 {
206     char *s;
207     STRLEN len;
208
209     SAVEINT(lex_dojoin);
210     SAVEINT(lex_brackets);
211     SAVEINT(lex_fakebrack);
212     SAVEINT(lex_casemods);
213     SAVEINT(lex_starts);
214     SAVEINT(lex_state);
215     SAVESPTR(lex_inpat);
216     SAVEINT(lex_inwhat);
217     SAVEINT(curcop->cop_line);
218     SAVEPPTR(bufptr);
219     SAVEPPTR(bufend);
220     SAVEPPTR(oldbufptr);
221     SAVEPPTR(oldoldbufptr);
222     SAVESPTR(linestr);
223     SAVEPPTR(lex_brackstack);
224     SAVEPPTR(lex_casestack);
225     SAVESPTR(rsfp);
226
227     lex_state = LEX_NORMAL;
228     lex_defer = 0;
229     expect = XSTATE;
230     lex_brackets = 0;
231     lex_fakebrack = 0;
232     New(899, lex_brackstack, 120, char);
233     New(899, lex_casestack, 12, char);
234     SAVEFREEPV(lex_brackstack);
235     SAVEFREEPV(lex_casestack);
236     lex_casemods = 0;
237     *lex_casestack = '\0';
238     lex_dojoin = 0;
239     lex_starts = 0;
240     if (lex_stuff)
241         SvREFCNT_dec(lex_stuff);
242     lex_stuff = Nullsv;
243     if (lex_repl)
244         SvREFCNT_dec(lex_repl);
245     lex_repl = Nullsv;
246     lex_inpat = 0;
247     lex_inwhat = 0;
248     linestr = line;
249     if (SvREADONLY(linestr))
250         linestr = sv_2mortal(newSVsv(linestr));
251     s = SvPV(linestr, len);
252     if (len && s[len-1] != ';') {
253         if (!(SvFLAGS(linestr) & SVs_TEMP))
254             linestr = sv_2mortal(newSVsv(linestr));
255         sv_catpvn(linestr, "\n;", 2);
256     }
257     SvTEMP_off(linestr);
258     oldoldbufptr = oldbufptr = bufptr = SvPVX(linestr);
259     bufend = bufptr + SvCUR(linestr);
260     rs = "\n";
261     rslen = 1;
262     rschar = '\n';
263     rspara = 0;
264     rsfp = 0;
265 }
266
267 void
268 lex_end()
269 {
270 }
271
272 static void
273 incline(s)
274 char *s;
275 {
276     char *t;
277     char *n;
278     char ch;
279     int sawline = 0;
280
281     curcop->cop_line++;
282     if (*s++ != '#')
283         return;
284     while (*s == ' ' || *s == '\t') s++;
285     if (strnEQ(s, "line ", 5)) {
286         s += 5;
287         sawline = 1;
288     }
289     if (!isDIGIT(*s))
290         return;
291     n = s;
292     while (isDIGIT(*s))
293         s++;
294     while (*s == ' ' || *s == '\t')
295         s++;
296     if (*s == '"' && (t = strchr(s+1, '"')))
297         s++;
298     else {
299         if (!sawline)
300             return;             /* false alarm */
301         for (t = s; !isSPACE(*t); t++) ;
302     }
303     ch = *t;
304     *t = '\0';
305     if (t - s > 0)
306         curcop->cop_filegv = gv_fetchfile(s);
307     else
308         curcop->cop_filegv = gv_fetchfile(origfilename);
309     *t = ch;
310     curcop->cop_line = atoi(n)-1;
311 }
312
313 static char *
314 skipspace(s)
315 register char *s;
316 {
317     if (lex_formbrack && lex_brackets <= lex_formbrack) {
318         while (s < bufend && (*s == ' ' || *s == '\t'))
319             s++;
320         return s;
321     }
322     for (;;) {
323         while (s < bufend && isSPACE(*s))
324             s++;
325         if (s < bufend && *s == '#') {
326             while (s < bufend && *s != '\n')
327                 s++;
328             if (s < bufend)
329                 s++;
330         }
331         if (s < bufend || !rsfp || lex_state != LEX_NORMAL)
332             return s;
333         if ((s = filter_gets(linestr, rsfp)) == Nullch) {
334             if (minus_n || minus_p) {
335                 sv_setpv(linestr,minus_p ? ";}continue{print" : "");
336                 sv_catpv(linestr,";}");
337                 minus_n = minus_p = 0;
338             }
339             else
340                 sv_setpv(linestr,";");
341             oldoldbufptr = oldbufptr = bufptr = s = SvPVX(linestr);
342             bufend = SvPVX(linestr) + SvCUR(linestr);
343             if (preprocess && !in_eval)
344                 (void)my_pclose(rsfp);
345             else if ((FILE*)rsfp == stdin)
346                 clearerr(stdin);
347             else
348                 (void)fclose(rsfp);
349             rsfp = Nullfp;
350             return s;
351         }
352         oldoldbufptr = oldbufptr = bufptr = s;
353         bufend = bufptr + SvCUR(linestr);
354         incline(s);
355         if (perldb && curstash != debstash) {
356             SV *sv = NEWSV(85,0);
357
358             sv_upgrade(sv, SVt_PVMG);
359             sv_setsv(sv,linestr);
360             av_store(GvAV(curcop->cop_filegv),(I32)curcop->cop_line,sv);
361         }
362     }
363 }
364
365 static void
366 check_uni() {
367     char *s;
368     char ch;
369     char *t;
370
371     if (oldoldbufptr != last_uni)
372         return;
373     while (isSPACE(*last_uni))
374         last_uni++;
375     for (s = last_uni; isALNUM(*s) || *s == '-'; s++) ;
376     if ((t = strchr(s, '(')) && t < bufptr)
377         return;
378     ch = *s;
379     *s = '\0';
380     warn("Warning: Use of \"%s\" without parens is ambiguous", last_uni);
381     *s = ch;
382 }
383
384 #ifdef CRIPPLED_CC
385
386 #undef UNI
387 #define UNI(f) return uni(f,s)
388
389 static int
390 uni(f,s)
391 I32 f;
392 char *s;
393 {
394     yylval.ival = f;
395     expect = XTERM;
396     bufptr = s;
397     last_uni = oldbufptr;
398     last_lop_op = f;
399     if (*s == '(')
400         return FUNC1;
401     s = skipspace(s);
402     if (*s == '(')
403         return FUNC1;
404     else
405         return UNIOP;
406 }
407
408 #endif /* CRIPPLED_CC */
409
410 #define LOP(f,x) return lop(f,x,s)
411
412 static I32
413 lop(f,x,s)
414 I32 f;
415 expectation x;
416 char *s;
417 {
418     yylval.ival = f;
419     CLINE;
420     expect = x;
421     bufptr = s;
422     last_lop = oldbufptr;
423     last_lop_op = f;
424     if (nexttoke)
425         return LSTOP;
426     if (*s == '(')
427         return FUNC;
428     s = skipspace(s);
429     if (*s == '(')
430         return FUNC;
431     else
432         return LSTOP;
433 }
434
435 static void 
436 force_next(type)
437 I32 type;
438 {
439     nexttype[nexttoke] = type;
440     nexttoke++;
441     if (lex_state != LEX_KNOWNEXT) {
442         lex_defer = lex_state;
443         lex_expect = expect;
444         lex_state = LEX_KNOWNEXT;
445     }
446 }
447
448 static char *
449 force_word(start,token,check_keyword,allow_pack,allow_tick)
450 register char *start;
451 int token;
452 int check_keyword;
453 int allow_pack;
454 int allow_tick;
455 {
456     register char *s;
457     STRLEN len;
458     
459     start = skipspace(start);
460     s = start;
461     if (isIDFIRST(*s) ||
462         (allow_pack && *s == ':') ||
463         (allow_tick && *s == '\'') )
464     {
465         s = scan_word(s, tokenbuf, allow_pack, &len);
466         if (check_keyword && keyword(tokenbuf, len))
467             return start;
468         if (token == METHOD) {
469             s = skipspace(s);
470             if (*s == '(')
471                 expect = XTERM;
472             else {
473                 expect = XOPERATOR;
474                 force_next(')');
475                 force_next('(');
476             }
477         }
478         nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST,0, newSVpv(tokenbuf,0));
479         nextval[nexttoke].opval->op_private |= OPpCONST_BARE;
480         force_next(token);
481     }
482     return s;
483 }
484
485 static void
486 force_ident(s, kind)
487 register char *s;
488 int kind;
489 {
490     if (s && *s) {
491         OP* op = (OP*)newSVOP(OP_CONST, 0, newSVpv(s,0));
492         nextval[nexttoke].opval = op;
493         force_next(WORD);
494         if (kind) {
495             op->op_private = OPpCONST_ENTERED;
496             gv_fetchpv(s, TRUE,
497                 kind == '$' ? SVt_PV :
498                 kind == '@' ? SVt_PVAV :
499                 kind == '%' ? SVt_PVHV :
500                               SVt_PVGV
501                 );
502         }
503     }
504 }
505
506 static SV *
507 q(sv)
508 SV *sv;
509 {
510     register char *s;
511     register char *send;
512     register char *d;
513     STRLEN len;
514
515     if (!SvLEN(sv))
516         return sv;
517
518     s = SvPV_force(sv, len);
519     if (SvIVX(sv) == -1)
520         return sv;
521     send = s + len;
522     while (s < send && *s != '\\')
523         s++;
524     if (s == send)
525         return sv;
526     d = s;
527     while (s < send) {
528         if (*s == '\\') {
529             if (s + 1 < send && (s[1] == '\\'))
530                 s++;            /* all that, just for this */
531         }
532         *d++ = *s++;
533     }
534     *d = '\0';
535     SvCUR_set(sv, d - SvPVX(sv));
536
537     return sv;
538 }
539
540 static I32
541 sublex_start()
542 {
543     register I32 op_type = yylval.ival;
544
545     if (op_type == OP_NULL) {
546         yylval.opval = lex_op;
547         lex_op = Nullop;
548         return THING;
549     }
550     if (op_type == OP_CONST || op_type == OP_READLINE) {
551         yylval.opval = (OP*)newSVOP(op_type, 0, q(lex_stuff));
552         lex_stuff = Nullsv;
553         return THING;
554     }
555
556     push_scope();
557     SAVEINT(lex_dojoin);
558     SAVEINT(lex_brackets);
559     SAVEINT(lex_fakebrack);
560     SAVEINT(lex_casemods);
561     SAVEINT(lex_starts);
562     SAVEINT(lex_state);
563     SAVESPTR(lex_inpat);
564     SAVEINT(lex_inwhat);
565     SAVEINT(curcop->cop_line);
566     SAVEPPTR(bufptr);
567     SAVEPPTR(oldbufptr);
568     SAVEPPTR(oldoldbufptr);
569     SAVESPTR(linestr);
570     SAVEPPTR(lex_brackstack);
571     SAVEPPTR(lex_casestack);
572
573     linestr = lex_stuff;
574     lex_stuff = Nullsv;
575
576     bufend = bufptr = oldbufptr = oldoldbufptr = SvPVX(linestr);
577     bufend += SvCUR(linestr);
578     SAVEFREESV(linestr);
579
580     lex_dojoin = FALSE;
581     lex_brackets = 0;
582     lex_fakebrack = 0;
583     New(899, lex_brackstack, 120, char);
584     New(899, lex_casestack, 12, char);
585     SAVEFREEPV(lex_brackstack);
586     SAVEFREEPV(lex_casestack);
587     lex_casemods = 0;
588     *lex_casestack = '\0';
589     lex_starts = 0;
590     lex_state = LEX_INTERPCONCAT;
591     curcop->cop_line = multi_start;
592
593     lex_inwhat = op_type;
594     if (op_type == OP_MATCH || op_type == OP_SUBST)
595         lex_inpat = lex_op;
596     else
597         lex_inpat = 0;
598
599     expect = XTERM;
600     force_next('(');
601     if (lex_op) {
602         yylval.opval = lex_op;
603         lex_op = Nullop;
604         return PMFUNC;
605     }
606     else
607         return FUNC;
608 }
609
610 static I32
611 sublex_done()
612 {
613     if (!lex_starts++) {
614         expect = XOPERATOR;
615         yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv("",0));
616         return THING;
617     }
618
619     if (lex_casemods) {         /* oops, we've got some unbalanced parens */
620         lex_state = LEX_INTERPCASEMOD;
621         return yylex();
622     }
623
624     /* Is there a right-hand side to take care of? */
625     if (lex_repl && (lex_inwhat == OP_SUBST || lex_inwhat == OP_TRANS)) {
626         linestr = lex_repl;
627         lex_inpat = 0;
628         bufend = bufptr = oldbufptr = oldoldbufptr = SvPVX(linestr);
629         bufend += SvCUR(linestr);
630         SAVEFREESV(linestr);
631         lex_dojoin = FALSE;
632         lex_brackets = 0;
633         lex_fakebrack = 0;
634         lex_casemods = 0;
635         *lex_casestack = '\0';
636         lex_starts = 0;
637         if (SvCOMPILED(lex_repl)) {
638             lex_state = LEX_INTERPNORMAL;
639             lex_starts++;
640         }
641         else
642             lex_state = LEX_INTERPCONCAT;
643         lex_repl = Nullsv;
644         return ',';
645     }
646     else {
647         pop_scope();
648         bufend = SvPVX(linestr);
649         bufend += SvCUR(linestr);
650         expect = XOPERATOR;
651         return ')';
652     }
653 }
654
655 static char *
656 scan_const(start)
657 char *start;
658 {
659     register char *send = bufend;
660     SV *sv = NEWSV(93, send - start);
661     register char *s = start;
662     register char *d = SvPVX(sv);
663     bool dorange = FALSE;
664     I32 len;
665     char *leave =
666         lex_inpat
667             ? "\\.^$@AGZdDwWsSbB+*?|()-nrtfeaxc0123456789[{]} \t\n\r\f\v#"
668             : (lex_inwhat & OP_TRANS)
669                 ? ""
670                 : "";
671
672     while (s < send || dorange) {
673         if (lex_inwhat == OP_TRANS) {
674             if (dorange) {
675                 I32 i;
676                 I32 max;
677                 i = d - SvPVX(sv);
678                 SvGROW(sv, SvLEN(sv) + 256);
679                 d = SvPVX(sv) + i;
680                 d -= 2;
681                 max = d[1] & 0377;
682                 for (i = (*d & 0377); i <= max; i++)
683                     *d++ = i;
684                 dorange = FALSE;
685                 continue;
686             }
687             else if (*s == '-' && s+1 < send  && s != start) {
688                 dorange = TRUE;
689                 s++;
690             }
691         }
692         else if (*s == '(' && lex_inpat && s[1] == '?' && s[2] == '#') {
693             while (s < send && *s != ')')
694                 *d++ = *s++;
695         }
696         else if (*s == '#' && lex_inpat &&
697           ((PMOP*)lex_inpat)->op_pmflags & PMf_EXTENDED) {
698             while (s+1 < send && *s != '\n')
699                 *d++ = *s++;
700         }
701         else if (*s == '@' && s[1] && (isALNUM(s[1]) || strchr(":'{$", s[1])))
702             break;
703         else if (*s == '$') {
704             if (!lex_inpat)     /* not a regexp, so $ must be var */
705                 break;
706             if (s + 1 < send && !strchr(")| \n\t", s[1]))
707                 break;          /* in regexp, $ might be tail anchor */
708         }
709         if (*s == '\\' && s+1 < send) {
710             s++;
711             if (*s && strchr(leave, *s)) {
712                 *d++ = '\\';
713                 *d++ = *s++;
714                 continue;
715             }
716             if (lex_inwhat == OP_SUBST && !lex_inpat &&
717                 isDIGIT(*s) && *s != '0' && !isDIGIT(s[1]))
718             {
719                 if (dowarn)
720                     warn("\\%c better written as $%c", *s, *s);
721                 *--s = '$';
722                 break;
723             }
724             if (lex_inwhat != OP_TRANS && *s && strchr("lLuUEQ", *s)) {
725                 --s;
726                 break;
727             }
728             switch (*s) {
729             case '-':
730                 if (lex_inwhat == OP_TRANS) {
731                     *d++ = *s++;
732                     continue;
733                 }
734                 /* FALL THROUGH */
735             default:
736                 *d++ = *s++;
737                 continue;
738             case '0': case '1': case '2': case '3':
739             case '4': case '5': case '6': case '7':
740                 *d++ = scan_oct(s, 3, &len);
741                 s += len;
742                 continue;
743             case 'x':
744                 *d++ = scan_hex(++s, 2, &len);
745                 s += len;
746                 continue;
747             case 'c':
748                 s++;
749                 *d = *s++;
750                 if (isLOWER(*d))
751                     *d = toUPPER(*d);
752                 *d++ ^= 64;
753                 continue;
754             case 'b':
755                 *d++ = '\b';
756                 break;
757             case 'n':
758                 *d++ = '\n';
759                 break;
760             case 'r':
761                 *d++ = '\r';
762                 break;
763             case 'f':
764                 *d++ = '\f';
765                 break;
766             case 't':
767                 *d++ = '\t';
768                 break;
769             case 'e':
770                 *d++ = '\033';
771                 break;
772             case 'a':
773                 *d++ = '\007';
774                 break;
775             }
776             s++;
777             continue;
778         }
779         *d++ = *s++;
780     }
781     *d = '\0';
782     SvCUR_set(sv, d - SvPVX(sv));
783     SvPOK_on(sv);
784
785     if (SvCUR(sv) + 5 < SvLEN(sv)) {
786         SvLEN_set(sv, SvCUR(sv) + 1);
787         Renew(SvPVX(sv), SvLEN(sv), char);
788     }
789     if (s > bufptr)
790         yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
791     else
792         SvREFCNT_dec(sv);
793     return s;
794 }
795
796 /* This is the one truly awful dwimmer necessary to conflate C and sed. */
797 static int
798 intuit_more(s)
799 register char *s;
800 {
801     if (lex_brackets)
802         return TRUE;
803     if (*s == '-' && s[1] == '>' && (s[2] == '[' || s[2] == '{'))
804         return TRUE;
805     if (*s != '{' && *s != '[')
806         return FALSE;
807     if (!lex_inpat)
808         return TRUE;
809
810     /* In a pattern, so maybe we have {n,m}. */
811     if (*s == '{') {
812         s++;
813         if (!isDIGIT(*s))
814             return TRUE;
815         while (isDIGIT(*s))
816             s++;
817         if (*s == ',')
818             s++;
819         while (isDIGIT(*s))
820             s++;
821         if (*s == '}')
822             return FALSE;
823         return TRUE;
824         
825     }
826
827     /* On the other hand, maybe we have a character class */
828
829     s++;
830     if (*s == ']' || *s == '^')
831         return FALSE;
832     else {
833         int weight = 2;         /* let's weigh the evidence */
834         char seen[256];
835         unsigned char un_char = 0, last_un_char;
836         char *send = strchr(s,']');
837         char tmpbuf[512];
838
839         if (!send)              /* has to be an expression */
840             return TRUE;
841
842         Zero(seen,256,char);
843         if (*s == '$')
844             weight -= 3;
845         else if (isDIGIT(*s)) {
846             if (s[1] != ']') {
847                 if (isDIGIT(s[1]) && s[2] == ']')
848                     weight -= 10;
849             }
850             else
851                 weight -= 100;
852         }
853         for (; s < send; s++) {
854             last_un_char = un_char;
855             un_char = (unsigned char)*s;
856             switch (*s) {
857             case '@':
858             case '&':
859             case '$':
860                 weight -= seen[un_char] * 10;
861                 if (isALNUM(s[1])) {
862                     scan_ident(s,send,tmpbuf,FALSE);
863                     if ((int)strlen(tmpbuf) > 1 && gv_fetchpv(tmpbuf,FALSE, SVt_PV))
864                         weight -= 100;
865                     else
866                         weight -= 10;
867                 }
868                 else if (*s == '$' && s[1] &&
869                   strchr("[#!%*<>()-=",s[1])) {
870                     if (/*{*/ strchr("])} =",s[2]))
871                         weight -= 10;
872                     else
873                         weight -= 1;
874                 }
875                 break;
876             case '\\':
877                 un_char = 254;
878                 if (s[1]) {
879                     if (strchr("wds]",s[1]))
880                         weight += 100;
881                     else if (seen['\''] || seen['"'])
882                         weight += 1;
883                     else if (strchr("rnftbxcav",s[1]))
884                         weight += 40;
885                     else if (isDIGIT(s[1])) {
886                         weight += 40;
887                         while (s[1] && isDIGIT(s[1]))
888                             s++;
889                     }
890                 }
891                 else
892                     weight += 100;
893                 break;
894             case '-':
895                 if (s[1] == '\\')
896                     weight += 50;
897                 if (strchr("aA01! ",last_un_char))
898                     weight += 30;
899                 if (strchr("zZ79~",s[1]))
900                     weight += 30;
901                 break;
902             default:
903                 if (!isALNUM(last_un_char) && !strchr("$@&",last_un_char) &&
904                         isALPHA(*s) && s[1] && isALPHA(s[1])) {
905                     char *d = tmpbuf;
906                     while (isALPHA(*s))
907                         *d++ = *s++;
908                     *d = '\0';
909                     if (keyword(tmpbuf, d - tmpbuf))
910                         weight -= 150;
911                 }
912                 if (un_char == last_un_char + 1)
913                     weight += 5;
914                 weight -= seen[un_char];
915                 break;
916             }
917             seen[un_char]++;
918         }
919         if (weight >= 0)        /* probably a character class */
920             return FALSE;
921     }
922
923     return TRUE;
924 }
925
926 static int
927 intuit_method(start,gv)
928 char *start;
929 GV *gv;
930 {
931     char *s = start + (*start == '$');
932     char tmpbuf[1024];
933     STRLEN len;
934     GV* indirgv;
935
936     if (gv) {
937         if (GvIO(gv))
938             return 0;
939         if (!GvCV(gv))
940             gv = 0;
941     }
942     s = scan_word(s, tmpbuf, TRUE, &len);
943     if (*start == '$') {
944         if (gv || last_lop_op == OP_PRINT || isUPPER(*tokenbuf))
945             return 0;
946         s = skipspace(s);
947         bufptr = start;
948         expect = XREF;
949         return *s == '(' ? FUNCMETH : METHOD;
950     }
951     if (!keyword(tmpbuf, len)) {
952         indirgv = gv_fetchpv(tmpbuf,FALSE, SVt_PVCV);
953         if (indirgv && GvCV(indirgv))
954             return 0;
955         /* filehandle or package name makes it a method */
956         if (!gv || GvIO(indirgv) || gv_stashpv(tmpbuf, FALSE)) {
957             s = skipspace(s);
958             nextval[nexttoke].opval =
959                 (OP*)newSVOP(OP_CONST, 0,
960                             newSVpv(tmpbuf,0));
961             nextval[nexttoke].opval->op_private =
962                 OPpCONST_BARE;
963             expect = XTERM;
964             force_next(WORD);
965             bufptr = s;
966             return *s == '(' ? FUNCMETH : METHOD;
967         }
968     }
969     return 0;
970 }
971
972 static char*
973 incl_perldb()
974 {
975     if (perldb) {
976         char *pdb = getenv("PERL5DB");
977
978         if (pdb)
979             return pdb;
980         return "BEGIN { require 'perl5db.pl' }";
981     }
982     return "";
983 }
984
985
986 /* Encoded script support. filter_add() effectively inserts a
987  * 'pre-processing' function into the current source input stream. 
988  * Note that the filter function only applies to the current source file
989  * (e.g., it will not affect files 'require'd or 'use'd by this one).
990  *
991  * The datasv parameter (which may be NULL) can be used to pass
992  * private data to this instance of the filter. The filter function
993  * can recover the SV using the FILTER_DATA macro and use it to
994  * store private buffers and state information.
995  *
996  * The supplied datasv parameter is upgraded to a PVIO type
997  * and the IoDIRP field is used to store the function pointer.
998  * Note that IoTOP_NAME, IoFMT_NAME, IoBOTTOM_NAME, if set for
999  * private use must be set using malloc'd pointers.
1000  */
1001 static int filter_debug = 0;
1002
1003 SV *
1004 filter_add(funcp, datasv)
1005     filter_t funcp;
1006     SV *datasv;
1007 {
1008     if (!funcp){ /* temporary handy debugging hack to be deleted */
1009         filter_debug = atoi((char*)datasv);
1010         return NULL;
1011     }
1012     if (!rsfp_filters)
1013         rsfp_filters = newAV();
1014     if (!datasv)
1015         datasv = newSV(0);
1016     if (!SvUPGRADE(datasv, SVt_PVIO))
1017         die("Can't upgrade filter_add data to SVt_PVIO");
1018     IoDIRP(datasv) = (DIR*)funcp; /* stash funcp into spare field */
1019     if (filter_debug)
1020         warn("filter_add func %lx (%s)", funcp, SvPV(datasv,na));
1021     av_unshift(rsfp_filters, 1);
1022     av_store(rsfp_filters, 0, datasv) ;
1023     return(datasv);
1024 }
1025  
1026
1027 /* Delete most recently added instance of this filter function. */
1028 void
1029 filter_del(funcp)
1030     filter_t funcp;
1031 {
1032     if (filter_debug)
1033         warn("filter_del func %lx", funcp);
1034     if (!rsfp_filters || AvFILL(rsfp_filters)<0)
1035         return;
1036     /* if filter is on top of stack (usual case) just pop it off */
1037     if (IoDIRP(FILTER_DATA(0)) == (void*)funcp){
1038         /* sv_free(av_pop(rsfp_filters)); */
1039         sv_free(av_shift(rsfp_filters));
1040
1041         return;
1042     }
1043     /* we need to search for the correct entry and clear it     */
1044     die("filter_del can only delete in reverse order (currently)");
1045 }
1046
1047
1048 /* Invoke the n'th filter function for the current rsfp.         */
1049 I32
1050 filter_read(idx, buf_sv, maxlen)
1051     int idx;
1052     SV *buf_sv;
1053     int maxlen;         /* 0 = read one text line */
1054 {
1055     filter_t funcp;
1056     SV *datasv = NULL;
1057
1058     if (!rsfp_filters)
1059         return -1;
1060     if (idx > AvFILL(rsfp_filters)){       /* Any more filters? */
1061         /* Provide a default input filter to make life easy.    */
1062         /* Note that we append to the line. This is handy.      */
1063         if (filter_debug)
1064             warn("filter_read %d: from rsfp\n", idx);
1065         if (maxlen) { 
1066             /* Want a block */
1067             int len ;
1068             int old_len = SvCUR(buf_sv) ;
1069
1070             /* ensure buf_sv is large enough */
1071             SvGROW(buf_sv, old_len + maxlen) ;
1072             if ((len = fread(SvPVX(buf_sv) + old_len, 1, maxlen, rsfp)) <= 0)
1073                 return len ;
1074             SvCUR_set(buf_sv, old_len + len) ;
1075         } else {
1076             /* Want a line */
1077             if (sv_gets(buf_sv, rsfp, (SvCUR(buf_sv)>0) ? 1 : 0) == NULL)
1078                 return -1;              /* end of file */
1079         }
1080         return SvCUR(buf_sv);
1081     }
1082     /* Skip this filter slot if filter has been deleted */
1083     if ( (datasv = FILTER_DATA(idx)) == &sv_undef){
1084         if (filter_debug)
1085             warn("filter_read %d: skipped (filter deleted)\n", idx);
1086         return FILTER_READ(idx+1, buf_sv, maxlen); /* recurse */
1087     }
1088     /* Get function pointer hidden within datasv        */
1089     funcp = (filter_t)IoDIRP(datasv);
1090     if (filter_debug)
1091         warn("filter_read %d: via function %lx (%s)\n",
1092                 idx, funcp, SvPV(datasv,na));
1093     /* Call function. The function is expected to       */
1094     /* call "FILTER_READ(idx+1, buf_sv)" first.         */
1095     /* Return: <0:error/eof, >=0:not eof (see yylex())  */
1096     return (*funcp)(idx, buf_sv, maxlen);
1097 }
1098
1099 static char *
1100 filter_gets(sv,fp)
1101 register SV *sv;
1102 register FILE *fp;
1103 {
1104     if (rsfp_filters) {
1105
1106         SvCUR_set(sv, 0);       /* start with empty line        */
1107         if (FILTER_READ(0, sv, 0) > 0)
1108             return ( SvPVX(sv) ) ;
1109         else
1110             return Nullch ;
1111     }
1112     else 
1113         return (sv_gets(sv, fp, 0)) ;
1114     
1115 }
1116
1117
1118 #ifdef DEBUGGING
1119     static char* exp_name[] =
1120         { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "TERMBLOCK" };
1121 #endif
1122
1123 extern int yychar;              /* last token */
1124
1125 int
1126 yylex()
1127 {
1128     register char *s;
1129     register char *d;
1130     register I32 tmp;
1131     STRLEN len;
1132
1133     switch (lex_state) {
1134 #ifdef COMMENTARY
1135     case LEX_NORMAL:            /* Some compilers will produce faster */
1136     case LEX_INTERPNORMAL:      /* code if we comment these out. */
1137         break;
1138 #endif
1139
1140     case LEX_KNOWNEXT:
1141         nexttoke--;
1142         yylval = nextval[nexttoke];
1143         if (!nexttoke) {
1144             lex_state = lex_defer;
1145             expect = lex_expect;
1146             lex_defer = LEX_NORMAL;
1147         }
1148         return(nexttype[nexttoke]);
1149
1150     case LEX_INTERPCASEMOD:
1151 #ifdef DEBUGGING
1152         if (bufptr != bufend && *bufptr != '\\')
1153             croak("panic: INTERPCASEMOD");
1154 #endif
1155         if (bufptr == bufend || bufptr[1] == 'E') {
1156             char oldmod;
1157             if (lex_casemods) {
1158                 oldmod = lex_casestack[--lex_casemods];
1159                 lex_casestack[lex_casemods] = '\0';
1160                 if (bufptr != bufend && strchr("LUQ", oldmod)) {
1161                     bufptr += 2;
1162                     lex_state = LEX_INTERPCONCAT;
1163                 }
1164                 return ')';
1165             }
1166             if (bufptr != bufend)
1167                 bufptr += 2;
1168             lex_state = LEX_INTERPCONCAT;
1169             return yylex();
1170         }
1171         else {
1172             s = bufptr + 1;
1173             if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
1174                 tmp = *s, *s = s[2], s[2] = tmp;        /* misordered... */
1175             if (strchr("LU", *s) &&
1176                 (strchr(lex_casestack, 'L') || strchr(lex_casestack, 'U')))
1177             {
1178                 lex_casestack[--lex_casemods] = '\0';
1179                 return ')';
1180             }
1181             if (lex_casemods > 10) {
1182                 char* newlb = (char*)realloc(lex_casestack, lex_casemods + 2);
1183                 if (newlb != lex_casestack) {
1184                     SAVEFREEPV(newlb);
1185                     lex_casestack = newlb;
1186                 }
1187             }
1188             lex_casestack[lex_casemods++] = *s;
1189             lex_casestack[lex_casemods] = '\0';
1190             lex_state = LEX_INTERPCONCAT;
1191             nextval[nexttoke].ival = 0;
1192             force_next('(');
1193             if (*s == 'l')
1194                 nextval[nexttoke].ival = OP_LCFIRST;
1195             else if (*s == 'u')
1196                 nextval[nexttoke].ival = OP_UCFIRST;
1197             else if (*s == 'L')
1198                 nextval[nexttoke].ival = OP_LC;
1199             else if (*s == 'U')
1200                 nextval[nexttoke].ival = OP_UC;
1201             else if (*s == 'Q')
1202                 nextval[nexttoke].ival = OP_QUOTEMETA;
1203             else
1204                 croak("panic: yylex");
1205             bufptr = s + 1;
1206             force_next(FUNC);
1207             if (lex_starts) {
1208                 s = bufptr;
1209                 lex_starts = 0;
1210                 Aop(OP_CONCAT);
1211             }
1212             else
1213                 return yylex();
1214         }
1215
1216     case LEX_INTERPSTART:
1217         if (bufptr == bufend)
1218             return sublex_done();
1219         expect = XTERM;
1220         lex_dojoin = (*bufptr == '@');
1221         lex_state = LEX_INTERPNORMAL;
1222         if (lex_dojoin) {
1223             nextval[nexttoke].ival = 0;
1224             force_next(',');
1225             force_ident("\"", '$');
1226             nextval[nexttoke].ival = 0;
1227             force_next('$');
1228             nextval[nexttoke].ival = 0;
1229             force_next('(');
1230             nextval[nexttoke].ival = OP_JOIN;   /* emulate join($", ...) */
1231             force_next(FUNC);
1232         }
1233         if (lex_starts++) {
1234             s = bufptr;
1235             Aop(OP_CONCAT);
1236         }
1237         else
1238             return yylex();
1239         break;
1240
1241     case LEX_INTERPENDMAYBE:
1242         if (intuit_more(bufptr)) {
1243             lex_state = LEX_INTERPNORMAL;       /* false alarm, more expr */
1244             break;
1245         }
1246         /* FALL THROUGH */
1247
1248     case LEX_INTERPEND:
1249         if (lex_dojoin) {
1250             lex_dojoin = FALSE;
1251             lex_state = LEX_INTERPCONCAT;
1252             return ')';
1253         }
1254         /* FALLTHROUGH */
1255     case LEX_INTERPCONCAT:
1256 #ifdef DEBUGGING
1257         if (lex_brackets)
1258             croak("panic: INTERPCONCAT");
1259 #endif
1260         if (bufptr == bufend)
1261             return sublex_done();
1262
1263         if (SvIVX(linestr) == '\'') {
1264             SV *sv = newSVsv(linestr);
1265             if (!lex_inpat)
1266                 sv = q(sv);
1267             yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
1268             s = bufend;
1269         }
1270         else {
1271             s = scan_const(bufptr);
1272             if (*s == '\\')
1273                 lex_state = LEX_INTERPCASEMOD;
1274             else
1275                 lex_state = LEX_INTERPSTART;
1276         }
1277
1278         if (s != bufptr) {
1279             nextval[nexttoke] = yylval;
1280             expect = XTERM;
1281             force_next(THING);
1282             if (lex_starts++)
1283                 Aop(OP_CONCAT);
1284             else {
1285                 bufptr = s;
1286                 return yylex();
1287             }
1288         }
1289
1290         return yylex();
1291     case LEX_FORMLINE:
1292         lex_state = LEX_NORMAL;
1293         s = scan_formline(bufptr);
1294         if (!lex_formbrack)
1295             goto rightbracket;
1296         OPERATOR(';');
1297     }
1298
1299     s = bufptr;
1300     oldoldbufptr = oldbufptr;
1301     oldbufptr = s;
1302     DEBUG_p( {
1303         fprintf(stderr,"### Tokener expecting %s at %s\n", exp_name[expect], s);
1304     } )
1305
1306   retry:
1307     switch (*s) {
1308     default:
1309         warn("Unrecognized character \\%03o ignored", *s++ & 255);
1310         goto retry;
1311     case 4:
1312     case 26:
1313         goto fake_eof;                  /* emulate EOF on ^D or ^Z */
1314     case 0:
1315         if (!rsfp) {
1316             if (lex_brackets)
1317                 yyerror("Missing right bracket");
1318             TOKEN(0);
1319         }
1320         if (s++ < bufend)
1321             goto retry;                 /* ignore stray nulls */
1322         last_uni = 0;
1323         last_lop = 0;
1324         if (!in_eval && !preambled) {
1325             preambled = TRUE;
1326             sv_setpv(linestr,incl_perldb());
1327             if (autoboot_preamble)
1328                 sv_catpv(linestr, autoboot_preamble);
1329             if (minus_n || minus_p) {
1330                 sv_catpv(linestr, "LINE: while (<>) {");
1331                 if (minus_l)
1332                     sv_catpv(linestr,"chomp;");
1333                 if (minus_a){
1334                     if (minus_F){
1335                       char tmpbuf1[50];
1336                       if ( splitstr[0] == '/' || 
1337                            splitstr[0] == '\'' || 
1338                            splitstr[0] == '"' )
1339                             sprintf( tmpbuf1, "@F=split(%s);", splitstr );
1340                         else
1341                             sprintf( tmpbuf1, "@F=split('%s');", splitstr );
1342                         sv_catpv(linestr,tmpbuf1);
1343                     }
1344                     else
1345                         sv_catpv(linestr,"@F=split(' ');");
1346                 }
1347             }
1348             sv_catpv(linestr, "\n");
1349             oldoldbufptr = oldbufptr = s = SvPVX(linestr);
1350             bufend = SvPVX(linestr) + SvCUR(linestr);
1351             if (perldb && curstash != debstash) {
1352                 SV *sv = NEWSV(85,0);
1353
1354                 sv_upgrade(sv, SVt_PVMG);
1355                 sv_setsv(sv,linestr);
1356                 av_store(GvAV(curcop->cop_filegv),(I32)curcop->cop_line,sv);
1357             }
1358             goto retry;
1359         }
1360         do {
1361             if ((s = filter_gets(linestr, rsfp)) == Nullch) {
1362               fake_eof:
1363                 if (rsfp) {
1364                     if (preprocess && !in_eval)
1365                         (void)my_pclose(rsfp);
1366                     else if ((FILE*)rsfp == stdin)
1367                         clearerr(stdin);
1368                     else
1369                         (void)fclose(rsfp);
1370                     rsfp = Nullfp;
1371                 }
1372                 if (!in_eval && (minus_n || minus_p)) {
1373                     sv_setpv(linestr,minus_p ? ";}continue{print" : "");
1374                     sv_catpv(linestr,";}");
1375                     oldoldbufptr = oldbufptr = s = SvPVX(linestr);
1376                     bufend = SvPVX(linestr) + SvCUR(linestr);
1377                     minus_n = minus_p = 0;
1378                     goto retry;
1379                 }
1380                 oldoldbufptr = oldbufptr = s = SvPVX(linestr);
1381                 sv_setpv(linestr,"");
1382                 TOKEN(';');     /* not infinite loop because rsfp is NULL now */
1383             }
1384             if (doextract) {
1385                 if (*s == '#' && s[1] == '!' && instr(s,"perl"))
1386                     doextract = FALSE;
1387
1388                 /* Incest with pod. */
1389                 if (*s == '=' && strnEQ(s, "=cut", 4)) {
1390                     sv_setpv(linestr, "");
1391                     oldoldbufptr = oldbufptr = s = SvPVX(linestr);
1392                     bufend = SvPVX(linestr) + SvCUR(linestr);
1393                     doextract = FALSE;
1394                 }
1395             }
1396             incline(s);
1397         } while (doextract);
1398         oldoldbufptr = oldbufptr = bufptr = s;
1399         if (perldb && curstash != debstash) {
1400             SV *sv = NEWSV(85,0);
1401
1402             sv_upgrade(sv, SVt_PVMG);
1403             sv_setsv(sv,linestr);
1404             av_store(GvAV(curcop->cop_filegv),(I32)curcop->cop_line,sv);
1405         }
1406         bufend = SvPVX(linestr) + SvCUR(linestr);
1407         if (curcop->cop_line == 1) {
1408             while (s < bufend && isSPACE(*s))
1409                 s++;
1410             if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
1411                 s++;
1412             if (!in_eval && *s == '#' && s[1] == '!') {
1413                 d = instr(s,"perl -");
1414                 if (!d)
1415                     d = instr(s,"perl");
1416                 if (!d &&
1417                     !minus_c &&
1418                     !instr(s,"indir") &&
1419                     instr(origargv[0],"perl"))
1420                 {
1421                     char **newargv;
1422                     char *cmd;
1423
1424                     s += 2;
1425                     if (*s == ' ')
1426                         s++;
1427                     cmd = s;
1428                     while (s < bufend && !isSPACE(*s))
1429                         s++;
1430                     *s++ = '\0';
1431                     while (s < bufend && isSPACE(*s))
1432                         s++;
1433                     if (s < bufend) {
1434                         Newz(899,newargv,origargc+3,char*);
1435                         newargv[1] = s;
1436                         while (s < bufend && !isSPACE(*s))
1437                             s++;
1438                         *s = '\0';
1439                         Copy(origargv+1, newargv+2, origargc+1, char*);
1440                     }
1441                     else
1442                         newargv = origargv;
1443                     newargv[0] = cmd;
1444                     execv(cmd,newargv);
1445                     croak("Can't exec %s", cmd);
1446                 }
1447                 if (d) {
1448                     int oldpdb = perldb;
1449                     int oldn = minus_n;
1450                     int oldp = minus_p;
1451
1452                     while (*d && !isSPACE(*d)) d++;
1453                     while (*d == ' ') d++;
1454
1455                     if (*d++ == '-') {
1456                         while (d = moreswitches(d)) ;
1457                         if (perldb && !oldpdb ||
1458                             minus_n && !oldn ||
1459                             minus_p && !oldp)
1460                         {
1461                             sv_setpv(linestr, "");
1462                             oldoldbufptr = oldbufptr = s = SvPVX(linestr);
1463                             bufend = SvPVX(linestr) + SvCUR(linestr);
1464                             preambled = FALSE;
1465                             if (perldb)
1466                                 (void)gv_fetchfile(origfilename);
1467                             goto retry;
1468                         }
1469                     }
1470                 }
1471             }
1472         }
1473         if (lex_formbrack && lex_brackets <= lex_formbrack) {
1474             bufptr = s;
1475             lex_state = LEX_FORMLINE;
1476             return yylex();
1477         }
1478         goto retry;
1479     case ' ': case '\t': case '\f': case '\r': case 013:
1480         s++;
1481         goto retry;
1482     case '#':
1483     case '\n':
1484         if (lex_state != LEX_NORMAL || (in_eval && !rsfp)) {
1485             d = bufend;
1486             while (s < d && *s != '\n')
1487                 s++;
1488             if (s < d)
1489                 s++;
1490             incline(s);
1491             if (lex_formbrack && lex_brackets <= lex_formbrack) {
1492                 bufptr = s;
1493                 lex_state = LEX_FORMLINE;
1494                 return yylex();
1495             }
1496         }
1497         else {
1498             *s = '\0';
1499             bufend = s;
1500         }
1501         goto retry;
1502     case '-':
1503         if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
1504             s++;
1505             bufptr = s;
1506             tmp = *s++;
1507
1508             while (s < bufend && (*s == ' ' || *s == '\t'))
1509                 s++;
1510
1511             if (strnEQ(s,"=>",2)) {
1512                 if (dowarn)
1513                     warn("Ambiguous use of -%c => resolved to \"-%c\" =>",
1514                         tmp, tmp);
1515                 s = force_word(bufptr,WORD,FALSE,FALSE,FALSE);
1516                 OPERATOR('-');          /* unary minus */
1517             }
1518             last_uni = oldbufptr;
1519             last_lop_op = OP_FTEREAD;   /* good enough */
1520             switch (tmp) {
1521             case 'r': FTST(OP_FTEREAD);
1522             case 'w': FTST(OP_FTEWRITE);
1523             case 'x': FTST(OP_FTEEXEC);
1524             case 'o': FTST(OP_FTEOWNED);
1525             case 'R': FTST(OP_FTRREAD);
1526             case 'W': FTST(OP_FTRWRITE);
1527             case 'X': FTST(OP_FTREXEC);
1528             case 'O': FTST(OP_FTROWNED);
1529             case 'e': FTST(OP_FTIS);
1530             case 'z': FTST(OP_FTZERO);
1531             case 's': FTST(OP_FTSIZE);
1532             case 'f': FTST(OP_FTFILE);
1533             case 'd': FTST(OP_FTDIR);
1534             case 'l': FTST(OP_FTLINK);
1535             case 'p': FTST(OP_FTPIPE);
1536             case 'S': FTST(OP_FTSOCK);
1537             case 'u': FTST(OP_FTSUID);
1538             case 'g': FTST(OP_FTSGID);
1539             case 'k': FTST(OP_FTSVTX);
1540             case 'b': FTST(OP_FTBLK);
1541             case 'c': FTST(OP_FTCHR);
1542             case 't': FTST(OP_FTTTY);
1543             case 'T': FTST(OP_FTTEXT);
1544             case 'B': FTST(OP_FTBINARY);
1545             case 'M': gv_fetchpv("\024",TRUE, SVt_PV); FTST(OP_FTMTIME);
1546             case 'A': gv_fetchpv("\024",TRUE, SVt_PV); FTST(OP_FTATIME);
1547             case 'C': gv_fetchpv("\024",TRUE, SVt_PV); FTST(OP_FTCTIME);
1548             default:
1549                 croak("Unrecognized file test: -%c", tmp);
1550                 break;
1551             }
1552         }
1553         tmp = *s++;
1554         if (*s == tmp) {
1555             s++;
1556             if (expect == XOPERATOR)
1557                 TERM(POSTDEC);
1558             else
1559                 OPERATOR(PREDEC);
1560         }
1561         else if (*s == '>') {
1562             s++;
1563             s = skipspace(s);
1564             if (isIDFIRST(*s)) {
1565                 s = force_word(s,METHOD,FALSE,TRUE,FALSE);
1566                 TOKEN(ARROW);
1567             }
1568             else if (*s == '$')
1569                 OPERATOR(ARROW);
1570             else
1571                 TERM(ARROW);
1572         }
1573         if (expect == XOPERATOR)
1574             Aop(OP_SUBTRACT);
1575         else {
1576             if (isSPACE(*s) || !isSPACE(*bufptr))
1577                 check_uni();
1578             OPERATOR('-');              /* unary minus */
1579         }
1580
1581     case '+':
1582         tmp = *s++;
1583         if (*s == tmp) {
1584             s++;
1585             if (expect == XOPERATOR)
1586                 TERM(POSTINC);
1587             else
1588                 OPERATOR(PREINC);
1589         }
1590         if (expect == XOPERATOR)
1591             Aop(OP_ADD);
1592         else {
1593             if (isSPACE(*s) || !isSPACE(*bufptr))
1594                 check_uni();
1595             OPERATOR('+');
1596         }
1597
1598     case '*':
1599         if (expect != XOPERATOR) {
1600             s = scan_ident(s, bufend, tokenbuf, TRUE);
1601             expect = XOPERATOR;
1602             force_ident(tokenbuf, '*');
1603             if (!*tokenbuf)
1604                 PREREF('*');
1605             TERM('*');
1606         }
1607         s++;
1608         if (*s == '*') {
1609             s++;
1610             PWop(OP_POW);
1611         }
1612         Mop(OP_MULTIPLY);
1613
1614     case '%':
1615         if (expect != XOPERATOR) {
1616             s = scan_ident(s, bufend, tokenbuf + 1, TRUE);
1617             if (tokenbuf[1]) {
1618                 expect = XOPERATOR;
1619                 tokenbuf[0] = '%';
1620                 if (in_my) {
1621                     if (strchr(tokenbuf,':'))
1622                         croak(no_myglob,tokenbuf);
1623                     nextval[nexttoke].opval = newOP(OP_PADANY, 0);
1624                     nextval[nexttoke].opval->op_targ = pad_allocmy(tokenbuf);
1625                     force_next(PRIVATEREF);
1626                     TERM('%');
1627                 }
1628                 if (!strchr(tokenbuf,':')) {
1629                     if (tmp = pad_findmy(tokenbuf)) {
1630                         nextval[nexttoke].opval = newOP(OP_PADANY, 0);
1631                         nextval[nexttoke].opval->op_targ = tmp;
1632                         force_next(PRIVATEREF);
1633                         TERM('%');
1634                     }
1635                 }
1636                 force_ident(tokenbuf + 1, *tokenbuf);
1637             }
1638             else
1639                 PREREF('%');
1640             TERM('%');
1641         }
1642         ++s;
1643         Mop(OP_MODULO);
1644
1645     case '^':
1646         s++;
1647         BOop(OP_BIT_XOR);
1648     case '[':
1649         lex_brackets++;
1650         /* FALL THROUGH */
1651     case '~':
1652     case ',':
1653         tmp = *s++;
1654         OPERATOR(tmp);
1655     case ':':
1656         if (s[1] == ':') {
1657             len = 0;
1658             goto just_a_word;
1659         }
1660         s++;
1661         OPERATOR(':');
1662     case '(':
1663         s++;
1664         if (last_lop == oldoldbufptr || last_uni == oldoldbufptr)
1665             oldbufptr = oldoldbufptr;           /* allow print(STDOUT 123) */
1666         else
1667             expect = XTERM;
1668         TOKEN('(');
1669     case ';':
1670         if (curcop->cop_line < copline)
1671             copline = curcop->cop_line;
1672         tmp = *s++;
1673         OPERATOR(tmp);
1674     case ')':
1675         tmp = *s++;
1676         s = skipspace(s);
1677         if (*s == '{')
1678             PREBLOCK(tmp);
1679         TERM(tmp);
1680     case ']':
1681         s++;
1682         if (lex_brackets <= 0)
1683             yyerror("Unmatched right bracket");
1684         else
1685             --lex_brackets;
1686         if (lex_state == LEX_INTERPNORMAL) {
1687             if (lex_brackets == 0) {
1688                 if (*s != '[' && *s != '{' && (*s != '-' || s[1] != '>'))
1689                     lex_state = LEX_INTERPEND;
1690             }
1691         }
1692         TOKEN(']');
1693     case '{':
1694       leftbracket:
1695         s++;
1696         if (lex_brackets > 100) {
1697             char* newlb = (char*)realloc(lex_brackstack, lex_brackets + 1);
1698             if (newlb != lex_brackstack) {
1699                 SAVEFREEPV(newlb);
1700                 lex_brackstack = newlb;
1701             }
1702         }
1703         switch (expect) {
1704         case XTERM:
1705             if (lex_formbrack) {
1706                 s--;
1707                 PRETERMBLOCK(DO);
1708             }
1709             if (oldoldbufptr == last_lop)
1710                 lex_brackstack[lex_brackets++] = XTERM;
1711             else
1712                 lex_brackstack[lex_brackets++] = XOPERATOR;
1713             OPERATOR(HASHBRACK);
1714             break;
1715         case XOPERATOR:
1716             while (s < bufend && (*s == ' ' || *s == '\t'))
1717                 s++;
1718             if (s < bufend && isALPHA(*s)) {
1719                 d = scan_word(s, tokenbuf, FALSE, &len);
1720                 while (d < bufend && (*d == ' ' || *d == '\t'))
1721                     d++;
1722                 if (*d == '}') {
1723                     if (dowarn &&
1724                       (keyword(tokenbuf, len) ||
1725                        perl_get_cv(tokenbuf, FALSE) ))
1726                         warn("Ambiguous use of {%s} resolved to {\"%s\"}",
1727                             tokenbuf, tokenbuf);
1728                     s = force_word(s,WORD,FALSE,TRUE,FALSE);
1729                 }
1730             }
1731             /* FALL THROUGH */
1732         case XBLOCK:
1733             lex_brackstack[lex_brackets++] = XSTATE;
1734             expect = XSTATE;
1735             break;
1736         case XTERMBLOCK:
1737             lex_brackstack[lex_brackets++] = XOPERATOR;
1738             expect = XSTATE;
1739             break;
1740         default: {
1741                 char *t;
1742                 if (oldoldbufptr == last_lop)
1743                     lex_brackstack[lex_brackets++] = XTERM;
1744                 else
1745                     lex_brackstack[lex_brackets++] = XOPERATOR;
1746                 s = skipspace(s);
1747                 if (*s == '}')
1748                     OPERATOR(HASHBRACK);
1749                 if (isALPHA(*s)) {
1750                     for (t = s; t < bufend && isALPHA(*t); t++) ;
1751                 }
1752                 else if (*s == '\'' || *s == '"') {
1753                     t = strchr(s+1,*s);
1754                     if (!t++)
1755                         t = s;
1756                 }
1757                 else
1758                     t = s;
1759                 while (t < bufend && isSPACE(*t))
1760                     t++;
1761                 if ((*t == ',' && !isLOWER(*s)) || (*t == '=' && t[1] == '>'))
1762                     OPERATOR(HASHBRACK);
1763                 if (expect == XREF)
1764                     expect = XTERM;
1765                 else {
1766                     lex_brackstack[lex_brackets-1] = XSTATE;
1767                     expect = XSTATE;
1768                 }
1769             }
1770             break;
1771         }
1772         yylval.ival = curcop->cop_line;
1773         if (isSPACE(*s) || *s == '#')
1774             copline = NOLINE;   /* invalidate current command line number */
1775         TOKEN('{');
1776     case '}':
1777       rightbracket:
1778         s++;
1779         if (lex_brackets <= 0)
1780             yyerror("Unmatched right bracket");
1781         else
1782             expect = (expectation)lex_brackstack[--lex_brackets];
1783         if (lex_brackets < lex_formbrack)
1784             lex_formbrack = 0;
1785         if (lex_state == LEX_INTERPNORMAL) {
1786             if (lex_brackets == 0) {
1787                 if (lex_fakebrack) {
1788                     lex_state = LEX_INTERPEND;
1789                     bufptr = s;
1790                     return yylex();             /* ignore fake brackets */
1791                 }
1792                 if (*s != '[' && *s != '{' && (*s != '-' || s[1] != '>'))
1793                     lex_state = LEX_INTERPEND;
1794             }
1795         }
1796         if (lex_brackets < lex_fakebrack) {
1797             bufptr = s;
1798             lex_fakebrack = 0;
1799             return yylex();             /* ignore fake brackets */
1800         }
1801         force_next('}');
1802         TOKEN(';');
1803     case '&':
1804         s++;
1805         tmp = *s++;
1806         if (tmp == '&')
1807             AOPERATOR(ANDAND);
1808         s--;
1809         if (expect == XOPERATOR) {
1810             if (isALPHA(*s) && bufptr == SvPVX(linestr)) {
1811                 curcop->cop_line--;
1812                 warn(warn_nosemi);
1813                 curcop->cop_line++;
1814             }
1815             BAop(OP_BIT_AND);
1816         }
1817
1818         s = scan_ident(s-1, bufend, tokenbuf, TRUE);
1819         if (*tokenbuf) {
1820             expect = XOPERATOR;
1821             force_ident(tokenbuf, '&');
1822         }
1823         else
1824             PREREF('&');
1825         TERM('&');
1826
1827     case '|':
1828         s++;
1829         tmp = *s++;
1830         if (tmp == '|')
1831             AOPERATOR(OROR);
1832         s--;
1833         BOop(OP_BIT_OR);
1834     case '=':
1835         s++;
1836         tmp = *s++;
1837         if (tmp == '=')
1838             Eop(OP_EQ);
1839         if (tmp == '>')
1840             OPERATOR(',');
1841         if (tmp == '~')
1842             PMop(OP_MATCH);
1843         if (dowarn && tmp && isSPACE(*s) && strchr("+-*/%.^&|<",tmp))
1844             warn("Reversed %c= operator",tmp);
1845         s--;
1846         if (expect == XSTATE && isALPHA(tmp) &&
1847                 (s == SvPVX(linestr)+1 || s[-2] == '\n') )
1848         {
1849             s = bufend;
1850             doextract = TRUE;
1851             goto retry;
1852         }
1853         if (lex_brackets < lex_formbrack) {
1854             char *t;
1855             for (t = s; *t == ' ' || *t == '\t'; t++) ;
1856             if (*t == '\n' || *t == '#') {
1857                 s--;
1858                 expect = XBLOCK;
1859                 goto leftbracket;
1860             }
1861         }
1862         yylval.ival = 0;
1863         OPERATOR(ASSIGNOP);
1864     case '!':
1865         s++;
1866         tmp = *s++;
1867         if (tmp == '=')
1868             Eop(OP_NE);
1869         if (tmp == '~')
1870             PMop(OP_NOT);
1871         s--;
1872         OPERATOR('!');
1873     case '<':
1874         if (expect != XOPERATOR) {
1875             if (s[1] != '<' && !strchr(s,'>'))
1876                 check_uni();
1877             if (s[1] == '<')
1878                 s = scan_heredoc(s);
1879             else
1880                 s = scan_inputsymbol(s);
1881             TERM(sublex_start());
1882         }
1883         s++;
1884         tmp = *s++;
1885         if (tmp == '<')
1886             SHop(OP_LEFT_SHIFT);
1887         if (tmp == '=') {
1888             tmp = *s++;
1889             if (tmp == '>')
1890                 Eop(OP_NCMP);
1891             s--;
1892             Rop(OP_LE);
1893         }
1894         s--;
1895         Rop(OP_LT);
1896     case '>':
1897         s++;
1898         tmp = *s++;
1899         if (tmp == '>')
1900             SHop(OP_RIGHT_SHIFT);
1901         if (tmp == '=')
1902             Rop(OP_GE);
1903         s--;
1904         Rop(OP_GT);
1905
1906     case '$':
1907         if (s[1] == '#'  && (isALPHA(s[2]) || strchr("_{$:", s[2]))) {
1908             s = scan_ident(s+1, bufend, tokenbuf+1, FALSE);
1909             if (expect == XOPERATOR) {
1910                 if (lex_formbrack && lex_brackets == lex_formbrack) {
1911                     expect = XTERM;
1912                     depcom();
1913                     return ','; /* grandfather non-comma-format format */
1914                 }
1915                 else
1916                     no_op("Array length",s);
1917             }
1918             else if (!tokenbuf[1])
1919                 PREREF(DOLSHARP);
1920             if (!strchr(tokenbuf+1,':')) {
1921                 tokenbuf[0] = '@';
1922                 if (tmp = pad_findmy(tokenbuf)) {
1923                     nextval[nexttoke].opval = newOP(OP_PADANY, 0);
1924                     nextval[nexttoke].opval->op_targ = tmp;
1925                     expect = XOPERATOR;
1926                     force_next(PRIVATEREF);
1927                     TOKEN(DOLSHARP);
1928                 }
1929             }
1930             expect = XOPERATOR;
1931             force_ident(tokenbuf+1, *tokenbuf);
1932             TOKEN(DOLSHARP);
1933         }
1934         s = scan_ident(s, bufend, tokenbuf+1, FALSE);
1935         if (expect == XOPERATOR) {
1936             if (lex_formbrack && lex_brackets == lex_formbrack) {
1937                 expect = XTERM;
1938                 depcom();
1939                 return ',';     /* grandfather non-comma-format format */
1940             }
1941             else
1942                 no_op("Scalar",s);
1943         }
1944         if (tokenbuf[1]) {
1945             expectation oldexpect = expect;
1946
1947             /* This kludge not intended to be bulletproof. */
1948             if (tokenbuf[1] == '[' && !tokenbuf[2]) {
1949                 yylval.opval = newSVOP(OP_CONST, 0,
1950                                         newSViv((IV)compiling.cop_arybase));
1951                 yylval.opval->op_private = OPpCONST_ARYBASE;
1952                 TERM(THING);
1953             }
1954             tokenbuf[0] = '$';
1955             if (dowarn) {
1956                 char *t;
1957                 if (*s == '[' && oldexpect != XREF) {
1958                     for (t = s+1; isSPACE(*t) || isALNUM(*t) || *t == '$'; t++) ;
1959                     if (*t++ == ',') {
1960                         bufptr = skipspace(bufptr);
1961                         while (t < bufend && *t != ']') t++;
1962                         warn("Multidimensional syntax %.*s not supported",
1963                             t-bufptr+1, bufptr);
1964                     }
1965                 }
1966                 if (*s == '{' && strEQ(tokenbuf, "$SIG") &&
1967                   (t = strchr(s,'}')) && (t = strchr(t,'='))) {
1968                     char tmpbuf[1024];
1969                     STRLEN len;
1970                     for (t++; isSPACE(*t); t++) ;
1971                     if (isIDFIRST(*t)) {
1972                         t = scan_word(t, tmpbuf, TRUE, &len);
1973                         if (*t != '(' && perl_get_cv(tmpbuf, FALSE))
1974                             warn("You need to quote \"%s\"", tmpbuf);
1975                     }
1976                 }
1977             }
1978             expect = XOPERATOR;
1979             if (lex_state == LEX_NORMAL && isSPACE(*s)) {
1980                 bool islop = (last_lop == oldoldbufptr);
1981                 s = skipspace(s);
1982                 if (!islop || last_lop_op == OP_GREPSTART)
1983                     expect = XOPERATOR;
1984                 else if (strchr("$@\"'`q", *s))
1985                     expect = XTERM;             /* e.g. print $fh "foo" */
1986                 else if (strchr("&*<%", *s) && isIDFIRST(s[1]))
1987                     expect = XTERM;             /* e.g. print $fh &sub */
1988                 else if (isDIGIT(*s))
1989                     expect = XTERM;             /* e.g. print $fh 3 */
1990                 else if (*s == '.' && isDIGIT(s[1]))
1991                     expect = XTERM;             /* e.g. print $fh .3 */
1992                 else if (strchr("/?-+", *s) && !isSPACE(s[1]))
1993                     expect = XTERM;             /* e.g. print $fh -1 */
1994                 else if (*s == '<' && s[1] == '<' && !isSPACE(s[2]))
1995                     expect = XTERM;             /* print $fh <<"EOF" */
1996             }
1997             if (in_my) {
1998                 if (strchr(tokenbuf,':'))
1999                     croak(no_myglob,tokenbuf);
2000                 nextval[nexttoke].opval = newOP(OP_PADANY, 0);
2001                 nextval[nexttoke].opval->op_targ = pad_allocmy(tokenbuf);
2002                 force_next(PRIVATEREF);
2003             }
2004             else if (!strchr(tokenbuf,':')) {
2005                 if (oldexpect != XREF || oldoldbufptr == last_lop) {
2006                     if (*s == '[')
2007                         tokenbuf[0] = '@';
2008                     else if (*s == '{')
2009                         tokenbuf[0] = '%';
2010                 }
2011                 if (tmp = pad_findmy(tokenbuf)) {
2012                     nextval[nexttoke].opval = newOP(OP_PADANY, 0);
2013                     nextval[nexttoke].opval->op_targ = tmp;
2014                     force_next(PRIVATEREF);
2015                 }
2016                 else {
2017                     if ((tainting || !euid) &&
2018                         !isLOWER(tokenbuf[1]) &&
2019                         (isDIGIT(tokenbuf[1]) ||
2020                          strchr("&`'+", tokenbuf[1]) ||
2021                          instr(tokenbuf,"MATCH") ))
2022                         hints |= HINT_BLOCK_SCOPE; /* Can't optimize block out*/
2023                     force_ident(tokenbuf+1, *tokenbuf);
2024                 }
2025             }
2026             else
2027                 force_ident(tokenbuf+1, *tokenbuf);
2028         }
2029         else {
2030             if (s == bufend)
2031                 yyerror("Final $ should be \\$ or $name");
2032             PREREF('$');
2033         }
2034         TOKEN('$');
2035
2036     case '@':
2037         s = scan_ident(s, bufend, tokenbuf+1, FALSE);
2038         if (expect == XOPERATOR)
2039             no_op("Array",s);
2040         if (tokenbuf[1]) {
2041             GV* gv;
2042
2043             tokenbuf[0] = '@';
2044             expect = XOPERATOR;
2045             if (in_my) {
2046                 if (strchr(tokenbuf,':'))
2047                     croak(no_myglob,tokenbuf);
2048                 nextval[nexttoke].opval = newOP(OP_PADANY, 0);
2049                 nextval[nexttoke].opval->op_targ = pad_allocmy(tokenbuf);
2050                 force_next(PRIVATEREF);
2051                 TERM('@');
2052             }
2053             else if (!strchr(tokenbuf,':')) {
2054                 if (*s == '{')
2055                     tokenbuf[0] = '%';
2056                 if (tmp = pad_findmy(tokenbuf)) {
2057                     nextval[nexttoke].opval = newOP(OP_PADANY, 0);
2058                     nextval[nexttoke].opval->op_targ = tmp;
2059                     force_next(PRIVATEREF);
2060                     TERM('@');
2061                 }
2062             }
2063
2064             /* Force them to make up their mind on "@foo". */
2065             if (lex_state != LEX_NORMAL &&
2066                     ( !(gv = gv_fetchpv(tokenbuf+1, FALSE, SVt_PVAV)) ||
2067                       (*tokenbuf == '@'
2068                         ? !GvAV(gv)
2069                         : !GvHV(gv) )))
2070             {
2071                 char tmpbuf[1024];
2072                 sprintf(tmpbuf, "Literal @%s now requires backslash",tokenbuf+1);
2073                 yyerror(tmpbuf);
2074             }
2075
2076             /* Warn about @ where they meant $. */
2077             if (dowarn) {
2078                 if (*s == '[' || *s == '{') {
2079                     char *t = s + 1;
2080                     while (*t && (isALNUM(*t) || strchr(" \t$#+-'\"", *t)))
2081                         t++;
2082                     if (*t == '}' || *t == ']') {
2083                         t++;
2084                         bufptr = skipspace(bufptr);
2085                         warn("Scalar value %.*s better written as $%.*s",
2086                             t-bufptr, bufptr, t-bufptr-1, bufptr+1);
2087                     }
2088                 }
2089             }
2090             force_ident(tokenbuf+1, *tokenbuf);
2091         }
2092         else {
2093             if (s == bufend)
2094                 yyerror("Final @ should be \\@ or @name");
2095             PREREF('@');
2096         }
2097         TERM('@');
2098
2099     case '/':                   /* may either be division or pattern */
2100     case '?':                   /* may either be conditional or pattern */
2101         if (expect != XOPERATOR) {
2102             check_uni();
2103             s = scan_pat(s);
2104             TERM(sublex_start());
2105         }
2106         tmp = *s++;
2107         if (tmp == '/')
2108             Mop(OP_DIVIDE);
2109         OPERATOR(tmp);
2110
2111     case '.':
2112         if (lex_formbrack && lex_brackets == lex_formbrack && s[1] == '\n' &&
2113                 (s == SvPVX(linestr) || s[-1] == '\n') ) {
2114             lex_formbrack = 0;
2115             expect = XSTATE;
2116             goto rightbracket;
2117         }
2118         if (expect == XOPERATOR || !isDIGIT(s[1])) {
2119             tmp = *s++;
2120             if (*s == tmp) {
2121                 s++;
2122                 if (*s == tmp) {
2123                     s++;
2124                     yylval.ival = OPf_SPECIAL;
2125                 }
2126                 else
2127                     yylval.ival = 0;
2128                 OPERATOR(DOTDOT);
2129             }
2130             if (expect != XOPERATOR)
2131                 check_uni();
2132             Aop(OP_CONCAT);
2133         }
2134         /* FALL THROUGH */
2135     case '0': case '1': case '2': case '3': case '4':
2136     case '5': case '6': case '7': case '8': case '9':
2137         s = scan_num(s);
2138         if (expect == XOPERATOR)
2139             no_op("Number",s);
2140         TERM(THING);
2141
2142     case '\'':
2143         s = scan_str(s);
2144         if (expect == XOPERATOR) {
2145             if (lex_formbrack && lex_brackets == lex_formbrack) {
2146                 expect = XTERM;
2147                 depcom();
2148                 return ',';     /* grandfather non-comma-format format */
2149             }
2150             else
2151                 no_op("String",s);
2152         }
2153         if (!s)
2154             missingterm((char*)0);
2155         yylval.ival = OP_CONST;
2156         TERM(sublex_start());
2157
2158     case '"':
2159         s = scan_str(s);
2160         if (expect == XOPERATOR) {
2161             if (lex_formbrack && lex_brackets == lex_formbrack) {
2162                 expect = XTERM;
2163                 depcom();
2164                 return ',';     /* grandfather non-comma-format format */
2165             }
2166             else
2167                 no_op("String",s);
2168         }
2169         if (!s)
2170             missingterm((char*)0);
2171         yylval.ival = OP_STRINGIFY;
2172         TERM(sublex_start());
2173
2174     case '`':
2175         s = scan_str(s);
2176         if (expect == XOPERATOR)
2177             no_op("Backticks",s);
2178         if (!s)
2179             missingterm((char*)0);
2180         yylval.ival = OP_BACKTICK;
2181         set_csh();
2182         TERM(sublex_start());
2183
2184     case '\\':
2185         s++;
2186         if (dowarn && lex_inwhat && isDIGIT(*s))
2187             warn("Can't use \\%c to mean $%c in expression", *s, *s);
2188         if (expect == XOPERATOR)
2189             no_op("Backslash",s);
2190         OPERATOR(REFGEN);
2191
2192     case 'x':
2193         if (isDIGIT(s[1]) && expect == XOPERATOR) {
2194             s++;
2195             Mop(OP_REPEAT);
2196         }
2197         goto keylookup;
2198
2199     case '_':
2200     case 'a': case 'A':
2201     case 'b': case 'B':
2202     case 'c': case 'C':
2203     case 'd': case 'D':
2204     case 'e': case 'E':
2205     case 'f': case 'F':
2206     case 'g': case 'G':
2207     case 'h': case 'H':
2208     case 'i': case 'I':
2209     case 'j': case 'J':
2210     case 'k': case 'K':
2211     case 'l': case 'L':
2212     case 'm': case 'M':
2213     case 'n': case 'N':
2214     case 'o': case 'O':
2215     case 'p': case 'P':
2216     case 'q': case 'Q':
2217     case 'r': case 'R':
2218     case 's': case 'S':
2219     case 't': case 'T':
2220     case 'u': case 'U':
2221     case 'v': case 'V':
2222     case 'w': case 'W':
2223               case 'X':
2224     case 'y': case 'Y':
2225     case 'z': case 'Z':
2226
2227       keylookup:
2228         bufptr = s;
2229         s = scan_word(s, tokenbuf, FALSE, &len);
2230         
2231         tmp = keyword(tokenbuf, len);
2232
2233         /* Is this a word before a => operator? */
2234         d = s;
2235         while (d < bufend && (*d == ' ' || *d == '\t'))
2236                 d++;    /* no comments skipped here, or s### is misparsed */
2237         if (strnEQ(d,"=>",2)) {
2238             CLINE;
2239             if (dowarn && (tmp || perl_get_cv(tokenbuf, FALSE)))
2240                 warn("Ambiguous use of %s => resolved to \"%s\" =>",
2241                         tokenbuf, tokenbuf);
2242             yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(tokenbuf,0));
2243             yylval.opval->op_private = OPpCONST_BARE;
2244             TERM(WORD);
2245         }
2246
2247         if (tmp < 0) {                  /* second-class keyword? */
2248             GV* gv;
2249             if (expect != XOPERATOR &&
2250               (*s != ':' || s[1] != ':') &&
2251               (gv = gv_fetchpv(tokenbuf,FALSE, SVt_PVCV)) &&
2252               (GvFLAGS(gv) & GVf_IMPORTED) &&
2253               GvCV(gv))
2254             {
2255                 tmp = 0;
2256             }
2257             else
2258                 tmp = -tmp;
2259         }
2260
2261       reserved_word:
2262         switch (tmp) {
2263
2264         default:                        /* not a keyword */
2265           just_a_word: {
2266                 GV *gv;
2267                 char lastchar = (bufptr == oldoldbufptr ? 0 : bufptr[-1]);
2268
2269                 /* Get the rest if it looks like a package qualifier */
2270
2271                 if (*s == '\'' || *s == ':' && s[1] == ':') {
2272                     s = scan_word(s, tokenbuf + len, TRUE, &len);
2273                     if (!len)
2274                         croak("Bad name after %s::", tokenbuf);
2275                 }
2276
2277                 /* Do special processing at start of statement. */
2278
2279                 if (expect == XSTATE) {
2280                     while (isSPACE(*s)) s++;
2281                     if (*s == ':') {    /* It's a label. */
2282                         yylval.pval = savepv(tokenbuf);
2283                         s++;
2284                         CLINE;
2285                         TOKEN(LABEL);
2286                     }
2287                 }
2288                 else if (expect == XOPERATOR) {
2289                     if (bufptr == SvPVX(linestr)) {
2290                         curcop->cop_line--;
2291                         warn(warn_nosemi);
2292                         curcop->cop_line++;
2293                     }
2294                     else
2295                         no_op("Bare word",s);
2296                 }
2297
2298                 /* Look for a subroutine with this name in current package. */
2299
2300                 gv = gv_fetchpv(tokenbuf,FALSE, SVt_PVCV);
2301
2302                 /* Presume this is going to be a bareword of some sort. */
2303
2304                 CLINE;
2305                 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(tokenbuf,0));
2306                 yylval.opval->op_private = OPpCONST_BARE;
2307
2308                 /* See if it's the indirect object for a list operator. */
2309
2310                 if (oldoldbufptr &&
2311                     oldoldbufptr < bufptr &&
2312                     (oldoldbufptr == last_lop || oldoldbufptr == last_uni) &&
2313                     /* NO SKIPSPACE BEFORE HERE! */
2314                     (expect == XREF ||
2315                      (opargs[last_lop_op] >> OASHIFT & 7) == OA_FILEREF) )
2316                 {
2317                     bool immediate_paren = *s == '(';
2318
2319                     /* (Now we can afford to cross potential line boundary.) */
2320                     s = skipspace(s);
2321
2322                     /* Two barewords in a row may indicate method call. */
2323
2324                     if ((isALPHA(*s) || *s == '$') && (tmp=intuit_method(s,gv)))
2325                         return tmp;
2326
2327                     /* If not a declared subroutine, it's an indirect object. */
2328                     /* (But it's an indir obj regardless for sort.) */
2329
2330                     if (last_lop_op == OP_SORT ||
2331                       (!immediate_paren && (!gv || !GvCV(gv))) ) {
2332                         expect = (last_lop == oldoldbufptr) ? XTERM : XOPERATOR;
2333                         goto bareword;
2334                     }
2335                 }
2336
2337                 /* If followed by a paren, it's certainly a subroutine. */
2338
2339                 expect = XOPERATOR;
2340                 s = skipspace(s);
2341                 if (*s == '(') {
2342                     CLINE;
2343                     nextval[nexttoke].opval = yylval.opval;
2344                     expect = XOPERATOR;
2345                     force_next(WORD);
2346                     TOKEN('&');
2347                 }
2348
2349                 /* If followed by var or block, call it a method (unless sub) */
2350
2351                 if ((*s == '$' || *s == '{') && (!gv || !GvCV(gv))) {
2352                     last_lop = oldbufptr;
2353                     last_lop_op = OP_METHOD;
2354                     PREBLOCK(METHOD);
2355                 }
2356
2357                 /* If followed by a bareword, see if it looks like indir obj. */
2358
2359                 if ((isALPHA(*s) || *s == '$') && (tmp = intuit_method(s,gv)))
2360                     return tmp;
2361
2362                 /* Not a method, so call it a subroutine (if defined) */
2363
2364                 if (gv && GvCV(gv)) {
2365                     nextval[nexttoke].opval = yylval.opval;
2366                     if (*s == '(') {
2367                         expect = XTERM;
2368                         force_next(WORD);
2369                         TOKEN('&');
2370                     }
2371                     if (lastchar == '-')
2372                         warn("Ambiguous use of -%s resolved as -&%s()",
2373                                 tokenbuf, tokenbuf);
2374                     last_lop = oldbufptr;
2375                     last_lop_op = OP_ENTERSUB;
2376                     expect = XTERM;
2377                     force_next(WORD);
2378                     TOKEN(NOAMP);
2379                 }
2380
2381                 if (hints & HINT_STRICT_SUBS &&
2382                     lastchar != '-' &&
2383                     strnNE(s,"->",2) &&
2384                     last_lop_op != OP_ACCEPT &&
2385                     last_lop_op != OP_PIPE_OP &&
2386                     last_lop_op != OP_SOCKPAIR)
2387                 {
2388                     warn(
2389                      "Bareword \"%s\" not allowed while \"strict subs\" in use",
2390                         tokenbuf);
2391                     ++error_count;
2392                 }
2393
2394                 /* Call it a bare word */
2395
2396             bareword:
2397                 if (dowarn) {
2398                     if (lastchar != '-') {
2399                         for (d = tokenbuf; *d && isLOWER(*d); d++) ;
2400                         if (!*d)
2401                             warn(warn_reserved, tokenbuf);
2402                     }
2403                 }
2404                 if (lastchar && strchr("*%&", lastchar)) {
2405                     warn("Operator or semicolon missing before %c%s",
2406                         lastchar, tokenbuf);
2407                     warn("Ambiguous use of %c resolved as operator %c",
2408                         lastchar, lastchar);
2409                 }
2410                 TOKEN(WORD);
2411             }
2412
2413         case KEY___LINE__:
2414         case KEY___FILE__: {
2415             if (tokenbuf[2] == 'L')
2416                 (void)sprintf(tokenbuf,"%ld",(long)curcop->cop_line);
2417             else
2418                 strcpy(tokenbuf, SvPVX(GvSV(curcop->cop_filegv)));
2419             yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(tokenbuf,0));
2420             TERM(THING);
2421         }
2422
2423         case KEY___DATA__:
2424         case KEY___END__: {
2425             GV *gv;
2426
2427             /*SUPPRESS 560*/
2428             if (!in_eval || tokenbuf[2] == 'D') {
2429                 char dname[256];
2430                 char *pname = "main";
2431                 if (tokenbuf[2] == 'D')
2432                     pname = HvNAME(curstash ? curstash : defstash);
2433                 sprintf(dname,"%s::DATA", pname);
2434                 gv = gv_fetchpv(dname,TRUE, SVt_PVIO);
2435                 SvMULTI_on(gv);
2436                 if (!GvIO(gv))
2437                     GvIOp(gv) = newIO();
2438                 IoIFP(GvIOp(gv)) = rsfp;
2439 #if defined(HAS_FCNTL) && defined(F_SETFD)
2440                 {
2441                     int fd = fileno(rsfp);
2442                     fcntl(fd,F_SETFD,fd >= 3);
2443                 }
2444 #endif
2445                 if (preprocess)
2446                     IoTYPE(GvIOp(gv)) = '|';
2447                 else if ((FILE*)rsfp == stdin)
2448                     IoTYPE(GvIOp(gv)) = '-';
2449                 else
2450                     IoTYPE(GvIOp(gv)) = '<';
2451                 rsfp = Nullfp;
2452             }
2453             goto fake_eof;
2454         }
2455
2456         case KEY_AUTOLOAD:
2457         case KEY_DESTROY:
2458         case KEY_BEGIN:
2459         case KEY_END:
2460             if (expect == XSTATE) {
2461                 s = bufptr;
2462                 goto really_sub;
2463             }
2464             goto just_a_word;
2465
2466         case KEY_CORE:
2467             if (*s == ':' && s[1] == ':') {
2468                 s += 2;
2469                 d = s;
2470                 s = scan_word(s, tokenbuf, FALSE, &len);
2471                 tmp = keyword(tokenbuf, len);
2472                 if (tmp < 0)
2473                     tmp = -tmp;
2474                 goto reserved_word;
2475             }
2476             goto just_a_word;
2477
2478         case KEY_abs:
2479             UNI(OP_ABS);
2480
2481         case KEY_alarm:
2482             UNI(OP_ALARM);
2483
2484         case KEY_accept:
2485             LOP(OP_ACCEPT,XTERM);
2486
2487         case KEY_and:
2488             OPERATOR(ANDOP);
2489
2490         case KEY_atan2:
2491             LOP(OP_ATAN2,XTERM);
2492
2493         case KEY_bind:
2494             LOP(OP_BIND,XTERM);
2495
2496         case KEY_binmode:
2497             UNI(OP_BINMODE);
2498
2499         case KEY_bless:
2500             LOP(OP_BLESS,XTERM);
2501
2502         case KEY_chop:
2503             UNI(OP_CHOP);
2504
2505         case KEY_continue:
2506             PREBLOCK(CONTINUE);
2507
2508         case KEY_chdir:
2509             (void)gv_fetchpv("ENV",TRUE, SVt_PVHV);     /* may use HOME */
2510             UNI(OP_CHDIR);
2511
2512         case KEY_close:
2513             UNI(OP_CLOSE);
2514
2515         case KEY_closedir:
2516             UNI(OP_CLOSEDIR);
2517
2518         case KEY_cmp:
2519             Eop(OP_SCMP);
2520
2521         case KEY_caller:
2522             UNI(OP_CALLER);
2523
2524         case KEY_crypt:
2525 #ifdef FCRYPT
2526             if (!cryptseen++)
2527                 init_des();
2528 #endif
2529             LOP(OP_CRYPT,XTERM);
2530
2531         case KEY_chmod:
2532             if (dowarn) {
2533                 for (d = s; d < bufend && (isSPACE(*d) || *d == '('); d++) ;
2534                 if (*d != '0' && isDIGIT(*d))
2535                     yywarn("chmod: mode argument is missing initial 0");
2536             }
2537             LOP(OP_CHMOD,XTERM);
2538
2539         case KEY_chown:
2540             LOP(OP_CHOWN,XTERM);
2541
2542         case KEY_connect:
2543             LOP(OP_CONNECT,XTERM);
2544
2545         case KEY_chr:
2546             UNI(OP_CHR);
2547
2548         case KEY_cos:
2549             UNI(OP_COS);
2550
2551         case KEY_chroot:
2552             UNI(OP_CHROOT);
2553
2554         case KEY_do:
2555             s = skipspace(s);
2556             if (*s == '{')
2557                 PRETERMBLOCK(DO);
2558             if (*s != '\'')
2559                 s = force_word(s,WORD,FALSE,TRUE,FALSE);
2560             OPERATOR(DO);
2561
2562         case KEY_die:
2563             hints |= HINT_BLOCK_SCOPE;
2564             LOP(OP_DIE,XTERM);
2565
2566         case KEY_defined:
2567             UNI(OP_DEFINED);
2568
2569         case KEY_delete:
2570             UNI(OP_DELETE);
2571
2572         case KEY_dbmopen:
2573             gv_fetchpv("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
2574             LOP(OP_DBMOPEN,XTERM);
2575
2576         case KEY_dbmclose:
2577             UNI(OP_DBMCLOSE);
2578
2579         case KEY_dump:
2580             s = force_word(s,WORD,TRUE,FALSE,FALSE);
2581             LOOPX(OP_DUMP);
2582
2583         case KEY_else:
2584             PREBLOCK(ELSE);
2585
2586         case KEY_elsif:
2587             yylval.ival = curcop->cop_line;
2588             OPERATOR(ELSIF);
2589
2590         case KEY_eq:
2591             Eop(OP_SEQ);
2592
2593         case KEY_exists:
2594             UNI(OP_EXISTS);
2595             
2596         case KEY_exit:
2597             UNI(OP_EXIT);
2598
2599         case KEY_eval:
2600             s = skipspace(s);
2601             expect = (*s == '{') ? XTERMBLOCK : XTERM;
2602             UNIBRACK(OP_ENTEREVAL);
2603
2604         case KEY_eof:
2605             UNI(OP_EOF);
2606
2607         case KEY_exp:
2608             UNI(OP_EXP);
2609
2610         case KEY_each:
2611             UNI(OP_EACH);
2612
2613         case KEY_exec:
2614             set_csh();
2615             LOP(OP_EXEC,XREF);
2616
2617         case KEY_endhostent:
2618             FUN0(OP_EHOSTENT);
2619
2620         case KEY_endnetent:
2621             FUN0(OP_ENETENT);
2622
2623         case KEY_endservent:
2624             FUN0(OP_ESERVENT);
2625
2626         case KEY_endprotoent:
2627             FUN0(OP_EPROTOENT);
2628
2629         case KEY_endpwent:
2630             FUN0(OP_EPWENT);
2631
2632         case KEY_endgrent:
2633             FUN0(OP_EGRENT);
2634
2635         case KEY_for:
2636         case KEY_foreach:
2637             yylval.ival = curcop->cop_line;
2638             while (s < bufend && isSPACE(*s))
2639                 s++;
2640             if (isIDFIRST(*s))
2641                 croak("Missing $ on loop variable");
2642             OPERATOR(FOR);
2643
2644         case KEY_formline:
2645             LOP(OP_FORMLINE,XTERM);
2646
2647         case KEY_fork:
2648             FUN0(OP_FORK);
2649
2650         case KEY_fcntl:
2651             LOP(OP_FCNTL,XTERM);
2652
2653         case KEY_fileno:
2654             UNI(OP_FILENO);
2655
2656         case KEY_flock:
2657             LOP(OP_FLOCK,XTERM);
2658
2659         case KEY_gt:
2660             Rop(OP_SGT);
2661
2662         case KEY_ge:
2663             Rop(OP_SGE);
2664
2665         case KEY_grep:
2666             LOP(OP_GREPSTART, *s == '(' ? XTERM : XREF);
2667
2668         case KEY_goto:
2669             s = force_word(s,WORD,TRUE,FALSE,FALSE);
2670             LOOPX(OP_GOTO);
2671
2672         case KEY_gmtime:
2673             UNI(OP_GMTIME);
2674
2675         case KEY_getc:
2676             UNI(OP_GETC);
2677
2678         case KEY_getppid:
2679             FUN0(OP_GETPPID);
2680
2681         case KEY_getpgrp:
2682             UNI(OP_GETPGRP);
2683
2684         case KEY_getpriority:
2685             LOP(OP_GETPRIORITY,XTERM);
2686
2687         case KEY_getprotobyname:
2688             UNI(OP_GPBYNAME);
2689
2690         case KEY_getprotobynumber:
2691             LOP(OP_GPBYNUMBER,XTERM);
2692
2693         case KEY_getprotoent:
2694             FUN0(OP_GPROTOENT);
2695
2696         case KEY_getpwent:
2697             FUN0(OP_GPWENT);
2698
2699         case KEY_getpwnam:
2700             FUN1(OP_GPWNAM);
2701
2702         case KEY_getpwuid:
2703             FUN1(OP_GPWUID);
2704
2705         case KEY_getpeername:
2706             UNI(OP_GETPEERNAME);
2707
2708         case KEY_gethostbyname:
2709             UNI(OP_GHBYNAME);
2710
2711         case KEY_gethostbyaddr:
2712             LOP(OP_GHBYADDR,XTERM);
2713
2714         case KEY_gethostent:
2715             FUN0(OP_GHOSTENT);
2716
2717         case KEY_getnetbyname:
2718             UNI(OP_GNBYNAME);
2719
2720         case KEY_getnetbyaddr:
2721             LOP(OP_GNBYADDR,XTERM);
2722
2723         case KEY_getnetent:
2724             FUN0(OP_GNETENT);
2725
2726         case KEY_getservbyname:
2727             LOP(OP_GSBYNAME,XTERM);
2728
2729         case KEY_getservbyport:
2730             LOP(OP_GSBYPORT,XTERM);
2731
2732         case KEY_getservent:
2733             FUN0(OP_GSERVENT);
2734
2735         case KEY_getsockname:
2736             UNI(OP_GETSOCKNAME);
2737
2738         case KEY_getsockopt:
2739             LOP(OP_GSOCKOPT,XTERM);
2740
2741         case KEY_getgrent:
2742             FUN0(OP_GGRENT);
2743
2744         case KEY_getgrnam:
2745             FUN1(OP_GGRNAM);
2746
2747         case KEY_getgrgid:
2748             FUN1(OP_GGRGID);
2749
2750         case KEY_getlogin:
2751             FUN0(OP_GETLOGIN);
2752
2753         case KEY_glob:
2754             set_csh();
2755             LOP(OP_GLOB,XTERM);
2756
2757         case KEY_hex:
2758             UNI(OP_HEX);
2759
2760         case KEY_if:
2761             yylval.ival = curcop->cop_line;
2762             OPERATOR(IF);
2763
2764         case KEY_index:
2765             LOP(OP_INDEX,XTERM);
2766
2767         case KEY_int:
2768             UNI(OP_INT);
2769
2770         case KEY_ioctl:
2771             LOP(OP_IOCTL,XTERM);
2772
2773         case KEY_join:
2774             LOP(OP_JOIN,XTERM);
2775
2776         case KEY_keys:
2777             UNI(OP_KEYS);
2778
2779         case KEY_kill:
2780             LOP(OP_KILL,XTERM);
2781
2782         case KEY_last:
2783             s = force_word(s,WORD,TRUE,FALSE,FALSE);
2784             LOOPX(OP_LAST);
2785             
2786         case KEY_lc:
2787             UNI(OP_LC);
2788
2789         case KEY_lcfirst:
2790             UNI(OP_LCFIRST);
2791
2792         case KEY_local:
2793             yylval.ival = 0;
2794             OPERATOR(LOCAL);
2795
2796         case KEY_length:
2797             UNI(OP_LENGTH);
2798
2799         case KEY_lt:
2800             Rop(OP_SLT);
2801
2802         case KEY_le:
2803             Rop(OP_SLE);
2804
2805         case KEY_localtime:
2806             UNI(OP_LOCALTIME);
2807
2808         case KEY_log:
2809             UNI(OP_LOG);
2810
2811         case KEY_link:
2812             LOP(OP_LINK,XTERM);
2813
2814         case KEY_listen:
2815             LOP(OP_LISTEN,XTERM);
2816
2817         case KEY_lstat:
2818             UNI(OP_LSTAT);
2819
2820         case KEY_m:
2821             s = scan_pat(s);
2822             TERM(sublex_start());
2823
2824         case KEY_map:
2825             LOP(OP_MAPSTART,XREF);
2826             
2827         case KEY_mkdir:
2828             LOP(OP_MKDIR,XTERM);
2829
2830         case KEY_msgctl:
2831             LOP(OP_MSGCTL,XTERM);
2832
2833         case KEY_msgget:
2834             LOP(OP_MSGGET,XTERM);
2835
2836         case KEY_msgrcv:
2837             LOP(OP_MSGRCV,XTERM);
2838
2839         case KEY_msgsnd:
2840             LOP(OP_MSGSND,XTERM);
2841
2842         case KEY_my:
2843             in_my = TRUE;
2844             yylval.ival = 1;
2845             OPERATOR(LOCAL);
2846
2847         case KEY_next:
2848             s = force_word(s,WORD,TRUE,FALSE,FALSE);
2849             LOOPX(OP_NEXT);
2850
2851         case KEY_ne:
2852             Eop(OP_SNE);
2853
2854         case KEY_no:
2855             if (expect != XSTATE)
2856                 yyerror("\"no\" not allowed in expression");
2857             s = force_word(s,WORD,FALSE,TRUE,FALSE);
2858             yylval.ival = 0;
2859             OPERATOR(USE);
2860
2861         case KEY_not:
2862             OPERATOR(NOTOP);
2863
2864         case KEY_open:
2865             s = skipspace(s);
2866             if (isIDFIRST(*s)) {
2867                 char *t;
2868                 for (d = s; isALNUM(*d); d++) ;
2869                 t = skipspace(d);
2870                 if (strchr("|&*+-=!?:.", *t))
2871                     warn("Precedence problem: open %.*s should be open(%.*s)",
2872                         d-s,s, d-s,s);
2873             }
2874             LOP(OP_OPEN,XTERM);
2875
2876         case KEY_or:
2877             yylval.ival = OP_OR;
2878             OPERATOR(OROP);
2879
2880         case KEY_ord:
2881             UNI(OP_ORD);
2882
2883         case KEY_oct:
2884             UNI(OP_OCT);
2885
2886         case KEY_opendir:
2887             LOP(OP_OPEN_DIR,XTERM);
2888
2889         case KEY_print:
2890             checkcomma(s,tokenbuf,"filehandle");
2891             LOP(OP_PRINT,XREF);
2892
2893         case KEY_printf:
2894             checkcomma(s,tokenbuf,"filehandle");
2895             LOP(OP_PRTF,XREF);
2896
2897         case KEY_push:
2898             LOP(OP_PUSH,XTERM);
2899
2900         case KEY_pop:
2901             UNI(OP_POP);
2902
2903         case KEY_pos:
2904             UNI(OP_POS);
2905             
2906         case KEY_pack:
2907             LOP(OP_PACK,XTERM);
2908
2909         case KEY_package:
2910             s = force_word(s,WORD,FALSE,TRUE,FALSE);
2911             OPERATOR(PACKAGE);
2912
2913         case KEY_pipe:
2914             LOP(OP_PIPE_OP,XTERM);
2915
2916         case KEY_q:
2917             s = scan_str(s);
2918             if (!s)
2919                 missingterm((char*)0);
2920             yylval.ival = OP_CONST;
2921             TERM(sublex_start());
2922
2923         case KEY_quotemeta:
2924             UNI(OP_QUOTEMETA);
2925
2926         case KEY_qw:
2927             s = scan_str(s);
2928             if (!s)
2929                 missingterm((char*)0);
2930             force_next(')');
2931             nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, q(lex_stuff));
2932             lex_stuff = Nullsv;
2933             force_next(THING);
2934             force_next(',');
2935             nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(" ",1));
2936             force_next(THING);
2937             force_next('(');
2938             yylval.ival = OP_SPLIT;
2939             CLINE;
2940             expect = XTERM;
2941             bufptr = s;
2942             last_lop = oldbufptr;
2943             last_lop_op = OP_SPLIT;
2944             return FUNC;
2945
2946         case KEY_qq:
2947             s = scan_str(s);
2948             if (!s)
2949                 missingterm((char*)0);
2950             yylval.ival = OP_STRINGIFY;
2951             if (SvIVX(lex_stuff) == '\'')
2952                 SvIVX(lex_stuff) = 0;   /* qq'$foo' should intepolate */
2953             TERM(sublex_start());
2954
2955         case KEY_qx:
2956             s = scan_str(s);
2957             if (!s)
2958                 missingterm((char*)0);
2959             yylval.ival = OP_BACKTICK;
2960             set_csh();
2961             TERM(sublex_start());
2962
2963         case KEY_return:
2964             OLDLOP(OP_RETURN);
2965
2966         case KEY_require:
2967             *tokenbuf = '\0';
2968             s = force_word(s,WORD,TRUE,TRUE,FALSE);
2969             if (isIDFIRST(*tokenbuf))
2970                 gv_stashpv(tokenbuf, TRUE);
2971             else if (*s == '<')
2972                 yyerror("<> should be quotes");
2973             UNI(OP_REQUIRE);
2974
2975         case KEY_reset:
2976             UNI(OP_RESET);
2977
2978         case KEY_redo:
2979             s = force_word(s,WORD,TRUE,FALSE,FALSE);
2980             LOOPX(OP_REDO);
2981
2982         case KEY_rename:
2983             LOP(OP_RENAME,XTERM);
2984
2985         case KEY_rand:
2986             UNI(OP_RAND);
2987
2988         case KEY_rmdir:
2989             UNI(OP_RMDIR);
2990
2991         case KEY_rindex:
2992             LOP(OP_RINDEX,XTERM);
2993
2994         case KEY_read:
2995             LOP(OP_READ,XTERM);
2996
2997         case KEY_readdir:
2998             UNI(OP_READDIR);
2999
3000         case KEY_readline:
3001             set_csh();
3002             UNI(OP_READLINE);
3003
3004         case KEY_readpipe:
3005             set_csh();
3006             UNI(OP_BACKTICK);
3007
3008         case KEY_rewinddir:
3009             UNI(OP_REWINDDIR);
3010
3011         case KEY_recv:
3012             LOP(OP_RECV,XTERM);
3013
3014         case KEY_reverse:
3015             LOP(OP_REVERSE,XTERM);
3016
3017         case KEY_readlink:
3018             UNI(OP_READLINK);
3019
3020         case KEY_ref:
3021             UNI(OP_REF);
3022
3023         case KEY_s:
3024             s = scan_subst(s);
3025             if (yylval.opval)
3026                 TERM(sublex_start());
3027             else
3028                 TOKEN(1);       /* force error */
3029
3030         case KEY_chomp:
3031             UNI(OP_CHOMP);
3032             
3033         case KEY_scalar:
3034             UNI(OP_SCALAR);
3035
3036         case KEY_select:
3037             LOP(OP_SELECT,XTERM);
3038
3039         case KEY_seek:
3040             LOP(OP_SEEK,XTERM);
3041
3042         case KEY_semctl:
3043             LOP(OP_SEMCTL,XTERM);
3044
3045         case KEY_semget:
3046             LOP(OP_SEMGET,XTERM);
3047
3048         case KEY_semop:
3049             LOP(OP_SEMOP,XTERM);
3050
3051         case KEY_send:
3052             LOP(OP_SEND,XTERM);
3053
3054         case KEY_setpgrp:
3055             LOP(OP_SETPGRP,XTERM);
3056
3057         case KEY_setpriority:
3058             LOP(OP_SETPRIORITY,XTERM);
3059
3060         case KEY_sethostent:
3061             FUN1(OP_SHOSTENT);
3062
3063         case KEY_setnetent:
3064             FUN1(OP_SNETENT);
3065
3066         case KEY_setservent:
3067             FUN1(OP_SSERVENT);
3068
3069         case KEY_setprotoent:
3070             FUN1(OP_SPROTOENT);
3071
3072         case KEY_setpwent:
3073             FUN0(OP_SPWENT);
3074
3075         case KEY_setgrent:
3076             FUN0(OP_SGRENT);
3077
3078         case KEY_seekdir:
3079             LOP(OP_SEEKDIR,XTERM);
3080
3081         case KEY_setsockopt:
3082             LOP(OP_SSOCKOPT,XTERM);
3083
3084         case KEY_shift:
3085             UNI(OP_SHIFT);
3086
3087         case KEY_shmctl:
3088             LOP(OP_SHMCTL,XTERM);
3089
3090         case KEY_shmget:
3091             LOP(OP_SHMGET,XTERM);
3092
3093         case KEY_shmread:
3094             LOP(OP_SHMREAD,XTERM);
3095
3096         case KEY_shmwrite:
3097             LOP(OP_SHMWRITE,XTERM);
3098
3099         case KEY_shutdown:
3100             LOP(OP_SHUTDOWN,XTERM);
3101
3102         case KEY_sin:
3103             UNI(OP_SIN);
3104
3105         case KEY_sleep:
3106             UNI(OP_SLEEP);
3107
3108         case KEY_socket:
3109             LOP(OP_SOCKET,XTERM);
3110
3111         case KEY_socketpair:
3112             LOP(OP_SOCKPAIR,XTERM);
3113
3114         case KEY_sort:
3115             checkcomma(s,tokenbuf,"subroutine name");
3116             s = skipspace(s);
3117             if (*s == ';' || *s == ')')         /* probably a close */
3118                 croak("sort is now a reserved word");
3119             expect = XTERM;
3120             s = force_word(s,WORD,TRUE,TRUE,TRUE);
3121             LOP(OP_SORT,XREF);
3122
3123         case KEY_split:
3124             LOP(OP_SPLIT,XTERM);
3125
3126         case KEY_sprintf:
3127             LOP(OP_SPRINTF,XTERM);
3128
3129         case KEY_splice:
3130             LOP(OP_SPLICE,XTERM);
3131
3132         case KEY_sqrt:
3133             UNI(OP_SQRT);
3134
3135         case KEY_srand:
3136             UNI(OP_SRAND);
3137
3138         case KEY_stat:
3139             UNI(OP_STAT);
3140
3141         case KEY_study:
3142             sawstudy++;
3143             UNI(OP_STUDY);
3144
3145         case KEY_substr:
3146             LOP(OP_SUBSTR,XTERM);
3147
3148         case KEY_format:
3149         case KEY_sub:
3150           really_sub:
3151             s = skipspace(s);
3152             if (*s == '{' && tmp == KEY_sub) {
3153                 sv_setpv(subname,"__ANON__");
3154                 PRETERMBLOCK(ANONSUB);
3155             }
3156             expect = XBLOCK;
3157             if (isIDFIRST(*s) || *s == '\'' || *s == ':') {
3158                 char tmpbuf[128];
3159                 d = scan_word(s, tmpbuf, TRUE, &len);
3160                 if (strchr(tmpbuf, ':'))
3161                     sv_setpv(subname, tmpbuf);
3162                 else {
3163                     sv_setsv(subname,curstname);
3164                     sv_catpvn(subname,"::",2);
3165                     sv_catpvn(subname,tmpbuf,len);
3166                 }
3167                 s = force_word(s,WORD,FALSE,TRUE,TRUE);
3168             }
3169             else
3170                 sv_setpv(subname,"?");
3171
3172             if (tmp != KEY_format)
3173                 PREBLOCK(SUB);
3174
3175             s = skipspace(s);
3176             if (*s == '=')
3177                 lex_formbrack = lex_brackets + 1;
3178             OPERATOR(FORMAT);
3179
3180         case KEY_system:
3181             set_csh();
3182             LOP(OP_SYSTEM,XREF);
3183
3184         case KEY_symlink:
3185             LOP(OP_SYMLINK,XTERM);
3186
3187         case KEY_syscall:
3188             LOP(OP_SYSCALL,XTERM);
3189
3190         case KEY_sysread:
3191             LOP(OP_SYSREAD,XTERM);
3192
3193         case KEY_syswrite:
3194             LOP(OP_SYSWRITE,XTERM);
3195
3196         case KEY_tr:
3197             s = scan_trans(s);
3198             TERM(sublex_start());
3199
3200         case KEY_tell:
3201             UNI(OP_TELL);
3202
3203         case KEY_telldir:
3204             UNI(OP_TELLDIR);
3205
3206         case KEY_tie:
3207             LOP(OP_TIE,XTERM);
3208
3209         case KEY_time:
3210             FUN0(OP_TIME);
3211
3212         case KEY_times:
3213             FUN0(OP_TMS);
3214
3215         case KEY_truncate:
3216             LOP(OP_TRUNCATE,XTERM);
3217
3218         case KEY_uc:
3219             UNI(OP_UC);
3220
3221         case KEY_ucfirst:
3222             UNI(OP_UCFIRST);
3223
3224         case KEY_untie:
3225             UNI(OP_UNTIE);
3226
3227         case KEY_until:
3228             yylval.ival = curcop->cop_line;
3229             OPERATOR(UNTIL);
3230
3231         case KEY_unless:
3232             yylval.ival = curcop->cop_line;
3233             OPERATOR(UNLESS);
3234
3235         case KEY_unlink:
3236             LOP(OP_UNLINK,XTERM);
3237
3238         case KEY_undef:
3239             UNI(OP_UNDEF);
3240
3241         case KEY_unpack:
3242             LOP(OP_UNPACK,XTERM);
3243
3244         case KEY_utime:
3245             LOP(OP_UTIME,XTERM);
3246
3247         case KEY_umask:
3248             if (dowarn) {
3249                 for (d = s; d < bufend && (isSPACE(*d) || *d == '('); d++) ;
3250                 if (*d != '0' && isDIGIT(*d))
3251                     yywarn("umask: argument is missing initial 0");
3252             }
3253             UNI(OP_UMASK);
3254
3255         case KEY_unshift:
3256             LOP(OP_UNSHIFT,XTERM);
3257
3258         case KEY_use:
3259             if (expect != XSTATE)
3260                 yyerror("\"use\" not allowed in expression");
3261             s = force_word(s,WORD,FALSE,TRUE,FALSE);
3262             yylval.ival = 1;
3263             OPERATOR(USE);
3264
3265         case KEY_values:
3266             UNI(OP_VALUES);
3267
3268         case KEY_vec:
3269             sawvec = TRUE;
3270             LOP(OP_VEC,XTERM);
3271
3272         case KEY_while:
3273             yylval.ival = curcop->cop_line;
3274             OPERATOR(WHILE);
3275
3276         case KEY_warn:
3277             hints |= HINT_BLOCK_SCOPE;
3278             LOP(OP_WARN,XTERM);
3279
3280         case KEY_wait:
3281             FUN0(OP_WAIT);
3282
3283         case KEY_waitpid:
3284             LOP(OP_WAITPID,XTERM);
3285
3286         case KEY_wantarray:
3287             FUN0(OP_WANTARRAY);
3288
3289         case KEY_write:
3290             gv_fetchpv("\f",TRUE, SVt_PV);      /* Make sure $^L is defined */
3291             UNI(OP_ENTERWRITE);
3292
3293         case KEY_x:
3294             if (expect == XOPERATOR)
3295                 Mop(OP_REPEAT);
3296             check_uni();
3297             goto just_a_word;
3298
3299         case KEY_xor:
3300             yylval.ival = OP_XOR;
3301             OPERATOR(OROP);
3302
3303         case KEY_y:
3304             s = scan_trans(s);
3305             TERM(sublex_start());
3306         }
3307     }
3308 }
3309
3310 I32
3311 keyword(d, len)
3312 register char *d;
3313 I32 len;
3314 {
3315     switch (*d) {
3316     case '_':
3317         if (d[1] == '_') {
3318             if (strEQ(d,"__LINE__"))            return -KEY___LINE__;
3319             if (strEQ(d,"__FILE__"))            return -KEY___FILE__;
3320             if (strEQ(d,"__DATA__"))            return KEY___DATA__;
3321             if (strEQ(d,"__END__"))             return KEY___END__;
3322         }
3323         break;
3324     case 'A':
3325         if (strEQ(d,"AUTOLOAD"))                return KEY_AUTOLOAD;
3326         break;
3327     case 'a':
3328         switch (len) {
3329         case 3:
3330             if (strEQ(d,"and"))                 return -KEY_and;
3331             if (strEQ(d,"abs"))                 return -KEY_abs;
3332             break;
3333         case 5:
3334             if (strEQ(d,"alarm"))               return -KEY_alarm;
3335             if (strEQ(d,"atan2"))               return -KEY_atan2;
3336             break;
3337         case 6:
3338             if (strEQ(d,"accept"))              return -KEY_accept;
3339             break;
3340         }
3341         break;
3342     case 'B':
3343         if (strEQ(d,"BEGIN"))                   return KEY_BEGIN;
3344         break;
3345     case 'b':
3346         if (strEQ(d,"bless"))                   return -KEY_bless;
3347         if (strEQ(d,"bind"))                    return -KEY_bind;
3348         if (strEQ(d,"binmode"))                 return -KEY_binmode;
3349         break;
3350     case 'C':
3351         if (strEQ(d,"CORE"))                    return -KEY_CORE;
3352         break;
3353     case 'c':
3354         switch (len) {
3355         case 3:
3356             if (strEQ(d,"cmp"))                 return -KEY_cmp;
3357             if (strEQ(d,"chr"))                 return -KEY_chr;
3358             if (strEQ(d,"cos"))                 return -KEY_cos;
3359             break;
3360         case 4:
3361             if (strEQ(d,"chop"))                return KEY_chop;
3362             break;
3363         case 5:
3364             if (strEQ(d,"close"))               return -KEY_close;
3365             if (strEQ(d,"chdir"))               return -KEY_chdir;
3366             if (strEQ(d,"chomp"))               return KEY_chomp;
3367             if (strEQ(d,"chmod"))               return -KEY_chmod;
3368             if (strEQ(d,"chown"))               return -KEY_chown;
3369             if (strEQ(d,"crypt"))               return -KEY_crypt;
3370             break;
3371         case 6:
3372             if (strEQ(d,"chroot"))              return -KEY_chroot;
3373             if (strEQ(d,"caller"))              return -KEY_caller;
3374             break;
3375         case 7:
3376             if (strEQ(d,"connect"))             return -KEY_connect;
3377             break;
3378         case 8:
3379             if (strEQ(d,"closedir"))            return -KEY_closedir;
3380             if (strEQ(d,"continue"))            return -KEY_continue;
3381             break;
3382         }
3383         break;
3384     case 'D':
3385         if (strEQ(d,"DESTROY"))                 return KEY_DESTROY;
3386         break;
3387     case 'd':
3388         switch (len) {
3389         case 2:
3390             if (strEQ(d,"do"))                  return KEY_do;
3391             break;
3392         case 3:
3393             if (strEQ(d,"die"))                 return -KEY_die;
3394             break;
3395         case 4:
3396             if (strEQ(d,"dump"))                return -KEY_dump;
3397             break;
3398         case 6:
3399             if (strEQ(d,"delete"))              return KEY_delete;
3400             break;
3401         case 7:
3402             if (strEQ(d,"defined"))             return KEY_defined;
3403             if (strEQ(d,"dbmopen"))             return -KEY_dbmopen;
3404             break;
3405         case 8:
3406             if (strEQ(d,"dbmclose"))            return -KEY_dbmclose;
3407             break;
3408         }
3409         break;
3410     case 'E':
3411         if (strEQ(d,"EQ")) { deprecate(d);      return -KEY_eq;}
3412         if (strEQ(d,"END"))                     return KEY_END;
3413         break;
3414     case 'e':
3415         switch (len) {
3416         case 2:
3417             if (strEQ(d,"eq"))                  return -KEY_eq;
3418             break;
3419         case 3:
3420             if (strEQ(d,"eof"))                 return -KEY_eof;
3421             if (strEQ(d,"exp"))                 return -KEY_exp;
3422             break;
3423         case 4:
3424             if (strEQ(d,"else"))                return KEY_else;
3425             if (strEQ(d,"exit"))                return -KEY_exit;
3426             if (strEQ(d,"eval"))                return KEY_eval;
3427             if (strEQ(d,"exec"))                return -KEY_exec;
3428             if (strEQ(d,"each"))                return KEY_each;
3429             break;
3430         case 5:
3431             if (strEQ(d,"elsif"))               return KEY_elsif;
3432             break;
3433         case 6:
3434             if (strEQ(d,"exists"))              return KEY_exists;
3435             break;
3436         case 8:
3437             if (strEQ(d,"endgrent"))            return -KEY_endgrent;
3438             if (strEQ(d,"endpwent"))            return -KEY_endpwent;
3439             break;
3440         case 9:
3441             if (strEQ(d,"endnetent"))           return -KEY_endnetent;
3442             break;
3443         case 10:
3444             if (strEQ(d,"endhostent"))          return -KEY_endhostent;
3445             if (strEQ(d,"endservent"))          return -KEY_endservent;
3446             break;
3447         case 11:
3448             if (strEQ(d,"endprotoent"))         return -KEY_endprotoent;
3449             break;
3450         }
3451         break;
3452     case 'f':
3453         switch (len) {
3454         case 3:
3455             if (strEQ(d,"for"))                 return KEY_for;
3456             break;
3457         case 4:
3458             if (strEQ(d,"fork"))                return -KEY_fork;
3459             break;
3460         case 5:
3461             if (strEQ(d,"fcntl"))               return -KEY_fcntl;
3462             if (strEQ(d,"flock"))               return -KEY_flock;
3463             break;
3464         case 6:
3465             if (strEQ(d,"format"))              return KEY_format;
3466             if (strEQ(d,"fileno"))              return -KEY_fileno;
3467             break;
3468         case 7:
3469             if (strEQ(d,"foreach"))             return KEY_foreach;
3470             break;
3471         case 8:
3472             if (strEQ(d,"formline"))            return -KEY_formline;
3473             break;
3474         }
3475         break;
3476     case 'G':
3477         if (len == 2) {
3478             if (strEQ(d,"GT")) { deprecate(d);  return -KEY_gt;}
3479             if (strEQ(d,"GE")) { deprecate(d);  return -KEY_ge;}
3480         }
3481         break;
3482     case 'g':
3483         if (strnEQ(d,"get",3)) {
3484             d += 3;
3485             if (*d == 'p') {
3486                 switch (len) {
3487                 case 7:
3488                     if (strEQ(d,"ppid"))        return -KEY_getppid;
3489                     if (strEQ(d,"pgrp"))        return -KEY_getpgrp;
3490                     break;
3491                 case 8:
3492                     if (strEQ(d,"pwent"))       return -KEY_getpwent;
3493                     if (strEQ(d,"pwnam"))       return -KEY_getpwnam;
3494                     if (strEQ(d,"pwuid"))       return -KEY_getpwuid;
3495                     break;
3496                 case 11:
3497                     if (strEQ(d,"peername"))    return -KEY_getpeername;
3498                     if (strEQ(d,"protoent"))    return -KEY_getprotoent;
3499                     if (strEQ(d,"priority"))    return -KEY_getpriority;
3500                     break;
3501                 case 14:
3502                     if (strEQ(d,"protobyname")) return -KEY_getprotobyname;
3503                     break;
3504                 case 16:
3505                     if (strEQ(d,"protobynumber"))return -KEY_getprotobynumber;
3506                     break;
3507                 }
3508             }
3509             else if (*d == 'h') {
3510                 if (strEQ(d,"hostbyname"))      return -KEY_gethostbyname;
3511                 if (strEQ(d,"hostbyaddr"))      return -KEY_gethostbyaddr;
3512                 if (strEQ(d,"hostent"))         return -KEY_gethostent;
3513             }
3514             else if (*d == 'n') {
3515                 if (strEQ(d,"netbyname"))       return -KEY_getnetbyname;
3516                 if (strEQ(d,"netbyaddr"))       return -KEY_getnetbyaddr;
3517                 if (strEQ(d,"netent"))          return -KEY_getnetent;
3518             }
3519             else if (*d == 's') {
3520                 if (strEQ(d,"servbyname"))      return -KEY_getservbyname;
3521                 if (strEQ(d,"servbyport"))      return -KEY_getservbyport;
3522                 if (strEQ(d,"servent"))         return -KEY_getservent;
3523                 if (strEQ(d,"sockname"))        return -KEY_getsockname;
3524                 if (strEQ(d,"sockopt"))         return -KEY_getsockopt;
3525             }
3526             else if (*d == 'g') {
3527                 if (strEQ(d,"grent"))           return -KEY_getgrent;
3528                 if (strEQ(d,"grnam"))           return -KEY_getgrnam;
3529                 if (strEQ(d,"grgid"))           return -KEY_getgrgid;
3530             }
3531             else if (*d == 'l') {
3532                 if (strEQ(d,"login"))           return -KEY_getlogin;
3533             }
3534             else if (strEQ(d,"c"))              return -KEY_getc;
3535             break;
3536         }
3537         switch (len) {
3538         case 2:
3539             if (strEQ(d,"gt"))                  return -KEY_gt;
3540             if (strEQ(d,"ge"))                  return -KEY_ge;
3541             break;
3542         case 4:
3543             if (strEQ(d,"grep"))                return KEY_grep;
3544             if (strEQ(d,"goto"))                return KEY_goto;
3545             if (strEQ(d,"glob"))                return -KEY_glob;
3546             break;
3547         case 6:
3548             if (strEQ(d,"gmtime"))              return -KEY_gmtime;
3549             break;
3550         }
3551         break;
3552     case 'h':
3553         if (strEQ(d,"hex"))                     return -KEY_hex;
3554         break;
3555     case 'i':
3556         switch (len) {
3557         case 2:
3558             if (strEQ(d,"if"))                  return KEY_if;
3559             break;
3560         case 3:
3561             if (strEQ(d,"int"))                 return -KEY_int;
3562             break;
3563         case 5:
3564             if (strEQ(d,"index"))               return -KEY_index;
3565             if (strEQ(d,"ioctl"))               return -KEY_ioctl;
3566             break;
3567         }
3568         break;
3569     case 'j':
3570         if (strEQ(d,"join"))                    return -KEY_join;
3571         break;
3572     case 'k':
3573         if (len == 4) {
3574             if (strEQ(d,"keys"))                return KEY_keys;
3575             if (strEQ(d,"kill"))                return -KEY_kill;
3576         }
3577         break;
3578     case 'L':
3579         if (len == 2) {
3580             if (strEQ(d,"LT")) { deprecate(d);  return -KEY_lt;}
3581             if (strEQ(d,"LE")) { deprecate(d);  return -KEY_le;}
3582         }
3583         break;
3584     case 'l':
3585         switch (len) {
3586         case 2:
3587             if (strEQ(d,"lt"))                  return -KEY_lt;
3588             if (strEQ(d,"le"))                  return -KEY_le;
3589             if (strEQ(d,"lc"))                  return -KEY_lc;
3590             break;
3591         case 3:
3592             if (strEQ(d,"log"))                 return -KEY_log;
3593             break;
3594         case 4:
3595             if (strEQ(d,"last"))                return KEY_last;
3596             if (strEQ(d,"link"))                return -KEY_link;
3597             break;
3598         case 5:
3599             if (strEQ(d,"local"))               return KEY_local;
3600             if (strEQ(d,"lstat"))               return -KEY_lstat;
3601             break;
3602         case 6:
3603             if (strEQ(d,"length"))              return -KEY_length;
3604             if (strEQ(d,"listen"))              return -KEY_listen;
3605             break;
3606         case 7:
3607             if (strEQ(d,"lcfirst"))             return -KEY_lcfirst;
3608             break;
3609         case 9:
3610             if (strEQ(d,"localtime"))           return -KEY_localtime;
3611             break;
3612         }
3613         break;
3614     case 'm':
3615         switch (len) {
3616         case 1:                                 return KEY_m;
3617         case 2:
3618             if (strEQ(d,"my"))                  return KEY_my;
3619             break;
3620         case 3:
3621             if (strEQ(d,"map"))                 return KEY_map;
3622             break;
3623         case 5:
3624             if (strEQ(d,"mkdir"))               return -KEY_mkdir;
3625             break;
3626         case 6:
3627             if (strEQ(d,"msgctl"))              return -KEY_msgctl;
3628             if (strEQ(d,"msgget"))              return -KEY_msgget;
3629             if (strEQ(d,"msgrcv"))              return -KEY_msgrcv;
3630             if (strEQ(d,"msgsnd"))              return -KEY_msgsnd;
3631             break;
3632         }
3633         break;
3634     case 'N':
3635         if (strEQ(d,"NE")) { deprecate(d);      return -KEY_ne;}
3636         break;
3637     case 'n':
3638         if (strEQ(d,"next"))                    return KEY_next;
3639         if (strEQ(d,"ne"))                      return -KEY_ne;
3640         if (strEQ(d,"not"))                     return -KEY_not;
3641         if (strEQ(d,"no"))                      return KEY_no;
3642         break;
3643     case 'o':
3644         switch (len) {
3645         case 2:
3646             if (strEQ(d,"or"))                  return -KEY_or;
3647             break;
3648         case 3:
3649             if (strEQ(d,"ord"))                 return -KEY_ord;
3650             if (strEQ(d,"oct"))                 return -KEY_oct;
3651             break;
3652         case 4:
3653             if (strEQ(d,"open"))                return -KEY_open;
3654             break;
3655         case 7:
3656             if (strEQ(d,"opendir"))             return -KEY_opendir;
3657             break;
3658         }
3659         break;
3660     case 'p':
3661         switch (len) {
3662         case 3:
3663             if (strEQ(d,"pop"))                 return KEY_pop;
3664             if (strEQ(d,"pos"))                 return KEY_pos;
3665             break;
3666         case 4:
3667             if (strEQ(d,"push"))                return KEY_push;
3668             if (strEQ(d,"pack"))                return -KEY_pack;
3669             if (strEQ(d,"pipe"))                return -KEY_pipe;
3670             break;
3671         case 5:
3672             if (strEQ(d,"print"))               return KEY_print;
3673             break;
3674         case 6:
3675             if (strEQ(d,"printf"))              return KEY_printf;
3676             break;
3677         case 7:
3678             if (strEQ(d,"package"))             return KEY_package;
3679             break;
3680         }
3681         break;
3682     case 'q':
3683         if (len <= 2) {
3684             if (strEQ(d,"q"))                   return KEY_q;
3685             if (strEQ(d,"qq"))                  return KEY_qq;
3686             if (strEQ(d,"qw"))                  return KEY_qw;
3687             if (strEQ(d,"qx"))                  return KEY_qx;
3688         }
3689         else if (strEQ(d,"quotemeta"))          return -KEY_quotemeta;
3690         break;
3691     case 'r':
3692         switch (len) {
3693         case 3:
3694             if (strEQ(d,"ref"))                 return -KEY_ref;
3695             break;
3696         case 4:
3697             if (strEQ(d,"read"))                return -KEY_read;
3698             if (strEQ(d,"rand"))                return -KEY_rand;
3699             if (strEQ(d,"recv"))                return -KEY_recv;
3700             if (strEQ(d,"redo"))                return KEY_redo;
3701             break;
3702         case 5:
3703             if (strEQ(d,"rmdir"))               return -KEY_rmdir;
3704             if (strEQ(d,"reset"))               return -KEY_reset;
3705             break;
3706         case 6:
3707             if (strEQ(d,"return"))              return KEY_return;
3708             if (strEQ(d,"rename"))              return -KEY_rename;
3709             if (strEQ(d,"rindex"))              return -KEY_rindex;
3710             break;
3711         case 7:
3712             if (strEQ(d,"require"))             return -KEY_require;
3713             if (strEQ(d,"reverse"))             return -KEY_reverse;
3714             if (strEQ(d,"readdir"))             return -KEY_readdir;
3715             break;
3716         case 8:
3717             if (strEQ(d,"readlink"))            return -KEY_readlink;
3718             if (strEQ(d,"readline"))            return -KEY_readline;
3719             if (strEQ(d,"readpipe"))            return -KEY_readpipe;
3720             break;
3721         case 9:
3722             if (strEQ(d,"rewinddir"))           return -KEY_rewinddir;
3723             break;
3724         }
3725         break;
3726     case 's':
3727         switch (d[1]) {
3728         case 0:                                 return KEY_s;
3729         case 'c':
3730             if (strEQ(d,"scalar"))              return KEY_scalar;
3731             break;
3732         case 'e':
3733             switch (len) {
3734             case 4:
3735                 if (strEQ(d,"seek"))            return -KEY_seek;
3736                 if (strEQ(d,"send"))            return -KEY_send;
3737                 break;
3738             case 5:
3739                 if (strEQ(d,"semop"))           return -KEY_semop;
3740                 break;
3741             case 6:
3742                 if (strEQ(d,"select"))          return -KEY_select;
3743                 if (strEQ(d,"semctl"))          return -KEY_semctl;
3744                 if (strEQ(d,"semget"))          return -KEY_semget;
3745                 break;
3746             case 7:
3747                 if (strEQ(d,"setpgrp"))         return -KEY_setpgrp;
3748                 if (strEQ(d,"seekdir"))         return -KEY_seekdir;
3749                 break;
3750             case 8:
3751                 if (strEQ(d,"setpwent"))        return -KEY_setpwent;
3752                 if (strEQ(d,"setgrent"))        return -KEY_setgrent;
3753                 break;
3754             case 9:
3755                 if (strEQ(d,"setnetent"))       return -KEY_setnetent;
3756                 break;
3757             case 10:
3758                 if (strEQ(d,"setsockopt"))      return -KEY_setsockopt;
3759                 if (strEQ(d,"sethostent"))      return -KEY_sethostent;
3760                 if (strEQ(d,"setservent"))      return -KEY_setservent;
3761                 break;
3762             case 11:
3763                 if (strEQ(d,"setpriority"))     return -KEY_setpriority;
3764                 if (strEQ(d,"setprotoent"))     return -KEY_setprotoent;
3765                 break;
3766             }
3767             break;
3768         case 'h':
3769             switch (len) {
3770             case 5:
3771                 if (strEQ(d,"shift"))           return KEY_shift;
3772                 break;
3773             case 6:
3774                 if (strEQ(d,"shmctl"))          return -KEY_shmctl;
3775                 if (strEQ(d,"shmget"))          return -KEY_shmget;
3776                 break;
3777             case 7:
3778                 if (strEQ(d,"shmread"))         return -KEY_shmread;
3779                 break;
3780             case 8:
3781                 if (strEQ(d,"shmwrite"))        return -KEY_shmwrite;
3782                 if (strEQ(d,"shutdown"))        return -KEY_shutdown;
3783                 break;
3784             }
3785             break;
3786         case 'i':
3787             if (strEQ(d,"sin"))                 return -KEY_sin;
3788             break;
3789         case 'l':
3790             if (strEQ(d,"sleep"))               return -KEY_sleep;
3791             break;
3792         case 'o':
3793             if (strEQ(d,"sort"))                return KEY_sort;
3794             if (strEQ(d,"socket"))              return -KEY_socket;
3795             if (strEQ(d,"socketpair"))          return -KEY_socketpair;
3796             break;
3797         case 'p':
3798             if (strEQ(d,"split"))               return KEY_split;
3799             if (strEQ(d,"sprintf"))             return -KEY_sprintf;
3800             if (strEQ(d,"splice"))              return KEY_splice;
3801             break;
3802         case 'q':
3803             if (strEQ(d,"sqrt"))                return -KEY_sqrt;
3804             break;
3805         case 'r':
3806             if (strEQ(d,"srand"))               return -KEY_srand;
3807             break;
3808         case 't':
3809             if (strEQ(d,"stat"))                return -KEY_stat;
3810             if (strEQ(d,"study"))               return KEY_study;
3811             break;
3812         case 'u':
3813             if (strEQ(d,"substr"))              return -KEY_substr;
3814             if (strEQ(d,"sub"))                 return KEY_sub;
3815             break;
3816         case 'y':
3817             switch (len) {
3818             case 6:
3819                 if (strEQ(d,"system"))          return -KEY_system;
3820                 break;
3821             case 7:
3822                 if (strEQ(d,"sysread"))         return -KEY_sysread;
3823                 if (strEQ(d,"symlink"))         return -KEY_symlink;
3824                 if (strEQ(d,"syscall"))         return -KEY_syscall;
3825                 break;
3826             case 8:
3827                 if (strEQ(d,"syswrite"))        return -KEY_syswrite;
3828                 break;
3829             }
3830             break;
3831         }
3832         break;
3833     case 't':
3834         switch (len) {
3835         case 2:
3836             if (strEQ(d,"tr"))                  return KEY_tr;
3837             break;
3838         case 3:
3839             if (strEQ(d,"tie"))                 return KEY_tie;
3840             break;
3841         case 4:
3842             if (strEQ(d,"tell"))                return -KEY_tell;
3843             if (strEQ(d,"time"))                return -KEY_time;
3844             break;
3845         case 5:
3846             if (strEQ(d,"times"))               return -KEY_times;
3847             break;
3848         case 7:
3849             if (strEQ(d,"telldir"))             return -KEY_telldir;
3850             break;
3851         case 8:
3852             if (strEQ(d,"truncate"))            return -KEY_truncate;
3853             break;
3854         }
3855         break;
3856     case 'u':
3857         switch (len) {
3858         case 2:
3859             if (strEQ(d,"uc"))                  return -KEY_uc;
3860             break;
3861         case 3:
3862             if (strEQ(d,"use"))                 return KEY_use;
3863             break;
3864         case 5:
3865             if (strEQ(d,"undef"))               return KEY_undef;
3866             if (strEQ(d,"until"))               return KEY_until;
3867             if (strEQ(d,"untie"))               return KEY_untie;
3868             if (strEQ(d,"utime"))               return -KEY_utime;
3869             if (strEQ(d,"umask"))               return -KEY_umask;
3870             break;
3871         case 6:
3872             if (strEQ(d,"unless"))              return KEY_unless;
3873             if (strEQ(d,"unpack"))              return -KEY_unpack;
3874             if (strEQ(d,"unlink"))              return -KEY_unlink;
3875             break;
3876         case 7:
3877             if (strEQ(d,"unshift"))             return KEY_unshift;
3878             if (strEQ(d,"ucfirst"))             return -KEY_ucfirst;
3879             break;
3880         }
3881         break;
3882     case 'v':
3883         if (strEQ(d,"values"))                  return -KEY_values;
3884         if (strEQ(d,"vec"))                     return -KEY_vec;
3885         break;
3886     case 'w':
3887         switch (len) {
3888         case 4:
3889             if (strEQ(d,"warn"))                return -KEY_warn;
3890             if (strEQ(d,"wait"))                return -KEY_wait;
3891             break;
3892         case 5:
3893             if (strEQ(d,"while"))               return KEY_while;
3894             if (strEQ(d,"write"))               return -KEY_write;
3895             break;
3896         case 7:
3897             if (strEQ(d,"waitpid"))             return -KEY_waitpid;
3898             break;
3899         case 9:
3900             if (strEQ(d,"wantarray"))           return -KEY_wantarray;
3901             break;
3902         }
3903         break;
3904     case 'x':
3905         if (len == 1)                           return -KEY_x;
3906         if (strEQ(d,"xor"))                     return -KEY_xor;
3907         break;
3908     case 'y':
3909         if (len == 1)                           return KEY_y;
3910         break;
3911     case 'z':
3912         break;
3913     }
3914     return 0;
3915 }
3916
3917 static void
3918 checkcomma(s,name,what)
3919 register char *s;
3920 char *name;
3921 char *what;
3922 {
3923     char *w;
3924
3925     if (dowarn && *s == ' ' && s[1] == '(') {   /* XXX gotta be a better way */
3926         int level = 1;
3927         for (w = s+2; *w && level; w++) {
3928             if (*w == '(')
3929                 ++level;
3930             else if (*w == ')')
3931                 --level;
3932         }
3933         if (*w)
3934             for (; *w && isSPACE(*w); w++) ;
3935         if (!*w || !strchr(";|})]oa!=", *w))    /* an advisory hack only... */
3936             warn("%s (...) interpreted as function",name);
3937     }
3938     while (s < bufend && isSPACE(*s))
3939         s++;
3940     if (*s == '(')
3941         s++;
3942     while (s < bufend && isSPACE(*s))
3943         s++;
3944     if (isIDFIRST(*s)) {
3945         w = s++;
3946         while (isALNUM(*s))
3947             s++;
3948         while (s < bufend && isSPACE(*s))
3949             s++;
3950         if (*s == ',') {
3951             int kw;
3952             *s = '\0';
3953             kw = keyword(w, s - w);
3954             *s = ',';
3955             if (kw)
3956                 return;
3957             croak("No comma allowed after %s", what);
3958         }
3959     }
3960 }
3961
3962 static char *
3963 scan_word(s, dest, allow_package, slp)
3964 register char *s;
3965 char *dest;
3966 int allow_package;
3967 STRLEN *slp;
3968 {
3969     register char *d = dest;
3970     for (;;) {
3971         if (isALNUM(*s))
3972             *d++ = *s++;
3973         else if (*s == '\'' && allow_package && isIDFIRST(s[1])) {
3974             *d++ = ':';
3975             *d++ = ':';
3976             s++;
3977         }
3978         else if (*s == ':' && s[1] == ':' && allow_package && isIDFIRST(s[2])) {
3979             *d++ = *s++;
3980             *d++ = *s++;
3981         }
3982         else {
3983             *d = '\0';
3984             *slp = d - dest;
3985             return s;
3986         }
3987     }
3988 }
3989
3990 static char *
3991 scan_ident(s,send,dest,ck_uni)
3992 register char *s;
3993 register char *send;
3994 char *dest;
3995 I32 ck_uni;
3996 {
3997     register char *d;
3998     char *bracket = 0;
3999     char funny = *s++;
4000
4001     if (lex_brackets == 0)
4002         lex_fakebrack = 0;
4003     if (isSPACE(*s))
4004         s = skipspace(s);
4005     d = dest;
4006     if (isDIGIT(*s)) {
4007         while (isDIGIT(*s))
4008             *d++ = *s++;
4009     }
4010     else {
4011         for (;;) {
4012             if (isALNUM(*s))
4013                 *d++ = *s++;
4014             else if (*s == '\'' && isIDFIRST(s[1])) {
4015                 *d++ = ':';
4016                 *d++ = ':';
4017                 s++;
4018             }
4019             else if (*s == ':' && s[1] == ':') {
4020                 *d++ = *s++;
4021                 *d++ = *s++;
4022             }
4023             else
4024                 break;
4025         }
4026     }
4027     *d = '\0';
4028     d = dest;
4029     if (*d) {
4030         if (lex_state != LEX_NORMAL)
4031             lex_state = LEX_INTERPENDMAYBE;
4032         return s;
4033     }
4034     if (*s == '$' && s[1] &&
4035       (isALPHA(s[1]) || strchr("$_{", s[1]) || strnEQ(s+1,"::",2)) )
4036         return s;
4037     if (*s == '{') {
4038         bracket = s;
4039         s++;
4040     }
4041     else if (ck_uni)
4042         check_uni();
4043     if (s < send)
4044         *d = *s++;
4045     d[1] = '\0';
4046     if (*d == '^' && *s && (isUPPER(*s) || strchr("[\\]^_?", *s))) {
4047         *d = *s++ ^ 64;
4048     }
4049     if (bracket) {
4050         if (isSPACE(s[-1])) {
4051             while (s < send && (*s == ' ' || *s == '\t')) s++;
4052             *d = *s;
4053         }
4054         if (isALPHA(*d) || *d == '_') {
4055             d++;
4056             while (isALNUM(*s) || *s == ':')
4057                 *d++ = *s++;
4058             *d = '\0';
4059             while (s < send && (*s == ' ' || *s == '\t')) s++;
4060             if ((*s == '[' || *s == '{')) {
4061                 if (dowarn && keyword(dest, d - dest)) {
4062                     char *brack = *s == '[' ? "[...]" : "{...}";
4063                     warn("Ambiguous use of %c{%s%s} resolved to %c%s%s",
4064                         funny, dest, brack, funny, dest, brack);
4065                 }
4066                 lex_fakebrack = lex_brackets+1;
4067                 bracket++;
4068                 lex_brackstack[lex_brackets++] = XOPERATOR;
4069                 return s;
4070             }
4071         }
4072         if (*s == '}') {
4073             s++;
4074             if (lex_state == LEX_INTERPNORMAL && !lex_brackets)
4075                 lex_state = LEX_INTERPEND;
4076             if (funny == '#')
4077                 funny = '@';
4078             if (dowarn &&
4079               (keyword(dest, d - dest) || perl_get_cv(dest, FALSE)))
4080                 warn("Ambiguous use of %c{%s} resolved to %c%s",
4081                     funny, dest, funny, dest);
4082         }
4083         else {
4084             s = bracket;                /* let the parser handle it */
4085             *dest = '\0';
4086         }
4087     }
4088     else if (lex_state == LEX_INTERPNORMAL && !lex_brackets && !intuit_more(s))
4089         lex_state = LEX_INTERPEND;
4090     return s;
4091 }
4092
4093 void pmflag(pmfl,ch)
4094 U16* pmfl;
4095 int ch;
4096 {
4097     if (ch == 'i') {
4098         sawi = TRUE;
4099         *pmfl |= PMf_FOLD;
4100     }
4101     else if (ch == 'g')
4102         *pmfl |= PMf_GLOBAL;
4103     else if (ch == 'o')
4104         *pmfl |= PMf_KEEP;
4105     else if (ch == 'm')
4106         *pmfl |= PMf_MULTILINE;
4107     else if (ch == 's')
4108         *pmfl |= PMf_SINGLELINE;
4109     else if (ch == 'x')
4110         *pmfl |= PMf_EXTENDED;
4111 }
4112
4113 static char *
4114 scan_pat(start)
4115 char *start;
4116 {
4117     PMOP *pm;
4118     char *s;
4119
4120     s = scan_str(start);
4121     if (!s) {
4122         if (lex_stuff)
4123             SvREFCNT_dec(lex_stuff);
4124         lex_stuff = Nullsv;
4125         croak("Search pattern not terminated");
4126     }
4127     pm = (PMOP*)newPMOP(OP_MATCH, 0);
4128     if (multi_open == '?')
4129         pm->op_pmflags |= PMf_ONCE;
4130
4131     while (*s && strchr("iogmsx", *s))
4132         pmflag(&pm->op_pmflags,*s++);
4133
4134     lex_op = (OP*)pm;
4135     yylval.ival = OP_MATCH;
4136     return s;
4137 }
4138
4139 static char *
4140 scan_subst(start)
4141 char *start;
4142 {
4143     register char *s;
4144     register PMOP *pm;
4145     I32 es = 0;
4146
4147     yylval.ival = OP_NULL;
4148
4149     s = scan_str(start);
4150
4151     if (!s) {
4152         if (lex_stuff)
4153             SvREFCNT_dec(lex_stuff);
4154         lex_stuff = Nullsv;
4155         croak("Substitution pattern not terminated");
4156     }
4157
4158     if (s[-1] == multi_open)
4159         s--;
4160
4161     s = scan_str(s);
4162     if (!s) {
4163         if (lex_stuff)
4164             SvREFCNT_dec(lex_stuff);
4165         lex_stuff = Nullsv;
4166         if (lex_repl)
4167             SvREFCNT_dec(lex_repl);
4168         lex_repl = Nullsv;
4169         croak("Substitution replacement not terminated");
4170     }
4171
4172     pm = (PMOP*)newPMOP(OP_SUBST, 0);
4173     while (*s && strchr("iogmsex", *s)) {
4174         if (*s == 'e') {
4175             s++;
4176             es++;
4177         }
4178         else
4179             pmflag(&pm->op_pmflags,*s++);
4180     }
4181
4182     if (es) {
4183         SV *repl;
4184         pm->op_pmflags |= PMf_EVAL;
4185         repl = newSVpv("",0);
4186         while (es-- > 0)
4187             sv_catpv(repl, es ? "eval " : "do ");
4188         sv_catpvn(repl, "{ ", 2);
4189         sv_catsv(repl, lex_repl);
4190         sv_catpvn(repl, " };", 2);
4191         SvCOMPILED_on(repl);
4192         SvREFCNT_dec(lex_repl);
4193         lex_repl = repl;
4194     }
4195
4196     lex_op = (OP*)pm;
4197     yylval.ival = OP_SUBST;
4198     return s;
4199 }
4200
4201 void
4202 hoistmust(pm)
4203 register PMOP *pm;
4204 {
4205     if (!pm->op_pmshort && pm->op_pmregexp->regstart &&
4206         (!pm->op_pmregexp->regmust || pm->op_pmregexp->reganch & ROPT_ANCH)
4207        ) {
4208         if (!(pm->op_pmregexp->reganch & ROPT_ANCH))
4209             pm->op_pmflags |= PMf_SCANFIRST;
4210         else if (pm->op_pmflags & PMf_FOLD)
4211             return;
4212         pm->op_pmshort = SvREFCNT_inc(pm->op_pmregexp->regstart);
4213         pm->op_pmslen = SvCUR(pm->op_pmshort);
4214     }
4215     else if (pm->op_pmregexp->regmust) {/* is there a better short-circuit? */
4216         if (pm->op_pmshort &&
4217           sv_eq(pm->op_pmshort,pm->op_pmregexp->regmust))
4218         {
4219             if (pm->op_pmflags & PMf_SCANFIRST) {
4220                 SvREFCNT_dec(pm->op_pmshort);
4221                 pm->op_pmshort = Nullsv;
4222             }
4223             else {
4224                 SvREFCNT_dec(pm->op_pmregexp->regmust);
4225                 pm->op_pmregexp->regmust = Nullsv;
4226                 return;
4227             }
4228         }
4229         if (!pm->op_pmshort ||  /* promote the better string */
4230           ((pm->op_pmflags & PMf_SCANFIRST) &&
4231            (SvCUR(pm->op_pmshort) < SvCUR(pm->op_pmregexp->regmust)) )){
4232             SvREFCNT_dec(pm->op_pmshort);               /* ok if null */
4233             pm->op_pmshort = pm->op_pmregexp->regmust;
4234             pm->op_pmslen = SvCUR(pm->op_pmshort);
4235             pm->op_pmregexp->regmust = Nullsv;
4236             pm->op_pmflags |= PMf_SCANFIRST;
4237         }
4238     }
4239 }
4240
4241 static char *
4242 scan_trans(start)
4243 char *start;
4244 {
4245     register char* s;
4246     OP *op;
4247     short *tbl;
4248     I32 squash;
4249     I32 delete;
4250     I32 complement;
4251
4252     yylval.ival = OP_NULL;
4253
4254     s = scan_str(start);
4255     if (!s) {
4256         if (lex_stuff)
4257             SvREFCNT_dec(lex_stuff);
4258         lex_stuff = Nullsv;
4259         croak("Translation pattern not terminated");
4260     }
4261     if (s[-1] == multi_open)
4262         s--;
4263
4264     s = scan_str(s);
4265     if (!s) {
4266         if (lex_stuff)
4267             SvREFCNT_dec(lex_stuff);
4268         lex_stuff = Nullsv;
4269         if (lex_repl)
4270             SvREFCNT_dec(lex_repl);
4271         lex_repl = Nullsv;
4272         croak("Translation replacement not terminated");
4273     }
4274
4275     New(803,tbl,256,short);
4276     op = newPVOP(OP_TRANS, 0, (char*)tbl);
4277
4278     complement = delete = squash = 0;
4279     while (*s == 'c' || *s == 'd' || *s == 's') {
4280         if (*s == 'c')
4281             complement = OPpTRANS_COMPLEMENT;
4282         else if (*s == 'd')
4283             delete = OPpTRANS_DELETE;
4284         else
4285             squash = OPpTRANS_SQUASH;
4286         s++;
4287     }
4288     op->op_private = delete|squash|complement;
4289
4290     lex_op = op;
4291     yylval.ival = OP_TRANS;
4292     return s;
4293 }
4294
4295 static char *
4296 scan_heredoc(s)
4297 register char *s;
4298 {
4299     SV *herewas;
4300     I32 op_type = OP_SCALAR;
4301     I32 len;
4302     SV *tmpstr;
4303     char term;
4304     register char *d;
4305
4306     s += 2;
4307     d = tokenbuf;
4308     if (!rsfp)
4309         *d++ = '\n';
4310     if (*s && strchr("`'\"",*s)) {
4311         term = *s++;
4312         s = cpytill(d,s,bufend,term,&len);
4313         if (s < bufend)
4314             s++;
4315         d += len;
4316     }
4317     else {
4318         if (*s == '\\')
4319             s++, term = '\'';
4320         else
4321             term = '"';
4322         while (isALNUM(*s))
4323             *d++ = *s++;
4324     }                           /* assuming tokenbuf won't clobber */
4325     *d++ = '\n';
4326     *d = '\0';
4327     len = d - tokenbuf;
4328     d = "\n";
4329     if (rsfp || !(d=ninstr(s,bufend,d,d+1)))
4330         herewas = newSVpv(s,bufend-s);
4331     else
4332         s--, herewas = newSVpv(s,d-s);
4333     s += SvCUR(herewas);
4334
4335     tmpstr = NEWSV(87,80);
4336     sv_upgrade(tmpstr, SVt_PVIV);
4337     if (term == '\'') {
4338         op_type = OP_CONST;
4339         SvIVX(tmpstr) = -1;
4340     }
4341     else if (term == '`') {
4342         op_type = OP_BACKTICK;
4343         SvIVX(tmpstr) = '\\';
4344     }
4345
4346     CLINE;
4347     multi_start = curcop->cop_line;
4348     multi_open = multi_close = '<';
4349     term = *tokenbuf;
4350     if (!rsfp) {
4351         d = s;
4352         while (s < bufend &&
4353           (*s != term || bcmp(s,tokenbuf,len) != 0) ) {
4354             if (*s++ == '\n')
4355                 curcop->cop_line++;
4356         }
4357         if (s >= bufend) {
4358             curcop->cop_line = multi_start;
4359             missingterm(tokenbuf);
4360         }
4361         sv_setpvn(tmpstr,d+1,s-d);
4362         s += len - 1;
4363         sv_catpvn(herewas,s,bufend-s);
4364         sv_setsv(linestr,herewas);
4365         oldoldbufptr = oldbufptr = bufptr = s = SvPVX(linestr);
4366         bufend = SvPVX(linestr) + SvCUR(linestr);
4367     }
4368     else
4369         sv_setpvn(tmpstr,"",0);   /* avoid "uninitialized" warning */
4370     while (s >= bufend) {       /* multiple line string? */
4371         if (!rsfp ||
4372          !(oldoldbufptr = oldbufptr = s = filter_gets(linestr, rsfp))) {
4373             curcop->cop_line = multi_start;
4374             missingterm(tokenbuf);
4375         }
4376         curcop->cop_line++;
4377         if (perldb && curstash != debstash) {
4378             SV *sv = NEWSV(88,0);
4379
4380             sv_upgrade(sv, SVt_PVMG);
4381             sv_setsv(sv,linestr);
4382             av_store(GvAV(curcop->cop_filegv),
4383               (I32)curcop->cop_line,sv);
4384         }
4385         bufend = SvPVX(linestr) + SvCUR(linestr);
4386         if (*s == term && bcmp(s,tokenbuf,len) == 0) {
4387             s = bufend - 1;
4388             *s = ' ';
4389             sv_catsv(linestr,herewas);
4390             bufend = SvPVX(linestr) + SvCUR(linestr);
4391         }
4392         else {
4393             s = bufend;
4394             sv_catsv(tmpstr,linestr);
4395         }
4396     }
4397     multi_end = curcop->cop_line;
4398     s++;
4399     if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
4400         SvLEN_set(tmpstr, SvCUR(tmpstr) + 1);
4401         Renew(SvPVX(tmpstr), SvLEN(tmpstr), char);
4402     }
4403     SvREFCNT_dec(herewas);
4404     lex_stuff = tmpstr;
4405     yylval.ival = op_type;
4406     return s;
4407 }
4408
4409 static char *
4410 scan_inputsymbol(start)
4411 char *start;
4412 {
4413     register char *s = start;
4414     register char *d;
4415     I32 len;
4416
4417     d = tokenbuf;
4418     s = cpytill(d, s+1, bufend, '>', &len);
4419     if (s < bufend)
4420         s++;
4421     else
4422         croak("Unterminated <> operator");
4423
4424     if (*d == '$') d++;
4425     while (*d && (isALNUM(*d) || *d == '\'' || *d == ':'))
4426         d++;
4427     if (d - tokenbuf != len) {
4428         yylval.ival = OP_GLOB;
4429         set_csh();
4430         s = scan_str(start);
4431         if (!s)
4432             croak("Glob not terminated");
4433         return s;
4434     }
4435     else {
4436         d = tokenbuf;
4437         if (!len)
4438             (void)strcpy(d,"ARGV");
4439         if (*d == '$') {
4440             I32 tmp;
4441             if (tmp = pad_findmy(d)) {
4442                 OP *op = newOP(OP_PADSV, 0);
4443                 op->op_targ = tmp;
4444                 lex_op = (OP*)newUNOP(OP_READLINE, 0, newUNOP(OP_RV2GV, 0, op));
4445             }
4446             else {
4447                 GV *gv = gv_fetchpv(d+1,TRUE, SVt_PV);
4448                 lex_op = (OP*)newUNOP(OP_READLINE, 0,
4449                                         newUNOP(OP_RV2GV, 0,
4450                                             newUNOP(OP_RV2SV, 0,
4451                                                 newGVOP(OP_GV, 0, gv))));
4452             }
4453             yylval.ival = OP_NULL;
4454         }
4455         else {
4456             GV *gv = gv_fetchpv(d,TRUE, SVt_PVIO);
4457             lex_op = (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
4458             yylval.ival = OP_NULL;
4459         }
4460     }
4461     return s;
4462 }
4463
4464 static char *
4465 scan_str(start)
4466 char *start;
4467 {
4468     SV *sv;
4469     char *tmps;
4470     register char *s = start;
4471     register char term;
4472     register char *to;
4473     I32 brackets = 1;
4474
4475     if (isSPACE(*s))
4476         s = skipspace(s);
4477     CLINE;
4478     term = *s;
4479     multi_start = curcop->cop_line;
4480     multi_open = term;
4481     if (term && (tmps = strchr("([{< )]}> )]}>",term)))
4482         term = tmps[5];
4483     multi_close = term;
4484
4485     sv = NEWSV(87,80);
4486     sv_upgrade(sv, SVt_PVIV);
4487     SvIVX(sv) = term;
4488     (void)SvPOK_only(sv);               /* validate pointer */
4489     s++;
4490     for (;;) {
4491         SvGROW(sv, SvCUR(sv) + (bufend - s) + 1);
4492         to = SvPVX(sv)+SvCUR(sv);
4493         if (multi_open == multi_close) {
4494             for (; s < bufend; s++,to++) {
4495                 if (*s == '\n' && !rsfp)
4496                     curcop->cop_line++;
4497                 if (*s == '\\' && s+1 < bufend && term != '\\') {
4498                     if (s[1] == term)
4499                         s++;
4500                     else
4501                         *to++ = *s++;
4502                 }
4503                 else if (*s == term)
4504                     break;
4505                 *to = *s;
4506             }
4507         }
4508         else {
4509             for (; s < bufend; s++,to++) {
4510                 if (*s == '\n' && !rsfp)
4511                     curcop->cop_line++;
4512                 if (*s == '\\' && s+1 < bufend && term != '\\') {
4513                     if (s[1] == term)
4514                         s++;
4515                     else
4516                         *to++ = *s++;
4517                 }
4518                 else if (*s == term && --brackets <= 0)
4519                     break;
4520                 else if (*s == multi_open)
4521                     brackets++;
4522                 *to = *s;
4523             }
4524         }
4525         *to = '\0';
4526         SvCUR_set(sv, to - SvPVX(sv));
4527
4528     if (s < bufend) break;      /* string ends on this line? */
4529
4530         if (!rsfp ||
4531          !(oldoldbufptr = oldbufptr = s = filter_gets(linestr, rsfp))) {
4532             curcop->cop_line = multi_start;
4533             return Nullch;
4534         }
4535         curcop->cop_line++;
4536         if (perldb && curstash != debstash) {
4537             SV *sv = NEWSV(88,0);
4538
4539             sv_upgrade(sv, SVt_PVMG);
4540             sv_setsv(sv,linestr);
4541             av_store(GvAV(curcop->cop_filegv),
4542               (I32)curcop->cop_line, sv);
4543         }
4544         bufend = SvPVX(linestr) + SvCUR(linestr);
4545     }
4546     multi_end = curcop->cop_line;
4547     s++;
4548     if (SvCUR(sv) + 5 < SvLEN(sv)) {
4549         SvLEN_set(sv, SvCUR(sv) + 1);
4550         Renew(SvPVX(sv), SvLEN(sv), char);
4551     }
4552     if (lex_stuff)
4553         lex_repl = sv;
4554     else
4555         lex_stuff = sv;
4556     return s;
4557 }
4558
4559 char *
4560 scan_num(start)
4561 char *start;
4562 {
4563     register char *s = start;
4564     register char *d;
4565     I32 tryi32;
4566     double value;
4567     SV *sv;
4568     I32 floatit;
4569     char *lastub = 0;
4570
4571     switch (*s) {
4572     default:
4573         croak("panic: scan_num");
4574     case '0':
4575         {
4576             U32 i;
4577             I32 shift;
4578
4579             if (s[1] == 'x') {
4580                 shift = 4;
4581                 s += 2;
4582             }
4583             else if (s[1] == '.')
4584                 goto decimal;
4585             else
4586                 shift = 3;
4587             i = 0;
4588             for (;;) {
4589                 switch (*s) {
4590                 default:
4591                     goto out;
4592                 case '_':
4593                     s++;
4594                     break;
4595                 case '8': case '9':
4596                     if (shift != 4)
4597                         yyerror("Illegal octal digit");
4598                     /* FALL THROUGH */
4599                 case '0': case '1': case '2': case '3': case '4':
4600                 case '5': case '6': case '7':
4601                     i <<= shift;
4602                     i += *s++ & 15;
4603                     break;
4604                 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
4605                 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
4606                     if (shift != 4)
4607                         goto out;
4608                     i <<= 4;
4609                     i += (*s++ & 7) + 9;
4610                     break;
4611                 }
4612             }
4613           out:
4614             sv = NEWSV(92,0);
4615             tryi32 = i;
4616             if (tryi32 == i && tryi32 >= 0)
4617                 sv_setiv(sv,tryi32);
4618             else
4619                 sv_setnv(sv,(double)i);
4620         }
4621         break;
4622     case '1': case '2': case '3': case '4': case '5':
4623     case '6': case '7': case '8': case '9': case '.':
4624       decimal:
4625         d = tokenbuf;
4626         floatit = FALSE;
4627         while (isDIGIT(*s) || *s == '_') {
4628             if (*s == '_') {
4629                 if (dowarn && lastub && s - lastub != 3)
4630                     warn("Misplaced _ in number");
4631                 lastub = ++s;
4632             }
4633             else
4634                 *d++ = *s++;
4635         }
4636         if (dowarn && lastub && s - lastub != 3)
4637             warn("Misplaced _ in number");
4638         if (*s == '.' && s[1] != '.') {
4639             floatit = TRUE;
4640             *d++ = *s++;
4641             while (isDIGIT(*s) || *s == '_') {
4642                 if (*s == '_')
4643                     s++;
4644                 else
4645                     *d++ = *s++;
4646             }
4647         }
4648         if (*s && strchr("eE",*s) && strchr("+-0123456789",s[1])) {
4649             floatit = TRUE;
4650             s++;
4651             *d++ = 'e';         /* At least some Mach atof()s don't grok 'E' */
4652             if (*s == '+' || *s == '-')
4653                 *d++ = *s++;
4654             while (isDIGIT(*s))
4655                 *d++ = *s++;
4656         }
4657         *d = '\0';
4658         sv = NEWSV(92,0);
4659         value = atof(tokenbuf);
4660         tryi32 = I_32(value);
4661         if (!floatit && (double)tryi32 == value)
4662             sv_setiv(sv,tryi32);
4663         else
4664             sv_setnv(sv,value);
4665         break;
4666     }
4667
4668     yylval.opval = newSVOP(OP_CONST, 0, sv);
4669
4670     return s;
4671 }
4672
4673 static char *
4674 scan_formline(s)
4675 register char *s;
4676 {
4677     register char *eol;
4678     register char *t;
4679     SV *stuff = newSVpv("",0);
4680     bool needargs = FALSE;
4681
4682     while (!needargs) {
4683         if (*s == '.' || *s == '}') {
4684             /*SUPPRESS 530*/
4685             for (t = s+1; *t == ' ' || *t == '\t'; t++) ;
4686             if (*t == '\n')
4687                 break;
4688         }
4689         if (in_eval && !rsfp) {
4690             eol = strchr(s,'\n');
4691             if (!eol++)
4692                 eol = bufend;
4693         }
4694         else
4695             eol = bufend = SvPVX(linestr) + SvCUR(linestr);
4696         if (*s != '#') {
4697             for (t = s; t < eol; t++) {
4698                 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
4699                     needargs = FALSE;
4700                     goto enough;        /* ~~ must be first line in formline */
4701                 }
4702                 if (*t == '@' || *t == '^')
4703                     needargs = TRUE;
4704             }
4705             sv_catpvn(stuff, s, eol-s);
4706         }
4707         s = eol;
4708         if (rsfp) {
4709             s = filter_gets(linestr, rsfp);
4710             oldoldbufptr = oldbufptr = bufptr = SvPVX(linestr);
4711             bufend = bufptr + SvCUR(linestr);
4712             if (!s) {
4713                 s = bufptr;
4714                 yyerror("Format not terminated");
4715                 break;
4716             }
4717         }
4718         incline(s);
4719     }
4720   enough:
4721     if (SvCUR(stuff)) {
4722         expect = XTERM;
4723         if (needargs) {
4724             lex_state = LEX_NORMAL;
4725             nextval[nexttoke].ival = 0;
4726             force_next(',');
4727         }
4728         else
4729             lex_state = LEX_FORMLINE;
4730         nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, stuff);
4731         force_next(THING);
4732         nextval[nexttoke].ival = OP_FORMLINE;
4733         force_next(LSTOP);
4734     }
4735     else {
4736         SvREFCNT_dec(stuff);
4737         lex_formbrack = 0;
4738         bufptr = s;
4739     }
4740     return s;
4741 }
4742
4743 static void
4744 set_csh()
4745 {
4746 #ifdef CSH
4747     if (!cshlen)
4748         cshlen = strlen(cshname);
4749 #endif
4750 }
4751
4752 int
4753 start_subparse()
4754 {
4755     int oldsavestack_ix = savestack_ix;
4756     CV* outsidecv = compcv;
4757     AV* comppadlist;
4758
4759     if (compcv) {
4760         assert(SvTYPE(compcv) == SVt_PVCV);
4761     }
4762     save_I32(&subline);
4763     save_item(subname);
4764     SAVEINT(padix);
4765     SAVESPTR(curpad);
4766     SAVESPTR(comppad);
4767     SAVESPTR(comppad_name);
4768     SAVESPTR(compcv);
4769     SAVEINT(comppad_name_fill);
4770     SAVEINT(min_intro_pending);
4771     SAVEINT(max_intro_pending);
4772     SAVEINT(pad_reset_pending);
4773
4774     compcv = (CV*)NEWSV(1104,0);
4775     sv_upgrade((SV *)compcv, SVt_PVCV);
4776
4777     comppad = newAV();
4778     SAVEFREESV((SV*)comppad);
4779     comppad_name = newAV();
4780     SAVEFREESV((SV*)comppad_name);
4781     comppad_name_fill = 0;
4782     min_intro_pending = 0;
4783     av_push(comppad, Nullsv);
4784     curpad = AvARRAY(comppad);
4785     padix = 0;
4786     subline = curcop->cop_line;
4787
4788     comppadlist = newAV();
4789     AvREAL_off(comppadlist);
4790     av_store(comppadlist, 0, SvREFCNT_inc((SV*)comppad_name));
4791     av_store(comppadlist, 1, SvREFCNT_inc((SV*)comppad));
4792
4793     CvPADLIST(compcv) = comppadlist;
4794     CvOUTSIDE(compcv) = (CV*)SvREFCNT_inc((SV*)outsidecv);
4795
4796     return oldsavestack_ix;
4797 }
4798
4799 int
4800 yywarn(s)
4801 char *s;
4802 {
4803     --error_count;
4804     in_eval |= 2;
4805     yyerror(s);
4806     in_eval &= ~2;
4807     return 0;
4808 }
4809
4810 int
4811 yyerror(s)
4812 char *s;
4813 {
4814     char tmpbuf[258];
4815     char *tname = tmpbuf;
4816
4817     if (bufptr > oldoldbufptr && bufptr - oldoldbufptr < 200 &&
4818       oldoldbufptr != oldbufptr && oldbufptr != bufptr) {
4819         while (isSPACE(*oldoldbufptr))
4820             oldoldbufptr++;
4821         sprintf(tname,"near \"%.*s\"",bufptr - oldoldbufptr, oldoldbufptr);
4822     }
4823     else if (bufptr > oldbufptr && bufptr - oldbufptr < 200 &&
4824       oldbufptr != bufptr) {
4825         while (isSPACE(*oldbufptr))
4826             oldbufptr++;
4827         sprintf(tname,"near \"%.*s\"",bufptr - oldbufptr, oldbufptr);
4828     }
4829     else if (yychar > 255)
4830         tname = "next token ???";
4831     else if (!yychar || (yychar == ';' && !rsfp))
4832         (void)strcpy(tname,"at EOF");
4833     else if ((yychar & 127) == 127) {
4834         if (lex_state == LEX_NORMAL ||
4835            (lex_state == LEX_KNOWNEXT && lex_defer == LEX_NORMAL))
4836             (void)strcpy(tname,"at end of line");
4837         else
4838             (void)strcpy(tname,"within string");
4839     }
4840     else if (yychar < 32)
4841         (void)sprintf(tname,"next char ^%c",yychar+64);
4842     else
4843         (void)sprintf(tname,"next char %c",yychar);
4844     (void)sprintf(buf, "%s at %s line %d, %s\n",
4845       s,SvPVX(GvSV(curcop->cop_filegv)),curcop->cop_line,tname);
4846     if (curcop->cop_line == multi_end && multi_start < multi_end) {
4847         sprintf(buf+strlen(buf),
4848           "  (Might be a runaway multi-line %c%c string starting on line %ld)\n",
4849           multi_open,multi_close,(long)multi_start);
4850         multi_end = 0;
4851     }
4852     if (in_eval & 2)
4853         warn("%s",buf);
4854     else if (in_eval)
4855         sv_catpv(GvSV(gv_fetchpv("@",TRUE, SVt_PV)),buf);
4856     else
4857         fputs(buf,stderr);
4858     if (++error_count >= 10)
4859         croak("%s has too many errors.\n",
4860         SvPVX(GvSV(curcop->cop_filegv)));
4861     return 0;
4862 }