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