This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Replace ^M by a space in test for bug #37716, to make
[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((I32)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_ 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* const 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                     (int)(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", (int)(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] = (char)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 * const cf = CopFILE(PL_curcop);
684         STRLEN tmplen = cf ? strlen(cf) : 0;
685         if (tmplen > 7 && strnEQ(cf, "(eval ", 6)) {
686             /* must copy *{"::_<(eval N)[oldfilename:L]"}
687              * to *{"::_<newfilename"} */
688             char smallbuf[256], smallbuf2[256];
689             char *tmpbuf, *tmpbuf2;
690             GV **gvp, *gv2;
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     register const 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 * const 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)tmp);
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                     /* Also, if "_" follows a filetest operator, it's a bareword */
4276
4277                     if (
4278                         ( !immediate_paren && (PL_last_lop_op == OP_SORT ||
4279                          ((!gv || !GvCVu(gv)) &&
4280                         (PL_last_lop_op != OP_MAPSTART &&
4281                          PL_last_lop_op != OP_GREPSTART))))
4282                        || (PL_tokenbuf[0] == '_' && PL_tokenbuf[1] == '\0'
4283                             && ((PL_opargs[PL_last_lop_op] & OA_CLASS_MASK) == OA_FILESTATOP))
4284                        )
4285                     {
4286                         PL_expect = (PL_last_lop == PL_oldoldbufptr) ? XTERM : XOPERATOR;
4287                         goto bareword;
4288                     }
4289                 }
4290
4291                 PL_expect = XOPERATOR;
4292                 s = skipspace(s);
4293
4294                 /* Is this a word before a => operator? */
4295                 if (*s == '=' && s[1] == '>' && !pkgname) {
4296                     CLINE;
4297                     sv_setpv(((SVOP*)yylval.opval)->op_sv, PL_tokenbuf);
4298                     if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
4299                       SvUTF8_on(((SVOP*)yylval.opval)->op_sv);
4300                     TERM(WORD);
4301                 }
4302
4303                 /* If followed by a paren, it's certainly a subroutine. */
4304                 if (*s == '(') {
4305                     CLINE;
4306                     if (gv && GvCVu(gv)) {
4307                         for (d = s + 1; SPACE_OR_TAB(*d); d++) ;
4308                         if (*d == ')' && (sv = cv_const_sv(GvCV(gv)))) {
4309                             s = d + 1;
4310                             goto its_constant;
4311                         }
4312                     }
4313                     PL_nextval[PL_nexttoke].opval = yylval.opval;
4314                     PL_expect = XOPERATOR;
4315                     force_next(WORD);
4316                     yylval.ival = 0;
4317                     TOKEN('&');
4318                 }
4319
4320                 /* If followed by var or block, call it a method (unless sub) */
4321
4322                 if ((*s == '$' || *s == '{') && (!gv || !GvCVu(gv))) {
4323                     PL_last_lop = PL_oldbufptr;
4324                     PL_last_lop_op = OP_METHOD;
4325                     PREBLOCK(METHOD);
4326                 }
4327
4328                 /* If followed by a bareword, see if it looks like indir obj. */
4329
4330                 if (!orig_keyword
4331                         && (isIDFIRST_lazy_if(s,UTF) || *s == '$')
4332                         && (tmp = intuit_method(s,gv)))
4333                     return REPORT(tmp);
4334
4335                 /* Not a method, so call it a subroutine (if defined) */
4336
4337                 if (gv && GvCVu(gv)) {
4338                     CV* cv;
4339                     if (lastchar == '-' && ckWARN_d(WARN_AMBIGUOUS))
4340                         Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
4341                                 "Ambiguous use of -%s resolved as -&%s()",
4342                                 PL_tokenbuf, PL_tokenbuf);
4343                     /* Check for a constant sub */
4344                     cv = GvCV(gv);
4345                     if ((sv = cv_const_sv(cv))) {
4346                   its_constant:
4347                         SvREFCNT_dec(((SVOP*)yylval.opval)->op_sv);
4348                         ((SVOP*)yylval.opval)->op_sv = SvREFCNT_inc(sv);
4349                         yylval.opval->op_private = 0;
4350                         TOKEN(WORD);
4351                     }
4352
4353                     /* Resolve to GV now. */
4354                     op_free(yylval.opval);
4355                     yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
4356                     yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
4357                     PL_last_lop = PL_oldbufptr;
4358                     PL_last_lop_op = OP_ENTERSUB;
4359                     /* Is there a prototype? */
4360                     if (SvPOK(cv)) {
4361                         STRLEN len;
4362                         const char *proto = SvPV_const((SV*)cv, len);
4363                         if (!len)
4364                             TERM(FUNC0SUB);
4365                         if (*proto == '$' && proto[1] == '\0')
4366                             OPERATOR(UNIOPSUB);
4367                         while (*proto == ';')
4368                             proto++;
4369                         if (*proto == '&' && *s == '{') {
4370                             sv_setpv(PL_subname, PL_curstash ?
4371                                         "__ANON__" : "__ANON__::__ANON__");
4372                             PREBLOCK(LSTOPSUB);
4373                         }
4374                     }
4375                     PL_nextval[PL_nexttoke].opval = yylval.opval;
4376                     PL_expect = XTERM;
4377                     force_next(WORD);
4378                     TOKEN(NOAMP);
4379                 }
4380
4381                 /* Call it a bare word */
4382
4383                 if (PL_hints & HINT_STRICT_SUBS)
4384                     yylval.opval->op_private |= OPpCONST_STRICT;
4385                 else {
4386                 bareword:
4387                     if (lastchar != '-') {
4388                         if (ckWARN(WARN_RESERVED)) {
4389                             for (d = PL_tokenbuf; *d && isLOWER(*d); d++) ;
4390                             if (!*d && !gv_stashpv(PL_tokenbuf,FALSE))
4391                                 Perl_warner(aTHX_ packWARN(WARN_RESERVED), PL_warn_reserved,
4392                                        PL_tokenbuf);
4393                         }
4394                     }
4395                 }
4396
4397             safe_bareword:
4398                 if ((lastchar == '*' || lastchar == '%' || lastchar == '&')
4399                     && ckWARN_d(WARN_AMBIGUOUS)) {
4400                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
4401                         "Operator or semicolon missing before %c%s",
4402                         lastchar, PL_tokenbuf);
4403                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
4404                         "Ambiguous use of %c resolved as operator %c",
4405                         lastchar, lastchar);
4406                 }
4407                 TOKEN(WORD);
4408             }
4409
4410         case KEY___FILE__:
4411             yylval.opval = (OP*)newSVOP(OP_CONST, 0,
4412                                         newSVpv(CopFILE(PL_curcop),0));
4413             TERM(THING);
4414
4415         case KEY___LINE__:
4416             yylval.opval = (OP*)newSVOP(OP_CONST, 0,
4417                                     Perl_newSVpvf(aTHX_ "%"IVdf, (IV)CopLINE(PL_curcop)));
4418             TERM(THING);
4419
4420         case KEY___PACKAGE__:
4421             yylval.opval = (OP*)newSVOP(OP_CONST, 0,
4422                                         (PL_curstash
4423                                          ? newSVhek(HvNAME_HEK(PL_curstash))
4424                                          : &PL_sv_undef));
4425             TERM(THING);
4426
4427         case KEY___DATA__:
4428         case KEY___END__: {
4429             GV *gv;
4430             if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
4431                 const char *pname = "main";
4432                 if (PL_tokenbuf[2] == 'D')
4433                     pname = HvNAME_get(PL_curstash ? PL_curstash : PL_defstash);
4434                 gv = gv_fetchpv(Perl_form(aTHX_ "%s::DATA", pname), TRUE, SVt_PVIO);
4435                 GvMULTI_on(gv);
4436                 if (!GvIO(gv))
4437                     GvIOp(gv) = newIO();
4438                 IoIFP(GvIOp(gv)) = PL_rsfp;
4439 #if defined(HAS_FCNTL) && defined(F_SETFD)
4440                 {
4441                     const int fd = PerlIO_fileno(PL_rsfp);
4442                     fcntl(fd,F_SETFD,fd >= 3);
4443                 }
4444 #endif
4445                 /* Mark this internal pseudo-handle as clean */
4446                 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
4447                 if (PL_preprocess)
4448                     IoTYPE(GvIOp(gv)) = IoTYPE_PIPE;
4449                 else if ((PerlIO*)PL_rsfp == PerlIO_stdin())
4450                     IoTYPE(GvIOp(gv)) = IoTYPE_STD;
4451                 else
4452                     IoTYPE(GvIOp(gv)) = IoTYPE_RDONLY;
4453 #if defined(WIN32) && !defined(PERL_TEXTMODE_SCRIPTS)
4454                 /* if the script was opened in binmode, we need to revert
4455                  * it to text mode for compatibility; but only iff it has CRs
4456                  * XXX this is a questionable hack at best. */
4457                 if (PL_bufend-PL_bufptr > 2
4458                     && PL_bufend[-1] == '\n' && PL_bufend[-2] == '\r')
4459                 {
4460                     Off_t loc = 0;
4461                     if (IoTYPE(GvIOp(gv)) == IoTYPE_RDONLY) {
4462                         loc = PerlIO_tell(PL_rsfp);
4463                         (void)PerlIO_seek(PL_rsfp, 0L, 0);
4464                     }
4465 #ifdef NETWARE
4466                         if (PerlLIO_setmode(PL_rsfp, O_TEXT) != -1) {
4467 #else
4468                     if (PerlLIO_setmode(PerlIO_fileno(PL_rsfp), O_TEXT) != -1) {
4469 #endif  /* NETWARE */
4470 #ifdef PERLIO_IS_STDIO /* really? */
4471 #  if defined(__BORLANDC__)
4472                         /* XXX see note in do_binmode() */
4473                         ((FILE*)PL_rsfp)->flags &= ~_F_BIN;
4474 #  endif
4475 #endif
4476                         if (loc > 0)
4477                             PerlIO_seek(PL_rsfp, loc, 0);
4478                     }
4479                 }
4480 #endif
4481 #ifdef PERLIO_LAYERS
4482                 if (!IN_BYTES) {
4483                     if (UTF)
4484                         PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, ":utf8");
4485                     else if (PL_encoding) {
4486                         SV *name;
4487                         dSP;
4488                         ENTER;
4489                         SAVETMPS;
4490                         PUSHMARK(sp);
4491                         EXTEND(SP, 1);
4492                         XPUSHs(PL_encoding);
4493                         PUTBACK;
4494                         call_method("name", G_SCALAR);
4495                         SPAGAIN;
4496                         name = POPs;
4497                         PUTBACK;
4498                         PerlIO_apply_layers(aTHX_ PL_rsfp, NULL,
4499                                             Perl_form(aTHX_ ":encoding(%"SVf")",
4500                                                       name));
4501                         FREETMPS;
4502                         LEAVE;
4503                     }
4504                 }
4505 #endif
4506                 PL_rsfp = Nullfp;
4507             }
4508             goto fake_eof;
4509         }
4510
4511         case KEY_AUTOLOAD:
4512         case KEY_DESTROY:
4513         case KEY_BEGIN:
4514         case KEY_CHECK:
4515         case KEY_INIT:
4516         case KEY_END:
4517             if (PL_expect == XSTATE) {
4518                 s = PL_bufptr;
4519                 goto really_sub;
4520             }
4521             goto just_a_word;
4522
4523         case KEY_CORE:
4524             if (*s == ':' && s[1] == ':') {
4525                 s += 2;
4526                 d = s;
4527                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
4528                 if (!(tmp = keyword(PL_tokenbuf, len)))
4529                     Perl_croak(aTHX_ "CORE::%s is not a keyword", PL_tokenbuf);
4530                 if (tmp < 0)
4531                     tmp = -tmp;
4532                 else if (tmp == KEY_require || tmp == KEY_do)
4533                     /* that's a way to remember we saw "CORE::" */
4534                     orig_keyword = tmp;
4535                 goto reserved_word;
4536             }
4537             goto just_a_word;
4538
4539         case KEY_abs:
4540             UNI(OP_ABS);
4541
4542         case KEY_alarm:
4543             UNI(OP_ALARM);
4544
4545         case KEY_accept:
4546             LOP(OP_ACCEPT,XTERM);
4547
4548         case KEY_and:
4549             OPERATOR(ANDOP);
4550
4551         case KEY_atan2:
4552             LOP(OP_ATAN2,XTERM);
4553
4554         case KEY_bind:
4555             LOP(OP_BIND,XTERM);
4556
4557         case KEY_binmode:
4558             LOP(OP_BINMODE,XTERM);
4559
4560         case KEY_bless:
4561             LOP(OP_BLESS,XTERM);
4562
4563         case KEY_chop:
4564             UNI(OP_CHOP);
4565
4566         case KEY_continue:
4567             PREBLOCK(CONTINUE);
4568
4569         case KEY_chdir:
4570             (void)gv_fetchpv("ENV",TRUE, SVt_PVHV);     /* may use HOME */
4571             UNI(OP_CHDIR);
4572
4573         case KEY_close:
4574             UNI(OP_CLOSE);
4575
4576         case KEY_closedir:
4577             UNI(OP_CLOSEDIR);
4578
4579         case KEY_cmp:
4580             Eop(OP_SCMP);
4581
4582         case KEY_caller:
4583             UNI(OP_CALLER);
4584
4585         case KEY_crypt:
4586 #ifdef FCRYPT
4587             if (!PL_cryptseen) {
4588                 PL_cryptseen = TRUE;
4589                 init_des();
4590             }
4591 #endif
4592             LOP(OP_CRYPT,XTERM);
4593
4594         case KEY_chmod:
4595             LOP(OP_CHMOD,XTERM);
4596
4597         case KEY_chown:
4598             LOP(OP_CHOWN,XTERM);
4599
4600         case KEY_connect:
4601             LOP(OP_CONNECT,XTERM);
4602
4603         case KEY_chr:
4604             UNI(OP_CHR);
4605
4606         case KEY_cos:
4607             UNI(OP_COS);
4608
4609         case KEY_chroot:
4610             UNI(OP_CHROOT);
4611
4612         case KEY_do:
4613             s = skipspace(s);
4614             if (*s == '{')
4615                 PRETERMBLOCK(DO);
4616             if (*s != '\'')
4617                 s = force_word(s,WORD,TRUE,TRUE,FALSE);
4618             if (orig_keyword == KEY_do) {
4619                 orig_keyword = 0;
4620                 yylval.ival = 1;
4621             }
4622             else
4623                 yylval.ival = 0;
4624             OPERATOR(DO);
4625
4626         case KEY_die:
4627             PL_hints |= HINT_BLOCK_SCOPE;
4628             LOP(OP_DIE,XTERM);
4629
4630         case KEY_defined:
4631             UNI(OP_DEFINED);
4632
4633         case KEY_delete:
4634             UNI(OP_DELETE);
4635
4636         case KEY_dbmopen:
4637             gv_fetchpv("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
4638             LOP(OP_DBMOPEN,XTERM);
4639
4640         case KEY_dbmclose:
4641             UNI(OP_DBMCLOSE);
4642
4643         case KEY_dump:
4644             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4645             LOOPX(OP_DUMP);
4646
4647         case KEY_else:
4648             PREBLOCK(ELSE);
4649
4650         case KEY_elsif:
4651             yylval.ival = CopLINE(PL_curcop);
4652             OPERATOR(ELSIF);
4653
4654         case KEY_eq:
4655             Eop(OP_SEQ);
4656
4657         case KEY_exists:
4658             UNI(OP_EXISTS);
4659         
4660         case KEY_exit:
4661             UNI(OP_EXIT);
4662
4663         case KEY_eval:
4664             s = skipspace(s);
4665             PL_expect = (*s == '{') ? XTERMBLOCK : XTERM;
4666             UNIBRACK(OP_ENTEREVAL);
4667
4668         case KEY_eof:
4669             UNI(OP_EOF);
4670
4671         case KEY_err:
4672             OPERATOR(DOROP);
4673
4674         case KEY_exp:
4675             UNI(OP_EXP);
4676
4677         case KEY_each:
4678             UNI(OP_EACH);
4679
4680         case KEY_exec:
4681             set_csh();
4682             LOP(OP_EXEC,XREF);
4683
4684         case KEY_endhostent:
4685             FUN0(OP_EHOSTENT);
4686
4687         case KEY_endnetent:
4688             FUN0(OP_ENETENT);
4689
4690         case KEY_endservent:
4691             FUN0(OP_ESERVENT);
4692
4693         case KEY_endprotoent:
4694             FUN0(OP_EPROTOENT);
4695
4696         case KEY_endpwent:
4697             FUN0(OP_EPWENT);
4698
4699         case KEY_endgrent:
4700             FUN0(OP_EGRENT);
4701
4702         case KEY_for:
4703         case KEY_foreach:
4704             yylval.ival = CopLINE(PL_curcop);
4705             s = skipspace(s);
4706             if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) {
4707                 char *p = s;
4708                 if ((PL_bufend - p) >= 3 &&
4709                     strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
4710                     p += 2;
4711                 else if ((PL_bufend - p) >= 4 &&
4712                     strnEQ(p, "our", 3) && isSPACE(*(p + 3)))
4713                     p += 3;
4714                 p = skipspace(p);
4715                 if (isIDFIRST_lazy_if(p,UTF)) {
4716                     p = scan_ident(p, PL_bufend,
4717                         PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
4718                     p = skipspace(p);
4719                 }
4720                 if (*p != '$')
4721                     Perl_croak(aTHX_ "Missing $ on loop variable");
4722             }
4723             OPERATOR(FOR);
4724
4725         case KEY_formline:
4726             LOP(OP_FORMLINE,XTERM);
4727
4728         case KEY_fork:
4729             FUN0(OP_FORK);
4730
4731         case KEY_fcntl:
4732             LOP(OP_FCNTL,XTERM);
4733
4734         case KEY_fileno:
4735             UNI(OP_FILENO);
4736
4737         case KEY_flock:
4738             LOP(OP_FLOCK,XTERM);
4739
4740         case KEY_gt:
4741             Rop(OP_SGT);
4742
4743         case KEY_ge:
4744             Rop(OP_SGE);
4745
4746         case KEY_grep:
4747             LOP(OP_GREPSTART, XREF);
4748
4749         case KEY_goto:
4750             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4751             LOOPX(OP_GOTO);
4752
4753         case KEY_gmtime:
4754             UNI(OP_GMTIME);
4755
4756         case KEY_getc:
4757             UNIDOR(OP_GETC);
4758
4759         case KEY_getppid:
4760             FUN0(OP_GETPPID);
4761
4762         case KEY_getpgrp:
4763             UNI(OP_GETPGRP);
4764
4765         case KEY_getpriority:
4766             LOP(OP_GETPRIORITY,XTERM);
4767
4768         case KEY_getprotobyname:
4769             UNI(OP_GPBYNAME);
4770
4771         case KEY_getprotobynumber:
4772             LOP(OP_GPBYNUMBER,XTERM);
4773
4774         case KEY_getprotoent:
4775             FUN0(OP_GPROTOENT);
4776
4777         case KEY_getpwent:
4778             FUN0(OP_GPWENT);
4779
4780         case KEY_getpwnam:
4781             UNI(OP_GPWNAM);
4782
4783         case KEY_getpwuid:
4784             UNI(OP_GPWUID);
4785
4786         case KEY_getpeername:
4787             UNI(OP_GETPEERNAME);
4788
4789         case KEY_gethostbyname:
4790             UNI(OP_GHBYNAME);
4791
4792         case KEY_gethostbyaddr:
4793             LOP(OP_GHBYADDR,XTERM);
4794
4795         case KEY_gethostent:
4796             FUN0(OP_GHOSTENT);
4797
4798         case KEY_getnetbyname:
4799             UNI(OP_GNBYNAME);
4800
4801         case KEY_getnetbyaddr:
4802             LOP(OP_GNBYADDR,XTERM);
4803
4804         case KEY_getnetent:
4805             FUN0(OP_GNETENT);
4806
4807         case KEY_getservbyname:
4808             LOP(OP_GSBYNAME,XTERM);
4809
4810         case KEY_getservbyport:
4811             LOP(OP_GSBYPORT,XTERM);
4812
4813         case KEY_getservent:
4814             FUN0(OP_GSERVENT);
4815
4816         case KEY_getsockname:
4817             UNI(OP_GETSOCKNAME);
4818
4819         case KEY_getsockopt:
4820             LOP(OP_GSOCKOPT,XTERM);
4821
4822         case KEY_getgrent:
4823             FUN0(OP_GGRENT);
4824
4825         case KEY_getgrnam:
4826             UNI(OP_GGRNAM);
4827
4828         case KEY_getgrgid:
4829             UNI(OP_GGRGID);
4830
4831         case KEY_getlogin:
4832             FUN0(OP_GETLOGIN);
4833
4834         case KEY_glob:
4835             set_csh();
4836             LOP(OP_GLOB,XTERM);
4837
4838         case KEY_hex:
4839             UNI(OP_HEX);
4840
4841         case KEY_if:
4842             yylval.ival = CopLINE(PL_curcop);
4843             OPERATOR(IF);
4844
4845         case KEY_index:
4846             LOP(OP_INDEX,XTERM);
4847
4848         case KEY_int:
4849             UNI(OP_INT);
4850
4851         case KEY_ioctl:
4852             LOP(OP_IOCTL,XTERM);
4853
4854         case KEY_join:
4855             LOP(OP_JOIN,XTERM);
4856
4857         case KEY_keys:
4858             UNI(OP_KEYS);
4859
4860         case KEY_kill:
4861             LOP(OP_KILL,XTERM);
4862
4863         case KEY_last:
4864             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4865             LOOPX(OP_LAST);
4866         
4867         case KEY_lc:
4868             UNI(OP_LC);
4869
4870         case KEY_lcfirst:
4871             UNI(OP_LCFIRST);
4872
4873         case KEY_local:
4874             yylval.ival = 0;
4875             OPERATOR(LOCAL);
4876
4877         case KEY_length:
4878             UNI(OP_LENGTH);
4879
4880         case KEY_lt:
4881             Rop(OP_SLT);
4882
4883         case KEY_le:
4884             Rop(OP_SLE);
4885
4886         case KEY_localtime:
4887             UNI(OP_LOCALTIME);
4888
4889         case KEY_log:
4890             UNI(OP_LOG);
4891
4892         case KEY_link:
4893             LOP(OP_LINK,XTERM);
4894
4895         case KEY_listen:
4896             LOP(OP_LISTEN,XTERM);
4897
4898         case KEY_lock:
4899             UNI(OP_LOCK);
4900
4901         case KEY_lstat:
4902             UNI(OP_LSTAT);
4903
4904         case KEY_m:
4905             s = scan_pat(s,OP_MATCH);
4906             TERM(sublex_start());
4907
4908         case KEY_map:
4909             LOP(OP_MAPSTART, XREF);
4910
4911         case KEY_mkdir:
4912             LOP(OP_MKDIR,XTERM);
4913
4914         case KEY_msgctl:
4915             LOP(OP_MSGCTL,XTERM);
4916
4917         case KEY_msgget:
4918             LOP(OP_MSGGET,XTERM);
4919
4920         case KEY_msgrcv:
4921             LOP(OP_MSGRCV,XTERM);
4922
4923         case KEY_msgsnd:
4924             LOP(OP_MSGSND,XTERM);
4925
4926         case KEY_our:
4927         case KEY_my:
4928             PL_in_my = tmp;
4929             s = skipspace(s);
4930             if (isIDFIRST_lazy_if(s,UTF)) {
4931                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
4932                 if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
4933                     goto really_sub;
4934                 PL_in_my_stash = find_in_my_stash(PL_tokenbuf, len);
4935                 if (!PL_in_my_stash) {
4936                     char tmpbuf[1024];
4937                     PL_bufptr = s;
4938                     sprintf(tmpbuf, "No such class %.1000s", PL_tokenbuf);
4939                     yyerror(tmpbuf);
4940                 }
4941             }
4942             yylval.ival = 1;
4943             OPERATOR(MY);
4944
4945         case KEY_next:
4946             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4947             LOOPX(OP_NEXT);
4948
4949         case KEY_ne:
4950             Eop(OP_SNE);
4951
4952         case KEY_no:
4953             s = tokenize_use(0, s);
4954             OPERATOR(USE);
4955
4956         case KEY_not:
4957             if (*s == '(' || (s = skipspace(s), *s == '('))
4958                 FUN1(OP_NOT);
4959             else
4960                 OPERATOR(NOTOP);
4961
4962         case KEY_open:
4963             s = skipspace(s);
4964             if (isIDFIRST_lazy_if(s,UTF)) {
4965                 const char *t;
4966                 for (d = s; isALNUM_lazy_if(d,UTF); d++) ;
4967                 for (t=d; *t && isSPACE(*t); t++) ;
4968                 if ( *t && strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
4969                     /* [perl #16184] */
4970                     && !(t[0] == '=' && t[1] == '>')
4971                 ) {
4972                     int len = (int)(d-s);
4973                     Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE),
4974                            "Precedence problem: open %.*s should be open(%.*s)",
4975                             len, s, len, s);
4976                 }
4977             }
4978             LOP(OP_OPEN,XTERM);
4979
4980         case KEY_or:
4981             yylval.ival = OP_OR;
4982             OPERATOR(OROP);
4983
4984         case KEY_ord:
4985             UNI(OP_ORD);
4986
4987         case KEY_oct:
4988             UNI(OP_OCT);
4989
4990         case KEY_opendir:
4991             LOP(OP_OPEN_DIR,XTERM);
4992
4993         case KEY_print:
4994             checkcomma(s,PL_tokenbuf,"filehandle");
4995             LOP(OP_PRINT,XREF);
4996
4997         case KEY_printf:
4998             checkcomma(s,PL_tokenbuf,"filehandle");
4999             LOP(OP_PRTF,XREF);
5000
5001         case KEY_prototype:
5002             UNI(OP_PROTOTYPE);
5003
5004         case KEY_push:
5005             LOP(OP_PUSH,XTERM);
5006
5007         case KEY_pop:
5008             UNIDOR(OP_POP);
5009
5010         case KEY_pos:
5011             UNIDOR(OP_POS);
5012         
5013         case KEY_pack:
5014             LOP(OP_PACK,XTERM);
5015
5016         case KEY_package:
5017             s = force_word(s,WORD,FALSE,TRUE,FALSE);
5018             OPERATOR(PACKAGE);
5019
5020         case KEY_pipe:
5021             LOP(OP_PIPE_OP,XTERM);
5022
5023         case KEY_q:
5024             s = scan_str(s,FALSE,FALSE);
5025             if (!s)
5026                 missingterm((char*)0);
5027             yylval.ival = OP_CONST;
5028             TERM(sublex_start());
5029
5030         case KEY_quotemeta:
5031             UNI(OP_QUOTEMETA);
5032
5033         case KEY_qw:
5034             s = scan_str(s,FALSE,FALSE);
5035             if (!s)
5036                 missingterm((char*)0);
5037             PL_expect = XOPERATOR;
5038             force_next(')');
5039             if (SvCUR(PL_lex_stuff)) {
5040                 OP *words = Nullop;
5041                 int warned = 0;
5042                 d = SvPV_force(PL_lex_stuff, len);
5043                 while (len) {
5044                     SV *sv;
5045                     for (; isSPACE(*d) && len; --len, ++d) ;
5046                     if (len) {
5047                         const char *b = d;
5048                         if (!warned && ckWARN(WARN_QW)) {
5049                             for (; !isSPACE(*d) && len; --len, ++d) {
5050                                 if (*d == ',') {
5051                                     Perl_warner(aTHX_ packWARN(WARN_QW),
5052                                         "Possible attempt to separate words with commas");
5053                                     ++warned;
5054                                 }
5055                                 else if (*d == '#') {
5056                                     Perl_warner(aTHX_ packWARN(WARN_QW),
5057                                         "Possible attempt to put comments in qw() list");
5058                                     ++warned;
5059                                 }
5060                             }
5061                         }
5062                         else {
5063                             for (; !isSPACE(*d) && len; --len, ++d) ;
5064                         }
5065                         sv = newSVpvn(b, d-b);
5066                         if (DO_UTF8(PL_lex_stuff))
5067                             SvUTF8_on(sv);
5068                         words = append_elem(OP_LIST, words,
5069                                             newSVOP(OP_CONST, 0, tokeq(sv)));
5070                     }
5071                 }
5072                 if (words) {
5073                     PL_nextval[PL_nexttoke].opval = words;
5074                     force_next(THING);
5075                 }
5076             }
5077             if (PL_lex_stuff) {
5078                 SvREFCNT_dec(PL_lex_stuff);
5079                 PL_lex_stuff = Nullsv;
5080             }
5081             PL_expect = XTERM;
5082             TOKEN('(');
5083
5084         case KEY_qq:
5085             s = scan_str(s,FALSE,FALSE);
5086             if (!s)
5087                 missingterm((char*)0);
5088             yylval.ival = OP_STRINGIFY;
5089             if (SvIVX(PL_lex_stuff) == '\'')
5090                 SvIV_set(PL_lex_stuff, 0);      /* qq'$foo' should intepolate */
5091             TERM(sublex_start());
5092
5093         case KEY_qr:
5094             s = scan_pat(s,OP_QR);
5095             TERM(sublex_start());
5096
5097         case KEY_qx:
5098             s = scan_str(s,FALSE,FALSE);
5099             if (!s)
5100                 missingterm((char*)0);
5101             yylval.ival = OP_BACKTICK;
5102             set_csh();
5103             TERM(sublex_start());
5104
5105         case KEY_return:
5106             OLDLOP(OP_RETURN);
5107
5108         case KEY_require:
5109             s = skipspace(s);
5110             if (isDIGIT(*s)) {
5111                 s = force_version(s, FALSE);
5112             }
5113             else if (*s != 'v' || !isDIGIT(s[1])
5114                     || (s = force_version(s, TRUE), *s == 'v'))
5115             {
5116                 *PL_tokenbuf = '\0';
5117                 s = force_word(s,WORD,TRUE,TRUE,FALSE);
5118                 if (isIDFIRST_lazy_if(PL_tokenbuf,UTF))
5119                     gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf), TRUE);
5120                 else if (*s == '<')
5121                     yyerror("<> should be quotes");
5122             }
5123             if (orig_keyword == KEY_require) {
5124                 orig_keyword = 0;
5125                 yylval.ival = 1;
5126             }
5127             else 
5128                 yylval.ival = 0;
5129             PL_expect = XTERM;
5130             PL_bufptr = s;
5131             PL_last_uni = PL_oldbufptr;
5132             PL_last_lop_op = OP_REQUIRE;
5133             s = skipspace(s);
5134             return REPORT( (int)REQUIRE );
5135
5136         case KEY_reset:
5137             UNI(OP_RESET);
5138
5139         case KEY_redo:
5140             s = force_word(s,WORD,TRUE,FALSE,FALSE);
5141             LOOPX(OP_REDO);
5142
5143         case KEY_rename:
5144             LOP(OP_RENAME,XTERM);
5145
5146         case KEY_rand:
5147             UNI(OP_RAND);
5148
5149         case KEY_rmdir:
5150             UNI(OP_RMDIR);
5151
5152         case KEY_rindex:
5153             LOP(OP_RINDEX,XTERM);
5154
5155         case KEY_read:
5156             LOP(OP_READ,XTERM);
5157
5158         case KEY_readdir:
5159             UNI(OP_READDIR);
5160
5161         case KEY_readline:
5162             set_csh();
5163             UNIDOR(OP_READLINE);
5164
5165         case KEY_readpipe:
5166             set_csh();
5167             UNI(OP_BACKTICK);
5168
5169         case KEY_rewinddir:
5170             UNI(OP_REWINDDIR);
5171
5172         case KEY_recv:
5173             LOP(OP_RECV,XTERM);
5174
5175         case KEY_reverse:
5176             LOP(OP_REVERSE,XTERM);
5177
5178         case KEY_readlink:
5179             UNIDOR(OP_READLINK);
5180
5181         case KEY_ref:
5182             UNI(OP_REF);
5183
5184         case KEY_s:
5185             s = scan_subst(s);
5186             if (yylval.opval)
5187                 TERM(sublex_start());
5188             else
5189                 TOKEN(1);       /* force error */
5190
5191         case KEY_chomp:
5192             UNI(OP_CHOMP);
5193         
5194         case KEY_scalar:
5195             UNI(OP_SCALAR);
5196
5197         case KEY_select:
5198             LOP(OP_SELECT,XTERM);
5199
5200         case KEY_seek:
5201             LOP(OP_SEEK,XTERM);
5202
5203         case KEY_semctl:
5204             LOP(OP_SEMCTL,XTERM);
5205
5206         case KEY_semget:
5207             LOP(OP_SEMGET,XTERM);
5208
5209         case KEY_semop:
5210             LOP(OP_SEMOP,XTERM);
5211
5212         case KEY_send:
5213             LOP(OP_SEND,XTERM);
5214
5215         case KEY_setpgrp:
5216             LOP(OP_SETPGRP,XTERM);
5217
5218         case KEY_setpriority:
5219             LOP(OP_SETPRIORITY,XTERM);
5220
5221         case KEY_sethostent:
5222             UNI(OP_SHOSTENT);
5223
5224         case KEY_setnetent:
5225             UNI(OP_SNETENT);
5226
5227         case KEY_setservent:
5228             UNI(OP_SSERVENT);
5229
5230         case KEY_setprotoent:
5231             UNI(OP_SPROTOENT);
5232
5233         case KEY_setpwent:
5234             FUN0(OP_SPWENT);
5235
5236         case KEY_setgrent:
5237             FUN0(OP_SGRENT);
5238
5239         case KEY_seekdir:
5240             LOP(OP_SEEKDIR,XTERM);
5241
5242         case KEY_setsockopt:
5243             LOP(OP_SSOCKOPT,XTERM);
5244
5245         case KEY_shift:
5246             UNIDOR(OP_SHIFT);
5247
5248         case KEY_shmctl:
5249             LOP(OP_SHMCTL,XTERM);
5250
5251         case KEY_shmget:
5252             LOP(OP_SHMGET,XTERM);
5253
5254         case KEY_shmread:
5255             LOP(OP_SHMREAD,XTERM);
5256
5257         case KEY_shmwrite:
5258             LOP(OP_SHMWRITE,XTERM);
5259
5260         case KEY_shutdown:
5261             LOP(OP_SHUTDOWN,XTERM);
5262
5263         case KEY_sin:
5264             UNI(OP_SIN);
5265
5266         case KEY_sleep:
5267             UNI(OP_SLEEP);
5268
5269         case KEY_socket:
5270             LOP(OP_SOCKET,XTERM);
5271
5272         case KEY_socketpair:
5273             LOP(OP_SOCKPAIR,XTERM);
5274
5275         case KEY_sort:
5276             checkcomma(s,PL_tokenbuf,"subroutine name");
5277             s = skipspace(s);
5278             if (*s == ';' || *s == ')')         /* probably a close */
5279                 Perl_croak(aTHX_ "sort is now a reserved word");
5280             PL_expect = XTERM;
5281             s = force_word(s,WORD,TRUE,TRUE,FALSE);
5282             LOP(OP_SORT,XREF);
5283
5284         case KEY_split:
5285             LOP(OP_SPLIT,XTERM);
5286
5287         case KEY_sprintf:
5288             LOP(OP_SPRINTF,XTERM);
5289
5290         case KEY_splice:
5291             LOP(OP_SPLICE,XTERM);
5292
5293         case KEY_sqrt:
5294             UNI(OP_SQRT);
5295
5296         case KEY_srand:
5297             UNI(OP_SRAND);
5298
5299         case KEY_stat:
5300             UNI(OP_STAT);
5301
5302         case KEY_study:
5303             UNI(OP_STUDY);
5304
5305         case KEY_substr:
5306             LOP(OP_SUBSTR,XTERM);
5307
5308         case KEY_format:
5309         case KEY_sub:
5310           really_sub:
5311             {
5312                 char tmpbuf[sizeof PL_tokenbuf];
5313                 SSize_t tboffset = 0;
5314                 expectation attrful;
5315                 bool have_name, have_proto, bad_proto;
5316                 const int key = tmp;
5317
5318                 s = skipspace(s);
5319
5320                 if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' ||
5321                     (*s == ':' && s[1] == ':'))
5322                 {
5323                     PL_expect = XBLOCK;
5324                     attrful = XATTRBLOCK;
5325                     /* remember buffer pos'n for later force_word */
5326                     tboffset = s - PL_oldbufptr;
5327                     d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
5328                     if (strchr(tmpbuf, ':'))
5329                         sv_setpv(PL_subname, tmpbuf);
5330                     else {
5331                         sv_setsv(PL_subname,PL_curstname);
5332                         sv_catpvn(PL_subname,"::",2);
5333                         sv_catpvn(PL_subname,tmpbuf,len);
5334                     }
5335                     s = skipspace(d);
5336                     have_name = TRUE;
5337                 }
5338                 else {
5339                     if (key == KEY_my)
5340                         Perl_croak(aTHX_ "Missing name in \"my sub\"");
5341                     PL_expect = XTERMBLOCK;
5342                     attrful = XATTRTERM;
5343                     sv_setpvn(PL_subname,"?",1);
5344                     have_name = FALSE;
5345                 }
5346
5347                 if (key == KEY_format) {
5348                     if (*s == '=')
5349                         PL_lex_formbrack = PL_lex_brackets + 1;
5350                     if (have_name)
5351                         (void) force_word(PL_oldbufptr + tboffset, WORD,
5352                                           FALSE, TRUE, TRUE);
5353                     OPERATOR(FORMAT);
5354                 }
5355
5356                 /* Look for a prototype */
5357                 if (*s == '(') {
5358                     char *p;
5359
5360                     s = scan_str(s,FALSE,FALSE);
5361                     if (!s)
5362                         Perl_croak(aTHX_ "Prototype not terminated");
5363                     /* strip spaces and check for bad characters */
5364                     d = SvPVX(PL_lex_stuff);
5365                     tmp = 0;
5366                     bad_proto = FALSE;
5367                     for (p = d; *p; ++p) {
5368                         if (!isSPACE(*p)) {
5369                             d[tmp++] = *p;
5370                             if (!strchr("$@%*;[]&\\", *p))
5371                                 bad_proto = TRUE;
5372                         }
5373                     }
5374                     d[tmp] = '\0';
5375                     if (bad_proto && ckWARN(WARN_SYNTAX))
5376                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5377                                     "Illegal character in prototype for %"SVf" : %s",
5378                                     PL_subname, d);
5379                     SvCUR_set(PL_lex_stuff, tmp);
5380                     have_proto = TRUE;
5381
5382                     s = skipspace(s);
5383                 }
5384                 else
5385                     have_proto = FALSE;
5386
5387                 if (*s == ':' && s[1] != ':')
5388                     PL_expect = attrful;
5389                 else if (*s != '{' && key == KEY_sub) {
5390                     if (!have_name)
5391                         Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine");
5392                     else if (*s != ';')
5393                         Perl_croak(aTHX_ "Illegal declaration of subroutine %"SVf, PL_subname);
5394                 }
5395
5396                 if (have_proto) {
5397                     PL_nextval[PL_nexttoke].opval =
5398                         (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
5399                     PL_lex_stuff = Nullsv;
5400                     force_next(THING);
5401                 }
5402                 if (!have_name) {
5403                     sv_setpv(PL_subname,
5404                         PL_curstash ? "__ANON__" : "__ANON__::__ANON__");
5405                     TOKEN(ANONSUB);
5406                 }
5407                 (void) force_word(PL_oldbufptr + tboffset, WORD,
5408                                   FALSE, TRUE, TRUE);
5409                 if (key == KEY_my)
5410                     TOKEN(MYSUB);
5411                 TOKEN(SUB);
5412             }
5413
5414         case KEY_system:
5415             set_csh();
5416             LOP(OP_SYSTEM,XREF);
5417
5418         case KEY_symlink:
5419             LOP(OP_SYMLINK,XTERM);
5420
5421         case KEY_syscall:
5422             LOP(OP_SYSCALL,XTERM);
5423
5424         case KEY_sysopen:
5425             LOP(OP_SYSOPEN,XTERM);
5426
5427         case KEY_sysseek:
5428             LOP(OP_SYSSEEK,XTERM);
5429
5430         case KEY_sysread:
5431             LOP(OP_SYSREAD,XTERM);
5432
5433         case KEY_syswrite:
5434             LOP(OP_SYSWRITE,XTERM);
5435
5436         case KEY_tr:
5437             s = scan_trans(s);
5438             TERM(sublex_start());
5439
5440         case KEY_tell:
5441             UNI(OP_TELL);
5442
5443         case KEY_telldir:
5444             UNI(OP_TELLDIR);
5445
5446         case KEY_tie:
5447             LOP(OP_TIE,XTERM);
5448
5449         case KEY_tied:
5450             UNI(OP_TIED);
5451
5452         case KEY_time:
5453             FUN0(OP_TIME);
5454
5455         case KEY_times:
5456             FUN0(OP_TMS);
5457
5458         case KEY_truncate:
5459             LOP(OP_TRUNCATE,XTERM);
5460
5461         case KEY_uc:
5462             UNI(OP_UC);
5463
5464         case KEY_ucfirst:
5465             UNI(OP_UCFIRST);
5466
5467         case KEY_untie:
5468             UNI(OP_UNTIE);
5469
5470         case KEY_until:
5471             yylval.ival = CopLINE(PL_curcop);
5472             OPERATOR(UNTIL);
5473
5474         case KEY_unless:
5475             yylval.ival = CopLINE(PL_curcop);
5476             OPERATOR(UNLESS);
5477
5478         case KEY_unlink:
5479             LOP(OP_UNLINK,XTERM);
5480
5481         case KEY_undef:
5482             UNIDOR(OP_UNDEF);
5483
5484         case KEY_unpack:
5485             LOP(OP_UNPACK,XTERM);
5486
5487         case KEY_utime:
5488             LOP(OP_UTIME,XTERM);
5489
5490         case KEY_umask:
5491             UNIDOR(OP_UMASK);
5492
5493         case KEY_unshift:
5494             LOP(OP_UNSHIFT,XTERM);
5495
5496         case KEY_use:
5497             s = tokenize_use(1, s);
5498             OPERATOR(USE);
5499
5500         case KEY_values:
5501             UNI(OP_VALUES);
5502
5503         case KEY_vec:
5504             LOP(OP_VEC,XTERM);
5505
5506         case KEY_while:
5507             yylval.ival = CopLINE(PL_curcop);
5508             OPERATOR(WHILE);
5509
5510         case KEY_warn:
5511             PL_hints |= HINT_BLOCK_SCOPE;
5512             LOP(OP_WARN,XTERM);
5513
5514         case KEY_wait:
5515             FUN0(OP_WAIT);
5516
5517         case KEY_waitpid:
5518             LOP(OP_WAITPID,XTERM);
5519
5520         case KEY_wantarray:
5521             FUN0(OP_WANTARRAY);
5522
5523         case KEY_write:
5524 #ifdef EBCDIC
5525         {
5526             char ctl_l[2];
5527             ctl_l[0] = toCTRL('L');
5528             ctl_l[1] = '\0';
5529             gv_fetchpv(ctl_l,TRUE, SVt_PV);
5530         }
5531 #else
5532             gv_fetchpv("\f",TRUE, SVt_PV);      /* Make sure $^L is defined */
5533 #endif
5534             UNI(OP_ENTERWRITE);
5535
5536         case KEY_x:
5537             if (PL_expect == XOPERATOR)
5538                 Mop(OP_REPEAT);
5539             check_uni();
5540             goto just_a_word;
5541
5542         case KEY_xor:
5543             yylval.ival = OP_XOR;
5544             OPERATOR(OROP);
5545
5546         case KEY_y:
5547             s = scan_trans(s);
5548             TERM(sublex_start());
5549         }
5550     }}
5551 }
5552 #ifdef __SC__
5553 #pragma segment Main
5554 #endif
5555
5556 static int
5557 S_pending_ident(pTHX)
5558 {
5559     register char *d;
5560     register I32 tmp = 0;
5561     /* pit holds the identifier we read and pending_ident is reset */
5562     char pit = PL_pending_ident;
5563     PL_pending_ident = 0;
5564
5565     DEBUG_T({ PerlIO_printf(Perl_debug_log,
5566           "### Pending identifier '%s'\n", PL_tokenbuf); });
5567
5568     /* if we're in a my(), we can't allow dynamics here.
5569        $foo'bar has already been turned into $foo::bar, so
5570        just check for colons.
5571
5572        if it's a legal name, the OP is a PADANY.
5573     */
5574     if (PL_in_my) {
5575         if (PL_in_my == KEY_our) {      /* "our" is merely analogous to "my" */
5576             if (strchr(PL_tokenbuf,':'))
5577                 yyerror(Perl_form(aTHX_ "No package name allowed for "
5578                                   "variable %s in \"our\"",
5579                                   PL_tokenbuf));
5580             tmp = allocmy(PL_tokenbuf);
5581         }
5582         else {
5583             if (strchr(PL_tokenbuf,':'))
5584                 yyerror(Perl_form(aTHX_ PL_no_myglob,PL_tokenbuf));
5585
5586             yylval.opval = newOP(OP_PADANY, 0);
5587             yylval.opval->op_targ = allocmy(PL_tokenbuf);
5588             return PRIVATEREF;
5589         }
5590     }
5591
5592     /*
5593        build the ops for accesses to a my() variable.
5594
5595        Deny my($a) or my($b) in a sort block, *if* $a or $b is
5596        then used in a comparison.  This catches most, but not
5597        all cases.  For instance, it catches
5598            sort { my($a); $a <=> $b }
5599        but not
5600            sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
5601        (although why you'd do that is anyone's guess).
5602     */
5603
5604     if (!strchr(PL_tokenbuf,':')) {
5605         if (!PL_in_my)
5606             tmp = pad_findmy(PL_tokenbuf);
5607         if (tmp != NOT_IN_PAD) {
5608             /* might be an "our" variable" */
5609             if (PAD_COMPNAME_FLAGS(tmp) & SVpad_OUR) {
5610                 /* build ops for a bareword */
5611                 HV *  const stash = PAD_COMPNAME_OURSTASH(tmp);
5612                 HEK * const stashname = HvNAME_HEK(stash);
5613                 SV *  const sym = newSVhek(stashname);
5614                 sv_catpvn(sym, "::", 2);
5615                 sv_catpv(sym, PL_tokenbuf+1);
5616                 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
5617                 yylval.opval->op_private = OPpCONST_ENTERED;
5618                 gv_fetchsv(sym,
5619                     (PL_in_eval
5620                         ? (GV_ADDMULTI | GV_ADDINEVAL)
5621                         : GV_ADDMULTI
5622                     ),
5623                     ((PL_tokenbuf[0] == '$') ? SVt_PV
5624                      : (PL_tokenbuf[0] == '@') ? SVt_PVAV
5625                      : SVt_PVHV));
5626                 return WORD;
5627             }
5628
5629             /* if it's a sort block and they're naming $a or $b */
5630             if (PL_last_lop_op == OP_SORT &&
5631                 PL_tokenbuf[0] == '$' &&
5632                 (PL_tokenbuf[1] == 'a' || PL_tokenbuf[1] == 'b')
5633                 && !PL_tokenbuf[2])
5634             {
5635                 for (d = PL_in_eval ? PL_oldoldbufptr : PL_linestart;
5636                      d < PL_bufend && *d != '\n';
5637                      d++)
5638                 {
5639                     if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
5640                         Perl_croak(aTHX_ "Can't use \"my %s\" in sort comparison",
5641                               PL_tokenbuf);
5642                     }
5643                 }
5644             }
5645
5646             yylval.opval = newOP(OP_PADANY, 0);
5647             yylval.opval->op_targ = tmp;
5648             return PRIVATEREF;
5649         }
5650     }
5651
5652     /*
5653        Whine if they've said @foo in a doublequoted string,
5654        and @foo isn't a variable we can find in the symbol
5655        table.
5656     */
5657     if (pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
5658         GV *gv = gv_fetchpv(PL_tokenbuf+1, FALSE, SVt_PVAV);
5659         if ((!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
5660              && ckWARN(WARN_AMBIGUOUS))
5661         {
5662             /* Downgraded from fatal to warning 20000522 mjd */
5663             Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
5664                         "Possible unintended interpolation of %s in string",
5665                          PL_tokenbuf);
5666         }
5667     }
5668
5669     /* build ops for a bareword */
5670     yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(PL_tokenbuf+1, 0));
5671     yylval.opval->op_private = OPpCONST_ENTERED;
5672     gv_fetchpv(PL_tokenbuf+1, PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : TRUE,
5673                ((PL_tokenbuf[0] == '$') ? SVt_PV
5674                 : (PL_tokenbuf[0] == '@') ? SVt_PVAV
5675                 : SVt_PVHV));
5676     return WORD;
5677 }
5678
5679 /*
5680  *  The following code was generated by perl_keyword.pl.
5681  */
5682
5683 I32
5684 Perl_keyword (pTHX_ const char *name, I32 len)
5685 {
5686   switch (len)
5687   {
5688     case 1: /* 5 tokens of length 1 */
5689       switch (name[0])
5690       {
5691         case 'm':
5692           {                                       /* m          */
5693             return KEY_m;
5694           }
5695
5696         case 'q':
5697           {                                       /* q          */
5698             return KEY_q;
5699           }
5700
5701         case 's':
5702           {                                       /* s          */
5703             return KEY_s;
5704           }
5705
5706         case 'x':
5707           {                                       /* x          */
5708             return -KEY_x;
5709           }
5710
5711         case 'y':
5712           {                                       /* y          */
5713             return KEY_y;
5714           }
5715
5716         default:
5717           goto unknown;
5718       }
5719
5720     case 2: /* 18 tokens of length 2 */
5721       switch (name[0])
5722       {
5723         case 'd':
5724           if (name[1] == 'o')
5725           {                                       /* do         */
5726             return KEY_do;
5727           }
5728
5729           goto unknown;
5730
5731         case 'e':
5732           if (name[1] == 'q')
5733           {                                       /* eq         */
5734             return -KEY_eq;
5735           }
5736
5737           goto unknown;
5738
5739         case 'g':
5740           switch (name[1])
5741           {
5742             case 'e':
5743               {                                   /* ge         */
5744                 return -KEY_ge;
5745               }
5746
5747             case 't':
5748               {                                   /* gt         */
5749                 return -KEY_gt;
5750               }
5751
5752             default:
5753               goto unknown;
5754           }
5755
5756         case 'i':
5757           if (name[1] == 'f')
5758           {                                       /* if         */
5759             return KEY_if;
5760           }
5761
5762           goto unknown;
5763
5764         case 'l':
5765           switch (name[1])
5766           {
5767             case 'c':
5768               {                                   /* lc         */
5769                 return -KEY_lc;
5770               }
5771
5772             case 'e':
5773               {                                   /* le         */
5774                 return -KEY_le;
5775               }
5776
5777             case 't':
5778               {                                   /* lt         */
5779                 return -KEY_lt;
5780               }
5781
5782             default:
5783               goto unknown;
5784           }
5785
5786         case 'm':
5787           if (name[1] == 'y')
5788           {                                       /* my         */
5789             return KEY_my;
5790           }
5791
5792           goto unknown;
5793
5794         case 'n':
5795           switch (name[1])
5796           {
5797             case 'e':
5798               {                                   /* ne         */
5799                 return -KEY_ne;
5800               }
5801
5802             case 'o':
5803               {                                   /* no         */
5804                 return KEY_no;
5805               }
5806
5807             default:
5808               goto unknown;
5809           }
5810
5811         case 'o':
5812           if (name[1] == 'r')
5813           {                                       /* or         */
5814             return -KEY_or;
5815           }
5816
5817           goto unknown;
5818
5819         case 'q':
5820           switch (name[1])
5821           {
5822             case 'q':
5823               {                                   /* qq         */
5824                 return KEY_qq;
5825               }
5826
5827             case 'r':
5828               {                                   /* qr         */
5829                 return KEY_qr;
5830               }
5831
5832             case 'w':
5833               {                                   /* qw         */
5834                 return KEY_qw;
5835               }
5836
5837             case 'x':
5838               {                                   /* qx         */
5839                 return KEY_qx;
5840               }
5841
5842             default:
5843               goto unknown;
5844           }
5845
5846         case 't':
5847           if (name[1] == 'r')
5848           {                                       /* tr         */
5849             return KEY_tr;
5850           }
5851
5852           goto unknown;
5853
5854         case 'u':
5855           if (name[1] == 'c')
5856           {                                       /* uc         */
5857             return -KEY_uc;
5858           }
5859
5860           goto unknown;
5861
5862         default:
5863           goto unknown;
5864       }
5865
5866     case 3: /* 28 tokens of length 3 */
5867       switch (name[0])
5868       {
5869         case 'E':
5870           if (name[1] == 'N' &&
5871               name[2] == 'D')
5872           {                                       /* END        */
5873             return KEY_END;
5874           }
5875
5876           goto unknown;
5877
5878         case 'a':
5879           switch (name[1])
5880           {
5881             case 'b':
5882               if (name[2] == 's')
5883               {                                   /* abs        */
5884                 return -KEY_abs;
5885               }
5886
5887               goto unknown;
5888
5889             case 'n':
5890               if (name[2] == 'd')
5891               {                                   /* and        */
5892                 return -KEY_and;
5893               }
5894
5895               goto unknown;
5896
5897             default:
5898               goto unknown;
5899           }
5900
5901         case 'c':
5902           switch (name[1])
5903           {
5904             case 'h':
5905               if (name[2] == 'r')
5906               {                                   /* chr        */
5907                 return -KEY_chr;
5908               }
5909
5910               goto unknown;
5911
5912             case 'm':
5913               if (name[2] == 'p')
5914               {                                   /* cmp        */
5915                 return -KEY_cmp;
5916               }
5917
5918               goto unknown;
5919
5920             case 'o':
5921               if (name[2] == 's')
5922               {                                   /* cos        */
5923                 return -KEY_cos;
5924               }
5925
5926               goto unknown;
5927
5928             default:
5929               goto unknown;
5930           }
5931
5932         case 'd':
5933           if (name[1] == 'i' &&
5934               name[2] == 'e')
5935           {                                       /* die        */
5936             return -KEY_die;
5937           }
5938
5939           goto unknown;
5940
5941         case 'e':
5942           switch (name[1])
5943           {
5944             case 'o':
5945               if (name[2] == 'f')
5946               {                                   /* eof        */
5947                 return -KEY_eof;
5948               }
5949
5950               goto unknown;
5951
5952             case 'r':
5953               if (name[2] == 'r')
5954               {                                   /* err        */
5955                 return -KEY_err;
5956               }
5957
5958               goto unknown;
5959
5960             case 'x':
5961               if (name[2] == 'p')
5962               {                                   /* exp        */
5963                 return -KEY_exp;
5964               }
5965
5966               goto unknown;
5967
5968             default:
5969               goto unknown;
5970           }
5971
5972         case 'f':
5973           if (name[1] == 'o' &&
5974               name[2] == 'r')
5975           {                                       /* for        */
5976             return KEY_for;
5977           }
5978
5979           goto unknown;
5980
5981         case 'h':
5982           if (name[1] == 'e' &&
5983               name[2] == 'x')
5984           {                                       /* hex        */
5985             return -KEY_hex;
5986           }
5987
5988           goto unknown;
5989
5990         case 'i':
5991           if (name[1] == 'n' &&
5992               name[2] == 't')
5993           {                                       /* int        */
5994             return -KEY_int;
5995           }
5996
5997           goto unknown;
5998
5999         case 'l':
6000           if (name[1] == 'o' &&
6001               name[2] == 'g')
6002           {                                       /* log        */
6003             return -KEY_log;
6004           }
6005
6006           goto unknown;
6007
6008         case 'm':
6009           if (name[1] == 'a' &&
6010               name[2] == 'p')
6011           {                                       /* map        */
6012             return KEY_map;
6013           }
6014
6015           goto unknown;
6016
6017         case 'n':
6018           if (name[1] == 'o' &&
6019               name[2] == 't')
6020           {                                       /* not        */
6021             return -KEY_not;
6022           }
6023
6024           goto unknown;
6025
6026         case 'o':
6027           switch (name[1])
6028           {
6029             case 'c':
6030               if (name[2] == 't')
6031               {                                   /* oct        */
6032                 return -KEY_oct;
6033               }
6034
6035               goto unknown;
6036
6037             case 'r':
6038               if (name[2] == 'd')
6039               {                                   /* ord        */
6040                 return -KEY_ord;
6041               }
6042
6043               goto unknown;
6044
6045             case 'u':
6046               if (name[2] == 'r')
6047               {                                   /* our        */
6048                 return KEY_our;
6049               }
6050
6051               goto unknown;
6052
6053             default:
6054               goto unknown;
6055           }
6056
6057         case 'p':
6058           if (name[1] == 'o')
6059           {
6060             switch (name[2])
6061             {
6062               case 'p':
6063                 {                                 /* pop        */
6064                   return -KEY_pop;
6065                 }
6066
6067               case 's':
6068                 {                                 /* pos        */
6069                   return KEY_pos;
6070                 }
6071
6072               default:
6073                 goto unknown;
6074             }
6075           }
6076
6077           goto unknown;
6078
6079         case 'r':
6080           if (name[1] == 'e' &&
6081               name[2] == 'f')
6082           {                                       /* ref        */
6083             return -KEY_ref;
6084           }
6085
6086           goto unknown;
6087
6088         case 's':
6089           switch (name[1])
6090           {
6091             case 'i':
6092               if (name[2] == 'n')
6093               {                                   /* sin        */
6094                 return -KEY_sin;
6095               }
6096
6097               goto unknown;
6098
6099             case 'u':
6100               if (name[2] == 'b')
6101               {                                   /* sub        */
6102                 return KEY_sub;
6103               }
6104
6105               goto unknown;
6106
6107             default:
6108               goto unknown;
6109           }
6110
6111         case 't':
6112           if (name[1] == 'i' &&
6113               name[2] == 'e')
6114           {                                       /* tie        */
6115             return KEY_tie;
6116           }
6117
6118           goto unknown;
6119
6120         case 'u':
6121           if (name[1] == 's' &&
6122               name[2] == 'e')
6123           {                                       /* use        */
6124             return KEY_use;
6125           }
6126
6127           goto unknown;
6128
6129         case 'v':
6130           if (name[1] == 'e' &&
6131               name[2] == 'c')
6132           {                                       /* vec        */
6133             return -KEY_vec;
6134           }
6135
6136           goto unknown;
6137
6138         case 'x':
6139           if (name[1] == 'o' &&
6140               name[2] == 'r')
6141           {                                       /* xor        */
6142             return -KEY_xor;
6143           }
6144
6145           goto unknown;
6146
6147         default:
6148           goto unknown;
6149       }
6150
6151     case 4: /* 40 tokens of length 4 */
6152       switch (name[0])
6153       {
6154         case 'C':
6155           if (name[1] == 'O' &&
6156               name[2] == 'R' &&
6157               name[3] == 'E')
6158           {                                       /* CORE       */
6159             return -KEY_CORE;
6160           }
6161
6162           goto unknown;
6163
6164         case 'I':
6165           if (name[1] == 'N' &&
6166               name[2] == 'I' &&
6167               name[3] == 'T')
6168           {                                       /* INIT       */
6169             return KEY_INIT;
6170           }
6171
6172           goto unknown;
6173
6174         case 'b':
6175           if (name[1] == 'i' &&
6176               name[2] == 'n' &&
6177               name[3] == 'd')
6178           {                                       /* bind       */
6179             return -KEY_bind;
6180           }
6181
6182           goto unknown;
6183
6184         case 'c':
6185           if (name[1] == 'h' &&
6186               name[2] == 'o' &&
6187               name[3] == 'p')
6188           {                                       /* chop       */
6189             return -KEY_chop;
6190           }
6191
6192           goto unknown;
6193
6194         case 'd':
6195           if (name[1] == 'u' &&
6196               name[2] == 'm' &&
6197               name[3] == 'p')
6198           {                                       /* dump       */
6199             return -KEY_dump;
6200           }
6201
6202           goto unknown;
6203
6204         case 'e':
6205           switch (name[1])
6206           {
6207             case 'a':
6208               if (name[2] == 'c' &&
6209                   name[3] == 'h')
6210               {                                   /* each       */
6211                 return -KEY_each;
6212               }
6213
6214               goto unknown;
6215
6216             case 'l':
6217               if (name[2] == 's' &&
6218                   name[3] == 'e')
6219               {                                   /* else       */
6220                 return KEY_else;
6221               }
6222
6223               goto unknown;
6224
6225             case 'v':
6226               if (name[2] == 'a' &&
6227                   name[3] == 'l')
6228               {                                   /* eval       */
6229                 return KEY_eval;
6230               }
6231
6232               goto unknown;
6233
6234             case 'x':
6235               switch (name[2])
6236               {
6237                 case 'e':
6238                   if (name[3] == 'c')
6239                   {                               /* exec       */
6240                     return -KEY_exec;
6241                   }
6242
6243                   goto unknown;
6244
6245                 case 'i':
6246                   if (name[3] == 't')
6247                   {                               /* exit       */
6248                     return -KEY_exit;
6249                   }
6250
6251                   goto unknown;
6252
6253                 default:
6254                   goto unknown;
6255               }
6256
6257             default:
6258               goto unknown;
6259           }
6260
6261         case 'f':
6262           if (name[1] == 'o' &&
6263               name[2] == 'r' &&
6264               name[3] == 'k')
6265           {                                       /* fork       */
6266             return -KEY_fork;
6267           }
6268
6269           goto unknown;
6270
6271         case 'g':
6272           switch (name[1])
6273           {
6274             case 'e':
6275               if (name[2] == 't' &&
6276                   name[3] == 'c')
6277               {                                   /* getc       */
6278                 return -KEY_getc;
6279               }
6280
6281               goto unknown;
6282
6283             case 'l':
6284               if (name[2] == 'o' &&
6285                   name[3] == 'b')
6286               {                                   /* glob       */
6287                 return KEY_glob;
6288               }
6289
6290               goto unknown;
6291
6292             case 'o':
6293               if (name[2] == 't' &&
6294                   name[3] == 'o')
6295               {                                   /* goto       */
6296                 return KEY_goto;
6297               }
6298
6299               goto unknown;
6300
6301             case 'r':
6302               if (name[2] == 'e' &&
6303                   name[3] == 'p')
6304               {                                   /* grep       */
6305                 return KEY_grep;
6306               }
6307
6308               goto unknown;
6309
6310             default:
6311               goto unknown;
6312           }
6313
6314         case 'j':
6315           if (name[1] == 'o' &&
6316               name[2] == 'i' &&
6317               name[3] == 'n')
6318           {                                       /* join       */
6319             return -KEY_join;
6320           }
6321
6322           goto unknown;
6323
6324         case 'k':
6325           switch (name[1])
6326           {
6327             case 'e':
6328               if (name[2] == 'y' &&
6329                   name[3] == 's')
6330               {                                   /* keys       */
6331                 return -KEY_keys;
6332               }
6333
6334               goto unknown;
6335
6336             case 'i':
6337               if (name[2] == 'l' &&
6338                   name[3] == 'l')
6339               {                                   /* kill       */
6340                 return -KEY_kill;
6341               }
6342
6343               goto unknown;
6344
6345             default:
6346               goto unknown;
6347           }
6348
6349         case 'l':
6350           switch (name[1])
6351           {
6352             case 'a':
6353               if (name[2] == 's' &&
6354                   name[3] == 't')
6355               {                                   /* last       */
6356                 return KEY_last;
6357               }
6358
6359               goto unknown;
6360
6361             case 'i':
6362               if (name[2] == 'n' &&
6363                   name[3] == 'k')
6364               {                                   /* link       */
6365                 return -KEY_link;
6366               }
6367
6368               goto unknown;
6369
6370             case 'o':
6371               if (name[2] == 'c' &&
6372                   name[3] == 'k')
6373               {                                   /* lock       */
6374                 return -KEY_lock;
6375               }
6376
6377               goto unknown;
6378
6379             default:
6380               goto unknown;
6381           }
6382
6383         case 'n':
6384           if (name[1] == 'e' &&
6385               name[2] == 'x' &&
6386               name[3] == 't')
6387           {                                       /* next       */
6388             return KEY_next;
6389           }
6390
6391           goto unknown;
6392
6393         case 'o':
6394           if (name[1] == 'p' &&
6395               name[2] == 'e' &&
6396               name[3] == 'n')
6397           {                                       /* open       */
6398             return -KEY_open;
6399           }
6400
6401           goto unknown;
6402
6403         case 'p':
6404           switch (name[1])
6405           {
6406             case 'a':
6407               if (name[2] == 'c' &&
6408                   name[3] == 'k')
6409               {                                   /* pack       */
6410                 return -KEY_pack;
6411               }
6412
6413               goto unknown;
6414
6415             case 'i':
6416               if (name[2] == 'p' &&
6417                   name[3] == 'e')
6418               {                                   /* pipe       */
6419                 return -KEY_pipe;
6420               }
6421
6422               goto unknown;
6423
6424             case 'u':
6425               if (name[2] == 's' &&
6426                   name[3] == 'h')
6427               {                                   /* push       */
6428                 return -KEY_push;
6429               }
6430
6431               goto unknown;
6432
6433             default:
6434               goto unknown;
6435           }
6436
6437         case 'r':
6438           switch (name[1])
6439           {
6440             case 'a':
6441               if (name[2] == 'n' &&
6442                   name[3] == 'd')
6443               {                                   /* rand       */
6444                 return -KEY_rand;
6445               }
6446
6447               goto unknown;
6448
6449             case 'e':
6450               switch (name[2])
6451               {
6452                 case 'a':
6453                   if (name[3] == 'd')
6454                   {                               /* read       */
6455                     return -KEY_read;
6456                   }
6457
6458                   goto unknown;
6459
6460                 case 'c':
6461                   if (name[3] == 'v')
6462                   {                               /* recv       */
6463                     return -KEY_recv;
6464                   }
6465
6466                   goto unknown;
6467
6468                 case 'd':
6469                   if (name[3] == 'o')
6470                   {                               /* redo       */
6471                     return KEY_redo;
6472                   }
6473
6474                   goto unknown;
6475
6476                 default:
6477                   goto unknown;
6478               }
6479
6480             default:
6481               goto unknown;
6482           }
6483
6484         case 's':
6485           switch (name[1])
6486           {
6487             case 'e':
6488               switch (name[2])
6489               {
6490                 case 'e':
6491                   if (name[3] == 'k')
6492                   {                               /* seek       */
6493                     return -KEY_seek;
6494                   }
6495
6496                   goto unknown;
6497
6498                 case 'n':
6499                   if (name[3] == 'd')
6500                   {                               /* send       */
6501                     return -KEY_send;
6502                   }
6503
6504                   goto unknown;
6505
6506                 default:
6507                   goto unknown;
6508               }
6509
6510             case 'o':
6511               if (name[2] == 'r' &&
6512                   name[3] == 't')
6513               {                                   /* sort       */
6514                 return KEY_sort;
6515               }
6516
6517               goto unknown;
6518
6519             case 'q':
6520               if (name[2] == 'r' &&
6521                   name[3] == 't')
6522               {                                   /* sqrt       */
6523                 return -KEY_sqrt;
6524               }
6525
6526               goto unknown;
6527
6528             case 't':
6529               if (name[2] == 'a' &&
6530                   name[3] == 't')
6531               {                                   /* stat       */
6532                 return -KEY_stat;
6533               }
6534
6535               goto unknown;
6536
6537             default:
6538               goto unknown;
6539           }
6540
6541         case 't':
6542           switch (name[1])
6543           {
6544             case 'e':
6545               if (name[2] == 'l' &&
6546                   name[3] == 'l')
6547               {                                   /* tell       */
6548                 return -KEY_tell;
6549               }
6550
6551               goto unknown;
6552
6553             case 'i':
6554               switch (name[2])
6555               {
6556                 case 'e':
6557                   if (name[3] == 'd')
6558                   {                               /* tied       */
6559                     return KEY_tied;
6560                   }
6561
6562                   goto unknown;
6563
6564                 case 'm':
6565                   if (name[3] == 'e')
6566                   {                               /* time       */
6567                     return -KEY_time;
6568                   }
6569
6570                   goto unknown;
6571
6572                 default:
6573                   goto unknown;
6574               }
6575
6576             default:
6577               goto unknown;
6578           }
6579
6580         case 'w':
6581           if (name[1] == 'a')
6582           {
6583             switch (name[2])
6584             {
6585               case 'i':
6586                 if (name[3] == 't')
6587                 {                                 /* wait       */
6588                   return -KEY_wait;
6589                 }
6590
6591                 goto unknown;
6592
6593               case 'r':
6594                 if (name[3] == 'n')
6595                 {                                 /* warn       */
6596                   return -KEY_warn;
6597                 }
6598
6599                 goto unknown;
6600
6601               default:
6602                 goto unknown;
6603             }
6604           }
6605
6606           goto unknown;
6607
6608         default:
6609           goto unknown;
6610       }
6611
6612     case 5: /* 36 tokens of length 5 */
6613       switch (name[0])
6614       {
6615         case 'B':
6616           if (name[1] == 'E' &&
6617               name[2] == 'G' &&
6618               name[3] == 'I' &&
6619               name[4] == 'N')
6620           {                                       /* BEGIN      */
6621             return KEY_BEGIN;
6622           }
6623
6624           goto unknown;
6625
6626         case 'C':
6627           if (name[1] == 'H' &&
6628               name[2] == 'E' &&
6629               name[3] == 'C' &&
6630               name[4] == 'K')
6631           {                                       /* CHECK      */
6632             return KEY_CHECK;
6633           }
6634
6635           goto unknown;
6636
6637         case 'a':
6638           switch (name[1])
6639           {
6640             case 'l':
6641               if (name[2] == 'a' &&
6642                   name[3] == 'r' &&
6643                   name[4] == 'm')
6644               {                                   /* alarm      */
6645                 return -KEY_alarm;
6646               }
6647
6648               goto unknown;
6649
6650             case 't':
6651               if (name[2] == 'a' &&
6652                   name[3] == 'n' &&
6653                   name[4] == '2')
6654               {                                   /* atan2      */
6655                 return -KEY_atan2;
6656               }
6657
6658               goto unknown;
6659
6660             default:
6661               goto unknown;
6662           }
6663
6664         case 'b':
6665           if (name[1] == 'l' &&
6666               name[2] == 'e' &&
6667               name[3] == 's' &&
6668               name[4] == 's')
6669           {                                       /* bless      */
6670             return -KEY_bless;
6671           }
6672
6673           goto unknown;
6674
6675         case 'c':
6676           switch (name[1])
6677           {
6678             case 'h':
6679               switch (name[2])
6680               {
6681                 case 'd':
6682                   if (name[3] == 'i' &&
6683                       name[4] == 'r')
6684                   {                               /* chdir      */
6685                     return -KEY_chdir;
6686                   }
6687
6688                   goto unknown;
6689
6690                 case 'm':
6691                   if (name[3] == 'o' &&
6692                       name[4] == 'd')
6693                   {                               /* chmod      */
6694                     return -KEY_chmod;
6695                   }
6696
6697                   goto unknown;
6698
6699                 case 'o':
6700                   switch (name[3])
6701                   {
6702                     case 'm':
6703                       if (name[4] == 'p')
6704                       {                           /* chomp      */
6705                         return -KEY_chomp;
6706                       }
6707
6708                       goto unknown;
6709
6710                     case 'w':
6711                       if (name[4] == 'n')
6712                       {                           /* chown      */
6713                         return -KEY_chown;
6714                       }
6715
6716                       goto unknown;
6717
6718                     default:
6719                       goto unknown;
6720                   }
6721
6722                 default:
6723                   goto unknown;
6724               }
6725
6726             case 'l':
6727               if (name[2] == 'o' &&
6728                   name[3] == 's' &&
6729                   name[4] == 'e')
6730               {                                   /* close      */
6731                 return -KEY_close;
6732               }
6733
6734               goto unknown;
6735
6736             case 'r':
6737               if (name[2] == 'y' &&
6738                   name[3] == 'p' &&
6739                   name[4] == 't')
6740               {                                   /* crypt      */
6741                 return -KEY_crypt;
6742               }
6743
6744               goto unknown;
6745
6746             default:
6747               goto unknown;
6748           }
6749
6750         case 'e':
6751           if (name[1] == 'l' &&
6752               name[2] == 's' &&
6753               name[3] == 'i' &&
6754               name[4] == 'f')
6755           {                                       /* elsif      */
6756             return KEY_elsif;
6757           }
6758
6759           goto unknown;
6760
6761         case 'f':
6762           switch (name[1])
6763           {
6764             case 'c':
6765               if (name[2] == 'n' &&
6766                   name[3] == 't' &&
6767                   name[4] == 'l')
6768               {                                   /* fcntl      */
6769                 return -KEY_fcntl;
6770               }
6771
6772               goto unknown;
6773
6774             case 'l':
6775               if (name[2] == 'o' &&
6776                   name[3] == 'c' &&
6777                   name[4] == 'k')
6778               {                                   /* flock      */
6779                 return -KEY_flock;
6780               }
6781
6782               goto unknown;
6783
6784             default:
6785               goto unknown;
6786           }
6787
6788         case 'i':
6789           switch (name[1])
6790           {
6791             case 'n':
6792               if (name[2] == 'd' &&
6793                   name[3] == 'e' &&
6794                   name[4] == 'x')
6795               {                                   /* index      */
6796                 return -KEY_index;
6797               }
6798
6799               goto unknown;
6800
6801             case 'o':
6802               if (name[2] == 'c' &&
6803                   name[3] == 't' &&
6804                   name[4] == 'l')
6805               {                                   /* ioctl      */
6806                 return -KEY_ioctl;
6807               }
6808
6809               goto unknown;
6810
6811             default:
6812               goto unknown;
6813           }
6814
6815         case 'l':
6816           switch (name[1])
6817           {
6818             case 'o':
6819               if (name[2] == 'c' &&
6820                   name[3] == 'a' &&
6821                   name[4] == 'l')
6822               {                                   /* local      */
6823                 return KEY_local;
6824               }
6825
6826               goto unknown;
6827
6828             case 's':
6829               if (name[2] == 't' &&
6830                   name[3] == 'a' &&
6831                   name[4] == 't')
6832               {                                   /* lstat      */
6833                 return -KEY_lstat;
6834               }
6835
6836               goto unknown;
6837
6838             default:
6839               goto unknown;
6840           }
6841
6842         case 'm':
6843           if (name[1] == 'k' &&
6844               name[2] == 'd' &&
6845               name[3] == 'i' &&
6846               name[4] == 'r')
6847           {                                       /* mkdir      */
6848             return -KEY_mkdir;
6849           }
6850
6851           goto unknown;
6852
6853         case 'p':
6854           if (name[1] == 'r' &&
6855               name[2] == 'i' &&
6856               name[3] == 'n' &&
6857               name[4] == 't')
6858           {                                       /* print      */
6859             return KEY_print;
6860           }
6861
6862           goto unknown;
6863
6864         case 'r':
6865           switch (name[1])
6866           {
6867             case 'e':
6868               if (name[2] == 's' &&
6869                   name[3] == 'e' &&
6870                   name[4] == 't')
6871               {                                   /* reset      */
6872                 return -KEY_reset;
6873               }
6874
6875               goto unknown;
6876
6877             case 'm':
6878               if (name[2] == 'd' &&
6879                   name[3] == 'i' &&
6880                   name[4] == 'r')
6881               {                                   /* rmdir      */
6882                 return -KEY_rmdir;
6883               }
6884
6885               goto unknown;
6886
6887             default:
6888               goto unknown;
6889           }
6890
6891         case 's':
6892           switch (name[1])
6893           {
6894             case 'e':
6895               if (name[2] == 'm' &&
6896                   name[3] == 'o' &&
6897                   name[4] == 'p')
6898               {                                   /* semop      */
6899                 return -KEY_semop;
6900               }
6901
6902               goto unknown;
6903
6904             case 'h':
6905               if (name[2] == 'i' &&
6906                   name[3] == 'f' &&
6907                   name[4] == 't')
6908               {                                   /* shift      */
6909                 return -KEY_shift;
6910               }
6911
6912               goto unknown;
6913
6914             case 'l':
6915               if (name[2] == 'e' &&
6916                   name[3] == 'e' &&
6917                   name[4] == 'p')
6918               {                                   /* sleep      */
6919                 return -KEY_sleep;
6920               }
6921
6922               goto unknown;
6923
6924             case 'p':
6925               if (name[2] == 'l' &&
6926                   name[3] == 'i' &&
6927                   name[4] == 't')
6928               {                                   /* split      */
6929                 return KEY_split;
6930               }
6931
6932               goto unknown;
6933
6934             case 'r':
6935               if (name[2] == 'a' &&
6936                   name[3] == 'n' &&
6937                   name[4] == 'd')
6938               {                                   /* srand      */
6939                 return -KEY_srand;
6940               }
6941
6942               goto unknown;
6943
6944             case 't':
6945               if (name[2] == 'u' &&
6946                   name[3] == 'd' &&
6947                   name[4] == 'y')
6948               {                                   /* study      */
6949                 return KEY_study;
6950               }
6951
6952               goto unknown;
6953
6954             default:
6955               goto unknown;
6956           }
6957
6958         case 't':
6959           if (name[1] == 'i' &&
6960               name[2] == 'm' &&
6961               name[3] == 'e' &&
6962               name[4] == 's')
6963           {                                       /* times      */
6964             return -KEY_times;
6965           }
6966
6967           goto unknown;
6968
6969         case 'u':
6970           switch (name[1])
6971           {
6972             case 'm':
6973               if (name[2] == 'a' &&
6974                   name[3] == 's' &&
6975                   name[4] == 'k')
6976               {                                   /* umask      */
6977                 return -KEY_umask;
6978               }
6979
6980               goto unknown;
6981
6982             case 'n':
6983               switch (name[2])
6984               {
6985                 case 'd':
6986                   if (name[3] == 'e' &&
6987                       name[4] == 'f')
6988                   {                               /* undef      */
6989                     return KEY_undef;
6990                   }
6991
6992                   goto unknown;
6993
6994                 case 't':
6995                   if (name[3] == 'i')
6996                   {
6997                     switch (name[4])
6998                     {
6999                       case 'e':
7000                         {                         /* untie      */
7001                           return KEY_untie;
7002                         }
7003
7004                       case 'l':
7005                         {                         /* until      */
7006                           return KEY_until;
7007                         }
7008
7009                       default:
7010                         goto unknown;
7011                     }
7012                   }
7013
7014                   goto unknown;
7015
7016                 default:
7017                   goto unknown;
7018               }
7019
7020             case 't':
7021               if (name[2] == 'i' &&
7022                   name[3] == 'm' &&
7023                   name[4] == 'e')
7024               {                                   /* utime      */
7025                 return -KEY_utime;
7026               }
7027
7028               goto unknown;
7029
7030             default:
7031               goto unknown;
7032           }
7033
7034         case 'w':
7035           switch (name[1])
7036           {
7037             case 'h':
7038               if (name[2] == 'i' &&
7039                   name[3] == 'l' &&
7040                   name[4] == 'e')
7041               {                                   /* while      */
7042                 return KEY_while;
7043               }
7044
7045               goto unknown;
7046
7047             case 'r':
7048               if (name[2] == 'i' &&
7049                   name[3] == 't' &&
7050                   name[4] == 'e')
7051               {                                   /* write      */
7052                 return -KEY_write;
7053               }
7054
7055               goto unknown;
7056
7057             default:
7058               goto unknown;
7059           }
7060
7061         default:
7062           goto unknown;
7063       }
7064
7065     case 6: /* 33 tokens of length 6 */
7066       switch (name[0])
7067       {
7068         case 'a':
7069           if (name[1] == 'c' &&
7070               name[2] == 'c' &&
7071               name[3] == 'e' &&
7072               name[4] == 'p' &&
7073               name[5] == 't')
7074           {                                       /* accept     */
7075             return -KEY_accept;
7076           }
7077
7078           goto unknown;
7079
7080         case 'c':
7081           switch (name[1])
7082           {
7083             case 'a':
7084               if (name[2] == 'l' &&
7085                   name[3] == 'l' &&
7086                   name[4] == 'e' &&
7087                   name[5] == 'r')
7088               {                                   /* caller     */
7089                 return -KEY_caller;
7090               }
7091
7092               goto unknown;
7093
7094             case 'h':
7095               if (name[2] == 'r' &&
7096                   name[3] == 'o' &&
7097                   name[4] == 'o' &&
7098                   name[5] == 't')
7099               {                                   /* chroot     */
7100                 return -KEY_chroot;
7101               }
7102
7103               goto unknown;
7104
7105             default:
7106               goto unknown;
7107           }
7108
7109         case 'd':
7110           if (name[1] == 'e' &&
7111               name[2] == 'l' &&
7112               name[3] == 'e' &&
7113               name[4] == 't' &&
7114               name[5] == 'e')
7115           {                                       /* delete     */
7116             return KEY_delete;
7117           }
7118
7119           goto unknown;
7120
7121         case 'e':
7122           switch (name[1])
7123           {
7124             case 'l':
7125               if (name[2] == 's' &&
7126                   name[3] == 'e' &&
7127                   name[4] == 'i' &&
7128                   name[5] == 'f')
7129               {                                   /* elseif     */
7130                 if(ckWARN_d(WARN_SYNTAX))
7131                   Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "elseif should be elsif");
7132               }
7133
7134               goto unknown;
7135
7136             case 'x':
7137               if (name[2] == 'i' &&
7138                   name[3] == 's' &&
7139                   name[4] == 't' &&
7140                   name[5] == 's')
7141               {                                   /* exists     */
7142                 return KEY_exists;
7143               }
7144
7145               goto unknown;
7146
7147             default:
7148               goto unknown;
7149           }
7150
7151         case 'f':
7152           switch (name[1])
7153           {
7154             case 'i':
7155               if (name[2] == 'l' &&
7156                   name[3] == 'e' &&
7157                   name[4] == 'n' &&
7158                   name[5] == 'o')
7159               {                                   /* fileno     */
7160                 return -KEY_fileno;
7161               }
7162
7163               goto unknown;
7164
7165             case 'o':
7166               if (name[2] == 'r' &&
7167                   name[3] == 'm' &&
7168                   name[4] == 'a' &&
7169                   name[5] == 't')
7170               {                                   /* format     */
7171                 return KEY_format;
7172               }
7173
7174               goto unknown;
7175
7176             default:
7177               goto unknown;
7178           }
7179
7180         case 'g':
7181           if (name[1] == 'm' &&
7182               name[2] == 't' &&
7183               name[3] == 'i' &&
7184               name[4] == 'm' &&
7185               name[5] == 'e')
7186           {                                       /* gmtime     */
7187             return -KEY_gmtime;
7188           }
7189
7190           goto unknown;
7191
7192         case 'l':
7193           switch (name[1])
7194           {
7195             case 'e':
7196               if (name[2] == 'n' &&
7197                   name[3] == 'g' &&
7198                   name[4] == 't' &&
7199                   name[5] == 'h')
7200               {                                   /* length     */
7201                 return -KEY_length;
7202               }
7203
7204               goto unknown;
7205
7206             case 'i':
7207               if (name[2] == 's' &&
7208                   name[3] == 't' &&
7209                   name[4] == 'e' &&
7210                   name[5] == 'n')
7211               {                                   /* listen     */
7212                 return -KEY_listen;
7213               }
7214
7215               goto unknown;
7216
7217             default:
7218               goto unknown;
7219           }
7220
7221         case 'm':
7222           if (name[1] == 's' &&
7223               name[2] == 'g')
7224           {
7225             switch (name[3])
7226             {
7227               case 'c':
7228                 if (name[4] == 't' &&
7229                     name[5] == 'l')
7230                 {                                 /* msgctl     */
7231                   return -KEY_msgctl;
7232                 }
7233
7234                 goto unknown;
7235
7236               case 'g':
7237                 if (name[4] == 'e' &&
7238                     name[5] == 't')
7239                 {                                 /* msgget     */
7240                   return -KEY_msgget;
7241                 }
7242
7243                 goto unknown;
7244
7245               case 'r':
7246                 if (name[4] == 'c' &&
7247                     name[5] == 'v')
7248                 {                                 /* msgrcv     */
7249                   return -KEY_msgrcv;
7250                 }
7251
7252                 goto unknown;
7253
7254               case 's':
7255                 if (name[4] == 'n' &&
7256                     name[5] == 'd')
7257                 {                                 /* msgsnd     */
7258                   return -KEY_msgsnd;
7259                 }
7260
7261                 goto unknown;
7262
7263               default:
7264                 goto unknown;
7265             }
7266           }
7267
7268           goto unknown;
7269
7270         case 'p':
7271           if (name[1] == 'r' &&
7272               name[2] == 'i' &&
7273               name[3] == 'n' &&
7274               name[4] == 't' &&
7275               name[5] == 'f')
7276           {                                       /* printf     */
7277             return KEY_printf;
7278           }
7279
7280           goto unknown;
7281
7282         case 'r':
7283           switch (name[1])
7284           {
7285             case 'e':
7286               switch (name[2])
7287               {
7288                 case 'n':
7289                   if (name[3] == 'a' &&
7290                       name[4] == 'm' &&
7291                       name[5] == 'e')
7292                   {                               /* rename     */
7293                     return -KEY_rename;
7294                   }
7295
7296                   goto unknown;
7297
7298                 case 't':
7299                   if (name[3] == 'u' &&
7300                       name[4] == 'r' &&
7301                       name[5] == 'n')
7302                   {                               /* return     */
7303                     return KEY_return;
7304                   }
7305
7306                   goto unknown;
7307
7308                 default:
7309                   goto unknown;
7310               }
7311
7312             case 'i':
7313               if (name[2] == 'n' &&
7314                   name[3] == 'd' &&
7315                   name[4] == 'e' &&
7316                   name[5] == 'x')
7317               {                                   /* rindex     */
7318                 return -KEY_rindex;
7319               }
7320
7321               goto unknown;
7322
7323             default:
7324               goto unknown;
7325           }
7326
7327         case 's':
7328           switch (name[1])
7329           {
7330             case 'c':
7331               if (name[2] == 'a' &&
7332                   name[3] == 'l' &&
7333                   name[4] == 'a' &&
7334                   name[5] == 'r')
7335               {                                   /* scalar     */
7336                 return KEY_scalar;
7337               }
7338
7339               goto unknown;
7340
7341             case 'e':
7342               switch (name[2])
7343               {
7344                 case 'l':
7345                   if (name[3] == 'e' &&
7346                       name[4] == 'c' &&
7347                       name[5] == 't')
7348                   {                               /* select     */
7349                     return -KEY_select;
7350                   }
7351
7352                   goto unknown;
7353
7354                 case 'm':
7355                   switch (name[3])
7356                   {
7357                     case 'c':
7358                       if (name[4] == 't' &&
7359                           name[5] == 'l')
7360                       {                           /* semctl     */
7361                         return -KEY_semctl;
7362                       }
7363
7364                       goto unknown;
7365
7366                     case 'g':
7367                       if (name[4] == 'e' &&
7368                           name[5] == 't')
7369                       {                           /* semget     */
7370                         return -KEY_semget;
7371                       }
7372
7373                       goto unknown;
7374
7375                     default:
7376                       goto unknown;
7377                   }
7378
7379                 default:
7380                   goto unknown;
7381               }
7382
7383             case 'h':
7384               if (name[2] == 'm')
7385               {
7386                 switch (name[3])
7387                 {
7388                   case 'c':
7389                     if (name[4] == 't' &&
7390                         name[5] == 'l')
7391                     {                             /* shmctl     */
7392                       return -KEY_shmctl;
7393                     }
7394
7395                     goto unknown;
7396
7397                   case 'g':
7398                     if (name[4] == 'e' &&
7399                         name[5] == 't')
7400                     {                             /* shmget     */
7401                       return -KEY_shmget;
7402                     }
7403
7404                     goto unknown;
7405
7406                   default:
7407                     goto unknown;
7408                 }
7409               }
7410
7411               goto unknown;
7412
7413             case 'o':
7414               if (name[2] == 'c' &&
7415                   name[3] == 'k' &&
7416                   name[4] == 'e' &&
7417                   name[5] == 't')
7418               {                                   /* socket     */
7419                 return -KEY_socket;
7420               }
7421
7422               goto unknown;
7423
7424             case 'p':
7425               if (name[2] == 'l' &&
7426                   name[3] == 'i' &&
7427                   name[4] == 'c' &&
7428                   name[5] == 'e')
7429               {                                   /* splice     */
7430                 return -KEY_splice;
7431               }
7432
7433               goto unknown;
7434
7435             case 'u':
7436               if (name[2] == 'b' &&
7437                   name[3] == 's' &&
7438                   name[4] == 't' &&
7439                   name[5] == 'r')
7440               {                                   /* substr     */
7441                 return -KEY_substr;
7442               }
7443
7444               goto unknown;
7445
7446             case 'y':
7447               if (name[2] == 's' &&
7448                   name[3] == 't' &&
7449                   name[4] == 'e' &&
7450                   name[5] == 'm')
7451               {                                   /* system     */
7452                 return -KEY_system;
7453               }
7454
7455               goto unknown;
7456
7457             default:
7458               goto unknown;
7459           }
7460
7461         case 'u':
7462           if (name[1] == 'n')
7463           {
7464             switch (name[2])
7465             {
7466               case 'l':
7467                 switch (name[3])
7468                 {
7469                   case 'e':
7470                     if (name[4] == 's' &&
7471                         name[5] == 's')
7472                     {                             /* unless     */
7473                       return KEY_unless;
7474                     }
7475
7476                     goto unknown;
7477
7478                   case 'i':
7479                     if (name[4] == 'n' &&
7480                         name[5] == 'k')
7481                     {                             /* unlink     */
7482                       return -KEY_unlink;
7483                     }
7484
7485                     goto unknown;
7486
7487                   default:
7488                     goto unknown;
7489                 }
7490
7491               case 'p':
7492                 if (name[3] == 'a' &&
7493                     name[4] == 'c' &&
7494                     name[5] == 'k')
7495                 {                                 /* unpack     */
7496                   return -KEY_unpack;
7497                 }
7498
7499                 goto unknown;
7500
7501               default:
7502                 goto unknown;
7503             }
7504           }
7505
7506           goto unknown;
7507
7508         case 'v':
7509           if (name[1] == 'a' &&
7510               name[2] == 'l' &&
7511               name[3] == 'u' &&
7512               name[4] == 'e' &&
7513               name[5] == 's')
7514           {                                       /* values     */
7515             return -KEY_values;
7516           }
7517
7518           goto unknown;
7519
7520         default:
7521           goto unknown;
7522       }
7523
7524     case 7: /* 28 tokens of length 7 */
7525       switch (name[0])
7526       {
7527         case 'D':
7528           if (name[1] == 'E' &&
7529               name[2] == 'S' &&
7530               name[3] == 'T' &&
7531               name[4] == 'R' &&
7532               name[5] == 'O' &&
7533               name[6] == 'Y')
7534           {                                       /* DESTROY    */
7535             return KEY_DESTROY;
7536           }
7537
7538           goto unknown;
7539
7540         case '_':
7541           if (name[1] == '_' &&
7542               name[2] == 'E' &&
7543               name[3] == 'N' &&
7544               name[4] == 'D' &&
7545               name[5] == '_' &&
7546               name[6] == '_')
7547           {                                       /* __END__    */
7548             return KEY___END__;
7549           }
7550
7551           goto unknown;
7552
7553         case 'b':
7554           if (name[1] == 'i' &&
7555               name[2] == 'n' &&
7556               name[3] == 'm' &&
7557               name[4] == 'o' &&
7558               name[5] == 'd' &&
7559               name[6] == 'e')
7560           {                                       /* binmode    */
7561             return -KEY_binmode;
7562           }
7563
7564           goto unknown;
7565
7566         case 'c':
7567           if (name[1] == 'o' &&
7568               name[2] == 'n' &&
7569               name[3] == 'n' &&
7570               name[4] == 'e' &&
7571               name[5] == 'c' &&
7572               name[6] == 't')
7573           {                                       /* connect    */
7574             return -KEY_connect;
7575           }
7576
7577           goto unknown;
7578
7579         case 'd':
7580           switch (name[1])
7581           {
7582             case 'b':
7583               if (name[2] == 'm' &&
7584                   name[3] == 'o' &&
7585                   name[4] == 'p' &&
7586                   name[5] == 'e' &&
7587                   name[6] == 'n')
7588               {                                   /* dbmopen    */
7589                 return -KEY_dbmopen;
7590               }
7591
7592               goto unknown;
7593
7594             case 'e':
7595               if (name[2] == 'f' &&
7596                   name[3] == 'i' &&
7597                   name[4] == 'n' &&
7598                   name[5] == 'e' &&
7599                   name[6] == 'd')
7600               {                                   /* defined    */
7601                 return KEY_defined;
7602               }
7603
7604               goto unknown;
7605
7606             default:
7607               goto unknown;
7608           }
7609
7610         case 'f':
7611           if (name[1] == 'o' &&
7612               name[2] == 'r' &&
7613               name[3] == 'e' &&
7614               name[4] == 'a' &&
7615               name[5] == 'c' &&
7616               name[6] == 'h')
7617           {                                       /* foreach    */
7618             return KEY_foreach;
7619           }
7620
7621           goto unknown;
7622
7623         case 'g':
7624           if (name[1] == 'e' &&
7625               name[2] == 't' &&
7626               name[3] == 'p')
7627           {
7628             switch (name[4])
7629             {
7630               case 'g':
7631                 if (name[5] == 'r' &&
7632                     name[6] == 'p')
7633                 {                                 /* getpgrp    */
7634                   return -KEY_getpgrp;
7635                 }
7636
7637                 goto unknown;
7638
7639               case 'p':
7640                 if (name[5] == 'i' &&
7641                     name[6] == 'd')
7642                 {                                 /* getppid    */
7643                   return -KEY_getppid;
7644                 }
7645
7646                 goto unknown;
7647
7648               default:
7649                 goto unknown;
7650             }
7651           }
7652
7653           goto unknown;
7654
7655         case 'l':
7656           if (name[1] == 'c' &&
7657               name[2] == 'f' &&
7658               name[3] == 'i' &&
7659               name[4] == 'r' &&
7660               name[5] == 's' &&
7661               name[6] == 't')
7662           {                                       /* lcfirst    */
7663             return -KEY_lcfirst;
7664           }
7665
7666           goto unknown;
7667
7668         case 'o':
7669           if (name[1] == 'p' &&
7670               name[2] == 'e' &&
7671               name[3] == 'n' &&
7672               name[4] == 'd' &&
7673               name[5] == 'i' &&
7674               name[6] == 'r')
7675           {                                       /* opendir    */
7676             return -KEY_opendir;
7677           }
7678
7679           goto unknown;
7680
7681         case 'p':
7682           if (name[1] == 'a' &&
7683               name[2] == 'c' &&
7684               name[3] == 'k' &&
7685               name[4] == 'a' &&
7686               name[5] == 'g' &&
7687               name[6] == 'e')
7688           {                                       /* package    */
7689             return KEY_package;
7690           }
7691
7692           goto unknown;
7693
7694         case 'r':
7695           if (name[1] == 'e')
7696           {
7697             switch (name[2])
7698             {
7699               case 'a':
7700                 if (name[3] == 'd' &&
7701                     name[4] == 'd' &&
7702                     name[5] == 'i' &&
7703                     name[6] == 'r')
7704                 {                                 /* readdir    */
7705                   return -KEY_readdir;
7706                 }
7707
7708                 goto unknown;
7709
7710               case 'q':
7711                 if (name[3] == 'u' &&
7712                     name[4] == 'i' &&
7713                     name[5] == 'r' &&
7714                     name[6] == 'e')
7715                 {                                 /* require    */
7716                   return KEY_require;
7717                 }
7718
7719                 goto unknown;
7720
7721               case 'v':
7722                 if (name[3] == 'e' &&
7723                     name[4] == 'r' &&
7724                     name[5] == 's' &&
7725                     name[6] == 'e')
7726                 {                                 /* reverse    */
7727                   return -KEY_reverse;
7728                 }
7729
7730                 goto unknown;
7731
7732               default:
7733                 goto unknown;
7734             }
7735           }
7736
7737           goto unknown;
7738
7739         case 's':
7740           switch (name[1])
7741           {
7742             case 'e':
7743               switch (name[2])
7744               {
7745                 case 'e':
7746                   if (name[3] == 'k' &&
7747                       name[4] == 'd' &&
7748                       name[5] == 'i' &&
7749                       name[6] == 'r')
7750                   {                               /* seekdir    */
7751                     return -KEY_seekdir;
7752                   }
7753
7754                   goto unknown;
7755
7756                 case 't':
7757                   if (name[3] == 'p' &&
7758                       name[4] == 'g' &&
7759                       name[5] == 'r' &&
7760                       name[6] == 'p')
7761                   {                               /* setpgrp    */
7762                     return -KEY_setpgrp;
7763                   }
7764
7765                   goto unknown;
7766
7767                 default:
7768                   goto unknown;
7769               }
7770
7771             case 'h':
7772               if (name[2] == 'm' &&
7773                   name[3] == 'r' &&
7774                   name[4] == 'e' &&
7775                   name[5] == 'a' &&
7776                   name[6] == 'd')
7777               {                                   /* shmread    */
7778                 return -KEY_shmread;
7779               }
7780
7781               goto unknown;
7782
7783             case 'p':
7784               if (name[2] == 'r' &&
7785                   name[3] == 'i' &&
7786                   name[4] == 'n' &&
7787                   name[5] == 't' &&
7788                   name[6] == 'f')
7789               {                                   /* sprintf    */
7790                 return -KEY_sprintf;
7791               }
7792
7793               goto unknown;
7794
7795             case 'y':
7796               switch (name[2])
7797               {
7798                 case 'm':
7799                   if (name[3] == 'l' &&
7800                       name[4] == 'i' &&
7801                       name[5] == 'n' &&
7802                       name[6] == 'k')
7803                   {                               /* symlink    */
7804                     return -KEY_symlink;
7805                   }
7806
7807                   goto unknown;
7808
7809                 case 's':
7810                   switch (name[3])
7811                   {
7812                     case 'c':
7813                       if (name[4] == 'a' &&
7814                           name[5] == 'l' &&
7815                           name[6] == 'l')
7816                       {                           /* syscall    */
7817                         return -KEY_syscall;
7818                       }
7819
7820                       goto unknown;
7821
7822                     case 'o':
7823                       if (name[4] == 'p' &&
7824                           name[5] == 'e' &&
7825                           name[6] == 'n')
7826                       {                           /* sysopen    */
7827                         return -KEY_sysopen;
7828                       }
7829
7830                       goto unknown;
7831
7832                     case 'r':
7833                       if (name[4] == 'e' &&
7834                           name[5] == 'a' &&
7835                           name[6] == 'd')
7836                       {                           /* sysread    */
7837                         return -KEY_sysread;
7838                       }
7839
7840                       goto unknown;
7841
7842                     case 's':
7843                       if (name[4] == 'e' &&
7844                           name[5] == 'e' &&
7845                           name[6] == 'k')
7846                       {                           /* sysseek    */
7847                         return -KEY_sysseek;
7848                       }
7849
7850                       goto unknown;
7851
7852                     default:
7853                       goto unknown;
7854                   }
7855
7856                 default:
7857                   goto unknown;
7858               }
7859
7860             default:
7861               goto unknown;
7862           }
7863
7864         case 't':
7865           if (name[1] == 'e' &&
7866               name[2] == 'l' &&
7867               name[3] == 'l' &&
7868               name[4] == 'd' &&
7869               name[5] == 'i' &&
7870               name[6] == 'r')
7871           {                                       /* telldir    */
7872             return -KEY_telldir;
7873           }
7874
7875           goto unknown;
7876
7877         case 'u':
7878           switch (name[1])
7879           {
7880             case 'c':
7881               if (name[2] == 'f' &&
7882                   name[3] == 'i' &&
7883                   name[4] == 'r' &&
7884                   name[5] == 's' &&
7885                   name[6] == 't')
7886               {                                   /* ucfirst    */
7887                 return -KEY_ucfirst;
7888               }
7889
7890               goto unknown;
7891
7892             case 'n':
7893               if (name[2] == 's' &&
7894                   name[3] == 'h' &&
7895                   name[4] == 'i' &&
7896                   name[5] == 'f' &&
7897                   name[6] == 't')
7898               {                                   /* unshift    */
7899                 return -KEY_unshift;
7900               }
7901
7902               goto unknown;
7903
7904             default:
7905               goto unknown;
7906           }
7907
7908         case 'w':
7909           if (name[1] == 'a' &&
7910               name[2] == 'i' &&
7911               name[3] == 't' &&
7912               name[4] == 'p' &&
7913               name[5] == 'i' &&
7914               name[6] == 'd')
7915           {                                       /* waitpid    */
7916             return -KEY_waitpid;
7917           }
7918
7919           goto unknown;
7920
7921         default:
7922           goto unknown;
7923       }
7924
7925     case 8: /* 26 tokens of length 8 */
7926       switch (name[0])
7927       {
7928         case 'A':
7929           if (name[1] == 'U' &&
7930               name[2] == 'T' &&
7931               name[3] == 'O' &&
7932               name[4] == 'L' &&
7933               name[5] == 'O' &&
7934               name[6] == 'A' &&
7935               name[7] == 'D')
7936           {                                       /* AUTOLOAD   */
7937             return KEY_AUTOLOAD;
7938           }
7939
7940           goto unknown;
7941
7942         case '_':
7943           if (name[1] == '_')
7944           {
7945             switch (name[2])
7946             {
7947               case 'D':
7948                 if (name[3] == 'A' &&
7949                     name[4] == 'T' &&
7950                     name[5] == 'A' &&
7951                     name[6] == '_' &&
7952                     name[7] == '_')
7953                 {                                 /* __DATA__   */
7954                   return KEY___DATA__;
7955                 }
7956
7957                 goto unknown;
7958
7959               case 'F':
7960                 if (name[3] == 'I' &&
7961                     name[4] == 'L' &&
7962                     name[5] == 'E' &&
7963                     name[6] == '_' &&
7964                     name[7] == '_')
7965                 {                                 /* __FILE__   */
7966                   return -KEY___FILE__;
7967                 }
7968
7969                 goto unknown;
7970
7971               case 'L':
7972                 if (name[3] == 'I' &&
7973                     name[4] == 'N' &&
7974                     name[5] == 'E' &&
7975                     name[6] == '_' &&
7976                     name[7] == '_')
7977                 {                                 /* __LINE__   */
7978                   return -KEY___LINE__;
7979                 }
7980
7981                 goto unknown;
7982
7983               default:
7984                 goto unknown;
7985             }
7986           }
7987
7988           goto unknown;
7989
7990         case 'c':
7991           switch (name[1])
7992           {
7993             case 'l':
7994               if (name[2] == 'o' &&
7995                   name[3] == 's' &&
7996                   name[4] == 'e' &&
7997                   name[5] == 'd' &&
7998                   name[6] == 'i' &&
7999                   name[7] == 'r')
8000               {                                   /* closedir   */
8001                 return -KEY_closedir;
8002               }
8003
8004               goto unknown;
8005
8006             case 'o':
8007               if (name[2] == 'n' &&
8008                   name[3] == 't' &&
8009                   name[4] == 'i' &&
8010                   name[5] == 'n' &&
8011                   name[6] == 'u' &&
8012                   name[7] == 'e')
8013               {                                   /* continue   */
8014                 return -KEY_continue;
8015               }
8016
8017               goto unknown;
8018
8019             default:
8020               goto unknown;
8021           }
8022
8023         case 'd':
8024           if (name[1] == 'b' &&
8025               name[2] == 'm' &&
8026               name[3] == 'c' &&
8027               name[4] == 'l' &&
8028               name[5] == 'o' &&
8029               name[6] == 's' &&
8030               name[7] == 'e')
8031           {                                       /* dbmclose   */
8032             return -KEY_dbmclose;
8033           }
8034
8035           goto unknown;
8036
8037         case 'e':
8038           if (name[1] == 'n' &&
8039               name[2] == 'd')
8040           {
8041             switch (name[3])
8042             {
8043               case 'g':
8044                 if (name[4] == 'r' &&
8045                     name[5] == 'e' &&
8046                     name[6] == 'n' &&
8047                     name[7] == 't')
8048                 {                                 /* endgrent   */
8049                   return -KEY_endgrent;
8050                 }
8051
8052                 goto unknown;
8053
8054               case 'p':
8055                 if (name[4] == 'w' &&
8056                     name[5] == 'e' &&
8057                     name[6] == 'n' &&
8058                     name[7] == 't')
8059                 {                                 /* endpwent   */
8060                   return -KEY_endpwent;
8061                 }
8062
8063                 goto unknown;
8064
8065               default:
8066                 goto unknown;
8067             }
8068           }
8069
8070           goto unknown;
8071
8072         case 'f':
8073           if (name[1] == 'o' &&
8074               name[2] == 'r' &&
8075               name[3] == 'm' &&
8076               name[4] == 'l' &&
8077               name[5] == 'i' &&
8078               name[6] == 'n' &&
8079               name[7] == 'e')
8080           {                                       /* formline   */
8081             return -KEY_formline;
8082           }
8083
8084           goto unknown;
8085
8086         case 'g':
8087           if (name[1] == 'e' &&
8088               name[2] == 't')
8089           {
8090             switch (name[3])
8091             {
8092               case 'g':
8093                 if (name[4] == 'r')
8094                 {
8095                   switch (name[5])
8096                   {
8097                     case 'e':
8098                       if (name[6] == 'n' &&
8099                           name[7] == 't')
8100                       {                           /* getgrent   */
8101                         return -KEY_getgrent;
8102                       }
8103
8104                       goto unknown;
8105
8106                     case 'g':
8107                       if (name[6] == 'i' &&
8108                           name[7] == 'd')
8109                       {                           /* getgrgid   */
8110                         return -KEY_getgrgid;
8111                       }
8112
8113                       goto unknown;
8114
8115                     case 'n':
8116                       if (name[6] == 'a' &&
8117                           name[7] == 'm')
8118                       {                           /* getgrnam   */
8119                         return -KEY_getgrnam;
8120                       }
8121
8122                       goto unknown;
8123
8124                     default:
8125                       goto unknown;
8126                   }
8127                 }
8128
8129                 goto unknown;
8130
8131               case 'l':
8132                 if (name[4] == 'o' &&
8133                     name[5] == 'g' &&
8134                     name[6] == 'i' &&
8135                     name[7] == 'n')
8136                 {                                 /* getlogin   */
8137                   return -KEY_getlogin;
8138                 }
8139
8140                 goto unknown;
8141
8142               case 'p':
8143                 if (name[4] == 'w')
8144                 {
8145                   switch (name[5])
8146                   {
8147                     case 'e':
8148                       if (name[6] == 'n' &&
8149                           name[7] == 't')
8150                       {                           /* getpwent   */
8151                         return -KEY_getpwent;
8152                       }
8153
8154                       goto unknown;
8155
8156                     case 'n':
8157                       if (name[6] == 'a' &&
8158                           name[7] == 'm')
8159                       {                           /* getpwnam   */
8160                         return -KEY_getpwnam;
8161                       }
8162
8163                       goto unknown;
8164
8165                     case 'u':
8166                       if (name[6] == 'i' &&
8167                           name[7] == 'd')
8168                       {                           /* getpwuid   */
8169                         return -KEY_getpwuid;
8170                       }
8171
8172                       goto unknown;
8173
8174                     default:
8175                       goto unknown;
8176                   }
8177                 }
8178
8179                 goto unknown;
8180
8181               default:
8182                 goto unknown;
8183             }
8184           }
8185
8186           goto unknown;
8187
8188         case 'r':
8189           if (name[1] == 'e' &&
8190               name[2] == 'a' &&
8191               name[3] == 'd')
8192           {
8193             switch (name[4])
8194             {
8195               case 'l':
8196                 if (name[5] == 'i' &&
8197                     name[6] == 'n')
8198                 {
8199                   switch (name[7])
8200                   {
8201                     case 'e':
8202                       {                           /* readline   */
8203                         return -KEY_readline;
8204                       }
8205
8206                     case 'k':
8207                       {                           /* readlink   */
8208                         return -KEY_readlink;
8209                       }
8210
8211                     default:
8212                       goto unknown;
8213                   }
8214                 }
8215
8216                 goto unknown;
8217
8218               case 'p':
8219                 if (name[5] == 'i' &&
8220                     name[6] == 'p' &&
8221                     name[7] == 'e')
8222                 {                                 /* readpipe   */
8223                   return -KEY_readpipe;
8224                 }
8225
8226                 goto unknown;
8227
8228               default:
8229                 goto unknown;
8230             }
8231           }
8232
8233           goto unknown;
8234
8235         case 's':
8236           switch (name[1])
8237           {
8238             case 'e':
8239               if (name[2] == 't')
8240               {
8241                 switch (name[3])
8242                 {
8243                   case 'g':
8244                     if (name[4] == 'r' &&
8245                         name[5] == 'e' &&
8246                         name[6] == 'n' &&
8247                         name[7] == 't')
8248                     {                             /* setgrent   */
8249                       return -KEY_setgrent;
8250                     }
8251
8252                     goto unknown;
8253
8254                   case 'p':
8255                     if (name[4] == 'w' &&
8256                         name[5] == 'e' &&
8257                         name[6] == 'n' &&
8258                         name[7] == 't')
8259                     {                             /* setpwent   */
8260                       return -KEY_setpwent;
8261                     }
8262
8263                     goto unknown;
8264
8265                   default:
8266                     goto unknown;
8267                 }
8268               }
8269
8270               goto unknown;
8271
8272             case 'h':
8273               switch (name[2])
8274               {
8275                 case 'm':
8276                   if (name[3] == 'w' &&
8277                       name[4] == 'r' &&
8278                       name[5] == 'i' &&
8279                       name[6] == 't' &&
8280                       name[7] == 'e')
8281                   {                               /* shmwrite   */
8282                     return -KEY_shmwrite;
8283                   }
8284
8285                   goto unknown;
8286
8287                 case 'u':
8288                   if (name[3] == 't' &&
8289                       name[4] == 'd' &&
8290                       name[5] == 'o' &&
8291                       name[6] == 'w' &&
8292                       name[7] == 'n')
8293                   {                               /* shutdown   */
8294                     return -KEY_shutdown;
8295                   }
8296
8297                   goto unknown;
8298
8299                 default:
8300                   goto unknown;
8301               }
8302
8303             case 'y':
8304               if (name[2] == 's' &&
8305                   name[3] == 'w' &&
8306                   name[4] == 'r' &&
8307                   name[5] == 'i' &&
8308                   name[6] == 't' &&
8309                   name[7] == 'e')
8310               {                                   /* syswrite   */
8311                 return -KEY_syswrite;
8312               }
8313
8314               goto unknown;
8315
8316             default:
8317               goto unknown;
8318           }
8319
8320         case 't':
8321           if (name[1] == 'r' &&
8322               name[2] == 'u' &&
8323               name[3] == 'n' &&
8324               name[4] == 'c' &&
8325               name[5] == 'a' &&
8326               name[6] == 't' &&
8327               name[7] == 'e')
8328           {                                       /* truncate   */
8329             return -KEY_truncate;
8330           }
8331
8332           goto unknown;
8333
8334         default:
8335           goto unknown;
8336       }
8337
8338     case 9: /* 8 tokens of length 9 */
8339       switch (name[0])
8340       {
8341         case 'e':
8342           if (name[1] == 'n' &&
8343               name[2] == 'd' &&
8344               name[3] == 'n' &&
8345               name[4] == 'e' &&
8346               name[5] == 't' &&
8347               name[6] == 'e' &&
8348               name[7] == 'n' &&
8349               name[8] == 't')
8350           {                                       /* endnetent  */
8351             return -KEY_endnetent;
8352           }
8353
8354           goto unknown;
8355
8356         case 'g':
8357           if (name[1] == 'e' &&
8358               name[2] == 't' &&
8359               name[3] == 'n' &&
8360               name[4] == 'e' &&
8361               name[5] == 't' &&
8362               name[6] == 'e' &&
8363               name[7] == 'n' &&
8364               name[8] == 't')
8365           {                                       /* getnetent  */
8366             return -KEY_getnetent;
8367           }
8368
8369           goto unknown;
8370
8371         case 'l':
8372           if (name[1] == 'o' &&
8373               name[2] == 'c' &&
8374               name[3] == 'a' &&
8375               name[4] == 'l' &&
8376               name[5] == 't' &&
8377               name[6] == 'i' &&
8378               name[7] == 'm' &&
8379               name[8] == 'e')
8380           {                                       /* localtime  */
8381             return -KEY_localtime;
8382           }
8383
8384           goto unknown;
8385
8386         case 'p':
8387           if (name[1] == 'r' &&
8388               name[2] == 'o' &&
8389               name[3] == 't' &&
8390               name[4] == 'o' &&
8391               name[5] == 't' &&
8392               name[6] == 'y' &&
8393               name[7] == 'p' &&
8394               name[8] == 'e')
8395           {                                       /* prototype  */
8396             return KEY_prototype;
8397           }
8398
8399           goto unknown;
8400
8401         case 'q':
8402           if (name[1] == 'u' &&
8403               name[2] == 'o' &&
8404               name[3] == 't' &&
8405               name[4] == 'e' &&
8406               name[5] == 'm' &&
8407               name[6] == 'e' &&
8408               name[7] == 't' &&
8409               name[8] == 'a')
8410           {                                       /* quotemeta  */
8411             return -KEY_quotemeta;
8412           }
8413
8414           goto unknown;
8415
8416         case 'r':
8417           if (name[1] == 'e' &&
8418               name[2] == 'w' &&
8419               name[3] == 'i' &&
8420               name[4] == 'n' &&
8421               name[5] == 'd' &&
8422               name[6] == 'd' &&
8423               name[7] == 'i' &&
8424               name[8] == 'r')
8425           {                                       /* rewinddir  */
8426             return -KEY_rewinddir;
8427           }
8428
8429           goto unknown;
8430
8431         case 's':
8432           if (name[1] == 'e' &&
8433               name[2] == 't' &&
8434               name[3] == 'n' &&
8435               name[4] == 'e' &&
8436               name[5] == 't' &&
8437               name[6] == 'e' &&
8438               name[7] == 'n' &&
8439               name[8] == 't')
8440           {                                       /* setnetent  */
8441             return -KEY_setnetent;
8442           }
8443
8444           goto unknown;
8445
8446         case 'w':
8447           if (name[1] == 'a' &&
8448               name[2] == 'n' &&
8449               name[3] == 't' &&
8450               name[4] == 'a' &&
8451               name[5] == 'r' &&
8452               name[6] == 'r' &&
8453               name[7] == 'a' &&
8454               name[8] == 'y')
8455           {                                       /* wantarray  */
8456             return -KEY_wantarray;
8457           }
8458
8459           goto unknown;
8460
8461         default:
8462           goto unknown;
8463       }
8464
8465     case 10: /* 9 tokens of length 10 */
8466       switch (name[0])
8467       {
8468         case 'e':
8469           if (name[1] == 'n' &&
8470               name[2] == 'd')
8471           {
8472             switch (name[3])
8473             {
8474               case 'h':
8475                 if (name[4] == 'o' &&
8476                     name[5] == 's' &&
8477                     name[6] == 't' &&
8478                     name[7] == 'e' &&
8479                     name[8] == 'n' &&
8480                     name[9] == 't')
8481                 {                                 /* endhostent */
8482                   return -KEY_endhostent;
8483                 }
8484
8485                 goto unknown;
8486
8487               case 's':
8488                 if (name[4] == 'e' &&
8489                     name[5] == 'r' &&
8490                     name[6] == 'v' &&
8491                     name[7] == 'e' &&
8492                     name[8] == 'n' &&
8493                     name[9] == 't')
8494                 {                                 /* endservent */
8495                   return -KEY_endservent;
8496                 }
8497
8498                 goto unknown;
8499
8500               default:
8501                 goto unknown;
8502             }
8503           }
8504
8505           goto unknown;
8506
8507         case 'g':
8508           if (name[1] == 'e' &&
8509               name[2] == 't')
8510           {
8511             switch (name[3])
8512             {
8513               case 'h':
8514                 if (name[4] == 'o' &&
8515                     name[5] == 's' &&
8516                     name[6] == 't' &&
8517                     name[7] == 'e' &&
8518                     name[8] == 'n' &&
8519                     name[9] == 't')
8520                 {                                 /* gethostent */
8521                   return -KEY_gethostent;
8522                 }
8523
8524                 goto unknown;
8525
8526               case 's':
8527                 switch (name[4])
8528                 {
8529                   case 'e':
8530                     if (name[5] == 'r' &&
8531                         name[6] == 'v' &&
8532                         name[7] == 'e' &&
8533                         name[8] == 'n' &&
8534                         name[9] == 't')
8535                     {                             /* getservent */
8536                       return -KEY_getservent;
8537                     }
8538
8539                     goto unknown;
8540
8541                   case 'o':
8542                     if (name[5] == 'c' &&
8543                         name[6] == 'k' &&
8544                         name[7] == 'o' &&
8545                         name[8] == 'p' &&
8546                         name[9] == 't')
8547                     {                             /* getsockopt */
8548                       return -KEY_getsockopt;
8549                     }
8550
8551                     goto unknown;
8552
8553                   default:
8554                     goto unknown;
8555                 }
8556
8557               default:
8558                 goto unknown;
8559             }
8560           }
8561
8562           goto unknown;
8563
8564         case 's':
8565           switch (name[1])
8566           {
8567             case 'e':
8568               if (name[2] == 't')
8569               {
8570                 switch (name[3])
8571                 {
8572                   case 'h':
8573                     if (name[4] == 'o' &&
8574                         name[5] == 's' &&
8575                         name[6] == 't' &&
8576                         name[7] == 'e' &&
8577                         name[8] == 'n' &&
8578                         name[9] == 't')
8579                     {                             /* sethostent */
8580                       return -KEY_sethostent;
8581                     }
8582
8583                     goto unknown;
8584
8585                   case 's':
8586                     switch (name[4])
8587                     {
8588                       case 'e':
8589                         if (name[5] == 'r' &&
8590                             name[6] == 'v' &&
8591                             name[7] == 'e' &&
8592                             name[8] == 'n' &&
8593                             name[9] == 't')
8594                         {                         /* setservent */
8595                           return -KEY_setservent;
8596                         }
8597
8598                         goto unknown;
8599
8600                       case 'o':
8601                         if (name[5] == 'c' &&
8602                             name[6] == 'k' &&
8603                             name[7] == 'o' &&
8604                             name[8] == 'p' &&
8605                             name[9] == 't')
8606                         {                         /* setsockopt */
8607                           return -KEY_setsockopt;
8608                         }
8609
8610                         goto unknown;
8611
8612                       default:
8613                         goto unknown;
8614                     }
8615
8616                   default:
8617                     goto unknown;
8618                 }
8619               }
8620
8621               goto unknown;
8622
8623             case 'o':
8624               if (name[2] == 'c' &&
8625                   name[3] == 'k' &&
8626                   name[4] == 'e' &&
8627                   name[5] == 't' &&
8628                   name[6] == 'p' &&
8629                   name[7] == 'a' &&
8630                   name[8] == 'i' &&
8631                   name[9] == 'r')
8632               {                                   /* socketpair */
8633                 return -KEY_socketpair;
8634               }
8635
8636               goto unknown;
8637
8638             default:
8639               goto unknown;
8640           }
8641
8642         default:
8643           goto unknown;
8644       }
8645
8646     case 11: /* 8 tokens of length 11 */
8647       switch (name[0])
8648       {
8649         case '_':
8650           if (name[1] == '_' &&
8651               name[2] == 'P' &&
8652               name[3] == 'A' &&
8653               name[4] == 'C' &&
8654               name[5] == 'K' &&
8655               name[6] == 'A' &&
8656               name[7] == 'G' &&
8657               name[8] == 'E' &&
8658               name[9] == '_' &&
8659               name[10] == '_')
8660           {                                       /* __PACKAGE__ */
8661             return -KEY___PACKAGE__;
8662           }
8663
8664           goto unknown;
8665
8666         case 'e':
8667           if (name[1] == 'n' &&
8668               name[2] == 'd' &&
8669               name[3] == 'p' &&
8670               name[4] == 'r' &&
8671               name[5] == 'o' &&
8672               name[6] == 't' &&
8673               name[7] == 'o' &&
8674               name[8] == 'e' &&
8675               name[9] == 'n' &&
8676               name[10] == 't')
8677           {                                       /* endprotoent */
8678             return -KEY_endprotoent;
8679           }
8680
8681           goto unknown;
8682
8683         case 'g':
8684           if (name[1] == 'e' &&
8685               name[2] == 't')
8686           {
8687             switch (name[3])
8688             {
8689               case 'p':
8690                 switch (name[4])
8691                 {
8692                   case 'e':
8693                     if (name[5] == 'e' &&
8694                         name[6] == 'r' &&
8695                         name[7] == 'n' &&
8696                         name[8] == 'a' &&
8697                         name[9] == 'm' &&
8698                         name[10] == 'e')
8699                     {                             /* getpeername */
8700                       return -KEY_getpeername;
8701                     }
8702
8703                     goto unknown;
8704
8705                   case 'r':
8706                     switch (name[5])
8707                     {
8708                       case 'i':
8709                         if (name[6] == 'o' &&
8710                             name[7] == 'r' &&
8711                             name[8] == 'i' &&
8712                             name[9] == 't' &&
8713                             name[10] == 'y')
8714                         {                         /* getpriority */
8715                           return -KEY_getpriority;
8716                         }
8717
8718                         goto unknown;
8719
8720                       case 'o':
8721                         if (name[6] == 't' &&
8722                             name[7] == 'o' &&
8723                             name[8] == 'e' &&
8724                             name[9] == 'n' &&
8725                             name[10] == 't')
8726                         {                         /* getprotoent */
8727                           return -KEY_getprotoent;
8728                         }
8729
8730                         goto unknown;
8731
8732                       default:
8733                         goto unknown;
8734                     }
8735
8736                   default:
8737                     goto unknown;
8738                 }
8739
8740               case 's':
8741                 if (name[4] == 'o' &&
8742                     name[5] == 'c' &&
8743                     name[6] == 'k' &&
8744                     name[7] == 'n' &&
8745                     name[8] == 'a' &&
8746                     name[9] == 'm' &&
8747                     name[10] == 'e')
8748                 {                                 /* getsockname */
8749                   return -KEY_getsockname;
8750                 }
8751
8752                 goto unknown;
8753
8754               default:
8755                 goto unknown;
8756             }
8757           }
8758
8759           goto unknown;
8760
8761         case 's':
8762           if (name[1] == 'e' &&
8763               name[2] == 't' &&
8764               name[3] == 'p' &&
8765               name[4] == 'r')
8766           {
8767             switch (name[5])
8768             {
8769               case 'i':
8770                 if (name[6] == 'o' &&
8771                     name[7] == 'r' &&
8772                     name[8] == 'i' &&
8773                     name[9] == 't' &&
8774                     name[10] == 'y')
8775                 {                                 /* setpriority */
8776                   return -KEY_setpriority;
8777                 }
8778
8779                 goto unknown;
8780
8781               case 'o':
8782                 if (name[6] == 't' &&
8783                     name[7] == 'o' &&
8784                     name[8] == 'e' &&
8785                     name[9] == 'n' &&
8786                     name[10] == 't')
8787                 {                                 /* setprotoent */
8788                   return -KEY_setprotoent;
8789                 }
8790
8791                 goto unknown;
8792
8793               default:
8794                 goto unknown;
8795             }
8796           }
8797
8798           goto unknown;
8799
8800         default:
8801           goto unknown;
8802       }
8803
8804     case 12: /* 2 tokens of length 12 */
8805       if (name[0] == 'g' &&
8806           name[1] == 'e' &&
8807           name[2] == 't' &&
8808           name[3] == 'n' &&
8809           name[4] == 'e' &&
8810           name[5] == 't' &&
8811           name[6] == 'b' &&
8812           name[7] == 'y')
8813       {
8814         switch (name[8])
8815         {
8816           case 'a':
8817             if (name[9] == 'd' &&
8818                 name[10] == 'd' &&
8819                 name[11] == 'r')
8820             {                                     /* getnetbyaddr */
8821               return -KEY_getnetbyaddr;
8822             }
8823
8824             goto unknown;
8825
8826           case 'n':
8827             if (name[9] == 'a' &&
8828                 name[10] == 'm' &&
8829                 name[11] == 'e')
8830             {                                     /* getnetbyname */
8831               return -KEY_getnetbyname;
8832             }
8833
8834             goto unknown;
8835
8836           default:
8837             goto unknown;
8838         }
8839       }
8840
8841       goto unknown;
8842
8843     case 13: /* 4 tokens of length 13 */
8844       if (name[0] == 'g' &&
8845           name[1] == 'e' &&
8846           name[2] == 't')
8847       {
8848         switch (name[3])
8849         {
8850           case 'h':
8851             if (name[4] == 'o' &&
8852                 name[5] == 's' &&
8853                 name[6] == 't' &&
8854                 name[7] == 'b' &&
8855                 name[8] == 'y')
8856             {
8857               switch (name[9])
8858               {
8859                 case 'a':
8860                   if (name[10] == 'd' &&
8861                       name[11] == 'd' &&
8862                       name[12] == 'r')
8863                   {                               /* gethostbyaddr */
8864                     return -KEY_gethostbyaddr;
8865                   }
8866
8867                   goto unknown;
8868
8869                 case 'n':
8870                   if (name[10] == 'a' &&
8871                       name[11] == 'm' &&
8872                       name[12] == 'e')
8873                   {                               /* gethostbyname */
8874                     return -KEY_gethostbyname;
8875                   }
8876
8877                   goto unknown;
8878
8879                 default:
8880                   goto unknown;
8881               }
8882             }
8883
8884             goto unknown;
8885
8886           case 's':
8887             if (name[4] == 'e' &&
8888                 name[5] == 'r' &&
8889                 name[6] == 'v' &&
8890                 name[7] == 'b' &&
8891                 name[8] == 'y')
8892             {
8893               switch (name[9])
8894               {
8895                 case 'n':
8896                   if (name[10] == 'a' &&
8897                       name[11] == 'm' &&
8898                       name[12] == 'e')
8899                   {                               /* getservbyname */
8900                     return -KEY_getservbyname;
8901                   }
8902
8903                   goto unknown;
8904
8905                 case 'p':
8906                   if (name[10] == 'o' &&
8907                       name[11] == 'r' &&
8908                       name[12] == 't')
8909                   {                               /* getservbyport */
8910                     return -KEY_getservbyport;
8911                   }
8912
8913                   goto unknown;
8914
8915                 default:
8916                   goto unknown;
8917               }
8918             }
8919
8920             goto unknown;
8921
8922           default:
8923             goto unknown;
8924         }
8925       }
8926
8927       goto unknown;
8928
8929     case 14: /* 1 tokens of length 14 */
8930       if (name[0] == 'g' &&
8931           name[1] == 'e' &&
8932           name[2] == 't' &&
8933           name[3] == 'p' &&
8934           name[4] == 'r' &&
8935           name[5] == 'o' &&
8936           name[6] == 't' &&
8937           name[7] == 'o' &&
8938           name[8] == 'b' &&
8939           name[9] == 'y' &&
8940           name[10] == 'n' &&
8941           name[11] == 'a' &&
8942           name[12] == 'm' &&
8943           name[13] == 'e')
8944       {                                           /* getprotobyname */
8945         return -KEY_getprotobyname;
8946       }
8947
8948       goto unknown;
8949
8950     case 16: /* 1 tokens of length 16 */
8951       if (name[0] == 'g' &&
8952           name[1] == 'e' &&
8953           name[2] == 't' &&
8954           name[3] == 'p' &&
8955           name[4] == 'r' &&
8956           name[5] == 'o' &&
8957           name[6] == 't' &&
8958           name[7] == 'o' &&
8959           name[8] == 'b' &&
8960           name[9] == 'y' &&
8961           name[10] == 'n' &&
8962           name[11] == 'u' &&
8963           name[12] == 'm' &&
8964           name[13] == 'b' &&
8965           name[14] == 'e' &&
8966           name[15] == 'r')
8967       {                                           /* getprotobynumber */
8968         return -KEY_getprotobynumber;
8969       }
8970
8971       goto unknown;
8972
8973     default:
8974       goto unknown;
8975   }
8976
8977 unknown:
8978   return 0;
8979 }
8980
8981 STATIC void
8982 S_checkcomma(pTHX_ register char *s, const char *name, const char *what)
8983 {
8984     const char *w;
8985
8986     if (*s == ' ' && s[1] == '(') {     /* XXX gotta be a better way */
8987         if (ckWARN(WARN_SYNTAX)) {
8988             int level = 1;
8989             for (w = s+2; *w && level; w++) {
8990                 if (*w == '(')
8991                     ++level;
8992                 else if (*w == ')')
8993                     --level;
8994             }
8995             if (*w)
8996                 for (; *w && isSPACE(*w); w++) ;
8997             if (!*w || !strchr(";|})]oaiuw!=", *w))     /* an advisory hack only... */
8998                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
8999                             "%s (...) interpreted as function",name);
9000         }
9001     }
9002     while (s < PL_bufend && isSPACE(*s))
9003         s++;
9004     if (*s == '(')
9005         s++;
9006     while (s < PL_bufend && isSPACE(*s))
9007         s++;
9008     if (isIDFIRST_lazy_if(s,UTF)) {
9009         w = s++;
9010         while (isALNUM_lazy_if(s,UTF))
9011             s++;
9012         while (s < PL_bufend && isSPACE(*s))
9013             s++;
9014         if (*s == ',') {
9015             int kw;
9016             *s = '\0'; /* XXX If we didn't do this, we could const a lot of toke.c */
9017             kw = keyword(w, s - w) || get_cv(w, FALSE) != 0;
9018             *s = ',';
9019             if (kw)
9020                 return;
9021             Perl_croak(aTHX_ "No comma allowed after %s", what);
9022         }
9023     }
9024 }
9025
9026 /* Either returns sv, or mortalizes sv and returns a new SV*.
9027    Best used as sv=new_constant(..., sv, ...).
9028    If s, pv are NULL, calls subroutine with one argument,
9029    and type is used with error messages only. */
9030
9031 STATIC SV *
9032 S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, SV *sv, SV *pv,
9033                const char *type)
9034 {
9035     dVAR; dSP;
9036     HV * const table = GvHV(PL_hintgv);          /* ^H */
9037     SV *res;
9038     SV **cvp;
9039     SV *cv, *typesv;
9040     const char *why1 = "", *why2 = "", *why3 = "";
9041
9042     if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
9043         SV *msg;
9044         
9045         why2 = strEQ(key,"charnames")
9046                ? "(possibly a missing \"use charnames ...\")"
9047                : "";
9048         msg = Perl_newSVpvf(aTHX_ "Constant(%s) unknown: %s",
9049                             (type ? type: "undef"), why2);
9050
9051         /* This is convoluted and evil ("goto considered harmful")
9052          * but I do not understand the intricacies of all the different
9053          * failure modes of %^H in here.  The goal here is to make
9054          * the most probable error message user-friendly. --jhi */
9055
9056         goto msgdone;
9057
9058     report:
9059         msg = Perl_newSVpvf(aTHX_ "Constant(%s): %s%s%s",
9060                             (type ? type: "undef"), why1, why2, why3);
9061     msgdone:
9062         yyerror(SvPVX_const(msg));
9063         SvREFCNT_dec(msg);
9064         return sv;
9065     }
9066     cvp = hv_fetch(table, key, strlen(key), FALSE);
9067     if (!cvp || !SvOK(*cvp)) {
9068         why1 = "$^H{";
9069         why2 = key;
9070         why3 = "} is not defined";
9071         goto report;
9072     }
9073     sv_2mortal(sv);                     /* Parent created it permanently */
9074     cv = *cvp;
9075     if (!pv && s)
9076         pv = sv_2mortal(newSVpvn(s, len));
9077     if (type && pv)
9078         typesv = sv_2mortal(newSVpv(type, 0));
9079     else
9080         typesv = &PL_sv_undef;
9081
9082     PUSHSTACKi(PERLSI_OVERLOAD);
9083     ENTER ;
9084     SAVETMPS;
9085
9086     PUSHMARK(SP) ;
9087     EXTEND(sp, 3);
9088     if (pv)
9089         PUSHs(pv);
9090     PUSHs(sv);
9091     if (pv)
9092         PUSHs(typesv);
9093     PUTBACK;
9094     call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
9095
9096     SPAGAIN ;
9097
9098     /* Check the eval first */
9099     if (!PL_in_eval && SvTRUE(ERRSV)) {
9100         sv_catpv(ERRSV, "Propagated");
9101         yyerror(SvPV_nolen_const(ERRSV)); /* Duplicates the message inside eval */
9102         (void)POPs;
9103         res = SvREFCNT_inc(sv);
9104     }
9105     else {
9106         res = POPs;
9107         (void)SvREFCNT_inc(res);
9108     }
9109
9110     PUTBACK ;
9111     FREETMPS ;
9112     LEAVE ;
9113     POPSTACK;
9114
9115     if (!SvOK(res)) {
9116         why1 = "Call to &{$^H{";
9117         why2 = key;
9118         why3 = "}} did not return a defined value";
9119         sv = res;
9120         goto report;
9121     }
9122
9123     return res;
9124 }
9125
9126 /* Returns a NUL terminated string, with the length of the string written to
9127    *slp
9128    */
9129 STATIC char *
9130 S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
9131 {
9132     register char *d = dest;
9133     register char * const e = d + destlen - 3;  /* two-character token, ending NUL */
9134     for (;;) {
9135         if (d >= e)
9136             Perl_croak(aTHX_ ident_too_long);
9137         if (isALNUM(*s))        /* UTF handled below */
9138             *d++ = *s++;
9139         else if (*s == '\'' && allow_package && isIDFIRST_lazy_if(s+1,UTF)) {
9140             *d++ = ':';
9141             *d++ = ':';
9142             s++;
9143         }
9144         else if (*s == ':' && s[1] == ':' && allow_package && s[2] != '$') {
9145             *d++ = *s++;
9146             *d++ = *s++;
9147         }
9148         else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
9149             char *t = s + UTF8SKIP(s);
9150             while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
9151                 t += UTF8SKIP(t);
9152             if (d + (t - s) > e)
9153                 Perl_croak(aTHX_ ident_too_long);
9154             Copy(s, d, t - s, char);
9155             d += t - s;
9156             s = t;
9157         }
9158         else {
9159             *d = '\0';
9160             *slp = d - dest;
9161             return s;
9162         }
9163     }
9164 }
9165
9166 STATIC char *
9167 S_scan_ident(pTHX_ register char *s, register const char *send, char *dest, STRLEN destlen, I32 ck_uni)
9168 {
9169     register char *d;
9170     register char *e;
9171     char *bracket = Nullch;
9172     char funny = *s++;
9173
9174     if (isSPACE(*s))
9175         s = skipspace(s);
9176     d = dest;
9177     e = d + destlen - 3;        /* two-character token, ending NUL */
9178     if (isDIGIT(*s)) {
9179         while (isDIGIT(*s)) {
9180             if (d >= e)
9181                 Perl_croak(aTHX_ ident_too_long);
9182             *d++ = *s++;
9183         }
9184     }
9185     else {
9186         for (;;) {
9187             if (d >= e)
9188                 Perl_croak(aTHX_ ident_too_long);
9189             if (isALNUM(*s))    /* UTF handled below */
9190                 *d++ = *s++;
9191             else if (*s == '\'' && isIDFIRST_lazy_if(s+1,UTF)) {
9192                 *d++ = ':';
9193                 *d++ = ':';
9194                 s++;
9195             }
9196             else if (*s == ':' && s[1] == ':') {
9197                 *d++ = *s++;
9198                 *d++ = *s++;
9199             }
9200             else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
9201                 char *t = s + UTF8SKIP(s);
9202                 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
9203                     t += UTF8SKIP(t);
9204                 if (d + (t - s) > e)
9205                     Perl_croak(aTHX_ ident_too_long);
9206                 Copy(s, d, t - s, char);
9207                 d += t - s;
9208                 s = t;
9209             }
9210             else
9211                 break;
9212         }
9213     }
9214     *d = '\0';
9215     d = dest;
9216     if (*d) {
9217         if (PL_lex_state != LEX_NORMAL)
9218             PL_lex_state = LEX_INTERPENDMAYBE;
9219         return s;
9220     }
9221     if (*s == '$' && s[1] &&
9222         (isALNUM_lazy_if(s+1,UTF) || s[1] == '$' || s[1] == '{' || strnEQ(s+1,"::",2)) )
9223     {
9224         return s;
9225     }
9226     if (*s == '{') {
9227         bracket = s;
9228         s++;
9229     }
9230     else if (ck_uni)
9231         check_uni();
9232     if (s < send)
9233         *d = *s++;
9234     d[1] = '\0';
9235     if (*d == '^' && *s && isCONTROLVAR(*s)) {
9236         *d = toCTRL(*s);
9237         s++;
9238     }
9239     if (bracket) {
9240         if (isSPACE(s[-1])) {
9241             while (s < send) {
9242                 const char ch = *s++;
9243                 if (!SPACE_OR_TAB(ch)) {
9244                     *d = ch;
9245                     break;
9246                 }
9247             }
9248         }
9249         if (isIDFIRST_lazy_if(d,UTF)) {
9250             d++;
9251             if (UTF) {
9252                 e = s;
9253                 while ((e < send && isALNUM_lazy_if(e,UTF)) || *e == ':') {
9254                     e += UTF8SKIP(e);
9255                     while (e < send && UTF8_IS_CONTINUED(*e) && is_utf8_mark((U8*)e))
9256                         e += UTF8SKIP(e);
9257                 }
9258                 Copy(s, d, e - s, char);
9259                 d += e - s;
9260                 s = e;
9261             }
9262             else {
9263                 while ((isALNUM(*s) || *s == ':') && d < e)
9264                     *d++ = *s++;
9265                 if (d >= e)
9266                     Perl_croak(aTHX_ ident_too_long);
9267             }
9268             *d = '\0';
9269             while (s < send && SPACE_OR_TAB(*s)) s++;
9270             if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
9271                 if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest)) {
9272                     const char *brack = *s == '[' ? "[...]" : "{...}";
9273                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
9274                         "Ambiguous use of %c{%s%s} resolved to %c%s%s",
9275                         funny, dest, brack, funny, dest, brack);
9276                 }
9277                 bracket++;
9278                 PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
9279                 return s;
9280             }
9281         }
9282         /* Handle extended ${^Foo} variables
9283          * 1999-02-27 mjd-perl-patch@plover.com */
9284         else if (!isALNUM(*d) && !isPRINT(*d) /* isCTRL(d) */
9285                  && isALNUM(*s))
9286         {
9287             d++;
9288             while (isALNUM(*s) && d < e) {
9289                 *d++ = *s++;
9290             }
9291             if (d >= e)
9292                 Perl_croak(aTHX_ ident_too_long);
9293             *d = '\0';
9294         }
9295         if (*s == '}') {
9296             s++;
9297             if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) {
9298                 PL_lex_state = LEX_INTERPEND;
9299                 PL_expect = XREF;
9300             }
9301             if (funny == '#')
9302                 funny = '@';
9303             if (PL_lex_state == LEX_NORMAL) {
9304                 if (ckWARN(WARN_AMBIGUOUS) &&
9305                     (keyword(dest, d - dest) || get_cv(dest, FALSE)))
9306                 {
9307                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
9308                         "Ambiguous use of %c{%s} resolved to %c%s",
9309                         funny, dest, funny, dest);
9310                 }
9311             }
9312         }
9313         else {
9314             s = bracket;                /* let the parser handle it */
9315             *dest = '\0';
9316         }
9317     }
9318     else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
9319         PL_lex_state = LEX_INTERPEND;
9320     return s;
9321 }
9322
9323 void
9324 Perl_pmflag(pTHX_ U32* pmfl, int ch)
9325 {
9326     if (ch == 'i')
9327         *pmfl |= PMf_FOLD;
9328     else if (ch == 'g')
9329         *pmfl |= PMf_GLOBAL;
9330     else if (ch == 'c')
9331         *pmfl |= PMf_CONTINUE;
9332     else if (ch == 'o')
9333         *pmfl |= PMf_KEEP;
9334     else if (ch == 'm')
9335         *pmfl |= PMf_MULTILINE;
9336     else if (ch == 's')
9337         *pmfl |= PMf_SINGLELINE;
9338     else if (ch == 'x')
9339         *pmfl |= PMf_EXTENDED;
9340 }
9341
9342 STATIC char *
9343 S_scan_pat(pTHX_ char *start, I32 type)
9344 {
9345     PMOP *pm;
9346     char *s = scan_str(start,FALSE,FALSE);
9347
9348     if (!s) {
9349         char * const delimiter = skipspace(start);
9350         Perl_croak(aTHX_ *delimiter == '?'
9351                    ? "Search pattern not terminated or ternary operator parsed as search pattern"
9352                    : "Search pattern not terminated" );
9353     }
9354
9355     pm = (PMOP*)newPMOP(type, 0);
9356     if (PL_multi_open == '?')
9357         pm->op_pmflags |= PMf_ONCE;
9358     if(type == OP_QR) {
9359         while (*s && strchr("iomsx", *s))
9360             pmflag(&pm->op_pmflags,*s++);
9361     }
9362     else {
9363         while (*s && strchr("iogcmsx", *s))
9364             pmflag(&pm->op_pmflags,*s++);
9365     }
9366     /* issue a warning if /c is specified,but /g is not */
9367     if ((pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL)
9368             && ckWARN(WARN_REGEXP))
9369     {
9370         Perl_warner(aTHX_ packWARN(WARN_REGEXP), c_without_g);
9371     }
9372
9373     pm->op_pmpermflags = pm->op_pmflags;
9374
9375     PL_lex_op = (OP*)pm;
9376     yylval.ival = OP_MATCH;
9377     return s;
9378 }
9379
9380 STATIC char *
9381 S_scan_subst(pTHX_ char *start)
9382 {
9383     dVAR;
9384     register char *s;
9385     register PMOP *pm;
9386     I32 first_start;
9387     I32 es = 0;
9388
9389     yylval.ival = OP_NULL;
9390
9391     s = scan_str(start,FALSE,FALSE);
9392
9393     if (!s)
9394         Perl_croak(aTHX_ "Substitution pattern not terminated");
9395
9396     if (s[-1] == PL_multi_open)
9397         s--;
9398
9399     first_start = PL_multi_start;
9400     s = scan_str(s,FALSE,FALSE);
9401     if (!s) {
9402         if (PL_lex_stuff) {
9403             SvREFCNT_dec(PL_lex_stuff);
9404             PL_lex_stuff = Nullsv;
9405         }
9406         Perl_croak(aTHX_ "Substitution replacement not terminated");
9407     }
9408     PL_multi_start = first_start;       /* so whole substitution is taken together */
9409
9410     pm = (PMOP*)newPMOP(OP_SUBST, 0);
9411     while (*s) {
9412         if (*s == 'e') {
9413             s++;
9414             es++;
9415         }
9416         else if (strchr("iogcmsx", *s))
9417             pmflag(&pm->op_pmflags,*s++);
9418         else
9419             break;
9420     }
9421
9422     /* /c is not meaningful with s/// */
9423     if ((pm->op_pmflags & PMf_CONTINUE) && ckWARN(WARN_REGEXP))
9424     {
9425         Perl_warner(aTHX_ packWARN(WARN_REGEXP), c_in_subst);
9426     }
9427
9428     if (es) {
9429         SV *repl;
9430         PL_sublex_info.super_bufptr = s;
9431         PL_sublex_info.super_bufend = PL_bufend;
9432         PL_multi_end = 0;
9433         pm->op_pmflags |= PMf_EVAL;
9434         repl = newSVpvn("",0);
9435         while (es-- > 0)
9436             sv_catpv(repl, es ? "eval " : "do ");
9437         sv_catpvn(repl, "{ ", 2);
9438         sv_catsv(repl, PL_lex_repl);
9439         sv_catpvn(repl, " };", 2);
9440         SvEVALED_on(repl);
9441         SvREFCNT_dec(PL_lex_repl);
9442         PL_lex_repl = repl;
9443     }
9444
9445     pm->op_pmpermflags = pm->op_pmflags;
9446     PL_lex_op = (OP*)pm;
9447     yylval.ival = OP_SUBST;
9448     return s;
9449 }
9450
9451 STATIC char *
9452 S_scan_trans(pTHX_ char *start)
9453 {
9454     register char* s;
9455     OP *o;
9456     short *tbl;
9457     I32 squash;
9458     I32 del;
9459     I32 complement;
9460
9461     yylval.ival = OP_NULL;
9462
9463     s = scan_str(start,FALSE,FALSE);
9464     if (!s)
9465         Perl_croak(aTHX_ "Transliteration pattern not terminated");
9466     if (s[-1] == PL_multi_open)
9467         s--;
9468
9469     s = scan_str(s,FALSE,FALSE);
9470     if (!s) {
9471         if (PL_lex_stuff) {
9472             SvREFCNT_dec(PL_lex_stuff);
9473             PL_lex_stuff = Nullsv;
9474         }
9475         Perl_croak(aTHX_ "Transliteration replacement not terminated");
9476     }
9477
9478     complement = del = squash = 0;
9479     while (1) {
9480         switch (*s) {
9481         case 'c':
9482             complement = OPpTRANS_COMPLEMENT;
9483             break;
9484         case 'd':
9485             del = OPpTRANS_DELETE;
9486             break;
9487         case 's':
9488             squash = OPpTRANS_SQUASH;
9489             break;
9490         default:
9491             goto no_more;
9492         }
9493         s++;
9494     }
9495   no_more:
9496
9497     Newx(tbl, complement&&!del?258:256, short);
9498     o = newPVOP(OP_TRANS, 0, (char*)tbl);
9499     o->op_private &= ~OPpTRANS_ALL;
9500     o->op_private |= del|squash|complement|
9501       (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
9502       (DO_UTF8(PL_lex_repl) ? OPpTRANS_TO_UTF   : 0);
9503
9504     PL_lex_op = o;
9505     yylval.ival = OP_TRANS;
9506     return s;
9507 }
9508
9509 STATIC char *
9510 S_scan_heredoc(pTHX_ register char *s)
9511 {
9512     SV *herewas;
9513     I32 op_type = OP_SCALAR;
9514     I32 len;
9515     SV *tmpstr;
9516     char term;
9517     const char newline[] = "\n";
9518     const char *found_newline;
9519     register char *d;
9520     register char *e;
9521     char *peek;
9522     const int outer = (PL_rsfp && !(PL_lex_inwhat == OP_SCALAR));
9523
9524     s += 2;
9525     d = PL_tokenbuf;
9526     e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
9527     if (!outer)
9528         *d++ = '\n';
9529     for (peek = s; SPACE_OR_TAB(*peek); peek++) ;
9530     if (*peek == '`' || *peek == '\'' || *peek =='"') {
9531         s = peek;
9532         term = *s++;
9533         s = delimcpy(d, e, s, PL_bufend, term, &len);
9534         d += len;
9535         if (s < PL_bufend)
9536             s++;
9537     }
9538     else {
9539         if (*s == '\\')
9540             s++, term = '\'';
9541         else
9542             term = '"';
9543         if (!isALNUM_lazy_if(s,UTF))
9544             deprecate_old("bare << to mean <<\"\"");
9545         for (; isALNUM_lazy_if(s,UTF); s++) {
9546             if (d < e)
9547                 *d++ = *s;
9548         }
9549     }
9550     if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
9551         Perl_croak(aTHX_ "Delimiter for here document is too long");
9552     *d++ = '\n';
9553     *d = '\0';
9554     len = d - PL_tokenbuf;
9555 #ifndef PERL_STRICT_CR
9556     d = strchr(s, '\r');
9557     if (d) {
9558         char * const olds = s;
9559         s = d;
9560         while (s < PL_bufend) {
9561             if (*s == '\r') {
9562                 *d++ = '\n';
9563                 if (*++s == '\n')
9564                     s++;
9565             }
9566             else if (*s == '\n' && s[1] == '\r') {      /* \015\013 on a mac? */
9567                 *d++ = *s++;
9568                 s++;
9569             }
9570             else
9571                 *d++ = *s++;
9572         }
9573         *d = '\0';
9574         PL_bufend = d;
9575         SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
9576         s = olds;
9577     }
9578 #endif
9579     if ( outer || !(found_newline = ninstr(s,PL_bufend,newline,newline+1)) ) {
9580         herewas = newSVpvn(s,PL_bufend-s);
9581     }
9582     else {
9583         s--;
9584         herewas = newSVpvn(s,found_newline-s);
9585     }
9586     s += SvCUR(herewas);
9587
9588     tmpstr = NEWSV(87,79);
9589     sv_upgrade(tmpstr, SVt_PVIV);
9590     if (term == '\'') {
9591         op_type = OP_CONST;
9592         SvIV_set(tmpstr, -1);
9593     }
9594     else if (term == '`') {
9595         op_type = OP_BACKTICK;
9596         SvIV_set(tmpstr, '\\');
9597     }
9598
9599     CLINE;
9600     PL_multi_start = CopLINE(PL_curcop);
9601     PL_multi_open = PL_multi_close = '<';
9602     term = *PL_tokenbuf;
9603     if (PL_lex_inwhat == OP_SUBST && PL_in_eval && !PL_rsfp) {
9604         char *bufptr = PL_sublex_info.super_bufptr;
9605         char *bufend = PL_sublex_info.super_bufend;
9606         char * const olds = s - SvCUR(herewas);
9607         s = strchr(bufptr, '\n');
9608         if (!s)
9609             s = bufend;
9610         d = s;
9611         while (s < bufend &&
9612           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
9613             if (*s++ == '\n')
9614                 CopLINE_inc(PL_curcop);
9615         }
9616         if (s >= bufend) {
9617             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
9618             missingterm(PL_tokenbuf);
9619         }
9620         sv_setpvn(herewas,bufptr,d-bufptr+1);
9621         sv_setpvn(tmpstr,d+1,s-d);
9622         s += len - 1;
9623         sv_catpvn(herewas,s,bufend-s);
9624         Copy(SvPVX_const(herewas),bufptr,SvCUR(herewas) + 1,char);
9625
9626         s = olds;
9627         goto retval;
9628     }
9629     else if (!outer) {
9630         d = s;
9631         while (s < PL_bufend &&
9632           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
9633             if (*s++ == '\n')
9634                 CopLINE_inc(PL_curcop);
9635         }
9636         if (s >= PL_bufend) {
9637             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
9638             missingterm(PL_tokenbuf);
9639         }
9640         sv_setpvn(tmpstr,d+1,s-d);
9641         s += len - 1;
9642         CopLINE_inc(PL_curcop); /* the preceding stmt passes a newline */
9643
9644         sv_catpvn(herewas,s,PL_bufend-s);
9645         sv_setsv(PL_linestr,herewas);
9646         PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
9647         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
9648         PL_last_lop = PL_last_uni = Nullch;
9649     }
9650     else
9651         sv_setpvn(tmpstr,"",0);   /* avoid "uninitialized" warning */
9652     while (s >= PL_bufend) {    /* multiple line string? */
9653         if (!outer ||
9654          !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
9655             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
9656             missingterm(PL_tokenbuf);
9657         }
9658         CopLINE_inc(PL_curcop);
9659         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
9660         PL_last_lop = PL_last_uni = Nullch;
9661 #ifndef PERL_STRICT_CR
9662         if (PL_bufend - PL_linestart >= 2) {
9663             if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
9664                 (PL_bufend[-2] == '\n' && PL_bufend[-1] == '\r'))
9665             {
9666                 PL_bufend[-2] = '\n';
9667                 PL_bufend--;
9668                 SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
9669             }
9670             else if (PL_bufend[-1] == '\r')
9671                 PL_bufend[-1] = '\n';
9672         }
9673         else if (PL_bufend - PL_linestart == 1 && PL_bufend[-1] == '\r')
9674             PL_bufend[-1] = '\n';
9675 #endif
9676         if (PERLDB_LINE && PL_curstash != PL_debstash) {
9677             SV *sv = NEWSV(88,0);
9678
9679             sv_upgrade(sv, SVt_PVMG);
9680             sv_setsv(sv,PL_linestr);
9681             (void)SvIOK_on(sv);
9682             SvIV_set(sv, 0);
9683             av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop),sv);
9684         }
9685         if (*s == term && memEQ(s,PL_tokenbuf,len)) {
9686             STRLEN off = PL_bufend - 1 - SvPVX_const(PL_linestr);
9687             *(SvPVX(PL_linestr) + off ) = ' ';
9688             sv_catsv(PL_linestr,herewas);
9689             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
9690             s = SvPVX(PL_linestr) + off; /* In case PV of PL_linestr moved. */
9691         }
9692         else {
9693             s = PL_bufend;
9694             sv_catsv(tmpstr,PL_linestr);
9695         }
9696     }
9697     s++;
9698 retval:
9699     PL_multi_end = CopLINE(PL_curcop);
9700     if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
9701         SvPV_shrink_to_cur(tmpstr);
9702     }
9703     SvREFCNT_dec(herewas);
9704     if (!IN_BYTES) {
9705         if (UTF && is_utf8_string((U8*)SvPVX_const(tmpstr), SvCUR(tmpstr)))
9706             SvUTF8_on(tmpstr);
9707         else if (PL_encoding)
9708             sv_recode_to_utf8(tmpstr, PL_encoding);
9709     }
9710     PL_lex_stuff = tmpstr;
9711     yylval.ival = op_type;
9712     return s;
9713 }
9714
9715 /* scan_inputsymbol
9716    takes: current position in input buffer
9717    returns: new position in input buffer
9718    side-effects: yylval and lex_op are set.
9719
9720    This code handles:
9721
9722    <>           read from ARGV
9723    <FH>         read from filehandle
9724    <pkg::FH>    read from package qualified filehandle
9725    <pkg'FH>     read from package qualified filehandle
9726    <$fh>        read from filehandle in $fh
9727    <*.h>        filename glob
9728
9729 */
9730
9731 STATIC char *
9732 S_scan_inputsymbol(pTHX_ char *start)
9733 {
9734     register char *s = start;           /* current position in buffer */
9735     register char *d;
9736     const char *e;
9737     char *end;
9738     I32 len;
9739
9740     d = PL_tokenbuf;                    /* start of temp holding space */
9741     e = PL_tokenbuf + sizeof PL_tokenbuf;       /* end of temp holding space */
9742     end = strchr(s, '\n');
9743     if (!end)
9744         end = PL_bufend;
9745     s = delimcpy(d, e, s + 1, end, '>', &len);  /* extract until > */
9746
9747     /* die if we didn't have space for the contents of the <>,
9748        or if it didn't end, or if we see a newline
9749     */
9750
9751     if (len >= sizeof PL_tokenbuf)
9752         Perl_croak(aTHX_ "Excessively long <> operator");
9753     if (s >= end)
9754         Perl_croak(aTHX_ "Unterminated <> operator");
9755
9756     s++;
9757
9758     /* check for <$fh>
9759        Remember, only scalar variables are interpreted as filehandles by
9760        this code.  Anything more complex (e.g., <$fh{$num}>) will be
9761        treated as a glob() call.
9762        This code makes use of the fact that except for the $ at the front,
9763        a scalar variable and a filehandle look the same.
9764     */
9765     if (*d == '$' && d[1]) d++;
9766
9767     /* allow <Pkg'VALUE> or <Pkg::VALUE> */
9768     while (*d && (isALNUM_lazy_if(d,UTF) || *d == '\'' || *d == ':'))
9769         d++;
9770
9771     /* If we've tried to read what we allow filehandles to look like, and
9772        there's still text left, then it must be a glob() and not a getline.
9773        Use scan_str to pull out the stuff between the <> and treat it
9774        as nothing more than a string.
9775     */
9776
9777     if (d - PL_tokenbuf != len) {
9778         yylval.ival = OP_GLOB;
9779         set_csh();
9780         s = scan_str(start,FALSE,FALSE);
9781         if (!s)
9782            Perl_croak(aTHX_ "Glob not terminated");
9783         return s;
9784     }
9785     else {
9786         bool readline_overriden = FALSE;
9787         GV *gv_readline = Nullgv;
9788         GV **gvp;
9789         /* we're in a filehandle read situation */
9790         d = PL_tokenbuf;
9791
9792         /* turn <> into <ARGV> */
9793         if (!len)
9794             Copy("ARGV",d,5,char);
9795
9796         /* Check whether readline() is overriden */
9797         if (((gv_readline = gv_fetchpv("readline", FALSE, SVt_PVCV))
9798                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline))
9799                 ||
9800                 ((gvp = (GV**)hv_fetch(PL_globalstash, "readline", 8, FALSE))
9801                 && (gv_readline = *gvp) != (GV*)&PL_sv_undef
9802                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline)))
9803             readline_overriden = TRUE;
9804
9805         /* if <$fh>, create the ops to turn the variable into a
9806            filehandle
9807         */
9808         if (*d == '$') {
9809             I32 tmp;
9810
9811             /* try to find it in the pad for this block, otherwise find
9812                add symbol table ops
9813             */
9814             if ((tmp = pad_findmy(d)) != NOT_IN_PAD) {
9815                 if (PAD_COMPNAME_FLAGS(tmp) & SVpad_OUR) {
9816                     HV *stash = PAD_COMPNAME_OURSTASH(tmp);
9817                     HEK *stashname = HvNAME_HEK(stash);
9818                     SV *sym = sv_2mortal(newSVhek(stashname));
9819                     sv_catpvn(sym, "::", 2);
9820                     sv_catpv(sym, d+1);
9821                     d = SvPVX(sym);
9822                     goto intro_sym;
9823                 }
9824                 else {
9825                     OP *o = newOP(OP_PADSV, 0);
9826                     o->op_targ = tmp;
9827                     PL_lex_op = readline_overriden
9828                         ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
9829                                 append_elem(OP_LIST, o,
9830                                     newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
9831                         : (OP*)newUNOP(OP_READLINE, 0, o);
9832                 }
9833             }
9834             else {
9835                 GV *gv;
9836                 ++d;
9837 intro_sym:
9838                 gv = gv_fetchpv(d,
9839                                 (PL_in_eval
9840                                  ? (GV_ADDMULTI | GV_ADDINEVAL)
9841                                  : GV_ADDMULTI),
9842                                 SVt_PV);
9843                 PL_lex_op = readline_overriden
9844                     ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
9845                             append_elem(OP_LIST,
9846                                 newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
9847                                 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
9848                     : (OP*)newUNOP(OP_READLINE, 0,
9849                             newUNOP(OP_RV2SV, 0,
9850                                 newGVOP(OP_GV, 0, gv)));
9851             }
9852             if (!readline_overriden)
9853                 PL_lex_op->op_flags |= OPf_SPECIAL;
9854             /* we created the ops in PL_lex_op, so make yylval.ival a null op */
9855             yylval.ival = OP_NULL;
9856         }
9857
9858         /* If it's none of the above, it must be a literal filehandle
9859            (<Foo::BAR> or <FOO>) so build a simple readline OP */
9860         else {
9861             GV *gv = gv_fetchpv(d,TRUE, SVt_PVIO);
9862             PL_lex_op = readline_overriden
9863                 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
9864                         append_elem(OP_LIST,
9865                             newGVOP(OP_GV, 0, gv),
9866                             newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
9867                 : (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
9868             yylval.ival = OP_NULL;
9869         }
9870     }
9871
9872     return s;
9873 }
9874
9875
9876 /* scan_str
9877    takes: start position in buffer
9878           keep_quoted preserve \ on the embedded delimiter(s)
9879           keep_delims preserve the delimiters around the string
9880    returns: position to continue reading from buffer
9881    side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
9882         updates the read buffer.
9883
9884    This subroutine pulls a string out of the input.  It is called for:
9885         q               single quotes           q(literal text)
9886         '               single quotes           'literal text'
9887         qq              double quotes           qq(interpolate $here please)
9888         "               double quotes           "interpolate $here please"
9889         qx              backticks               qx(/bin/ls -l)
9890         `               backticks               `/bin/ls -l`
9891         qw              quote words             @EXPORT_OK = qw( func() $spam )
9892         m//             regexp match            m/this/
9893         s///            regexp substitute       s/this/that/
9894         tr///           string transliterate    tr/this/that/
9895         y///            string transliterate    y/this/that/
9896         ($*@)           sub prototypes          sub foo ($)
9897         (stuff)         sub attr parameters     sub foo : attr(stuff)
9898         <>              readline or globs       <FOO>, <>, <$fh>, or <*.c>
9899         
9900    In most of these cases (all but <>, patterns and transliterate)
9901    yylex() calls scan_str().  m// makes yylex() call scan_pat() which
9902    calls scan_str().  s/// makes yylex() call scan_subst() which calls
9903    scan_str().  tr/// and y/// make yylex() call scan_trans() which
9904    calls scan_str().
9905
9906    It skips whitespace before the string starts, and treats the first
9907    character as the delimiter.  If the delimiter is one of ([{< then
9908    the corresponding "close" character )]}> is used as the closing
9909    delimiter.  It allows quoting of delimiters, and if the string has
9910    balanced delimiters ([{<>}]) it allows nesting.
9911
9912    On success, the SV with the resulting string is put into lex_stuff or,
9913    if that is already non-NULL, into lex_repl. The second case occurs only
9914    when parsing the RHS of the special constructs s/// and tr/// (y///).
9915    For convenience, the terminating delimiter character is stuffed into
9916    SvIVX of the SV.
9917 */
9918
9919 STATIC char *
9920 S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
9921 {
9922     SV *sv;                             /* scalar value: string */
9923     char *tmps;                         /* temp string, used for delimiter matching */
9924     register char *s = start;           /* current position in the buffer */
9925     register char term;                 /* terminating character */
9926     register char *to;                  /* current position in the sv's data */
9927     I32 brackets = 1;                   /* bracket nesting level */
9928     bool has_utf8 = FALSE;              /* is there any utf8 content? */
9929     I32 termcode;                       /* terminating char. code */
9930     U8 termstr[UTF8_MAXBYTES];          /* terminating string */
9931     STRLEN termlen;                     /* length of terminating string */
9932     char *last = NULL;                  /* last position for nesting bracket */
9933
9934     /* skip space before the delimiter */
9935     if (isSPACE(*s))
9936         s = skipspace(s);
9937
9938     /* mark where we are, in case we need to report errors */
9939     CLINE;
9940
9941     /* after skipping whitespace, the next character is the terminator */
9942     term = *s;
9943     if (!UTF) {
9944         termcode = termstr[0] = term;
9945         termlen = 1;
9946     }
9947     else {
9948         termcode = utf8_to_uvchr((U8*)s, &termlen);
9949         Copy(s, termstr, termlen, U8);
9950         if (!UTF8_IS_INVARIANT(term))
9951             has_utf8 = TRUE;
9952     }
9953
9954     /* mark where we are */
9955     PL_multi_start = CopLINE(PL_curcop);
9956     PL_multi_open = term;
9957
9958     /* find corresponding closing delimiter */
9959     if (term && (tmps = strchr("([{< )]}> )]}>",term)))
9960         termcode = termstr[0] = term = tmps[5];
9961
9962     PL_multi_close = term;
9963
9964     /* create a new SV to hold the contents.  87 is leak category, I'm
9965        assuming.  79 is the SV's initial length.  What a random number. */
9966     sv = NEWSV(87,79);
9967     sv_upgrade(sv, SVt_PVIV);
9968     SvIV_set(sv, termcode);
9969     (void)SvPOK_only(sv);               /* validate pointer */
9970
9971     /* move past delimiter and try to read a complete string */
9972     if (keep_delims)
9973         sv_catpvn(sv, s, termlen);
9974     s += termlen;
9975     for (;;) {
9976         if (PL_encoding && !UTF) {
9977             bool cont = TRUE;
9978
9979             while (cont) {
9980                 int offset = s - SvPVX_const(PL_linestr);
9981                 const bool found = sv_cat_decode(sv, PL_encoding, PL_linestr,
9982                                            &offset, (char*)termstr, termlen);
9983                 const char *ns = SvPVX_const(PL_linestr) + offset;
9984                 char *svlast = SvEND(sv) - 1;
9985
9986                 for (; s < ns; s++) {
9987                     if (*s == '\n' && !PL_rsfp)
9988                         CopLINE_inc(PL_curcop);
9989                 }
9990                 if (!found)
9991                     goto read_more_line;
9992                 else {
9993                     /* handle quoted delimiters */
9994                     if (SvCUR(sv) > 1 && *(svlast-1) == '\\') {
9995                         const char *t;
9996                         for (t = svlast-2; t >= SvPVX_const(sv) && *t == '\\';)
9997                             t--;
9998                         if ((svlast-1 - t) % 2) {
9999                             if (!keep_quoted) {
10000                                 *(svlast-1) = term;
10001                                 *svlast = '\0';
10002                                 SvCUR_set(sv, SvCUR(sv) - 1);
10003                             }
10004                             continue;
10005                         }
10006                     }
10007                     if (PL_multi_open == PL_multi_close) {
10008                         cont = FALSE;
10009                     }
10010                     else {
10011                         const char *t;
10012                         char *w;
10013                         if (!last)
10014                             last = SvPVX(sv);
10015                         for (t = w = last; t < svlast; w++, t++) {
10016                             /* At here, all closes are "was quoted" one,
10017                                so we don't check PL_multi_close. */
10018                             if (*t == '\\') {
10019                                 if (!keep_quoted && *(t+1) == PL_multi_open)
10020                                     t++;
10021                                 else
10022                                     *w++ = *t++;
10023                             }
10024                             else if (*t == PL_multi_open)
10025                                 brackets++;
10026
10027                             *w = *t;
10028                         }
10029                         if (w < t) {
10030                             *w++ = term;
10031                             *w = '\0';
10032                             SvCUR_set(sv, w - SvPVX_const(sv));
10033                         }
10034                         last = w;
10035                         if (--brackets <= 0)
10036                             cont = FALSE;
10037                     }
10038                 }
10039             }
10040             if (!keep_delims) {
10041                 SvCUR_set(sv, SvCUR(sv) - 1);
10042                 *SvEND(sv) = '\0';
10043             }
10044             break;
10045         }
10046
10047         /* extend sv if need be */
10048         SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
10049         /* set 'to' to the next character in the sv's string */
10050         to = SvPVX(sv)+SvCUR(sv);
10051
10052         /* if open delimiter is the close delimiter read unbridle */
10053         if (PL_multi_open == PL_multi_close) {
10054             for (; s < PL_bufend; s++,to++) {
10055                 /* embedded newlines increment the current line number */
10056                 if (*s == '\n' && !PL_rsfp)
10057                     CopLINE_inc(PL_curcop);
10058                 /* handle quoted delimiters */
10059                 if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
10060                     if (!keep_quoted && s[1] == term)
10061                         s++;
10062                 /* any other quotes are simply copied straight through */
10063                     else
10064                         *to++ = *s++;
10065                 }
10066                 /* terminate when run out of buffer (the for() condition), or
10067                    have found the terminator */
10068                 else if (*s == term) {
10069                     if (termlen == 1)
10070                         break;
10071                     if (s+termlen <= PL_bufend && memEQ(s, (char*)termstr, termlen))
10072                         break;
10073                 }
10074                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
10075                     has_utf8 = TRUE;
10076                 *to = *s;
10077             }
10078         }
10079         
10080         /* if the terminator isn't the same as the start character (e.g.,
10081            matched brackets), we have to allow more in the quoting, and
10082            be prepared for nested brackets.
10083         */
10084         else {
10085             /* read until we run out of string, or we find the terminator */
10086             for (; s < PL_bufend; s++,to++) {
10087                 /* embedded newlines increment the line count */
10088                 if (*s == '\n' && !PL_rsfp)
10089                     CopLINE_inc(PL_curcop);
10090                 /* backslashes can escape the open or closing characters */
10091                 if (*s == '\\' && s+1 < PL_bufend) {
10092                     if (!keep_quoted &&
10093                         ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
10094                         s++;
10095                     else
10096                         *to++ = *s++;
10097                 }
10098                 /* allow nested opens and closes */
10099                 else if (*s == PL_multi_close && --brackets <= 0)
10100                     break;
10101                 else if (*s == PL_multi_open)
10102                     brackets++;
10103                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
10104                     has_utf8 = TRUE;
10105                 *to = *s;
10106             }
10107         }
10108         /* terminate the copied string and update the sv's end-of-string */
10109         *to = '\0';
10110         SvCUR_set(sv, to - SvPVX_const(sv));
10111
10112         /*
10113          * this next chunk reads more into the buffer if we're not done yet
10114          */
10115
10116         if (s < PL_bufend)
10117             break;              /* handle case where we are done yet :-) */
10118
10119 #ifndef PERL_STRICT_CR
10120         if (to - SvPVX_const(sv) >= 2) {
10121             if ((to[-2] == '\r' && to[-1] == '\n') ||
10122                 (to[-2] == '\n' && to[-1] == '\r'))
10123             {
10124                 to[-2] = '\n';
10125                 to--;
10126                 SvCUR_set(sv, to - SvPVX_const(sv));
10127             }
10128             else if (to[-1] == '\r')
10129                 to[-1] = '\n';
10130         }
10131         else if (to - SvPVX_const(sv) == 1 && to[-1] == '\r')
10132             to[-1] = '\n';
10133 #endif
10134         
10135      read_more_line:
10136         /* if we're out of file, or a read fails, bail and reset the current
10137            line marker so we can report where the unterminated string began
10138         */
10139         if (!PL_rsfp ||
10140          !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
10141             sv_free(sv);
10142             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
10143             return Nullch;
10144         }
10145         /* we read a line, so increment our line counter */
10146         CopLINE_inc(PL_curcop);
10147
10148         /* update debugger info */
10149         if (PERLDB_LINE && PL_curstash != PL_debstash) {
10150             SV *sv = NEWSV(88,0);
10151
10152             sv_upgrade(sv, SVt_PVMG);
10153             sv_setsv(sv,PL_linestr);
10154             (void)SvIOK_on(sv);
10155             SvIV_set(sv, 0);
10156             av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop), sv);
10157         }
10158
10159         /* having changed the buffer, we must update PL_bufend */
10160         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
10161         PL_last_lop = PL_last_uni = Nullch;
10162     }
10163
10164     /* at this point, we have successfully read the delimited string */
10165
10166     if (!PL_encoding || UTF) {
10167         if (keep_delims)
10168             sv_catpvn(sv, s, termlen);
10169         s += termlen;
10170     }
10171     if (has_utf8 || PL_encoding)
10172         SvUTF8_on(sv);
10173
10174     PL_multi_end = CopLINE(PL_curcop);
10175
10176     /* if we allocated too much space, give some back */
10177     if (SvCUR(sv) + 5 < SvLEN(sv)) {
10178         SvLEN_set(sv, SvCUR(sv) + 1);
10179         SvPV_renew(sv, SvLEN(sv));
10180     }
10181
10182     /* decide whether this is the first or second quoted string we've read
10183        for this op
10184     */
10185
10186     if (PL_lex_stuff)
10187         PL_lex_repl = sv;
10188     else
10189         PL_lex_stuff = sv;
10190     return s;
10191 }
10192
10193 /*
10194   scan_num
10195   takes: pointer to position in buffer
10196   returns: pointer to new position in buffer
10197   side-effects: builds ops for the constant in yylval.op
10198
10199   Read a number in any of the formats that Perl accepts:
10200
10201   \d(_?\d)*(\.(\d(_?\d)*)?)?[Ee][\+\-]?(\d(_?\d)*)      12 12.34 12.
10202   \.\d(_?\d)*[Ee][\+\-]?(\d(_?\d)*)                     .34
10203   0b[01](_?[01])*
10204   0[0-7](_?[0-7])*
10205   0x[0-9A-Fa-f](_?[0-9A-Fa-f])*
10206
10207   Like most scan_ routines, it uses the PL_tokenbuf buffer to hold the
10208   thing it reads.
10209
10210   If it reads a number without a decimal point or an exponent, it will
10211   try converting the number to an integer and see if it can do so
10212   without loss of precision.
10213 */
10214
10215 char *
10216 Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
10217 {
10218     register const char *s = start;     /* current position in buffer */
10219     register char *d;                   /* destination in temp buffer */
10220     register char *e;                   /* end of temp buffer */
10221     NV nv;                              /* number read, as a double */
10222     SV *sv = Nullsv;                    /* place to put the converted number */
10223     bool floatit;                       /* boolean: int or float? */
10224     const char *lastub = 0;             /* position of last underbar */
10225     static char const number_too_long[] = "Number too long";
10226
10227     /* We use the first character to decide what type of number this is */
10228
10229     switch (*s) {
10230     default:
10231       Perl_croak(aTHX_ "panic: scan_num");
10232
10233     /* if it starts with a 0, it could be an octal number, a decimal in
10234        0.13 disguise, or a hexadecimal number, or a binary number. */
10235     case '0':
10236         {
10237           /* variables:
10238              u          holds the "number so far"
10239              shift      the power of 2 of the base
10240                         (hex == 4, octal == 3, binary == 1)
10241              overflowed was the number more than we can hold?
10242
10243              Shift is used when we add a digit.  It also serves as an "are
10244              we in octal/hex/binary?" indicator to disallow hex characters
10245              when in octal mode.
10246            */
10247             NV n = 0.0;
10248             UV u = 0;
10249             I32 shift;
10250             bool overflowed = FALSE;
10251             bool just_zero  = TRUE;     /* just plain 0 or binary number? */
10252             static const NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
10253             static const char* const bases[5] =
10254               { "", "binary", "", "octal", "hexadecimal" };
10255             static const char* const Bases[5] =
10256               { "", "Binary", "", "Octal", "Hexadecimal" };
10257             static const char* const maxima[5] =
10258               { "",
10259                 "0b11111111111111111111111111111111",
10260                 "",
10261                 "037777777777",
10262                 "0xffffffff" };
10263             const char *base, *Base, *max;
10264
10265             /* check for hex */
10266             if (s[1] == 'x') {
10267                 shift = 4;
10268                 s += 2;
10269                 just_zero = FALSE;
10270             } else if (s[1] == 'b') {
10271                 shift = 1;
10272                 s += 2;
10273                 just_zero = FALSE;
10274             }
10275             /* check for a decimal in disguise */
10276             else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
10277                 goto decimal;
10278             /* so it must be octal */
10279             else {
10280                 shift = 3;
10281                 s++;
10282             }
10283
10284             if (*s == '_') {
10285                if (ckWARN(WARN_SYNTAX))
10286                    Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
10287                                "Misplaced _ in number");
10288                lastub = s++;
10289             }
10290
10291             base = bases[shift];
10292             Base = Bases[shift];
10293             max  = maxima[shift];
10294
10295             /* read the rest of the number */
10296             for (;;) {
10297                 /* x is used in the overflow test,
10298                    b is the digit we're adding on. */
10299                 UV x, b;
10300
10301                 switch (*s) {
10302
10303                 /* if we don't mention it, we're done */
10304                 default:
10305                     goto out;
10306
10307                 /* _ are ignored -- but warned about if consecutive */
10308                 case '_':
10309                     if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
10310                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
10311                                     "Misplaced _ in number");
10312                     lastub = s++;
10313                     break;
10314
10315                 /* 8 and 9 are not octal */
10316                 case '8': case '9':
10317                     if (shift == 3)
10318                         yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
10319                     /* FALL THROUGH */
10320
10321                 /* octal digits */
10322                 case '2': case '3': case '4':
10323                 case '5': case '6': case '7':
10324                     if (shift == 1)
10325                         yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
10326                     /* FALL THROUGH */
10327
10328                 case '0': case '1':
10329                     b = *s++ & 15;              /* ASCII digit -> value of digit */
10330                     goto digit;
10331
10332                 /* hex digits */
10333                 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
10334                 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
10335                     /* make sure they said 0x */
10336                     if (shift != 4)
10337                         goto out;
10338                     b = (*s++ & 7) + 9;
10339
10340                     /* Prepare to put the digit we have onto the end
10341                        of the number so far.  We check for overflows.
10342                     */
10343
10344                   digit:
10345                     just_zero = FALSE;
10346                     if (!overflowed) {
10347                         x = u << shift; /* make room for the digit */
10348
10349                         if ((x >> shift) != u
10350                             && !(PL_hints & HINT_NEW_BINARY)) {
10351                             overflowed = TRUE;
10352                             n = (NV) u;
10353                             if (ckWARN_d(WARN_OVERFLOW))
10354                                 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
10355                                             "Integer overflow in %s number",
10356                                             base);
10357                         } else
10358                             u = x | b;          /* add the digit to the end */
10359                     }
10360                     if (overflowed) {
10361                         n *= nvshift[shift];
10362                         /* If an NV has not enough bits in its
10363                          * mantissa to represent an UV this summing of
10364                          * small low-order numbers is a waste of time
10365                          * (because the NV cannot preserve the
10366                          * low-order bits anyway): we could just
10367                          * remember when did we overflow and in the
10368                          * end just multiply n by the right
10369                          * amount. */
10370                         n += (NV) b;
10371                     }
10372                     break;
10373                 }
10374             }
10375
10376           /* if we get here, we had success: make a scalar value from
10377              the number.
10378           */
10379           out:
10380
10381             /* final misplaced underbar check */
10382             if (s[-1] == '_') {
10383                 if (ckWARN(WARN_SYNTAX))
10384                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
10385             }
10386
10387             sv = NEWSV(92,0);
10388             if (overflowed) {
10389                 if (n > 4294967295.0 && ckWARN(WARN_PORTABLE))
10390                     Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
10391                                 "%s number > %s non-portable",
10392                                 Base, max);
10393                 sv_setnv(sv, n);
10394             }
10395             else {
10396 #if UVSIZE > 4
10397                 if (u > 0xffffffff && ckWARN(WARN_PORTABLE))
10398                     Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
10399                                 "%s number > %s non-portable",
10400                                 Base, max);
10401 #endif
10402                 sv_setuv(sv, u);
10403             }
10404             if (just_zero && (PL_hints & HINT_NEW_INTEGER))
10405                 sv = new_constant(start, s - start, "integer",
10406                                   sv, Nullsv, NULL);
10407             else if (PL_hints & HINT_NEW_BINARY)
10408                 sv = new_constant(start, s - start, "binary", sv, Nullsv, NULL);
10409         }
10410         break;
10411
10412     /*
10413       handle decimal numbers.
10414       we're also sent here when we read a 0 as the first digit
10415     */
10416     case '1': case '2': case '3': case '4': case '5':
10417     case '6': case '7': case '8': case '9': case '.':
10418       decimal:
10419         d = PL_tokenbuf;
10420         e = PL_tokenbuf + sizeof PL_tokenbuf - 6; /* room for various punctuation */
10421         floatit = FALSE;
10422
10423         /* read next group of digits and _ and copy into d */
10424         while (isDIGIT(*s) || *s == '_') {
10425             /* skip underscores, checking for misplaced ones
10426                if -w is on
10427             */
10428             if (*s == '_') {
10429                 if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
10430                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
10431                                 "Misplaced _ in number");
10432                 lastub = s++;
10433             }
10434             else {
10435                 /* check for end of fixed-length buffer */
10436                 if (d >= e)
10437                     Perl_croak(aTHX_ number_too_long);
10438                 /* if we're ok, copy the character */
10439                 *d++ = *s++;
10440             }
10441         }
10442
10443         /* final misplaced underbar check */
10444         if (lastub && s == lastub + 1) {
10445             if (ckWARN(WARN_SYNTAX))
10446                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
10447         }
10448
10449         /* read a decimal portion if there is one.  avoid
10450            3..5 being interpreted as the number 3. followed
10451            by .5
10452         */
10453         if (*s == '.' && s[1] != '.') {
10454             floatit = TRUE;
10455             *d++ = *s++;
10456
10457             if (*s == '_') {
10458                 if (ckWARN(WARN_SYNTAX))
10459                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
10460                                 "Misplaced _ in number");
10461                 lastub = s;
10462             }
10463
10464             /* copy, ignoring underbars, until we run out of digits.
10465             */
10466             for (; isDIGIT(*s) || *s == '_'; s++) {
10467                 /* fixed length buffer check */
10468                 if (d >= e)
10469                     Perl_croak(aTHX_ number_too_long);
10470                 if (*s == '_') {
10471                    if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
10472                        Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
10473                                    "Misplaced _ in number");
10474                    lastub = s;
10475                 }
10476                 else
10477                     *d++ = *s;
10478             }
10479             /* fractional part ending in underbar? */
10480             if (s[-1] == '_') {
10481                 if (ckWARN(WARN_SYNTAX))
10482                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
10483                                 "Misplaced _ in number");
10484             }
10485             if (*s == '.' && isDIGIT(s[1])) {
10486                 /* oops, it's really a v-string, but without the "v" */
10487                 s = start;
10488                 goto vstring;
10489             }
10490         }
10491
10492         /* read exponent part, if present */
10493         if ((*s == 'e' || *s == 'E') && strchr("+-0123456789_", s[1])) {
10494             floatit = TRUE;
10495             s++;
10496
10497             /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
10498             *d++ = 'e';         /* At least some Mach atof()s don't grok 'E' */
10499
10500             /* stray preinitial _ */
10501             if (*s == '_') {
10502                 if (ckWARN(WARN_SYNTAX))
10503                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
10504                                 "Misplaced _ in number");
10505                 lastub = s++;
10506             }
10507
10508             /* allow positive or negative exponent */
10509             if (*s == '+' || *s == '-')
10510                 *d++ = *s++;
10511
10512             /* stray initial _ */
10513             if (*s == '_') {
10514                 if (ckWARN(WARN_SYNTAX))
10515                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
10516                                 "Misplaced _ in number");
10517                 lastub = s++;
10518             }
10519
10520             /* read digits of exponent */
10521             while (isDIGIT(*s) || *s == '_') {
10522                 if (isDIGIT(*s)) {
10523                     if (d >= e)
10524                         Perl_croak(aTHX_ number_too_long);
10525                     *d++ = *s++;
10526                 }
10527                 else {
10528                    if (((lastub && s == lastub + 1) ||
10529                         (!isDIGIT(s[1]) && s[1] != '_'))
10530                     && ckWARN(WARN_SYNTAX))
10531                        Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
10532                                    "Misplaced _ in number");
10533                    lastub = s++;
10534                 }
10535             }
10536         }
10537
10538
10539         /* make an sv from the string */
10540         sv = NEWSV(92,0);
10541
10542         /*
10543            We try to do an integer conversion first if no characters
10544            indicating "float" have been found.
10545          */
10546
10547         if (!floatit) {
10548             UV uv;
10549             int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
10550
10551             if (flags == IS_NUMBER_IN_UV) {
10552               if (uv <= IV_MAX)
10553                 sv_setiv(sv, uv); /* Prefer IVs over UVs. */
10554               else
10555                 sv_setuv(sv, uv);
10556             } else if (flags == (IS_NUMBER_IN_UV | IS_NUMBER_NEG)) {
10557               if (uv <= (UV) IV_MIN)
10558                 sv_setiv(sv, -(IV)uv);
10559               else
10560                 floatit = TRUE;
10561             } else
10562               floatit = TRUE;
10563         }
10564         if (floatit) {
10565             /* terminate the string */
10566             *d = '\0';
10567             nv = Atof(PL_tokenbuf);
10568             sv_setnv(sv, nv);
10569         }
10570
10571         if ( floatit ? (PL_hints & HINT_NEW_FLOAT) :
10572                        (PL_hints & HINT_NEW_INTEGER) )
10573             sv = new_constant(PL_tokenbuf, d - PL_tokenbuf,
10574                               (floatit ? "float" : "integer"),
10575                               sv, Nullsv, NULL);
10576         break;
10577
10578     /* if it starts with a v, it could be a v-string */
10579     case 'v':
10580 vstring:
10581                 sv = NEWSV(92,5); /* preallocate storage space */
10582                 s = scan_vstring(s,sv);
10583         break;
10584     }
10585
10586     /* make the op for the constant and return */
10587
10588     if (sv)
10589         lvalp->opval = newSVOP(OP_CONST, 0, sv);
10590     else
10591         lvalp->opval = Nullop;
10592
10593     return (char *)s;
10594 }
10595
10596 STATIC char *
10597 S_scan_formline(pTHX_ register char *s)
10598 {
10599     register char *eol;
10600     register char *t;
10601     SV *stuff = newSVpvn("",0);
10602     bool needargs = FALSE;
10603     bool eofmt = FALSE;
10604
10605     while (!needargs) {
10606         if (*s == '.') {
10607 #ifdef PERL_STRICT_CR
10608             for (t = s+1;SPACE_OR_TAB(*t); t++) ;
10609 #else
10610             for (t = s+1;SPACE_OR_TAB(*t) || *t == '\r'; t++) ;
10611 #endif
10612             if (*t == '\n' || t == PL_bufend) {
10613                 eofmt = TRUE;
10614                 break;
10615             }
10616         }
10617         if (PL_in_eval && !PL_rsfp) {
10618             eol = (char *) memchr(s,'\n',PL_bufend-s);
10619             if (!eol++)
10620                 eol = PL_bufend;
10621         }
10622         else
10623             eol = PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
10624         if (*s != '#') {
10625             for (t = s; t < eol; t++) {
10626                 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
10627                     needargs = FALSE;
10628                     goto enough;        /* ~~ must be first line in formline */
10629                 }
10630                 if (*t == '@' || *t == '^')
10631                     needargs = TRUE;
10632             }
10633             if (eol > s) {
10634                 sv_catpvn(stuff, s, eol-s);
10635 #ifndef PERL_STRICT_CR
10636                 if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
10637                     char *end = SvPVX(stuff) + SvCUR(stuff);
10638                     end[-2] = '\n';
10639                     end[-1] = '\0';
10640                     SvCUR_set(stuff, SvCUR(stuff) - 1);
10641                 }
10642 #endif
10643             }
10644             else
10645               break;
10646         }
10647         s = (char*)eol;
10648         if (PL_rsfp) {
10649             s = filter_gets(PL_linestr, PL_rsfp, 0);
10650             PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
10651             PL_bufend = PL_bufptr + SvCUR(PL_linestr);
10652             PL_last_lop = PL_last_uni = Nullch;
10653             if (!s) {
10654                 s = PL_bufptr;
10655                 break;
10656             }
10657         }
10658         incline(s);
10659     }
10660   enough:
10661     if (SvCUR(stuff)) {
10662         PL_expect = XTERM;
10663         if (needargs) {
10664             PL_lex_state = LEX_NORMAL;
10665             PL_nextval[PL_nexttoke].ival = 0;
10666             force_next(',');
10667         }
10668         else
10669             PL_lex_state = LEX_FORMLINE;
10670         if (!IN_BYTES) {
10671             if (UTF && is_utf8_string((U8*)SvPVX_const(stuff), SvCUR(stuff)))
10672                 SvUTF8_on(stuff);
10673             else if (PL_encoding)
10674                 sv_recode_to_utf8(stuff, PL_encoding);
10675         }
10676         PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, stuff);
10677         force_next(THING);
10678         PL_nextval[PL_nexttoke].ival = OP_FORMLINE;
10679         force_next(LSTOP);
10680     }
10681     else {
10682         SvREFCNT_dec(stuff);
10683         if (eofmt)
10684             PL_lex_formbrack = 0;
10685         PL_bufptr = s;
10686     }
10687     return s;
10688 }
10689
10690 STATIC void
10691 S_set_csh(pTHX)
10692 {
10693 #ifdef CSH
10694     if (!PL_cshlen)
10695         PL_cshlen = strlen(PL_cshname);
10696 #endif
10697 }
10698
10699 I32
10700 Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
10701 {
10702     const I32 oldsavestack_ix = PL_savestack_ix;
10703     CV* outsidecv = PL_compcv;
10704
10705     if (PL_compcv) {
10706         assert(SvTYPE(PL_compcv) == SVt_PVCV);
10707     }
10708     SAVEI32(PL_subline);
10709     save_item(PL_subname);
10710     SAVESPTR(PL_compcv);
10711
10712     PL_compcv = (CV*)NEWSV(1104,0);
10713     sv_upgrade((SV *)PL_compcv, is_format ? SVt_PVFM : SVt_PVCV);
10714     CvFLAGS(PL_compcv) |= flags;
10715
10716     PL_subline = CopLINE(PL_curcop);
10717     CvPADLIST(PL_compcv) = pad_new(padnew_SAVE|padnew_SAVESUB);
10718     CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc(outsidecv);
10719     CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
10720
10721     return oldsavestack_ix;
10722 }
10723
10724 #ifdef __SC__
10725 #pragma segment Perl_yylex
10726 #endif
10727 int
10728 Perl_yywarn(pTHX_ const char *s)
10729 {
10730     PL_in_eval |= EVAL_WARNONLY;
10731     yyerror(s);
10732     PL_in_eval &= ~EVAL_WARNONLY;
10733     return 0;
10734 }
10735
10736 int
10737 Perl_yyerror(pTHX_ const char *s)
10738 {
10739     const char *where = NULL;
10740     const char *context = NULL;
10741     int contlen = -1;
10742     SV *msg;
10743
10744     if (!yychar || (yychar == ';' && !PL_rsfp))
10745         where = "at EOF";
10746     else if (PL_oldoldbufptr && PL_bufptr > PL_oldoldbufptr &&
10747       PL_bufptr - PL_oldoldbufptr < 200 && PL_oldoldbufptr != PL_oldbufptr &&
10748       PL_oldbufptr != PL_bufptr) {
10749         /*
10750                 Only for NetWare:
10751                 The code below is removed for NetWare because it abends/crashes on NetWare
10752                 when the script has error such as not having the closing quotes like:
10753                     if ($var eq "value)
10754                 Checking of white spaces is anyway done in NetWare code.
10755         */
10756 #ifndef NETWARE
10757         while (isSPACE(*PL_oldoldbufptr))
10758             PL_oldoldbufptr++;
10759 #endif
10760         context = PL_oldoldbufptr;
10761         contlen = PL_bufptr - PL_oldoldbufptr;
10762     }
10763     else if (PL_oldbufptr && PL_bufptr > PL_oldbufptr &&
10764       PL_bufptr - PL_oldbufptr < 200 && PL_oldbufptr != PL_bufptr) {
10765         /*
10766                 Only for NetWare:
10767                 The code below is removed for NetWare because it abends/crashes on NetWare
10768                 when the script has error such as not having the closing quotes like:
10769                     if ($var eq "value)
10770                 Checking of white spaces is anyway done in NetWare code.
10771         */
10772 #ifndef NETWARE
10773         while (isSPACE(*PL_oldbufptr))
10774             PL_oldbufptr++;
10775 #endif
10776         context = PL_oldbufptr;
10777         contlen = PL_bufptr - PL_oldbufptr;
10778     }
10779     else if (yychar > 255)
10780         where = "next token ???";
10781     else if (yychar == -2) { /* YYEMPTY */
10782         if (PL_lex_state == LEX_NORMAL ||
10783            (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
10784             where = "at end of line";
10785         else if (PL_lex_inpat)
10786             where = "within pattern";
10787         else
10788             where = "within string";
10789     }
10790     else {
10791         SV *where_sv = sv_2mortal(newSVpvn("next char ", 10));
10792         if (yychar < 32)
10793             Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
10794         else if (isPRINT_LC(yychar))
10795             Perl_sv_catpvf(aTHX_ where_sv, "%c", yychar);
10796         else
10797             Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
10798         where = SvPVX_const(where_sv);
10799     }
10800     msg = sv_2mortal(newSVpv(s, 0));
10801     Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
10802         OutCopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
10803     if (context)
10804         Perl_sv_catpvf(aTHX_ msg, "near \"%.*s\"\n", contlen, context);
10805     else
10806         Perl_sv_catpvf(aTHX_ msg, "%s\n", where);
10807     if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
10808         Perl_sv_catpvf(aTHX_ msg,
10809         "  (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
10810                 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
10811         PL_multi_end = 0;
10812     }
10813     if (PL_in_eval & EVAL_WARNONLY && ckWARN_d(WARN_SYNTAX))
10814         Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "%"SVf, msg);
10815     else
10816         qerror(msg);
10817     if (PL_error_count >= 10) {
10818         if (PL_in_eval && SvCUR(ERRSV))
10819             Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
10820             ERRSV, OutCopFILE(PL_curcop));
10821         else
10822             Perl_croak(aTHX_ "%s has too many errors.\n",
10823             OutCopFILE(PL_curcop));
10824     }
10825     PL_in_my = 0;
10826     PL_in_my_stash = Nullhv;
10827     return 0;
10828 }
10829 #ifdef __SC__
10830 #pragma segment Main
10831 #endif
10832
10833 STATIC char*
10834 S_swallow_bom(pTHX_ U8 *s)
10835 {
10836     const STRLEN slen = SvCUR(PL_linestr);
10837     switch (s[0]) {
10838     case 0xFF:
10839         if (s[1] == 0xFE) {
10840             /* UTF-16 little-endian? (or UTF32-LE?) */
10841             if (s[2] == 0 && s[3] == 0)  /* UTF-32 little-endian */
10842                 Perl_croak(aTHX_ "Unsupported script encoding UTF32-LE");
10843 #ifndef PERL_NO_UTF16_FILTER
10844             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF16-LE script encoding (BOM)\n");
10845             s += 2;
10846         utf16le:
10847             if (PL_bufend > (char*)s) {
10848                 U8 *news;
10849                 I32 newlen;
10850
10851                 filter_add(utf16rev_textfilter, NULL);
10852                 Newx(news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
10853                 utf16_to_utf8_reversed(s, news,
10854                                        PL_bufend - (char*)s - 1,
10855                                        &newlen);
10856                 sv_setpvn(PL_linestr, (const char*)news, newlen);
10857                 Safefree(news);
10858                 SvUTF8_on(PL_linestr);
10859                 s = (U8*)SvPVX(PL_linestr);
10860                 PL_bufend = SvPVX(PL_linestr) + newlen;
10861             }
10862 #else
10863             Perl_croak(aTHX_ "Unsupported script encoding UTF16-LE");
10864 #endif
10865         }
10866         break;
10867     case 0xFE:
10868         if (s[1] == 0xFF) {   /* UTF-16 big-endian? */
10869 #ifndef PERL_NO_UTF16_FILTER
10870             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (BOM)\n");
10871             s += 2;
10872         utf16be:
10873             if (PL_bufend > (char *)s) {
10874                 U8 *news;
10875                 I32 newlen;
10876
10877                 filter_add(utf16_textfilter, NULL);
10878                 Newx(news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
10879                 utf16_to_utf8(s, news,
10880                               PL_bufend - (char*)s,
10881                               &newlen);
10882                 sv_setpvn(PL_linestr, (const char*)news, newlen);
10883                 Safefree(news);
10884                 SvUTF8_on(PL_linestr);
10885                 s = (U8*)SvPVX(PL_linestr);
10886                 PL_bufend = SvPVX(PL_linestr) + newlen;
10887             }
10888 #else
10889             Perl_croak(aTHX_ "Unsupported script encoding UTF16-BE");
10890 #endif
10891         }
10892         break;
10893     case 0xEF:
10894         if (slen > 2 && s[1] == 0xBB && s[2] == 0xBF) {
10895             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
10896             s += 3;                      /* UTF-8 */
10897         }
10898         break;
10899     case 0:
10900         if (slen > 3) {
10901              if (s[1] == 0) {
10902                   if (s[2] == 0xFE && s[3] == 0xFF) {
10903                        /* UTF-32 big-endian */
10904                        Perl_croak(aTHX_ "Unsupported script encoding UTF32-BE");
10905                   }
10906              }
10907              else if (s[2] == 0 && s[3] != 0) {
10908                   /* Leading bytes
10909                    * 00 xx 00 xx
10910                    * are a good indicator of UTF-16BE. */
10911                   if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (no BOM)\n");
10912                   goto utf16be;
10913              }
10914         }
10915     default:
10916          if (slen > 3 && s[1] == 0 && s[2] != 0 && s[3] == 0) {
10917                   /* Leading bytes
10918                    * xx 00 xx 00
10919                    * are a good indicator of UTF-16LE. */
10920               if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (no BOM)\n");
10921               goto utf16le;
10922          }
10923     }
10924     return (char*)s;
10925 }
10926
10927 /*
10928  * restore_rsfp
10929  * Restore a source filter.
10930  */
10931
10932 static void
10933 restore_rsfp(pTHX_ void *f)
10934 {
10935     PerlIO *fp = (PerlIO*)f;
10936
10937     if (PL_rsfp == PerlIO_stdin())
10938         PerlIO_clearerr(PL_rsfp);
10939     else if (PL_rsfp && (PL_rsfp != fp))
10940         PerlIO_close(PL_rsfp);
10941     PL_rsfp = fp;
10942 }
10943
10944 #ifndef PERL_NO_UTF16_FILTER
10945 static I32
10946 utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
10947 {
10948     const STRLEN old = SvCUR(sv);
10949     const I32 count = FILTER_READ(idx+1, sv, maxlen);
10950     DEBUG_P(PerlIO_printf(Perl_debug_log,
10951                           "utf16_textfilter(%p): %d %d (%d)\n",
10952                           utf16_textfilter, idx, maxlen, (int) count));
10953     if (count) {
10954         U8* tmps;
10955         I32 newlen;
10956         Newx(tmps, SvCUR(sv) * 3 / 2 + 1, U8);
10957         Copy(SvPVX_const(sv), tmps, old, char);
10958         utf16_to_utf8((U8*)SvPVX_const(sv) + old, tmps + old,
10959                       SvCUR(sv) - old, &newlen);
10960         sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
10961     }
10962     DEBUG_P({sv_dump(sv);});
10963     return SvCUR(sv);
10964 }
10965
10966 static I32
10967 utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen)
10968 {
10969     const STRLEN old = SvCUR(sv);
10970     const I32 count = FILTER_READ(idx+1, sv, maxlen);
10971     DEBUG_P(PerlIO_printf(Perl_debug_log,
10972                           "utf16rev_textfilter(%p): %d %d (%d)\n",
10973                           utf16rev_textfilter, idx, maxlen, (int) count));
10974     if (count) {
10975         U8* tmps;
10976         I32 newlen;
10977         Newx(tmps, SvCUR(sv) * 3 / 2 + 1, U8);
10978         Copy(SvPVX_const(sv), tmps, old, char);
10979         utf16_to_utf8((U8*)SvPVX_const(sv) + old, tmps + old,
10980                       SvCUR(sv) - old, &newlen);
10981         sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
10982     }
10983     DEBUG_P({ sv_dump(sv); });
10984     return count;
10985 }
10986 #endif
10987
10988 /*
10989 Returns a pointer to the next character after the parsed
10990 vstring, as well as updating the passed in sv.
10991
10992 Function must be called like
10993
10994         sv = NEWSV(92,5);
10995         s = scan_vstring(s,sv);
10996
10997 The sv should already be large enough to store the vstring
10998 passed in, for performance reasons.
10999
11000 */
11001
11002 char *
11003 Perl_scan_vstring(pTHX_ const char *s, SV *sv)
11004 {
11005     const char *pos = s;
11006     const char *start = s;
11007     if (*pos == 'v') pos++;  /* get past 'v' */
11008     while (pos < PL_bufend && (isDIGIT(*pos) || *pos == '_'))
11009         pos++;
11010     if ( *pos != '.') {
11011         /* this may not be a v-string if followed by => */
11012         const char *next = pos;
11013         while (next < PL_bufend && isSPACE(*next))
11014             ++next;
11015         if ((PL_bufend - next) >= 2 && *next == '=' && next[1] == '>' ) {
11016             /* return string not v-string */
11017             sv_setpvn(sv,(char *)s,pos-s);
11018             return (char *)pos;
11019         }
11020     }
11021
11022     if (!isALPHA(*pos)) {
11023         UV rev;
11024         U8 tmpbuf[UTF8_MAXBYTES+1];
11025         U8 *tmpend;
11026
11027         if (*s == 'v') s++;  /* get past 'v' */
11028
11029         sv_setpvn(sv, "", 0);
11030
11031         for (;;) {
11032             rev = 0;
11033             {
11034                 /* this is atoi() that tolerates underscores */
11035                 const char *end = pos;
11036                 UV mult = 1;
11037                 while (--end >= s) {
11038                     UV orev;
11039                     if (*end == '_')
11040                         continue;
11041                     orev = rev;
11042                     rev += (*end - '0') * mult;
11043                     mult *= 10;
11044                     if (orev > rev && ckWARN_d(WARN_OVERFLOW))
11045                         Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
11046                                     "Integer overflow in decimal number");
11047                 }
11048             }
11049 #ifdef EBCDIC
11050             if (rev > 0x7FFFFFFF)
11051                  Perl_croak(aTHX_ "In EBCDIC the v-string components cannot exceed 2147483647");
11052 #endif
11053             /* Append native character for the rev point */
11054             tmpend = uvchr_to_utf8(tmpbuf, rev);
11055             sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
11056             if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(rev)))
11057                  SvUTF8_on(sv);
11058             if (pos + 1 < PL_bufend && *pos == '.' && isDIGIT(pos[1]))
11059                  s = ++pos;
11060             else {
11061                  s = pos;
11062                  break;
11063             }
11064             while (pos < PL_bufend && (isDIGIT(*pos) || *pos == '_'))
11065                  pos++;
11066         }
11067         SvPOK_on(sv);
11068         sv_magic(sv,NULL,PERL_MAGIC_vstring,(const char*)start, pos-start);
11069         SvRMAGICAL_on(sv);
11070     }
11071     return (char *)s;
11072 }
11073
11074 /*
11075  * Local variables:
11076  * c-indentation-style: bsd
11077  * c-basic-offset: 4
11078  * indent-tabs-mode: t
11079  * End:
11080  *
11081  * ex: set ts=8 sts=4 sw=4 noet:
11082  */