misc a2p fixes
[p5sagit/p5-mst-13.2.git] / toke.c
1 /*    toke.c
2  *
3  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4  *    2000, 2001, 2002, 2003, 2004, 2005, by Larry Wall and others
5  *
6  *    You may distribute under the terms of either the GNU General Public
7  *    License or the Artistic License, as specified in the README file.
8  *
9  */
10
11 /*
12  *   "It all comes from here, the stench and the peril."  --Frodo
13  */
14
15 /*
16  * This file is the lexer for Perl.  It's closely linked to the
17  * parser, perly.y.
18  *
19  * The main routine is yylex(), which returns the next token.
20  */
21
22 #include "EXTERN.h"
23 #define PERL_IN_TOKE_C
24 #include "perl.h"
25
26 #define yychar  (*PL_yycharp)
27 #define yylval  (*PL_yylvalp)
28
29 static const char ident_too_long[] =
30   "Identifier too long";
31 static const char c_without_g[] =
32   "Use of /c modifier is meaningless without /g";
33 static const char c_in_subst[] =
34   "Use of /c modifier is meaningless in s///";
35
36 static void restore_rsfp(pTHX_ void *f);
37 #ifndef PERL_NO_UTF16_FILTER
38 static I32 utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen);
39 static I32 utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen);
40 #endif
41
42 #define XFAKEBRACK 128
43 #define XENUMMASK 127
44
45 #ifdef USE_UTF8_SCRIPTS
46 #   define UTF (!IN_BYTES)
47 #else
48 #   define UTF ((PL_linestr && DO_UTF8(PL_linestr)) || (PL_hints & HINT_UTF8))
49 #endif
50
51 /* In variables named $^X, these are the legal values for X.
52  * 1999-02-27 mjd-perl-patch@plover.com */
53 #define isCONTROLVAR(x) (isUPPER(x) || strchr("[\\]^_?", (x)))
54
55 /* On MacOS, respect nonbreaking spaces */
56 #ifdef MACOS_TRADITIONAL
57 #define SPACE_OR_TAB(c) ((c)==' '||(c)=='\312'||(c)=='\t')
58 #else
59 #define SPACE_OR_TAB(c) ((c)==' '||(c)=='\t')
60 #endif
61
62 /* LEX_* are values for PL_lex_state, the state of the lexer.
63  * They are arranged oddly so that the guard on the switch statement
64  * can get by with a single comparison (if the compiler is smart enough).
65  */
66
67 /* #define LEX_NOTPARSING               11 is done in perl.h. */
68
69 #define LEX_NORMAL              10
70 #define LEX_INTERPNORMAL         9
71 #define LEX_INTERPCASEMOD        8
72 #define LEX_INTERPPUSH           7
73 #define LEX_INTERPSTART          6
74 #define LEX_INTERPEND            5
75 #define LEX_INTERPENDMAYBE       4
76 #define LEX_INTERPCONCAT         3
77 #define LEX_INTERPCONST          2
78 #define LEX_FORMLINE             1
79 #define LEX_KNOWNEXT             0
80
81 #ifdef DEBUGGING
82 static const char* const lex_state_names[] = {
83     "KNOWNEXT",
84     "FORMLINE",
85     "INTERPCONST",
86     "INTERPCONCAT",
87     "INTERPENDMAYBE",
88     "INTERPEND",
89     "INTERPSTART",
90     "INTERPPUSH",
91     "INTERPCASEMOD",
92     "INTERPNORMAL",
93     "NORMAL"
94 };
95 #endif
96
97 #ifdef ff_next
98 #undef ff_next
99 #endif
100
101 #include "keywords.h"
102
103 /* CLINE is a macro that ensures PL_copline has a sane value */
104
105 #ifdef CLINE
106 #undef CLINE
107 #endif
108 #define CLINE (PL_copline = (CopLINE(PL_curcop) < PL_copline ? CopLINE(PL_curcop) : PL_copline))
109
110 /*
111  * Convenience functions to return different tokens and prime the
112  * lexer for the next token.  They all take an argument.
113  *
114  * TOKEN        : generic token (used for '(', DOLSHARP, etc)
115  * OPERATOR     : generic operator
116  * AOPERATOR    : assignment operator
117  * PREBLOCK     : beginning the block after an if, while, foreach, ...
118  * PRETERMBLOCK : beginning a non-code-defining {} block (eg, hash ref)
119  * PREREF       : *EXPR where EXPR is not a simple identifier
120  * TERM         : expression term
121  * LOOPX        : loop exiting command (goto, last, dump, etc)
122  * FTST         : file test operator
123  * FUN0         : zero-argument function
124  * FUN1         : not used, except for not, which isn't a UNIOP
125  * BOop         : bitwise or or xor
126  * BAop         : bitwise and
127  * SHop         : shift operator
128  * PWop         : power operator
129  * PMop         : pattern-matching operator
130  * Aop          : addition-level operator
131  * Mop          : multiplication-level operator
132  * Eop          : equality-testing operator
133  * Rop          : relational operator <= != gt
134  *
135  * Also see LOP and lop() below.
136  */
137
138 #ifdef DEBUGGING /* Serve -DT. */
139 #   define REPORT(retval) tokereport(s,(int)retval)
140 #else
141 #   define REPORT(retval) (retval)
142 #endif
143
144 #define TOKEN(retval) return ( PL_bufptr = s, REPORT(retval))
145 #define OPERATOR(retval) return (PL_expect = XTERM, PL_bufptr = s, REPORT(retval))
146 #define AOPERATOR(retval) return ao((PL_expect = XTERM, PL_bufptr = s, REPORT(retval)))
147 #define PREBLOCK(retval) return (PL_expect = XBLOCK,PL_bufptr = s, REPORT(retval))
148 #define PRETERMBLOCK(retval) return (PL_expect = XTERMBLOCK,PL_bufptr = s, REPORT(retval))
149 #define PREREF(retval) return (PL_expect = XREF,PL_bufptr = s, REPORT(retval))
150 #define TERM(retval) return (CLINE, PL_expect = XOPERATOR, PL_bufptr = s, REPORT(retval))
151 #define LOOPX(f) return (yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)LOOPEX))
152 #define FTST(f)  return (yylval.ival=f, PL_expect=XTERMORDORDOR, PL_bufptr=s, REPORT((int)UNIOP))
153 #define FUN0(f)  return (yylval.ival=f, PL_expect=XOPERATOR, PL_bufptr=s, REPORT((int)FUNC0))
154 #define FUN1(f)  return (yylval.ival=f, PL_expect=XOPERATOR, PL_bufptr=s, REPORT((int)FUNC1))
155 #define BOop(f)  return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)BITOROP)))
156 #define BAop(f)  return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)BITANDOP)))
157 #define SHop(f)  return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)SHIFTOP)))
158 #define PWop(f)  return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)POWOP)))
159 #define PMop(f)  return(yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)MATCHOP))
160 #define Aop(f)   return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)ADDOP)))
161 #define Mop(f)   return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)MULOP)))
162 #define Eop(f)   return (yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)EQOP))
163 #define Rop(f)   return (yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)RELOP))
164
165 /* This bit of chicanery makes a unary function followed by
166  * a parenthesis into a function with one argument, highest precedence.
167  * The UNIDOR macro is for unary functions that can be followed by the //
168  * operator (such as C<shift // 0>).
169  */
170 #define UNI2(f,x) { \
171         yylval.ival = f; \
172         PL_expect = x; \
173         PL_bufptr = s; \
174         PL_last_uni = PL_oldbufptr; \
175         PL_last_lop_op = f; \
176         if (*s == '(') \
177             return REPORT( (int)FUNC1 ); \
178         s = skipspace(s); \
179         return REPORT( *s=='(' ? (int)FUNC1 : (int)UNIOP ); \
180         }
181 #define UNI(f)    UNI2(f,XTERM)
182 #define UNIDOR(f) UNI2(f,XTERMORDORDOR)
183
184 #define UNIBRACK(f) { \
185         yylval.ival = f; \
186         PL_bufptr = s; \
187         PL_last_uni = PL_oldbufptr; \
188         if (*s == '(') \
189             return REPORT( (int)FUNC1 ); \
190         s = skipspace(s); \
191         return REPORT( (*s == '(') ? (int)FUNC1 : (int)UNIOP ); \
192         }
193
194 /* grandfather return to old style */
195 #define OLDLOP(f) return(yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)LSTOP)
196
197 #ifdef DEBUGGING
198
199 /* how to interpret the yylval associated with the token */
200 enum token_type {
201     TOKENTYPE_NONE,
202     TOKENTYPE_IVAL,
203     TOKENTYPE_OPNUM, /* yylval.ival contains an opcode number */
204     TOKENTYPE_PVAL,
205     TOKENTYPE_OPVAL,
206     TOKENTYPE_GVVAL
207 };
208
209 static struct debug_tokens { const int token, type; const char *name; }
210   const debug_tokens[] =
211 {
212     { ADDOP,            TOKENTYPE_OPNUM,        "ADDOP" },
213     { ANDAND,           TOKENTYPE_NONE,         "ANDAND" },
214     { ANDOP,            TOKENTYPE_NONE,         "ANDOP" },
215     { ANONSUB,          TOKENTYPE_IVAL,         "ANONSUB" },
216     { ARROW,            TOKENTYPE_NONE,         "ARROW" },
217     { ASSIGNOP,         TOKENTYPE_OPNUM,        "ASSIGNOP" },
218     { BITANDOP,         TOKENTYPE_OPNUM,        "BITANDOP" },
219     { BITOROP,          TOKENTYPE_OPNUM,        "BITOROP" },
220     { COLONATTR,        TOKENTYPE_NONE,         "COLONATTR" },
221     { CONTINUE,         TOKENTYPE_NONE,         "CONTINUE" },
222     { DO,               TOKENTYPE_NONE,         "DO" },
223     { DOLSHARP,         TOKENTYPE_NONE,         "DOLSHARP" },
224     { DORDOR,           TOKENTYPE_NONE,         "DORDOR" },
225     { DOROP,            TOKENTYPE_OPNUM,        "DOROP" },
226     { DOTDOT,           TOKENTYPE_IVAL,         "DOTDOT" },
227     { ELSE,             TOKENTYPE_NONE,         "ELSE" },
228     { ELSIF,            TOKENTYPE_IVAL,         "ELSIF" },
229     { EQOP,             TOKENTYPE_OPNUM,        "EQOP" },
230     { FOR,              TOKENTYPE_IVAL,         "FOR" },
231     { FORMAT,           TOKENTYPE_NONE,         "FORMAT" },
232     { FUNC,             TOKENTYPE_OPNUM,        "FUNC" },
233     { FUNC0,            TOKENTYPE_OPNUM,        "FUNC0" },
234     { FUNC0SUB,         TOKENTYPE_OPVAL,        "FUNC0SUB" },
235     { FUNC1,            TOKENTYPE_OPNUM,        "FUNC1" },
236     { FUNCMETH,         TOKENTYPE_OPVAL,        "FUNCMETH" },
237     { HASHBRACK,        TOKENTYPE_NONE,         "HASHBRACK" },
238     { IF,               TOKENTYPE_IVAL,         "IF" },
239     { LABEL,            TOKENTYPE_PVAL,         "LABEL" },
240     { LOCAL,            TOKENTYPE_IVAL,         "LOCAL" },
241     { LOOPEX,           TOKENTYPE_OPNUM,        "LOOPEX" },
242     { LSTOP,            TOKENTYPE_OPNUM,        "LSTOP" },
243     { LSTOPSUB,         TOKENTYPE_OPVAL,        "LSTOPSUB" },
244     { MATCHOP,          TOKENTYPE_OPNUM,        "MATCHOP" },
245     { METHOD,           TOKENTYPE_OPVAL,        "METHOD" },
246     { MULOP,            TOKENTYPE_OPNUM,        "MULOP" },
247     { MY,               TOKENTYPE_IVAL,         "MY" },
248     { MYSUB,            TOKENTYPE_NONE,         "MYSUB" },
249     { NOAMP,            TOKENTYPE_NONE,         "NOAMP" },
250     { NOTOP,            TOKENTYPE_NONE,         "NOTOP" },
251     { OROP,             TOKENTYPE_IVAL,         "OROP" },
252     { OROR,             TOKENTYPE_NONE,         "OROR" },
253     { PACKAGE,          TOKENTYPE_NONE,         "PACKAGE" },
254     { PMFUNC,           TOKENTYPE_OPVAL,        "PMFUNC" },
255     { POSTDEC,          TOKENTYPE_NONE,         "POSTDEC" },
256     { POSTINC,          TOKENTYPE_NONE,         "POSTINC" },
257     { POWOP,            TOKENTYPE_OPNUM,        "POWOP" },
258     { PREDEC,           TOKENTYPE_NONE,         "PREDEC" },
259     { PREINC,           TOKENTYPE_NONE,         "PREINC" },
260     { PRIVATEREF,       TOKENTYPE_OPVAL,        "PRIVATEREF" },
261     { REFGEN,           TOKENTYPE_NONE,         "REFGEN" },
262     { RELOP,            TOKENTYPE_OPNUM,        "RELOP" },
263     { SHIFTOP,          TOKENTYPE_OPNUM,        "SHIFTOP" },
264     { SUB,              TOKENTYPE_NONE,         "SUB" },
265     { THING,            TOKENTYPE_OPVAL,        "THING" },
266     { UMINUS,           TOKENTYPE_NONE,         "UMINUS" },
267     { UNIOP,            TOKENTYPE_OPNUM,        "UNIOP" },
268     { UNIOPSUB,         TOKENTYPE_OPVAL,        "UNIOPSUB" },
269     { UNLESS,           TOKENTYPE_IVAL,         "UNLESS" },
270     { UNTIL,            TOKENTYPE_IVAL,         "UNTIL" },
271     { USE,              TOKENTYPE_IVAL,         "USE" },
272     { WHILE,            TOKENTYPE_IVAL,         "WHILE" },
273     { WORD,             TOKENTYPE_OPVAL,        "WORD" },
274     { 0,                TOKENTYPE_NONE,         0 }
275 };
276
277 /* dump the returned token in rv, plus any optional arg in yylval */
278
279 STATIC int
280 S_tokereport(pTHX_ const char* s, I32 rv)
281 {
282     if (DEBUG_T_TEST) {
283         const char *name = Nullch;
284         enum token_type type = TOKENTYPE_NONE;
285         const struct debug_tokens *p;
286         SV* const report = newSVpvn("<== ", 4);
287
288         for (p = debug_tokens; p->token; p++) {
289             if (p->token == (int)rv) {
290                 name = p->name;
291                 type = p->type;
292                 break;
293             }
294         }
295         if (name)
296             Perl_sv_catpv(aTHX_ report, name);
297         else if ((char)rv > ' ' && (char)rv < '~')
298             Perl_sv_catpvf(aTHX_ report, "'%c'", (char)rv);
299         else if (!rv)
300             Perl_sv_catpv(aTHX_ report, "EOF");
301         else
302             Perl_sv_catpvf(aTHX_ report, "?? %"IVdf, (IV)rv);
303         switch (type) {
304         case TOKENTYPE_NONE:
305         case TOKENTYPE_GVVAL: /* doesn't appear to be used */
306             break;
307         case TOKENTYPE_IVAL:
308             Perl_sv_catpvf(aTHX_ report, "(ival=%"IVdf")", (IV)yylval.ival);
309             break;
310         case TOKENTYPE_OPNUM:
311             Perl_sv_catpvf(aTHX_ report, "(ival=op_%s)",
312                                     PL_op_name[yylval.ival]);
313             break;
314         case TOKENTYPE_PVAL:
315             Perl_sv_catpvf(aTHX_ report, "(pval=\"%s\")", yylval.pval);
316             break;
317         case TOKENTYPE_OPVAL:
318             if (yylval.opval)
319                 Perl_sv_catpvf(aTHX_ report, "(opval=op_%s)",
320                                     PL_op_name[yylval.opval->op_type]);
321             else
322                 Perl_sv_catpv(aTHX_ report, "(opval=null)");
323             break;
324         }
325         Perl_sv_catpvf(aTHX_ report, " at line %"IVdf" [", (IV)CopLINE(PL_curcop));
326         if (s - PL_bufptr > 0)
327             sv_catpvn(report, PL_bufptr, s - PL_bufptr);
328         else {
329             if (PL_oldbufptr && *PL_oldbufptr)
330                 sv_catpv(report, PL_tokenbuf);
331         }
332         PerlIO_printf(Perl_debug_log, "### %s]\n", SvPV_nolen_const(report));
333     };
334     return (int)rv;
335 }
336
337 #endif
338
339 /*
340  * S_ao
341  *
342  * This subroutine detects &&=, ||=, and //= and turns an ANDAND, OROR or DORDOR
343  * into an OP_ANDASSIGN, OP_ORASSIGN, or OP_DORASSIGN
344  */
345
346 STATIC int
347 S_ao(pTHX_ int toketype)
348 {
349     if (*PL_bufptr == '=') {
350         PL_bufptr++;
351         if (toketype == ANDAND)
352             yylval.ival = OP_ANDASSIGN;
353         else if (toketype == OROR)
354             yylval.ival = OP_ORASSIGN;
355         else if (toketype == DORDOR)
356             yylval.ival = OP_DORASSIGN;
357         toketype = ASSIGNOP;
358     }
359     return toketype;
360 }
361
362 /*
363  * S_no_op
364  * When Perl expects an operator and finds something else, no_op
365  * prints the warning.  It always prints "<something> found where
366  * operator expected.  It prints "Missing semicolon on previous line?"
367  * if the surprise occurs at the start of the line.  "do you need to
368  * predeclare ..." is printed out for code like "sub bar; foo bar $x"
369  * where the compiler doesn't know if foo is a method call or a function.
370  * It prints "Missing operator before end of line" if there's nothing
371  * after the missing operator, or "... before <...>" if there is something
372  * after the missing operator.
373  */
374
375 STATIC void
376 S_no_op(pTHX_ const char *what, char *s)
377 {
378     char * const oldbp = PL_bufptr;
379     const bool is_first = (PL_oldbufptr == PL_linestart);
380
381     if (!s)
382         s = oldbp;
383     else
384         PL_bufptr = s;
385     yywarn(Perl_form(aTHX_ "%s found where operator expected", what));
386     if (ckWARN_d(WARN_SYNTAX)) {
387         if (is_first)
388             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
389                     "\t(Missing semicolon on previous line?)\n");
390         else if (PL_oldoldbufptr && isIDFIRST_lazy_if(PL_oldoldbufptr,UTF)) {
391             const char *t;
392             for (t = PL_oldoldbufptr; *t && (isALNUM_lazy_if(t,UTF) || *t == ':'); t++) ;
393             if (t < PL_bufptr && isSPACE(*t))
394                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
395                         "\t(Do you need to predeclare %.*s?)\n",
396                     t - PL_oldoldbufptr, PL_oldoldbufptr);
397         }
398         else {
399             assert(s >= oldbp);
400             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
401                     "\t(Missing operator before %.*s?)\n", s - oldbp, oldbp);
402         }
403     }
404     PL_bufptr = oldbp;
405 }
406
407 /*
408  * S_missingterm
409  * Complain about missing quote/regexp/heredoc terminator.
410  * If it's called with (char *)NULL then it cauterizes the line buffer.
411  * If we're in a delimited string and the delimiter is a control
412  * character, it's reformatted into a two-char sequence like ^C.
413  * This is fatal.
414  */
415
416 STATIC void
417 S_missingterm(pTHX_ char *s)
418 {
419     char tmpbuf[3];
420     char q;
421     if (s) {
422         char * const nl = strrchr(s,'\n');
423         if (nl)
424             *nl = '\0';
425     }
426     else if (
427 #ifdef EBCDIC
428         iscntrl(PL_multi_close)
429 #else
430         PL_multi_close < 32 || PL_multi_close == 127
431 #endif
432         ) {
433         *tmpbuf = '^';
434         tmpbuf[1] = toCTRL(PL_multi_close);
435         tmpbuf[2] = '\0';
436         s = tmpbuf;
437     }
438     else {
439         *tmpbuf = (char)PL_multi_close;
440         tmpbuf[1] = '\0';
441         s = tmpbuf;
442     }
443     q = strchr(s,'"') ? '\'' : '"';
444     Perl_croak(aTHX_ "Can't find string terminator %c%s%c anywhere before EOF",q,s,q);
445 }
446
447 /*
448  * Perl_deprecate
449  */
450
451 void
452 Perl_deprecate(pTHX_ const char *s)
453 {
454     if (ckWARN(WARN_DEPRECATED))
455         Perl_warner(aTHX_ packWARN(WARN_DEPRECATED), "Use of %s is deprecated", s);
456 }
457
458 void
459 Perl_deprecate_old(pTHX_ const char *s)
460 {
461     /* This function should NOT be called for any new deprecated warnings */
462     /* Use Perl_deprecate instead                                         */
463     /*                                                                    */
464     /* It is here to maintain backward compatibility with the pre-5.8     */
465     /* warnings category hierarchy. The "deprecated" category used to     */
466     /* live under the "syntax" category. It is now a top-level category   */
467     /* in its own right.                                                  */
468
469     if (ckWARN2(WARN_DEPRECATED, WARN_SYNTAX))
470         Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
471                         "Use of %s is deprecated", s);
472 }
473
474 /*
475  * depcom
476  * Deprecate a comma-less variable list.
477  */
478
479 STATIC void
480 S_depcom(pTHX)
481 {
482     deprecate_old("comma-less variable list");
483 }
484
485 /*
486  * experimental text filters for win32 carriage-returns, utf16-to-utf8 and
487  * utf16-to-utf8-reversed.
488  */
489
490 #ifdef PERL_CR_FILTER
491 static void
492 strip_return(SV *sv)
493 {
494     register const char *s = SvPVX_const(sv);
495     register const char * const e = s + SvCUR(sv);
496     /* outer loop optimized to do nothing if there are no CR-LFs */
497     while (s < e) {
498         if (*s++ == '\r' && *s == '\n') {
499             /* hit a CR-LF, need to copy the rest */
500             register char *d = s - 1;
501             *d++ = *s++;
502             while (s < e) {
503                 if (*s == '\r' && s[1] == '\n')
504                     s++;
505                 *d++ = *s++;
506             }
507             SvCUR(sv) -= s - d;
508             return;
509         }
510     }
511 }
512
513 STATIC I32
514 S_cr_textfilter(pTHX_ int idx, SV *sv, int maxlen)
515 {
516     const I32 count = FILTER_READ(idx+1, sv, maxlen);
517     if (count > 0 && !maxlen)
518         strip_return(sv);
519     return count;
520 }
521 #endif
522
523 /*
524  * Perl_lex_start
525  * Initialize variables.  Uses the Perl save_stack to save its state (for
526  * recursive calls to the parser).
527  */
528
529 void
530 Perl_lex_start(pTHX_ SV *line)
531 {
532     const char *s;
533     STRLEN len;
534
535     SAVEI32(PL_lex_dojoin);
536     SAVEI32(PL_lex_brackets);
537     SAVEI32(PL_lex_casemods);
538     SAVEI32(PL_lex_starts);
539     SAVEI32(PL_lex_state);
540     SAVEVPTR(PL_lex_inpat);
541     SAVEI32(PL_lex_inwhat);
542     if (PL_lex_state == LEX_KNOWNEXT) {
543         I32 toke = PL_nexttoke;
544         while (--toke >= 0) {
545             SAVEI32(PL_nexttype[toke]);
546             SAVEVPTR(PL_nextval[toke]);
547         }
548         SAVEI32(PL_nexttoke);
549     }
550     SAVECOPLINE(PL_curcop);
551     SAVEPPTR(PL_bufptr);
552     SAVEPPTR(PL_bufend);
553     SAVEPPTR(PL_oldbufptr);
554     SAVEPPTR(PL_oldoldbufptr);
555     SAVEPPTR(PL_last_lop);
556     SAVEPPTR(PL_last_uni);
557     SAVEPPTR(PL_linestart);
558     SAVESPTR(PL_linestr);
559     SAVEGENERICPV(PL_lex_brackstack);
560     SAVEGENERICPV(PL_lex_casestack);
561     SAVEDESTRUCTOR_X(restore_rsfp, PL_rsfp);
562     SAVESPTR(PL_lex_stuff);
563     SAVEI32(PL_lex_defer);
564     SAVEI32(PL_sublex_info.sub_inwhat);
565     SAVESPTR(PL_lex_repl);
566     SAVEINT(PL_expect);
567     SAVEINT(PL_lex_expect);
568
569     PL_lex_state = LEX_NORMAL;
570     PL_lex_defer = 0;
571     PL_expect = XSTATE;
572     PL_lex_brackets = 0;
573     Newx(PL_lex_brackstack, 120, char);
574     Newx(PL_lex_casestack, 12, char);
575     PL_lex_casemods = 0;
576     *PL_lex_casestack = '\0';
577     PL_lex_dojoin = 0;
578     PL_lex_starts = 0;
579     PL_lex_stuff = Nullsv;
580     PL_lex_repl = Nullsv;
581     PL_lex_inpat = 0;
582     PL_nexttoke = 0;
583     PL_lex_inwhat = 0;
584     PL_sublex_info.sub_inwhat = 0;
585     PL_linestr = line;
586     if (SvREADONLY(PL_linestr))
587         PL_linestr = sv_2mortal(newSVsv(PL_linestr));
588     s = SvPV_const(PL_linestr, len);
589     if (!len || s[len-1] != ';') {
590         if (!(SvFLAGS(PL_linestr) & SVs_TEMP))
591             PL_linestr = sv_2mortal(newSVsv(PL_linestr));
592         sv_catpvn(PL_linestr, "\n;", 2);
593     }
594     SvTEMP_off(PL_linestr);
595     PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
596     PL_bufend = PL_bufptr + SvCUR(PL_linestr);
597     PL_last_lop = PL_last_uni = Nullch;
598     PL_rsfp = 0;
599 }
600
601 /*
602  * Perl_lex_end
603  * Finalizer for lexing operations.  Must be called when the parser is
604  * done with the lexer.
605  */
606
607 void
608 Perl_lex_end(pTHX)
609 {
610     PL_doextract = FALSE;
611 }
612
613 /*
614  * S_incline
615  * This subroutine has nothing to do with tilting, whether at windmills
616  * or pinball tables.  Its name is short for "increment line".  It
617  * increments the current line number in CopLINE(PL_curcop) and checks
618  * to see whether the line starts with a comment of the form
619  *    # line 500 "foo.pm"
620  * If so, it sets the current line number and file to the values in the comment.
621  */
622
623 STATIC void
624 S_incline(pTHX_ char *s)
625 {
626     char *t;
627     char *n;
628     char *e;
629     char ch;
630
631     CopLINE_inc(PL_curcop);
632     if (*s++ != '#')
633         return;
634     while (SPACE_OR_TAB(*s)) s++;
635     if (strnEQ(s, "line", 4))
636         s += 4;
637     else
638         return;
639     if (SPACE_OR_TAB(*s))
640         s++;
641     else
642         return;
643     while (SPACE_OR_TAB(*s)) s++;
644     if (!isDIGIT(*s))
645         return;
646     n = s;
647     while (isDIGIT(*s))
648         s++;
649     while (SPACE_OR_TAB(*s))
650         s++;
651     if (*s == '"' && (t = strchr(s+1, '"'))) {
652         s++;
653         e = t + 1;
654     }
655     else {
656         for (t = s; !isSPACE(*t); t++) ;
657         e = t;
658     }
659     while (SPACE_OR_TAB(*e) || *e == '\r' || *e == '\f')
660         e++;
661     if (*e != '\n' && *e != '\0')
662         return;         /* false alarm */
663
664     ch = *t;
665     *t = '\0';
666     if (t - s > 0) {
667 #ifndef USE_ITHREADS
668         const char *cf = CopFILE(PL_curcop);
669         if (cf && strlen(cf) > 7 && strnEQ(cf, "(eval ", 6)) {
670             /* must copy *{"::_<(eval N)[oldfilename:L]"}
671              * to *{"::_<newfilename"} */
672             char smallbuf[256], smallbuf2[256];
673             char *tmpbuf, *tmpbuf2;
674             GV **gvp, *gv2;
675             STRLEN tmplen = strlen(cf);
676             STRLEN tmplen2 = strlen(s);
677             if (tmplen + 3 < sizeof smallbuf)
678                 tmpbuf = smallbuf;
679             else
680                 Newx(tmpbuf, tmplen + 3, char);
681             if (tmplen2 + 3 < sizeof smallbuf2)
682                 tmpbuf2 = smallbuf2;
683             else
684                 Newx(tmpbuf2, tmplen2 + 3, char);
685             tmpbuf[0] = tmpbuf2[0] = '_';
686             tmpbuf[1] = tmpbuf2[1] = '<';
687             memcpy(tmpbuf + 2, cf, ++tmplen);
688             memcpy(tmpbuf2 + 2, s, ++tmplen2);
689             ++tmplen; ++tmplen2;
690             gvp = (GV**)hv_fetch(PL_defstash, tmpbuf, tmplen, FALSE);
691             if (gvp) {
692                 gv2 = *(GV**)hv_fetch(PL_defstash, tmpbuf2, tmplen2, TRUE);
693                 if (!isGV(gv2))
694                     gv_init(gv2, PL_defstash, tmpbuf2, tmplen2, FALSE);
695                 /* adjust ${"::_<newfilename"} to store the new file name */
696                 GvSV(gv2) = newSVpvn(tmpbuf2 + 2, tmplen2 - 2);
697                 GvHV(gv2) = (HV*)SvREFCNT_inc(GvHV(*gvp));
698                 GvAV(gv2) = (AV*)SvREFCNT_inc(GvAV(*gvp));
699             }
700             if (tmpbuf != smallbuf) Safefree(tmpbuf);
701             if (tmpbuf2 != smallbuf2) Safefree(tmpbuf2);
702         }
703 #endif
704         CopFILE_free(PL_curcop);
705         CopFILE_set(PL_curcop, s);
706     }
707     *t = ch;
708     CopLINE_set(PL_curcop, atoi(n)-1);
709 }
710
711 /*
712  * S_skipspace
713  * Called to gobble the appropriate amount and type of whitespace.
714  * Skips comments as well.
715  */
716
717 STATIC char *
718 S_skipspace(pTHX_ register char *s)
719 {
720     if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
721         while (s < PL_bufend && SPACE_OR_TAB(*s))
722             s++;
723         return s;
724     }
725     for (;;) {
726         STRLEN prevlen;
727         SSize_t oldprevlen, oldoldprevlen;
728         SSize_t oldloplen = 0, oldunilen = 0;
729         while (s < PL_bufend && isSPACE(*s)) {
730             if (*s++ == '\n' && PL_in_eval && !PL_rsfp)
731                 incline(s);
732         }
733
734         /* comment */
735         if (s < PL_bufend && *s == '#') {
736             while (s < PL_bufend && *s != '\n')
737                 s++;
738             if (s < PL_bufend) {
739                 s++;
740                 if (PL_in_eval && !PL_rsfp) {
741                     incline(s);
742                     continue;
743                 }
744             }
745         }
746
747         /* only continue to recharge the buffer if we're at the end
748          * of the buffer, we're not reading from a source filter, and
749          * we're in normal lexing mode
750          */
751         if (s < PL_bufend || !PL_rsfp || PL_sublex_info.sub_inwhat ||
752                 PL_lex_state == LEX_FORMLINE)
753             return s;
754
755         /* try to recharge the buffer */
756         if ((s = filter_gets(PL_linestr, PL_rsfp,
757                              (prevlen = SvCUR(PL_linestr)))) == Nullch)
758         {
759             /* end of file.  Add on the -p or -n magic */
760             if (PL_minus_p) {
761                 sv_setpv(PL_linestr,
762                          ";}continue{print or die qq(-p destination: $!\\n);}");
763                 PL_minus_n = PL_minus_p = 0;
764             }
765             else if (PL_minus_n) {
766                 sv_setpvn(PL_linestr, ";}", 2);
767                 PL_minus_n = 0;
768             }
769             else
770                 sv_setpvn(PL_linestr,";", 1);
771
772             /* reset variables for next time we lex */
773             PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart
774                 = SvPVX(PL_linestr);
775             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
776             PL_last_lop = PL_last_uni = Nullch;
777
778             /* Close the filehandle.  Could be from -P preprocessor,
779              * STDIN, or a regular file.  If we were reading code from
780              * STDIN (because the commandline held no -e or filename)
781              * then we don't close it, we reset it so the code can
782              * read from STDIN too.
783              */
784
785             if (PL_preprocess && !PL_in_eval)
786                 (void)PerlProc_pclose(PL_rsfp);
787             else if ((PerlIO*)PL_rsfp == PerlIO_stdin())
788                 PerlIO_clearerr(PL_rsfp);
789             else
790                 (void)PerlIO_close(PL_rsfp);
791             PL_rsfp = Nullfp;
792             return s;
793         }
794
795         /* not at end of file, so we only read another line */
796         /* make corresponding updates to old pointers, for yyerror() */
797         oldprevlen = PL_oldbufptr - PL_bufend;
798         oldoldprevlen = PL_oldoldbufptr - PL_bufend;
799         if (PL_last_uni)
800             oldunilen = PL_last_uni - PL_bufend;
801         if (PL_last_lop)
802             oldloplen = PL_last_lop - PL_bufend;
803         PL_linestart = PL_bufptr = s + prevlen;
804         PL_bufend = s + SvCUR(PL_linestr);
805         s = PL_bufptr;
806         PL_oldbufptr = s + oldprevlen;
807         PL_oldoldbufptr = s + oldoldprevlen;
808         if (PL_last_uni)
809             PL_last_uni = s + oldunilen;
810         if (PL_last_lop)
811             PL_last_lop = s + oldloplen;
812         incline(s);
813
814         /* debugger active and we're not compiling the debugger code,
815          * so store the line into the debugger's array of lines
816          */
817         if (PERLDB_LINE && PL_curstash != PL_debstash) {
818             SV * const sv = NEWSV(85,0);
819
820             sv_upgrade(sv, SVt_PVMG);
821             sv_setpvn(sv,PL_bufptr,PL_bufend-PL_bufptr);
822             (void)SvIOK_on(sv);
823             SvIV_set(sv, 0);
824             av_store(CopFILEAV(PL_curcop),(I32)CopLINE(PL_curcop),sv);
825         }
826     }
827 }
828
829 /*
830  * S_check_uni
831  * Check the unary operators to ensure there's no ambiguity in how they're
832  * used.  An ambiguous piece of code would be:
833  *     rand + 5
834  * This doesn't mean rand() + 5.  Because rand() is a unary operator,
835  * the +5 is its argument.
836  */
837
838 STATIC void
839 S_check_uni(pTHX)
840 {
841     char *s;
842     char *t;
843
844     if (PL_oldoldbufptr != PL_last_uni)
845         return;
846     while (isSPACE(*PL_last_uni))
847         PL_last_uni++;
848     for (s = PL_last_uni; isALNUM_lazy_if(s,UTF) || *s == '-'; s++) ;
849     if ((t = strchr(s, '(')) && t < PL_bufptr)
850         return;
851     if (ckWARN_d(WARN_AMBIGUOUS)){
852         const char ch = *s;
853         *s = '\0';
854         Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
855                    "Warning: Use of \"%s\" without parentheses is ambiguous",
856                    PL_last_uni);
857         *s = ch;
858     }
859 }
860
861 /*
862  * LOP : macro to build a list operator.  Its behaviour has been replaced
863  * with a subroutine, S_lop() for which LOP is just another name.
864  */
865
866 #define LOP(f,x) return lop(f,x,s)
867
868 /*
869  * S_lop
870  * Build a list operator (or something that might be one).  The rules:
871  *  - if we have a next token, then it's a list operator [why?]
872  *  - if the next thing is an opening paren, then it's a function
873  *  - else it's a list operator
874  */
875
876 STATIC I32
877 S_lop(pTHX_ I32 f, int x, char *s)
878 {
879     yylval.ival = f;
880     CLINE;
881     PL_expect = x;
882     PL_bufptr = s;
883     PL_last_lop = PL_oldbufptr;
884     PL_last_lop_op = (OPCODE)f;
885     if (PL_nexttoke)
886         return REPORT(LSTOP);
887     if (*s == '(')
888         return REPORT(FUNC);
889     s = skipspace(s);
890     if (*s == '(')
891         return REPORT(FUNC);
892     else
893         return REPORT(LSTOP);
894 }
895
896 /*
897  * S_force_next
898  * When the lexer realizes it knows the next token (for instance,
899  * it is reordering tokens for the parser) then it can call S_force_next
900  * to know what token to return the next time the lexer is called.  Caller
901  * will need to set PL_nextval[], and possibly PL_expect to ensure the lexer
902  * handles the token correctly.
903  */
904
905 STATIC void
906 S_force_next(pTHX_ I32 type)
907 {
908     PL_nexttype[PL_nexttoke] = type;
909     PL_nexttoke++;
910     if (PL_lex_state != LEX_KNOWNEXT) {
911         PL_lex_defer = PL_lex_state;
912         PL_lex_expect = PL_expect;
913         PL_lex_state = LEX_KNOWNEXT;
914     }
915 }
916
917 STATIC SV *
918 S_newSV_maybe_utf8(pTHX_ const char *start, STRLEN len)
919 {
920     SV * const sv = newSVpvn(start,len);
921     if (UTF && !IN_BYTES && is_utf8_string((const U8*)start, len))
922         SvUTF8_on(sv);
923     return sv;
924 }
925
926 /*
927  * S_force_word
928  * When the lexer knows the next thing is a word (for instance, it has
929  * just seen -> and it knows that the next char is a word char, then
930  * it calls S_force_word to stick the next word into the PL_next lookahead.
931  *
932  * Arguments:
933  *   char *start : buffer position (must be within PL_linestr)
934  *   int token   : PL_next will be this type of bare word (e.g., METHOD,WORD)
935  *   int check_keyword : if true, Perl checks to make sure the word isn't
936  *       a keyword (do this if the word is a label, e.g. goto FOO)
937  *   int allow_pack : if true, : characters will also be allowed (require,
938  *       use, etc. do this)
939  *   int allow_initial_tick : used by the "sub" lexer only.
940  */
941
942 STATIC char *
943 S_force_word(pTHX_ register char *start, int token, int check_keyword, int allow_pack, int allow_initial_tick)
944 {
945     register char *s;
946     STRLEN len;
947
948     start = skipspace(start);
949     s = start;
950     if (isIDFIRST_lazy_if(s,UTF) ||
951         (allow_pack && *s == ':') ||
952         (allow_initial_tick && *s == '\'') )
953     {
954         s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, allow_pack, &len);
955         if (check_keyword && keyword(PL_tokenbuf, len))
956             return start;
957         if (token == METHOD) {
958             s = skipspace(s);
959             if (*s == '(')
960                 PL_expect = XTERM;
961             else {
962                 PL_expect = XOPERATOR;
963             }
964         }
965         PL_nextval[PL_nexttoke].opval
966             = (OP*)newSVOP(OP_CONST,0,
967                            S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
968         PL_nextval[PL_nexttoke].opval->op_private |= OPpCONST_BARE;
969         force_next(token);
970     }
971     return s;
972 }
973
974 /*
975  * S_force_ident
976  * Called when the lexer wants $foo *foo &foo etc, but the program
977  * text only contains the "foo" portion.  The first argument is a pointer
978  * to the "foo", and the second argument is the type symbol to prefix.
979  * Forces the next token to be a "WORD".
980  * Creates the symbol if it didn't already exist (via gv_fetchpv()).
981  */
982
983 STATIC void
984 S_force_ident(pTHX_ register const char *s, int kind)
985 {
986     if (s && *s) {
987         OP* const o = (OP*)newSVOP(OP_CONST, 0, newSVpv(s,0));
988         PL_nextval[PL_nexttoke].opval = o;
989         force_next(WORD);
990         if (kind) {
991             o->op_private = OPpCONST_ENTERED;
992             /* XXX see note in pp_entereval() for why we forgo typo
993                warnings if the symbol must be introduced in an eval.
994                GSAR 96-10-12 */
995             gv_fetchpv(s, PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : TRUE,
996                 kind == '$' ? SVt_PV :
997                 kind == '@' ? SVt_PVAV :
998                 kind == '%' ? SVt_PVHV :
999                               SVt_PVGV
1000                 );
1001         }
1002     }
1003 }
1004
1005 NV
1006 Perl_str_to_version(pTHX_ SV *sv)
1007 {
1008     NV retval = 0.0;
1009     NV nshift = 1.0;
1010     STRLEN len;
1011     const char *start = SvPV_const(sv,len);
1012     const char * const end = start + len;
1013     const bool utf = SvUTF8(sv) ? TRUE : FALSE;
1014     while (start < end) {
1015         STRLEN skip;
1016         UV n;
1017         if (utf)
1018             n = utf8n_to_uvchr((U8*)start, len, &skip, 0);
1019         else {
1020             n = *(U8*)start;
1021             skip = 1;
1022         }
1023         retval += ((NV)n)/nshift;
1024         start += skip;
1025         nshift *= 1000;
1026     }
1027     return retval;
1028 }
1029
1030 /*
1031  * S_force_version
1032  * Forces the next token to be a version number.
1033  * If the next token appears to be an invalid version number, (e.g. "v2b"),
1034  * and if "guessing" is TRUE, then no new token is created (and the caller
1035  * must use an alternative parsing method).
1036  */
1037
1038 STATIC char *
1039 S_force_version(pTHX_ char *s, int guessing)
1040 {
1041     OP *version = Nullop;
1042     char *d;
1043
1044     s = skipspace(s);
1045
1046     d = s;
1047     if (*d == 'v')
1048         d++;
1049     if (isDIGIT(*d)) {
1050         while (isDIGIT(*d) || *d == '_' || *d == '.')
1051             d++;
1052         if (*d == ';' || isSPACE(*d) || *d == '}' || !*d) {
1053             SV *ver;
1054             s = scan_num(s, &yylval);
1055             version = yylval.opval;
1056             ver = cSVOPx(version)->op_sv;
1057             if (SvPOK(ver) && !SvNIOK(ver)) {
1058                 SvUPGRADE(ver, SVt_PVNV);
1059                 SvNV_set(ver, str_to_version(ver));
1060                 SvNOK_on(ver);          /* hint that it is a version */
1061             }
1062         }
1063         else if (guessing)
1064             return s;
1065     }
1066
1067     /* NOTE: The parser sees the package name and the VERSION swapped */
1068     PL_nextval[PL_nexttoke].opval = version;
1069     force_next(WORD);
1070
1071     return s;
1072 }
1073
1074 /*
1075  * S_tokeq
1076  * Tokenize a quoted string passed in as an SV.  It finds the next
1077  * chunk, up to end of string or a backslash.  It may make a new
1078  * SV containing that chunk (if HINT_NEW_STRING is on).  It also
1079  * turns \\ into \.
1080  */
1081
1082 STATIC SV *
1083 S_tokeq(pTHX_ SV *sv)
1084 {
1085     register char *s;
1086     register char *send;
1087     register char *d;
1088     STRLEN len = 0;
1089     SV *pv = sv;
1090
1091     if (!SvLEN(sv))
1092         goto finish;
1093
1094     s = SvPV_force(sv, len);
1095     if (SvTYPE(sv) >= SVt_PVIV && SvIVX(sv) == -1)
1096         goto finish;
1097     send = s + len;
1098     while (s < send && *s != '\\')
1099         s++;
1100     if (s == send)
1101         goto finish;
1102     d = s;
1103     if ( PL_hints & HINT_NEW_STRING ) {
1104         pv = sv_2mortal(newSVpvn(SvPVX_const(pv), len));
1105         if (SvUTF8(sv))
1106             SvUTF8_on(pv);
1107     }
1108     while (s < send) {
1109         if (*s == '\\') {
1110             if (s + 1 < send && (s[1] == '\\'))
1111                 s++;            /* all that, just for this */
1112         }
1113         *d++ = *s++;
1114     }
1115     *d = '\0';
1116     SvCUR_set(sv, d - SvPVX_const(sv));
1117   finish:
1118     if ( PL_hints & HINT_NEW_STRING )
1119        return new_constant(NULL, 0, "q", sv, pv, "q");
1120     return sv;
1121 }
1122
1123 /*
1124  * Now come three functions related to double-quote context,
1125  * S_sublex_start, S_sublex_push, and S_sublex_done.  They're used when
1126  * converting things like "\u\Lgnat" into ucfirst(lc("gnat")).  They
1127  * interact with PL_lex_state, and create fake ( ... ) argument lists
1128  * to handle functions and concatenation.
1129  * They assume that whoever calls them will be setting up a fake
1130  * join call, because each subthing puts a ',' after it.  This lets
1131  *   "lower \luPpEr"
1132  * become
1133  *  join($, , 'lower ', lcfirst( 'uPpEr', ) ,)
1134  *
1135  * (I'm not sure whether the spurious commas at the end of lcfirst's
1136  * arguments and join's arguments are created or not).
1137  */
1138
1139 /*
1140  * S_sublex_start
1141  * Assumes that yylval.ival is the op we're creating (e.g. OP_LCFIRST).
1142  *
1143  * Pattern matching will set PL_lex_op to the pattern-matching op to
1144  * make (we return THING if yylval.ival is OP_NULL, PMFUNC otherwise).
1145  *
1146  * OP_CONST and OP_READLINE are easy--just make the new op and return.
1147  *
1148  * Everything else becomes a FUNC.
1149  *
1150  * Sets PL_lex_state to LEX_INTERPPUSH unless (ival was OP_NULL or we
1151  * had an OP_CONST or OP_READLINE).  This just sets us up for a
1152  * call to S_sublex_push().
1153  */
1154
1155 STATIC I32
1156 S_sublex_start(pTHX)
1157 {
1158     const register I32 op_type = yylval.ival;
1159
1160     if (op_type == OP_NULL) {
1161         yylval.opval = PL_lex_op;
1162         PL_lex_op = Nullop;
1163         return THING;
1164     }
1165     if (op_type == OP_CONST || op_type == OP_READLINE) {
1166         SV *sv = tokeq(PL_lex_stuff);
1167
1168         if (SvTYPE(sv) == SVt_PVIV) {
1169             /* Overloaded constants, nothing fancy: Convert to SVt_PV: */
1170             STRLEN len;
1171             const char *p = SvPV_const(sv, len);
1172             SV * const nsv = newSVpvn(p, len);
1173             if (SvUTF8(sv))
1174                 SvUTF8_on(nsv);
1175             SvREFCNT_dec(sv);
1176             sv = nsv;
1177         }
1178         yylval.opval = (OP*)newSVOP(op_type, 0, sv);
1179         PL_lex_stuff = Nullsv;
1180         /* Allow <FH> // "foo" */
1181         if (op_type == OP_READLINE)
1182             PL_expect = XTERMORDORDOR;
1183         return THING;
1184     }
1185
1186     PL_sublex_info.super_state = PL_lex_state;
1187     PL_sublex_info.sub_inwhat = op_type;
1188     PL_sublex_info.sub_op = PL_lex_op;
1189     PL_lex_state = LEX_INTERPPUSH;
1190
1191     PL_expect = XTERM;
1192     if (PL_lex_op) {
1193         yylval.opval = PL_lex_op;
1194         PL_lex_op = Nullop;
1195         return PMFUNC;
1196     }
1197     else
1198         return FUNC;
1199 }
1200
1201 /*
1202  * S_sublex_push
1203  * Create a new scope to save the lexing state.  The scope will be
1204  * ended in S_sublex_done.  Returns a '(', starting the function arguments
1205  * to the uc, lc, etc. found before.
1206  * Sets PL_lex_state to LEX_INTERPCONCAT.
1207  */
1208
1209 STATIC I32
1210 S_sublex_push(pTHX)
1211 {
1212     dVAR;
1213     ENTER;
1214
1215     PL_lex_state = PL_sublex_info.super_state;
1216     SAVEI32(PL_lex_dojoin);
1217     SAVEI32(PL_lex_brackets);
1218     SAVEI32(PL_lex_casemods);
1219     SAVEI32(PL_lex_starts);
1220     SAVEI32(PL_lex_state);
1221     SAVEVPTR(PL_lex_inpat);
1222     SAVEI32(PL_lex_inwhat);
1223     SAVECOPLINE(PL_curcop);
1224     SAVEPPTR(PL_bufptr);
1225     SAVEPPTR(PL_bufend);
1226     SAVEPPTR(PL_oldbufptr);
1227     SAVEPPTR(PL_oldoldbufptr);
1228     SAVEPPTR(PL_last_lop);
1229     SAVEPPTR(PL_last_uni);
1230     SAVEPPTR(PL_linestart);
1231     SAVESPTR(PL_linestr);
1232     SAVEGENERICPV(PL_lex_brackstack);
1233     SAVEGENERICPV(PL_lex_casestack);
1234
1235     PL_linestr = PL_lex_stuff;
1236     PL_lex_stuff = Nullsv;
1237
1238     PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart
1239         = SvPVX(PL_linestr);
1240     PL_bufend += SvCUR(PL_linestr);
1241     PL_last_lop = PL_last_uni = Nullch;
1242     SAVEFREESV(PL_linestr);
1243
1244     PL_lex_dojoin = FALSE;
1245     PL_lex_brackets = 0;
1246     Newx(PL_lex_brackstack, 120, char);
1247     Newx(PL_lex_casestack, 12, char);
1248     PL_lex_casemods = 0;
1249     *PL_lex_casestack = '\0';
1250     PL_lex_starts = 0;
1251     PL_lex_state = LEX_INTERPCONCAT;
1252     CopLINE_set(PL_curcop, (line_t)PL_multi_start);
1253
1254     PL_lex_inwhat = PL_sublex_info.sub_inwhat;
1255     if (PL_lex_inwhat == OP_MATCH || PL_lex_inwhat == OP_QR || PL_lex_inwhat == OP_SUBST)
1256         PL_lex_inpat = PL_sublex_info.sub_op;
1257     else
1258         PL_lex_inpat = Nullop;
1259
1260     return '(';
1261 }
1262
1263 /*
1264  * S_sublex_done
1265  * Restores lexer state after a S_sublex_push.
1266  */
1267
1268 STATIC I32
1269 S_sublex_done(pTHX)
1270 {
1271     dVAR;
1272     if (!PL_lex_starts++) {
1273         SV * const sv = newSVpvn("",0);
1274         if (SvUTF8(PL_linestr))
1275             SvUTF8_on(sv);
1276         PL_expect = XOPERATOR;
1277         yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
1278         return THING;
1279     }
1280
1281     if (PL_lex_casemods) {              /* oops, we've got some unbalanced parens */
1282         PL_lex_state = LEX_INTERPCASEMOD;
1283         return yylex();
1284     }
1285
1286     /* Is there a right-hand side to take care of? (s//RHS/ or tr//RHS/) */
1287     if (PL_lex_repl && (PL_lex_inwhat == OP_SUBST || PL_lex_inwhat == OP_TRANS)) {
1288         PL_linestr = PL_lex_repl;
1289         PL_lex_inpat = 0;
1290         PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
1291         PL_bufend += SvCUR(PL_linestr);
1292         PL_last_lop = PL_last_uni = Nullch;
1293         SAVEFREESV(PL_linestr);
1294         PL_lex_dojoin = FALSE;
1295         PL_lex_brackets = 0;
1296         PL_lex_casemods = 0;
1297         *PL_lex_casestack = '\0';
1298         PL_lex_starts = 0;
1299         if (SvEVALED(PL_lex_repl)) {
1300             PL_lex_state = LEX_INTERPNORMAL;
1301             PL_lex_starts++;
1302             /*  we don't clear PL_lex_repl here, so that we can check later
1303                 whether this is an evalled subst; that means we rely on the
1304                 logic to ensure sublex_done() is called again only via the
1305                 branch (in yylex()) that clears PL_lex_repl, else we'll loop */
1306         }
1307         else {
1308             PL_lex_state = LEX_INTERPCONCAT;
1309             PL_lex_repl = Nullsv;
1310         }
1311         return ',';
1312     }
1313     else {
1314         LEAVE;
1315         PL_bufend = SvPVX(PL_linestr);
1316         PL_bufend += SvCUR(PL_linestr);
1317         PL_expect = XOPERATOR;
1318         PL_sublex_info.sub_inwhat = 0;
1319         return ')';
1320     }
1321 }
1322
1323 /*
1324   scan_const
1325
1326   Extracts a pattern, double-quoted string, or transliteration.  This
1327   is terrifying code.
1328
1329   It looks at lex_inwhat and PL_lex_inpat to find out whether it's
1330   processing a pattern (PL_lex_inpat is true), a transliteration
1331   (lex_inwhat & OP_TRANS is true), or a double-quoted string.
1332
1333   Returns a pointer to the character scanned up to. Iff this is
1334   advanced from the start pointer supplied (ie if anything was
1335   successfully parsed), will leave an OP for the substring scanned
1336   in yylval. Caller must intuit reason for not parsing further
1337   by looking at the next characters herself.
1338
1339   In patterns:
1340     backslashes:
1341       double-quoted style: \r and \n
1342       regexp special ones: \D \s
1343       constants: \x3
1344       backrefs: \1 (deprecated in substitution replacements)
1345       case and quoting: \U \Q \E
1346     stops on @ and $, but not for $ as tail anchor
1347
1348   In transliterations:
1349     characters are VERY literal, except for - not at the start or end
1350     of the string, which indicates a range.  scan_const expands the
1351     range to the full set of intermediate characters.
1352
1353   In double-quoted strings:
1354     backslashes:
1355       double-quoted style: \r and \n
1356       constants: \x3
1357       backrefs: \1 (deprecated)
1358       case and quoting: \U \Q \E
1359     stops on @ and $
1360
1361   scan_const does *not* construct ops to handle interpolated strings.
1362   It stops processing as soon as it finds an embedded $ or @ variable
1363   and leaves it to the caller to work out what's going on.
1364
1365   @ in pattern could be: @foo, @{foo}, @$foo, @'foo, @::foo.
1366
1367   $ in pattern could be $foo or could be tail anchor.  Assumption:
1368   it's a tail anchor if $ is the last thing in the string, or if it's
1369   followed by one of ")| \n\t"
1370
1371   \1 (backreferences) are turned into $1
1372
1373   The structure of the code is
1374       while (there's a character to process) {
1375           handle transliteration ranges
1376           skip regexp comments
1377           skip # initiated comments in //x patterns
1378           check for embedded @foo
1379           check for embedded scalars
1380           if (backslash) {
1381               leave intact backslashes from leave (below)
1382               deprecate \1 in strings and sub replacements
1383               handle string-changing backslashes \l \U \Q \E, etc.
1384               switch (what was escaped) {
1385                   handle - in a transliteration (becomes a literal -)
1386                   handle \132 octal characters
1387                   handle 0x15 hex characters
1388                   handle \cV (control V)
1389                   handle printf backslashes (\f, \r, \n, etc)
1390               } (end switch)
1391           } (end if backslash)
1392     } (end while character to read)
1393                 
1394 */
1395
1396 STATIC char *
1397 S_scan_const(pTHX_ char *start)
1398 {
1399     register char *send = PL_bufend;            /* end of the constant */
1400     SV *sv = NEWSV(93, send - start);           /* sv for the constant */
1401     register char *s = start;                   /* start of the constant */
1402     register char *d = SvPVX(sv);               /* destination for copies */
1403     bool dorange = FALSE;                       /* are we in a translit range? */
1404     bool didrange = FALSE;                      /* did we just finish a range? */
1405     I32  has_utf8 = FALSE;                      /* Output constant is UTF8 */
1406     I32  this_utf8 = UTF;                       /* The source string is assumed to be UTF8 */
1407     UV uv;
1408 #ifdef EBCDIC
1409     UV literal_endpoint = 0;
1410 #endif
1411
1412     const char *leaveit =       /* set of acceptably-backslashed characters */
1413         PL_lex_inpat
1414             ? "\\.^$@AGZdDwWsSbBpPXC+*?|()-nrtfeaxz0123456789[{]} \t\n\r\f\v#"
1415             : "";
1416
1417     if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
1418         /* If we are doing a trans and we know we want UTF8 set expectation */
1419         has_utf8   = PL_sublex_info.sub_op->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF);
1420         this_utf8  = PL_sublex_info.sub_op->op_private & (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
1421     }
1422
1423
1424     while (s < send || dorange) {
1425         /* get transliterations out of the way (they're most literal) */
1426         if (PL_lex_inwhat == OP_TRANS) {
1427             /* expand a range A-Z to the full set of characters.  AIE! */
1428             if (dorange) {
1429                 I32 i;                          /* current expanded character */
1430                 I32 min;                        /* first character in range */
1431                 I32 max;                        /* last character in range */
1432
1433                 if (has_utf8) {
1434                     char * const c = (char*)utf8_hop((U8*)d, -1);
1435                     char *e = d++;
1436                     while (e-- > c)
1437                         *(e + 1) = *e;
1438                     *c = (char)UTF_TO_NATIVE(0xff);
1439                     /* mark the range as done, and continue */
1440                     dorange = FALSE;
1441                     didrange = TRUE;
1442                     continue;
1443                 }
1444
1445                 i = d - SvPVX_const(sv);                /* remember current offset */
1446                 SvGROW(sv, SvLEN(sv) + 256);    /* never more than 256 chars in a range */
1447                 d = SvPVX(sv) + i;              /* refresh d after realloc */
1448                 d -= 2;                         /* eat the first char and the - */
1449
1450                 min = (U8)*d;                   /* first char in range */
1451                 max = (U8)d[1];                 /* last char in range  */
1452
1453                 if (min > max) {
1454                     Perl_croak(aTHX_
1455                                "Invalid range \"%c-%c\" in transliteration operator",
1456                                (char)min, (char)max);
1457                 }
1458
1459 #ifdef EBCDIC
1460                 if (literal_endpoint == 2 &&
1461                     ((isLOWER(min) && isLOWER(max)) ||
1462                      (isUPPER(min) && isUPPER(max)))) {
1463                     if (isLOWER(min)) {
1464                         for (i = min; i <= max; i++)
1465                             if (isLOWER(i))
1466                                 *d++ = NATIVE_TO_NEED(has_utf8,i);
1467                     } else {
1468                         for (i = min; i <= max; i++)
1469                             if (isUPPER(i))
1470                                 *d++ = NATIVE_TO_NEED(has_utf8,i);
1471                     }
1472                 }
1473                 else
1474 #endif
1475                     for (i = min; i <= max; i++)
1476                         *d++ = (char)i;
1477
1478                 /* mark the range as done, and continue */
1479                 dorange = FALSE;
1480                 didrange = TRUE;
1481 #ifdef EBCDIC
1482                 literal_endpoint = 0;
1483 #endif
1484                 continue;
1485             }
1486
1487             /* range begins (ignore - as first or last char) */
1488             else if (*s == '-' && s+1 < send  && s != start) {
1489                 if (didrange) {
1490                     Perl_croak(aTHX_ "Ambiguous range in transliteration operator");
1491                 }
1492                 if (has_utf8) {
1493                     *d++ = (char)UTF_TO_NATIVE(0xff);   /* use illegal utf8 byte--see pmtrans */
1494                     s++;
1495                     continue;
1496                 }
1497                 dorange = TRUE;
1498                 s++;
1499             }
1500             else {
1501                 didrange = FALSE;
1502 #ifdef EBCDIC
1503                 literal_endpoint = 0;
1504 #endif
1505             }
1506         }
1507
1508         /* if we get here, we're not doing a transliteration */
1509
1510         /* skip for regexp comments /(?#comment)/ and code /(?{code})/,
1511            except for the last char, which will be done separately. */
1512         else if (*s == '(' && PL_lex_inpat && s[1] == '?') {
1513             if (s[2] == '#') {
1514                 while (s+1 < send && *s != ')')
1515                     *d++ = NATIVE_TO_NEED(has_utf8,*s++);
1516             }
1517             else if (s[2] == '{' /* This should match regcomp.c */
1518                      || ((s[2] == 'p' || s[2] == '?') && s[3] == '{'))
1519             {
1520                 I32 count = 1;
1521                 char *regparse = s + (s[2] == '{' ? 3 : 4);
1522                 char c;
1523
1524                 while (count && (c = *regparse)) {
1525                     if (c == '\\' && regparse[1])
1526                         regparse++;
1527                     else if (c == '{')
1528                         count++;
1529                     else if (c == '}')
1530                         count--;
1531                     regparse++;
1532                 }
1533                 if (*regparse != ')')
1534                     regparse--;         /* Leave one char for continuation. */
1535                 while (s < regparse)
1536                     *d++ = NATIVE_TO_NEED(has_utf8,*s++);
1537             }
1538         }
1539
1540         /* likewise skip #-initiated comments in //x patterns */
1541         else if (*s == '#' && PL_lex_inpat &&
1542           ((PMOP*)PL_lex_inpat)->op_pmflags & PMf_EXTENDED) {
1543             while (s+1 < send && *s != '\n')
1544                 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
1545         }
1546
1547         /* check for embedded arrays
1548            (@foo, @::foo, @'foo, @{foo}, @$foo, @+, @-)
1549            */
1550         else if (*s == '@' && s[1]
1551                  && (isALNUM_lazy_if(s+1,UTF) || strchr(":'{$+-", s[1])))
1552             break;
1553
1554         /* check for embedded scalars.  only stop if we're sure it's a
1555            variable.
1556         */
1557         else if (*s == '$') {
1558             if (!PL_lex_inpat)  /* not a regexp, so $ must be var */
1559                 break;
1560             if (s + 1 < send && !strchr("()| \r\n\t", s[1]))
1561                 break;          /* in regexp, $ might be tail anchor */
1562         }
1563
1564         /* End of else if chain - OP_TRANS rejoin rest */
1565
1566         /* backslashes */
1567         if (*s == '\\' && s+1 < send) {
1568             s++;
1569
1570             /* some backslashes we leave behind */
1571             if (*leaveit && *s && strchr(leaveit, *s)) {
1572                 *d++ = NATIVE_TO_NEED(has_utf8,'\\');
1573                 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
1574                 continue;
1575             }
1576
1577             /* deprecate \1 in strings and substitution replacements */
1578             if (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat &&
1579                 isDIGIT(*s) && *s != '0' && !isDIGIT(s[1]))
1580             {
1581                 if (ckWARN(WARN_SYNTAX))
1582                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "\\%c better written as $%c", *s, *s);
1583                 *--s = '$';
1584                 break;
1585             }
1586
1587             /* string-change backslash escapes */
1588             if (PL_lex_inwhat != OP_TRANS && *s && strchr("lLuUEQ", *s)) {
1589                 --s;
1590                 break;
1591             }
1592
1593             /* if we get here, it's either a quoted -, or a digit */
1594             switch (*s) {
1595
1596             /* quoted - in transliterations */
1597             case '-':
1598                 if (PL_lex_inwhat == OP_TRANS) {
1599                     *d++ = *s++;
1600                     continue;
1601                 }
1602                 /* FALL THROUGH */
1603             default:
1604                 {
1605                     if (isALNUM(*s) &&
1606                         *s != '_' &&
1607                         ckWARN(WARN_MISC))
1608                         Perl_warner(aTHX_ packWARN(WARN_MISC),
1609                                "Unrecognized escape \\%c passed through",
1610                                *s);
1611                     /* default action is to copy the quoted character */
1612                     goto default_action;
1613                 }
1614
1615             /* \132 indicates an octal constant */
1616             case '0': case '1': case '2': case '3':
1617             case '4': case '5': case '6': case '7':
1618                 {
1619                     I32 flags = 0;
1620                     STRLEN len = 3;
1621                     uv = grok_oct(s, &len, &flags, NULL);
1622                     s += len;
1623                 }
1624                 goto NUM_ESCAPE_INSERT;
1625
1626             /* \x24 indicates a hex constant */
1627             case 'x':
1628                 ++s;
1629                 if (*s == '{') {
1630                     char* const e = strchr(s, '}');
1631                     I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
1632                       PERL_SCAN_DISALLOW_PREFIX;
1633                     STRLEN len;
1634
1635                     ++s;
1636                     if (!e) {
1637                         yyerror("Missing right brace on \\x{}");
1638                         continue;
1639                     }
1640                     len = e - s;
1641                     uv = grok_hex(s, &len, &flags, NULL);
1642                     s = e + 1;
1643                 }
1644                 else {
1645                     {
1646                         STRLEN len = 2;
1647                         I32 flags = PERL_SCAN_DISALLOW_PREFIX;
1648                         uv = grok_hex(s, &len, &flags, NULL);
1649                         s += len;
1650                     }
1651                 }
1652
1653               NUM_ESCAPE_INSERT:
1654                 /* Insert oct or hex escaped character.
1655                  * There will always enough room in sv since such
1656                  * escapes will be longer than any UTF-8 sequence
1657                  * they can end up as. */
1658                 
1659                 /* We need to map to chars to ASCII before doing the tests
1660                    to cover EBCDIC
1661                 */
1662                 if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(uv))) {
1663                     if (!has_utf8 && uv > 255) {
1664                         /* Might need to recode whatever we have
1665                          * accumulated so far if it contains any
1666                          * hibit chars.
1667                          *
1668                          * (Can't we keep track of that and avoid
1669                          *  this rescan? --jhi)
1670                          */
1671                         int hicount = 0;
1672                         U8 *c;
1673                         for (c = (U8 *) SvPVX(sv); c < (U8 *)d; c++) {
1674                             if (!NATIVE_IS_INVARIANT(*c)) {
1675                                 hicount++;
1676                             }
1677                         }
1678                         if (hicount) {
1679                             const STRLEN offset = d - SvPVX_const(sv);
1680                             U8 *src, *dst;
1681                             d = SvGROW(sv, SvLEN(sv) + hicount + 1) + offset;
1682                             src = (U8 *)d - 1;
1683                             dst = src+hicount;
1684                             d  += hicount;
1685                             while (src >= (const U8 *)SvPVX_const(sv)) {
1686                                 if (!NATIVE_IS_INVARIANT(*src)) {
1687                                     const U8 ch = NATIVE_TO_ASCII(*src);
1688                                     *dst-- = (U8)UTF8_EIGHT_BIT_LO(ch);
1689                                     *dst-- = (U8)UTF8_EIGHT_BIT_HI(ch);
1690                                 }
1691                                 else {
1692                                     *dst-- = *src;
1693                                 }
1694                                 src--;
1695                             }
1696                         }
1697                     }
1698
1699                     if (has_utf8 || uv > 255) {
1700                         d = (char*)uvchr_to_utf8((U8*)d, uv);
1701                         has_utf8 = TRUE;
1702                         if (PL_lex_inwhat == OP_TRANS &&
1703                             PL_sublex_info.sub_op) {
1704                             PL_sublex_info.sub_op->op_private |=
1705                                 (PL_lex_repl ? OPpTRANS_FROM_UTF
1706                                              : OPpTRANS_TO_UTF);
1707                         }
1708                     }
1709                     else {
1710                         *d++ = (char)uv;
1711                     }
1712                 }
1713                 else {
1714                     *d++ = (char) uv;
1715                 }
1716                 continue;
1717
1718             /* \N{LATIN SMALL LETTER A} is a named character */
1719             case 'N':
1720                 ++s;
1721                 if (*s == '{') {
1722                     char* e = strchr(s, '}');
1723                     SV *res;
1724                     STRLEN len;
1725                     const char *str;
1726
1727                     if (!e) {
1728                         yyerror("Missing right brace on \\N{}");
1729                         e = s - 1;
1730                         goto cont_scan;
1731                     }
1732                     if (e > s + 2 && s[1] == 'U' && s[2] == '+') {
1733                         /* \N{U+...} */
1734                         I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
1735                           PERL_SCAN_DISALLOW_PREFIX;
1736                         s += 3;
1737                         len = e - s;
1738                         uv = grok_hex(s, &len, &flags, NULL);
1739                         s = e + 1;
1740                         goto NUM_ESCAPE_INSERT;
1741                     }
1742                     res = newSVpvn(s + 1, e - s - 1);
1743                     res = new_constant( Nullch, 0, "charnames",
1744                                         res, Nullsv, "\\N{...}" );
1745                     if (has_utf8)
1746                         sv_utf8_upgrade(res);
1747                     str = SvPV_const(res,len);
1748 #ifdef EBCDIC_NEVER_MIND
1749                     /* charnames uses pack U and that has been
1750                      * recently changed to do the below uni->native
1751                      * mapping, so this would be redundant (and wrong,
1752                      * the code point would be doubly converted).
1753                      * But leave this in just in case the pack U change
1754                      * gets revoked, but the semantics is still
1755                      * desireable for charnames. --jhi */
1756                     {
1757                          UV uv = utf8_to_uvchr((const U8*)str, 0);
1758
1759                          if (uv < 0x100) {
1760                               U8 tmpbuf[UTF8_MAXBYTES+1], *d;
1761
1762                               d = uvchr_to_utf8(tmpbuf, UNI_TO_NATIVE(uv));
1763                               sv_setpvn(res, (char *)tmpbuf, d - tmpbuf);
1764                               str = SvPV_const(res, len);
1765                          }
1766                     }
1767 #endif
1768                     if (!has_utf8 && SvUTF8(res)) {
1769                         const char * const ostart = SvPVX_const(sv);
1770                         SvCUR_set(sv, d - ostart);
1771                         SvPOK_on(sv);
1772                         *d = '\0';
1773                         sv_utf8_upgrade(sv);
1774                         /* this just broke our allocation above... */
1775                         SvGROW(sv, (STRLEN)(send - start));
1776                         d = SvPVX(sv) + SvCUR(sv);
1777                         has_utf8 = TRUE;
1778                     }
1779                     if (len > (STRLEN)(e - s + 4)) { /* I _guess_ 4 is \N{} --jhi */
1780                         const char * const odest = SvPVX_const(sv);
1781
1782                         SvGROW(sv, (SvLEN(sv) + len - (e - s + 4)));
1783                         d = SvPVX(sv) + (d - odest);
1784                     }
1785                     Copy(str, d, len, char);
1786                     d += len;
1787                     SvREFCNT_dec(res);
1788                   cont_scan:
1789                     s = e + 1;
1790                 }
1791                 else
1792                     yyerror("Missing braces on \\N{}");
1793                 continue;
1794
1795             /* \c is a control character */
1796             case 'c':
1797                 s++;
1798                 if (s < send) {
1799                     U8 c = *s++;
1800 #ifdef EBCDIC
1801                     if (isLOWER(c))
1802                         c = toUPPER(c);
1803 #endif
1804                     *d++ = NATIVE_TO_NEED(has_utf8,toCTRL(c));
1805                 }
1806                 else {
1807                     yyerror("Missing control char name in \\c");
1808                 }
1809                 continue;
1810
1811             /* printf-style backslashes, formfeeds, newlines, etc */
1812             case 'b':
1813                 *d++ = NATIVE_TO_NEED(has_utf8,'\b');
1814                 break;
1815             case 'n':
1816                 *d++ = NATIVE_TO_NEED(has_utf8,'\n');
1817                 break;
1818             case 'r':
1819                 *d++ = NATIVE_TO_NEED(has_utf8,'\r');
1820                 break;
1821             case 'f':
1822                 *d++ = NATIVE_TO_NEED(has_utf8,'\f');
1823                 break;
1824             case 't':
1825                 *d++ = NATIVE_TO_NEED(has_utf8,'\t');
1826                 break;
1827             case 'e':
1828                 *d++ = ASCII_TO_NEED(has_utf8,'\033');
1829                 break;
1830             case 'a':
1831                 *d++ = ASCII_TO_NEED(has_utf8,'\007');
1832                 break;
1833             } /* end switch */
1834
1835             s++;
1836             continue;
1837         } /* end if (backslash) */
1838 #ifdef EBCDIC
1839         else
1840             literal_endpoint++;
1841 #endif
1842
1843     default_action:
1844         /* If we started with encoded form, or already know we want it
1845            and then encode the next character */
1846         if ((has_utf8 || this_utf8) && !NATIVE_IS_INVARIANT((U8)(*s))) {
1847             STRLEN len  = 1;
1848             const UV uv       = (this_utf8) ? utf8n_to_uvchr((U8*)s, send - s, &len, 0) : (UV) ((U8) *s);
1849             const STRLEN need = UNISKIP(NATIVE_TO_UNI(uv));
1850             s += len;
1851             if (need > len) {
1852                 /* encoded value larger than old, need extra space (NOTE: SvCUR() not set here) */
1853                 const STRLEN off = d - SvPVX_const(sv);
1854                 d = SvGROW(sv, SvLEN(sv) + (need-len)) + off;
1855             }
1856             d = (char*)uvchr_to_utf8((U8*)d, uv);
1857             has_utf8 = TRUE;
1858         }
1859         else {
1860             *d++ = NATIVE_TO_NEED(has_utf8,*s++);
1861         }
1862     } /* while loop to process each character */
1863
1864     /* terminate the string and set up the sv */
1865     *d = '\0';
1866     SvCUR_set(sv, d - SvPVX_const(sv));
1867     if (SvCUR(sv) >= SvLEN(sv))
1868         Perl_croak(aTHX_ "panic: constant overflowed allocated space");
1869
1870     SvPOK_on(sv);
1871     if (PL_encoding && !has_utf8) {
1872         sv_recode_to_utf8(sv, PL_encoding);
1873         if (SvUTF8(sv))
1874             has_utf8 = TRUE;
1875     }
1876     if (has_utf8) {
1877         SvUTF8_on(sv);
1878         if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
1879             PL_sublex_info.sub_op->op_private |=
1880                     (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
1881         }
1882     }
1883
1884     /* shrink the sv if we allocated more than we used */
1885     if (SvCUR(sv) + 5 < SvLEN(sv)) {
1886         SvPV_shrink_to_cur(sv);
1887     }
1888
1889     /* return the substring (via yylval) only if we parsed anything */
1890     if (s > PL_bufptr) {
1891         if ( PL_hints & ( PL_lex_inpat ? HINT_NEW_RE : HINT_NEW_STRING ) )
1892             sv = new_constant(start, s - start, (PL_lex_inpat ? "qr" : "q"),
1893                               sv, Nullsv,
1894                               ( PL_lex_inwhat == OP_TRANS
1895                                 ? "tr"
1896                                 : ( (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat)
1897                                     ? "s"
1898                                     : "qq")));
1899         yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
1900     } else
1901         SvREFCNT_dec(sv);
1902     return s;
1903 }
1904
1905 /* S_intuit_more
1906  * Returns TRUE if there's more to the expression (e.g., a subscript),
1907  * FALSE otherwise.
1908  *
1909  * It deals with "$foo[3]" and /$foo[3]/ and /$foo[0123456789$]+/
1910  *
1911  * ->[ and ->{ return TRUE
1912  * { and [ outside a pattern are always subscripts, so return TRUE
1913  * if we're outside a pattern and it's not { or [, then return FALSE
1914  * if we're in a pattern and the first char is a {
1915  *   {4,5} (any digits around the comma) returns FALSE
1916  * if we're in a pattern and the first char is a [
1917  *   [] returns FALSE
1918  *   [SOMETHING] has a funky algorithm to decide whether it's a
1919  *      character class or not.  It has to deal with things like
1920  *      /$foo[-3]/ and /$foo[$bar]/ as well as /$foo[$\d]+/
1921  * anything else returns TRUE
1922  */
1923
1924 /* This is the one truly awful dwimmer necessary to conflate C and sed. */
1925
1926 STATIC int
1927 S_intuit_more(pTHX_ register char *s)
1928 {
1929     if (PL_lex_brackets)
1930         return TRUE;
1931     if (*s == '-' && s[1] == '>' && (s[2] == '[' || s[2] == '{'))
1932         return TRUE;
1933     if (*s != '{' && *s != '[')
1934         return FALSE;
1935     if (!PL_lex_inpat)
1936         return TRUE;
1937
1938     /* In a pattern, so maybe we have {n,m}. */
1939     if (*s == '{') {
1940         s++;
1941         if (!isDIGIT(*s))
1942             return TRUE;
1943         while (isDIGIT(*s))
1944             s++;
1945         if (*s == ',')
1946             s++;
1947         while (isDIGIT(*s))
1948             s++;
1949         if (*s == '}')
1950             return FALSE;
1951         return TRUE;
1952         
1953     }
1954
1955     /* On the other hand, maybe we have a character class */
1956
1957     s++;
1958     if (*s == ']' || *s == '^')
1959         return FALSE;
1960     else {
1961         /* this is terrifying, and it works */
1962         int weight = 2;         /* let's weigh the evidence */
1963         char seen[256];
1964         unsigned char un_char = 255, last_un_char;
1965         const char * const send = strchr(s,']');
1966         char tmpbuf[sizeof PL_tokenbuf * 4];
1967
1968         if (!send)              /* has to be an expression */
1969             return TRUE;
1970
1971         Zero(seen,256,char);
1972         if (*s == '$')
1973             weight -= 3;
1974         else if (isDIGIT(*s)) {
1975             if (s[1] != ']') {
1976                 if (isDIGIT(s[1]) && s[2] == ']')
1977                     weight -= 10;
1978             }
1979             else
1980                 weight -= 100;
1981         }
1982         for (; s < send; s++) {
1983             last_un_char = un_char;
1984             un_char = (unsigned char)*s;
1985             switch (*s) {
1986             case '@':
1987             case '&':
1988             case '$':
1989                 weight -= seen[un_char] * 10;
1990                 if (isALNUM_lazy_if(s+1,UTF)) {
1991                     scan_ident(s, send, tmpbuf, sizeof tmpbuf, FALSE);
1992                     if ((int)strlen(tmpbuf) > 1 && gv_fetchpv(tmpbuf,FALSE, SVt_PV))
1993                         weight -= 100;
1994                     else
1995                         weight -= 10;
1996                 }
1997                 else if (*s == '$' && s[1] &&
1998                   strchr("[#!%*<>()-=",s[1])) {
1999                     if (/*{*/ strchr("])} =",s[2]))
2000                         weight -= 10;
2001                     else
2002                         weight -= 1;
2003                 }
2004                 break;
2005             case '\\':
2006                 un_char = 254;
2007                 if (s[1]) {
2008                     if (strchr("wds]",s[1]))
2009                         weight += 100;
2010                     else if (seen['\''] || seen['"'])
2011                         weight += 1;
2012                     else if (strchr("rnftbxcav",s[1]))
2013                         weight += 40;
2014                     else if (isDIGIT(s[1])) {
2015                         weight += 40;
2016                         while (s[1] && isDIGIT(s[1]))
2017                             s++;
2018                     }
2019                 }
2020                 else
2021                     weight += 100;
2022                 break;
2023             case '-':
2024                 if (s[1] == '\\')
2025                     weight += 50;
2026                 if (strchr("aA01! ",last_un_char))
2027                     weight += 30;
2028                 if (strchr("zZ79~",s[1]))
2029                     weight += 30;
2030                 if (last_un_char == 255 && (isDIGIT(s[1]) || s[1] == '$'))
2031                     weight -= 5;        /* cope with negative subscript */
2032                 break;
2033             default:
2034                 if (!isALNUM(last_un_char)
2035                     && !(last_un_char == '$' || last_un_char == '@'
2036                          || last_un_char == '&')
2037                     && isALPHA(*s) && s[1] && isALPHA(s[1])) {
2038                     char *d = tmpbuf;
2039                     while (isALPHA(*s))
2040                         *d++ = *s++;
2041                     *d = '\0';
2042                     if (keyword(tmpbuf, d - tmpbuf))
2043                         weight -= 150;
2044                 }
2045                 if (un_char == last_un_char + 1)
2046                     weight += 5;
2047                 weight -= seen[un_char];
2048                 break;
2049             }
2050             seen[un_char]++;
2051         }
2052         if (weight >= 0)        /* probably a character class */
2053             return FALSE;
2054     }
2055
2056     return TRUE;
2057 }
2058
2059 /*
2060  * S_intuit_method
2061  *
2062  * Does all the checking to disambiguate
2063  *   foo bar
2064  * between foo(bar) and bar->foo.  Returns 0 if not a method, otherwise
2065  * FUNCMETH (bar->foo(args)) or METHOD (bar->foo args).
2066  *
2067  * First argument is the stuff after the first token, e.g. "bar".
2068  *
2069  * Not a method if bar is a filehandle.
2070  * Not a method if foo is a subroutine prototyped to take a filehandle.
2071  * Not a method if it's really "Foo $bar"
2072  * Method if it's "foo $bar"
2073  * Not a method if it's really "print foo $bar"
2074  * Method if it's really "foo package::" (interpreted as package->foo)
2075  * Not a method if bar is known to be a subroutine ("sub bar; foo bar")
2076  * Not a method if bar is a filehandle or package, but is quoted with
2077  *   =>
2078  */
2079
2080 STATIC int
2081 S_intuit_method(pTHX_ char *start, GV *gv)
2082 {
2083     char *s = start + (*start == '$');
2084     char tmpbuf[sizeof PL_tokenbuf];
2085     STRLEN len;
2086     GV* indirgv;
2087
2088     if (gv) {
2089         CV *cv;
2090         if (GvIO(gv))
2091             return 0;
2092         if ((cv = GvCVu(gv))) {
2093             const char *proto = SvPVX_const(cv);
2094             if (proto) {
2095                 if (*proto == ';')
2096                     proto++;
2097                 if (*proto == '*')
2098                     return 0;
2099             }
2100         } else
2101             gv = 0;
2102     }
2103     s = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
2104     /* start is the beginning of the possible filehandle/object,
2105      * and s is the end of it
2106      * tmpbuf is a copy of it
2107      */
2108
2109     if (*start == '$') {
2110         if (gv || PL_last_lop_op == OP_PRINT || isUPPER(*PL_tokenbuf))
2111             return 0;
2112         s = skipspace(s);
2113         PL_bufptr = start;
2114         PL_expect = XREF;
2115         return *s == '(' ? FUNCMETH : METHOD;
2116     }
2117     if (!keyword(tmpbuf, len)) {
2118         if (len > 2 && tmpbuf[len - 2] == ':' && tmpbuf[len - 1] == ':') {
2119             len -= 2;
2120             tmpbuf[len] = '\0';
2121             goto bare_package;
2122         }
2123         indirgv = gv_fetchpv(tmpbuf, FALSE, SVt_PVCV);
2124         if (indirgv && GvCVu(indirgv))
2125             return 0;
2126         /* filehandle or package name makes it a method */
2127         if (!gv || GvIO(indirgv) || gv_stashpvn(tmpbuf, len, FALSE)) {
2128             s = skipspace(s);
2129             if ((PL_bufend - s) >= 2 && *s == '=' && *(s+1) == '>')
2130                 return 0;       /* no assumptions -- "=>" quotes bearword */
2131       bare_package:
2132             PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST, 0,
2133                                                    newSVpvn(tmpbuf,len));
2134             PL_nextval[PL_nexttoke].opval->op_private = OPpCONST_BARE;
2135             PL_expect = XTERM;
2136             force_next(WORD);
2137             PL_bufptr = s;
2138             return *s == '(' ? FUNCMETH : METHOD;
2139         }
2140     }
2141     return 0;
2142 }
2143
2144 /*
2145  * S_incl_perldb
2146  * Return a string of Perl code to load the debugger.  If PERL5DB
2147  * is set, it will return the contents of that, otherwise a
2148  * compile-time require of perl5db.pl.
2149  */
2150
2151 STATIC const char*
2152 S_incl_perldb(pTHX)
2153 {
2154     if (PL_perldb) {
2155         const char * const pdb = PerlEnv_getenv("PERL5DB");
2156
2157         if (pdb)
2158             return pdb;
2159         SETERRNO(0,SS_NORMAL);
2160         return "BEGIN { require 'perl5db.pl' }";
2161     }
2162     return "";
2163 }
2164
2165
2166 /* Encoded script support. filter_add() effectively inserts a
2167  * 'pre-processing' function into the current source input stream.
2168  * Note that the filter function only applies to the current source file
2169  * (e.g., it will not affect files 'require'd or 'use'd by this one).
2170  *
2171  * The datasv parameter (which may be NULL) can be used to pass
2172  * private data to this instance of the filter. The filter function
2173  * can recover the SV using the FILTER_DATA macro and use it to
2174  * store private buffers and state information.
2175  *
2176  * The supplied datasv parameter is upgraded to a PVIO type
2177  * and the IoDIRP/IoANY field is used to store the function pointer,
2178  * and IOf_FAKE_DIRP is enabled on datasv to mark this as such.
2179  * Note that IoTOP_NAME, IoFMT_NAME, IoBOTTOM_NAME, if set for
2180  * private use must be set using malloc'd pointers.
2181  */
2182
2183 SV *
2184 Perl_filter_add(pTHX_ filter_t funcp, SV *datasv)
2185 {
2186     if (!funcp)
2187         return Nullsv;
2188
2189     if (!PL_rsfp_filters)
2190         PL_rsfp_filters = newAV();
2191     if (!datasv)
2192         datasv = NEWSV(255,0);
2193     SvUPGRADE(datasv, SVt_PVIO);
2194     IoANY(datasv) = FPTR2DPTR(void *, funcp); /* stash funcp into spare field */
2195     IoFLAGS(datasv) |= IOf_FAKE_DIRP;
2196     DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_add func %p (%s)\n",
2197                           IoANY(datasv), SvPV_nolen(datasv)));
2198     av_unshift(PL_rsfp_filters, 1);
2199     av_store(PL_rsfp_filters, 0, datasv) ;
2200     return(datasv);
2201 }
2202
2203
2204 /* Delete most recently added instance of this filter function. */
2205 void
2206 Perl_filter_del(pTHX_ filter_t funcp)
2207 {
2208     SV *datasv;
2209
2210 #ifdef DEBUGGING
2211     DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_del func %p", FPTR2DPTR(XPVIO *, funcp)));
2212 #endif
2213     if (!PL_rsfp_filters || AvFILLp(PL_rsfp_filters)<0)
2214         return;
2215     /* if filter is on top of stack (usual case) just pop it off */
2216     datasv = FILTER_DATA(AvFILLp(PL_rsfp_filters));
2217     if (IoANY(datasv) == FPTR2DPTR(void *, funcp)) {
2218         IoFLAGS(datasv) &= ~IOf_FAKE_DIRP;
2219         IoANY(datasv) = (void *)NULL;
2220         sv_free(av_pop(PL_rsfp_filters));
2221
2222         return;
2223     }
2224     /* we need to search for the correct entry and clear it     */
2225     Perl_die(aTHX_ "filter_del can only delete in reverse order (currently)");
2226 }
2227
2228
2229 /* Invoke the idxth filter function for the current rsfp.        */
2230 /* maxlen 0 = read one text line */
2231 I32
2232 Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
2233 {
2234     filter_t funcp;
2235     SV *datasv = NULL;
2236
2237     if (!PL_rsfp_filters)
2238         return -1;
2239     if (idx > AvFILLp(PL_rsfp_filters)) {       /* Any more filters?    */
2240         /* Provide a default input filter to make life easy.    */
2241         /* Note that we append to the line. This is handy.      */
2242         DEBUG_P(PerlIO_printf(Perl_debug_log,
2243                               "filter_read %d: from rsfp\n", idx));
2244         if (maxlen) {
2245             /* Want a block */
2246             int len ;
2247             const int old_len = SvCUR(buf_sv);
2248
2249             /* ensure buf_sv is large enough */
2250             SvGROW(buf_sv, (STRLEN)(old_len + maxlen)) ;
2251             if ((len = PerlIO_read(PL_rsfp, SvPVX(buf_sv) + old_len, maxlen)) <= 0){
2252                 if (PerlIO_error(PL_rsfp))
2253                     return -1;          /* error */
2254                 else
2255                     return 0 ;          /* end of file */
2256             }
2257             SvCUR_set(buf_sv, old_len + len) ;
2258         } else {
2259             /* Want a line */
2260             if (sv_gets(buf_sv, PL_rsfp, SvCUR(buf_sv)) == NULL) {
2261                 if (PerlIO_error(PL_rsfp))
2262                     return -1;          /* error */
2263                 else
2264                     return 0 ;          /* end of file */
2265             }
2266         }
2267         return SvCUR(buf_sv);
2268     }
2269     /* Skip this filter slot if filter has been deleted */
2270     if ( (datasv = FILTER_DATA(idx)) == &PL_sv_undef) {
2271         DEBUG_P(PerlIO_printf(Perl_debug_log,
2272                               "filter_read %d: skipped (filter deleted)\n",
2273                               idx));
2274         return FILTER_READ(idx+1, buf_sv, maxlen); /* recurse */
2275     }
2276     /* Get function pointer hidden within datasv        */
2277     funcp = DPTR2FPTR(filter_t, IoANY(datasv));
2278     DEBUG_P(PerlIO_printf(Perl_debug_log,
2279                           "filter_read %d: via function %p (%s)\n",
2280                           idx, datasv, SvPV_nolen_const(datasv)));
2281     /* Call function. The function is expected to       */
2282     /* call "FILTER_READ(idx+1, buf_sv)" first.         */
2283     /* Return: <0:error, =0:eof, >0:not eof             */
2284     return (*funcp)(aTHX_ idx, buf_sv, maxlen);
2285 }
2286
2287 STATIC char *
2288 S_filter_gets(pTHX_ register SV *sv, register PerlIO *fp, STRLEN append)
2289 {
2290 #ifdef PERL_CR_FILTER
2291     if (!PL_rsfp_filters) {
2292         filter_add(S_cr_textfilter,NULL);
2293     }
2294 #endif
2295     if (PL_rsfp_filters) {
2296         if (!append)
2297             SvCUR_set(sv, 0);   /* start with empty line        */
2298         if (FILTER_READ(0, sv, 0) > 0)
2299             return ( SvPVX(sv) ) ;
2300         else
2301             return Nullch ;
2302     }
2303     else
2304         return (sv_gets(sv, fp, append));
2305 }
2306
2307 STATIC HV *
2308 S_find_in_my_stash(pTHX_ const char *pkgname, I32 len)
2309 {
2310     GV *gv;
2311
2312     if (len == 11 && *pkgname == '_' && strEQ(pkgname, "__PACKAGE__"))
2313         return PL_curstash;
2314
2315     if (len > 2 &&
2316         (pkgname[len - 2] == ':' && pkgname[len - 1] == ':') &&
2317         (gv = gv_fetchpv(pkgname, FALSE, SVt_PVHV)))
2318     {
2319         return GvHV(gv);                        /* Foo:: */
2320     }
2321
2322     /* use constant CLASS => 'MyClass' */
2323     if ((gv = gv_fetchpv(pkgname, FALSE, SVt_PVCV))) {
2324         SV *sv;
2325         if (GvCV(gv) && (sv = cv_const_sv(GvCV(gv)))) {
2326             pkgname = SvPV_nolen_const(sv);
2327         }
2328     }
2329
2330     return gv_stashpv(pkgname, FALSE);
2331 }
2332
2333 STATIC char *
2334 S_tokenize_use(pTHX_ int is_use, char *s) {
2335     if (PL_expect != XSTATE)
2336         yyerror(Perl_form(aTHX_ "\"%s\" not allowed in expression",
2337                     is_use ? "use" : "no"));
2338     s = skipspace(s);
2339     if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
2340         s = force_version(s, TRUE);
2341         if (*s == ';' || (s = skipspace(s), *s == ';')) {
2342             PL_nextval[PL_nexttoke].opval = Nullop;
2343             force_next(WORD);
2344         }
2345         else if (*s == 'v') {
2346             s = force_word(s,WORD,FALSE,TRUE,FALSE);
2347             s = force_version(s, FALSE);
2348         }
2349     }
2350     else {
2351         s = force_word(s,WORD,FALSE,TRUE,FALSE);
2352         s = force_version(s, FALSE);
2353     }
2354     yylval.ival = is_use;
2355     return s;
2356 }
2357 #ifdef DEBUGGING
2358     static const char* const exp_name[] =
2359         { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "ATTRBLOCK",
2360           "ATTRTERM", "TERMBLOCK", "TERMORDORDOR"
2361         };
2362 #endif
2363
2364 /*
2365   yylex
2366
2367   Works out what to call the token just pulled out of the input
2368   stream.  The yacc parser takes care of taking the ops we return and
2369   stitching them into a tree.
2370
2371   Returns:
2372     PRIVATEREF
2373
2374   Structure:
2375       if read an identifier
2376           if we're in a my declaration
2377               croak if they tried to say my($foo::bar)
2378               build the ops for a my() declaration
2379           if it's an access to a my() variable
2380               are we in a sort block?
2381                   croak if my($a); $a <=> $b
2382               build ops for access to a my() variable
2383           if in a dq string, and they've said @foo and we can't find @foo
2384               croak
2385           build ops for a bareword
2386       if we already built the token before, use it.
2387 */
2388
2389
2390 #ifdef __SC__
2391 #pragma segment Perl_yylex
2392 #endif
2393 int
2394 Perl_yylex(pTHX)
2395 {
2396     register char *s = PL_bufptr;
2397     register char *d;
2398     register I32 tmp;
2399     STRLEN len;
2400     GV *gv = Nullgv;
2401     GV **gvp = 0;
2402     bool bof = FALSE;
2403     I32 orig_keyword = 0;
2404
2405     DEBUG_T( {
2406         PerlIO_printf(Perl_debug_log, "### LEX_%s\n",
2407                                         lex_state_names[PL_lex_state]);
2408     } );
2409     /* check if there's an identifier for us to look at */
2410     if (PL_pending_ident)
2411         return REPORT(S_pending_ident(aTHX));
2412
2413     /* no identifier pending identification */
2414
2415     switch (PL_lex_state) {
2416 #ifdef COMMENTARY
2417     case LEX_NORMAL:            /* Some compilers will produce faster */
2418     case LEX_INTERPNORMAL:      /* code if we comment these out. */
2419         break;
2420 #endif
2421
2422     /* when we've already built the next token, just pull it out of the queue */
2423     case LEX_KNOWNEXT:
2424         PL_nexttoke--;
2425         yylval = PL_nextval[PL_nexttoke];
2426         if (!PL_nexttoke) {
2427             PL_lex_state = PL_lex_defer;
2428             PL_expect = PL_lex_expect;
2429             PL_lex_defer = LEX_NORMAL;
2430         }
2431         DEBUG_T({ PerlIO_printf(Perl_debug_log,
2432               "### Next token after '%s' was known, type %"IVdf"\n", PL_bufptr,
2433               (IV)PL_nexttype[PL_nexttoke]); });
2434
2435         return REPORT(PL_nexttype[PL_nexttoke]);
2436
2437     /* interpolated case modifiers like \L \U, including \Q and \E.
2438        when we get here, PL_bufptr is at the \
2439     */
2440     case LEX_INTERPCASEMOD:
2441 #ifdef DEBUGGING
2442         if (PL_bufptr != PL_bufend && *PL_bufptr != '\\')
2443             Perl_croak(aTHX_ "panic: INTERPCASEMOD");
2444 #endif
2445         /* handle \E or end of string */
2446         if (PL_bufptr == PL_bufend || PL_bufptr[1] == 'E') {
2447             /* if at a \E */
2448             if (PL_lex_casemods) {
2449                 const char oldmod = PL_lex_casestack[--PL_lex_casemods];
2450                 PL_lex_casestack[PL_lex_casemods] = '\0';
2451
2452                 if (PL_bufptr != PL_bufend
2453                     && (oldmod == 'L' || oldmod == 'U' || oldmod == 'Q')) {
2454                     PL_bufptr += 2;
2455                     PL_lex_state = LEX_INTERPCONCAT;
2456                 }
2457                 return REPORT(')');
2458             }
2459             if (PL_bufptr != PL_bufend)
2460                 PL_bufptr += 2;
2461             PL_lex_state = LEX_INTERPCONCAT;
2462             return yylex();
2463         }
2464         else {
2465             DEBUG_T({ PerlIO_printf(Perl_debug_log,
2466               "### Saw case modifier at '%s'\n", PL_bufptr); });
2467             s = PL_bufptr + 1;
2468             if (s[1] == '\\' && s[2] == 'E') {
2469                 PL_bufptr = s + 3;
2470                 PL_lex_state = LEX_INTERPCONCAT;
2471                 return yylex();
2472             }
2473             else {
2474                 if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
2475                     tmp = *s, *s = s[2], s[2] = (char)tmp;      /* misordered... */
2476                 if ((*s == 'L' || *s == 'U') &&
2477                     (strchr(PL_lex_casestack, 'L') || strchr(PL_lex_casestack, 'U'))) {
2478                     PL_lex_casestack[--PL_lex_casemods] = '\0';
2479                     return REPORT(')');
2480                 }
2481                 if (PL_lex_casemods > 10)
2482                     Renew(PL_lex_casestack, PL_lex_casemods + 2, char);
2483                 PL_lex_casestack[PL_lex_casemods++] = *s;
2484                 PL_lex_casestack[PL_lex_casemods] = '\0';
2485                 PL_lex_state = LEX_INTERPCONCAT;
2486                 PL_nextval[PL_nexttoke].ival = 0;
2487                 force_next('(');
2488                 if (*s == 'l')
2489                     PL_nextval[PL_nexttoke].ival = OP_LCFIRST;
2490                 else if (*s == 'u')
2491                     PL_nextval[PL_nexttoke].ival = OP_UCFIRST;
2492                 else if (*s == 'L')
2493                     PL_nextval[PL_nexttoke].ival = OP_LC;
2494                 else if (*s == 'U')
2495                     PL_nextval[PL_nexttoke].ival = OP_UC;
2496                 else if (*s == 'Q')
2497                     PL_nextval[PL_nexttoke].ival = OP_QUOTEMETA;
2498                 else
2499                     Perl_croak(aTHX_ "panic: yylex");
2500                 PL_bufptr = s + 1;
2501             }
2502             force_next(FUNC);
2503             if (PL_lex_starts) {
2504                 s = PL_bufptr;
2505                 PL_lex_starts = 0;
2506                 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
2507                 if (PL_lex_casemods == 1 && PL_lex_inpat)
2508                     OPERATOR(',');
2509                 else
2510                     Aop(OP_CONCAT);
2511             }
2512             else
2513                 return yylex();
2514         }
2515
2516     case LEX_INTERPPUSH:
2517         return REPORT(sublex_push());
2518
2519     case LEX_INTERPSTART:
2520         if (PL_bufptr == PL_bufend)
2521             return REPORT(sublex_done());
2522         DEBUG_T({ PerlIO_printf(Perl_debug_log,
2523               "### Interpolated variable at '%s'\n", PL_bufptr); });
2524         PL_expect = XTERM;
2525         PL_lex_dojoin = (*PL_bufptr == '@');
2526         PL_lex_state = LEX_INTERPNORMAL;
2527         if (PL_lex_dojoin) {
2528             PL_nextval[PL_nexttoke].ival = 0;
2529             force_next(',');
2530             force_ident("\"", '$');
2531             PL_nextval[PL_nexttoke].ival = 0;
2532             force_next('$');
2533             PL_nextval[PL_nexttoke].ival = 0;
2534             force_next('(');
2535             PL_nextval[PL_nexttoke].ival = OP_JOIN;     /* emulate join($", ...) */
2536             force_next(FUNC);
2537         }
2538         if (PL_lex_starts++) {
2539             s = PL_bufptr;
2540             /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
2541             if (!PL_lex_casemods && PL_lex_inpat)
2542                 OPERATOR(',');
2543             else
2544                 Aop(OP_CONCAT);
2545         }
2546         return yylex();
2547
2548     case LEX_INTERPENDMAYBE:
2549         if (intuit_more(PL_bufptr)) {
2550             PL_lex_state = LEX_INTERPNORMAL;    /* false alarm, more expr */
2551             break;
2552         }
2553         /* FALL THROUGH */
2554
2555     case LEX_INTERPEND:
2556         if (PL_lex_dojoin) {
2557             PL_lex_dojoin = FALSE;
2558             PL_lex_state = LEX_INTERPCONCAT;
2559             return REPORT(')');
2560         }
2561         if (PL_lex_inwhat == OP_SUBST && PL_linestr == PL_lex_repl
2562             && SvEVALED(PL_lex_repl))
2563         {
2564             if (PL_bufptr != PL_bufend)
2565                 Perl_croak(aTHX_ "Bad evalled substitution pattern");
2566             PL_lex_repl = Nullsv;
2567         }
2568         /* FALLTHROUGH */
2569     case LEX_INTERPCONCAT:
2570 #ifdef DEBUGGING
2571         if (PL_lex_brackets)
2572             Perl_croak(aTHX_ "panic: INTERPCONCAT");
2573 #endif
2574         if (PL_bufptr == PL_bufend)
2575             return REPORT(sublex_done());
2576
2577         if (SvIVX(PL_linestr) == '\'') {
2578             SV *sv = newSVsv(PL_linestr);
2579             if (!PL_lex_inpat)
2580                 sv = tokeq(sv);
2581             else if ( PL_hints & HINT_NEW_RE )
2582                 sv = new_constant(NULL, 0, "qr", sv, sv, "q");
2583             yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
2584             s = PL_bufend;
2585         }
2586         else {
2587             s = scan_const(PL_bufptr);
2588             if (*s == '\\')
2589                 PL_lex_state = LEX_INTERPCASEMOD;
2590             else
2591                 PL_lex_state = LEX_INTERPSTART;
2592         }
2593
2594         if (s != PL_bufptr) {
2595             PL_nextval[PL_nexttoke] = yylval;
2596             PL_expect = XTERM;
2597             force_next(THING);
2598             if (PL_lex_starts++) {
2599                 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
2600                 if (!PL_lex_casemods && PL_lex_inpat)
2601                     OPERATOR(',');
2602                 else
2603                     Aop(OP_CONCAT);
2604             }
2605             else {
2606                 PL_bufptr = s;
2607                 return yylex();
2608             }
2609         }
2610
2611         return yylex();
2612     case LEX_FORMLINE:
2613         PL_lex_state = LEX_NORMAL;
2614         s = scan_formline(PL_bufptr);
2615         if (!PL_lex_formbrack)
2616             goto rightbracket;
2617         OPERATOR(';');
2618     }
2619
2620     s = PL_bufptr;
2621     PL_oldoldbufptr = PL_oldbufptr;
2622     PL_oldbufptr = s;
2623     DEBUG_T( {
2624         PerlIO_printf(Perl_debug_log, "### Tokener expecting %s at [%s]\n",
2625                       exp_name[PL_expect], s);
2626     } );
2627
2628   retry:
2629     switch (*s) {
2630     default:
2631         if (isIDFIRST_lazy_if(s,UTF))
2632             goto keylookup;
2633         Perl_croak(aTHX_ "Unrecognized character \\x%02X", *s & 255);
2634     case 4:
2635     case 26:
2636         goto fake_eof;                  /* emulate EOF on ^D or ^Z */
2637     case 0:
2638         if (!PL_rsfp) {
2639             PL_last_uni = 0;
2640             PL_last_lop = 0;
2641             if (PL_lex_brackets) {
2642                 if (PL_lex_formbrack)
2643                     yyerror("Format not terminated");
2644                 else
2645                     yyerror("Missing right curly or square bracket");
2646             }
2647             DEBUG_T( { PerlIO_printf(Perl_debug_log,
2648                         "### Tokener got EOF\n");
2649             } );
2650             TOKEN(0);
2651         }
2652         if (s++ < PL_bufend)
2653             goto retry;                 /* ignore stray nulls */
2654         PL_last_uni = 0;
2655         PL_last_lop = 0;
2656         if (!PL_in_eval && !PL_preambled) {
2657             PL_preambled = TRUE;
2658             sv_setpv(PL_linestr,incl_perldb());
2659             if (SvCUR(PL_linestr))
2660                 sv_catpvn(PL_linestr,";", 1);
2661             if (PL_preambleav){
2662                 while(AvFILLp(PL_preambleav) >= 0) {
2663                     SV *tmpsv = av_shift(PL_preambleav);
2664                     sv_catsv(PL_linestr, tmpsv);
2665                     sv_catpvn(PL_linestr, ";", 1);
2666                     sv_free(tmpsv);
2667                 }
2668                 sv_free((SV*)PL_preambleav);
2669                 PL_preambleav = NULL;
2670             }
2671             if (PL_minus_n || PL_minus_p) {
2672                 sv_catpv(PL_linestr, "LINE: while (<>) {");
2673                 if (PL_minus_l)
2674                     sv_catpv(PL_linestr,"chomp;");
2675                 if (PL_minus_a) {
2676                     if (PL_minus_F) {
2677                         if ((*PL_splitstr == '/' || *PL_splitstr == '\''
2678                              || *PL_splitstr == '"')
2679                               && strchr(PL_splitstr + 1, *PL_splitstr))
2680                             Perl_sv_catpvf(aTHX_ PL_linestr, "our @F=split(%s);", PL_splitstr);
2681                         else {
2682                             /* "q\0${splitstr}\0" is legal perl. Yes, even NUL
2683                                bytes can be used as quoting characters.  :-) */
2684                             /* The count here deliberately includes the NUL
2685                                that terminates the C string constant.  This
2686                                embeds the opening NUL into the string.  */
2687                             const char *splits = PL_splitstr;
2688                             sv_catpvn(PL_linestr, "our @F=split(q", 15);
2689                             do {
2690                                 /* Need to \ \s  */
2691                                 if (*splits == '\\')
2692                                     sv_catpvn(PL_linestr, splits, 1);
2693                                 sv_catpvn(PL_linestr, splits, 1);
2694                             } while (*splits++);
2695                             /* This loop will embed the trailing NUL of
2696                                PL_linestr as the last thing it does before
2697                                terminating.  */
2698                             sv_catpvn(PL_linestr, ");", 2);
2699                         }
2700                     }
2701                     else
2702                         sv_catpv(PL_linestr,"our @F=split(' ');");
2703                 }
2704             }
2705             sv_catpvn(PL_linestr, "\n", 1);
2706             PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2707             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
2708             PL_last_lop = PL_last_uni = Nullch;
2709             if (PERLDB_LINE && PL_curstash != PL_debstash) {
2710                 SV * const sv = NEWSV(85,0);
2711
2712                 sv_upgrade(sv, SVt_PVMG);
2713                 sv_setsv(sv,PL_linestr);
2714                 (void)SvIOK_on(sv);
2715                 SvIV_set(sv, 0);
2716                 av_store(CopFILEAV(PL_curcop),(I32)CopLINE(PL_curcop),sv);
2717             }
2718             goto retry;
2719         }
2720         do {
2721             bof = PL_rsfp ? TRUE : FALSE;
2722             if ((s = filter_gets(PL_linestr, PL_rsfp, 0)) == Nullch) {
2723               fake_eof:
2724                 if (PL_rsfp) {
2725                     if (PL_preprocess && !PL_in_eval)
2726                         (void)PerlProc_pclose(PL_rsfp);
2727                     else if ((PerlIO *)PL_rsfp == PerlIO_stdin())
2728                         PerlIO_clearerr(PL_rsfp);
2729                     else
2730                         (void)PerlIO_close(PL_rsfp);
2731                     PL_rsfp = Nullfp;
2732                     PL_doextract = FALSE;
2733                 }
2734                 if (!PL_in_eval && (PL_minus_n || PL_minus_p)) {
2735                     sv_setpv(PL_linestr,PL_minus_p
2736                              ? ";}continue{print;}" : ";}");
2737                     PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2738                     PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
2739                     PL_last_lop = PL_last_uni = Nullch;
2740                     PL_minus_n = PL_minus_p = 0;
2741                     goto retry;
2742                 }
2743                 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2744                 PL_last_lop = PL_last_uni = Nullch;
2745                 sv_setpvn(PL_linestr,"",0);
2746                 TOKEN(';');     /* not infinite loop because rsfp is NULL now */
2747             }
2748             /* If it looks like the start of a BOM or raw UTF-16,
2749              * check if it in fact is. */
2750             else if (bof &&
2751                      (*s == 0 ||
2752                       *(U8*)s == 0xEF ||
2753                       *(U8*)s >= 0xFE ||
2754                       s[1] == 0)) {
2755 #ifdef PERLIO_IS_STDIO
2756 #  ifdef __GNU_LIBRARY__
2757 #    if __GNU_LIBRARY__ == 1 /* Linux glibc5 */
2758 #      define FTELL_FOR_PIPE_IS_BROKEN
2759 #    endif
2760 #  else
2761 #    ifdef __GLIBC__
2762 #      if __GLIBC__ == 1 /* maybe some glibc5 release had it like this? */
2763 #        define FTELL_FOR_PIPE_IS_BROKEN
2764 #      endif
2765 #    endif
2766 #  endif
2767 #endif
2768 #ifdef FTELL_FOR_PIPE_IS_BROKEN
2769                 /* This loses the possibility to detect the bof
2770                  * situation on perl -P when the libc5 is being used.
2771                  * Workaround?  Maybe attach some extra state to PL_rsfp?
2772                  */
2773                 if (!PL_preprocess)
2774                     bof = PerlIO_tell(PL_rsfp) == SvCUR(PL_linestr);
2775 #else
2776                 bof = PerlIO_tell(PL_rsfp) == (Off_t)SvCUR(PL_linestr);
2777 #endif
2778                 if (bof) {
2779                     PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
2780                     s = swallow_bom((U8*)s);
2781                 }
2782             }
2783             if (PL_doextract) {
2784                 /* Incest with pod. */
2785                 if (*s == '=' && strnEQ(s, "=cut", 4)) {
2786                     sv_setpvn(PL_linestr, "", 0);
2787                     PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2788                     PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
2789                     PL_last_lop = PL_last_uni = Nullch;
2790                     PL_doextract = FALSE;
2791                 }
2792             }
2793             incline(s);
2794         } while (PL_doextract);
2795         PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = s;
2796         if (PERLDB_LINE && PL_curstash != PL_debstash) {
2797             SV * const sv = NEWSV(85,0);
2798
2799             sv_upgrade(sv, SVt_PVMG);
2800             sv_setsv(sv,PL_linestr);
2801             (void)SvIOK_on(sv);
2802             SvIV_set(sv, 0);
2803             av_store(CopFILEAV(PL_curcop),(I32)CopLINE(PL_curcop),sv);
2804         }
2805         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
2806         PL_last_lop = PL_last_uni = Nullch;
2807         if (CopLINE(PL_curcop) == 1) {
2808             while (s < PL_bufend && isSPACE(*s))
2809                 s++;
2810             if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
2811                 s++;
2812             d = Nullch;
2813             if (!PL_in_eval) {
2814                 if (*s == '#' && *(s+1) == '!')
2815                     d = s + 2;
2816 #ifdef ALTERNATE_SHEBANG
2817                 else {
2818                     static char const as[] = ALTERNATE_SHEBANG;
2819                     if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
2820                         d = s + (sizeof(as) - 1);
2821                 }
2822 #endif /* ALTERNATE_SHEBANG */
2823             }
2824             if (d) {
2825                 char *ipath;
2826                 char *ipathend;
2827
2828                 while (isSPACE(*d))
2829                     d++;
2830                 ipath = d;
2831                 while (*d && !isSPACE(*d))
2832                     d++;
2833                 ipathend = d;
2834
2835 #ifdef ARG_ZERO_IS_SCRIPT
2836                 if (ipathend > ipath) {
2837                     /*
2838                      * HP-UX (at least) sets argv[0] to the script name,
2839                      * which makes $^X incorrect.  And Digital UNIX and Linux,
2840                      * at least, set argv[0] to the basename of the Perl
2841                      * interpreter. So, having found "#!", we'll set it right.
2842                      */
2843                     SV *x = GvSV(gv_fetchpv("\030", TRUE, SVt_PV)); /* $^X */
2844                     assert(SvPOK(x) || SvGMAGICAL(x));
2845                     if (sv_eq(x, CopFILESV(PL_curcop))) {
2846                         sv_setpvn(x, ipath, ipathend - ipath);
2847                         SvSETMAGIC(x);
2848                     }
2849                     else {
2850                         STRLEN blen;
2851                         STRLEN llen;
2852                         const char *bstart = SvPV_const(CopFILESV(PL_curcop),blen);
2853                         const char * const lstart = SvPV_const(x,llen);
2854                         if (llen < blen) {
2855                             bstart += blen - llen;
2856                             if (strnEQ(bstart, lstart, llen) && bstart[-1] == '/') {
2857                                 sv_setpvn(x, ipath, ipathend - ipath);
2858                                 SvSETMAGIC(x);
2859                             }
2860                         }
2861                     }
2862                     TAINT_NOT;  /* $^X is always tainted, but that's OK */
2863                 }
2864 #endif /* ARG_ZERO_IS_SCRIPT */
2865
2866                 /*
2867                  * Look for options.
2868                  */
2869                 d = instr(s,"perl -");
2870                 if (!d) {
2871                     d = instr(s,"perl");
2872 #if defined(DOSISH)
2873                     /* avoid getting into infinite loops when shebang
2874                      * line contains "Perl" rather than "perl" */
2875                     if (!d) {
2876                         for (d = ipathend-4; d >= ipath; --d) {
2877                             if ((*d == 'p' || *d == 'P')
2878                                 && !ibcmp(d, "perl", 4))
2879                             {
2880                                 break;
2881                             }
2882                         }
2883                         if (d < ipath)
2884                             d = Nullch;
2885                     }
2886 #endif
2887                 }
2888 #ifdef ALTERNATE_SHEBANG
2889                 /*
2890                  * If the ALTERNATE_SHEBANG on this system starts with a
2891                  * character that can be part of a Perl expression, then if
2892                  * we see it but not "perl", we're probably looking at the
2893                  * start of Perl code, not a request to hand off to some
2894                  * other interpreter.  Similarly, if "perl" is there, but
2895                  * not in the first 'word' of the line, we assume the line
2896                  * contains the start of the Perl program.
2897                  */
2898                 if (d && *s != '#') {
2899                     const char *c = ipath;
2900                     while (*c && !strchr("; \t\r\n\f\v#", *c))
2901                         c++;
2902                     if (c < d)
2903                         d = Nullch;     /* "perl" not in first word; ignore */
2904                     else
2905                         *s = '#';       /* Don't try to parse shebang line */
2906                 }
2907 #endif /* ALTERNATE_SHEBANG */
2908 #ifndef MACOS_TRADITIONAL
2909                 if (!d &&
2910                     *s == '#' &&
2911                     ipathend > ipath &&
2912                     !PL_minus_c &&
2913                     !instr(s,"indir") &&
2914                     instr(PL_origargv[0],"perl"))
2915                 {
2916                     dVAR;
2917                     char **newargv;
2918
2919                     *ipathend = '\0';
2920                     s = ipathend + 1;
2921                     while (s < PL_bufend && isSPACE(*s))
2922                         s++;
2923                     if (s < PL_bufend) {
2924                         Newxz(newargv,PL_origargc+3,char*);
2925                         newargv[1] = s;
2926                         while (s < PL_bufend && !isSPACE(*s))
2927                             s++;
2928                         *s = '\0';
2929                         Copy(PL_origargv+1, newargv+2, PL_origargc+1, char*);
2930                     }
2931                     else
2932                         newargv = PL_origargv;
2933                     newargv[0] = ipath;
2934                     PERL_FPU_PRE_EXEC
2935                     PerlProc_execv(ipath, EXEC_ARGV_CAST(newargv));
2936                     PERL_FPU_POST_EXEC
2937                     Perl_croak(aTHX_ "Can't exec %s", ipath);
2938                 }
2939 #endif
2940                 if (d) {
2941                     const U32 oldpdb = PL_perldb;
2942                     const bool oldn = PL_minus_n;
2943                     const bool oldp = PL_minus_p;
2944
2945                     while (*d && !isSPACE(*d)) d++;
2946                     while (SPACE_OR_TAB(*d)) d++;
2947
2948                     if (*d++ == '-') {
2949                         const bool switches_done = PL_doswitches;
2950                         do {
2951                             if (*d == 'M' || *d == 'm' || *d == 'C') {
2952                                 const char * const m = d;
2953                                 while (*d && !isSPACE(*d)) d++;
2954                                 Perl_croak(aTHX_ "Too late for \"-%.*s\" option",
2955                                       (int)(d - m), m);
2956                             }
2957                             d = moreswitches(d);
2958                         } while (d);
2959                         if (PL_doswitches && !switches_done) {
2960                             int argc = PL_origargc;
2961                             char **argv = PL_origargv;
2962                             do {
2963                                 argc--,argv++;
2964                             } while (argc && argv[0][0] == '-' && argv[0][1]);
2965                             init_argv_symbols(argc,argv);
2966                         }
2967                         if ((PERLDB_LINE && !oldpdb) ||
2968                             ((PL_minus_n || PL_minus_p) && !(oldn || oldp)))
2969                               /* if we have already added "LINE: while (<>) {",
2970                                  we must not do it again */
2971                         {
2972                             sv_setpvn(PL_linestr, "", 0);
2973                             PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2974                             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
2975                             PL_last_lop = PL_last_uni = Nullch;
2976                             PL_preambled = FALSE;
2977                             if (PERLDB_LINE)
2978                                 (void)gv_fetchfile(PL_origfilename);
2979                             goto retry;
2980                         }
2981                         if (PL_doswitches && !switches_done) {
2982                             int argc = PL_origargc;
2983                             char **argv = PL_origargv;
2984                             do {
2985                                 argc--,argv++;
2986                             } while (argc && argv[0][0] == '-' && argv[0][1]);
2987                             init_argv_symbols(argc,argv);
2988                         }
2989                     }
2990                 }
2991             }
2992         }
2993         if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
2994             PL_bufptr = s;
2995             PL_lex_state = LEX_FORMLINE;
2996             return yylex();
2997         }
2998         goto retry;
2999     case '\r':
3000 #ifdef PERL_STRICT_CR
3001         Perl_warn(aTHX_ "Illegal character \\%03o (carriage return)", '\r');
3002         Perl_croak(aTHX_
3003       "\t(Maybe you didn't strip carriage returns after a network transfer?)\n");
3004 #endif
3005     case ' ': case '\t': case '\f': case 013:
3006 #ifdef MACOS_TRADITIONAL
3007     case '\312':
3008 #endif
3009         s++;
3010         goto retry;
3011     case '#':
3012     case '\n':
3013         if (PL_lex_state != LEX_NORMAL || (PL_in_eval && !PL_rsfp)) {
3014             if (*s == '#' && s == PL_linestart && PL_in_eval && !PL_rsfp) {
3015                 /* handle eval qq[#line 1 "foo"\n ...] */
3016                 CopLINE_dec(PL_curcop);
3017                 incline(s);
3018             }
3019             d = PL_bufend;
3020             while (s < d && *s != '\n')
3021                 s++;
3022             if (s < d)
3023                 s++;
3024             else if (s > d) /* Found by Ilya: feed random input to Perl. */
3025               Perl_croak(aTHX_ "panic: input overflow");
3026             incline(s);
3027             if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
3028                 PL_bufptr = s;
3029                 PL_lex_state = LEX_FORMLINE;
3030                 return yylex();
3031             }
3032         }
3033         else {
3034             *s = '\0';
3035             PL_bufend = s;
3036         }
3037         goto retry;
3038     case '-':
3039         if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
3040             I32 ftst = 0;
3041
3042             s++;
3043             PL_bufptr = s;
3044             tmp = *s++;
3045
3046             while (s < PL_bufend && SPACE_OR_TAB(*s))
3047                 s++;
3048
3049             if (strnEQ(s,"=>",2)) {
3050                 s = force_word(PL_bufptr,WORD,FALSE,FALSE,FALSE);
3051                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
3052                             "### Saw unary minus before =>, forcing word '%s'\n", s);
3053                 } );
3054                 OPERATOR('-');          /* unary minus */
3055             }
3056             PL_last_uni = PL_oldbufptr;
3057             switch (tmp) {
3058             case 'r': ftst = OP_FTEREAD;        break;
3059             case 'w': ftst = OP_FTEWRITE;       break;
3060             case 'x': ftst = OP_FTEEXEC;        break;
3061             case 'o': ftst = OP_FTEOWNED;       break;
3062             case 'R': ftst = OP_FTRREAD;        break;
3063             case 'W': ftst = OP_FTRWRITE;       break;
3064             case 'X': ftst = OP_FTREXEC;        break;
3065             case 'O': ftst = OP_FTROWNED;       break;
3066             case 'e': ftst = OP_FTIS;           break;
3067             case 'z': ftst = OP_FTZERO;         break;
3068             case 's': ftst = OP_FTSIZE;         break;
3069             case 'f': ftst = OP_FTFILE;         break;
3070             case 'd': ftst = OP_FTDIR;          break;
3071             case 'l': ftst = OP_FTLINK;         break;
3072             case 'p': ftst = OP_FTPIPE;         break;
3073             case 'S': ftst = OP_FTSOCK;         break;
3074             case 'u': ftst = OP_FTSUID;         break;
3075             case 'g': ftst = OP_FTSGID;         break;
3076             case 'k': ftst = OP_FTSVTX;         break;
3077             case 'b': ftst = OP_FTBLK;          break;
3078             case 'c': ftst = OP_FTCHR;          break;
3079             case 't': ftst = OP_FTTTY;          break;
3080             case 'T': ftst = OP_FTTEXT;         break;
3081             case 'B': ftst = OP_FTBINARY;       break;
3082             case 'M': case 'A': case 'C':
3083                 gv_fetchpv("\024",TRUE, SVt_PV);
3084                 switch (tmp) {
3085                 case 'M': ftst = OP_FTMTIME;    break;
3086                 case 'A': ftst = OP_FTATIME;    break;
3087                 case 'C': ftst = OP_FTCTIME;    break;
3088                 default:                        break;
3089                 }
3090                 break;
3091             default:
3092                 break;
3093             }
3094             if (ftst) {
3095                 PL_last_lop_op = (OPCODE)ftst;
3096                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
3097                         "### Saw file test %c\n", (int)ftst);
3098                 } );
3099                 FTST(ftst);
3100             }
3101             else {
3102                 /* Assume it was a minus followed by a one-letter named
3103                  * subroutine call (or a -bareword), then. */
3104                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
3105                         "### '-%c' looked like a file test but was not\n",
3106                         (int) tmp);
3107                 } );
3108                 s = --PL_bufptr;
3109             }
3110         }
3111         tmp = *s++;
3112         if (*s == tmp) {
3113             s++;
3114             if (PL_expect == XOPERATOR)
3115                 TERM(POSTDEC);
3116             else
3117                 OPERATOR(PREDEC);
3118         }
3119         else if (*s == '>') {
3120             s++;
3121             s = skipspace(s);
3122             if (isIDFIRST_lazy_if(s,UTF)) {
3123                 s = force_word(s,METHOD,FALSE,TRUE,FALSE);
3124                 TOKEN(ARROW);
3125             }
3126             else if (*s == '$')
3127                 OPERATOR(ARROW);
3128             else
3129                 TERM(ARROW);
3130         }
3131         if (PL_expect == XOPERATOR)
3132             Aop(OP_SUBTRACT);
3133         else {
3134             if (isSPACE(*s) || !isSPACE(*PL_bufptr))
3135                 check_uni();
3136             OPERATOR('-');              /* unary minus */
3137         }
3138
3139     case '+':
3140         tmp = *s++;
3141         if (*s == tmp) {
3142             s++;
3143             if (PL_expect == XOPERATOR)
3144                 TERM(POSTINC);
3145             else
3146                 OPERATOR(PREINC);
3147         }
3148         if (PL_expect == XOPERATOR)
3149             Aop(OP_ADD);
3150         else {
3151             if (isSPACE(*s) || !isSPACE(*PL_bufptr))
3152                 check_uni();
3153             OPERATOR('+');
3154         }
3155
3156     case '*':
3157         if (PL_expect != XOPERATOR) {
3158             s = scan_ident(s, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
3159             PL_expect = XOPERATOR;
3160             force_ident(PL_tokenbuf, '*');
3161             if (!*PL_tokenbuf)
3162                 PREREF('*');
3163             TERM('*');
3164         }
3165         s++;
3166         if (*s == '*') {
3167             s++;
3168             PWop(OP_POW);
3169         }
3170         Mop(OP_MULTIPLY);
3171
3172     case '%':
3173         if (PL_expect == XOPERATOR) {
3174             ++s;
3175             Mop(OP_MODULO);
3176         }
3177         PL_tokenbuf[0] = '%';
3178         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, TRUE);
3179         if (!PL_tokenbuf[1]) {
3180             PREREF('%');
3181         }
3182         PL_pending_ident = '%';
3183         TERM('%');
3184
3185     case '^':
3186         s++;
3187         BOop(OP_BIT_XOR);
3188     case '[':
3189         PL_lex_brackets++;
3190         /* FALL THROUGH */
3191     case '~':
3192     case ',':
3193         tmp = *s++;
3194         OPERATOR(tmp);
3195     case ':':
3196         if (s[1] == ':') {
3197             len = 0;
3198             goto just_a_word;
3199         }
3200         s++;
3201         switch (PL_expect) {
3202             OP *attrs;
3203         case XOPERATOR:
3204             if (!PL_in_my || PL_lex_state != LEX_NORMAL)
3205                 break;
3206             PL_bufptr = s;      /* update in case we back off */
3207             goto grabattrs;
3208         case XATTRBLOCK:
3209             PL_expect = XBLOCK;
3210             goto grabattrs;
3211         case XATTRTERM:
3212             PL_expect = XTERMBLOCK;
3213          grabattrs:
3214             s = skipspace(s);
3215             attrs = Nullop;
3216             while (isIDFIRST_lazy_if(s,UTF)) {
3217                 d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
3218                 if (isLOWER(*s) && (tmp = keyword(PL_tokenbuf, len))) {
3219                     if (tmp < 0) tmp = -tmp;
3220                     switch (tmp) {
3221                     case KEY_or:
3222                     case KEY_and:
3223                     case KEY_err:
3224                     case KEY_for:
3225                     case KEY_unless:
3226                     case KEY_if:
3227                     case KEY_while:
3228                     case KEY_until:
3229                         goto got_attrs;
3230                     default:
3231                         break;
3232                     }
3233                 }
3234                 if (*d == '(') {
3235                     d = scan_str(d,TRUE,TRUE);
3236                     if (!d) {
3237                         /* MUST advance bufptr here to avoid bogus
3238                            "at end of line" context messages from yyerror().
3239                          */
3240                         PL_bufptr = s + len;
3241                         yyerror("Unterminated attribute parameter in attribute list");
3242                         if (attrs)
3243                             op_free(attrs);
3244                         return REPORT(0);       /* EOF indicator */
3245                     }
3246                 }
3247                 if (PL_lex_stuff) {
3248                     SV *sv = newSVpvn(s, len);
3249                     sv_catsv(sv, PL_lex_stuff);
3250                     attrs = append_elem(OP_LIST, attrs,
3251                                         newSVOP(OP_CONST, 0, sv));
3252                     SvREFCNT_dec(PL_lex_stuff);
3253                     PL_lex_stuff = Nullsv;
3254                 }
3255                 else {
3256                     if (len == 6 && strnEQ(s, "unique", len)) {
3257                         if (PL_in_my == KEY_our)
3258 #ifdef USE_ITHREADS
3259                             GvUNIQUE_on(cGVOPx_gv(yylval.opval));
3260 #else
3261                             ; /* skip to avoid loading attributes.pm */
3262 #endif
3263                         else
3264                             Perl_croak(aTHX_ "The 'unique' attribute may only be applied to 'our' variables");
3265                     }
3266
3267                     /* NOTE: any CV attrs applied here need to be part of
3268                        the CVf_BUILTIN_ATTRS define in cv.h! */
3269                     else if (!PL_in_my && len == 6 && strnEQ(s, "lvalue", len))
3270                         CvLVALUE_on(PL_compcv);
3271                     else if (!PL_in_my && len == 6 && strnEQ(s, "locked", len))
3272                         CvLOCKED_on(PL_compcv);
3273                     else if (!PL_in_my && len == 6 && strnEQ(s, "method", len))
3274                         CvMETHOD_on(PL_compcv);
3275                     else if (!PL_in_my && len == 9 && strnEQ(s, "assertion", len))
3276                         CvASSERTION_on(PL_compcv);
3277                     /* After we've set the flags, it could be argued that
3278                        we don't need to do the attributes.pm-based setting
3279                        process, and shouldn't bother appending recognized
3280                        flags.  To experiment with that, uncomment the
3281                        following "else".  (Note that's already been
3282                        uncommented.  That keeps the above-applied built-in
3283                        attributes from being intercepted (and possibly
3284                        rejected) by a package's attribute routines, but is
3285                        justified by the performance win for the common case
3286                        of applying only built-in attributes.) */
3287                     else
3288                         attrs = append_elem(OP_LIST, attrs,
3289                                             newSVOP(OP_CONST, 0,
3290                                                     newSVpvn(s, len)));
3291                 }
3292                 s = skipspace(d);
3293                 if (*s == ':' && s[1] != ':')
3294                     s = skipspace(s+1);
3295                 else if (s == d)
3296                     break;      /* require real whitespace or :'s */
3297             }
3298             tmp = (PL_expect == XOPERATOR ? '=' : '{'); /*'}(' for vi */
3299             if (*s != ';' && *s != '}' && *s != tmp && (tmp != '=' || *s != ')')) {
3300                 const char q = ((*s == '\'') ? '"' : '\'');
3301                 /* If here for an expression, and parsed no attrs, back off. */
3302                 if (tmp == '=' && !attrs) {
3303                     s = PL_bufptr;
3304                     break;
3305                 }
3306                 /* MUST advance bufptr here to avoid bogus "at end of line"
3307                    context messages from yyerror().
3308                  */
3309                 PL_bufptr = s;
3310                 if (!*s)
3311                     yyerror("Unterminated attribute list");
3312                 else
3313                     yyerror(Perl_form(aTHX_ "Invalid separator character %c%c%c in attribute list",
3314                                       q, *s, q));
3315                 if (attrs)
3316                     op_free(attrs);
3317                 OPERATOR(':');
3318             }
3319         got_attrs:
3320             if (attrs) {
3321                 PL_nextval[PL_nexttoke].opval = attrs;
3322                 force_next(THING);
3323             }
3324             TOKEN(COLONATTR);
3325         }
3326         OPERATOR(':');
3327     case '(':
3328         s++;
3329         if (PL_last_lop == PL_oldoldbufptr || PL_last_uni == PL_oldoldbufptr)
3330             PL_oldbufptr = PL_oldoldbufptr;             /* allow print(STDOUT 123) */
3331         else
3332             PL_expect = XTERM;
3333         s = skipspace(s);
3334         TOKEN('(');
3335     case ';':
3336         CLINE;
3337         tmp = *s++;
3338         OPERATOR(tmp);
3339     case ')':
3340         tmp = *s++;
3341         s = skipspace(s);
3342         if (*s == '{')
3343             PREBLOCK(tmp);
3344         TERM(tmp);
3345     case ']':
3346         s++;
3347         if (PL_lex_brackets <= 0)
3348             yyerror("Unmatched right square bracket");
3349         else
3350             --PL_lex_brackets;
3351         if (PL_lex_state == LEX_INTERPNORMAL) {
3352             if (PL_lex_brackets == 0) {
3353                 if (*s != '[' && *s != '{' && (*s != '-' || s[1] != '>'))
3354                     PL_lex_state = LEX_INTERPEND;
3355             }
3356         }
3357         TERM(']');
3358     case '{':
3359       leftbracket:
3360         s++;
3361         if (PL_lex_brackets > 100) {
3362             Renew(PL_lex_brackstack, PL_lex_brackets + 10, char);
3363         }
3364         switch (PL_expect) {
3365         case XTERM:
3366             if (PL_lex_formbrack) {
3367                 s--;
3368                 PRETERMBLOCK(DO);
3369             }
3370             if (PL_oldoldbufptr == PL_last_lop)
3371                 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
3372             else
3373                 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
3374             OPERATOR(HASHBRACK);
3375         case XOPERATOR:
3376             while (s < PL_bufend && SPACE_OR_TAB(*s))
3377                 s++;
3378             d = s;
3379             PL_tokenbuf[0] = '\0';
3380             if (d < PL_bufend && *d == '-') {
3381                 PL_tokenbuf[0] = '-';
3382                 d++;
3383                 while (d < PL_bufend && SPACE_OR_TAB(*d))
3384                     d++;
3385             }
3386             if (d < PL_bufend && isIDFIRST_lazy_if(d,UTF)) {
3387                 d = scan_word(d, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
3388                               FALSE, &len);
3389                 while (d < PL_bufend && SPACE_OR_TAB(*d))
3390                     d++;
3391                 if (*d == '}') {
3392                     const char minus = (PL_tokenbuf[0] == '-');
3393                     s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
3394                     if (minus)
3395                         force_next('-');
3396                 }
3397             }
3398             /* FALL THROUGH */
3399         case XATTRBLOCK:
3400         case XBLOCK:
3401             PL_lex_brackstack[PL_lex_brackets++] = XSTATE;
3402             PL_expect = XSTATE;
3403             break;
3404         case XATTRTERM:
3405         case XTERMBLOCK:
3406             PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
3407             PL_expect = XSTATE;
3408             break;
3409         default: {
3410                 const char *t;
3411                 if (PL_oldoldbufptr == PL_last_lop)
3412                     PL_lex_brackstack[PL_lex_brackets++] = XTERM;
3413                 else
3414                     PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
3415                 s = skipspace(s);
3416                 if (*s == '}') {
3417                     if (PL_expect == XREF && PL_lex_state == LEX_INTERPNORMAL) {
3418                         PL_expect = XTERM;
3419                         /* This hack is to get the ${} in the message. */
3420                         PL_bufptr = s+1;
3421                         yyerror("syntax error");
3422                         break;
3423                     }
3424                     OPERATOR(HASHBRACK);
3425                 }
3426                 /* This hack serves to disambiguate a pair of curlies
3427                  * as being a block or an anon hash.  Normally, expectation
3428                  * determines that, but in cases where we're not in a
3429                  * position to expect anything in particular (like inside
3430                  * eval"") we have to resolve the ambiguity.  This code
3431                  * covers the case where the first term in the curlies is a
3432                  * quoted string.  Most other cases need to be explicitly
3433                  * disambiguated by prepending a "+" before the opening
3434                  * curly in order to force resolution as an anon hash.
3435                  *
3436                  * XXX should probably propagate the outer expectation
3437                  * into eval"" to rely less on this hack, but that could
3438                  * potentially break current behavior of eval"".
3439                  * GSAR 97-07-21
3440                  */
3441                 t = s;
3442                 if (*s == '\'' || *s == '"' || *s == '`') {
3443                     /* common case: get past first string, handling escapes */
3444                     for (t++; t < PL_bufend && *t != *s;)
3445                         if (*t++ == '\\' && (*t == '\\' || *t == *s))
3446                             t++;
3447                     t++;
3448                 }
3449                 else if (*s == 'q') {
3450                     if (++t < PL_bufend
3451                         && (!isALNUM(*t)
3452                             || ((*t == 'q' || *t == 'x') && ++t < PL_bufend
3453                                 && !isALNUM(*t))))
3454                     {
3455                         /* skip q//-like construct */
3456                         const char *tmps;
3457                         char open, close, term;
3458                         I32 brackets = 1;
3459
3460                         while (t < PL_bufend && isSPACE(*t))
3461                             t++;
3462                         /* check for q => */
3463                         if (t+1 < PL_bufend && t[0] == '=' && t[1] == '>') {
3464                             OPERATOR(HASHBRACK);
3465                         }
3466                         term = *t;
3467                         open = term;
3468                         if (term && (tmps = strchr("([{< )]}> )]}>",term)))
3469                             term = tmps[5];
3470                         close = term;
3471                         if (open == close)
3472                             for (t++; t < PL_bufend; t++) {
3473                                 if (*t == '\\' && t+1 < PL_bufend && open != '\\')
3474                                     t++;
3475                                 else if (*t == open)
3476                                     break;
3477                             }
3478                         else {
3479                             for (t++; t < PL_bufend; t++) {
3480                                 if (*t == '\\' && t+1 < PL_bufend)
3481                                     t++;
3482                                 else if (*t == close && --brackets <= 0)
3483                                     break;
3484                                 else if (*t == open)
3485                                     brackets++;
3486                             }
3487                         }
3488                         t++;
3489                     }
3490                     else
3491                         /* skip plain q word */
3492                         while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
3493                              t += UTF8SKIP(t);
3494                 }
3495                 else if (isALNUM_lazy_if(t,UTF)) {
3496                     t += UTF8SKIP(t);
3497                     while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
3498                          t += UTF8SKIP(t);
3499                 }
3500                 while (t < PL_bufend && isSPACE(*t))
3501                     t++;
3502                 /* if comma follows first term, call it an anon hash */
3503                 /* XXX it could be a comma expression with loop modifiers */
3504                 if (t < PL_bufend && ((*t == ',' && (*s == 'q' || !isLOWER(*s)))
3505                                    || (*t == '=' && t[1] == '>')))
3506                     OPERATOR(HASHBRACK);
3507                 if (PL_expect == XREF)
3508                     PL_expect = XTERM;
3509                 else {
3510                     PL_lex_brackstack[PL_lex_brackets-1] = XSTATE;
3511                     PL_expect = XSTATE;
3512                 }
3513             }
3514             break;
3515         }
3516         yylval.ival = CopLINE(PL_curcop);
3517         if (isSPACE(*s) || *s == '#')
3518             PL_copline = NOLINE;   /* invalidate current command line number */
3519         TOKEN('{');
3520     case '}':
3521       rightbracket:
3522         s++;
3523         if (PL_lex_brackets <= 0)
3524             yyerror("Unmatched right curly bracket");
3525         else
3526             PL_expect = (expectation)PL_lex_brackstack[--PL_lex_brackets];
3527         if (PL_lex_brackets < PL_lex_formbrack && PL_lex_state != LEX_INTERPNORMAL)
3528             PL_lex_formbrack = 0;
3529         if (PL_lex_state == LEX_INTERPNORMAL) {
3530             if (PL_lex_brackets == 0) {
3531                 if (PL_expect & XFAKEBRACK) {
3532                     PL_expect &= XENUMMASK;
3533                     PL_lex_state = LEX_INTERPEND;
3534                     PL_bufptr = s;
3535                     return yylex();     /* ignore fake brackets */
3536                 }
3537                 if (*s == '-' && s[1] == '>')
3538                     PL_lex_state = LEX_INTERPENDMAYBE;
3539                 else if (*s != '[' && *s != '{')
3540                     PL_lex_state = LEX_INTERPEND;
3541             }
3542         }
3543         if (PL_expect & XFAKEBRACK) {
3544             PL_expect &= XENUMMASK;
3545             PL_bufptr = s;
3546             return yylex();             /* ignore fake brackets */
3547         }
3548         force_next('}');
3549         TOKEN(';');
3550     case '&':
3551         s++;
3552         tmp = *s++;
3553         if (tmp == '&')
3554             AOPERATOR(ANDAND);
3555         s--;
3556         if (PL_expect == XOPERATOR) {
3557             if (PL_bufptr == PL_linestart && ckWARN(WARN_SEMICOLON)
3558                 && isIDFIRST_lazy_if(s,UTF))
3559             {
3560                 CopLINE_dec(PL_curcop);
3561                 Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), PL_warn_nosemi);
3562                 CopLINE_inc(PL_curcop);
3563             }
3564             BAop(OP_BIT_AND);
3565         }
3566
3567         s = scan_ident(s - 1, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
3568         if (*PL_tokenbuf) {
3569             PL_expect = XOPERATOR;
3570             force_ident(PL_tokenbuf, '&');
3571         }
3572         else
3573             PREREF('&');
3574         yylval.ival = (OPpENTERSUB_AMPER<<8);
3575         TERM('&');
3576
3577     case '|':
3578         s++;
3579         tmp = *s++;
3580         if (tmp == '|')
3581             AOPERATOR(OROR);
3582         s--;
3583         BOop(OP_BIT_OR);
3584     case '=':
3585         s++;
3586         tmp = *s++;
3587         if (tmp == '=')
3588             Eop(OP_EQ);
3589         if (tmp == '>')
3590             OPERATOR(',');
3591         if (tmp == '~')
3592             PMop(OP_MATCH);
3593         if (tmp && isSPACE(*s) && ckWARN(WARN_SYNTAX) && strchr("+-*/%.^&|<",tmp))
3594             Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Reversed %c= operator",(int)tmp);
3595         s--;
3596         if (PL_expect == XSTATE && isALPHA(tmp) &&
3597                 (s == PL_linestart+1 || s[-2] == '\n') )
3598         {
3599             if (PL_in_eval && !PL_rsfp) {
3600                 d = PL_bufend;
3601                 while (s < d) {
3602                     if (*s++ == '\n') {
3603                         incline(s);
3604                         if (strnEQ(s,"=cut",4)) {
3605                             s = strchr(s,'\n');
3606                             if (s)
3607                                 s++;
3608                             else
3609                                 s = d;
3610                             incline(s);
3611                             goto retry;
3612                         }
3613                     }
3614                 }
3615                 goto retry;
3616             }
3617             s = PL_bufend;
3618             PL_doextract = TRUE;
3619             goto retry;
3620         }
3621         if (PL_lex_brackets < PL_lex_formbrack) {
3622             const char *t;
3623 #ifdef PERL_STRICT_CR
3624             for (t = s; SPACE_OR_TAB(*t); t++) ;
3625 #else
3626             for (t = s; SPACE_OR_TAB(*t) || *t == '\r'; t++) ;
3627 #endif
3628             if (*t == '\n' || *t == '#') {
3629                 s--;
3630                 PL_expect = XBLOCK;
3631                 goto leftbracket;
3632             }
3633         }
3634         yylval.ival = 0;
3635         OPERATOR(ASSIGNOP);
3636     case '!':
3637         s++;
3638         tmp = *s++;
3639         if (tmp == '=') {
3640             /* was this !=~ where !~ was meant?
3641              * warn on m:!=~\s+([/?]|[msy]\W|tr\W): */
3642
3643             if (*s == '~' && ckWARN(WARN_SYNTAX)) {
3644                 const char *t = s+1;
3645
3646                 while (t < PL_bufend && isSPACE(*t))
3647                     ++t;
3648
3649                 if (*t == '/' || *t == '?' ||
3650                     ((*t == 'm' || *t == 's' || *t == 'y') && !isALNUM(t[1])) ||
3651                     (*t == 't' && t[1] == 'r' && !isALNUM(t[2])))
3652                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
3653                                 "!=~ should be !~");
3654             }
3655             Eop(OP_NE);
3656         }
3657         if (tmp == '~')
3658             PMop(OP_NOT);
3659         s--;
3660         OPERATOR('!');
3661     case '<':
3662         if (PL_expect != XOPERATOR) {
3663             if (s[1] != '<' && !strchr(s,'>'))
3664                 check_uni();
3665             if (s[1] == '<')
3666                 s = scan_heredoc(s);
3667             else
3668                 s = scan_inputsymbol(s);
3669             TERM(sublex_start());
3670         }
3671         s++;
3672         tmp = *s++;
3673         if (tmp == '<')
3674             SHop(OP_LEFT_SHIFT);
3675         if (tmp == '=') {
3676             tmp = *s++;
3677             if (tmp == '>')
3678                 Eop(OP_NCMP);
3679             s--;
3680             Rop(OP_LE);
3681         }
3682         s--;
3683         Rop(OP_LT);
3684     case '>':
3685         s++;
3686         tmp = *s++;
3687         if (tmp == '>')
3688             SHop(OP_RIGHT_SHIFT);
3689         if (tmp == '=')
3690             Rop(OP_GE);
3691         s--;
3692         Rop(OP_GT);
3693
3694     case '$':
3695         CLINE;
3696
3697         if (PL_expect == XOPERATOR) {
3698             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3699                 PL_expect = XTERM;
3700                 depcom();
3701                 return REPORT(','); /* grandfather non-comma-format format */
3702             }
3703         }
3704
3705         if (s[1] == '#' && (isIDFIRST_lazy_if(s+2,UTF) || strchr("{$:+-", s[2]))) {
3706             PL_tokenbuf[0] = '@';
3707             s = scan_ident(s + 1, PL_bufend, PL_tokenbuf + 1,
3708                            sizeof PL_tokenbuf - 1, FALSE);
3709             if (PL_expect == XOPERATOR)
3710                 no_op("Array length", s);
3711             if (!PL_tokenbuf[1])
3712                 PREREF(DOLSHARP);
3713             PL_expect = XOPERATOR;
3714             PL_pending_ident = '#';
3715             TOKEN(DOLSHARP);
3716         }
3717
3718         PL_tokenbuf[0] = '$';
3719         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
3720                        sizeof PL_tokenbuf - 1, FALSE);
3721         if (PL_expect == XOPERATOR)
3722             no_op("Scalar", s);
3723         if (!PL_tokenbuf[1]) {
3724             if (s == PL_bufend)
3725                 yyerror("Final $ should be \\$ or $name");
3726             PREREF('$');
3727         }
3728
3729         /* This kludge not intended to be bulletproof. */
3730         if (PL_tokenbuf[1] == '[' && !PL_tokenbuf[2]) {
3731             yylval.opval = newSVOP(OP_CONST, 0,
3732                                    newSViv(PL_compiling.cop_arybase));
3733             yylval.opval->op_private = OPpCONST_ARYBASE;
3734             TERM(THING);
3735         }
3736
3737         d = s;
3738         tmp = (I32)*s;
3739         if (PL_lex_state == LEX_NORMAL)
3740             s = skipspace(s);
3741
3742         if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
3743             if (*s == '[') {
3744                 PL_tokenbuf[0] = '@';
3745                 if (ckWARN(WARN_SYNTAX)) {
3746                     char *t;
3747                     for(t = s + 1;
3748                         isSPACE(*t) || isALNUM_lazy_if(t,UTF) || *t == '$';
3749                         t++) ;
3750                     if (*t++ == ',') {
3751                         PL_bufptr = skipspace(PL_bufptr);
3752                         while (t < PL_bufend && *t != ']')
3753                             t++;
3754                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
3755                                 "Multidimensional syntax %.*s not supported",
3756                                 (t - PL_bufptr) + 1, PL_bufptr);
3757                     }
3758                 }
3759             }
3760             else if (*s == '{') {
3761                 char *t;
3762                 PL_tokenbuf[0] = '%';
3763                 if (strEQ(PL_tokenbuf+1, "SIG")  && ckWARN(WARN_SYNTAX)
3764                     && (t = strchr(s, '}')) && (t = strchr(t, '=')))
3765                 {
3766                     char tmpbuf[sizeof PL_tokenbuf];
3767                     for (t++; isSPACE(*t); t++) ;
3768                     if (isIDFIRST_lazy_if(t,UTF)) {
3769                         STRLEN len;
3770                         t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE, &len);
3771                         for (; isSPACE(*t); t++) ;
3772                         if (*t == ';' && get_cv(tmpbuf, FALSE))
3773                             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
3774                                 "You need to quote \"%s\"", tmpbuf);
3775                     }
3776                 }
3777             }
3778         }
3779
3780         PL_expect = XOPERATOR;
3781         if (PL_lex_state == LEX_NORMAL && isSPACE((char)tmp)) {
3782             const bool islop = (PL_last_lop == PL_oldoldbufptr);
3783             if (!islop || PL_last_lop_op == OP_GREPSTART)
3784                 PL_expect = XOPERATOR;
3785             else if (strchr("$@\"'`q", *s))
3786                 PL_expect = XTERM;              /* e.g. print $fh "foo" */
3787             else if (strchr("&*<%", *s) && isIDFIRST_lazy_if(s+1,UTF))
3788                 PL_expect = XTERM;              /* e.g. print $fh &sub */
3789             else if (isIDFIRST_lazy_if(s,UTF)) {
3790                 char tmpbuf[sizeof PL_tokenbuf];
3791                 scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
3792                 if ((tmp = keyword(tmpbuf, len))) {
3793                     /* binary operators exclude handle interpretations */
3794                     switch (tmp) {
3795                     case -KEY_x:
3796                     case -KEY_eq:
3797                     case -KEY_ne:
3798                     case -KEY_gt:
3799                     case -KEY_lt:
3800                     case -KEY_ge:
3801                     case -KEY_le:
3802                     case -KEY_cmp:
3803                         break;
3804                     default:
3805                         PL_expect = XTERM;      /* e.g. print $fh length() */
3806                         break;
3807                     }
3808                 }
3809                 else {
3810                     PL_expect = XTERM;          /* e.g. print $fh subr() */
3811                 }
3812             }
3813             else if (isDIGIT(*s))
3814                 PL_expect = XTERM;              /* e.g. print $fh 3 */
3815             else if (*s == '.' && isDIGIT(s[1]))
3816                 PL_expect = XTERM;              /* e.g. print $fh .3 */
3817             else if ((*s == '?' || *s == '-' || *s == '+')
3818                      && !isSPACE(s[1]) && s[1] != '=')
3819                 PL_expect = XTERM;              /* e.g. print $fh -1 */
3820             else if (*s == '/' && !isSPACE(s[1]) && s[1] != '=' && s[1] != '/')
3821                 PL_expect = XTERM;              /* e.g. print $fh /.../
3822                                                  XXX except DORDOR operator */
3823             else if (*s == '<' && s[1] == '<' && !isSPACE(s[2]) && s[2] != '=')
3824                 PL_expect = XTERM;              /* print $fh <<"EOF" */
3825         }
3826         PL_pending_ident = '$';
3827         TOKEN('$');
3828
3829     case '@':
3830         if (PL_expect == XOPERATOR)
3831             no_op("Array", s);
3832         PL_tokenbuf[0] = '@';
3833         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, FALSE);
3834         if (!PL_tokenbuf[1]) {
3835             PREREF('@');
3836         }
3837         if (PL_lex_state == LEX_NORMAL)
3838             s = skipspace(s);
3839         if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
3840             if (*s == '{')
3841                 PL_tokenbuf[0] = '%';
3842
3843             /* Warn about @ where they meant $. */
3844             if (*s == '[' || *s == '{') {
3845                 if (ckWARN(WARN_SYNTAX)) {
3846                     const char *t = s + 1;
3847                     while (*t && (isALNUM_lazy_if(t,UTF) || strchr(" \t$#+-'\"", *t)))
3848                         t++;
3849                     if (*t == '}' || *t == ']') {
3850                         t++;
3851                         PL_bufptr = skipspace(PL_bufptr);
3852                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
3853                             "Scalar value %.*s better written as $%.*s",
3854                             t-PL_bufptr, PL_bufptr, t-PL_bufptr-1, PL_bufptr+1);
3855                     }
3856                 }
3857             }
3858         }
3859         PL_pending_ident = '@';
3860         TERM('@');
3861
3862      case '/':                  /* may be division, defined-or, or pattern */
3863         if (PL_expect == XTERMORDORDOR && s[1] == '/') {
3864             s += 2;
3865             AOPERATOR(DORDOR);
3866         }
3867      case '?':                  /* may either be conditional or pattern */
3868          if(PL_expect == XOPERATOR) {
3869              tmp = *s++;
3870              if(tmp == '?') {
3871                   OPERATOR('?');
3872              }
3873              else {
3874                  tmp = *s++;
3875                  if(tmp == '/') {
3876                      /* A // operator. */
3877                     AOPERATOR(DORDOR);
3878                  }
3879                  else {
3880                      s--;
3881                      Mop(OP_DIVIDE);
3882                  }
3883              }
3884          }
3885          else {
3886              /* Disable warning on "study /blah/" */
3887              if (PL_oldoldbufptr == PL_last_uni
3888               && (*PL_last_uni != 's' || s - PL_last_uni < 5
3889                   || memNE(PL_last_uni, "study", 5)
3890                   || isALNUM_lazy_if(PL_last_uni+5,UTF)
3891               ))
3892                  check_uni();
3893              s = scan_pat(s,OP_MATCH);
3894              TERM(sublex_start());
3895          }
3896
3897     case '.':
3898         if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack
3899 #ifdef PERL_STRICT_CR
3900             && s[1] == '\n'
3901 #else
3902             && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n'))
3903 #endif
3904             && (s == PL_linestart || s[-1] == '\n') )
3905         {
3906             PL_lex_formbrack = 0;
3907             PL_expect = XSTATE;
3908             goto rightbracket;
3909         }
3910         if (PL_expect == XOPERATOR || !isDIGIT(s[1])) {
3911             tmp = *s++;
3912             if (*s == tmp) {
3913                 s++;
3914                 if (*s == tmp) {
3915                     s++;
3916                     yylval.ival = OPf_SPECIAL;
3917                 }
3918                 else
3919                     yylval.ival = 0;
3920                 OPERATOR(DOTDOT);
3921             }
3922             if (PL_expect != XOPERATOR)
3923                 check_uni();
3924             Aop(OP_CONCAT);
3925         }
3926         /* FALL THROUGH */
3927     case '0': case '1': case '2': case '3': case '4':
3928     case '5': case '6': case '7': case '8': case '9':
3929         s = scan_num(s, &yylval);
3930         DEBUG_T( { PerlIO_printf(Perl_debug_log,
3931                     "### Saw number in '%s'\n", s);
3932         } );
3933         if (PL_expect == XOPERATOR)
3934             no_op("Number",s);
3935         TERM(THING);
3936
3937     case '\'':
3938         s = scan_str(s,FALSE,FALSE);
3939         DEBUG_T( { PerlIO_printf(Perl_debug_log,
3940                     "### Saw string before '%s'\n", s);
3941         } );
3942         if (PL_expect == XOPERATOR) {
3943             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3944                 PL_expect = XTERM;
3945                 depcom();
3946                 return REPORT(','); /* grandfather non-comma-format format */
3947             }
3948             else
3949                 no_op("String",s);
3950         }
3951         if (!s)
3952             missingterm((char*)0);
3953         yylval.ival = OP_CONST;
3954         TERM(sublex_start());
3955
3956     case '"':
3957         s = scan_str(s,FALSE,FALSE);
3958         DEBUG_T( { PerlIO_printf(Perl_debug_log,
3959                     "### Saw string before '%s'\n", s);
3960         } );
3961         if (PL_expect == XOPERATOR) {
3962             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3963                 PL_expect = XTERM;
3964                 depcom();
3965                 return REPORT(','); /* grandfather non-comma-format format */
3966             }
3967             else
3968                 no_op("String",s);
3969         }
3970         if (!s)
3971             missingterm((char*)0);
3972         yylval.ival = OP_CONST;
3973         /* FIXME. I think that this can be const if char *d is replaced by
3974            more localised variables.  */
3975         for (d = SvPV(PL_lex_stuff, len); len; len--, d++) {
3976             if (*d == '$' || *d == '@' || *d == '\\' || !UTF8_IS_INVARIANT((U8)*d)) {
3977                 yylval.ival = OP_STRINGIFY;
3978                 break;
3979             }
3980         }
3981         TERM(sublex_start());
3982
3983     case '`':
3984         s = scan_str(s,FALSE,FALSE);
3985         DEBUG_T( { PerlIO_printf(Perl_debug_log,
3986                     "### Saw backtick string before '%s'\n", s);
3987         } );
3988         if (PL_expect == XOPERATOR)
3989             no_op("Backticks",s);
3990         if (!s)
3991             missingterm((char*)0);
3992         yylval.ival = OP_BACKTICK;
3993         set_csh();
3994         TERM(sublex_start());
3995
3996     case '\\':
3997         s++;
3998         if (PL_lex_inwhat && isDIGIT(*s) && ckWARN(WARN_SYNTAX))
3999             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),"Can't use \\%c to mean $%c in expression",
4000                         *s, *s);
4001         if (PL_expect == XOPERATOR)
4002             no_op("Backslash",s);
4003         OPERATOR(REFGEN);
4004
4005     case 'v':
4006         if (isDIGIT(s[1]) && PL_expect != XOPERATOR) {
4007             char *start = s + 2;
4008             while (isDIGIT(*start) || *start == '_')
4009                 start++;
4010             if (*start == '.' && isDIGIT(start[1])) {
4011                 s = scan_num(s, &yylval);
4012                 TERM(THING);
4013             }
4014             /* avoid v123abc() or $h{v1}, allow C<print v10;> */
4015             else if (!isALPHA(*start) && (PL_expect == XTERM
4016                         || PL_expect == XREF || PL_expect == XSTATE
4017                         || PL_expect == XTERMORDORDOR)) {
4018                 const char c = *start;
4019                 GV *gv;
4020                 *start = '\0';
4021                 gv = gv_fetchpv(s, FALSE, SVt_PVCV);
4022                 *start = c;
4023                 if (!gv) {
4024                     s = scan_num(s, &yylval);
4025                     TERM(THING);
4026                 }
4027             }
4028         }
4029         goto keylookup;
4030     case 'x':
4031         if (isDIGIT(s[1]) && PL_expect == XOPERATOR) {
4032             s++;
4033             Mop(OP_REPEAT);
4034         }
4035         goto keylookup;
4036
4037     case '_':
4038     case 'a': case 'A':
4039     case 'b': case 'B':
4040     case 'c': case 'C':
4041     case 'd': case 'D':
4042     case 'e': case 'E':
4043     case 'f': case 'F':
4044     case 'g': case 'G':
4045     case 'h': case 'H':
4046     case 'i': case 'I':
4047     case 'j': case 'J':
4048     case 'k': case 'K':
4049     case 'l': case 'L':
4050     case 'm': case 'M':
4051     case 'n': case 'N':
4052     case 'o': case 'O':
4053     case 'p': case 'P':
4054     case 'q': case 'Q':
4055     case 'r': case 'R':
4056     case 's': case 'S':
4057     case 't': case 'T':
4058     case 'u': case 'U':
4059               case 'V':
4060     case 'w': case 'W':
4061               case 'X':
4062     case 'y': case 'Y':
4063     case 'z': case 'Z':
4064
4065       keylookup: {
4066         orig_keyword = 0;
4067         gv = Nullgv;
4068         gvp = 0;
4069
4070         PL_bufptr = s;
4071         s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
4072
4073         /* Some keywords can be followed by any delimiter, including ':' */
4074         tmp = ((len == 1 && strchr("msyq", PL_tokenbuf[0])) ||
4075                (len == 2 && ((PL_tokenbuf[0] == 't' && PL_tokenbuf[1] == 'r') ||
4076                              (PL_tokenbuf[0] == 'q' &&
4077                               strchr("qwxr", PL_tokenbuf[1])))));
4078
4079         /* x::* is just a word, unless x is "CORE" */
4080         if (!tmp && *s == ':' && s[1] == ':' && strNE(PL_tokenbuf, "CORE"))
4081             goto just_a_word;
4082
4083         d = s;
4084         while (d < PL_bufend && isSPACE(*d))
4085                 d++;    /* no comments skipped here, or s### is misparsed */
4086
4087         /* Is this a label? */
4088         if (!tmp && PL_expect == XSTATE
4089               && d < PL_bufend && *d == ':' && *(d + 1) != ':') {
4090             s = d + 1;
4091             yylval.pval = savepv(PL_tokenbuf);
4092             CLINE;
4093             TOKEN(LABEL);
4094         }
4095
4096         /* Check for keywords */
4097         tmp = keyword(PL_tokenbuf, len);
4098
4099         /* Is this a word before a => operator? */
4100         if (*d == '=' && d[1] == '>') {
4101             CLINE;
4102             yylval.opval
4103                 = (OP*)newSVOP(OP_CONST, 0,
4104                                S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
4105             yylval.opval->op_private = OPpCONST_BARE;
4106             TERM(WORD);
4107         }
4108
4109         if (tmp < 0) {                  /* second-class keyword? */
4110             GV *ogv = Nullgv;   /* override (winner) */
4111             GV *hgv = Nullgv;   /* hidden (loser) */
4112             if (PL_expect != XOPERATOR && (*s != ':' || s[1] != ':')) {
4113                 CV *cv;
4114                 if ((gv = gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVCV)) &&
4115                     (cv = GvCVu(gv)))
4116                 {
4117                     if (GvIMPORTED_CV(gv))
4118                         ogv = gv;
4119                     else if (! CvMETHOD(cv))
4120                         hgv = gv;
4121                 }
4122                 if (!ogv &&
4123                     (gvp = (GV**)hv_fetch(PL_globalstash,PL_tokenbuf,len,FALSE)) &&
4124                     (gv = *gvp) != (GV*)&PL_sv_undef &&
4125                     GvCVu(gv) && GvIMPORTED_CV(gv))
4126                 {
4127                     ogv = gv;
4128                 }
4129             }
4130             if (ogv) {
4131                 orig_keyword = tmp;
4132                 tmp = 0;                /* overridden by import or by GLOBAL */
4133             }
4134             else if (gv && !gvp
4135                      && -tmp==KEY_lock  /* XXX generalizable kludge */
4136                      && GvCVu(gv)
4137                      && !hv_fetch(GvHVn(PL_incgv), "Thread.pm", 9, FALSE))
4138             {
4139                 tmp = 0;                /* any sub overrides "weak" keyword */
4140             }
4141             else if (gv && !gvp
4142                     && tmp == -KEY_err
4143                     && GvCVu(gv)
4144                     && PL_expect != XOPERATOR
4145                     && PL_expect != XTERMORDORDOR)
4146             {
4147                 /* any sub overrides the "err" keyword, except when really an
4148                  * operator is expected */
4149                 tmp = 0;
4150             }
4151             else {                      /* no override */
4152                 tmp = -tmp;
4153                 if (tmp == KEY_dump && ckWARN(WARN_MISC)) {
4154                     Perl_warner(aTHX_ packWARN(WARN_MISC),
4155                             "dump() better written as CORE::dump()");
4156                 }
4157                 gv = Nullgv;
4158                 gvp = 0;
4159                 if (hgv && tmp != KEY_x && tmp != KEY_CORE
4160                         && ckWARN(WARN_AMBIGUOUS))      /* never ambiguous */
4161                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
4162                         "Ambiguous call resolved as CORE::%s(), %s",
4163                          GvENAME(hgv), "qualify as such or use &");
4164             }
4165         }
4166
4167       reserved_word:
4168         switch (tmp) {
4169
4170         default:                        /* not a keyword */
4171           just_a_word: {
4172                 SV *sv;
4173                 int pkgname = 0;
4174                 const char lastchar = (PL_bufptr == PL_oldoldbufptr ? 0 : PL_bufptr[-1]);
4175
4176                 /* Get the rest if it looks like a package qualifier */
4177
4178                 if (*s == '\'' || (*s == ':' && s[1] == ':')) {
4179                     STRLEN morelen;
4180                     s = scan_word(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len,
4181                                   TRUE, &morelen);
4182                     if (!morelen)
4183                         Perl_croak(aTHX_ "Bad name after %s%s", PL_tokenbuf,
4184                                 *s == '\'' ? "'" : "::");
4185                     len += morelen;
4186                     pkgname = 1;
4187                 }
4188
4189                 if (PL_expect == XOPERATOR) {
4190                     if (PL_bufptr == PL_linestart) {
4191                         CopLINE_dec(PL_curcop);
4192                         Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), PL_warn_nosemi);
4193                         CopLINE_inc(PL_curcop);
4194                     }
4195                     else
4196                         no_op("Bareword",s);
4197                 }
4198
4199                 /* Look for a subroutine with this name in current package,
4200                    unless name is "Foo::", in which case Foo is a bearword
4201                    (and a package name). */
4202
4203                 if (len > 2 &&
4204                     PL_tokenbuf[len - 2] == ':' && PL_tokenbuf[len - 1] == ':')
4205                 {
4206                     if (ckWARN(WARN_BAREWORD) && ! gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVHV))
4207                         Perl_warner(aTHX_ packWARN(WARN_BAREWORD),
4208                             "Bareword \"%s\" refers to nonexistent package",
4209                              PL_tokenbuf);
4210                     len -= 2;
4211                     PL_tokenbuf[len] = '\0';
4212                     gv = Nullgv;
4213                     gvp = 0;
4214                 }
4215                 else {
4216                     len = 0;
4217                     if (!gv)
4218                         gv = gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVCV);
4219                 }
4220
4221                 /* if we saw a global override before, get the right name */
4222
4223                 if (gvp) {
4224                     sv = newSVpvn("CORE::GLOBAL::",14);
4225                     sv_catpv(sv,PL_tokenbuf);
4226                 }
4227                 else {
4228                     /* If len is 0, newSVpv does strlen(), which is correct.
4229                        If len is non-zero, then it will be the true length,
4230                        and so the scalar will be created correctly.  */
4231                     sv = newSVpv(PL_tokenbuf,len);
4232                 }
4233
4234                 /* Presume this is going to be a bareword of some sort. */
4235
4236                 CLINE;
4237                 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
4238                 yylval.opval->op_private = OPpCONST_BARE;
4239                 /* UTF-8 package name? */
4240                 if (UTF && !IN_BYTES &&
4241                     is_utf8_string((U8*)SvPVX_const(sv), SvCUR(sv)))
4242                     SvUTF8_on(sv);
4243
4244                 /* And if "Foo::", then that's what it certainly is. */
4245
4246                 if (len)
4247                     goto safe_bareword;
4248
4249                 /* See if it's the indirect object for a list operator. */
4250
4251                 if (PL_oldoldbufptr &&
4252                     PL_oldoldbufptr < PL_bufptr &&
4253                     (PL_oldoldbufptr == PL_last_lop
4254                      || PL_oldoldbufptr == PL_last_uni) &&
4255                     /* NO SKIPSPACE BEFORE HERE! */
4256                     (PL_expect == XREF ||
4257                      ((PL_opargs[PL_last_lop_op] >> OASHIFT)& 7) == OA_FILEREF))
4258                 {
4259                     bool immediate_paren = *s == '(';
4260
4261                     /* (Now we can afford to cross potential line boundary.) */
4262                     s = skipspace(s);
4263
4264                     /* Two barewords in a row may indicate method call. */
4265
4266                     if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') && (tmp=intuit_method(s,gv)))
4267                         return REPORT(tmp);
4268
4269                     /* If not a declared subroutine, it's an indirect object. */
4270                     /* (But it's an indir obj regardless for sort.) */
4271
4272                     if ( !immediate_paren && (PL_last_lop_op == OP_SORT ||
4273                          ((!gv || !GvCVu(gv)) &&
4274                         (PL_last_lop_op != OP_MAPSTART &&
4275                          PL_last_lop_op != OP_GREPSTART))))
4276                     {
4277                         PL_expect = (PL_last_lop == PL_oldoldbufptr) ? XTERM : XOPERATOR;
4278                         goto bareword;
4279                     }
4280                 }
4281
4282                 PL_expect = XOPERATOR;
4283                 s = skipspace(s);
4284
4285                 /* Is this a word before a => operator? */
4286                 if (*s == '=' && s[1] == '>' && !pkgname) {
4287                     CLINE;
4288                     sv_setpv(((SVOP*)yylval.opval)->op_sv, PL_tokenbuf);
4289                     if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
4290                       SvUTF8_on(((SVOP*)yylval.opval)->op_sv);
4291                     TERM(WORD);
4292                 }
4293
4294                 /* If followed by a paren, it's certainly a subroutine. */
4295                 if (*s == '(') {
4296                     CLINE;
4297                     if (gv && GvCVu(gv)) {
4298                         for (d = s + 1; SPACE_OR_TAB(*d); d++) ;
4299                         if (*d == ')' && (sv = cv_const_sv(GvCV(gv)))) {
4300                             s = d + 1;
4301                             goto its_constant;
4302                         }
4303                     }
4304                     PL_nextval[PL_nexttoke].opval = yylval.opval;
4305                     PL_expect = XOPERATOR;
4306                     force_next(WORD);
4307                     yylval.ival = 0;
4308                     TOKEN('&');
4309                 }
4310
4311                 /* If followed by var or block, call it a method (unless sub) */
4312
4313                 if ((*s == '$' || *s == '{') && (!gv || !GvCVu(gv))) {
4314                     PL_last_lop = PL_oldbufptr;
4315                     PL_last_lop_op = OP_METHOD;
4316                     PREBLOCK(METHOD);
4317                 }
4318
4319                 /* If followed by a bareword, see if it looks like indir obj. */
4320
4321                 if (!orig_keyword
4322                         && (isIDFIRST_lazy_if(s,UTF) || *s == '$')
4323                         && (tmp = intuit_method(s,gv)))
4324                     return REPORT(tmp);
4325
4326                 /* Not a method, so call it a subroutine (if defined) */
4327
4328                 if (gv && GvCVu(gv)) {
4329                     CV* cv;
4330                     if (lastchar == '-' && ckWARN_d(WARN_AMBIGUOUS))
4331                         Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
4332                                 "Ambiguous use of -%s resolved as -&%s()",
4333                                 PL_tokenbuf, PL_tokenbuf);
4334                     /* Check for a constant sub */
4335                     cv = GvCV(gv);
4336                     if ((sv = cv_const_sv(cv))) {
4337                   its_constant:
4338                         SvREFCNT_dec(((SVOP*)yylval.opval)->op_sv);
4339                         ((SVOP*)yylval.opval)->op_sv = SvREFCNT_inc(sv);
4340                         yylval.opval->op_private = 0;
4341                         TOKEN(WORD);
4342                     }
4343
4344                     /* Resolve to GV now. */
4345                     op_free(yylval.opval);
4346                     yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
4347                     yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
4348                     PL_last_lop = PL_oldbufptr;
4349                     PL_last_lop_op = OP_ENTERSUB;
4350                     /* Is there a prototype? */
4351                     if (SvPOK(cv)) {
4352                         STRLEN len;
4353                         const char *proto = SvPV_const((SV*)cv, len);
4354                         if (!len)
4355                             TERM(FUNC0SUB);
4356                         if (*proto == '$' && proto[1] == '\0')
4357                             OPERATOR(UNIOPSUB);
4358                         while (*proto == ';')
4359                             proto++;
4360                         if (*proto == '&' && *s == '{') {
4361                             sv_setpv(PL_subname, PL_curstash ?
4362                                         "__ANON__" : "__ANON__::__ANON__");
4363                             PREBLOCK(LSTOPSUB);
4364                         }
4365                     }
4366                     PL_nextval[PL_nexttoke].opval = yylval.opval;
4367                     PL_expect = XTERM;
4368                     force_next(WORD);
4369                     TOKEN(NOAMP);
4370                 }
4371
4372                 /* Call it a bare word */
4373
4374                 if (PL_hints & HINT_STRICT_SUBS)
4375                     yylval.opval->op_private |= OPpCONST_STRICT;
4376                 else {
4377                 bareword:
4378                     if (lastchar != '-') {
4379                         if (ckWARN(WARN_RESERVED)) {
4380                             for (d = PL_tokenbuf; *d && isLOWER(*d); d++) ;
4381                             if (!*d && !gv_stashpv(PL_tokenbuf,FALSE))
4382                                 Perl_warner(aTHX_ packWARN(WARN_RESERVED), PL_warn_reserved,
4383                                        PL_tokenbuf);
4384                         }
4385                     }
4386                 }
4387
4388             safe_bareword:
4389                 if ((lastchar == '*' || lastchar == '%' || lastchar == '&')
4390                     && ckWARN_d(WARN_AMBIGUOUS)) {
4391                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
4392                         "Operator or semicolon missing before %c%s",
4393                         lastchar, PL_tokenbuf);
4394                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
4395                         "Ambiguous use of %c resolved as operator %c",
4396                         lastchar, lastchar);
4397                 }
4398                 TOKEN(WORD);
4399             }
4400
4401         case KEY___FILE__:
4402             yylval.opval = (OP*)newSVOP(OP_CONST, 0,
4403                                         newSVpv(CopFILE(PL_curcop),0));
4404             TERM(THING);
4405
4406         case KEY___LINE__:
4407             yylval.opval = (OP*)newSVOP(OP_CONST, 0,
4408                                     Perl_newSVpvf(aTHX_ "%"IVdf, (IV)CopLINE(PL_curcop)));
4409             TERM(THING);
4410
4411         case KEY___PACKAGE__:
4412             yylval.opval = (OP*)newSVOP(OP_CONST, 0,
4413                                         (PL_curstash
4414                                          ? newSVhek(HvNAME_HEK(PL_curstash))
4415                                          : &PL_sv_undef));
4416             TERM(THING);
4417
4418         case KEY___DATA__:
4419         case KEY___END__: {
4420             GV *gv;
4421             if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
4422                 const char *pname = "main";
4423                 if (PL_tokenbuf[2] == 'D')
4424                     pname = HvNAME_get(PL_curstash ? PL_curstash : PL_defstash);
4425                 gv = gv_fetchpv(Perl_form(aTHX_ "%s::DATA", pname), TRUE, SVt_PVIO);
4426                 GvMULTI_on(gv);
4427                 if (!GvIO(gv))
4428                     GvIOp(gv) = newIO();
4429                 IoIFP(GvIOp(gv)) = PL_rsfp;
4430 #if defined(HAS_FCNTL) && defined(F_SETFD)
4431                 {
4432                     const int fd = PerlIO_fileno(PL_rsfp);
4433                     fcntl(fd,F_SETFD,fd >= 3);
4434                 }
4435 #endif
4436                 /* Mark this internal pseudo-handle as clean */
4437                 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
4438                 if (PL_preprocess)
4439                     IoTYPE(GvIOp(gv)) = IoTYPE_PIPE;
4440                 else if ((PerlIO*)PL_rsfp == PerlIO_stdin())
4441                     IoTYPE(GvIOp(gv)) = IoTYPE_STD;
4442                 else
4443                     IoTYPE(GvIOp(gv)) = IoTYPE_RDONLY;
4444 #if defined(WIN32) && !defined(PERL_TEXTMODE_SCRIPTS)
4445                 /* if the script was opened in binmode, we need to revert
4446                  * it to text mode for compatibility; but only iff it has CRs
4447                  * XXX this is a questionable hack at best. */
4448                 if (PL_bufend-PL_bufptr > 2
4449                     && PL_bufend[-1] == '\n' && PL_bufend[-2] == '\r')
4450                 {
4451                     Off_t loc = 0;
4452                     if (IoTYPE(GvIOp(gv)) == IoTYPE_RDONLY) {
4453                         loc = PerlIO_tell(PL_rsfp);
4454                         (void)PerlIO_seek(PL_rsfp, 0L, 0);
4455                     }
4456 #ifdef NETWARE
4457                         if (PerlLIO_setmode(PL_rsfp, O_TEXT) != -1) {
4458 #else
4459                     if (PerlLIO_setmode(PerlIO_fileno(PL_rsfp), O_TEXT) != -1) {
4460 #endif  /* NETWARE */
4461 #ifdef PERLIO_IS_STDIO /* really? */
4462 #  if defined(__BORLANDC__)
4463                         /* XXX see note in do_binmode() */
4464                         ((FILE*)PL_rsfp)->flags &= ~_F_BIN;
4465 #  endif
4466 #endif
4467                         if (loc > 0)
4468                             PerlIO_seek(PL_rsfp, loc, 0);
4469                     }
4470                 }
4471 #endif
4472 #ifdef PERLIO_LAYERS
4473                 if (!IN_BYTES) {
4474                     if (UTF)
4475                         PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, ":utf8");
4476                     else if (PL_encoding) {
4477                         SV *name;
4478                         dSP;
4479                         ENTER;
4480                         SAVETMPS;
4481                         PUSHMARK(sp);
4482                         EXTEND(SP, 1);
4483                         XPUSHs(PL_encoding);
4484                         PUTBACK;
4485                         call_method("name", G_SCALAR);
4486                         SPAGAIN;
4487                         name = POPs;
4488                         PUTBACK;
4489                         PerlIO_apply_layers(aTHX_ PL_rsfp, NULL,
4490                                             Perl_form(aTHX_ ":encoding(%"SVf")",
4491                                                       name));
4492                         FREETMPS;
4493                         LEAVE;
4494                     }
4495                 }
4496 #endif
4497                 PL_rsfp = Nullfp;
4498             }
4499             goto fake_eof;
4500         }
4501
4502         case KEY_AUTOLOAD:
4503         case KEY_DESTROY:
4504         case KEY_BEGIN:
4505         case KEY_CHECK:
4506         case KEY_INIT:
4507         case KEY_END:
4508             if (PL_expect == XSTATE) {
4509                 s = PL_bufptr;
4510                 goto really_sub;
4511             }
4512             goto just_a_word;
4513
4514         case KEY_CORE:
4515             if (*s == ':' && s[1] == ':') {
4516                 s += 2;
4517                 d = s;
4518                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
4519                 if (!(tmp = keyword(PL_tokenbuf, len)))
4520                     Perl_croak(aTHX_ "CORE::%s is not a keyword", PL_tokenbuf);
4521                 if (tmp < 0)
4522                     tmp = -tmp;
4523                 goto reserved_word;
4524             }
4525             goto just_a_word;
4526
4527         case KEY_abs:
4528             UNI(OP_ABS);
4529
4530         case KEY_alarm:
4531             UNI(OP_ALARM);
4532
4533         case KEY_accept:
4534             LOP(OP_ACCEPT,XTERM);
4535
4536         case KEY_and:
4537             OPERATOR(ANDOP);
4538
4539         case KEY_atan2:
4540             LOP(OP_ATAN2,XTERM);
4541
4542         case KEY_bind:
4543             LOP(OP_BIND,XTERM);
4544
4545         case KEY_binmode:
4546             LOP(OP_BINMODE,XTERM);
4547
4548         case KEY_bless:
4549             LOP(OP_BLESS,XTERM);
4550
4551         case KEY_chop:
4552             UNI(OP_CHOP);
4553
4554         case KEY_continue:
4555             PREBLOCK(CONTINUE);
4556
4557         case KEY_chdir:
4558             (void)gv_fetchpv("ENV",TRUE, SVt_PVHV);     /* may use HOME */
4559             UNI(OP_CHDIR);
4560
4561         case KEY_close:
4562             UNI(OP_CLOSE);
4563
4564         case KEY_closedir:
4565             UNI(OP_CLOSEDIR);
4566
4567         case KEY_cmp:
4568             Eop(OP_SCMP);
4569
4570         case KEY_caller:
4571             UNI(OP_CALLER);
4572
4573         case KEY_crypt:
4574 #ifdef FCRYPT
4575             if (!PL_cryptseen) {
4576                 PL_cryptseen = TRUE;
4577                 init_des();
4578             }
4579 #endif
4580             LOP(OP_CRYPT,XTERM);
4581
4582         case KEY_chmod:
4583             LOP(OP_CHMOD,XTERM);
4584
4585         case KEY_chown:
4586             LOP(OP_CHOWN,XTERM);
4587
4588         case KEY_connect:
4589             LOP(OP_CONNECT,XTERM);
4590
4591         case KEY_chr:
4592             UNI(OP_CHR);
4593
4594         case KEY_cos:
4595             UNI(OP_COS);
4596
4597         case KEY_chroot:
4598             UNI(OP_CHROOT);
4599
4600         case KEY_do:
4601             s = skipspace(s);
4602             if (*s == '{')
4603                 PRETERMBLOCK(DO);
4604             if (*s != '\'')
4605                 s = force_word(s,WORD,TRUE,TRUE,FALSE);
4606             OPERATOR(DO);
4607
4608         case KEY_die:
4609             PL_hints |= HINT_BLOCK_SCOPE;
4610             LOP(OP_DIE,XTERM);
4611
4612         case KEY_defined:
4613             UNI(OP_DEFINED);
4614
4615         case KEY_delete:
4616             UNI(OP_DELETE);
4617
4618         case KEY_dbmopen:
4619             gv_fetchpv("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
4620             LOP(OP_DBMOPEN,XTERM);
4621
4622         case KEY_dbmclose:
4623             UNI(OP_DBMCLOSE);
4624
4625         case KEY_dump:
4626             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4627             LOOPX(OP_DUMP);
4628
4629         case KEY_else:
4630             PREBLOCK(ELSE);
4631
4632         case KEY_elsif:
4633             yylval.ival = CopLINE(PL_curcop);
4634             OPERATOR(ELSIF);
4635
4636         case KEY_eq:
4637             Eop(OP_SEQ);
4638
4639         case KEY_exists:
4640             UNI(OP_EXISTS);
4641         
4642         case KEY_exit:
4643             UNI(OP_EXIT);
4644
4645         case KEY_eval:
4646             s = skipspace(s);
4647             PL_expect = (*s == '{') ? XTERMBLOCK : XTERM;
4648             UNIBRACK(OP_ENTEREVAL);
4649
4650         case KEY_eof:
4651             UNI(OP_EOF);
4652
4653         case KEY_err:
4654             OPERATOR(DOROP);
4655
4656         case KEY_exp:
4657             UNI(OP_EXP);
4658
4659         case KEY_each:
4660             UNI(OP_EACH);
4661
4662         case KEY_exec:
4663             set_csh();
4664             LOP(OP_EXEC,XREF);
4665
4666         case KEY_endhostent:
4667             FUN0(OP_EHOSTENT);
4668
4669         case KEY_endnetent:
4670             FUN0(OP_ENETENT);
4671
4672         case KEY_endservent:
4673             FUN0(OP_ESERVENT);
4674
4675         case KEY_endprotoent:
4676             FUN0(OP_EPROTOENT);
4677
4678         case KEY_endpwent:
4679             FUN0(OP_EPWENT);
4680
4681         case KEY_endgrent:
4682             FUN0(OP_EGRENT);
4683
4684         case KEY_for:
4685         case KEY_foreach:
4686             yylval.ival = CopLINE(PL_curcop);
4687             s = skipspace(s);
4688             if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) {
4689                 char *p = s;
4690                 if ((PL_bufend - p) >= 3 &&
4691                     strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
4692                     p += 2;
4693                 else if ((PL_bufend - p) >= 4 &&
4694                     strnEQ(p, "our", 3) && isSPACE(*(p + 3)))
4695                     p += 3;
4696                 p = skipspace(p);
4697                 if (isIDFIRST_lazy_if(p,UTF)) {
4698                     p = scan_ident(p, PL_bufend,
4699                         PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
4700                     p = skipspace(p);
4701                 }
4702                 if (*p != '$')
4703                     Perl_croak(aTHX_ "Missing $ on loop variable");
4704             }
4705             OPERATOR(FOR);
4706
4707         case KEY_formline:
4708             LOP(OP_FORMLINE,XTERM);
4709
4710         case KEY_fork:
4711             FUN0(OP_FORK);
4712
4713         case KEY_fcntl:
4714             LOP(OP_FCNTL,XTERM);
4715
4716         case KEY_fileno:
4717             UNI(OP_FILENO);
4718
4719         case KEY_flock:
4720             LOP(OP_FLOCK,XTERM);
4721
4722         case KEY_gt:
4723             Rop(OP_SGT);
4724
4725         case KEY_ge:
4726             Rop(OP_SGE);
4727
4728         case KEY_grep:
4729             LOP(OP_GREPSTART, XREF);
4730
4731         case KEY_goto:
4732             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4733             LOOPX(OP_GOTO);
4734
4735         case KEY_gmtime:
4736             UNI(OP_GMTIME);
4737
4738         case KEY_getc:
4739             UNIDOR(OP_GETC);
4740
4741         case KEY_getppid:
4742             FUN0(OP_GETPPID);
4743
4744         case KEY_getpgrp:
4745             UNI(OP_GETPGRP);
4746
4747         case KEY_getpriority:
4748             LOP(OP_GETPRIORITY,XTERM);
4749
4750         case KEY_getprotobyname:
4751             UNI(OP_GPBYNAME);
4752
4753         case KEY_getprotobynumber:
4754             LOP(OP_GPBYNUMBER,XTERM);
4755
4756         case KEY_getprotoent:
4757             FUN0(OP_GPROTOENT);
4758
4759         case KEY_getpwent:
4760             FUN0(OP_GPWENT);
4761
4762         case KEY_getpwnam:
4763             UNI(OP_GPWNAM);
4764
4765         case KEY_getpwuid:
4766             UNI(OP_GPWUID);
4767
4768         case KEY_getpeername:
4769             UNI(OP_GETPEERNAME);
4770
4771         case KEY_gethostbyname:
4772             UNI(OP_GHBYNAME);
4773
4774         case KEY_gethostbyaddr:
4775             LOP(OP_GHBYADDR,XTERM);
4776
4777         case KEY_gethostent:
4778             FUN0(OP_GHOSTENT);
4779
4780         case KEY_getnetbyname:
4781             UNI(OP_GNBYNAME);
4782
4783         case KEY_getnetbyaddr:
4784             LOP(OP_GNBYADDR,XTERM);
4785
4786         case KEY_getnetent:
4787             FUN0(OP_GNETENT);
4788
4789         case KEY_getservbyname:
4790             LOP(OP_GSBYNAME,XTERM);
4791
4792         case KEY_getservbyport:
4793             LOP(OP_GSBYPORT,XTERM);
4794
4795         case KEY_getservent:
4796             FUN0(OP_GSERVENT);
4797
4798         case KEY_getsockname:
4799             UNI(OP_GETSOCKNAME);
4800
4801         case KEY_getsockopt:
4802             LOP(OP_GSOCKOPT,XTERM);
4803
4804         case KEY_getgrent:
4805             FUN0(OP_GGRENT);
4806
4807         case KEY_getgrnam:
4808             UNI(OP_GGRNAM);
4809
4810         case KEY_getgrgid:
4811             UNI(OP_GGRGID);
4812
4813         case KEY_getlogin:
4814             FUN0(OP_GETLOGIN);
4815
4816         case KEY_glob:
4817             set_csh();
4818             LOP(OP_GLOB,XTERM);
4819
4820         case KEY_hex:
4821             UNI(OP_HEX);
4822
4823         case KEY_if:
4824             yylval.ival = CopLINE(PL_curcop);
4825             OPERATOR(IF);
4826
4827         case KEY_index:
4828             LOP(OP_INDEX,XTERM);
4829
4830         case KEY_int:
4831             UNI(OP_INT);
4832
4833         case KEY_ioctl:
4834             LOP(OP_IOCTL,XTERM);
4835
4836         case KEY_join:
4837             LOP(OP_JOIN,XTERM);
4838
4839         case KEY_keys:
4840             UNI(OP_KEYS);
4841
4842         case KEY_kill:
4843             LOP(OP_KILL,XTERM);
4844
4845         case KEY_last:
4846             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4847             LOOPX(OP_LAST);
4848         
4849         case KEY_lc:
4850             UNI(OP_LC);
4851
4852         case KEY_lcfirst:
4853             UNI(OP_LCFIRST);
4854
4855         case KEY_local:
4856             yylval.ival = 0;
4857             OPERATOR(LOCAL);
4858
4859         case KEY_length:
4860             UNI(OP_LENGTH);
4861
4862         case KEY_lt:
4863             Rop(OP_SLT);
4864
4865         case KEY_le:
4866             Rop(OP_SLE);
4867
4868         case KEY_localtime:
4869             UNI(OP_LOCALTIME);
4870
4871         case KEY_log:
4872             UNI(OP_LOG);
4873
4874         case KEY_link:
4875             LOP(OP_LINK,XTERM);
4876
4877         case KEY_listen:
4878             LOP(OP_LISTEN,XTERM);
4879
4880         case KEY_lock:
4881             UNI(OP_LOCK);
4882
4883         case KEY_lstat:
4884             UNI(OP_LSTAT);
4885
4886         case KEY_m:
4887             s = scan_pat(s,OP_MATCH);
4888             TERM(sublex_start());
4889
4890         case KEY_map:
4891             LOP(OP_MAPSTART, XREF);
4892
4893         case KEY_mkdir:
4894             LOP(OP_MKDIR,XTERM);
4895
4896         case KEY_msgctl:
4897             LOP(OP_MSGCTL,XTERM);
4898
4899         case KEY_msgget:
4900             LOP(OP_MSGGET,XTERM);
4901
4902         case KEY_msgrcv:
4903             LOP(OP_MSGRCV,XTERM);
4904
4905         case KEY_msgsnd:
4906             LOP(OP_MSGSND,XTERM);
4907
4908         case KEY_our:
4909         case KEY_my:
4910             PL_in_my = tmp;
4911             s = skipspace(s);
4912             if (isIDFIRST_lazy_if(s,UTF)) {
4913                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
4914                 if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
4915                     goto really_sub;
4916                 PL_in_my_stash = find_in_my_stash(PL_tokenbuf, len);
4917                 if (!PL_in_my_stash) {
4918                     char tmpbuf[1024];
4919                     PL_bufptr = s;
4920                     sprintf(tmpbuf, "No such class %.1000s", PL_tokenbuf);
4921                     yyerror(tmpbuf);
4922                 }
4923             }
4924             yylval.ival = 1;
4925             OPERATOR(MY);
4926
4927         case KEY_next:
4928             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4929             LOOPX(OP_NEXT);
4930
4931         case KEY_ne:
4932             Eop(OP_SNE);
4933
4934         case KEY_no:
4935             s = tokenize_use(0, s);
4936             OPERATOR(USE);
4937
4938         case KEY_not:
4939             if (*s == '(' || (s = skipspace(s), *s == '('))
4940                 FUN1(OP_NOT);
4941             else
4942                 OPERATOR(NOTOP);
4943
4944         case KEY_open:
4945             s = skipspace(s);
4946             if (isIDFIRST_lazy_if(s,UTF)) {
4947                 const char *t;
4948                 for (d = s; isALNUM_lazy_if(d,UTF); d++) ;
4949                 for (t=d; *t && isSPACE(*t); t++) ;
4950                 if ( *t && strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
4951                     /* [perl #16184] */
4952                     && !(t[0] == '=' && t[1] == '>')
4953                 ) {
4954                     Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE),
4955                            "Precedence problem: open %.*s should be open(%.*s)",
4956                             d - s, s, d - s, s);
4957                 }
4958             }
4959             LOP(OP_OPEN,XTERM);
4960
4961         case KEY_or:
4962             yylval.ival = OP_OR;
4963             OPERATOR(OROP);
4964
4965         case KEY_ord:
4966             UNI(OP_ORD);
4967
4968         case KEY_oct:
4969             UNI(OP_OCT);
4970
4971         case KEY_opendir:
4972             LOP(OP_OPEN_DIR,XTERM);
4973
4974         case KEY_print:
4975             checkcomma(s,PL_tokenbuf,"filehandle");
4976             LOP(OP_PRINT,XREF);
4977
4978         case KEY_printf:
4979             checkcomma(s,PL_tokenbuf,"filehandle");
4980             LOP(OP_PRTF,XREF);
4981
4982         case KEY_prototype:
4983             UNI(OP_PROTOTYPE);
4984
4985         case KEY_push:
4986             LOP(OP_PUSH,XTERM);
4987
4988         case KEY_pop:
4989             UNIDOR(OP_POP);
4990
4991         case KEY_pos:
4992             UNIDOR(OP_POS);
4993         
4994         case KEY_pack:
4995             LOP(OP_PACK,XTERM);
4996
4997         case KEY_package:
4998             s = force_word(s,WORD,FALSE,TRUE,FALSE);
4999             OPERATOR(PACKAGE);
5000
5001         case KEY_pipe:
5002             LOP(OP_PIPE_OP,XTERM);
5003
5004         case KEY_q:
5005             s = scan_str(s,FALSE,FALSE);
5006             if (!s)
5007                 missingterm((char*)0);
5008             yylval.ival = OP_CONST;
5009             TERM(sublex_start());
5010
5011         case KEY_quotemeta:
5012             UNI(OP_QUOTEMETA);
5013
5014         case KEY_qw:
5015             s = scan_str(s,FALSE,FALSE);
5016             if (!s)
5017                 missingterm((char*)0);
5018             PL_expect = XOPERATOR;
5019             force_next(')');
5020             if (SvCUR(PL_lex_stuff)) {
5021                 OP *words = Nullop;
5022                 int warned = 0;
5023                 d = SvPV_force(PL_lex_stuff, len);
5024                 while (len) {
5025                     SV *sv;
5026                     for (; isSPACE(*d) && len; --len, ++d) ;
5027                     if (len) {
5028                         const char *b = d;
5029                         if (!warned && ckWARN(WARN_QW)) {
5030                             for (; !isSPACE(*d) && len; --len, ++d) {
5031                                 if (*d == ',') {
5032                                     Perl_warner(aTHX_ packWARN(WARN_QW),
5033                                         "Possible attempt to separate words with commas");
5034                                     ++warned;
5035                                 }
5036                                 else if (*d == '#') {
5037                                     Perl_warner(aTHX_ packWARN(WARN_QW),
5038                                         "Possible attempt to put comments in qw() list");
5039                                     ++warned;
5040                                 }
5041                             }
5042                         }
5043                         else {
5044                             for (; !isSPACE(*d) && len; --len, ++d) ;
5045                         }
5046                         sv = newSVpvn(b, d-b);
5047                         if (DO_UTF8(PL_lex_stuff))
5048                             SvUTF8_on(sv);
5049                         words = append_elem(OP_LIST, words,
5050                                             newSVOP(OP_CONST, 0, tokeq(sv)));
5051                     }
5052                 }
5053                 if (words) {
5054                     PL_nextval[PL_nexttoke].opval = words;
5055                     force_next(THING);
5056                 }
5057             }
5058             if (PL_lex_stuff) {
5059                 SvREFCNT_dec(PL_lex_stuff);
5060                 PL_lex_stuff = Nullsv;
5061             }
5062             PL_expect = XTERM;
5063             TOKEN('(');
5064
5065         case KEY_qq:
5066             s = scan_str(s,FALSE,FALSE);
5067             if (!s)
5068                 missingterm((char*)0);
5069             yylval.ival = OP_STRINGIFY;
5070             if (SvIVX(PL_lex_stuff) == '\'')
5071                 SvIV_set(PL_lex_stuff, 0);      /* qq'$foo' should intepolate */
5072             TERM(sublex_start());
5073
5074         case KEY_qr:
5075             s = scan_pat(s,OP_QR);
5076             TERM(sublex_start());
5077
5078         case KEY_qx:
5079             s = scan_str(s,FALSE,FALSE);
5080             if (!s)
5081                 missingterm((char*)0);
5082             yylval.ival = OP_BACKTICK;
5083             set_csh();
5084             TERM(sublex_start());
5085
5086         case KEY_return:
5087             OLDLOP(OP_RETURN);
5088
5089         case KEY_require:
5090             s = skipspace(s);
5091             if (isDIGIT(*s)) {
5092                 s = force_version(s, FALSE);
5093             }
5094             else if (*s != 'v' || !isDIGIT(s[1])
5095                     || (s = force_version(s, TRUE), *s == 'v'))
5096             {
5097                 *PL_tokenbuf = '\0';
5098                 s = force_word(s,WORD,TRUE,TRUE,FALSE);
5099                 if (isIDFIRST_lazy_if(PL_tokenbuf,UTF))
5100                     gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf), TRUE);
5101                 else if (*s == '<')
5102                     yyerror("<> should be quotes");
5103             }
5104             UNI(OP_REQUIRE);
5105
5106         case KEY_reset:
5107             UNI(OP_RESET);
5108
5109         case KEY_redo:
5110             s = force_word(s,WORD,TRUE,FALSE,FALSE);
5111             LOOPX(OP_REDO);
5112
5113         case KEY_rename:
5114             LOP(OP_RENAME,XTERM);
5115
5116         case KEY_rand:
5117             UNI(OP_RAND);
5118
5119         case KEY_rmdir:
5120             UNI(OP_RMDIR);
5121
5122         case KEY_rindex:
5123             LOP(OP_RINDEX,XTERM);
5124
5125         case KEY_read:
5126             LOP(OP_READ,XTERM);
5127
5128         case KEY_readdir:
5129             UNI(OP_READDIR);
5130
5131         case KEY_readline:
5132             set_csh();
5133             UNIDOR(OP_READLINE);
5134
5135         case KEY_readpipe:
5136             set_csh();
5137             UNI(OP_BACKTICK);
5138
5139         case KEY_rewinddir:
5140             UNI(OP_REWINDDIR);
5141
5142         case KEY_recv:
5143             LOP(OP_RECV,XTERM);
5144
5145         case KEY_reverse:
5146             LOP(OP_REVERSE,XTERM);
5147
5148         case KEY_readlink:
5149             UNIDOR(OP_READLINK);
5150
5151         case KEY_ref:
5152             UNI(OP_REF);
5153
5154         case KEY_s:
5155             s = scan_subst(s);
5156             if (yylval.opval)
5157                 TERM(sublex_start());
5158             else
5159                 TOKEN(1);       /* force error */
5160
5161         case KEY_chomp:
5162             UNI(OP_CHOMP);
5163         
5164         case KEY_scalar:
5165             UNI(OP_SCALAR);
5166
5167         case KEY_select:
5168             LOP(OP_SELECT,XTERM);
5169
5170         case KEY_seek:
5171             LOP(OP_SEEK,XTERM);
5172
5173         case KEY_semctl:
5174             LOP(OP_SEMCTL,XTERM);
5175
5176         case KEY_semget:
5177             LOP(OP_SEMGET,XTERM);
5178
5179         case KEY_semop:
5180             LOP(OP_SEMOP,XTERM);
5181
5182         case KEY_send:
5183             LOP(OP_SEND,XTERM);
5184
5185         case KEY_setpgrp:
5186             LOP(OP_SETPGRP,XTERM);
5187
5188         case KEY_setpriority:
5189             LOP(OP_SETPRIORITY,XTERM);
5190
5191         case KEY_sethostent:
5192             UNI(OP_SHOSTENT);
5193
5194         case KEY_setnetent:
5195             UNI(OP_SNETENT);
5196
5197         case KEY_setservent:
5198             UNI(OP_SSERVENT);
5199
5200         case KEY_setprotoent:
5201             UNI(OP_SPROTOENT);
5202
5203         case KEY_setpwent:
5204             FUN0(OP_SPWENT);
5205
5206         case KEY_setgrent:
5207             FUN0(OP_SGRENT);
5208
5209         case KEY_seekdir:
5210             LOP(OP_SEEKDIR,XTERM);
5211
5212         case KEY_setsockopt:
5213             LOP(OP_SSOCKOPT,XTERM);
5214
5215         case KEY_shift:
5216             UNIDOR(OP_SHIFT);
5217
5218         case KEY_shmctl:
5219             LOP(OP_SHMCTL,XTERM);
5220
5221         case KEY_shmget:
5222             LOP(OP_SHMGET,XTERM);
5223
5224         case KEY_shmread:
5225             LOP(OP_SHMREAD,XTERM);
5226
5227         case KEY_shmwrite:
5228             LOP(OP_SHMWRITE,XTERM);
5229
5230         case KEY_shutdown:
5231             LOP(OP_SHUTDOWN,XTERM);
5232
5233         case KEY_sin:
5234             UNI(OP_SIN);
5235
5236         case KEY_sleep:
5237             UNI(OP_SLEEP);
5238
5239         case KEY_socket:
5240             LOP(OP_SOCKET,XTERM);
5241
5242         case KEY_socketpair:
5243             LOP(OP_SOCKPAIR,XTERM);
5244
5245         case KEY_sort:
5246             checkcomma(s,PL_tokenbuf,"subroutine name");
5247             s = skipspace(s);
5248             if (*s == ';' || *s == ')')         /* probably a close */
5249                 Perl_croak(aTHX_ "sort is now a reserved word");
5250             PL_expect = XTERM;
5251             s = force_word(s,WORD,TRUE,TRUE,FALSE);
5252             LOP(OP_SORT,XREF);
5253
5254         case KEY_split:
5255             LOP(OP_SPLIT,XTERM);
5256
5257         case KEY_sprintf:
5258             LOP(OP_SPRINTF,XTERM);
5259
5260         case KEY_splice:
5261             LOP(OP_SPLICE,XTERM);
5262
5263         case KEY_sqrt:
5264             UNI(OP_SQRT);
5265
5266         case KEY_srand:
5267             UNI(OP_SRAND);
5268
5269         case KEY_stat:
5270             UNI(OP_STAT);
5271
5272         case KEY_study:
5273             UNI(OP_STUDY);
5274
5275         case KEY_substr:
5276             LOP(OP_SUBSTR,XTERM);
5277
5278         case KEY_format:
5279         case KEY_sub:
5280           really_sub:
5281             {
5282                 char tmpbuf[sizeof PL_tokenbuf];
5283                 SSize_t tboffset = 0;
5284                 expectation attrful;
5285                 bool have_name, have_proto, bad_proto;
5286                 const int key = tmp;
5287
5288                 s = skipspace(s);
5289
5290                 if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' ||
5291                     (*s == ':' && s[1] == ':'))
5292                 {
5293                     PL_expect = XBLOCK;
5294                     attrful = XATTRBLOCK;
5295                     /* remember buffer pos'n for later force_word */
5296                     tboffset = s - PL_oldbufptr;
5297                     d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
5298                     if (strchr(tmpbuf, ':'))
5299                         sv_setpv(PL_subname, tmpbuf);
5300                     else {
5301                         sv_setsv(PL_subname,PL_curstname);
5302                         sv_catpvn(PL_subname,"::",2);
5303                         sv_catpvn(PL_subname,tmpbuf,len);
5304                     }
5305                     s = skipspace(d);
5306                     have_name = TRUE;
5307                 }
5308                 else {
5309                     if (key == KEY_my)
5310                         Perl_croak(aTHX_ "Missing name in \"my sub\"");
5311                     PL_expect = XTERMBLOCK;
5312                     attrful = XATTRTERM;
5313                     sv_setpvn(PL_subname,"?",1);
5314                     have_name = FALSE;
5315                 }
5316
5317                 if (key == KEY_format) {
5318                     if (*s == '=')
5319                         PL_lex_formbrack = PL_lex_brackets + 1;
5320                     if (have_name)
5321                         (void) force_word(PL_oldbufptr + tboffset, WORD,
5322                                           FALSE, TRUE, TRUE);
5323                     OPERATOR(FORMAT);
5324                 }
5325
5326                 /* Look for a prototype */
5327                 if (*s == '(') {
5328                     char *p;
5329
5330                     s = scan_str(s,FALSE,FALSE);
5331                     if (!s)
5332                         Perl_croak(aTHX_ "Prototype not terminated");
5333                     /* strip spaces and check for bad characters */
5334                     d = SvPVX(PL_lex_stuff);
5335                     tmp = 0;
5336                     bad_proto = FALSE;
5337                     for (p = d; *p; ++p) {
5338                         if (!isSPACE(*p)) {
5339                             d[tmp++] = *p;
5340                             if (!strchr("$@%*;[]&\\", *p))
5341                                 bad_proto = TRUE;
5342                         }
5343                     }
5344                     d[tmp] = '\0';
5345                     if (bad_proto && ckWARN(WARN_SYNTAX))
5346                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5347                                     "Illegal character in prototype for %"SVf" : %s",
5348                                     PL_subname, d);
5349                     SvCUR_set(PL_lex_stuff, tmp);
5350                     have_proto = TRUE;
5351
5352                     s = skipspace(s);
5353                 }
5354                 else
5355                     have_proto = FALSE;
5356
5357                 if (*s == ':' && s[1] != ':')
5358                     PL_expect = attrful;
5359                 else if (*s != '{' && key == KEY_sub) {
5360                     if (!have_name)
5361                         Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine");
5362                     else if (*s != ';')
5363                         Perl_croak(aTHX_ "Illegal declaration of subroutine %"SVf, PL_subname);
5364                 }
5365
5366                 if (have_proto) {
5367                     PL_nextval[PL_nexttoke].opval =
5368                         (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
5369                     PL_lex_stuff = Nullsv;
5370                     force_next(THING);
5371                 }
5372                 if (!have_name) {
5373                     sv_setpv(PL_subname,
5374                         PL_curstash ? "__ANON__" : "__ANON__::__ANON__");
5375                     TOKEN(ANONSUB);
5376                 }
5377                 (void) force_word(PL_oldbufptr + tboffset, WORD,
5378                                   FALSE, TRUE, TRUE);
5379                 if (key == KEY_my)
5380                     TOKEN(MYSUB);
5381                 TOKEN(SUB);
5382             }
5383
5384         case KEY_system:
5385             set_csh();
5386             LOP(OP_SYSTEM,XREF);
5387
5388         case KEY_symlink:
5389             LOP(OP_SYMLINK,XTERM);
5390
5391         case KEY_syscall:
5392             LOP(OP_SYSCALL,XTERM);
5393
5394         case KEY_sysopen:
5395             LOP(OP_SYSOPEN,XTERM);
5396
5397         case KEY_sysseek:
5398             LOP(OP_SYSSEEK,XTERM);
5399
5400         case KEY_sysread:
5401             LOP(OP_SYSREAD,XTERM);
5402
5403         case KEY_syswrite:
5404             LOP(OP_SYSWRITE,XTERM);
5405
5406         case KEY_tr:
5407             s = scan_trans(s);
5408             TERM(sublex_start());
5409
5410         case KEY_tell:
5411             UNI(OP_TELL);
5412
5413         case KEY_telldir:
5414             UNI(OP_TELLDIR);
5415
5416         case KEY_tie:
5417             LOP(OP_TIE,XTERM);
5418
5419         case KEY_tied:
5420             UNI(OP_TIED);
5421
5422         case KEY_time:
5423             FUN0(OP_TIME);
5424
5425         case KEY_times:
5426             FUN0(OP_TMS);
5427
5428         case KEY_truncate:
5429             LOP(OP_TRUNCATE,XTERM);
5430
5431         case KEY_uc:
5432             UNI(OP_UC);
5433
5434         case KEY_ucfirst:
5435             UNI(OP_UCFIRST);
5436
5437         case KEY_untie:
5438             UNI(OP_UNTIE);
5439
5440         case KEY_until:
5441             yylval.ival = CopLINE(PL_curcop);
5442             OPERATOR(UNTIL);
5443
5444         case KEY_unless:
5445             yylval.ival = CopLINE(PL_curcop);
5446             OPERATOR(UNLESS);
5447
5448         case KEY_unlink:
5449             LOP(OP_UNLINK,XTERM);
5450
5451         case KEY_undef:
5452             UNIDOR(OP_UNDEF);
5453
5454         case KEY_unpack:
5455             LOP(OP_UNPACK,XTERM);
5456
5457         case KEY_utime:
5458             LOP(OP_UTIME,XTERM);
5459
5460         case KEY_umask:
5461             UNIDOR(OP_UMASK);
5462
5463         case KEY_unshift:
5464             LOP(OP_UNSHIFT,XTERM);
5465
5466         case KEY_use:
5467             s = tokenize_use(1, s);
5468             OPERATOR(USE);
5469
5470         case KEY_values:
5471             UNI(OP_VALUES);
5472
5473         case KEY_vec:
5474             LOP(OP_VEC,XTERM);
5475
5476         case KEY_while:
5477             yylval.ival = CopLINE(PL_curcop);
5478             OPERATOR(WHILE);
5479
5480         case KEY_warn:
5481             PL_hints |= HINT_BLOCK_SCOPE;
5482             LOP(OP_WARN,XTERM);
5483
5484         case KEY_wait:
5485             FUN0(OP_WAIT);
5486
5487         case KEY_waitpid:
5488             LOP(OP_WAITPID,XTERM);
5489
5490         case KEY_wantarray:
5491             FUN0(OP_WANTARRAY);
5492
5493         case KEY_write:
5494 #ifdef EBCDIC
5495         {
5496             char ctl_l[2];
5497             ctl_l[0] = toCTRL('L');
5498             ctl_l[1] = '\0';
5499             gv_fetchpv(ctl_l,TRUE, SVt_PV);
5500         }
5501 #else
5502             gv_fetchpv("\f",TRUE, SVt_PV);      /* Make sure $^L is defined */
5503 #endif
5504             UNI(OP_ENTERWRITE);
5505
5506         case KEY_x:
5507             if (PL_expect == XOPERATOR)
5508                 Mop(OP_REPEAT);
5509             check_uni();
5510             goto just_a_word;
5511
5512         case KEY_xor:
5513             yylval.ival = OP_XOR;
5514             OPERATOR(OROP);
5515
5516         case KEY_y:
5517             s = scan_trans(s);
5518             TERM(sublex_start());
5519         }
5520     }}
5521 }
5522 #ifdef __SC__
5523 #pragma segment Main
5524 #endif
5525
5526 static int
5527 S_pending_ident(pTHX)
5528 {
5529     register char *d;
5530     register I32 tmp = 0;
5531     /* pit holds the identifier we read and pending_ident is reset */
5532     char pit = PL_pending_ident;
5533     PL_pending_ident = 0;
5534
5535     DEBUG_T({ PerlIO_printf(Perl_debug_log,
5536           "### Tokener saw identifier '%s'\n", PL_tokenbuf); });
5537
5538     /* if we're in a my(), we can't allow dynamics here.
5539        $foo'bar has already been turned into $foo::bar, so
5540        just check for colons.
5541
5542        if it's a legal name, the OP is a PADANY.
5543     */
5544     if (PL_in_my) {
5545         if (PL_in_my == KEY_our) {      /* "our" is merely analogous to "my" */
5546             if (strchr(PL_tokenbuf,':'))
5547                 yyerror(Perl_form(aTHX_ "No package name allowed for "
5548                                   "variable %s in \"our\"",
5549                                   PL_tokenbuf));
5550             tmp = allocmy(PL_tokenbuf);
5551         }
5552         else {
5553             if (strchr(PL_tokenbuf,':'))
5554                 yyerror(Perl_form(aTHX_ PL_no_myglob,PL_tokenbuf));
5555
5556             yylval.opval = newOP(OP_PADANY, 0);
5557             yylval.opval->op_targ = allocmy(PL_tokenbuf);
5558             return PRIVATEREF;
5559         }
5560     }
5561
5562     /*
5563        build the ops for accesses to a my() variable.
5564
5565        Deny my($a) or my($b) in a sort block, *if* $a or $b is
5566        then used in a comparison.  This catches most, but not
5567        all cases.  For instance, it catches
5568            sort { my($a); $a <=> $b }
5569        but not
5570            sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
5571        (although why you'd do that is anyone's guess).
5572     */
5573
5574     if (!strchr(PL_tokenbuf,':')) {
5575         if (!PL_in_my)
5576             tmp = pad_findmy(PL_tokenbuf);
5577         if (tmp != NOT_IN_PAD) {
5578             /* might be an "our" variable" */
5579             if (PAD_COMPNAME_FLAGS(tmp) & SVpad_OUR) {
5580                 /* build ops for a bareword */
5581                 HV *  const stash = PAD_COMPNAME_OURSTASH(tmp);
5582                 HEK * const stashname = HvNAME_HEK(stash);
5583                 SV *  const sym = newSVhek(stashname);
5584                 sv_catpvn(sym, "::", 2);
5585                 sv_catpv(sym, PL_tokenbuf+1);
5586                 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
5587                 yylval.opval->op_private = OPpCONST_ENTERED;
5588                 gv_fetchsv(sym,
5589                     (PL_in_eval
5590                         ? (GV_ADDMULTI | GV_ADDINEVAL)
5591                         : GV_ADDMULTI
5592                     ),
5593                     ((PL_tokenbuf[0] == '$') ? SVt_PV
5594                      : (PL_tokenbuf[0] == '@') ? SVt_PVAV
5595                      : SVt_PVHV));
5596                 return WORD;
5597             }
5598
5599             /* if it's a sort block and they're naming $a or $b */
5600             if (PL_last_lop_op == OP_SORT &&
5601                 PL_tokenbuf[0] == '$' &&
5602                 (PL_tokenbuf[1] == 'a' || PL_tokenbuf[1] == 'b')
5603                 && !PL_tokenbuf[2])
5604             {
5605                 for (d = PL_in_eval ? PL_oldoldbufptr : PL_linestart;
5606                      d < PL_bufend && *d != '\n';
5607                      d++)
5608                 {
5609                     if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
5610                         Perl_croak(aTHX_ "Can't use \"my %s\" in sort comparison",
5611                               PL_tokenbuf);
5612                     }
5613                 }
5614             }
5615
5616             yylval.opval = newOP(OP_PADANY, 0);
5617             yylval.opval->op_targ = tmp;
5618             return PRIVATEREF;
5619         }
5620     }
5621
5622     /*
5623        Whine if they've said @foo in a doublequoted string,
5624        and @foo isn't a variable we can find in the symbol
5625        table.
5626     */
5627     if (pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
5628         GV *gv = gv_fetchpv(PL_tokenbuf+1, FALSE, SVt_PVAV);
5629         if ((!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
5630              && ckWARN(WARN_AMBIGUOUS))
5631         {
5632             /* Downgraded from fatal to warning 20000522 mjd */
5633             Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
5634                         "Possible unintended interpolation of %s in string",
5635                          PL_tokenbuf);
5636         }
5637     }
5638
5639     /* build ops for a bareword */
5640     yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(PL_tokenbuf+1, 0));
5641     yylval.opval->op_private = OPpCONST_ENTERED;
5642     gv_fetchpv(PL_tokenbuf+1, PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : TRUE,
5643                ((PL_tokenbuf[0] == '$') ? SVt_PV
5644                 : (PL_tokenbuf[0] == '@') ? SVt_PVAV
5645                 : SVt_PVHV));
5646     return WORD;
5647 }
5648
5649 /*
5650  *  The following code was generated by perl_keyword.pl.
5651  */
5652
5653 I32
5654 Perl_keyword (pTHX_ const char *name, I32 len)
5655 {
5656   switch (len)
5657   {
5658     case 1: /* 5 tokens of length 1 */
5659       switch (name[0])
5660       {
5661         case 'm':
5662           {                                       /* m          */
5663             return KEY_m;
5664           }
5665
5666         case 'q':
5667           {                                       /* q          */
5668             return KEY_q;
5669           }
5670
5671         case 's':
5672           {                                       /* s          */
5673             return KEY_s;
5674           }
5675
5676         case 'x':
5677           {                                       /* x          */
5678             return -KEY_x;
5679           }
5680
5681         case 'y':
5682           {                                       /* y          */
5683             return KEY_y;
5684           }
5685
5686         default:
5687           goto unknown;
5688       }
5689
5690     case 2: /* 18 tokens of length 2 */
5691       switch (name[0])
5692       {
5693         case 'd':
5694           if (name[1] == 'o')
5695           {                                       /* do         */
5696             return KEY_do;
5697           }
5698
5699           goto unknown;
5700
5701         case 'e':
5702           if (name[1] == 'q')
5703           {                                       /* eq         */
5704             return -KEY_eq;
5705           }
5706
5707           goto unknown;
5708
5709         case 'g':
5710           switch (name[1])
5711           {
5712             case 'e':
5713               {                                   /* ge         */
5714                 return -KEY_ge;
5715               }
5716
5717             case 't':
5718               {                                   /* gt         */
5719                 return -KEY_gt;
5720               }
5721
5722             default:
5723               goto unknown;
5724           }
5725
5726         case 'i':
5727           if (name[1] == 'f')
5728           {                                       /* if         */
5729             return KEY_if;
5730           }
5731
5732           goto unknown;
5733
5734         case 'l':
5735           switch (name[1])
5736           {
5737             case 'c':
5738               {                                   /* lc         */
5739                 return -KEY_lc;
5740               }
5741
5742             case 'e':
5743               {                                   /* le         */
5744                 return -KEY_le;
5745               }
5746
5747             case 't':
5748               {                                   /* lt         */
5749                 return -KEY_lt;
5750               }
5751
5752             default:
5753               goto unknown;
5754           }
5755
5756         case 'm':
5757           if (name[1] == 'y')
5758           {                                       /* my         */
5759             return KEY_my;
5760           }
5761
5762           goto unknown;
5763
5764         case 'n':
5765           switch (name[1])
5766           {
5767             case 'e':
5768               {                                   /* ne         */
5769                 return -KEY_ne;
5770               }
5771
5772             case 'o':
5773               {                                   /* no         */
5774                 return KEY_no;
5775               }
5776
5777             default:
5778               goto unknown;
5779           }
5780
5781         case 'o':
5782           if (name[1] == 'r')
5783           {                                       /* or         */
5784             return -KEY_or;
5785           }
5786
5787           goto unknown;
5788
5789         case 'q':
5790           switch (name[1])
5791           {
5792             case 'q':
5793               {                                   /* qq         */
5794                 return KEY_qq;
5795               }
5796
5797             case 'r':
5798               {                                   /* qr         */
5799                 return KEY_qr;
5800               }
5801
5802             case 'w':
5803               {                                   /* qw         */
5804                 return KEY_qw;
5805               }
5806
5807             case 'x':
5808               {                                   /* qx         */
5809                 return KEY_qx;
5810               }
5811
5812             default:
5813               goto unknown;
5814           }
5815
5816         case 't':
5817           if (name[1] == 'r')
5818           {                                       /* tr         */
5819             return KEY_tr;
5820           }
5821
5822           goto unknown;
5823
5824         case 'u':
5825           if (name[1] == 'c')
5826           {                                       /* uc         */
5827             return -KEY_uc;
5828           }
5829
5830           goto unknown;
5831
5832         default:
5833           goto unknown;
5834       }
5835
5836     case 3: /* 28 tokens of length 3 */
5837       switch (name[0])
5838       {
5839         case 'E':
5840           if (name[1] == 'N' &&
5841               name[2] == 'D')
5842           {                                       /* END        */
5843             return KEY_END;
5844           }
5845
5846           goto unknown;
5847
5848         case 'a':
5849           switch (name[1])
5850           {
5851             case 'b':
5852               if (name[2] == 's')
5853               {                                   /* abs        */
5854                 return -KEY_abs;
5855               }
5856
5857               goto unknown;
5858
5859             case 'n':
5860               if (name[2] == 'd')
5861               {                                   /* and        */
5862                 return -KEY_and;
5863               }
5864
5865               goto unknown;
5866
5867             default:
5868               goto unknown;
5869           }
5870
5871         case 'c':
5872           switch (name[1])
5873           {
5874             case 'h':
5875               if (name[2] == 'r')
5876               {                                   /* chr        */
5877                 return -KEY_chr;
5878               }
5879
5880               goto unknown;
5881
5882             case 'm':
5883               if (name[2] == 'p')
5884               {                                   /* cmp        */
5885                 return -KEY_cmp;
5886               }
5887
5888               goto unknown;
5889
5890             case 'o':
5891               if (name[2] == 's')
5892               {                                   /* cos        */
5893                 return -KEY_cos;
5894               }
5895
5896               goto unknown;
5897
5898             default:
5899               goto unknown;
5900           }
5901
5902         case 'd':
5903           if (name[1] == 'i' &&
5904               name[2] == 'e')
5905           {                                       /* die        */
5906             return -KEY_die;
5907           }
5908
5909           goto unknown;
5910
5911         case 'e':
5912           switch (name[1])
5913           {
5914             case 'o':
5915               if (name[2] == 'f')
5916               {                                   /* eof        */
5917                 return -KEY_eof;
5918               }
5919
5920               goto unknown;
5921
5922             case 'r':
5923               if (name[2] == 'r')
5924               {                                   /* err        */
5925                 return -KEY_err;
5926               }
5927
5928               goto unknown;
5929
5930             case 'x':
5931               if (name[2] == 'p')
5932               {                                   /* exp        */
5933                 return -KEY_exp;
5934               }
5935
5936               goto unknown;
5937
5938             default:
5939               goto unknown;
5940           }
5941
5942         case 'f':
5943           if (name[1] == 'o' &&
5944               name[2] == 'r')
5945           {                                       /* for        */
5946             return KEY_for;
5947           }
5948
5949           goto unknown;
5950
5951         case 'h':
5952           if (name[1] == 'e' &&
5953               name[2] == 'x')
5954           {                                       /* hex        */
5955             return -KEY_hex;
5956           }
5957
5958           goto unknown;
5959
5960         case 'i':
5961           if (name[1] == 'n' &&
5962               name[2] == 't')
5963           {                                       /* int        */
5964             return -KEY_int;
5965           }
5966
5967           goto unknown;
5968
5969         case 'l':
5970           if (name[1] == 'o' &&
5971               name[2] == 'g')
5972           {                                       /* log        */
5973             return -KEY_log;
5974           }
5975
5976           goto unknown;
5977
5978         case 'm':
5979           if (name[1] == 'a' &&
5980               name[2] == 'p')
5981           {                                       /* map        */
5982             return KEY_map;
5983           }
5984
5985           goto unknown;
5986
5987         case 'n':
5988           if (name[1] == 'o' &&
5989               name[2] == 't')
5990           {                                       /* not        */
5991             return -KEY_not;
5992           }
5993
5994           goto unknown;
5995
5996         case 'o':
5997           switch (name[1])
5998           {
5999             case 'c':
6000               if (name[2] == 't')
6001               {                                   /* oct        */
6002                 return -KEY_oct;
6003               }
6004
6005               goto unknown;
6006
6007             case 'r':
6008               if (name[2] == 'd')
6009               {                                   /* ord        */
6010                 return -KEY_ord;
6011               }
6012
6013               goto unknown;
6014
6015             case 'u':
6016               if (name[2] == 'r')
6017               {                                   /* our        */
6018                 return KEY_our;
6019               }
6020
6021               goto unknown;
6022
6023             default:
6024               goto unknown;
6025           }
6026
6027         case 'p':
6028           if (name[1] == 'o')
6029           {
6030             switch (name[2])
6031             {
6032               case 'p':
6033                 {                                 /* pop        */
6034                   return -KEY_pop;
6035                 }
6036
6037               case 's':
6038                 {                                 /* pos        */
6039                   return KEY_pos;
6040                 }
6041
6042               default:
6043                 goto unknown;
6044             }
6045           }
6046
6047           goto unknown;
6048
6049         case 'r':
6050           if (name[1] == 'e' &&
6051               name[2] == 'f')
6052           {                                       /* ref        */
6053             return -KEY_ref;
6054           }
6055
6056           goto unknown;
6057
6058         case 's':
6059           switch (name[1])
6060           {
6061             case 'i':
6062               if (name[2] == 'n')
6063               {                                   /* sin        */
6064                 return -KEY_sin;
6065               }
6066
6067               goto unknown;
6068
6069             case 'u':
6070               if (name[2] == 'b')
6071               {                                   /* sub        */
6072                 return KEY_sub;
6073               }
6074
6075               goto unknown;
6076
6077             default:
6078               goto unknown;
6079           }
6080
6081         case 't':
6082           if (name[1] == 'i' &&
6083               name[2] == 'e')
6084           {                                       /* tie        */
6085             return KEY_tie;
6086           }
6087
6088           goto unknown;
6089
6090         case 'u':
6091           if (name[1] == 's' &&
6092               name[2] == 'e')
6093           {                                       /* use        */
6094             return KEY_use;
6095           }
6096
6097           goto unknown;
6098
6099         case 'v':
6100           if (name[1] == 'e' &&
6101               name[2] == 'c')
6102           {                                       /* vec        */
6103             return -KEY_vec;
6104           }
6105
6106           goto unknown;
6107
6108         case 'x':
6109           if (name[1] == 'o' &&
6110               name[2] == 'r')
6111           {                                       /* xor        */
6112             return -KEY_xor;
6113           }
6114
6115           goto unknown;
6116
6117         default:
6118           goto unknown;
6119       }
6120
6121     case 4: /* 40 tokens of length 4 */
6122       switch (name[0])
6123       {
6124         case 'C':
6125           if (name[1] == 'O' &&
6126               name[2] == 'R' &&
6127               name[3] == 'E')
6128           {                                       /* CORE       */
6129             return -KEY_CORE;
6130           }
6131
6132           goto unknown;
6133
6134         case 'I':
6135           if (name[1] == 'N' &&
6136               name[2] == 'I' &&
6137               name[3] == 'T')
6138           {                                       /* INIT       */
6139             return KEY_INIT;
6140           }
6141
6142           goto unknown;
6143
6144         case 'b':
6145           if (name[1] == 'i' &&
6146               name[2] == 'n' &&
6147               name[3] == 'd')
6148           {                                       /* bind       */
6149             return -KEY_bind;
6150           }
6151
6152           goto unknown;
6153
6154         case 'c':
6155           if (name[1] == 'h' &&
6156               name[2] == 'o' &&
6157               name[3] == 'p')
6158           {                                       /* chop       */
6159             return -KEY_chop;
6160           }
6161
6162           goto unknown;
6163
6164         case 'd':
6165           if (name[1] == 'u' &&
6166               name[2] == 'm' &&
6167               name[3] == 'p')
6168           {                                       /* dump       */
6169             return -KEY_dump;
6170           }
6171
6172           goto unknown;
6173
6174         case 'e':
6175           switch (name[1])
6176           {
6177             case 'a':
6178               if (name[2] == 'c' &&
6179                   name[3] == 'h')
6180               {                                   /* each       */
6181                 return -KEY_each;
6182               }
6183
6184               goto unknown;
6185
6186             case 'l':
6187               if (name[2] == 's' &&
6188                   name[3] == 'e')
6189               {                                   /* else       */
6190                 return KEY_else;
6191               }
6192
6193               goto unknown;
6194
6195             case 'v':
6196               if (name[2] == 'a' &&
6197                   name[3] == 'l')
6198               {                                   /* eval       */
6199                 return KEY_eval;
6200               }
6201
6202               goto unknown;
6203
6204             case 'x':
6205               switch (name[2])
6206               {
6207                 case 'e':
6208                   if (name[3] == 'c')
6209                   {                               /* exec       */
6210                     return -KEY_exec;
6211                   }
6212
6213                   goto unknown;
6214
6215                 case 'i':
6216                   if (name[3] == 't')
6217                   {                               /* exit       */
6218                     return -KEY_exit;
6219                   }
6220
6221                   goto unknown;
6222
6223                 default:
6224                   goto unknown;
6225               }
6226
6227             default:
6228               goto unknown;
6229           }
6230
6231         case 'f':
6232           if (name[1] == 'o' &&
6233               name[2] == 'r' &&
6234               name[3] == 'k')
6235           {                                       /* fork       */
6236             return -KEY_fork;
6237           }
6238
6239           goto unknown;
6240
6241         case 'g':
6242           switch (name[1])
6243           {
6244             case 'e':
6245               if (name[2] == 't' &&
6246                   name[3] == 'c')
6247               {                                   /* getc       */
6248                 return -KEY_getc;
6249               }
6250
6251               goto unknown;
6252
6253             case 'l':
6254               if (name[2] == 'o' &&
6255                   name[3] == 'b')
6256               {                                   /* glob       */
6257                 return KEY_glob;
6258               }
6259
6260               goto unknown;
6261
6262             case 'o':
6263               if (name[2] == 't' &&
6264                   name[3] == 'o')
6265               {                                   /* goto       */
6266                 return KEY_goto;
6267               }
6268
6269               goto unknown;
6270
6271             case 'r':
6272               if (name[2] == 'e' &&
6273                   name[3] == 'p')
6274               {                                   /* grep       */
6275                 return KEY_grep;
6276               }
6277
6278               goto unknown;
6279
6280             default:
6281               goto unknown;
6282           }
6283
6284         case 'j':
6285           if (name[1] == 'o' &&
6286               name[2] == 'i' &&
6287               name[3] == 'n')
6288           {                                       /* join       */
6289             return -KEY_join;
6290           }
6291
6292           goto unknown;
6293
6294         case 'k':
6295           switch (name[1])
6296           {
6297             case 'e':
6298               if (name[2] == 'y' &&
6299                   name[3] == 's')
6300               {                                   /* keys       */
6301                 return -KEY_keys;
6302               }
6303
6304               goto unknown;
6305
6306             case 'i':
6307               if (name[2] == 'l' &&
6308                   name[3] == 'l')
6309               {                                   /* kill       */
6310                 return -KEY_kill;
6311               }
6312
6313               goto unknown;
6314
6315             default:
6316               goto unknown;
6317           }
6318
6319         case 'l':
6320           switch (name[1])
6321           {
6322             case 'a':
6323               if (name[2] == 's' &&
6324                   name[3] == 't')
6325               {                                   /* last       */
6326                 return KEY_last;
6327               }
6328
6329               goto unknown;
6330
6331             case 'i':
6332               if (name[2] == 'n' &&
6333                   name[3] == 'k')
6334               {                                   /* link       */
6335                 return -KEY_link;
6336               }
6337
6338               goto unknown;
6339
6340             case 'o':
6341               if (name[2] == 'c' &&
6342                   name[3] == 'k')
6343               {                                   /* lock       */
6344                 return -KEY_lock;
6345               }
6346
6347               goto unknown;
6348
6349             default:
6350               goto unknown;
6351           }
6352
6353         case 'n':
6354           if (name[1] == 'e' &&
6355               name[2] == 'x' &&
6356               name[3] == 't')
6357           {                                       /* next       */
6358             return KEY_next;
6359           }
6360
6361           goto unknown;
6362
6363         case 'o':
6364           if (name[1] == 'p' &&
6365               name[2] == 'e' &&
6366               name[3] == 'n')
6367           {                                       /* open       */
6368             return -KEY_open;
6369           }
6370
6371           goto unknown;
6372
6373         case 'p':
6374           switch (name[1])
6375           {
6376             case 'a':
6377               if (name[2] == 'c' &&
6378                   name[3] == 'k')
6379               {                                   /* pack       */
6380                 return -KEY_pack;
6381               }
6382
6383               goto unknown;
6384
6385             case 'i':
6386               if (name[2] == 'p' &&
6387                   name[3] == 'e')
6388               {                                   /* pipe       */
6389                 return -KEY_pipe;
6390               }
6391
6392               goto unknown;
6393
6394             case 'u':
6395               if (name[2] == 's' &&
6396                   name[3] == 'h')
6397               {                                   /* push       */
6398                 return -KEY_push;
6399               }
6400
6401               goto unknown;
6402
6403             default:
6404               goto unknown;
6405           }
6406
6407         case 'r':
6408           switch (name[1])
6409           {
6410             case 'a':
6411               if (name[2] == 'n' &&
6412                   name[3] == 'd')
6413               {                                   /* rand       */
6414                 return -KEY_rand;
6415               }
6416
6417               goto unknown;
6418
6419             case 'e':
6420               switch (name[2])
6421               {
6422                 case 'a':
6423                   if (name[3] == 'd')
6424                   {                               /* read       */
6425                     return -KEY_read;
6426                   }
6427
6428                   goto unknown;
6429
6430                 case 'c':
6431                   if (name[3] == 'v')
6432                   {                               /* recv       */
6433                     return -KEY_recv;
6434                   }
6435
6436                   goto unknown;
6437
6438                 case 'd':
6439                   if (name[3] == 'o')
6440                   {                               /* redo       */
6441                     return KEY_redo;
6442                   }
6443
6444                   goto unknown;
6445
6446                 default:
6447                   goto unknown;
6448               }
6449
6450             default:
6451               goto unknown;
6452           }
6453
6454         case 's':
6455           switch (name[1])
6456           {
6457             case 'e':
6458               switch (name[2])
6459               {
6460                 case 'e':
6461                   if (name[3] == 'k')
6462                   {                               /* seek       */
6463                     return -KEY_seek;
6464                   }
6465
6466                   goto unknown;
6467
6468                 case 'n':
6469                   if (name[3] == 'd')
6470                   {                               /* send       */
6471                     return -KEY_send;
6472                   }
6473
6474                   goto unknown;
6475
6476                 default:
6477                   goto unknown;
6478               }
6479
6480             case 'o':
6481               if (name[2] == 'r' &&
6482                   name[3] == 't')
6483               {                                   /* sort       */
6484                 return KEY_sort;
6485               }
6486
6487               goto unknown;
6488
6489             case 'q':
6490               if (name[2] == 'r' &&
6491                   name[3] == 't')
6492               {                                   /* sqrt       */
6493                 return -KEY_sqrt;
6494               }
6495
6496               goto unknown;
6497
6498             case 't':
6499               if (name[2] == 'a' &&
6500                   name[3] == 't')
6501               {                                   /* stat       */
6502                 return -KEY_stat;
6503               }
6504
6505               goto unknown;
6506
6507             default:
6508               goto unknown;
6509           }
6510
6511         case 't':
6512           switch (name[1])
6513           {
6514             case 'e':
6515               if (name[2] == 'l' &&
6516                   name[3] == 'l')
6517               {                                   /* tell       */
6518                 return -KEY_tell;
6519               }
6520
6521               goto unknown;
6522
6523             case 'i':
6524               switch (name[2])
6525               {
6526                 case 'e':
6527                   if (name[3] == 'd')
6528                   {                               /* tied       */
6529                     return KEY_tied;
6530                   }
6531
6532                   goto unknown;
6533
6534                 case 'm':
6535                   if (name[3] == 'e')
6536                   {                               /* time       */
6537                     return -KEY_time;
6538                   }
6539
6540                   goto unknown;
6541
6542                 default:
6543                   goto unknown;
6544               }
6545
6546             default:
6547               goto unknown;
6548           }
6549
6550         case 'w':
6551           if (name[1] == 'a')
6552           {
6553             switch (name[2])
6554             {
6555               case 'i':
6556                 if (name[3] == 't')
6557                 {                                 /* wait       */
6558                   return -KEY_wait;
6559                 }
6560
6561                 goto unknown;
6562
6563               case 'r':
6564                 if (name[3] == 'n')
6565                 {                                 /* warn       */
6566                   return -KEY_warn;
6567                 }
6568
6569                 goto unknown;
6570
6571               default:
6572                 goto unknown;
6573             }
6574           }
6575
6576           goto unknown;
6577
6578         default:
6579           goto unknown;
6580       }
6581
6582     case 5: /* 36 tokens of length 5 */
6583       switch (name[0])
6584       {
6585         case 'B':
6586           if (name[1] == 'E' &&
6587               name[2] == 'G' &&
6588               name[3] == 'I' &&
6589               name[4] == 'N')
6590           {                                       /* BEGIN      */
6591             return KEY_BEGIN;
6592           }
6593
6594           goto unknown;
6595
6596         case 'C':
6597           if (name[1] == 'H' &&
6598               name[2] == 'E' &&
6599               name[3] == 'C' &&
6600               name[4] == 'K')
6601           {                                       /* CHECK      */
6602             return KEY_CHECK;
6603           }
6604
6605           goto unknown;
6606
6607         case 'a':
6608           switch (name[1])
6609           {
6610             case 'l':
6611               if (name[2] == 'a' &&
6612                   name[3] == 'r' &&
6613                   name[4] == 'm')
6614               {                                   /* alarm      */
6615                 return -KEY_alarm;
6616               }
6617
6618               goto unknown;
6619
6620             case 't':
6621               if (name[2] == 'a' &&
6622                   name[3] == 'n' &&
6623                   name[4] == '2')
6624               {                                   /* atan2      */
6625                 return -KEY_atan2;
6626               }
6627
6628               goto unknown;
6629
6630             default:
6631               goto unknown;
6632           }
6633
6634         case 'b':
6635           if (name[1] == 'l' &&
6636               name[2] == 'e' &&
6637               name[3] == 's' &&
6638               name[4] == 's')
6639           {                                       /* bless      */
6640             return -KEY_bless;
6641           }
6642
6643           goto unknown;
6644
6645         case 'c':
6646           switch (name[1])
6647           {
6648             case 'h':
6649               switch (name[2])
6650               {
6651                 case 'd':
6652                   if (name[3] == 'i' &&
6653                       name[4] == 'r')
6654                   {                               /* chdir      */
6655                     return -KEY_chdir;
6656                   }
6657
6658                   goto unknown;
6659
6660                 case 'm':
6661                   if (name[3] == 'o' &&
6662                       name[4] == 'd')
6663                   {                               /* chmod      */
6664                     return -KEY_chmod;
6665                   }
6666
6667                   goto unknown;
6668
6669                 case 'o':
6670                   switch (name[3])
6671                   {
6672                     case 'm':
6673                       if (name[4] == 'p')
6674                       {                           /* chomp      */
6675                         return -KEY_chomp;
6676                       }
6677
6678                       goto unknown;
6679
6680                     case 'w':
6681                       if (name[4] == 'n')
6682                       {                           /* chown      */
6683                         return -KEY_chown;
6684                       }
6685
6686                       goto unknown;
6687
6688                     default:
6689                       goto unknown;
6690                   }
6691
6692                 default:
6693                   goto unknown;
6694               }
6695
6696             case 'l':
6697               if (name[2] == 'o' &&
6698                   name[3] == 's' &&
6699                   name[4] == 'e')
6700               {                                   /* close      */
6701                 return -KEY_close;
6702               }
6703
6704               goto unknown;
6705
6706             case 'r':
6707               if (name[2] == 'y' &&
6708                   name[3] == 'p' &&
6709                   name[4] == 't')
6710               {                                   /* crypt      */
6711                 return -KEY_crypt;
6712               }
6713
6714               goto unknown;
6715
6716             default:
6717               goto unknown;
6718           }
6719
6720         case 'e':
6721           if (name[1] == 'l' &&
6722               name[2] == 's' &&
6723               name[3] == 'i' &&
6724               name[4] == 'f')
6725           {                                       /* elsif      */
6726             return KEY_elsif;
6727           }
6728
6729           goto unknown;
6730
6731         case 'f':
6732           switch (name[1])
6733           {
6734             case 'c':
6735               if (name[2] == 'n' &&
6736                   name[3] == 't' &&
6737                   name[4] == 'l')
6738               {                                   /* fcntl      */
6739                 return -KEY_fcntl;
6740               }
6741
6742               goto unknown;
6743
6744             case 'l':
6745               if (name[2] == 'o' &&
6746                   name[3] == 'c' &&
6747                   name[4] == 'k')
6748               {                                   /* flock      */
6749                 return -KEY_flock;
6750               }
6751
6752               goto unknown;
6753
6754             default:
6755               goto unknown;
6756           }
6757
6758         case 'i':
6759           switch (name[1])
6760           {
6761             case 'n':
6762               if (name[2] == 'd' &&
6763                   name[3] == 'e' &&
6764                   name[4] == 'x')
6765               {                                   /* index      */
6766                 return -KEY_index;
6767               }
6768
6769               goto unknown;
6770
6771             case 'o':
6772               if (name[2] == 'c' &&
6773                   name[3] == 't' &&
6774                   name[4] == 'l')
6775               {                                   /* ioctl      */
6776                 return -KEY_ioctl;
6777               }
6778
6779               goto unknown;
6780
6781             default:
6782               goto unknown;
6783           }
6784
6785         case 'l':
6786           switch (name[1])
6787           {
6788             case 'o':
6789               if (name[2] == 'c' &&
6790                   name[3] == 'a' &&
6791                   name[4] == 'l')
6792               {                                   /* local      */
6793                 return KEY_local;
6794               }
6795
6796               goto unknown;
6797
6798             case 's':
6799               if (name[2] == 't' &&
6800                   name[3] == 'a' &&
6801                   name[4] == 't')
6802               {                                   /* lstat      */
6803                 return -KEY_lstat;
6804               }
6805
6806               goto unknown;
6807
6808             default:
6809               goto unknown;
6810           }
6811
6812         case 'm':
6813           if (name[1] == 'k' &&
6814               name[2] == 'd' &&
6815               name[3] == 'i' &&
6816               name[4] == 'r')
6817           {                                       /* mkdir      */
6818             return -KEY_mkdir;
6819           }
6820
6821           goto unknown;
6822
6823         case 'p':
6824           if (name[1] == 'r' &&
6825               name[2] == 'i' &&
6826               name[3] == 'n' &&
6827               name[4] == 't')
6828           {                                       /* print      */
6829             return KEY_print;
6830           }
6831
6832           goto unknown;
6833
6834         case 'r':
6835           switch (name[1])
6836           {
6837             case 'e':
6838               if (name[2] == 's' &&
6839                   name[3] == 'e' &&
6840                   name[4] == 't')
6841               {                                   /* reset      */
6842                 return -KEY_reset;
6843               }
6844
6845               goto unknown;
6846
6847             case 'm':
6848               if (name[2] == 'd' &&
6849                   name[3] == 'i' &&
6850                   name[4] == 'r')
6851               {                                   /* rmdir      */
6852                 return -KEY_rmdir;
6853               }
6854
6855               goto unknown;
6856
6857             default:
6858               goto unknown;
6859           }
6860
6861         case 's':
6862           switch (name[1])
6863           {
6864             case 'e':
6865               if (name[2] == 'm' &&
6866                   name[3] == 'o' &&
6867                   name[4] == 'p')
6868               {                                   /* semop      */
6869                 return -KEY_semop;
6870               }
6871
6872               goto unknown;
6873
6874             case 'h':
6875               if (name[2] == 'i' &&
6876                   name[3] == 'f' &&
6877                   name[4] == 't')
6878               {                                   /* shift      */
6879                 return -KEY_shift;
6880               }
6881
6882               goto unknown;
6883
6884             case 'l':
6885               if (name[2] == 'e' &&
6886                   name[3] == 'e' &&
6887                   name[4] == 'p')
6888               {                                   /* sleep      */
6889                 return -KEY_sleep;
6890               }
6891
6892               goto unknown;
6893
6894             case 'p':
6895               if (name[2] == 'l' &&
6896                   name[3] == 'i' &&
6897                   name[4] == 't')
6898               {                                   /* split      */
6899                 return KEY_split;
6900               }
6901
6902               goto unknown;
6903
6904             case 'r':
6905               if (name[2] == 'a' &&
6906                   name[3] == 'n' &&
6907                   name[4] == 'd')
6908               {                                   /* srand      */
6909                 return -KEY_srand;
6910               }
6911
6912               goto unknown;
6913
6914             case 't':
6915               if (name[2] == 'u' &&
6916                   name[3] == 'd' &&
6917                   name[4] == 'y')
6918               {                                   /* study      */
6919                 return KEY_study;
6920               }
6921
6922               goto unknown;
6923
6924             default:
6925               goto unknown;
6926           }
6927
6928         case 't':
6929           if (name[1] == 'i' &&
6930               name[2] == 'm' &&
6931               name[3] == 'e' &&
6932               name[4] == 's')
6933           {                                       /* times      */
6934             return -KEY_times;
6935           }
6936
6937           goto unknown;
6938
6939         case 'u':
6940           switch (name[1])
6941           {
6942             case 'm':
6943               if (name[2] == 'a' &&
6944                   name[3] == 's' &&
6945                   name[4] == 'k')
6946               {                                   /* umask      */
6947                 return -KEY_umask;
6948               }
6949
6950               goto unknown;
6951
6952             case 'n':
6953               switch (name[2])
6954               {
6955                 case 'd':
6956                   if (name[3] == 'e' &&
6957                       name[4] == 'f')
6958                   {                               /* undef      */
6959                     return KEY_undef;
6960                   }
6961
6962                   goto unknown;
6963
6964                 case 't':
6965                   if (name[3] == 'i')
6966                   {
6967                     switch (name[4])
6968                     {
6969                       case 'e':
6970                         {                         /* untie      */
6971                           return KEY_untie;
6972                         }
6973
6974                       case 'l':
6975                         {                         /* until      */
6976                           return KEY_until;
6977                         }
6978
6979                       default:
6980                         goto unknown;
6981                     }
6982                   }
6983
6984                   goto unknown;
6985
6986                 default:
6987                   goto unknown;
6988               }
6989
6990             case 't':
6991               if (name[2] == 'i' &&
6992                   name[3] == 'm' &&
6993                   name[4] == 'e')
6994               {                                   /* utime      */
6995                 return -KEY_utime;
6996               }
6997
6998               goto unknown;
6999
7000             default:
7001               goto unknown;
7002           }
7003
7004         case 'w':
7005           switch (name[1])
7006           {
7007             case 'h':
7008               if (name[2] == 'i' &&
7009                   name[3] == 'l' &&
7010                   name[4] == 'e')
7011               {                                   /* while      */
7012                 return KEY_while;
7013               }
7014
7015               goto unknown;
7016
7017             case 'r':
7018               if (name[2] == 'i' &&
7019                   name[3] == 't' &&
7020                   name[4] == 'e')
7021               {                                   /* write      */
7022                 return -KEY_write;
7023               }
7024
7025               goto unknown;
7026
7027             default:
7028               goto unknown;
7029           }
7030
7031         default:
7032           goto unknown;
7033       }
7034
7035     case 6: /* 33 tokens of length 6 */
7036       switch (name[0])
7037       {
7038         case 'a':
7039           if (name[1] == 'c' &&
7040               name[2] == 'c' &&
7041               name[3] == 'e' &&
7042               name[4] == 'p' &&
7043               name[5] == 't')
7044           {                                       /* accept     */
7045             return -KEY_accept;
7046           }
7047
7048           goto unknown;
7049
7050         case 'c':
7051           switch (name[1])
7052           {
7053             case 'a':
7054               if (name[2] == 'l' &&
7055                   name[3] == 'l' &&
7056                   name[4] == 'e' &&
7057                   name[5] == 'r')
7058               {                                   /* caller     */
7059                 return -KEY_caller;
7060               }
7061
7062               goto unknown;
7063
7064             case 'h':
7065               if (name[2] == 'r' &&
7066                   name[3] == 'o' &&
7067                   name[4] == 'o' &&
7068                   name[5] == 't')
7069               {                                   /* chroot     */
7070                 return -KEY_chroot;
7071               }
7072
7073               goto unknown;
7074
7075             default:
7076               goto unknown;
7077           }
7078
7079         case 'd':
7080           if (name[1] == 'e' &&
7081               name[2] == 'l' &&
7082               name[3] == 'e' &&
7083               name[4] == 't' &&
7084               name[5] == 'e')
7085           {                                       /* delete     */
7086             return KEY_delete;
7087           }
7088
7089           goto unknown;
7090
7091         case 'e':
7092           switch (name[1])
7093           {
7094             case 'l':
7095               if (name[2] == 's' &&
7096                   name[3] == 'e' &&
7097                   name[4] == 'i' &&
7098                   name[5] == 'f')
7099               {                                   /* elseif     */
7100                 if(ckWARN_d(WARN_SYNTAX))
7101                   Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "elseif should be elsif");
7102               }
7103
7104               goto unknown;
7105
7106             case 'x':
7107               if (name[2] == 'i' &&
7108                   name[3] == 's' &&
7109                   name[4] == 't' &&
7110                   name[5] == 's')
7111               {                                   /* exists     */
7112                 return KEY_exists;
7113               }
7114
7115               goto unknown;
7116
7117             default:
7118               goto unknown;
7119           }
7120
7121         case 'f':
7122           switch (name[1])
7123           {
7124             case 'i':
7125               if (name[2] == 'l' &&
7126                   name[3] == 'e' &&
7127                   name[4] == 'n' &&
7128                   name[5] == 'o')
7129               {                                   /* fileno     */
7130                 return -KEY_fileno;
7131               }
7132
7133               goto unknown;
7134
7135             case 'o':
7136               if (name[2] == 'r' &&
7137                   name[3] == 'm' &&
7138                   name[4] == 'a' &&
7139                   name[5] == 't')
7140               {                                   /* format     */
7141                 return KEY_format;
7142               }
7143
7144               goto unknown;
7145
7146             default:
7147               goto unknown;
7148           }
7149
7150         case 'g':
7151           if (name[1] == 'm' &&
7152               name[2] == 't' &&
7153               name[3] == 'i' &&
7154               name[4] == 'm' &&
7155               name[5] == 'e')
7156           {                                       /* gmtime     */
7157             return -KEY_gmtime;
7158           }
7159
7160           goto unknown;
7161
7162         case 'l':
7163           switch (name[1])
7164           {
7165             case 'e':
7166               if (name[2] == 'n' &&
7167                   name[3] == 'g' &&
7168                   name[4] == 't' &&
7169                   name[5] == 'h')
7170               {                                   /* length     */
7171                 return -KEY_length;
7172               }
7173
7174               goto unknown;
7175
7176             case 'i':
7177               if (name[2] == 's' &&
7178                   name[3] == 't' &&
7179                   name[4] == 'e' &&
7180                   name[5] == 'n')
7181               {                                   /* listen     */
7182                 return -KEY_listen;
7183               }
7184
7185               goto unknown;
7186
7187             default:
7188               goto unknown;
7189           }
7190
7191         case 'm':
7192           if (name[1] == 's' &&
7193               name[2] == 'g')
7194           {
7195             switch (name[3])
7196             {
7197               case 'c':
7198                 if (name[4] == 't' &&
7199                     name[5] == 'l')
7200                 {                                 /* msgctl     */
7201                   return -KEY_msgctl;
7202                 }
7203
7204                 goto unknown;
7205
7206               case 'g':
7207                 if (name[4] == 'e' &&
7208                     name[5] == 't')
7209                 {                                 /* msgget     */
7210                   return -KEY_msgget;
7211                 }
7212
7213                 goto unknown;
7214
7215               case 'r':
7216                 if (name[4] == 'c' &&
7217                     name[5] == 'v')
7218                 {                                 /* msgrcv     */
7219                   return -KEY_msgrcv;
7220                 }
7221
7222                 goto unknown;
7223
7224               case 's':
7225                 if (name[4] == 'n' &&
7226                     name[5] == 'd')
7227                 {                                 /* msgsnd     */
7228                   return -KEY_msgsnd;
7229                 }
7230
7231                 goto unknown;
7232
7233               default:
7234                 goto unknown;
7235             }
7236           }
7237
7238           goto unknown;
7239
7240         case 'p':
7241           if (name[1] == 'r' &&
7242               name[2] == 'i' &&
7243               name[3] == 'n' &&
7244               name[4] == 't' &&
7245               name[5] == 'f')
7246           {                                       /* printf     */
7247             return KEY_printf;
7248           }
7249
7250           goto unknown;
7251
7252         case 'r':
7253           switch (name[1])
7254           {
7255             case 'e':
7256               switch (name[2])
7257               {
7258                 case 'n':
7259                   if (name[3] == 'a' &&
7260                       name[4] == 'm' &&
7261                       name[5] == 'e')
7262                   {                               /* rename     */
7263                     return -KEY_rename;
7264                   }
7265
7266                   goto unknown;
7267
7268                 case 't':
7269                   if (name[3] == 'u' &&
7270                       name[4] == 'r' &&
7271                       name[5] == 'n')
7272                   {                               /* return     */
7273                     return KEY_return;
7274                   }
7275
7276                   goto unknown;
7277
7278                 default:
7279                   goto unknown;
7280               }
7281
7282             case 'i':
7283               if (name[2] == 'n' &&
7284                   name[3] == 'd' &&
7285                   name[4] == 'e' &&
7286                   name[5] == 'x')
7287               {                                   /* rindex     */
7288                 return -KEY_rindex;
7289               }
7290
7291               goto unknown;
7292
7293             default:
7294               goto unknown;
7295           }
7296
7297         case 's':
7298           switch (name[1])
7299           {
7300             case 'c':
7301               if (name[2] == 'a' &&
7302                   name[3] == 'l' &&
7303                   name[4] == 'a' &&
7304                   name[5] == 'r')
7305               {                                   /* scalar     */
7306                 return KEY_scalar;
7307               }
7308
7309               goto unknown;
7310
7311             case 'e':
7312               switch (name[2])
7313               {
7314                 case 'l':
7315                   if (name[3] == 'e' &&
7316                       name[4] == 'c' &&
7317                       name[5] == 't')
7318                   {                               /* select     */
7319                     return -KEY_select;
7320                   }
7321
7322                   goto unknown;
7323
7324                 case 'm':
7325                   switch (name[3])
7326                   {
7327                     case 'c':
7328                       if (name[4] == 't' &&
7329                           name[5] == 'l')
7330                       {                           /* semctl     */
7331                         return -KEY_semctl;
7332                       }
7333
7334                       goto unknown;
7335
7336                     case 'g':
7337                       if (name[4] == 'e' &&
7338                           name[5] == 't')
7339                       {                           /* semget     */
7340                         return -KEY_semget;
7341                       }
7342
7343                       goto unknown;
7344
7345                     default:
7346                       goto unknown;
7347                   }
7348
7349                 default:
7350                   goto unknown;
7351               }
7352
7353             case 'h':
7354               if (name[2] == 'm')
7355               {
7356                 switch (name[3])
7357                 {
7358                   case 'c':
7359                     if (name[4] == 't' &&
7360                         name[5] == 'l')
7361                     {                             /* shmctl     */
7362                       return -KEY_shmctl;
7363                     }
7364
7365                     goto unknown;
7366
7367                   case 'g':
7368                     if (name[4] == 'e' &&
7369                         name[5] == 't')
7370                     {                             /* shmget     */
7371                       return -KEY_shmget;
7372                     }
7373
7374                     goto unknown;
7375
7376                   default:
7377                     goto unknown;
7378                 }
7379               }
7380
7381               goto unknown;
7382
7383             case 'o':
7384               if (name[2] == 'c' &&
7385                   name[3] == 'k' &&
7386                   name[4] == 'e' &&
7387                   name[5] == 't')
7388               {                                   /* socket     */
7389                 return -KEY_socket;
7390               }
7391
7392               goto unknown;
7393
7394             case 'p':
7395               if (name[2] == 'l' &&
7396                   name[3] == 'i' &&
7397                   name[4] == 'c' &&
7398                   name[5] == 'e')
7399               {                                   /* splice     */
7400                 return -KEY_splice;
7401               }
7402
7403               goto unknown;
7404
7405             case 'u':
7406               if (name[2] == 'b' &&
7407                   name[3] == 's' &&
7408                   name[4] == 't' &&
7409                   name[5] == 'r')
7410               {                                   /* substr     */
7411                 return -KEY_substr;
7412               }
7413
7414               goto unknown;
7415
7416             case 'y':
7417               if (name[2] == 's' &&
7418                   name[3] == 't' &&
7419                   name[4] == 'e' &&
7420                   name[5] == 'm')
7421               {                                   /* system     */
7422                 return -KEY_system;
7423               }
7424
7425               goto unknown;
7426
7427             default:
7428               goto unknown;
7429           }
7430
7431         case 'u':
7432           if (name[1] == 'n')
7433           {
7434             switch (name[2])
7435             {
7436               case 'l':
7437                 switch (name[3])
7438                 {
7439                   case 'e':
7440                     if (name[4] == 's' &&
7441                         name[5] == 's')
7442                     {                             /* unless     */
7443                       return KEY_unless;
7444                     }
7445
7446                     goto unknown;
7447
7448                   case 'i':
7449                     if (name[4] == 'n' &&
7450                         name[5] == 'k')
7451                     {                             /* unlink     */
7452                       return -KEY_unlink;
7453                     }
7454
7455                     goto unknown;
7456
7457                   default:
7458                     goto unknown;
7459                 }
7460
7461               case 'p':
7462                 if (name[3] == 'a' &&
7463                     name[4] == 'c' &&
7464                     name[5] == 'k')
7465                 {                                 /* unpack     */
7466                   return -KEY_unpack;
7467                 }
7468
7469                 goto unknown;
7470
7471               default:
7472                 goto unknown;
7473             }
7474           }
7475
7476           goto unknown;
7477
7478         case 'v':
7479           if (name[1] == 'a' &&
7480               name[2] == 'l' &&
7481               name[3] == 'u' &&
7482               name[4] == 'e' &&
7483               name[5] == 's')
7484           {                                       /* values     */
7485             return -KEY_values;
7486           }
7487
7488           goto unknown;
7489
7490         default:
7491           goto unknown;
7492       }
7493
7494     case 7: /* 28 tokens of length 7 */
7495       switch (name[0])
7496       {
7497         case 'D':
7498           if (name[1] == 'E' &&
7499               name[2] == 'S' &&
7500               name[3] == 'T' &&
7501               name[4] == 'R' &&
7502               name[5] == 'O' &&
7503               name[6] == 'Y')
7504           {                                       /* DESTROY    */
7505             return KEY_DESTROY;
7506           }
7507
7508           goto unknown;
7509
7510         case '_':
7511           if (name[1] == '_' &&
7512               name[2] == 'E' &&
7513               name[3] == 'N' &&
7514               name[4] == 'D' &&
7515               name[5] == '_' &&
7516               name[6] == '_')
7517           {                                       /* __END__    */
7518             return KEY___END__;
7519           }
7520
7521           goto unknown;
7522
7523         case 'b':
7524           if (name[1] == 'i' &&
7525               name[2] == 'n' &&
7526               name[3] == 'm' &&
7527               name[4] == 'o' &&
7528               name[5] == 'd' &&
7529               name[6] == 'e')
7530           {                                       /* binmode    */
7531             return -KEY_binmode;
7532           }
7533
7534           goto unknown;
7535
7536         case 'c':
7537           if (name[1] == 'o' &&
7538               name[2] == 'n' &&
7539               name[3] == 'n' &&
7540               name[4] == 'e' &&
7541               name[5] == 'c' &&
7542               name[6] == 't')
7543           {                                       /* connect    */
7544             return -KEY_connect;
7545           }
7546
7547           goto unknown;
7548
7549         case 'd':
7550           switch (name[1])
7551           {
7552             case 'b':
7553               if (name[2] == 'm' &&
7554                   name[3] == 'o' &&
7555                   name[4] == 'p' &&
7556                   name[5] == 'e' &&
7557                   name[6] == 'n')
7558               {                                   /* dbmopen    */
7559                 return -KEY_dbmopen;
7560               }
7561
7562               goto unknown;
7563
7564             case 'e':
7565               if (name[2] == 'f' &&
7566                   name[3] == 'i' &&
7567                   name[4] == 'n' &&
7568                   name[5] == 'e' &&
7569                   name[6] == 'd')
7570               {                                   /* defined    */
7571                 return KEY_defined;
7572               }
7573
7574               goto unknown;
7575
7576             default:
7577               goto unknown;
7578           }
7579
7580         case 'f':
7581           if (name[1] == 'o' &&
7582               name[2] == 'r' &&
7583               name[3] == 'e' &&
7584               name[4] == 'a' &&
7585               name[5] == 'c' &&
7586               name[6] == 'h')
7587           {                                       /* foreach    */
7588             return KEY_foreach;
7589           }
7590
7591           goto unknown;
7592
7593         case 'g':
7594           if (name[1] == 'e' &&
7595               name[2] == 't' &&
7596               name[3] == 'p')
7597           {
7598             switch (name[4])
7599             {
7600               case 'g':
7601                 if (name[5] == 'r' &&
7602                     name[6] == 'p')
7603                 {                                 /* getpgrp    */
7604                   return -KEY_getpgrp;
7605                 }
7606
7607                 goto unknown;
7608
7609               case 'p':
7610                 if (name[5] == 'i' &&
7611                     name[6] == 'd')
7612                 {                                 /* getppid    */
7613                   return -KEY_getppid;
7614                 }
7615
7616                 goto unknown;
7617
7618               default:
7619                 goto unknown;
7620             }
7621           }
7622
7623           goto unknown;
7624
7625         case 'l':
7626           if (name[1] == 'c' &&
7627               name[2] == 'f' &&
7628               name[3] == 'i' &&
7629               name[4] == 'r' &&
7630               name[5] == 's' &&
7631               name[6] == 't')
7632           {                                       /* lcfirst    */
7633             return -KEY_lcfirst;
7634           }
7635
7636           goto unknown;
7637
7638         case 'o':
7639           if (name[1] == 'p' &&
7640               name[2] == 'e' &&
7641               name[3] == 'n' &&
7642               name[4] == 'd' &&
7643               name[5] == 'i' &&
7644               name[6] == 'r')
7645           {                                       /* opendir    */
7646             return -KEY_opendir;
7647           }
7648
7649           goto unknown;
7650
7651         case 'p':
7652           if (name[1] == 'a' &&
7653               name[2] == 'c' &&
7654               name[3] == 'k' &&
7655               name[4] == 'a' &&
7656               name[5] == 'g' &&
7657               name[6] == 'e')
7658           {                                       /* package    */
7659             return KEY_package;
7660           }
7661
7662           goto unknown;
7663
7664         case 'r':
7665           if (name[1] == 'e')
7666           {
7667             switch (name[2])
7668             {
7669               case 'a':
7670                 if (name[3] == 'd' &&
7671                     name[4] == 'd' &&
7672                     name[5] == 'i' &&
7673                     name[6] == 'r')
7674                 {                                 /* readdir    */
7675                   return -KEY_readdir;
7676                 }
7677
7678                 goto unknown;
7679
7680               case 'q':
7681                 if (name[3] == 'u' &&
7682                     name[4] == 'i' &&
7683                     name[5] == 'r' &&
7684                     name[6] == 'e')
7685                 {                                 /* require    */
7686                   return KEY_require;
7687                 }
7688
7689                 goto unknown;
7690
7691               case 'v':
7692                 if (name[3] == 'e' &&
7693                     name[4] == 'r' &&
7694                     name[5] == 's' &&
7695                     name[6] == 'e')
7696                 {                                 /* reverse    */
7697                   return -KEY_reverse;
7698                 }
7699
7700                 goto unknown;
7701
7702               default:
7703                 goto unknown;
7704             }
7705           }
7706
7707           goto unknown;
7708
7709         case 's':
7710           switch (name[1])
7711           {
7712             case 'e':
7713               switch (name[2])
7714               {
7715                 case 'e':
7716                   if (name[3] == 'k' &&
7717                       name[4] == 'd' &&
7718                       name[5] == 'i' &&
7719                       name[6] == 'r')
7720                   {                               /* seekdir    */
7721                     return -KEY_seekdir;
7722                   }
7723
7724                   goto unknown;
7725
7726                 case 't':
7727                   if (name[3] == 'p' &&
7728                       name[4] == 'g' &&
7729                       name[5] == 'r' &&
7730                       name[6] == 'p')
7731                   {                               /* setpgrp    */
7732                     return -KEY_setpgrp;
7733                   }
7734
7735                   goto unknown;
7736
7737                 default:
7738                   goto unknown;
7739               }
7740
7741             case 'h':
7742               if (name[2] == 'm' &&
7743                   name[3] == 'r' &&
7744                   name[4] == 'e' &&
7745                   name[5] == 'a' &&
7746                   name[6] == 'd')
7747               {                                   /* shmread    */
7748                 return -KEY_shmread;
7749               }
7750
7751               goto unknown;
7752
7753             case 'p':
7754               if (name[2] == 'r' &&
7755                   name[3] == 'i' &&
7756                   name[4] == 'n' &&
7757                   name[5] == 't' &&
7758                   name[6] == 'f')
7759               {                                   /* sprintf    */
7760                 return -KEY_sprintf;
7761               }
7762
7763               goto unknown;
7764
7765             case 'y':
7766               switch (name[2])
7767               {
7768                 case 'm':
7769                   if (name[3] == 'l' &&
7770                       name[4] == 'i' &&
7771                       name[5] == 'n' &&
7772                       name[6] == 'k')
7773                   {                               /* symlink    */
7774                     return -KEY_symlink;
7775                   }
7776
7777                   goto unknown;
7778
7779                 case 's':
7780                   switch (name[3])
7781                   {
7782                     case 'c':
7783                       if (name[4] == 'a' &&
7784                           name[5] == 'l' &&
7785                           name[6] == 'l')
7786                       {                           /* syscall    */
7787                         return -KEY_syscall;
7788                       }
7789
7790                       goto unknown;
7791
7792                     case 'o':
7793                       if (name[4] == 'p' &&
7794                           name[5] == 'e' &&
7795                           name[6] == 'n')
7796                       {                           /* sysopen    */
7797                         return -KEY_sysopen;
7798                       }
7799
7800                       goto unknown;
7801
7802                     case 'r':
7803                       if (name[4] == 'e' &&
7804                           name[5] == 'a' &&
7805                           name[6] == 'd')
7806                       {                           /* sysread    */
7807                         return -KEY_sysread;
7808                       }
7809
7810                       goto unknown;
7811
7812                     case 's':
7813                       if (name[4] == 'e' &&
7814                           name[5] == 'e' &&
7815                           name[6] == 'k')
7816                       {                           /* sysseek    */
7817                         return -KEY_sysseek;
7818                       }
7819
7820                       goto unknown;
7821
7822                     default:
7823                       goto unknown;
7824                   }
7825
7826                 default:
7827                   goto unknown;
7828               }
7829
7830             default:
7831               goto unknown;
7832           }
7833
7834         case 't':
7835           if (name[1] == 'e' &&
7836               name[2] == 'l' &&
7837               name[3] == 'l' &&
7838               name[4] == 'd' &&
7839               name[5] == 'i' &&
7840               name[6] == 'r')
7841           {                                       /* telldir    */
7842             return -KEY_telldir;
7843           }
7844
7845           goto unknown;
7846
7847         case 'u':
7848           switch (name[1])
7849           {
7850             case 'c':
7851               if (name[2] == 'f' &&
7852                   name[3] == 'i' &&
7853                   name[4] == 'r' &&
7854                   name[5] == 's' &&
7855                   name[6] == 't')
7856               {                                   /* ucfirst    */
7857                 return -KEY_ucfirst;
7858               }
7859
7860               goto unknown;
7861
7862             case 'n':
7863               if (name[2] == 's' &&
7864                   name[3] == 'h' &&
7865                   name[4] == 'i' &&
7866                   name[5] == 'f' &&
7867                   name[6] == 't')
7868               {                                   /* unshift    */
7869                 return -KEY_unshift;
7870               }
7871
7872               goto unknown;
7873
7874             default:
7875               goto unknown;
7876           }
7877
7878         case 'w':
7879           if (name[1] == 'a' &&
7880               name[2] == 'i' &&
7881               name[3] == 't' &&
7882               name[4] == 'p' &&
7883               name[5] == 'i' &&
7884               name[6] == 'd')
7885           {                                       /* waitpid    */
7886             return -KEY_waitpid;
7887           }
7888
7889           goto unknown;
7890
7891         default:
7892           goto unknown;
7893       }
7894
7895     case 8: /* 26 tokens of length 8 */
7896       switch (name[0])
7897       {
7898         case 'A':
7899           if (name[1] == 'U' &&
7900               name[2] == 'T' &&
7901               name[3] == 'O' &&
7902               name[4] == 'L' &&
7903               name[5] == 'O' &&
7904               name[6] == 'A' &&
7905               name[7] == 'D')
7906           {                                       /* AUTOLOAD   */
7907             return KEY_AUTOLOAD;
7908           }
7909
7910           goto unknown;
7911
7912         case '_':
7913           if (name[1] == '_')
7914           {
7915             switch (name[2])
7916             {
7917               case 'D':
7918                 if (name[3] == 'A' &&
7919                     name[4] == 'T' &&
7920                     name[5] == 'A' &&
7921                     name[6] == '_' &&
7922                     name[7] == '_')
7923                 {                                 /* __DATA__   */
7924                   return KEY___DATA__;
7925                 }
7926
7927                 goto unknown;
7928
7929               case 'F':
7930                 if (name[3] == 'I' &&
7931                     name[4] == 'L' &&
7932                     name[5] == 'E' &&
7933                     name[6] == '_' &&
7934                     name[7] == '_')
7935                 {                                 /* __FILE__   */
7936                   return -KEY___FILE__;
7937                 }
7938
7939                 goto unknown;
7940
7941               case 'L':
7942                 if (name[3] == 'I' &&
7943                     name[4] == 'N' &&
7944                     name[5] == 'E' &&
7945                     name[6] == '_' &&
7946                     name[7] == '_')
7947                 {                                 /* __LINE__   */
7948                   return -KEY___LINE__;
7949                 }
7950
7951                 goto unknown;
7952
7953               default:
7954                 goto unknown;
7955             }
7956           }
7957
7958           goto unknown;
7959
7960         case 'c':
7961           switch (name[1])
7962           {
7963             case 'l':
7964               if (name[2] == 'o' &&
7965                   name[3] == 's' &&
7966                   name[4] == 'e' &&
7967                   name[5] == 'd' &&
7968                   name[6] == 'i' &&
7969                   name[7] == 'r')
7970               {                                   /* closedir   */
7971                 return -KEY_closedir;
7972               }
7973
7974               goto unknown;
7975
7976             case 'o':
7977               if (name[2] == 'n' &&
7978                   name[3] == 't' &&
7979                   name[4] == 'i' &&
7980                   name[5] == 'n' &&
7981                   name[6] == 'u' &&
7982                   name[7] == 'e')
7983               {                                   /* continue   */
7984                 return -KEY_continue;
7985               }
7986
7987               goto unknown;
7988
7989             default:
7990               goto unknown;
7991           }
7992
7993         case 'd':
7994           if (name[1] == 'b' &&
7995               name[2] == 'm' &&
7996               name[3] == 'c' &&
7997               name[4] == 'l' &&
7998               name[5] == 'o' &&
7999               name[6] == 's' &&
8000               name[7] == 'e')
8001           {                                       /* dbmclose   */
8002             return -KEY_dbmclose;
8003           }
8004
8005           goto unknown;
8006
8007         case 'e':
8008           if (name[1] == 'n' &&
8009               name[2] == 'd')
8010           {
8011             switch (name[3])
8012             {
8013               case 'g':
8014                 if (name[4] == 'r' &&
8015                     name[5] == 'e' &&
8016                     name[6] == 'n' &&
8017                     name[7] == 't')
8018                 {                                 /* endgrent   */
8019                   return -KEY_endgrent;
8020                 }
8021
8022                 goto unknown;
8023
8024               case 'p':
8025                 if (name[4] == 'w' &&
8026                     name[5] == 'e' &&
8027                     name[6] == 'n' &&
8028                     name[7] == 't')
8029                 {                                 /* endpwent   */
8030                   return -KEY_endpwent;
8031                 }
8032
8033                 goto unknown;
8034
8035               default:
8036                 goto unknown;
8037             }
8038           }
8039
8040           goto unknown;
8041
8042         case 'f':
8043           if (name[1] == 'o' &&
8044               name[2] == 'r' &&
8045               name[3] == 'm' &&
8046               name[4] == 'l' &&
8047               name[5] == 'i' &&
8048               name[6] == 'n' &&
8049               name[7] == 'e')
8050           {                                       /* formline   */
8051             return -KEY_formline;
8052           }
8053
8054           goto unknown;
8055
8056         case 'g':
8057           if (name[1] == 'e' &&
8058               name[2] == 't')
8059           {
8060             switch (name[3])
8061             {
8062               case 'g':
8063                 if (name[4] == 'r')
8064                 {
8065                   switch (name[5])
8066                   {
8067                     case 'e':
8068                       if (name[6] == 'n' &&
8069                           name[7] == 't')
8070                       {                           /* getgrent   */
8071                         return -KEY_getgrent;
8072                       }
8073
8074                       goto unknown;
8075
8076                     case 'g':
8077                       if (name[6] == 'i' &&
8078                           name[7] == 'd')
8079                       {                           /* getgrgid   */
8080                         return -KEY_getgrgid;
8081                       }
8082
8083                       goto unknown;
8084
8085                     case 'n':
8086                       if (name[6] == 'a' &&
8087                           name[7] == 'm')
8088                       {                           /* getgrnam   */
8089                         return -KEY_getgrnam;
8090                       }
8091
8092                       goto unknown;
8093
8094                     default:
8095                       goto unknown;
8096                   }
8097                 }
8098
8099                 goto unknown;
8100
8101               case 'l':
8102                 if (name[4] == 'o' &&
8103                     name[5] == 'g' &&
8104                     name[6] == 'i' &&
8105                     name[7] == 'n')
8106                 {                                 /* getlogin   */
8107                   return -KEY_getlogin;
8108                 }
8109
8110                 goto unknown;
8111
8112               case 'p':
8113                 if (name[4] == 'w')
8114                 {
8115                   switch (name[5])
8116                   {
8117                     case 'e':
8118                       if (name[6] == 'n' &&
8119                           name[7] == 't')
8120                       {                           /* getpwent   */
8121                         return -KEY_getpwent;
8122                       }
8123
8124                       goto unknown;
8125
8126                     case 'n':
8127                       if (name[6] == 'a' &&
8128                           name[7] == 'm')
8129                       {                           /* getpwnam   */
8130                         return -KEY_getpwnam;
8131                       }
8132
8133                       goto unknown;
8134
8135                     case 'u':
8136                       if (name[6] == 'i' &&
8137                           name[7] == 'd')
8138                       {                           /* getpwuid   */
8139                         return -KEY_getpwuid;
8140                       }
8141
8142                       goto unknown;
8143
8144                     default:
8145                       goto unknown;
8146                   }
8147                 }
8148
8149                 goto unknown;
8150
8151               default:
8152                 goto unknown;
8153             }
8154           }
8155
8156           goto unknown;
8157
8158         case 'r':
8159           if (name[1] == 'e' &&
8160               name[2] == 'a' &&
8161               name[3] == 'd')
8162           {
8163             switch (name[4])
8164             {
8165               case 'l':
8166                 if (name[5] == 'i' &&
8167                     name[6] == 'n')
8168                 {
8169                   switch (name[7])
8170                   {
8171                     case 'e':
8172                       {                           /* readline   */
8173                         return -KEY_readline;
8174                       }
8175
8176                     case 'k':
8177                       {                           /* readlink   */
8178                         return -KEY_readlink;
8179                       }
8180
8181                     default:
8182                       goto unknown;
8183                   }
8184                 }
8185
8186                 goto unknown;
8187
8188               case 'p':
8189                 if (name[5] == 'i' &&
8190                     name[6] == 'p' &&
8191                     name[7] == 'e')
8192                 {                                 /* readpipe   */
8193                   return -KEY_readpipe;
8194                 }
8195
8196                 goto unknown;
8197
8198               default:
8199                 goto unknown;
8200             }
8201           }
8202
8203           goto unknown;
8204
8205         case 's':
8206           switch (name[1])
8207           {
8208             case 'e':
8209               if (name[2] == 't')
8210               {
8211                 switch (name[3])
8212                 {
8213                   case 'g':
8214                     if (name[4] == 'r' &&
8215                         name[5] == 'e' &&
8216                         name[6] == 'n' &&
8217                         name[7] == 't')
8218                     {                             /* setgrent   */
8219                       return -KEY_setgrent;
8220                     }
8221
8222                     goto unknown;
8223
8224                   case 'p':
8225                     if (name[4] == 'w' &&
8226                         name[5] == 'e' &&
8227                         name[6] == 'n' &&
8228                         name[7] == 't')
8229                     {                             /* setpwent   */
8230                       return -KEY_setpwent;
8231                     }
8232
8233                     goto unknown;
8234
8235                   default:
8236                     goto unknown;
8237                 }
8238               }
8239
8240               goto unknown;
8241
8242             case 'h':
8243               switch (name[2])
8244               {
8245                 case 'm':
8246                   if (name[3] == 'w' &&
8247                       name[4] == 'r' &&
8248                       name[5] == 'i' &&
8249                       name[6] == 't' &&
8250                       name[7] == 'e')
8251                   {                               /* shmwrite   */
8252                     return -KEY_shmwrite;
8253                   }
8254
8255                   goto unknown;
8256
8257                 case 'u':
8258                   if (name[3] == 't' &&
8259                       name[4] == 'd' &&
8260                       name[5] == 'o' &&
8261                       name[6] == 'w' &&
8262                       name[7] == 'n')
8263                   {                               /* shutdown   */
8264                     return -KEY_shutdown;
8265                   }
8266
8267                   goto unknown;
8268
8269                 default:
8270                   goto unknown;
8271               }
8272
8273             case 'y':
8274               if (name[2] == 's' &&
8275                   name[3] == 'w' &&
8276                   name[4] == 'r' &&
8277                   name[5] == 'i' &&
8278                   name[6] == 't' &&
8279                   name[7] == 'e')
8280               {                                   /* syswrite   */
8281                 return -KEY_syswrite;
8282               }
8283
8284               goto unknown;
8285
8286             default:
8287               goto unknown;
8288           }
8289
8290         case 't':
8291           if (name[1] == 'r' &&
8292               name[2] == 'u' &&
8293               name[3] == 'n' &&
8294               name[4] == 'c' &&
8295               name[5] == 'a' &&
8296               name[6] == 't' &&
8297               name[7] == 'e')
8298           {                                       /* truncate   */
8299             return -KEY_truncate;
8300           }
8301
8302           goto unknown;
8303
8304         default:
8305           goto unknown;
8306       }
8307
8308     case 9: /* 8 tokens of length 9 */
8309       switch (name[0])
8310       {
8311         case 'e':
8312           if (name[1] == 'n' &&
8313               name[2] == 'd' &&
8314               name[3] == 'n' &&
8315               name[4] == 'e' &&
8316               name[5] == 't' &&
8317               name[6] == 'e' &&
8318               name[7] == 'n' &&
8319               name[8] == 't')
8320           {                                       /* endnetent  */
8321             return -KEY_endnetent;
8322           }
8323
8324           goto unknown;
8325
8326         case 'g':
8327           if (name[1] == 'e' &&
8328               name[2] == 't' &&
8329               name[3] == 'n' &&
8330               name[4] == 'e' &&
8331               name[5] == 't' &&
8332               name[6] == 'e' &&
8333               name[7] == 'n' &&
8334               name[8] == 't')
8335           {                                       /* getnetent  */
8336             return -KEY_getnetent;
8337           }
8338
8339           goto unknown;
8340
8341         case 'l':
8342           if (name[1] == 'o' &&
8343               name[2] == 'c' &&
8344               name[3] == 'a' &&
8345               name[4] == 'l' &&
8346               name[5] == 't' &&
8347               name[6] == 'i' &&
8348               name[7] == 'm' &&
8349               name[8] == 'e')
8350           {                                       /* localtime  */
8351             return -KEY_localtime;
8352           }
8353
8354           goto unknown;
8355
8356         case 'p':
8357           if (name[1] == 'r' &&
8358               name[2] == 'o' &&
8359               name[3] == 't' &&
8360               name[4] == 'o' &&
8361               name[5] == 't' &&
8362               name[6] == 'y' &&
8363               name[7] == 'p' &&
8364               name[8] == 'e')
8365           {                                       /* prototype  */
8366             return KEY_prototype;
8367           }
8368
8369           goto unknown;
8370
8371         case 'q':
8372           if (name[1] == 'u' &&
8373               name[2] == 'o' &&
8374               name[3] == 't' &&
8375               name[4] == 'e' &&
8376               name[5] == 'm' &&
8377               name[6] == 'e' &&
8378               name[7] == 't' &&
8379               name[8] == 'a')
8380           {                                       /* quotemeta  */
8381             return -KEY_quotemeta;
8382           }
8383
8384           goto unknown;
8385
8386         case 'r':
8387           if (name[1] == 'e' &&
8388               name[2] == 'w' &&
8389               name[3] == 'i' &&
8390               name[4] == 'n' &&
8391               name[5] == 'd' &&
8392               name[6] == 'd' &&
8393               name[7] == 'i' &&
8394               name[8] == 'r')
8395           {                                       /* rewinddir  */
8396             return -KEY_rewinddir;
8397           }
8398
8399           goto unknown;
8400
8401         case 's':
8402           if (name[1] == 'e' &&
8403               name[2] == 't' &&
8404               name[3] == 'n' &&
8405               name[4] == 'e' &&
8406               name[5] == 't' &&
8407               name[6] == 'e' &&
8408               name[7] == 'n' &&
8409               name[8] == 't')
8410           {                                       /* setnetent  */
8411             return -KEY_setnetent;
8412           }
8413
8414           goto unknown;
8415
8416         case 'w':
8417           if (name[1] == 'a' &&
8418               name[2] == 'n' &&
8419               name[3] == 't' &&
8420               name[4] == 'a' &&
8421               name[5] == 'r' &&
8422               name[6] == 'r' &&
8423               name[7] == 'a' &&
8424               name[8] == 'y')
8425           {                                       /* wantarray  */
8426             return -KEY_wantarray;
8427           }
8428
8429           goto unknown;
8430
8431         default:
8432           goto unknown;
8433       }
8434
8435     case 10: /* 9 tokens of length 10 */
8436       switch (name[0])
8437       {
8438         case 'e':
8439           if (name[1] == 'n' &&
8440               name[2] == 'd')
8441           {
8442             switch (name[3])
8443             {
8444               case 'h':
8445                 if (name[4] == 'o' &&
8446                     name[5] == 's' &&
8447                     name[6] == 't' &&
8448                     name[7] == 'e' &&
8449                     name[8] == 'n' &&
8450                     name[9] == 't')
8451                 {                                 /* endhostent */
8452                   return -KEY_endhostent;
8453                 }
8454
8455                 goto unknown;
8456
8457               case 's':
8458                 if (name[4] == 'e' &&
8459                     name[5] == 'r' &&
8460                     name[6] == 'v' &&
8461                     name[7] == 'e' &&
8462                     name[8] == 'n' &&
8463                     name[9] == 't')
8464                 {                                 /* endservent */
8465                   return -KEY_endservent;
8466                 }
8467
8468                 goto unknown;
8469
8470               default:
8471                 goto unknown;
8472             }
8473           }
8474
8475           goto unknown;
8476
8477         case 'g':
8478           if (name[1] == 'e' &&
8479               name[2] == 't')
8480           {
8481             switch (name[3])
8482             {
8483               case 'h':
8484                 if (name[4] == 'o' &&
8485                     name[5] == 's' &&
8486                     name[6] == 't' &&
8487                     name[7] == 'e' &&
8488                     name[8] == 'n' &&
8489                     name[9] == 't')
8490                 {                                 /* gethostent */
8491                   return -KEY_gethostent;
8492                 }
8493
8494                 goto unknown;
8495
8496               case 's':
8497                 switch (name[4])
8498                 {
8499                   case 'e':
8500                     if (name[5] == 'r' &&
8501                         name[6] == 'v' &&
8502                         name[7] == 'e' &&
8503                         name[8] == 'n' &&
8504                         name[9] == 't')
8505                     {                             /* getservent */
8506                       return -KEY_getservent;
8507                     }
8508
8509                     goto unknown;
8510
8511                   case 'o':
8512                     if (name[5] == 'c' &&
8513                         name[6] == 'k' &&
8514                         name[7] == 'o' &&
8515                         name[8] == 'p' &&
8516                         name[9] == 't')
8517                     {                             /* getsockopt */
8518                       return -KEY_getsockopt;
8519                     }
8520
8521                     goto unknown;
8522
8523                   default:
8524                     goto unknown;
8525                 }
8526
8527               default:
8528                 goto unknown;
8529             }
8530           }
8531
8532           goto unknown;
8533
8534         case 's':
8535           switch (name[1])
8536           {
8537             case 'e':
8538               if (name[2] == 't')
8539               {
8540                 switch (name[3])
8541                 {
8542                   case 'h':
8543                     if (name[4] == 'o' &&
8544                         name[5] == 's' &&
8545                         name[6] == 't' &&
8546                         name[7] == 'e' &&
8547                         name[8] == 'n' &&
8548                         name[9] == 't')
8549                     {                             /* sethostent */
8550                       return -KEY_sethostent;
8551                     }
8552
8553                     goto unknown;
8554
8555                   case 's':
8556                     switch (name[4])
8557                     {
8558                       case 'e':
8559                         if (name[5] == 'r' &&
8560                             name[6] == 'v' &&
8561                             name[7] == 'e' &&
8562                             name[8] == 'n' &&
8563                             name[9] == 't')
8564                         {                         /* setservent */
8565                           return -KEY_setservent;
8566                         }
8567
8568                         goto unknown;
8569
8570                       case 'o':
8571                         if (name[5] == 'c' &&
8572                             name[6] == 'k' &&
8573                             name[7] == 'o' &&
8574                             name[8] == 'p' &&
8575                             name[9] == 't')
8576                         {                         /* setsockopt */
8577                           return -KEY_setsockopt;
8578                         }
8579
8580                         goto unknown;
8581
8582                       default:
8583                         goto unknown;
8584                     }
8585
8586                   default:
8587                     goto unknown;
8588                 }
8589               }
8590
8591               goto unknown;
8592
8593             case 'o':
8594               if (name[2] == 'c' &&
8595                   name[3] == 'k' &&
8596                   name[4] == 'e' &&
8597                   name[5] == 't' &&
8598                   name[6] == 'p' &&
8599                   name[7] == 'a' &&
8600                   name[8] == 'i' &&
8601                   name[9] == 'r')
8602               {                                   /* socketpair */
8603                 return -KEY_socketpair;
8604               }
8605
8606               goto unknown;
8607
8608             default:
8609               goto unknown;
8610           }
8611
8612         default:
8613           goto unknown;
8614       }
8615
8616     case 11: /* 8 tokens of length 11 */
8617       switch (name[0])
8618       {
8619         case '_':
8620           if (name[1] == '_' &&
8621               name[2] == 'P' &&
8622               name[3] == 'A' &&
8623               name[4] == 'C' &&
8624               name[5] == 'K' &&
8625               name[6] == 'A' &&
8626               name[7] == 'G' &&
8627               name[8] == 'E' &&
8628               name[9] == '_' &&
8629               name[10] == '_')
8630           {                                       /* __PACKAGE__ */
8631             return -KEY___PACKAGE__;
8632           }
8633
8634           goto unknown;
8635
8636         case 'e':
8637           if (name[1] == 'n' &&
8638               name[2] == 'd' &&
8639               name[3] == 'p' &&
8640               name[4] == 'r' &&
8641               name[5] == 'o' &&
8642               name[6] == 't' &&
8643               name[7] == 'o' &&
8644               name[8] == 'e' &&
8645               name[9] == 'n' &&
8646               name[10] == 't')
8647           {                                       /* endprotoent */
8648             return -KEY_endprotoent;
8649           }
8650
8651           goto unknown;
8652
8653         case 'g':
8654           if (name[1] == 'e' &&
8655               name[2] == 't')
8656           {
8657             switch (name[3])
8658             {
8659               case 'p':
8660                 switch (name[4])
8661                 {
8662                   case 'e':
8663                     if (name[5] == 'e' &&
8664                         name[6] == 'r' &&
8665                         name[7] == 'n' &&
8666                         name[8] == 'a' &&
8667                         name[9] == 'm' &&
8668                         name[10] == 'e')
8669                     {                             /* getpeername */
8670                       return -KEY_getpeername;
8671                     }
8672
8673                     goto unknown;
8674
8675                   case 'r':
8676                     switch (name[5])
8677                     {
8678                       case 'i':
8679                         if (name[6] == 'o' &&
8680                             name[7] == 'r' &&
8681                             name[8] == 'i' &&
8682                             name[9] == 't' &&
8683                             name[10] == 'y')
8684                         {                         /* getpriority */
8685                           return -KEY_getpriority;
8686                         }
8687
8688                         goto unknown;
8689
8690                       case 'o':
8691                         if (name[6] == 't' &&
8692                             name[7] == 'o' &&
8693                             name[8] == 'e' &&
8694                             name[9] == 'n' &&
8695                             name[10] == 't')
8696                         {                         /* getprotoent */
8697                           return -KEY_getprotoent;
8698                         }
8699
8700                         goto unknown;
8701
8702                       default:
8703                         goto unknown;
8704                     }
8705
8706                   default:
8707                     goto unknown;
8708                 }
8709
8710               case 's':
8711                 if (name[4] == 'o' &&
8712                     name[5] == 'c' &&
8713                     name[6] == 'k' &&
8714                     name[7] == 'n' &&
8715                     name[8] == 'a' &&
8716                     name[9] == 'm' &&
8717                     name[10] == 'e')
8718                 {                                 /* getsockname */
8719                   return -KEY_getsockname;
8720                 }
8721
8722                 goto unknown;
8723
8724               default:
8725                 goto unknown;
8726             }
8727           }
8728
8729           goto unknown;
8730
8731         case 's':
8732           if (name[1] == 'e' &&
8733               name[2] == 't' &&
8734               name[3] == 'p' &&
8735               name[4] == 'r')
8736           {
8737             switch (name[5])
8738             {
8739               case 'i':
8740                 if (name[6] == 'o' &&
8741                     name[7] == 'r' &&
8742                     name[8] == 'i' &&
8743                     name[9] == 't' &&
8744                     name[10] == 'y')
8745                 {                                 /* setpriority */
8746                   return -KEY_setpriority;
8747                 }
8748
8749                 goto unknown;
8750
8751               case 'o':
8752                 if (name[6] == 't' &&
8753                     name[7] == 'o' &&
8754                     name[8] == 'e' &&
8755                     name[9] == 'n' &&
8756                     name[10] == 't')
8757                 {                                 /* setprotoent */
8758                   return -KEY_setprotoent;
8759                 }
8760
8761                 goto unknown;
8762
8763               default:
8764                 goto unknown;
8765             }
8766           }
8767
8768           goto unknown;
8769
8770         default:
8771           goto unknown;
8772       }
8773
8774     case 12: /* 2 tokens of length 12 */
8775       if (name[0] == 'g' &&
8776           name[1] == 'e' &&
8777           name[2] == 't' &&
8778           name[3] == 'n' &&
8779           name[4] == 'e' &&
8780           name[5] == 't' &&
8781           name[6] == 'b' &&
8782           name[7] == 'y')
8783       {
8784         switch (name[8])
8785         {
8786           case 'a':
8787             if (name[9] == 'd' &&
8788                 name[10] == 'd' &&
8789                 name[11] == 'r')
8790             {                                     /* getnetbyaddr */
8791               return -KEY_getnetbyaddr;
8792             }
8793
8794             goto unknown;
8795
8796           case 'n':
8797             if (name[9] == 'a' &&
8798                 name[10] == 'm' &&
8799                 name[11] == 'e')
8800             {                                     /* getnetbyname */
8801               return -KEY_getnetbyname;
8802             }
8803
8804             goto unknown;
8805
8806           default:
8807             goto unknown;
8808         }
8809       }
8810
8811       goto unknown;
8812
8813     case 13: /* 4 tokens of length 13 */
8814       if (name[0] == 'g' &&
8815           name[1] == 'e' &&
8816           name[2] == 't')
8817       {
8818         switch (name[3])
8819         {
8820           case 'h':
8821             if (name[4] == 'o' &&
8822                 name[5] == 's' &&
8823                 name[6] == 't' &&
8824                 name[7] == 'b' &&
8825                 name[8] == 'y')
8826             {
8827               switch (name[9])
8828               {
8829                 case 'a':
8830                   if (name[10] == 'd' &&
8831                       name[11] == 'd' &&
8832                       name[12] == 'r')
8833                   {                               /* gethostbyaddr */
8834                     return -KEY_gethostbyaddr;
8835                   }
8836
8837                   goto unknown;
8838
8839                 case 'n':
8840                   if (name[10] == 'a' &&
8841                       name[11] == 'm' &&
8842                       name[12] == 'e')
8843                   {                               /* gethostbyname */
8844                     return -KEY_gethostbyname;
8845                   }
8846
8847                   goto unknown;
8848
8849                 default:
8850                   goto unknown;
8851               }
8852             }
8853
8854             goto unknown;
8855
8856           case 's':
8857             if (name[4] == 'e' &&
8858                 name[5] == 'r' &&
8859                 name[6] == 'v' &&
8860                 name[7] == 'b' &&
8861                 name[8] == 'y')
8862             {
8863               switch (name[9])
8864               {
8865                 case 'n':
8866                   if (name[10] == 'a' &&
8867                       name[11] == 'm' &&
8868                       name[12] == 'e')
8869                   {                               /* getservbyname */
8870                     return -KEY_getservbyname;
8871                   }
8872
8873                   goto unknown;
8874
8875                 case 'p':
8876                   if (name[10] == 'o' &&
8877                       name[11] == 'r' &&
8878                       name[12] == 't')
8879                   {                               /* getservbyport */
8880                     return -KEY_getservbyport;
8881                   }
8882
8883                   goto unknown;
8884
8885                 default:
8886                   goto unknown;
8887               }
8888             }
8889
8890             goto unknown;
8891
8892           default:
8893             goto unknown;
8894         }
8895       }
8896
8897       goto unknown;
8898
8899     case 14: /* 1 tokens of length 14 */
8900       if (name[0] == 'g' &&
8901           name[1] == 'e' &&
8902           name[2] == 't' &&
8903           name[3] == 'p' &&
8904           name[4] == 'r' &&
8905           name[5] == 'o' &&
8906           name[6] == 't' &&
8907           name[7] == 'o' &&
8908           name[8] == 'b' &&
8909           name[9] == 'y' &&
8910           name[10] == 'n' &&
8911           name[11] == 'a' &&
8912           name[12] == 'm' &&
8913           name[13] == 'e')
8914       {                                           /* getprotobyname */
8915         return -KEY_getprotobyname;
8916       }
8917
8918       goto unknown;
8919
8920     case 16: /* 1 tokens of length 16 */
8921       if (name[0] == 'g' &&
8922           name[1] == 'e' &&
8923           name[2] == 't' &&
8924           name[3] == 'p' &&
8925           name[4] == 'r' &&
8926           name[5] == 'o' &&
8927           name[6] == 't' &&
8928           name[7] == 'o' &&
8929           name[8] == 'b' &&
8930           name[9] == 'y' &&
8931           name[10] == 'n' &&
8932           name[11] == 'u' &&
8933           name[12] == 'm' &&
8934           name[13] == 'b' &&
8935           name[14] == 'e' &&
8936           name[15] == 'r')
8937       {                                           /* getprotobynumber */
8938         return -KEY_getprotobynumber;
8939       }
8940
8941       goto unknown;
8942
8943     default:
8944       goto unknown;
8945   }
8946
8947 unknown:
8948   return 0;
8949 }
8950
8951 STATIC void
8952 S_checkcomma(pTHX_ register char *s, const char *name, const char *what)
8953 {
8954     const char *w;
8955
8956     if (*s == ' ' && s[1] == '(') {     /* XXX gotta be a better way */
8957         if (ckWARN(WARN_SYNTAX)) {
8958             int level = 1;
8959             for (w = s+2; *w && level; w++) {
8960                 if (*w == '(')
8961                     ++level;
8962                 else if (*w == ')')
8963                     --level;
8964             }
8965             if (*w)
8966                 for (; *w && isSPACE(*w); w++) ;
8967             if (!*w || !strchr(";|})]oaiuw!=", *w))     /* an advisory hack only... */
8968                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
8969                             "%s (...) interpreted as function",name);
8970         }
8971     }
8972     while (s < PL_bufend && isSPACE(*s))
8973         s++;
8974     if (*s == '(')
8975         s++;
8976     while (s < PL_bufend && isSPACE(*s))
8977         s++;
8978     if (isIDFIRST_lazy_if(s,UTF)) {
8979         w = s++;
8980         while (isALNUM_lazy_if(s,UTF))
8981             s++;
8982         while (s < PL_bufend && isSPACE(*s))
8983             s++;
8984         if (*s == ',') {
8985             int kw;
8986             *s = '\0'; /* XXX If we didn't do this, we could const a lot of toke.c */
8987             kw = keyword(w, s - w) || get_cv(w, FALSE) != 0;
8988             *s = ',';
8989             if (kw)
8990                 return;
8991             Perl_croak(aTHX_ "No comma allowed after %s", what);
8992         }
8993     }
8994 }
8995
8996 /* Either returns sv, or mortalizes sv and returns a new SV*.
8997    Best used as sv=new_constant(..., sv, ...).
8998    If s, pv are NULL, calls subroutine with one argument,
8999    and type is used with error messages only. */
9000
9001 STATIC SV *
9002 S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, SV *sv, SV *pv,
9003                const char *type)
9004 {
9005     dVAR; dSP;
9006     HV * const table = GvHV(PL_hintgv);          /* ^H */
9007     SV *res;
9008     SV **cvp;
9009     SV *cv, *typesv;
9010     const char *why1 = "", *why2 = "", *why3 = "";
9011
9012     if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
9013         SV *msg;
9014         
9015         why2 = strEQ(key,"charnames")
9016                ? "(possibly a missing \"use charnames ...\")"
9017                : "";
9018         msg = Perl_newSVpvf(aTHX_ "Constant(%s) unknown: %s",
9019                             (type ? type: "undef"), why2);
9020
9021         /* This is convoluted and evil ("goto considered harmful")
9022          * but I do not understand the intricacies of all the different
9023          * failure modes of %^H in here.  The goal here is to make
9024          * the most probable error message user-friendly. --jhi */
9025
9026         goto msgdone;
9027
9028     report:
9029         msg = Perl_newSVpvf(aTHX_ "Constant(%s): %s%s%s",
9030                             (type ? type: "undef"), why1, why2, why3);
9031     msgdone:
9032         yyerror(SvPVX_const(msg));
9033         SvREFCNT_dec(msg);
9034         return sv;
9035     }
9036     cvp = hv_fetch(table, key, strlen(key), FALSE);
9037     if (!cvp || !SvOK(*cvp)) {
9038         why1 = "$^H{";
9039         why2 = key;
9040         why3 = "} is not defined";
9041         goto report;
9042     }
9043     sv_2mortal(sv);                     /* Parent created it permanently */
9044     cv = *cvp;
9045     if (!pv && s)
9046         pv = sv_2mortal(newSVpvn(s, len));
9047     if (type && pv)
9048         typesv = sv_2mortal(newSVpv(type, 0));
9049     else
9050         typesv = &PL_sv_undef;
9051
9052     PUSHSTACKi(PERLSI_OVERLOAD);
9053     ENTER ;
9054     SAVETMPS;
9055
9056     PUSHMARK(SP) ;
9057     EXTEND(sp, 3);
9058     if (pv)
9059         PUSHs(pv);
9060     PUSHs(sv);
9061     if (pv)
9062         PUSHs(typesv);
9063     PUTBACK;
9064     call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
9065
9066     SPAGAIN ;
9067
9068     /* Check the eval first */
9069     if (!PL_in_eval && SvTRUE(ERRSV)) {
9070         sv_catpv(ERRSV, "Propagated");
9071         yyerror(SvPV_nolen_const(ERRSV)); /* Duplicates the message inside eval */
9072         (void)POPs;
9073         res = SvREFCNT_inc(sv);
9074     }
9075     else {
9076         res = POPs;
9077         (void)SvREFCNT_inc(res);
9078     }
9079
9080     PUTBACK ;
9081     FREETMPS ;
9082     LEAVE ;
9083     POPSTACK;
9084
9085     if (!SvOK(res)) {
9086         why1 = "Call to &{$^H{";
9087         why2 = key;
9088         why3 = "}} did not return a defined value";
9089         sv = res;
9090         goto report;
9091     }
9092
9093     return res;
9094 }
9095
9096 /* Returns a NUL terminated string, with the length of the string written to
9097    *slp
9098    */
9099 STATIC char *
9100 S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
9101 {
9102     register char *d = dest;
9103     register char * const e = d + destlen - 3;  /* two-character token, ending NUL */
9104     for (;;) {
9105         if (d >= e)
9106             Perl_croak(aTHX_ ident_too_long);
9107         if (isALNUM(*s))        /* UTF handled below */
9108             *d++ = *s++;
9109         else if (*s == '\'' && allow_package && isIDFIRST_lazy_if(s+1,UTF)) {
9110             *d++ = ':';
9111             *d++ = ':';
9112             s++;
9113         }
9114         else if (*s == ':' && s[1] == ':' && allow_package && s[2] != '$') {
9115             *d++ = *s++;
9116             *d++ = *s++;
9117         }
9118         else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
9119             char *t = s + UTF8SKIP(s);
9120             while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
9121                 t += UTF8SKIP(t);
9122             if (d + (t - s) > e)
9123                 Perl_croak(aTHX_ ident_too_long);
9124             Copy(s, d, t - s, char);
9125             d += t - s;
9126             s = t;
9127         }
9128         else {
9129             *d = '\0';
9130             *slp = d - dest;
9131             return s;
9132         }
9133     }
9134 }
9135
9136 STATIC char *
9137 S_scan_ident(pTHX_ register char *s, register const char *send, char *dest, STRLEN destlen, I32 ck_uni)
9138 {
9139     register char *d;
9140     register char *e;
9141     char *bracket = Nullch;
9142     char funny = *s++;
9143
9144     if (isSPACE(*s))
9145         s = skipspace(s);
9146     d = dest;
9147     e = d + destlen - 3;        /* two-character token, ending NUL */
9148     if (isDIGIT(*s)) {
9149         while (isDIGIT(*s)) {
9150             if (d >= e)
9151                 Perl_croak(aTHX_ ident_too_long);
9152             *d++ = *s++;
9153         }
9154     }
9155     else {
9156         for (;;) {
9157             if (d >= e)
9158                 Perl_croak(aTHX_ ident_too_long);
9159             if (isALNUM(*s))    /* UTF handled below */
9160                 *d++ = *s++;
9161             else if (*s == '\'' && isIDFIRST_lazy_if(s+1,UTF)) {
9162                 *d++ = ':';
9163                 *d++ = ':';
9164                 s++;
9165             }
9166             else if (*s == ':' && s[1] == ':') {
9167                 *d++ = *s++;
9168                 *d++ = *s++;
9169             }
9170             else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
9171                 char *t = s + UTF8SKIP(s);
9172                 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
9173                     t += UTF8SKIP(t);
9174                 if (d + (t - s) > e)
9175                     Perl_croak(aTHX_ ident_too_long);
9176                 Copy(s, d, t - s, char);
9177                 d += t - s;
9178                 s = t;
9179             }
9180             else
9181                 break;
9182         }
9183     }
9184     *d = '\0';
9185     d = dest;
9186     if (*d) {
9187         if (PL_lex_state != LEX_NORMAL)
9188             PL_lex_state = LEX_INTERPENDMAYBE;
9189         return s;
9190     }
9191     if (*s == '$' && s[1] &&
9192         (isALNUM_lazy_if(s+1,UTF) || s[1] == '$' || s[1] == '{' || strnEQ(s+1,"::",2)) )
9193     {
9194         return s;
9195     }
9196     if (*s == '{') {
9197         bracket = s;
9198         s++;
9199     }
9200     else if (ck_uni)
9201         check_uni();
9202     if (s < send)
9203         *d = *s++;
9204     d[1] = '\0';
9205     if (*d == '^' && *s && isCONTROLVAR(*s)) {
9206         *d = toCTRL(*s);
9207         s++;
9208     }
9209     if (bracket) {
9210         if (isSPACE(s[-1])) {
9211             while (s < send) {
9212                 const char ch = *s++;
9213                 if (!SPACE_OR_TAB(ch)) {
9214                     *d = ch;
9215                     break;
9216                 }
9217             }
9218         }
9219         if (isIDFIRST_lazy_if(d,UTF)) {
9220             d++;
9221             if (UTF) {
9222                 e = s;
9223                 while ((e < send && isALNUM_lazy_if(e,UTF)) || *e == ':') {
9224                     e += UTF8SKIP(e);
9225                     while (e < send && UTF8_IS_CONTINUED(*e) && is_utf8_mark((U8*)e))
9226                         e += UTF8SKIP(e);
9227                 }
9228                 Copy(s, d, e - s, char);
9229                 d += e - s;
9230                 s = e;
9231             }
9232             else {
9233                 while ((isALNUM(*s) || *s == ':') && d < e)
9234                     *d++ = *s++;
9235                 if (d >= e)
9236                     Perl_croak(aTHX_ ident_too_long);
9237             }
9238             *d = '\0';
9239             while (s < send && SPACE_OR_TAB(*s)) s++;
9240             if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
9241                 if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest)) {
9242                     const char *brack = *s == '[' ? "[...]" : "{...}";
9243                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
9244                         "Ambiguous use of %c{%s%s} resolved to %c%s%s",
9245                         funny, dest, brack, funny, dest, brack);
9246                 }
9247                 bracket++;
9248                 PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
9249                 return s;
9250             }
9251         }
9252         /* Handle extended ${^Foo} variables
9253          * 1999-02-27 mjd-perl-patch@plover.com */
9254         else if (!isALNUM(*d) && !isPRINT(*d) /* isCTRL(d) */
9255                  && isALNUM(*s))
9256         {
9257             d++;
9258             while (isALNUM(*s) && d < e) {
9259                 *d++ = *s++;
9260             }
9261             if (d >= e)
9262                 Perl_croak(aTHX_ ident_too_long);
9263             *d = '\0';
9264         }
9265         if (*s == '}') {
9266             s++;
9267             if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) {
9268                 PL_lex_state = LEX_INTERPEND;
9269                 PL_expect = XREF;
9270             }
9271             if (funny == '#')
9272                 funny = '@';
9273             if (PL_lex_state == LEX_NORMAL) {
9274                 if (ckWARN(WARN_AMBIGUOUS) &&
9275                     (keyword(dest, d - dest) || get_cv(dest, FALSE)))
9276                 {
9277                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
9278                         "Ambiguous use of %c{%s} resolved to %c%s",
9279                         funny, dest, funny, dest);
9280                 }
9281             }
9282         }
9283         else {
9284             s = bracket;                /* let the parser handle it */
9285             *dest = '\0';
9286         }
9287     }
9288     else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
9289         PL_lex_state = LEX_INTERPEND;
9290     return s;
9291 }
9292
9293 void
9294 Perl_pmflag(pTHX_ U32* pmfl, int ch)
9295 {
9296     if (ch == 'i')
9297         *pmfl |= PMf_FOLD;
9298     else if (ch == 'g')
9299         *pmfl |= PMf_GLOBAL;
9300     else if (ch == 'c')
9301         *pmfl |= PMf_CONTINUE;
9302     else if (ch == 'o')
9303         *pmfl |= PMf_KEEP;
9304     else if (ch == 'm')
9305         *pmfl |= PMf_MULTILINE;
9306     else if (ch == 's')
9307         *pmfl |= PMf_SINGLELINE;
9308     else if (ch == 'x')
9309         *pmfl |= PMf_EXTENDED;
9310 }
9311
9312 STATIC char *
9313 S_scan_pat(pTHX_ char *start, I32 type)
9314 {
9315     PMOP *pm;
9316     char *s = scan_str(start,FALSE,FALSE);
9317
9318     if (!s) {
9319         char * const delimiter = skipspace(start);
9320         Perl_croak(aTHX_ *delimiter == '?'
9321                    ? "Search pattern not terminated or ternary operator parsed as search pattern"
9322                    : "Search pattern not terminated" );
9323     }
9324
9325     pm = (PMOP*)newPMOP(type, 0);
9326     if (PL_multi_open == '?')
9327         pm->op_pmflags |= PMf_ONCE;
9328     if(type == OP_QR) {
9329         while (*s && strchr("iomsx", *s))
9330             pmflag(&pm->op_pmflags,*s++);
9331     }
9332     else {
9333         while (*s && strchr("iogcmsx", *s))
9334             pmflag(&pm->op_pmflags,*s++);
9335     }
9336     /* issue a warning if /c is specified,but /g is not */
9337     if ((pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL)
9338             && ckWARN(WARN_REGEXP))
9339     {
9340         Perl_warner(aTHX_ packWARN(WARN_REGEXP), c_without_g);
9341     }
9342
9343     pm->op_pmpermflags = pm->op_pmflags;
9344
9345     PL_lex_op = (OP*)pm;
9346     yylval.ival = OP_MATCH;
9347     return s;
9348 }
9349
9350 STATIC char *
9351 S_scan_subst(pTHX_ char *start)
9352 {
9353     dVAR;
9354     register char *s;
9355     register PMOP *pm;
9356     I32 first_start;
9357     I32 es = 0;
9358
9359     yylval.ival = OP_NULL;
9360
9361     s = scan_str(start,FALSE,FALSE);
9362
9363     if (!s)
9364         Perl_croak(aTHX_ "Substitution pattern not terminated");
9365
9366     if (s[-1] == PL_multi_open)
9367         s--;
9368
9369     first_start = PL_multi_start;
9370     s = scan_str(s,FALSE,FALSE);
9371     if (!s) {
9372         if (PL_lex_stuff) {
9373             SvREFCNT_dec(PL_lex_stuff);
9374             PL_lex_stuff = Nullsv;
9375         }
9376         Perl_croak(aTHX_ "Substitution replacement not terminated");
9377     }
9378     PL_multi_start = first_start;       /* so whole substitution is taken together */
9379
9380     pm = (PMOP*)newPMOP(OP_SUBST, 0);
9381     while (*s) {
9382         if (*s == 'e') {
9383             s++;
9384             es++;
9385         }
9386         else if (strchr("iogcmsx", *s))
9387             pmflag(&pm->op_pmflags,*s++);
9388         else
9389             break;
9390     }
9391
9392     /* /c is not meaningful with s/// */
9393     if ((pm->op_pmflags & PMf_CONTINUE) && ckWARN(WARN_REGEXP))
9394     {
9395         Perl_warner(aTHX_ packWARN(WARN_REGEXP), c_in_subst);
9396     }
9397
9398     if (es) {
9399         SV *repl;
9400         PL_sublex_info.super_bufptr = s;
9401         PL_sublex_info.super_bufend = PL_bufend;
9402         PL_multi_end = 0;
9403         pm->op_pmflags |= PMf_EVAL;
9404         repl = newSVpvn("",0);
9405         while (es-- > 0)
9406             sv_catpv(repl, es ? "eval " : "do ");
9407         sv_catpvn(repl, "{ ", 2);
9408         sv_catsv(repl, PL_lex_repl);
9409         sv_catpvn(repl, " };", 2);
9410         SvEVALED_on(repl);
9411         SvREFCNT_dec(PL_lex_repl);
9412         PL_lex_repl = repl;
9413     }
9414
9415     pm->op_pmpermflags = pm->op_pmflags;
9416     PL_lex_op = (OP*)pm;
9417     yylval.ival = OP_SUBST;
9418     return s;
9419 }
9420
9421 STATIC char *
9422 S_scan_trans(pTHX_ char *start)
9423 {
9424     register char* s;
9425     OP *o;
9426     short *tbl;
9427     I32 squash;
9428     I32 del;
9429     I32 complement;
9430
9431     yylval.ival = OP_NULL;
9432
9433     s = scan_str(start,FALSE,FALSE);
9434     if (!s)
9435         Perl_croak(aTHX_ "Transliteration pattern not terminated");
9436     if (s[-1] == PL_multi_open)
9437         s--;
9438
9439     s = scan_str(s,FALSE,FALSE);
9440     if (!s) {
9441         if (PL_lex_stuff) {
9442             SvREFCNT_dec(PL_lex_stuff);
9443             PL_lex_stuff = Nullsv;
9444         }
9445         Perl_croak(aTHX_ "Transliteration replacement not terminated");
9446     }
9447
9448     complement = del = squash = 0;
9449     while (1) {
9450         switch (*s) {
9451         case 'c':
9452             complement = OPpTRANS_COMPLEMENT;
9453             break;
9454         case 'd':
9455             del = OPpTRANS_DELETE;
9456             break;
9457         case 's':
9458             squash = OPpTRANS_SQUASH;
9459             break;
9460         default:
9461             goto no_more;
9462         }
9463         s++;
9464     }
9465   no_more:
9466
9467     Newx(tbl, complement&&!del?258:256, short);
9468     o = newPVOP(OP_TRANS, 0, (char*)tbl);
9469     o->op_private &= ~OPpTRANS_ALL;
9470     o->op_private |= del|squash|complement|
9471       (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
9472       (DO_UTF8(PL_lex_repl) ? OPpTRANS_TO_UTF   : 0);
9473
9474     PL_lex_op = o;
9475     yylval.ival = OP_TRANS;
9476     return s;
9477 }
9478
9479 STATIC char *
9480 S_scan_heredoc(pTHX_ register char *s)
9481 {
9482     SV *herewas;
9483     I32 op_type = OP_SCALAR;
9484     I32 len;
9485     SV *tmpstr;
9486     char term;
9487     const char newline[] = "\n";
9488     const char *found_newline;
9489     register char *d;
9490     register char *e;
9491     char *peek;
9492     const int outer = (PL_rsfp && !(PL_lex_inwhat == OP_SCALAR));
9493
9494     s += 2;
9495     d = PL_tokenbuf;
9496     e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
9497     if (!outer)
9498         *d++ = '\n';
9499     for (peek = s; SPACE_OR_TAB(*peek); peek++) ;
9500     if (*peek == '`' || *peek == '\'' || *peek =='"') {
9501         s = peek;
9502         term = *s++;
9503         s = delimcpy(d, e, s, PL_bufend, term, &len);
9504         d += len;
9505         if (s < PL_bufend)
9506             s++;
9507     }
9508     else {
9509         if (*s == '\\')
9510             s++, term = '\'';
9511         else
9512             term = '"';
9513         if (!isALNUM_lazy_if(s,UTF))
9514             deprecate_old("bare << to mean <<\"\"");
9515         for (; isALNUM_lazy_if(s,UTF); s++) {
9516             if (d < e)
9517                 *d++ = *s;
9518         }
9519     }
9520     if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
9521         Perl_croak(aTHX_ "Delimiter for here document is too long");
9522     *d++ = '\n';
9523     *d = '\0';
9524     len = d - PL_tokenbuf;
9525 #ifndef PERL_STRICT_CR
9526     d = strchr(s, '\r');
9527     if (d) {
9528         char * const olds = s;
9529         s = d;
9530         while (s < PL_bufend) {
9531             if (*s == '\r') {
9532                 *d++ = '\n';
9533                 if (*++s == '\n')
9534                     s++;
9535             }
9536             else if (*s == '\n' && s[1] == '\r') {      /* \015\013 on a mac? */
9537                 *d++ = *s++;
9538                 s++;
9539             }
9540             else
9541                 *d++ = *s++;
9542         }
9543         *d = '\0';
9544         PL_bufend = d;
9545         SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
9546         s = olds;
9547     }
9548 #endif
9549     if ( outer || !(found_newline = ninstr(s,PL_bufend,newline,newline+1)) ) {
9550         herewas = newSVpvn(s,PL_bufend-s);
9551     }
9552     else {
9553         s--;
9554         herewas = newSVpvn(s,found_newline-s);
9555     }
9556     s += SvCUR(herewas);
9557
9558     tmpstr = NEWSV(87,79);
9559     sv_upgrade(tmpstr, SVt_PVIV);
9560     if (term == '\'') {
9561         op_type = OP_CONST;
9562         SvIV_set(tmpstr, -1);
9563     }
9564     else if (term == '`') {
9565         op_type = OP_BACKTICK;
9566         SvIV_set(tmpstr, '\\');
9567     }
9568
9569     CLINE;
9570     PL_multi_start = CopLINE(PL_curcop);
9571     PL_multi_open = PL_multi_close = '<';
9572     term = *PL_tokenbuf;
9573     if (PL_lex_inwhat == OP_SUBST && PL_in_eval && !PL_rsfp) {
9574         char *bufptr = PL_sublex_info.super_bufptr;
9575         char *bufend = PL_sublex_info.super_bufend;
9576         char * const olds = s - SvCUR(herewas);
9577         s = strchr(bufptr, '\n');
9578         if (!s)
9579             s = bufend;
9580         d = s;
9581         while (s < bufend &&
9582           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
9583             if (*s++ == '\n')
9584                 CopLINE_inc(PL_curcop);
9585         }
9586         if (s >= bufend) {
9587             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
9588             missingterm(PL_tokenbuf);
9589         }
9590         sv_setpvn(herewas,bufptr,d-bufptr+1);
9591         sv_setpvn(tmpstr,d+1,s-d);
9592         s += len - 1;
9593         sv_catpvn(herewas,s,bufend-s);
9594         Copy(SvPVX_const(herewas),bufptr,SvCUR(herewas) + 1,char);
9595
9596         s = olds;
9597         goto retval;
9598     }
9599     else if (!outer) {
9600         d = s;
9601         while (s < PL_bufend &&
9602           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
9603             if (*s++ == '\n')
9604                 CopLINE_inc(PL_curcop);
9605         }
9606         if (s >= PL_bufend) {
9607             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
9608             missingterm(PL_tokenbuf);
9609         }
9610         sv_setpvn(tmpstr,d+1,s-d);
9611         s += len - 1;
9612         CopLINE_inc(PL_curcop); /* the preceding stmt passes a newline */
9613
9614         sv_catpvn(herewas,s,PL_bufend-s);
9615         sv_setsv(PL_linestr,herewas);
9616         PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
9617         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
9618         PL_last_lop = PL_last_uni = Nullch;
9619     }
9620     else
9621         sv_setpvn(tmpstr,"",0);   /* avoid "uninitialized" warning */
9622     while (s >= PL_bufend) {    /* multiple line string? */
9623         if (!outer ||
9624          !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
9625             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
9626             missingterm(PL_tokenbuf);
9627         }
9628         CopLINE_inc(PL_curcop);
9629         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
9630         PL_last_lop = PL_last_uni = Nullch;
9631 #ifndef PERL_STRICT_CR
9632         if (PL_bufend - PL_linestart >= 2) {
9633             if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
9634                 (PL_bufend[-2] == '\n' && PL_bufend[-1] == '\r'))
9635             {
9636                 PL_bufend[-2] = '\n';
9637                 PL_bufend--;
9638                 SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
9639             }
9640             else if (PL_bufend[-1] == '\r')
9641                 PL_bufend[-1] = '\n';
9642         }
9643         else if (PL_bufend - PL_linestart == 1 && PL_bufend[-1] == '\r')
9644             PL_bufend[-1] = '\n';
9645 #endif
9646         if (PERLDB_LINE && PL_curstash != PL_debstash) {
9647             SV *sv = NEWSV(88,0);
9648
9649             sv_upgrade(sv, SVt_PVMG);
9650             sv_setsv(sv,PL_linestr);
9651             (void)SvIOK_on(sv);
9652             SvIV_set(sv, 0);
9653             av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop),sv);
9654         }
9655         if (*s == term && memEQ(s,PL_tokenbuf,len)) {
9656             STRLEN off = PL_bufend - 1 - SvPVX_const(PL_linestr);
9657             *(SvPVX(PL_linestr) + off ) = ' ';
9658             sv_catsv(PL_linestr,herewas);
9659             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
9660             s = SvPVX(PL_linestr) + off; /* In case PV of PL_linestr moved. */
9661         }
9662         else {
9663             s = PL_bufend;
9664             sv_catsv(tmpstr,PL_linestr);
9665         }
9666     }
9667     s++;
9668 retval:
9669     PL_multi_end = CopLINE(PL_curcop);
9670     if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
9671         SvPV_shrink_to_cur(tmpstr);
9672     }
9673     SvREFCNT_dec(herewas);
9674     if (!IN_BYTES) {
9675         if (UTF && is_utf8_string((U8*)SvPVX_const(tmpstr), SvCUR(tmpstr)))
9676             SvUTF8_on(tmpstr);
9677         else if (PL_encoding)
9678             sv_recode_to_utf8(tmpstr, PL_encoding);
9679     }
9680     PL_lex_stuff = tmpstr;
9681     yylval.ival = op_type;
9682     return s;
9683 }
9684
9685 /* scan_inputsymbol
9686    takes: current position in input buffer
9687    returns: new position in input buffer
9688    side-effects: yylval and lex_op are set.
9689
9690    This code handles:
9691
9692    <>           read from ARGV
9693    <FH>         read from filehandle
9694    <pkg::FH>    read from package qualified filehandle
9695    <pkg'FH>     read from package qualified filehandle
9696    <$fh>        read from filehandle in $fh
9697    <*.h>        filename glob
9698
9699 */
9700
9701 STATIC char *
9702 S_scan_inputsymbol(pTHX_ char *start)
9703 {
9704     register char *s = start;           /* current position in buffer */
9705     register char *d;
9706     const char *e;
9707     char *end;
9708     I32 len;
9709
9710     d = PL_tokenbuf;                    /* start of temp holding space */
9711     e = PL_tokenbuf + sizeof PL_tokenbuf;       /* end of temp holding space */
9712     end = strchr(s, '\n');
9713     if (!end)
9714         end = PL_bufend;
9715     s = delimcpy(d, e, s + 1, end, '>', &len);  /* extract until > */
9716
9717     /* die if we didn't have space for the contents of the <>,
9718        or if it didn't end, or if we see a newline
9719     */
9720
9721     if (len >= sizeof PL_tokenbuf)
9722         Perl_croak(aTHX_ "Excessively long <> operator");
9723     if (s >= end)
9724         Perl_croak(aTHX_ "Unterminated <> operator");
9725
9726     s++;
9727
9728     /* check for <$fh>
9729        Remember, only scalar variables are interpreted as filehandles by
9730        this code.  Anything more complex (e.g., <$fh{$num}>) will be
9731        treated as a glob() call.
9732        This code makes use of the fact that except for the $ at the front,
9733        a scalar variable and a filehandle look the same.
9734     */
9735     if (*d == '$' && d[1]) d++;
9736
9737     /* allow <Pkg'VALUE> or <Pkg::VALUE> */
9738     while (*d && (isALNUM_lazy_if(d,UTF) || *d == '\'' || *d == ':'))
9739         d++;
9740
9741     /* If we've tried to read what we allow filehandles to look like, and
9742        there's still text left, then it must be a glob() and not a getline.
9743        Use scan_str to pull out the stuff between the <> and treat it
9744        as nothing more than a string.
9745     */
9746
9747     if (d - PL_tokenbuf != len) {
9748         yylval.ival = OP_GLOB;
9749         set_csh();
9750         s = scan_str(start,FALSE,FALSE);
9751         if (!s)
9752            Perl_croak(aTHX_ "Glob not terminated");
9753         return s;
9754     }
9755     else {
9756         bool readline_overriden = FALSE;
9757         GV *gv_readline = Nullgv;
9758         GV **gvp;
9759         /* we're in a filehandle read situation */
9760         d = PL_tokenbuf;
9761
9762         /* turn <> into <ARGV> */
9763         if (!len)
9764             Copy("ARGV",d,5,char);
9765
9766         /* Check whether readline() is overriden */
9767         if (((gv_readline = gv_fetchpv("readline", FALSE, SVt_PVCV))
9768                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline))
9769                 ||
9770                 ((gvp = (GV**)hv_fetch(PL_globalstash, "readline", 8, FALSE))
9771                 && (gv_readline = *gvp) != (GV*)&PL_sv_undef
9772                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline)))
9773             readline_overriden = TRUE;
9774
9775         /* if <$fh>, create the ops to turn the variable into a
9776            filehandle
9777         */
9778         if (*d == '$') {
9779             I32 tmp;
9780
9781             /* try to find it in the pad for this block, otherwise find
9782                add symbol table ops
9783             */
9784             if ((tmp = pad_findmy(d)) != NOT_IN_PAD) {
9785                 if (PAD_COMPNAME_FLAGS(tmp) & SVpad_OUR) {
9786                     HV *stash = PAD_COMPNAME_OURSTASH(tmp);
9787                     HEK *stashname = HvNAME_HEK(stash);
9788                     SV *sym = sv_2mortal(newSVhek(stashname));
9789                     sv_catpvn(sym, "::", 2);
9790                     sv_catpv(sym, d+1);
9791                     d = SvPVX(sym);
9792                     goto intro_sym;
9793                 }
9794                 else {
9795                     OP *o = newOP(OP_PADSV, 0);
9796                     o->op_targ = tmp;
9797                     PL_lex_op = readline_overriden
9798                         ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
9799                                 append_elem(OP_LIST, o,
9800                                     newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
9801                         : (OP*)newUNOP(OP_READLINE, 0, o);
9802                 }
9803             }
9804             else {
9805                 GV *gv;
9806                 ++d;
9807 intro_sym:
9808                 gv = gv_fetchpv(d,
9809                                 (PL_in_eval
9810                                  ? (GV_ADDMULTI | GV_ADDINEVAL)
9811                                  : GV_ADDMULTI),
9812                                 SVt_PV);
9813                 PL_lex_op = readline_overriden
9814                     ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
9815                             append_elem(OP_LIST,
9816                                 newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
9817                                 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
9818                     : (OP*)newUNOP(OP_READLINE, 0,
9819                             newUNOP(OP_RV2SV, 0,
9820                                 newGVOP(OP_GV, 0, gv)));
9821             }
9822             if (!readline_overriden)
9823                 PL_lex_op->op_flags |= OPf_SPECIAL;
9824             /* we created the ops in PL_lex_op, so make yylval.ival a null op */
9825             yylval.ival = OP_NULL;
9826         }
9827
9828         /* If it's none of the above, it must be a literal filehandle
9829            (<Foo::BAR> or <FOO>) so build a simple readline OP */
9830         else {
9831             GV *gv = gv_fetchpv(d,TRUE, SVt_PVIO);
9832             PL_lex_op = readline_overriden
9833                 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
9834                         append_elem(OP_LIST,
9835                             newGVOP(OP_GV, 0, gv),
9836                             newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
9837                 : (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
9838             yylval.ival = OP_NULL;
9839         }
9840     }
9841
9842     return s;
9843 }
9844
9845
9846 /* scan_str
9847    takes: start position in buffer
9848           keep_quoted preserve \ on the embedded delimiter(s)
9849           keep_delims preserve the delimiters around the string
9850    returns: position to continue reading from buffer
9851    side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
9852         updates the read buffer.
9853
9854    This subroutine pulls a string out of the input.  It is called for:
9855         q               single quotes           q(literal text)
9856         '               single quotes           'literal text'
9857         qq              double quotes           qq(interpolate $here please)
9858         "               double quotes           "interpolate $here please"
9859         qx              backticks               qx(/bin/ls -l)
9860         `               backticks               `/bin/ls -l`
9861         qw              quote words             @EXPORT_OK = qw( func() $spam )
9862         m//             regexp match            m/this/
9863         s///            regexp substitute       s/this/that/
9864         tr///           string transliterate    tr/this/that/
9865         y///            string transliterate    y/this/that/
9866         ($*@)           sub prototypes          sub foo ($)
9867         (stuff)         sub attr parameters     sub foo : attr(stuff)
9868         <>              readline or globs       <FOO>, <>, <$fh>, or <*.c>
9869         
9870    In most of these cases (all but <>, patterns and transliterate)
9871    yylex() calls scan_str().  m// makes yylex() call scan_pat() which
9872    calls scan_str().  s/// makes yylex() call scan_subst() which calls
9873    scan_str().  tr/// and y/// make yylex() call scan_trans() which
9874    calls scan_str().
9875
9876    It skips whitespace before the string starts, and treats the first
9877    character as the delimiter.  If the delimiter is one of ([{< then
9878    the corresponding "close" character )]}> is used as the closing
9879    delimiter.  It allows quoting of delimiters, and if the string has
9880    balanced delimiters ([{<>}]) it allows nesting.
9881
9882    On success, the SV with the resulting string is put into lex_stuff or,
9883    if that is already non-NULL, into lex_repl. The second case occurs only
9884    when parsing the RHS of the special constructs s/// and tr/// (y///).
9885    For convenience, the terminating delimiter character is stuffed into
9886    SvIVX of the SV.
9887 */
9888
9889 STATIC char *
9890 S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
9891 {
9892     SV *sv;                             /* scalar value: string */
9893     char *tmps;                         /* temp string, used for delimiter matching */
9894     register char *s = start;           /* current position in the buffer */
9895     register char term;                 /* terminating character */
9896     register char *to;                  /* current position in the sv's data */
9897     I32 brackets = 1;                   /* bracket nesting level */
9898     bool has_utf8 = FALSE;              /* is there any utf8 content? */
9899     I32 termcode;                       /* terminating char. code */
9900     U8 termstr[UTF8_MAXBYTES];          /* terminating string */
9901     STRLEN termlen;                     /* length of terminating string */
9902     char *last = NULL;                  /* last position for nesting bracket */
9903
9904     /* skip space before the delimiter */
9905     if (isSPACE(*s))
9906         s = skipspace(s);
9907
9908     /* mark where we are, in case we need to report errors */
9909     CLINE;
9910
9911     /* after skipping whitespace, the next character is the terminator */
9912     term = *s;
9913     if (!UTF) {
9914         termcode = termstr[0] = term;
9915         termlen = 1;
9916     }
9917     else {
9918         termcode = utf8_to_uvchr((U8*)s, &termlen);
9919         Copy(s, termstr, termlen, U8);
9920         if (!UTF8_IS_INVARIANT(term))
9921             has_utf8 = TRUE;
9922     }
9923
9924     /* mark where we are */
9925     PL_multi_start = CopLINE(PL_curcop);
9926     PL_multi_open = term;
9927
9928     /* find corresponding closing delimiter */
9929     if (term && (tmps = strchr("([{< )]}> )]}>",term)))
9930         termcode = termstr[0] = term = tmps[5];
9931
9932     PL_multi_close = term;
9933
9934     /* create a new SV to hold the contents.  87 is leak category, I'm
9935        assuming.  79 is the SV's initial length.  What a random number. */
9936     sv = NEWSV(87,79);
9937     sv_upgrade(sv, SVt_PVIV);
9938     SvIV_set(sv, termcode);
9939     (void)SvPOK_only(sv);               /* validate pointer */
9940
9941     /* move past delimiter and try to read a complete string */
9942     if (keep_delims)
9943         sv_catpvn(sv, s, termlen);
9944     s += termlen;
9945     for (;;) {
9946         if (PL_encoding && !UTF) {
9947             bool cont = TRUE;
9948
9949             while (cont) {
9950                 int offset = s - SvPVX_const(PL_linestr);
9951                 const bool found = sv_cat_decode(sv, PL_encoding, PL_linestr,
9952                                            &offset, (char*)termstr, termlen);
9953                 const char *ns = SvPVX_const(PL_linestr) + offset;
9954                 char *svlast = SvEND(sv) - 1;
9955
9956                 for (; s < ns; s++) {
9957                     if (*s == '\n' && !PL_rsfp)
9958                         CopLINE_inc(PL_curcop);
9959                 }
9960                 if (!found)
9961                     goto read_more_line;
9962                 else {
9963                     /* handle quoted delimiters */
9964                     if (SvCUR(sv) > 1 && *(svlast-1) == '\\') {
9965                         const char *t;
9966                         for (t = svlast-2; t >= SvPVX_const(sv) && *t == '\\';)
9967                             t--;
9968                         if ((svlast-1 - t) % 2) {
9969                             if (!keep_quoted) {
9970                                 *(svlast-1) = term;
9971                                 *svlast = '\0';
9972                                 SvCUR_set(sv, SvCUR(sv) - 1);
9973                             }
9974                             continue;
9975                         }
9976                     }
9977                     if (PL_multi_open == PL_multi_close) {
9978                         cont = FALSE;
9979                     }
9980                     else {
9981                         const char *t;
9982                         char *w;
9983                         if (!last)
9984                             last = SvPVX(sv);
9985                         for (t = w = last; t < svlast; w++, t++) {
9986                             /* At here, all closes are "was quoted" one,
9987                                so we don't check PL_multi_close. */
9988                             if (*t == '\\') {
9989                                 if (!keep_quoted && *(t+1) == PL_multi_open)
9990                                     t++;
9991                                 else
9992                                     *w++ = *t++;
9993                             }
9994                             else if (*t == PL_multi_open)
9995                                 brackets++;
9996
9997                             *w = *t;
9998                         }
9999                         if (w < t) {
10000                             *w++ = term;
10001                             *w = '\0';
10002                             SvCUR_set(sv, w - SvPVX_const(sv));
10003                         }
10004                         last = w;
10005                         if (--brackets <= 0)
10006                             cont = FALSE;
10007                     }
10008                 }
10009             }
10010             if (!keep_delims) {
10011                 SvCUR_set(sv, SvCUR(sv) - 1);
10012                 *SvEND(sv) = '\0';
10013             }
10014             break;
10015         }
10016
10017         /* extend sv if need be */
10018         SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
10019         /* set 'to' to the next character in the sv's string */
10020         to = SvPVX(sv)+SvCUR(sv);
10021
10022         /* if open delimiter is the close delimiter read unbridle */
10023         if (PL_multi_open == PL_multi_close) {
10024             for (; s < PL_bufend; s++,to++) {
10025                 /* embedded newlines increment the current line number */
10026                 if (*s == '\n' && !PL_rsfp)
10027                     CopLINE_inc(PL_curcop);
10028                 /* handle quoted delimiters */
10029                 if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
10030                     if (!keep_quoted && s[1] == term)
10031                         s++;
10032                 /* any other quotes are simply copied straight through */
10033                     else
10034                         *to++ = *s++;
10035                 }
10036                 /* terminate when run out of buffer (the for() condition), or
10037                    have found the terminator */
10038                 else if (*s == term) {
10039                     if (termlen == 1)
10040                         break;
10041                     if (s+termlen <= PL_bufend && memEQ(s, (char*)termstr, termlen))
10042                         break;
10043                 }
10044                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
10045                     has_utf8 = TRUE;
10046                 *to = *s;
10047             }
10048         }
10049         
10050         /* if the terminator isn't the same as the start character (e.g.,
10051            matched brackets), we have to allow more in the quoting, and
10052            be prepared for nested brackets.
10053         */
10054         else {
10055             /* read until we run out of string, or we find the terminator */
10056             for (; s < PL_bufend; s++,to++) {
10057                 /* embedded newlines increment the line count */
10058                 if (*s == '\n' && !PL_rsfp)
10059                     CopLINE_inc(PL_curcop);
10060                 /* backslashes can escape the open or closing characters */
10061                 if (*s == '\\' && s+1 < PL_bufend) {
10062                     if (!keep_quoted &&
10063                         ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
10064                         s++;
10065                     else
10066                         *to++ = *s++;
10067                 }
10068                 /* allow nested opens and closes */
10069                 else if (*s == PL_multi_close && --brackets <= 0)
10070                     break;
10071                 else if (*s == PL_multi_open)
10072                     brackets++;
10073                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
10074                     has_utf8 = TRUE;
10075                 *to = *s;
10076             }
10077         }
10078         /* terminate the copied string and update the sv's end-of-string */
10079         *to = '\0';
10080         SvCUR_set(sv, to - SvPVX_const(sv));
10081
10082         /*
10083          * this next chunk reads more into the buffer if we're not done yet
10084          */
10085
10086         if (s < PL_bufend)
10087             break;              /* handle case where we are done yet :-) */
10088
10089 #ifndef PERL_STRICT_CR
10090         if (to - SvPVX_const(sv) >= 2) {
10091             if ((to[-2] == '\r' && to[-1] == '\n') ||
10092                 (to[-2] == '\n' && to[-1] == '\r'))
10093             {
10094                 to[-2] = '\n';
10095                 to--;
10096                 SvCUR_set(sv, to - SvPVX_const(sv));
10097             }
10098             else if (to[-1] == '\r')
10099                 to[-1] = '\n';
10100         }
10101         else if (to - SvPVX_const(sv) == 1 && to[-1] == '\r')
10102             to[-1] = '\n';
10103 #endif
10104         
10105      read_more_line:
10106         /* if we're out of file, or a read fails, bail and reset the current
10107            line marker so we can report where the unterminated string began
10108         */
10109         if (!PL_rsfp ||
10110          !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
10111             sv_free(sv);
10112             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
10113             return Nullch;
10114         }
10115         /* we read a line, so increment our line counter */
10116         CopLINE_inc(PL_curcop);
10117
10118         /* update debugger info */
10119         if (PERLDB_LINE && PL_curstash != PL_debstash) {
10120             SV *sv = NEWSV(88,0);
10121
10122             sv_upgrade(sv, SVt_PVMG);
10123             sv_setsv(sv,PL_linestr);
10124             (void)SvIOK_on(sv);
10125             SvIV_set(sv, 0);
10126             av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop), sv);
10127         }
10128
10129         /* having changed the buffer, we must update PL_bufend */
10130         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
10131         PL_last_lop = PL_last_uni = Nullch;
10132     }
10133
10134     /* at this point, we have successfully read the delimited string */
10135
10136     if (!PL_encoding || UTF) {
10137         if (keep_delims)
10138             sv_catpvn(sv, s, termlen);
10139         s += termlen;
10140     }
10141     if (has_utf8 || PL_encoding)
10142         SvUTF8_on(sv);
10143
10144     PL_multi_end = CopLINE(PL_curcop);
10145
10146     /* if we allocated too much space, give some back */
10147     if (SvCUR(sv) + 5 < SvLEN(sv)) {
10148         SvLEN_set(sv, SvCUR(sv) + 1);
10149         SvPV_renew(sv, SvLEN(sv));
10150     }
10151
10152     /* decide whether this is the first or second quoted string we've read
10153        for this op
10154     */
10155
10156     if (PL_lex_stuff)
10157         PL_lex_repl = sv;
10158     else
10159         PL_lex_stuff = sv;
10160     return s;
10161 }
10162
10163 /*
10164   scan_num
10165   takes: pointer to position in buffer
10166   returns: pointer to new position in buffer
10167   side-effects: builds ops for the constant in yylval.op
10168
10169   Read a number in any of the formats that Perl accepts:
10170
10171   \d(_?\d)*(\.(\d(_?\d)*)?)?[Ee][\+\-]?(\d(_?\d)*)      12 12.34 12.
10172   \.\d(_?\d)*[Ee][\+\-]?(\d(_?\d)*)                     .34
10173   0b[01](_?[01])*
10174   0[0-7](_?[0-7])*
10175   0x[0-9A-Fa-f](_?[0-9A-Fa-f])*
10176
10177   Like most scan_ routines, it uses the PL_tokenbuf buffer to hold the
10178   thing it reads.
10179
10180   If it reads a number without a decimal point or an exponent, it will
10181   try converting the number to an integer and see if it can do so
10182   without loss of precision.
10183 */
10184
10185 char *
10186 Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
10187 {
10188     register const char *s = start;     /* current position in buffer */
10189     register char *d;                   /* destination in temp buffer */
10190     register char *e;                   /* end of temp buffer */
10191     NV nv;                              /* number read, as a double */
10192     SV *sv = Nullsv;                    /* place to put the converted number */
10193     bool floatit;                       /* boolean: int or float? */
10194     const char *lastub = 0;             /* position of last underbar */
10195     static char const number_too_long[] = "Number too long";
10196
10197     /* We use the first character to decide what type of number this is */
10198
10199     switch (*s) {
10200     default:
10201       Perl_croak(aTHX_ "panic: scan_num");
10202
10203     /* if it starts with a 0, it could be an octal number, a decimal in
10204        0.13 disguise, or a hexadecimal number, or a binary number. */
10205     case '0':
10206         {
10207           /* variables:
10208              u          holds the "number so far"
10209              shift      the power of 2 of the base
10210                         (hex == 4, octal == 3, binary == 1)
10211              overflowed was the number more than we can hold?
10212
10213              Shift is used when we add a digit.  It also serves as an "are
10214              we in octal/hex/binary?" indicator to disallow hex characters
10215              when in octal mode.
10216            */
10217             NV n = 0.0;
10218             UV u = 0;
10219             I32 shift;
10220             bool overflowed = FALSE;
10221             bool just_zero  = TRUE;     /* just plain 0 or binary number? */
10222             static const NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
10223             static const char* const bases[5] =
10224               { "", "binary", "", "octal", "hexadecimal" };
10225             static const char* const Bases[5] =
10226               { "", "Binary", "", "Octal", "Hexadecimal" };
10227             static const char* const maxima[5] =
10228               { "",
10229                 "0b11111111111111111111111111111111",
10230                 "",
10231                 "037777777777",
10232                 "0xffffffff" };
10233             const char *base, *Base, *max;
10234
10235             /* check for hex */
10236             if (s[1] == 'x') {
10237                 shift = 4;
10238                 s += 2;
10239                 just_zero = FALSE;
10240             } else if (s[1] == 'b') {
10241                 shift = 1;
10242                 s += 2;
10243                 just_zero = FALSE;
10244             }
10245             /* check for a decimal in disguise */
10246             else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
10247                 goto decimal;
10248             /* so it must be octal */
10249             else {
10250                 shift = 3;
10251                 s++;
10252             }
10253
10254             if (*s == '_') {
10255                if (ckWARN(WARN_SYNTAX))
10256                    Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
10257                                "Misplaced _ in number");
10258                lastub = s++;
10259             }
10260
10261             base = bases[shift];
10262             Base = Bases[shift];
10263             max  = maxima[shift];
10264
10265             /* read the rest of the number */
10266             for (;;) {
10267                 /* x is used in the overflow test,
10268                    b is the digit we're adding on. */
10269                 UV x, b;
10270
10271                 switch (*s) {
10272
10273                 /* if we don't mention it, we're done */
10274                 default:
10275                     goto out;
10276
10277                 /* _ are ignored -- but warned about if consecutive */
10278                 case '_':
10279                     if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
10280                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
10281                                     "Misplaced _ in number");
10282                     lastub = s++;
10283                     break;
10284
10285                 /* 8 and 9 are not octal */
10286                 case '8': case '9':
10287                     if (shift == 3)
10288                         yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
10289                     /* FALL THROUGH */
10290
10291                 /* octal digits */
10292                 case '2': case '3': case '4':
10293                 case '5': case '6': case '7':
10294                     if (shift == 1)
10295                         yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
10296                     /* FALL THROUGH */
10297
10298                 case '0': case '1':
10299                     b = *s++ & 15;              /* ASCII digit -> value of digit */
10300                     goto digit;
10301
10302                 /* hex digits */
10303                 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
10304                 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
10305                     /* make sure they said 0x */
10306                     if (shift != 4)
10307                         goto out;
10308                     b = (*s++ & 7) + 9;
10309
10310                     /* Prepare to put the digit we have onto the end
10311                        of the number so far.  We check for overflows.
10312                     */
10313
10314                   digit:
10315                     just_zero = FALSE;
10316                     if (!overflowed) {
10317                         x = u << shift; /* make room for the digit */
10318
10319                         if ((x >> shift) != u
10320                             && !(PL_hints & HINT_NEW_BINARY)) {
10321                             overflowed = TRUE;
10322                             n = (NV) u;
10323                             if (ckWARN_d(WARN_OVERFLOW))
10324                                 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
10325                                             "Integer overflow in %s number",
10326                                             base);
10327                         } else
10328                             u = x | b;          /* add the digit to the end */
10329                     }
10330                     if (overflowed) {
10331                         n *= nvshift[shift];
10332                         /* If an NV has not enough bits in its
10333                          * mantissa to represent an UV this summing of
10334                          * small low-order numbers is a waste of time
10335                          * (because the NV cannot preserve the
10336                          * low-order bits anyway): we could just
10337                          * remember when did we overflow and in the
10338                          * end just multiply n by the right
10339                          * amount. */
10340                         n += (NV) b;
10341                     }
10342                     break;
10343                 }
10344             }
10345
10346           /* if we get here, we had success: make a scalar value from
10347              the number.
10348           */
10349           out:
10350
10351             /* final misplaced underbar check */
10352             if (s[-1] == '_') {
10353                 if (ckWARN(WARN_SYNTAX))
10354                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
10355             }
10356
10357             sv = NEWSV(92,0);
10358             if (overflowed) {
10359                 if (n > 4294967295.0 && ckWARN(WARN_PORTABLE))
10360                     Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
10361                                 "%s number > %s non-portable",
10362                                 Base, max);
10363                 sv_setnv(sv, n);
10364             }
10365             else {
10366 #if UVSIZE > 4
10367                 if (u > 0xffffffff && ckWARN(WARN_PORTABLE))
10368                     Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
10369                                 "%s number > %s non-portable",
10370                                 Base, max);
10371 #endif
10372                 sv_setuv(sv, u);
10373             }
10374             if (just_zero && (PL_hints & HINT_NEW_INTEGER))
10375                 sv = new_constant(start, s - start, "integer",
10376                                   sv, Nullsv, NULL);
10377             else if (PL_hints & HINT_NEW_BINARY)
10378                 sv = new_constant(start, s - start, "binary", sv, Nullsv, NULL);
10379         }
10380         break;
10381
10382     /*
10383       handle decimal numbers.
10384       we're also sent here when we read a 0 as the first digit
10385     */
10386     case '1': case '2': case '3': case '4': case '5':
10387     case '6': case '7': case '8': case '9': case '.':
10388       decimal:
10389         d = PL_tokenbuf;
10390         e = PL_tokenbuf + sizeof PL_tokenbuf - 6; /* room for various punctuation */
10391         floatit = FALSE;
10392
10393         /* read next group of digits and _ and copy into d */
10394         while (isDIGIT(*s) || *s == '_') {
10395             /* skip underscores, checking for misplaced ones
10396                if -w is on
10397             */
10398             if (*s == '_') {
10399                 if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
10400                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
10401                                 "Misplaced _ in number");
10402                 lastub = s++;
10403             }
10404             else {
10405                 /* check for end of fixed-length buffer */
10406                 if (d >= e)
10407                     Perl_croak(aTHX_ number_too_long);
10408                 /* if we're ok, copy the character */
10409                 *d++ = *s++;
10410             }
10411         }
10412
10413         /* final misplaced underbar check */
10414         if (lastub && s == lastub + 1) {
10415             if (ckWARN(WARN_SYNTAX))
10416                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
10417         }
10418
10419         /* read a decimal portion if there is one.  avoid
10420            3..5 being interpreted as the number 3. followed
10421            by .5
10422         */
10423         if (*s == '.' && s[1] != '.') {
10424             floatit = TRUE;
10425             *d++ = *s++;
10426
10427             if (*s == '_') {
10428                 if (ckWARN(WARN_SYNTAX))
10429                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
10430                                 "Misplaced _ in number");
10431                 lastub = s;
10432             }
10433
10434             /* copy, ignoring underbars, until we run out of digits.
10435             */
10436             for (; isDIGIT(*s) || *s == '_'; s++) {
10437                 /* fixed length buffer check */
10438                 if (d >= e)
10439                     Perl_croak(aTHX_ number_too_long);
10440                 if (*s == '_') {
10441                    if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
10442                        Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
10443                                    "Misplaced _ in number");
10444                    lastub = s;
10445                 }
10446                 else
10447                     *d++ = *s;
10448             }
10449             /* fractional part ending in underbar? */
10450             if (s[-1] == '_') {
10451                 if (ckWARN(WARN_SYNTAX))
10452                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
10453                                 "Misplaced _ in number");
10454             }
10455             if (*s == '.' && isDIGIT(s[1])) {
10456                 /* oops, it's really a v-string, but without the "v" */
10457                 s = start;
10458                 goto vstring;
10459             }
10460         }
10461
10462         /* read exponent part, if present */
10463         if ((*s == 'e' || *s == 'E') && strchr("+-0123456789_", s[1])) {
10464             floatit = TRUE;
10465             s++;
10466
10467             /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
10468             *d++ = 'e';         /* At least some Mach atof()s don't grok 'E' */
10469
10470             /* stray preinitial _ */
10471             if (*s == '_') {
10472                 if (ckWARN(WARN_SYNTAX))
10473                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
10474                                 "Misplaced _ in number");
10475                 lastub = s++;
10476             }
10477
10478             /* allow positive or negative exponent */
10479             if (*s == '+' || *s == '-')
10480                 *d++ = *s++;
10481
10482             /* stray initial _ */
10483             if (*s == '_') {
10484                 if (ckWARN(WARN_SYNTAX))
10485                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
10486                                 "Misplaced _ in number");
10487                 lastub = s++;
10488             }
10489
10490             /* read digits of exponent */
10491             while (isDIGIT(*s) || *s == '_') {
10492                 if (isDIGIT(*s)) {
10493                     if (d >= e)
10494                         Perl_croak(aTHX_ number_too_long);
10495                     *d++ = *s++;
10496                 }
10497                 else {
10498                    if (((lastub && s == lastub + 1) ||
10499                         (!isDIGIT(s[1]) && s[1] != '_'))
10500                     && ckWARN(WARN_SYNTAX))
10501                        Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
10502                                    "Misplaced _ in number");
10503                    lastub = s++;
10504                 }
10505             }
10506         }
10507
10508
10509         /* make an sv from the string */
10510         sv = NEWSV(92,0);
10511
10512         /*
10513            We try to do an integer conversion first if no characters
10514            indicating "float" have been found.
10515          */
10516
10517         if (!floatit) {
10518             UV uv;
10519             int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
10520
10521             if (flags == IS_NUMBER_IN_UV) {
10522               if (uv <= IV_MAX)
10523                 sv_setiv(sv, uv); /* Prefer IVs over UVs. */
10524               else
10525                 sv_setuv(sv, uv);
10526             } else if (flags == (IS_NUMBER_IN_UV | IS_NUMBER_NEG)) {
10527               if (uv <= (UV) IV_MIN)
10528                 sv_setiv(sv, -(IV)uv);
10529               else
10530                 floatit = TRUE;
10531             } else
10532               floatit = TRUE;
10533         }
10534         if (floatit) {
10535             /* terminate the string */
10536             *d = '\0';
10537             nv = Atof(PL_tokenbuf);
10538             sv_setnv(sv, nv);
10539         }
10540
10541         if ( floatit ? (PL_hints & HINT_NEW_FLOAT) :
10542                        (PL_hints & HINT_NEW_INTEGER) )
10543             sv = new_constant(PL_tokenbuf, d - PL_tokenbuf,
10544                               (floatit ? "float" : "integer"),
10545                               sv, Nullsv, NULL);
10546         break;
10547
10548     /* if it starts with a v, it could be a v-string */
10549     case 'v':
10550 vstring:
10551                 sv = NEWSV(92,5); /* preallocate storage space */
10552                 s = scan_vstring(s,sv);
10553         break;
10554     }
10555
10556     /* make the op for the constant and return */
10557
10558     if (sv)
10559         lvalp->opval = newSVOP(OP_CONST, 0, sv);
10560     else
10561         lvalp->opval = Nullop;
10562
10563     return (char *)s;
10564 }
10565
10566 STATIC char *
10567 S_scan_formline(pTHX_ register char *s)
10568 {
10569     register char *eol;
10570     register char *t;
10571     SV *stuff = newSVpvn("",0);
10572     bool needargs = FALSE;
10573     bool eofmt = FALSE;
10574
10575     while (!needargs) {
10576         if (*s == '.') {
10577 #ifdef PERL_STRICT_CR
10578             for (t = s+1;SPACE_OR_TAB(*t); t++) ;
10579 #else
10580             for (t = s+1;SPACE_OR_TAB(*t) || *t == '\r'; t++) ;
10581 #endif
10582             if (*t == '\n' || t == PL_bufend) {
10583                 eofmt = TRUE;
10584                 break;
10585             }
10586         }
10587         if (PL_in_eval && !PL_rsfp) {
10588             eol = (char *) memchr(s,'\n',PL_bufend-s);
10589             if (!eol++)
10590                 eol = PL_bufend;
10591         }
10592         else
10593             eol = PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
10594         if (*s != '#') {
10595             for (t = s; t < eol; t++) {
10596                 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
10597                     needargs = FALSE;
10598                     goto enough;        /* ~~ must be first line in formline */
10599                 }
10600                 if (*t == '@' || *t == '^')
10601                     needargs = TRUE;
10602             }
10603             if (eol > s) {
10604                 sv_catpvn(stuff, s, eol-s);
10605 #ifndef PERL_STRICT_CR
10606                 if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
10607                     char *end = SvPVX(stuff) + SvCUR(stuff);
10608                     end[-2] = '\n';
10609                     end[-1] = '\0';
10610                     SvCUR_set(stuff, SvCUR(stuff) - 1);
10611                 }
10612 #endif
10613             }
10614             else
10615               break;
10616         }
10617         s = (char*)eol;
10618         if (PL_rsfp) {
10619             s = filter_gets(PL_linestr, PL_rsfp, 0);
10620             PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
10621             PL_bufend = PL_bufptr + SvCUR(PL_linestr);
10622             PL_last_lop = PL_last_uni = Nullch;
10623             if (!s) {
10624                 s = PL_bufptr;
10625                 break;
10626             }
10627         }
10628         incline(s);
10629     }
10630   enough:
10631     if (SvCUR(stuff)) {
10632         PL_expect = XTERM;
10633         if (needargs) {
10634             PL_lex_state = LEX_NORMAL;
10635             PL_nextval[PL_nexttoke].ival = 0;
10636             force_next(',');
10637         }
10638         else
10639             PL_lex_state = LEX_FORMLINE;
10640         if (!IN_BYTES) {
10641             if (UTF && is_utf8_string((U8*)SvPVX_const(stuff), SvCUR(stuff)))
10642                 SvUTF8_on(stuff);
10643             else if (PL_encoding)
10644                 sv_recode_to_utf8(stuff, PL_encoding);
10645         }
10646         PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, stuff);
10647         force_next(THING);
10648         PL_nextval[PL_nexttoke].ival = OP_FORMLINE;
10649         force_next(LSTOP);
10650     }
10651     else {
10652         SvREFCNT_dec(stuff);
10653         if (eofmt)
10654             PL_lex_formbrack = 0;
10655         PL_bufptr = s;
10656     }
10657     return s;
10658 }
10659
10660 STATIC void
10661 S_set_csh(pTHX)
10662 {
10663 #ifdef CSH
10664     if (!PL_cshlen)
10665         PL_cshlen = strlen(PL_cshname);
10666 #endif
10667 }
10668
10669 I32
10670 Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
10671 {
10672     const I32 oldsavestack_ix = PL_savestack_ix;
10673     CV* outsidecv = PL_compcv;
10674
10675     if (PL_compcv) {
10676         assert(SvTYPE(PL_compcv) == SVt_PVCV);
10677     }
10678     SAVEI32(PL_subline);
10679     save_item(PL_subname);
10680     SAVESPTR(PL_compcv);
10681
10682     PL_compcv = (CV*)NEWSV(1104,0);
10683     sv_upgrade((SV *)PL_compcv, is_format ? SVt_PVFM : SVt_PVCV);
10684     CvFLAGS(PL_compcv) |= flags;
10685
10686     PL_subline = CopLINE(PL_curcop);
10687     CvPADLIST(PL_compcv) = pad_new(padnew_SAVE|padnew_SAVESUB);
10688     CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc(outsidecv);
10689     CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
10690
10691     return oldsavestack_ix;
10692 }
10693
10694 #ifdef __SC__
10695 #pragma segment Perl_yylex
10696 #endif
10697 int
10698 Perl_yywarn(pTHX_ const char *s)
10699 {
10700     PL_in_eval |= EVAL_WARNONLY;
10701     yyerror(s);
10702     PL_in_eval &= ~EVAL_WARNONLY;
10703     return 0;
10704 }
10705
10706 int
10707 Perl_yyerror(pTHX_ const char *s)
10708 {
10709     const char *where = NULL;
10710     const char *context = NULL;
10711     int contlen = -1;
10712     SV *msg;
10713
10714     if (!yychar || (yychar == ';' && !PL_rsfp))
10715         where = "at EOF";
10716     else if (PL_oldoldbufptr && PL_bufptr > PL_oldoldbufptr &&
10717       PL_bufptr - PL_oldoldbufptr < 200 && PL_oldoldbufptr != PL_oldbufptr &&
10718       PL_oldbufptr != PL_bufptr) {
10719         /*
10720                 Only for NetWare:
10721                 The code below is removed for NetWare because it abends/crashes on NetWare
10722                 when the script has error such as not having the closing quotes like:
10723                     if ($var eq "value)
10724                 Checking of white spaces is anyway done in NetWare code.
10725         */
10726 #ifndef NETWARE
10727         while (isSPACE(*PL_oldoldbufptr))
10728             PL_oldoldbufptr++;
10729 #endif
10730         context = PL_oldoldbufptr;
10731         contlen = PL_bufptr - PL_oldoldbufptr;
10732     }
10733     else if (PL_oldbufptr && PL_bufptr > PL_oldbufptr &&
10734       PL_bufptr - PL_oldbufptr < 200 && PL_oldbufptr != PL_bufptr) {
10735         /*
10736                 Only for NetWare:
10737                 The code below is removed for NetWare because it abends/crashes on NetWare
10738                 when the script has error such as not having the closing quotes like:
10739                     if ($var eq "value)
10740                 Checking of white spaces is anyway done in NetWare code.
10741         */
10742 #ifndef NETWARE
10743         while (isSPACE(*PL_oldbufptr))
10744             PL_oldbufptr++;
10745 #endif
10746         context = PL_oldbufptr;
10747         contlen = PL_bufptr - PL_oldbufptr;
10748     }
10749     else if (yychar > 255)
10750         where = "next token ???";
10751     else if (yychar == -2) { /* YYEMPTY */
10752         if (PL_lex_state == LEX_NORMAL ||
10753            (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
10754             where = "at end of line";
10755         else if (PL_lex_inpat)
10756             where = "within pattern";
10757         else
10758             where = "within string";
10759     }
10760     else {
10761         SV *where_sv = sv_2mortal(newSVpvn("next char ", 10));
10762         if (yychar < 32)
10763             Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
10764         else if (isPRINT_LC(yychar))
10765             Perl_sv_catpvf(aTHX_ where_sv, "%c", yychar);
10766         else
10767             Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
10768         where = SvPVX_const(where_sv);
10769     }
10770     msg = sv_2mortal(newSVpv(s, 0));
10771     Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
10772         OutCopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
10773     if (context)
10774         Perl_sv_catpvf(aTHX_ msg, "near \"%.*s\"\n", contlen, context);
10775     else
10776         Perl_sv_catpvf(aTHX_ msg, "%s\n", where);
10777     if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
10778         Perl_sv_catpvf(aTHX_ msg,
10779         "  (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
10780                 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
10781         PL_multi_end = 0;
10782     }
10783     if (PL_in_eval & EVAL_WARNONLY && ckWARN_d(WARN_SYNTAX))
10784         Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "%"SVf, msg);
10785     else
10786         qerror(msg);
10787     if (PL_error_count >= 10) {
10788         if (PL_in_eval && SvCUR(ERRSV))
10789             Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
10790             ERRSV, OutCopFILE(PL_curcop));
10791         else
10792             Perl_croak(aTHX_ "%s has too many errors.\n",
10793             OutCopFILE(PL_curcop));
10794     }
10795     PL_in_my = 0;
10796     PL_in_my_stash = Nullhv;
10797     return 0;
10798 }
10799 #ifdef __SC__
10800 #pragma segment Main
10801 #endif
10802
10803 STATIC char*
10804 S_swallow_bom(pTHX_ U8 *s)
10805 {
10806     const STRLEN slen = SvCUR(PL_linestr);
10807     switch (s[0]) {
10808     case 0xFF:
10809         if (s[1] == 0xFE) {
10810             /* UTF-16 little-endian? (or UTF32-LE?) */
10811             if (s[2] == 0 && s[3] == 0)  /* UTF-32 little-endian */
10812                 Perl_croak(aTHX_ "Unsupported script encoding UTF32-LE");
10813 #ifndef PERL_NO_UTF16_FILTER
10814             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF16-LE script encoding (BOM)\n");
10815             s += 2;
10816         utf16le:
10817             if (PL_bufend > (char*)s) {
10818                 U8 *news;
10819                 I32 newlen;
10820
10821                 filter_add(utf16rev_textfilter, NULL);
10822                 Newx(news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
10823                 utf16_to_utf8_reversed(s, news,
10824                                        PL_bufend - (char*)s - 1,
10825                                        &newlen);
10826                 sv_setpvn(PL_linestr, (const char*)news, newlen);
10827                 Safefree(news);
10828                 SvUTF8_on(PL_linestr);
10829                 s = (U8*)SvPVX(PL_linestr);
10830                 PL_bufend = SvPVX(PL_linestr) + newlen;
10831             }
10832 #else
10833             Perl_croak(aTHX_ "Unsupported script encoding UTF16-LE");
10834 #endif
10835         }
10836         break;
10837     case 0xFE:
10838         if (s[1] == 0xFF) {   /* UTF-16 big-endian? */
10839 #ifndef PERL_NO_UTF16_FILTER
10840             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (BOM)\n");
10841             s += 2;
10842         utf16be:
10843             if (PL_bufend > (char *)s) {
10844                 U8 *news;
10845                 I32 newlen;
10846
10847                 filter_add(utf16_textfilter, NULL);
10848                 Newx(news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
10849                 utf16_to_utf8(s, news,
10850                               PL_bufend - (char*)s,
10851                               &newlen);
10852                 sv_setpvn(PL_linestr, (const char*)news, newlen);
10853                 Safefree(news);
10854                 SvUTF8_on(PL_linestr);
10855                 s = (U8*)SvPVX(PL_linestr);
10856                 PL_bufend = SvPVX(PL_linestr) + newlen;
10857             }
10858 #else
10859             Perl_croak(aTHX_ "Unsupported script encoding UTF16-BE");
10860 #endif
10861         }
10862         break;
10863     case 0xEF:
10864         if (slen > 2 && s[1] == 0xBB && s[2] == 0xBF) {
10865             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
10866             s += 3;                      /* UTF-8 */
10867         }
10868         break;
10869     case 0:
10870         if (slen > 3) {
10871              if (s[1] == 0) {
10872                   if (s[2] == 0xFE && s[3] == 0xFF) {
10873                        /* UTF-32 big-endian */
10874                        Perl_croak(aTHX_ "Unsupported script encoding UTF32-BE");
10875                   }
10876              }
10877              else if (s[2] == 0 && s[3] != 0) {
10878                   /* Leading bytes
10879                    * 00 xx 00 xx
10880                    * are a good indicator of UTF-16BE. */
10881                   if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (no BOM)\n");
10882                   goto utf16be;
10883              }
10884         }
10885     default:
10886          if (slen > 3 && s[1] == 0 && s[2] != 0 && s[3] == 0) {
10887                   /* Leading bytes
10888                    * xx 00 xx 00
10889                    * are a good indicator of UTF-16LE. */
10890               if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (no BOM)\n");
10891               goto utf16le;
10892          }
10893     }
10894     return (char*)s;
10895 }
10896
10897 /*
10898  * restore_rsfp
10899  * Restore a source filter.
10900  */
10901
10902 static void
10903 restore_rsfp(pTHX_ void *f)
10904 {
10905     PerlIO *fp = (PerlIO*)f;
10906
10907     if (PL_rsfp == PerlIO_stdin())
10908         PerlIO_clearerr(PL_rsfp);
10909     else if (PL_rsfp && (PL_rsfp != fp))
10910         PerlIO_close(PL_rsfp);
10911     PL_rsfp = fp;
10912 }
10913
10914 #ifndef PERL_NO_UTF16_FILTER
10915 static I32
10916 utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
10917 {
10918     const STRLEN old = SvCUR(sv);
10919     const I32 count = FILTER_READ(idx+1, sv, maxlen);
10920     DEBUG_P(PerlIO_printf(Perl_debug_log,
10921                           "utf16_textfilter(%p): %d %d (%d)\n",
10922                           utf16_textfilter, idx, maxlen, (int) count));
10923     if (count) {
10924         U8* tmps;
10925         I32 newlen;
10926         Newx(tmps, SvCUR(sv) * 3 / 2 + 1, U8);
10927         Copy(SvPVX_const(sv), tmps, old, char);
10928         utf16_to_utf8((U8*)SvPVX_const(sv) + old, tmps + old,
10929                       SvCUR(sv) - old, &newlen);
10930         sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
10931     }
10932     DEBUG_P({sv_dump(sv);});
10933     return SvCUR(sv);
10934 }
10935
10936 static I32
10937 utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen)
10938 {
10939     const STRLEN old = SvCUR(sv);
10940     const I32 count = FILTER_READ(idx+1, sv, maxlen);
10941     DEBUG_P(PerlIO_printf(Perl_debug_log,
10942                           "utf16rev_textfilter(%p): %d %d (%d)\n",
10943                           utf16rev_textfilter, idx, maxlen, (int) count));
10944     if (count) {
10945         U8* tmps;
10946         I32 newlen;
10947         Newx(tmps, SvCUR(sv) * 3 / 2 + 1, U8);
10948         Copy(SvPVX_const(sv), tmps, old, char);
10949         utf16_to_utf8((U8*)SvPVX_const(sv) + old, tmps + old,
10950                       SvCUR(sv) - old, &newlen);
10951         sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
10952     }
10953     DEBUG_P({ sv_dump(sv); });
10954     return count;
10955 }
10956 #endif
10957
10958 /*
10959 Returns a pointer to the next character after the parsed
10960 vstring, as well as updating the passed in sv.
10961
10962 Function must be called like
10963
10964         sv = NEWSV(92,5);
10965         s = scan_vstring(s,sv);
10966
10967 The sv should already be large enough to store the vstring
10968 passed in, for performance reasons.
10969
10970 */
10971
10972 char *
10973 Perl_scan_vstring(pTHX_ const char *s, SV *sv)
10974 {
10975     const char *pos = s;
10976     const char *start = s;
10977     if (*pos == 'v') pos++;  /* get past 'v' */
10978     while (pos < PL_bufend && (isDIGIT(*pos) || *pos == '_'))
10979         pos++;
10980     if ( *pos != '.') {
10981         /* this may not be a v-string if followed by => */
10982         const char *next = pos;
10983         while (next < PL_bufend && isSPACE(*next))
10984             ++next;
10985         if ((PL_bufend - next) >= 2 && *next == '=' && next[1] == '>' ) {
10986             /* return string not v-string */
10987             sv_setpvn(sv,(char *)s,pos-s);
10988             return (char *)pos;
10989         }
10990     }
10991
10992     if (!isALPHA(*pos)) {
10993         UV rev;
10994         U8 tmpbuf[UTF8_MAXBYTES+1];
10995         U8 *tmpend;
10996
10997         if (*s == 'v') s++;  /* get past 'v' */
10998
10999         sv_setpvn(sv, "", 0);
11000
11001         for (;;) {
11002             rev = 0;
11003             {
11004                 /* this is atoi() that tolerates underscores */
11005                 const char *end = pos;
11006                 UV mult = 1;
11007                 while (--end >= s) {
11008                     UV orev;
11009                     if (*end == '_')
11010                         continue;
11011                     orev = rev;
11012                     rev += (*end - '0') * mult;
11013                     mult *= 10;
11014                     if (orev > rev && ckWARN_d(WARN_OVERFLOW))
11015                         Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
11016                                     "Integer overflow in decimal number");
11017                 }
11018             }
11019 #ifdef EBCDIC
11020             if (rev > 0x7FFFFFFF)
11021                  Perl_croak(aTHX_ "In EBCDIC the v-string components cannot exceed 2147483647");
11022 #endif
11023             /* Append native character for the rev point */
11024             tmpend = uvchr_to_utf8(tmpbuf, rev);
11025             sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
11026             if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(rev)))
11027                  SvUTF8_on(sv);
11028             if (pos + 1 < PL_bufend && *pos == '.' && isDIGIT(pos[1]))
11029                  s = ++pos;
11030             else {
11031                  s = pos;
11032                  break;
11033             }
11034             while (pos < PL_bufend && (isDIGIT(*pos) || *pos == '_'))
11035                  pos++;
11036         }
11037         SvPOK_on(sv);
11038         sv_magic(sv,NULL,PERL_MAGIC_vstring,(const char*)start, pos-start);
11039         SvRMAGICAL_on(sv);
11040     }
11041     return (char *)s;
11042 }
11043
11044 /*
11045  * Local variables:
11046  * c-indentation-style: bsd
11047  * c-basic-offset: 4
11048  * indent-tabs-mode: t
11049  * End:
11050  *
11051  * ex: set ts=8 sts=4 sw=4 noet:
11052  */