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