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