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