5f3abe8ab560dd077b95f2b89fac3a6ff1b5ad7c
[p5sagit/p5-mst-13.2.git] / toke.c
1 /*    toke.c
2  *
3  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4  *    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 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  *     [p.719 of _The Lord of the Rings_, IV/ix: "Shelob's Lair"]
15  */
16
17 /*
18  * This file is the lexer for Perl.  It's closely linked to the
19  * parser, perly.y.
20  *
21  * The main routine is yylex(), which returns the next token.
22  */
23
24 /*
25 =head1 Lexer interface
26
27 This is the lower layer of the Perl parser, managing characters and tokens.
28
29 =for apidoc AmU|yy_parser *|PL_parser
30
31 Pointer to a structure encapsulating the state of the parsing operation
32 currently in progress.  The pointer can be locally changed to perform
33 a nested parse without interfering with the state of an outer parse.
34 Individual members of C<PL_parser> have their own documentation.
35
36 =cut
37 */
38
39 #include "EXTERN.h"
40 #define PERL_IN_TOKE_C
41 #include "perl.h"
42
43 #define new_constant(a,b,c,d,e,f,g)     \
44         S_new_constant(aTHX_ a,b,STR_WITH_LEN(c),d,e,f, g)
45
46 #define pl_yylval       (PL_parser->yylval)
47
48 /* YYINITDEPTH -- initial size of the parser's stacks.  */
49 #define YYINITDEPTH 200
50
51 /* XXX temporary backwards compatibility */
52 #define PL_lex_brackets         (PL_parser->lex_brackets)
53 #define PL_lex_brackstack       (PL_parser->lex_brackstack)
54 #define PL_lex_casemods         (PL_parser->lex_casemods)
55 #define PL_lex_casestack        (PL_parser->lex_casestack)
56 #define PL_lex_defer            (PL_parser->lex_defer)
57 #define PL_lex_dojoin           (PL_parser->lex_dojoin)
58 #define PL_lex_expect           (PL_parser->lex_expect)
59 #define PL_lex_formbrack        (PL_parser->lex_formbrack)
60 #define PL_lex_inpat            (PL_parser->lex_inpat)
61 #define PL_lex_inwhat           (PL_parser->lex_inwhat)
62 #define PL_lex_op               (PL_parser->lex_op)
63 #define PL_lex_repl             (PL_parser->lex_repl)
64 #define PL_lex_starts           (PL_parser->lex_starts)
65 #define PL_lex_stuff            (PL_parser->lex_stuff)
66 #define PL_multi_start          (PL_parser->multi_start)
67 #define PL_multi_open           (PL_parser->multi_open)
68 #define PL_multi_close          (PL_parser->multi_close)
69 #define PL_pending_ident        (PL_parser->pending_ident)
70 #define PL_preambled            (PL_parser->preambled)
71 #define PL_sublex_info          (PL_parser->sublex_info)
72 #define PL_linestr              (PL_parser->linestr)
73 #define PL_expect               (PL_parser->expect)
74 #define PL_copline              (PL_parser->copline)
75 #define PL_bufptr               (PL_parser->bufptr)
76 #define PL_oldbufptr            (PL_parser->oldbufptr)
77 #define PL_oldoldbufptr         (PL_parser->oldoldbufptr)
78 #define PL_linestart            (PL_parser->linestart)
79 #define PL_bufend               (PL_parser->bufend)
80 #define PL_last_uni             (PL_parser->last_uni)
81 #define PL_last_lop             (PL_parser->last_lop)
82 #define PL_last_lop_op          (PL_parser->last_lop_op)
83 #define PL_lex_state            (PL_parser->lex_state)
84 #define PL_rsfp                 (PL_parser->rsfp)
85 #define PL_rsfp_filters         (PL_parser->rsfp_filters)
86 #define PL_in_my                (PL_parser->in_my)
87 #define PL_in_my_stash          (PL_parser->in_my_stash)
88 #define PL_tokenbuf             (PL_parser->tokenbuf)
89 #define PL_multi_end            (PL_parser->multi_end)
90 #define PL_error_count          (PL_parser->error_count)
91
92 #ifdef PERL_MAD
93 #  define PL_endwhite           (PL_parser->endwhite)
94 #  define PL_faketokens         (PL_parser->faketokens)
95 #  define PL_lasttoke           (PL_parser->lasttoke)
96 #  define PL_nextwhite          (PL_parser->nextwhite)
97 #  define PL_realtokenstart     (PL_parser->realtokenstart)
98 #  define PL_skipwhite          (PL_parser->skipwhite)
99 #  define PL_thisclose          (PL_parser->thisclose)
100 #  define PL_thismad            (PL_parser->thismad)
101 #  define PL_thisopen           (PL_parser->thisopen)
102 #  define PL_thisstuff          (PL_parser->thisstuff)
103 #  define PL_thistoken          (PL_parser->thistoken)
104 #  define PL_thiswhite          (PL_parser->thiswhite)
105 #  define PL_thiswhite          (PL_parser->thiswhite)
106 #  define PL_nexttoke           (PL_parser->nexttoke)
107 #  define PL_curforce           (PL_parser->curforce)
108 #else
109 #  define PL_nexttoke           (PL_parser->nexttoke)
110 #  define PL_nexttype           (PL_parser->nexttype)
111 #  define PL_nextval            (PL_parser->nextval)
112 #endif
113
114 /* This can't be done with embed.fnc, because struct yy_parser contains a
115    member named pending_ident, which clashes with the generated #define  */
116 static int
117 S_pending_ident(pTHX);
118
119 static const char ident_too_long[] = "Identifier too long";
120
121 #ifdef PERL_MAD
122 #  define CURMAD(slot,sv) if (PL_madskills) { curmad(slot,sv); sv = 0; }
123 #  define NEXTVAL_NEXTTOKE PL_nexttoke[PL_curforce].next_val
124 #else
125 #  define CURMAD(slot,sv)
126 #  define NEXTVAL_NEXTTOKE PL_nextval[PL_nexttoke]
127 #endif
128
129 #define XFAKEBRACK 128
130 #define XENUMMASK 127
131
132 #ifdef USE_UTF8_SCRIPTS
133 #   define UTF (!IN_BYTES)
134 #else
135 #   define UTF ((PL_linestr && DO_UTF8(PL_linestr)) || (PL_hints & HINT_UTF8))
136 #endif
137
138 /* The maximum number of characters preceding the unrecognized one to display */
139 #define UNRECOGNIZED_PRECEDE_COUNT 10
140
141 /* In variables named $^X, these are the legal values for X.
142  * 1999-02-27 mjd-perl-patch@plover.com */
143 #define isCONTROLVAR(x) (isUPPER(x) || strchr("[\\]^_?", (x)))
144
145 #define SPACE_OR_TAB(c) ((c)==' '||(c)=='\t')
146
147 /* LEX_* are values for PL_lex_state, the state of the lexer.
148  * They are arranged oddly so that the guard on the switch statement
149  * can get by with a single comparison (if the compiler is smart enough).
150  */
151
152 /* #define LEX_NOTPARSING               11 is done in perl.h. */
153
154 #define LEX_NORMAL              10 /* normal code (ie not within "...")     */
155 #define LEX_INTERPNORMAL         9 /* code within a string, eg "$foo[$x+1]" */
156 #define LEX_INTERPCASEMOD        8 /* expecting a \U, \Q or \E etc          */
157 #define LEX_INTERPPUSH           7 /* starting a new sublex parse level     */
158 #define LEX_INTERPSTART          6 /* expecting the start of a $var         */
159
160                                    /* at end of code, eg "$x" followed by:  */
161 #define LEX_INTERPEND            5 /* ... eg not one of [, { or ->          */
162 #define LEX_INTERPENDMAYBE       4 /* ... eg one of [, { or ->              */
163
164 #define LEX_INTERPCONCAT         3 /* expecting anything, eg at start of
165                                         string or after \E, $foo, etc       */
166 #define LEX_INTERPCONST          2 /* NOT USED */
167 #define LEX_FORMLINE             1 /* expecting a format line               */
168 #define LEX_KNOWNEXT             0 /* next token known; just return it      */
169
170
171 #ifdef DEBUGGING
172 static const char* const lex_state_names[] = {
173     "KNOWNEXT",
174     "FORMLINE",
175     "INTERPCONST",
176     "INTERPCONCAT",
177     "INTERPENDMAYBE",
178     "INTERPEND",
179     "INTERPSTART",
180     "INTERPPUSH",
181     "INTERPCASEMOD",
182     "INTERPNORMAL",
183     "NORMAL"
184 };
185 #endif
186
187 #ifdef ff_next
188 #undef ff_next
189 #endif
190
191 #include "keywords.h"
192
193 /* CLINE is a macro that ensures PL_copline has a sane value */
194
195 #ifdef CLINE
196 #undef CLINE
197 #endif
198 #define CLINE (PL_copline = (CopLINE(PL_curcop) < PL_copline ? CopLINE(PL_curcop) : PL_copline))
199
200 #ifdef PERL_MAD
201 #  define SKIPSPACE0(s) skipspace0(s)
202 #  define SKIPSPACE1(s) skipspace1(s)
203 #  define SKIPSPACE2(s,tsv) skipspace2(s,&tsv)
204 #  define PEEKSPACE(s) skipspace2(s,0)
205 #else
206 #  define SKIPSPACE0(s) skipspace(s)
207 #  define SKIPSPACE1(s) skipspace(s)
208 #  define SKIPSPACE2(s,tsv) skipspace(s)
209 #  define PEEKSPACE(s) skipspace(s)
210 #endif
211
212 /*
213  * Convenience functions to return different tokens and prime the
214  * lexer for the next token.  They all take an argument.
215  *
216  * TOKEN        : generic token (used for '(', DOLSHARP, etc)
217  * OPERATOR     : generic operator
218  * AOPERATOR    : assignment operator
219  * PREBLOCK     : beginning the block after an if, while, foreach, ...
220  * PRETERMBLOCK : beginning a non-code-defining {} block (eg, hash ref)
221  * PREREF       : *EXPR where EXPR is not a simple identifier
222  * TERM         : expression term
223  * LOOPX        : loop exiting command (goto, last, dump, etc)
224  * FTST         : file test operator
225  * FUN0         : zero-argument function
226  * FUN1         : not used, except for not, which isn't a UNIOP
227  * BOop         : bitwise or or xor
228  * BAop         : bitwise and
229  * SHop         : shift operator
230  * PWop         : power operator
231  * PMop         : pattern-matching operator
232  * Aop          : addition-level operator
233  * Mop          : multiplication-level operator
234  * Eop          : equality-testing operator
235  * Rop          : relational operator <= != gt
236  *
237  * Also see LOP and lop() below.
238  */
239
240 #ifdef DEBUGGING /* Serve -DT. */
241 #   define REPORT(retval) tokereport((I32)retval, &pl_yylval)
242 #else
243 #   define REPORT(retval) (retval)
244 #endif
245
246 #define TOKEN(retval) return ( PL_bufptr = s, REPORT(retval))
247 #define OPERATOR(retval) return (PL_expect = XTERM, PL_bufptr = s, REPORT(retval))
248 #define AOPERATOR(retval) return ao((PL_expect = XTERM, PL_bufptr = s, REPORT(retval)))
249 #define PREBLOCK(retval) return (PL_expect = XBLOCK,PL_bufptr = s, REPORT(retval))
250 #define PRETERMBLOCK(retval) return (PL_expect = XTERMBLOCK,PL_bufptr = s, REPORT(retval))
251 #define PREREF(retval) return (PL_expect = XREF,PL_bufptr = s, REPORT(retval))
252 #define TERM(retval) return (CLINE, PL_expect = XOPERATOR, PL_bufptr = s, REPORT(retval))
253 #define LOOPX(f) return (pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)LOOPEX))
254 #define FTST(f)  return (pl_yylval.ival=f, PL_expect=XTERMORDORDOR, PL_bufptr=s, REPORT((int)UNIOP))
255 #define FUN0(f)  return (pl_yylval.ival=f, PL_expect=XOPERATOR, PL_bufptr=s, REPORT((int)FUNC0))
256 #define FUN1(f)  return (pl_yylval.ival=f, PL_expect=XOPERATOR, PL_bufptr=s, REPORT((int)FUNC1))
257 #define BOop(f)  return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)BITOROP)))
258 #define BAop(f)  return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)BITANDOP)))
259 #define SHop(f)  return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)SHIFTOP)))
260 #define PWop(f)  return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)POWOP)))
261 #define PMop(f)  return(pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)MATCHOP))
262 #define Aop(f)   return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)ADDOP)))
263 #define Mop(f)   return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)MULOP)))
264 #define Eop(f)   return (pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)EQOP))
265 #define Rop(f)   return (pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)RELOP))
266
267 /* This bit of chicanery makes a unary function followed by
268  * a parenthesis into a function with one argument, highest precedence.
269  * The UNIDOR macro is for unary functions that can be followed by the //
270  * operator (such as C<shift // 0>).
271  */
272 #define UNI2(f,x) { \
273         pl_yylval.ival = f; \
274         PL_expect = x; \
275         PL_bufptr = s; \
276         PL_last_uni = PL_oldbufptr; \
277         PL_last_lop_op = f; \
278         if (*s == '(') \
279             return REPORT( (int)FUNC1 ); \
280         s = PEEKSPACE(s); \
281         return REPORT( *s=='(' ? (int)FUNC1 : (int)UNIOP ); \
282         }
283 #define UNI(f)    UNI2(f,XTERM)
284 #define UNIDOR(f) UNI2(f,XTERMORDORDOR)
285
286 #define UNIBRACK(f) { \
287         pl_yylval.ival = f; \
288         PL_bufptr = s; \
289         PL_last_uni = PL_oldbufptr; \
290         if (*s == '(') \
291             return REPORT( (int)FUNC1 ); \
292         s = PEEKSPACE(s); \
293         return REPORT( (*s == '(') ? (int)FUNC1 : (int)UNIOP ); \
294         }
295
296 /* grandfather return to old style */
297 #define OLDLOP(f) return(pl_yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)LSTOP)
298
299 #ifdef DEBUGGING
300
301 /* how to interpret the pl_yylval associated with the token */
302 enum token_type {
303     TOKENTYPE_NONE,
304     TOKENTYPE_IVAL,
305     TOKENTYPE_OPNUM, /* pl_yylval.ival contains an opcode number */
306     TOKENTYPE_PVAL,
307     TOKENTYPE_OPVAL,
308     TOKENTYPE_GVVAL
309 };
310
311 static struct debug_tokens {
312     const int token;
313     enum token_type type;
314     const char *name;
315 } const debug_tokens[] =
316 {
317     { ADDOP,            TOKENTYPE_OPNUM,        "ADDOP" },
318     { ANDAND,           TOKENTYPE_NONE,         "ANDAND" },
319     { ANDOP,            TOKENTYPE_NONE,         "ANDOP" },
320     { ANONSUB,          TOKENTYPE_IVAL,         "ANONSUB" },
321     { ARROW,            TOKENTYPE_NONE,         "ARROW" },
322     { ASSIGNOP,         TOKENTYPE_OPNUM,        "ASSIGNOP" },
323     { BITANDOP,         TOKENTYPE_OPNUM,        "BITANDOP" },
324     { BITOROP,          TOKENTYPE_OPNUM,        "BITOROP" },
325     { COLONATTR,        TOKENTYPE_NONE,         "COLONATTR" },
326     { CONTINUE,         TOKENTYPE_NONE,         "CONTINUE" },
327     { DEFAULT,          TOKENTYPE_NONE,         "DEFAULT" },
328     { DO,               TOKENTYPE_NONE,         "DO" },
329     { DOLSHARP,         TOKENTYPE_NONE,         "DOLSHARP" },
330     { DORDOR,           TOKENTYPE_NONE,         "DORDOR" },
331     { DOROP,            TOKENTYPE_OPNUM,        "DOROP" },
332     { DOTDOT,           TOKENTYPE_IVAL,         "DOTDOT" },
333     { ELSE,             TOKENTYPE_NONE,         "ELSE" },
334     { ELSIF,            TOKENTYPE_IVAL,         "ELSIF" },
335     { EQOP,             TOKENTYPE_OPNUM,        "EQOP" },
336     { FOR,              TOKENTYPE_IVAL,         "FOR" },
337     { FORMAT,           TOKENTYPE_NONE,         "FORMAT" },
338     { FUNC,             TOKENTYPE_OPNUM,        "FUNC" },
339     { FUNC0,            TOKENTYPE_OPNUM,        "FUNC0" },
340     { FUNC0SUB,         TOKENTYPE_OPVAL,        "FUNC0SUB" },
341     { FUNC1,            TOKENTYPE_OPNUM,        "FUNC1" },
342     { FUNCMETH,         TOKENTYPE_OPVAL,        "FUNCMETH" },
343     { GIVEN,            TOKENTYPE_IVAL,         "GIVEN" },
344     { HASHBRACK,        TOKENTYPE_NONE,         "HASHBRACK" },
345     { IF,               TOKENTYPE_IVAL,         "IF" },
346     { LABEL,            TOKENTYPE_PVAL,         "LABEL" },
347     { LOCAL,            TOKENTYPE_IVAL,         "LOCAL" },
348     { LOOPEX,           TOKENTYPE_OPNUM,        "LOOPEX" },
349     { LSTOP,            TOKENTYPE_OPNUM,        "LSTOP" },
350     { LSTOPSUB,         TOKENTYPE_OPVAL,        "LSTOPSUB" },
351     { MATCHOP,          TOKENTYPE_OPNUM,        "MATCHOP" },
352     { METHOD,           TOKENTYPE_OPVAL,        "METHOD" },
353     { MULOP,            TOKENTYPE_OPNUM,        "MULOP" },
354     { MY,               TOKENTYPE_IVAL,         "MY" },
355     { MYSUB,            TOKENTYPE_NONE,         "MYSUB" },
356     { NOAMP,            TOKENTYPE_NONE,         "NOAMP" },
357     { NOTOP,            TOKENTYPE_NONE,         "NOTOP" },
358     { OROP,             TOKENTYPE_IVAL,         "OROP" },
359     { OROR,             TOKENTYPE_NONE,         "OROR" },
360     { PACKAGE,          TOKENTYPE_NONE,         "PACKAGE" },
361     { PLUGEXPR,         TOKENTYPE_OPVAL,        "PLUGEXPR" },
362     { PLUGSTMT,         TOKENTYPE_OPVAL,        "PLUGSTMT" },
363     { PMFUNC,           TOKENTYPE_OPVAL,        "PMFUNC" },
364     { POSTDEC,          TOKENTYPE_NONE,         "POSTDEC" },
365     { POSTINC,          TOKENTYPE_NONE,         "POSTINC" },
366     { POWOP,            TOKENTYPE_OPNUM,        "POWOP" },
367     { PREDEC,           TOKENTYPE_NONE,         "PREDEC" },
368     { PREINC,           TOKENTYPE_NONE,         "PREINC" },
369     { PRIVATEREF,       TOKENTYPE_OPVAL,        "PRIVATEREF" },
370     { REFGEN,           TOKENTYPE_NONE,         "REFGEN" },
371     { RELOP,            TOKENTYPE_OPNUM,        "RELOP" },
372     { SHIFTOP,          TOKENTYPE_OPNUM,        "SHIFTOP" },
373     { SUB,              TOKENTYPE_NONE,         "SUB" },
374     { THING,            TOKENTYPE_OPVAL,        "THING" },
375     { UMINUS,           TOKENTYPE_NONE,         "UMINUS" },
376     { UNIOP,            TOKENTYPE_OPNUM,        "UNIOP" },
377     { UNIOPSUB,         TOKENTYPE_OPVAL,        "UNIOPSUB" },
378     { UNLESS,           TOKENTYPE_IVAL,         "UNLESS" },
379     { UNTIL,            TOKENTYPE_IVAL,         "UNTIL" },
380     { USE,              TOKENTYPE_IVAL,         "USE" },
381     { WHEN,             TOKENTYPE_IVAL,         "WHEN" },
382     { WHILE,            TOKENTYPE_IVAL,         "WHILE" },
383     { WORD,             TOKENTYPE_OPVAL,        "WORD" },
384     { YADAYADA,         TOKENTYPE_IVAL,         "YADAYADA" },
385     { 0,                TOKENTYPE_NONE,         NULL }
386 };
387
388 /* dump the returned token in rv, plus any optional arg in pl_yylval */
389
390 STATIC int
391 S_tokereport(pTHX_ I32 rv, const YYSTYPE* lvalp)
392 {
393     dVAR;
394
395     PERL_ARGS_ASSERT_TOKEREPORT;
396
397     if (DEBUG_T_TEST) {
398         const char *name = NULL;
399         enum token_type type = TOKENTYPE_NONE;
400         const struct debug_tokens *p;
401         SV* const report = newSVpvs("<== ");
402
403         for (p = debug_tokens; p->token; p++) {
404             if (p->token == (int)rv) {
405                 name = p->name;
406                 type = p->type;
407                 break;
408             }
409         }
410         if (name)
411             Perl_sv_catpv(aTHX_ report, name);
412         else if ((char)rv > ' ' && (char)rv < '~')
413             Perl_sv_catpvf(aTHX_ report, "'%c'", (char)rv);
414         else if (!rv)
415             sv_catpvs(report, "EOF");
416         else
417             Perl_sv_catpvf(aTHX_ report, "?? %"IVdf, (IV)rv);
418         switch (type) {
419         case TOKENTYPE_NONE:
420         case TOKENTYPE_GVVAL: /* doesn't appear to be used */
421             break;
422         case TOKENTYPE_IVAL:
423             Perl_sv_catpvf(aTHX_ report, "(ival=%"IVdf")", (IV)lvalp->ival);
424             break;
425         case TOKENTYPE_OPNUM:
426             Perl_sv_catpvf(aTHX_ report, "(ival=op_%s)",
427                                     PL_op_name[lvalp->ival]);
428             break;
429         case TOKENTYPE_PVAL:
430             Perl_sv_catpvf(aTHX_ report, "(pval=\"%s\")", lvalp->pval);
431             break;
432         case TOKENTYPE_OPVAL:
433             if (lvalp->opval) {
434                 Perl_sv_catpvf(aTHX_ report, "(opval=op_%s)",
435                                     PL_op_name[lvalp->opval->op_type]);
436                 if (lvalp->opval->op_type == OP_CONST) {
437                     Perl_sv_catpvf(aTHX_ report, " %s",
438                         SvPEEK(cSVOPx_sv(lvalp->opval)));
439                 }
440
441             }
442             else
443                 sv_catpvs(report, "(opval=null)");
444             break;
445         }
446         PerlIO_printf(Perl_debug_log, "### %s\n\n", SvPV_nolen_const(report));
447     };
448     return (int)rv;
449 }
450
451
452 /* print the buffer with suitable escapes */
453
454 STATIC void
455 S_printbuf(pTHX_ const char *const fmt, const char *const s)
456 {
457     SV* const tmp = newSVpvs("");
458
459     PERL_ARGS_ASSERT_PRINTBUF;
460
461     PerlIO_printf(Perl_debug_log, fmt, pv_display(tmp, s, strlen(s), 0, 60));
462     SvREFCNT_dec(tmp);
463 }
464
465 #endif
466
467 static int
468 S_deprecate_commaless_var_list(pTHX) {
469     PL_expect = XTERM;
470     deprecate("comma-less variable list");
471     return REPORT(','); /* grandfather non-comma-format format */
472 }
473
474 /*
475  * S_ao
476  *
477  * This subroutine detects &&=, ||=, and //= and turns an ANDAND, OROR or DORDOR
478  * into an OP_ANDASSIGN, OP_ORASSIGN, or OP_DORASSIGN
479  */
480
481 STATIC int
482 S_ao(pTHX_ int toketype)
483 {
484     dVAR;
485     if (*PL_bufptr == '=') {
486         PL_bufptr++;
487         if (toketype == ANDAND)
488             pl_yylval.ival = OP_ANDASSIGN;
489         else if (toketype == OROR)
490             pl_yylval.ival = OP_ORASSIGN;
491         else if (toketype == DORDOR)
492             pl_yylval.ival = OP_DORASSIGN;
493         toketype = ASSIGNOP;
494     }
495     return toketype;
496 }
497
498 /*
499  * S_no_op
500  * When Perl expects an operator and finds something else, no_op
501  * prints the warning.  It always prints "<something> found where
502  * operator expected.  It prints "Missing semicolon on previous line?"
503  * if the surprise occurs at the start of the line.  "do you need to
504  * predeclare ..." is printed out for code like "sub bar; foo bar $x"
505  * where the compiler doesn't know if foo is a method call or a function.
506  * It prints "Missing operator before end of line" if there's nothing
507  * after the missing operator, or "... before <...>" if there is something
508  * after the missing operator.
509  */
510
511 STATIC void
512 S_no_op(pTHX_ const char *const what, char *s)
513 {
514     dVAR;
515     char * const oldbp = PL_bufptr;
516     const bool is_first = (PL_oldbufptr == PL_linestart);
517
518     PERL_ARGS_ASSERT_NO_OP;
519
520     if (!s)
521         s = oldbp;
522     else
523         PL_bufptr = s;
524     yywarn(Perl_form(aTHX_ "%s found where operator expected", what));
525     if (ckWARN_d(WARN_SYNTAX)) {
526         if (is_first)
527             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
528                     "\t(Missing semicolon on previous line?)\n");
529         else if (PL_oldoldbufptr && isIDFIRST_lazy_if(PL_oldoldbufptr,UTF)) {
530             const char *t;
531             for (t = PL_oldoldbufptr; (isALNUM_lazy_if(t,UTF) || *t == ':'); t++)
532                 NOOP;
533             if (t < PL_bufptr && isSPACE(*t))
534                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
535                         "\t(Do you need to predeclare %.*s?)\n",
536                     (int)(t - PL_oldoldbufptr), PL_oldoldbufptr);
537         }
538         else {
539             assert(s >= oldbp);
540             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
541                     "\t(Missing operator before %.*s?)\n", (int)(s - oldbp), oldbp);
542         }
543     }
544     PL_bufptr = oldbp;
545 }
546
547 /*
548  * S_missingterm
549  * Complain about missing quote/regexp/heredoc terminator.
550  * If it's called with NULL then it cauterizes the line buffer.
551  * If we're in a delimited string and the delimiter is a control
552  * character, it's reformatted into a two-char sequence like ^C.
553  * This is fatal.
554  */
555
556 STATIC void
557 S_missingterm(pTHX_ char *s)
558 {
559     dVAR;
560     char tmpbuf[3];
561     char q;
562     if (s) {
563         char * const nl = strrchr(s,'\n');
564         if (nl)
565             *nl = '\0';
566     }
567     else if (isCNTRL(PL_multi_close)) {
568         *tmpbuf = '^';
569         tmpbuf[1] = (char)toCTRL(PL_multi_close);
570         tmpbuf[2] = '\0';
571         s = tmpbuf;
572     }
573     else {
574         *tmpbuf = (char)PL_multi_close;
575         tmpbuf[1] = '\0';
576         s = tmpbuf;
577     }
578     q = strchr(s,'"') ? '\'' : '"';
579     Perl_croak(aTHX_ "Can't find string terminator %c%s%c anywhere before EOF",q,s,q);
580 }
581
582 #define FEATURE_IS_ENABLED(name)                                        \
583         ((0 != (PL_hints & HINT_LOCALIZE_HH))                           \
584             && S_feature_is_enabled(aTHX_ STR_WITH_LEN(name)))
585 /* The longest string we pass in.  */
586 #define MAX_FEATURE_LEN (sizeof("unicode_strings")-1)
587
588 /*
589  * S_feature_is_enabled
590  * Check whether the named feature is enabled.
591  */
592 STATIC bool
593 S_feature_is_enabled(pTHX_ const char *const name, STRLEN namelen)
594 {
595     dVAR;
596     HV * const hinthv = GvHV(PL_hintgv);
597     char he_name[8 + MAX_FEATURE_LEN] = "feature_";
598
599     PERL_ARGS_ASSERT_FEATURE_IS_ENABLED;
600
601     assert(namelen <= MAX_FEATURE_LEN);
602     memcpy(&he_name[8], name, namelen);
603
604     return (hinthv && hv_exists(hinthv, he_name, 8 + namelen));
605 }
606
607 /*
608  * experimental text filters for win32 carriage-returns, utf16-to-utf8 and
609  * utf16-to-utf8-reversed.
610  */
611
612 #ifdef PERL_CR_FILTER
613 static void
614 strip_return(SV *sv)
615 {
616     register const char *s = SvPVX_const(sv);
617     register const char * const e = s + SvCUR(sv);
618
619     PERL_ARGS_ASSERT_STRIP_RETURN;
620
621     /* outer loop optimized to do nothing if there are no CR-LFs */
622     while (s < e) {
623         if (*s++ == '\r' && *s == '\n') {
624             /* hit a CR-LF, need to copy the rest */
625             register char *d = s - 1;
626             *d++ = *s++;
627             while (s < e) {
628                 if (*s == '\r' && s[1] == '\n')
629                     s++;
630                 *d++ = *s++;
631             }
632             SvCUR(sv) -= s - d;
633             return;
634         }
635     }
636 }
637
638 STATIC I32
639 S_cr_textfilter(pTHX_ int idx, SV *sv, int maxlen)
640 {
641     const I32 count = FILTER_READ(idx+1, sv, maxlen);
642     if (count > 0 && !maxlen)
643         strip_return(sv);
644     return count;
645 }
646 #endif
647
648
649
650 /*
651  * Perl_lex_start
652  *
653  * Create a parser object and initialise its parser and lexer fields
654  *
655  * rsfp       is the opened file handle to read from (if any),
656  *
657  * line       holds any initial content already read from the file (or in
658  *            the case of no file, such as an eval, the whole contents);
659  *
660  * new_filter indicates that this is a new file and it shouldn't inherit
661  *            the filters from the current parser (ie require).
662  */
663
664 void
665 Perl_lex_start(pTHX_ SV *line, PerlIO *rsfp, bool new_filter)
666 {
667     dVAR;
668     const char *s = NULL;
669     STRLEN len;
670     yy_parser *parser, *oparser;
671
672     /* create and initialise a parser */
673
674     Newxz(parser, 1, yy_parser);
675     parser->old_parser = oparser = PL_parser;
676     PL_parser = parser;
677
678     Newx(parser->stack, YYINITDEPTH, yy_stack_frame);
679     parser->ps = parser->stack;
680     parser->stack_size = YYINITDEPTH;
681
682     parser->stack->state = 0;
683     parser->yyerrstatus = 0;
684     parser->yychar = YYEMPTY;           /* Cause a token to be read.  */
685
686     /* on scope exit, free this parser and restore any outer one */
687     SAVEPARSER(parser);
688     parser->saved_curcop = PL_curcop;
689
690     /* initialise lexer state */
691
692 #ifdef PERL_MAD
693     parser->curforce = -1;
694 #else
695     parser->nexttoke = 0;
696 #endif
697     parser->error_count = oparser ? oparser->error_count : 0;
698     parser->copline = NOLINE;
699     parser->lex_state = LEX_NORMAL;
700     parser->expect = XSTATE;
701     parser->rsfp = rsfp;
702     parser->rsfp_filters = (new_filter || !oparser) ? newAV()
703                 : MUTABLE_AV(SvREFCNT_inc(oparser->rsfp_filters));
704
705     Newx(parser->lex_brackstack, 120, char);
706     Newx(parser->lex_casestack, 12, char);
707     *parser->lex_casestack = '\0';
708
709     if (line) {
710         s = SvPV_const(line, len);
711     } else {
712         len = 0;
713     }
714
715     if (!len) {
716         parser->linestr = newSVpvs("\n;");
717     } else if (SvREADONLY(line) || s[len-1] != ';') {
718         parser->linestr = newSVsv(line);
719         if (s[len-1] != ';')
720             sv_catpvs(parser->linestr, "\n;");
721     } else {
722         SvTEMP_off(line);
723         SvREFCNT_inc_simple_void_NN(line);
724         parser->linestr = line;
725     }
726     parser->oldoldbufptr =
727         parser->oldbufptr =
728         parser->bufptr =
729         parser->linestart = SvPVX(parser->linestr);
730     parser->bufend = parser->bufptr + SvCUR(parser->linestr);
731     parser->last_lop = parser->last_uni = NULL;
732 }
733
734
735 /* delete a parser object */
736
737 void
738 Perl_parser_free(pTHX_  const yy_parser *parser)
739 {
740     PERL_ARGS_ASSERT_PARSER_FREE;
741
742     PL_curcop = parser->saved_curcop;
743     SvREFCNT_dec(parser->linestr);
744
745     if (parser->rsfp == PerlIO_stdin())
746         PerlIO_clearerr(parser->rsfp);
747     else if (parser->rsfp && (!parser->old_parser ||
748                 (parser->old_parser && parser->rsfp != parser->old_parser->rsfp)))
749         PerlIO_close(parser->rsfp);
750     SvREFCNT_dec(parser->rsfp_filters);
751
752     Safefree(parser->stack);
753     Safefree(parser->lex_brackstack);
754     Safefree(parser->lex_casestack);
755     PL_parser = parser->old_parser;
756     Safefree(parser);
757 }
758
759
760 /*
761  * Perl_lex_end
762  * Finalizer for lexing operations.  Must be called when the parser is
763  * done with the lexer.
764  */
765
766 void
767 Perl_lex_end(pTHX)
768 {
769     dVAR;
770     PL_doextract = FALSE;
771 }
772
773 /*
774 =for apidoc AmxU|SV *|PL_parser-E<gt>linestr
775
776 Buffer scalar containing the chunk currently under consideration of the
777 text currently being lexed.  This is always a plain string scalar (for
778 which C<SvPOK> is true).  It is not intended to be used as a scalar by
779 normal scalar means; instead refer to the buffer directly by the pointer
780 variables described below.
781
782 The lexer maintains various C<char*> pointers to things in the
783 C<PL_parser-E<gt>linestr> buffer.  If C<PL_parser-E<gt>linestr> is ever
784 reallocated, all of these pointers must be updated.  Don't attempt to
785 do this manually, but rather use L</lex_grow_linestr> if you need to
786 reallocate the buffer.
787
788 The content of the text chunk in the buffer is commonly exactly one
789 complete line of input, up to and including a newline terminator,
790 but there are situations where it is otherwise.  The octets of the
791 buffer may be intended to be interpreted as either UTF-8 or Latin-1.
792 The function L</lex_bufutf8> tells you which.  Do not use the C<SvUTF8>
793 flag on this scalar, which may disagree with it.
794
795 For direct examination of the buffer, the variable
796 L</PL_parser-E<gt>bufend> points to the end of the buffer.  The current
797 lexing position is pointed to by L</PL_parser-E<gt>bufptr>.  Direct use
798 of these pointers is usually preferable to examination of the scalar
799 through normal scalar means.
800
801 =for apidoc AmxU|char *|PL_parser-E<gt>bufend
802
803 Direct pointer to the end of the chunk of text currently being lexed, the
804 end of the lexer buffer.  This is equal to C<SvPVX(PL_parser-E<gt>linestr)
805 + SvCUR(PL_parser-E<gt>linestr)>.  A NUL character (zero octet) is
806 always located at the end of the buffer, and does not count as part of
807 the buffer's contents.
808
809 =for apidoc AmxU|char *|PL_parser-E<gt>bufptr
810
811 Points to the current position of lexing inside the lexer buffer.
812 Characters around this point may be freely examined, within
813 the range delimited by C<SvPVX(L</PL_parser-E<gt>linestr>)> and
814 L</PL_parser-E<gt>bufend>.  The octets of the buffer may be intended to be
815 interpreted as either UTF-8 or Latin-1, as indicated by L</lex_bufutf8>.
816
817 Lexing code (whether in the Perl core or not) moves this pointer past
818 the characters that it consumes.  It is also expected to perform some
819 bookkeeping whenever a newline character is consumed.  This movement
820 can be more conveniently performed by the function L</lex_read_to>,
821 which handles newlines appropriately.
822
823 Interpretation of the buffer's octets can be abstracted out by
824 using the slightly higher-level functions L</lex_peek_unichar> and
825 L</lex_read_unichar>.
826
827 =for apidoc AmxU|char *|PL_parser-E<gt>linestart
828
829 Points to the start of the current line inside the lexer buffer.
830 This is useful for indicating at which column an error occurred, and
831 not much else.  This must be updated by any lexing code that consumes
832 a newline; the function L</lex_read_to> handles this detail.
833
834 =cut
835 */
836
837 /*
838 =for apidoc Amx|bool|lex_bufutf8
839
840 Indicates whether the octets in the lexer buffer
841 (L</PL_parser-E<gt>linestr>) should be interpreted as the UTF-8 encoding
842 of Unicode characters.  If not, they should be interpreted as Latin-1
843 characters.  This is analogous to the C<SvUTF8> flag for scalars.
844
845 In UTF-8 mode, it is not guaranteed that the lexer buffer actually
846 contains valid UTF-8.  Lexing code must be robust in the face of invalid
847 encoding.
848
849 The actual C<SvUTF8> flag of the L</PL_parser-E<gt>linestr> scalar
850 is significant, but not the whole story regarding the input character
851 encoding.  Normally, when a file is being read, the scalar contains octets
852 and its C<SvUTF8> flag is off, but the octets should be interpreted as
853 UTF-8 if the C<use utf8> pragma is in effect.  During a string eval,
854 however, the scalar may have the C<SvUTF8> flag on, and in this case its
855 octets should be interpreted as UTF-8 unless the C<use bytes> pragma
856 is in effect.  This logic may change in the future; use this function
857 instead of implementing the logic yourself.
858
859 =cut
860 */
861
862 bool
863 Perl_lex_bufutf8(pTHX)
864 {
865     return UTF;
866 }
867
868 /*
869 =for apidoc Amx|char *|lex_grow_linestr|STRLEN len
870
871 Reallocates the lexer buffer (L</PL_parser-E<gt>linestr>) to accommodate
872 at least I<len> octets (including terminating NUL).  Returns a
873 pointer to the reallocated buffer.  This is necessary before making
874 any direct modification of the buffer that would increase its length.
875 L</lex_stuff_pvn> provides a more convenient way to insert text into
876 the buffer.
877
878 Do not use C<SvGROW> or C<sv_grow> directly on C<PL_parser-E<gt>linestr>;
879 this function updates all of the lexer's variables that point directly
880 into the buffer.
881
882 =cut
883 */
884
885 char *
886 Perl_lex_grow_linestr(pTHX_ STRLEN len)
887 {
888     SV *linestr;
889     char *buf;
890     STRLEN bufend_pos, bufptr_pos, oldbufptr_pos, oldoldbufptr_pos;
891     STRLEN linestart_pos, last_uni_pos, last_lop_pos;
892     linestr = PL_parser->linestr;
893     buf = SvPVX(linestr);
894     if (len <= SvLEN(linestr))
895         return buf;
896     bufend_pos = PL_parser->bufend - buf;
897     bufptr_pos = PL_parser->bufptr - buf;
898     oldbufptr_pos = PL_parser->oldbufptr - buf;
899     oldoldbufptr_pos = PL_parser->oldoldbufptr - buf;
900     linestart_pos = PL_parser->linestart - buf;
901     last_uni_pos = PL_parser->last_uni ? PL_parser->last_uni - buf : 0;
902     last_lop_pos = PL_parser->last_lop ? PL_parser->last_lop - buf : 0;
903     buf = sv_grow(linestr, len);
904     PL_parser->bufend = buf + bufend_pos;
905     PL_parser->bufptr = buf + bufptr_pos;
906     PL_parser->oldbufptr = buf + oldbufptr_pos;
907     PL_parser->oldoldbufptr = buf + oldoldbufptr_pos;
908     PL_parser->linestart = buf + linestart_pos;
909     if (PL_parser->last_uni)
910         PL_parser->last_uni = buf + last_uni_pos;
911     if (PL_parser->last_lop)
912         PL_parser->last_lop = buf + last_lop_pos;
913     return buf;
914 }
915
916 /*
917 =for apidoc Amx|void|lex_stuff_pvn|const char *pv|STRLEN len|U32 flags
918
919 Insert characters into the lexer buffer (L</PL_parser-E<gt>linestr>),
920 immediately after the current lexing point (L</PL_parser-E<gt>bufptr>),
921 reallocating the buffer if necessary.  This means that lexing code that
922 runs later will see the characters as if they had appeared in the input.
923 It is not recommended to do this as part of normal parsing, and most
924 uses of this facility run the risk of the inserted characters being
925 interpreted in an unintended manner.
926
927 The string to be inserted is represented by I<len> octets starting
928 at I<pv>.  These octets are interpreted as either UTF-8 or Latin-1,
929 according to whether the C<LEX_STUFF_UTF8> flag is set in I<flags>.
930 The characters are recoded for the lexer buffer, according to how the
931 buffer is currently being interpreted (L</lex_bufutf8>).  If a string
932 to be interpreted is available as a Perl scalar, the L</lex_stuff_sv>
933 function is more convenient.
934
935 =cut
936 */
937
938 void
939 Perl_lex_stuff_pvn(pTHX_ const char *pv, STRLEN len, U32 flags)
940 {
941     dVAR;
942     char *bufptr;
943     PERL_ARGS_ASSERT_LEX_STUFF_PVN;
944     if (flags & ~(LEX_STUFF_UTF8))
945         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_stuff_pvn");
946     if (UTF) {
947         if (flags & LEX_STUFF_UTF8) {
948             goto plain_copy;
949         } else {
950             STRLEN highhalf = 0;
951             const char *p, *e = pv+len;
952             for (p = pv; p != e; p++)
953                 highhalf += !!(((U8)*p) & 0x80);
954             if (!highhalf)
955                 goto plain_copy;
956             lex_grow_linestr(SvCUR(PL_parser->linestr)+1+len+highhalf);
957             bufptr = PL_parser->bufptr;
958             Move(bufptr, bufptr+len+highhalf, PL_parser->bufend+1-bufptr, char);
959             SvCUR_set(PL_parser->linestr,
960                 SvCUR(PL_parser->linestr) + len+highhalf);
961             PL_parser->bufend += len+highhalf;
962             for (p = pv; p != e; p++) {
963                 U8 c = (U8)*p;
964                 if (c & 0x80) {
965                     *bufptr++ = (char)(0xc0 | (c >> 6));
966                     *bufptr++ = (char)(0x80 | (c & 0x3f));
967                 } else {
968                     *bufptr++ = (char)c;
969                 }
970             }
971         }
972     } else {
973         if (flags & LEX_STUFF_UTF8) {
974             STRLEN highhalf = 0;
975             const char *p, *e = pv+len;
976             for (p = pv; p != e; p++) {
977                 U8 c = (U8)*p;
978                 if (c >= 0xc4) {
979                     Perl_croak(aTHX_ "Lexing code attempted to stuff "
980                                 "non-Latin-1 character into Latin-1 input");
981                 } else if (c >= 0xc2 && p+1 != e &&
982                             (((U8)p[1]) & 0xc0) == 0x80) {
983                     p++;
984                     highhalf++;
985                 } else if (c >= 0x80) {
986                     /* malformed UTF-8 */
987                     ENTER;
988                     SAVESPTR(PL_warnhook);
989                     PL_warnhook = PERL_WARNHOOK_FATAL;
990                     utf8n_to_uvuni((U8*)p, e-p, NULL, 0);
991                     LEAVE;
992                 }
993             }
994             if (!highhalf)
995                 goto plain_copy;
996             lex_grow_linestr(SvCUR(PL_parser->linestr)+1+len-highhalf);
997             bufptr = PL_parser->bufptr;
998             Move(bufptr, bufptr+len-highhalf, PL_parser->bufend+1-bufptr, char);
999             SvCUR_set(PL_parser->linestr,
1000                 SvCUR(PL_parser->linestr) + len-highhalf);
1001             PL_parser->bufend += len-highhalf;
1002             for (p = pv; p != e; p++) {
1003                 U8 c = (U8)*p;
1004                 if (c & 0x80) {
1005                     *bufptr++ = (char)(((c & 0x3) << 6) | (p[1] & 0x3f));
1006                     p++;
1007                 } else {
1008                     *bufptr++ = (char)c;
1009                 }
1010             }
1011         } else {
1012             plain_copy:
1013             lex_grow_linestr(SvCUR(PL_parser->linestr)+1+len);
1014             bufptr = PL_parser->bufptr;
1015             Move(bufptr, bufptr+len, PL_parser->bufend+1-bufptr, char);
1016             SvCUR_set(PL_parser->linestr, SvCUR(PL_parser->linestr) + len);
1017             PL_parser->bufend += len;
1018             Copy(pv, bufptr, len, char);
1019         }
1020     }
1021 }
1022
1023 /*
1024 =for apidoc Amx|void|lex_stuff_sv|SV *sv|U32 flags
1025
1026 Insert characters into the lexer buffer (L</PL_parser-E<gt>linestr>),
1027 immediately after the current lexing point (L</PL_parser-E<gt>bufptr>),
1028 reallocating the buffer if necessary.  This means that lexing code that
1029 runs later will see the characters as if they had appeared in the input.
1030 It is not recommended to do this as part of normal parsing, and most
1031 uses of this facility run the risk of the inserted characters being
1032 interpreted in an unintended manner.
1033
1034 The string to be inserted is the string value of I<sv>.  The characters
1035 are recoded for the lexer buffer, according to how the buffer is currently
1036 being interpreted (L</lex_bufutf8>).  If a string to be interpreted is
1037 not already a Perl scalar, the L</lex_stuff_pvn> function avoids the
1038 need to construct a scalar.
1039
1040 =cut
1041 */
1042
1043 void
1044 Perl_lex_stuff_sv(pTHX_ SV *sv, U32 flags)
1045 {
1046     char *pv;
1047     STRLEN len;
1048     PERL_ARGS_ASSERT_LEX_STUFF_SV;
1049     if (flags)
1050         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_stuff_sv");
1051     pv = SvPV(sv, len);
1052     lex_stuff_pvn(pv, len, flags | (SvUTF8(sv) ? LEX_STUFF_UTF8 : 0));
1053 }
1054
1055 /*
1056 =for apidoc Amx|void|lex_unstuff|char *ptr
1057
1058 Discards text about to be lexed, from L</PL_parser-E<gt>bufptr> up to
1059 I<ptr>.  Text following I<ptr> will be moved, and the buffer shortened.
1060 This hides the discarded text from any lexing code that runs later,
1061 as if the text had never appeared.
1062
1063 This is not the normal way to consume lexed text.  For that, use
1064 L</lex_read_to>.
1065
1066 =cut
1067 */
1068
1069 void
1070 Perl_lex_unstuff(pTHX_ char *ptr)
1071 {
1072     char *buf, *bufend;
1073     STRLEN unstuff_len;
1074     PERL_ARGS_ASSERT_LEX_UNSTUFF;
1075     buf = PL_parser->bufptr;
1076     if (ptr < buf)
1077         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_unstuff");
1078     if (ptr == buf)
1079         return;
1080     bufend = PL_parser->bufend;
1081     if (ptr > bufend)
1082         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_unstuff");
1083     unstuff_len = ptr - buf;
1084     Move(ptr, buf, bufend+1-ptr, char);
1085     SvCUR_set(PL_parser->linestr, SvCUR(PL_parser->linestr) - unstuff_len);
1086     PL_parser->bufend = bufend - unstuff_len;
1087 }
1088
1089 /*
1090 =for apidoc Amx|void|lex_read_to|char *ptr
1091
1092 Consume text in the lexer buffer, from L</PL_parser-E<gt>bufptr> up
1093 to I<ptr>.  This advances L</PL_parser-E<gt>bufptr> to match I<ptr>,
1094 performing the correct bookkeeping whenever a newline character is passed.
1095 This is the normal way to consume lexed text.
1096
1097 Interpretation of the buffer's octets can be abstracted out by
1098 using the slightly higher-level functions L</lex_peek_unichar> and
1099 L</lex_read_unichar>.
1100
1101 =cut
1102 */
1103
1104 void
1105 Perl_lex_read_to(pTHX_ char *ptr)
1106 {
1107     char *s;
1108     PERL_ARGS_ASSERT_LEX_READ_TO;
1109     s = PL_parser->bufptr;
1110     if (ptr < s || ptr > PL_parser->bufend)
1111         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_read_to");
1112     for (; s != ptr; s++)
1113         if (*s == '\n') {
1114             CopLINE_inc(PL_curcop);
1115             PL_parser->linestart = s+1;
1116         }
1117     PL_parser->bufptr = ptr;
1118 }
1119
1120 /*
1121 =for apidoc Amx|void|lex_discard_to|char *ptr
1122
1123 Discards the first part of the L</PL_parser-E<gt>linestr> buffer,
1124 up to I<ptr>.  The remaining content of the buffer will be moved, and
1125 all pointers into the buffer updated appropriately.  I<ptr> must not
1126 be later in the buffer than the position of L</PL_parser-E<gt>bufptr>:
1127 it is not permitted to discard text that has yet to be lexed.
1128
1129 Normally it is not necessarily to do this directly, because it suffices to
1130 use the implicit discarding behaviour of L</lex_next_chunk> and things
1131 based on it.  However, if a token stretches across multiple lines,
1132 and the lexing code has kept multiple lines of text in the buffer for
1133 that purpose, then after completion of the token it would be wise to
1134 explicitly discard the now-unneeded earlier lines, to avoid future
1135 multi-line tokens growing the buffer without bound.
1136
1137 =cut
1138 */
1139
1140 void
1141 Perl_lex_discard_to(pTHX_ char *ptr)
1142 {
1143     char *buf;
1144     STRLEN discard_len;
1145     PERL_ARGS_ASSERT_LEX_DISCARD_TO;
1146     buf = SvPVX(PL_parser->linestr);
1147     if (ptr < buf)
1148         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_discard_to");
1149     if (ptr == buf)
1150         return;
1151     if (ptr > PL_parser->bufptr)
1152         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_discard_to");
1153     discard_len = ptr - buf;
1154     if (PL_parser->oldbufptr < ptr)
1155         PL_parser->oldbufptr = ptr;
1156     if (PL_parser->oldoldbufptr < ptr)
1157         PL_parser->oldoldbufptr = ptr;
1158     if (PL_parser->last_uni && PL_parser->last_uni < ptr)
1159         PL_parser->last_uni = NULL;
1160     if (PL_parser->last_lop && PL_parser->last_lop < ptr)
1161         PL_parser->last_lop = NULL;
1162     Move(ptr, buf, PL_parser->bufend+1-ptr, char);
1163     SvCUR_set(PL_parser->linestr, SvCUR(PL_parser->linestr) - discard_len);
1164     PL_parser->bufend -= discard_len;
1165     PL_parser->bufptr -= discard_len;
1166     PL_parser->oldbufptr -= discard_len;
1167     PL_parser->oldoldbufptr -= discard_len;
1168     if (PL_parser->last_uni)
1169         PL_parser->last_uni -= discard_len;
1170     if (PL_parser->last_lop)
1171         PL_parser->last_lop -= discard_len;
1172 }
1173
1174 /*
1175 =for apidoc Amx|bool|lex_next_chunk|U32 flags
1176
1177 Reads in the next chunk of text to be lexed, appending it to
1178 L</PL_parser-E<gt>linestr>.  This should be called when lexing code has
1179 looked to the end of the current chunk and wants to know more.  It is
1180 usual, but not necessary, for lexing to have consumed the entirety of
1181 the current chunk at this time.
1182
1183 If L</PL_parser-E<gt>bufptr> is pointing to the very end of the current
1184 chunk (i.e., the current chunk has been entirely consumed), normally the
1185 current chunk will be discarded at the same time that the new chunk is
1186 read in.  If I<flags> includes C<LEX_KEEP_PREVIOUS>, the current chunk
1187 will not be discarded.  If the current chunk has not been entirely
1188 consumed, then it will not be discarded regardless of the flag.
1189
1190 Returns true if some new text was added to the buffer, or false if the
1191 buffer has reached the end of the input text.
1192
1193 =cut
1194 */
1195
1196 #define LEX_FAKE_EOF 0x80000000
1197
1198 bool
1199 Perl_lex_next_chunk(pTHX_ U32 flags)
1200 {
1201     SV *linestr;
1202     char *buf;
1203     STRLEN old_bufend_pos, new_bufend_pos;
1204     STRLEN bufptr_pos, oldbufptr_pos, oldoldbufptr_pos;
1205     STRLEN linestart_pos, last_uni_pos, last_lop_pos;
1206     bool got_some_for_debugger = 0;
1207     bool got_some;
1208     if (flags & ~(LEX_KEEP_PREVIOUS|LEX_FAKE_EOF))
1209         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_next_chunk");
1210     linestr = PL_parser->linestr;
1211     buf = SvPVX(linestr);
1212     if (!(flags & LEX_KEEP_PREVIOUS) &&
1213             PL_parser->bufptr == PL_parser->bufend) {
1214         old_bufend_pos = bufptr_pos = oldbufptr_pos = oldoldbufptr_pos = 0;
1215         linestart_pos = 0;
1216         if (PL_parser->last_uni != PL_parser->bufend)
1217             PL_parser->last_uni = NULL;
1218         if (PL_parser->last_lop != PL_parser->bufend)
1219             PL_parser->last_lop = NULL;
1220         last_uni_pos = last_lop_pos = 0;
1221         *buf = 0;
1222         SvCUR(linestr) = 0;
1223     } else {
1224         old_bufend_pos = PL_parser->bufend - buf;
1225         bufptr_pos = PL_parser->bufptr - buf;
1226         oldbufptr_pos = PL_parser->oldbufptr - buf;
1227         oldoldbufptr_pos = PL_parser->oldoldbufptr - buf;
1228         linestart_pos = PL_parser->linestart - buf;
1229         last_uni_pos = PL_parser->last_uni ? PL_parser->last_uni - buf : 0;
1230         last_lop_pos = PL_parser->last_lop ? PL_parser->last_lop - buf : 0;
1231     }
1232     if (flags & LEX_FAKE_EOF) {
1233         goto eof;
1234     } else if (!PL_parser->rsfp) {
1235         got_some = 0;
1236     } else if (filter_gets(linestr, old_bufend_pos)) {
1237         got_some = 1;
1238         got_some_for_debugger = 1;
1239     } else {
1240         if (!SvPOK(linestr))   /* can get undefined by filter_gets */
1241             sv_setpvs(linestr, "");
1242         eof:
1243         /* End of real input.  Close filehandle (unless it was STDIN),
1244          * then add implicit termination.
1245          */
1246         if ((PerlIO*)PL_parser->rsfp == PerlIO_stdin())
1247             PerlIO_clearerr(PL_parser->rsfp);
1248         else if (PL_parser->rsfp)
1249             (void)PerlIO_close(PL_parser->rsfp);
1250         PL_parser->rsfp = NULL;
1251         PL_doextract = FALSE;
1252 #ifdef PERL_MAD
1253         if (PL_madskills && !PL_in_eval && (PL_minus_p || PL_minus_n))
1254             PL_faketokens = 1;
1255 #endif
1256         if (!PL_in_eval && PL_minus_p) {
1257             sv_catpvs(linestr,
1258                 /*{*/";}continue{print or die qq(-p destination: $!\\n);}");
1259             PL_minus_n = PL_minus_p = 0;
1260         } else if (!PL_in_eval && PL_minus_n) {
1261             sv_catpvs(linestr, /*{*/";}");
1262             PL_minus_n = 0;
1263         } else
1264             sv_catpvs(linestr, ";");
1265         got_some = 1;
1266     }
1267     buf = SvPVX(linestr);
1268     new_bufend_pos = SvCUR(linestr);
1269     PL_parser->bufend = buf + new_bufend_pos;
1270     PL_parser->bufptr = buf + bufptr_pos;
1271     PL_parser->oldbufptr = buf + oldbufptr_pos;
1272     PL_parser->oldoldbufptr = buf + oldoldbufptr_pos;
1273     PL_parser->linestart = buf + linestart_pos;
1274     if (PL_parser->last_uni)
1275         PL_parser->last_uni = buf + last_uni_pos;
1276     if (PL_parser->last_lop)
1277         PL_parser->last_lop = buf + last_lop_pos;
1278     if (got_some_for_debugger && (PERLDB_LINE || PERLDB_SAVESRC) &&
1279             PL_curstash != PL_debstash) {
1280         /* debugger active and we're not compiling the debugger code,
1281          * so store the line into the debugger's array of lines
1282          */
1283         update_debugger_info(NULL, buf+old_bufend_pos,
1284             new_bufend_pos-old_bufend_pos);
1285     }
1286     return got_some;
1287 }
1288
1289 /*
1290 =for apidoc Amx|I32|lex_peek_unichar|U32 flags
1291
1292 Looks ahead one (Unicode) character in the text currently being lexed.
1293 Returns the codepoint (unsigned integer value) of the next character,
1294 or -1 if lexing has reached the end of the input text.  To consume the
1295 peeked character, use L</lex_read_unichar>.
1296
1297 If the next character is in (or extends into) the next chunk of input
1298 text, the next chunk will be read in.  Normally the current chunk will be
1299 discarded at the same time, but if I<flags> includes C<LEX_KEEP_PREVIOUS>
1300 then the current chunk will not be discarded.
1301
1302 If the input is being interpreted as UTF-8 and a UTF-8 encoding error
1303 is encountered, an exception is generated.
1304
1305 =cut
1306 */
1307
1308 I32
1309 Perl_lex_peek_unichar(pTHX_ U32 flags)
1310 {
1311     dVAR;
1312     char *s, *bufend;
1313     if (flags & ~(LEX_KEEP_PREVIOUS))
1314         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_peek_unichar");
1315     s = PL_parser->bufptr;
1316     bufend = PL_parser->bufend;
1317     if (UTF) {
1318         U8 head;
1319         I32 unichar;
1320         STRLEN len, retlen;
1321         if (s == bufend) {
1322             if (!lex_next_chunk(flags))
1323                 return -1;
1324             s = PL_parser->bufptr;
1325             bufend = PL_parser->bufend;
1326         }
1327         head = (U8)*s;
1328         if (!(head & 0x80))
1329             return head;
1330         if (head & 0x40) {
1331             len = PL_utf8skip[head];
1332             while ((STRLEN)(bufend-s) < len) {
1333                 if (!lex_next_chunk(flags | LEX_KEEP_PREVIOUS))
1334                     break;
1335                 s = PL_parser->bufptr;
1336                 bufend = PL_parser->bufend;
1337             }
1338         }
1339         unichar = utf8n_to_uvuni((U8*)s, bufend-s, &retlen, UTF8_CHECK_ONLY);
1340         if (retlen == (STRLEN)-1) {
1341             /* malformed UTF-8 */
1342             ENTER;
1343             SAVESPTR(PL_warnhook);
1344             PL_warnhook = PERL_WARNHOOK_FATAL;
1345             utf8n_to_uvuni((U8*)s, bufend-s, NULL, 0);
1346             LEAVE;
1347         }
1348         return unichar;
1349     } else {
1350         if (s == bufend) {
1351             if (!lex_next_chunk(flags))
1352                 return -1;
1353             s = PL_parser->bufptr;
1354         }
1355         return (U8)*s;
1356     }
1357 }
1358
1359 /*
1360 =for apidoc Amx|I32|lex_read_unichar|U32 flags
1361
1362 Reads the next (Unicode) character in the text currently being lexed.
1363 Returns the codepoint (unsigned integer value) of the character read,
1364 and moves L</PL_parser-E<gt>bufptr> past the character, or returns -1
1365 if lexing has reached the end of the input text.  To non-destructively
1366 examine the next character, use L</lex_peek_unichar> instead.
1367
1368 If the next character is in (or extends into) the next chunk of input
1369 text, the next chunk will be read in.  Normally the current chunk will be
1370 discarded at the same time, but if I<flags> includes C<LEX_KEEP_PREVIOUS>
1371 then the current chunk will not be discarded.
1372
1373 If the input is being interpreted as UTF-8 and a UTF-8 encoding error
1374 is encountered, an exception is generated.
1375
1376 =cut
1377 */
1378
1379 I32
1380 Perl_lex_read_unichar(pTHX_ U32 flags)
1381 {
1382     I32 c;
1383     if (flags & ~(LEX_KEEP_PREVIOUS))
1384         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_read_unichar");
1385     c = lex_peek_unichar(flags);
1386     if (c != -1) {
1387         if (c == '\n')
1388             CopLINE_inc(PL_curcop);
1389         PL_parser->bufptr += UTF8SKIP(PL_parser->bufptr);
1390     }
1391     return c;
1392 }
1393
1394 /*
1395 =for apidoc Amx|void|lex_read_space|U32 flags
1396
1397 Reads optional spaces, in Perl style, in the text currently being
1398 lexed.  The spaces may include ordinary whitespace characters and
1399 Perl-style comments.  C<#line> directives are processed if encountered.
1400 L</PL_parser-E<gt>bufptr> is moved past the spaces, so that it points
1401 at a non-space character (or the end of the input text).
1402
1403 If spaces extend into the next chunk of input text, the next chunk will
1404 be read in.  Normally the current chunk will be discarded at the same
1405 time, but if I<flags> includes C<LEX_KEEP_PREVIOUS> then the current
1406 chunk will not be discarded.
1407
1408 =cut
1409 */
1410
1411 #define LEX_NO_NEXT_CHUNK 0x80000000
1412
1413 void
1414 Perl_lex_read_space(pTHX_ U32 flags)
1415 {
1416     char *s, *bufend;
1417     bool need_incline = 0;
1418     if (flags & ~(LEX_KEEP_PREVIOUS|LEX_NO_NEXT_CHUNK))
1419         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_read_space");
1420 #ifdef PERL_MAD
1421     if (PL_skipwhite) {
1422         sv_free(PL_skipwhite);
1423         PL_skipwhite = NULL;
1424     }
1425     if (PL_madskills)
1426         PL_skipwhite = newSVpvs("");
1427 #endif /* PERL_MAD */
1428     s = PL_parser->bufptr;
1429     bufend = PL_parser->bufend;
1430     while (1) {
1431         char c = *s;
1432         if (c == '#') {
1433             do {
1434                 c = *++s;
1435             } while (!(c == '\n' || (c == 0 && s == bufend)));
1436         } else if (c == '\n') {
1437             s++;
1438             PL_parser->linestart = s;
1439             if (s == bufend)
1440                 need_incline = 1;
1441             else
1442                 incline(s);
1443         } else if (isSPACE(c)) {
1444             s++;
1445         } else if (c == 0 && s == bufend) {
1446             bool got_more;
1447 #ifdef PERL_MAD
1448             if (PL_madskills)
1449                 sv_catpvn(PL_skipwhite, PL_parser->bufptr, s-PL_parser->bufptr);
1450 #endif /* PERL_MAD */
1451             if (flags & LEX_NO_NEXT_CHUNK)
1452                 break;
1453             PL_parser->bufptr = s;
1454             CopLINE_inc(PL_curcop);
1455             got_more = lex_next_chunk(flags);
1456             CopLINE_dec(PL_curcop);
1457             s = PL_parser->bufptr;
1458             bufend = PL_parser->bufend;
1459             if (!got_more)
1460                 break;
1461             if (need_incline && PL_parser->rsfp) {
1462                 incline(s);
1463                 need_incline = 0;
1464             }
1465         } else {
1466             break;
1467         }
1468     }
1469 #ifdef PERL_MAD
1470     if (PL_madskills)
1471         sv_catpvn(PL_skipwhite, PL_parser->bufptr, s-PL_parser->bufptr);
1472 #endif /* PERL_MAD */
1473     PL_parser->bufptr = s;
1474 }
1475
1476 /*
1477  * S_incline
1478  * This subroutine has nothing to do with tilting, whether at windmills
1479  * or pinball tables.  Its name is short for "increment line".  It
1480  * increments the current line number in CopLINE(PL_curcop) and checks
1481  * to see whether the line starts with a comment of the form
1482  *    # line 500 "foo.pm"
1483  * If so, it sets the current line number and file to the values in the comment.
1484  */
1485
1486 STATIC void
1487 S_incline(pTHX_ const char *s)
1488 {
1489     dVAR;
1490     const char *t;
1491     const char *n;
1492     const char *e;
1493
1494     PERL_ARGS_ASSERT_INCLINE;
1495
1496     CopLINE_inc(PL_curcop);
1497     if (*s++ != '#')
1498         return;
1499     while (SPACE_OR_TAB(*s))
1500         s++;
1501     if (strnEQ(s, "line", 4))
1502         s += 4;
1503     else
1504         return;
1505     if (SPACE_OR_TAB(*s))
1506         s++;
1507     else
1508         return;
1509     while (SPACE_OR_TAB(*s))
1510         s++;
1511     if (!isDIGIT(*s))
1512         return;
1513
1514     n = s;
1515     while (isDIGIT(*s))
1516         s++;
1517     if (!SPACE_OR_TAB(*s) && *s != '\r' && *s != '\n' && *s != '\0')
1518         return;
1519     while (SPACE_OR_TAB(*s))
1520         s++;
1521     if (*s == '"' && (t = strchr(s+1, '"'))) {
1522         s++;
1523         e = t + 1;
1524     }
1525     else {
1526         t = s;
1527         while (!isSPACE(*t))
1528             t++;
1529         e = t;
1530     }
1531     while (SPACE_OR_TAB(*e) || *e == '\r' || *e == '\f')
1532         e++;
1533     if (*e != '\n' && *e != '\0')
1534         return;         /* false alarm */
1535
1536     if (t - s > 0) {
1537         const STRLEN len = t - s;
1538 #ifndef USE_ITHREADS
1539         SV *const temp_sv = CopFILESV(PL_curcop);
1540         const char *cf;
1541         STRLEN tmplen;
1542
1543         if (temp_sv) {
1544             cf = SvPVX(temp_sv);
1545             tmplen = SvCUR(temp_sv);
1546         } else {
1547             cf = NULL;
1548             tmplen = 0;
1549         }
1550
1551         if (tmplen > 7 && strnEQ(cf, "(eval ", 6)) {
1552             /* must copy *{"::_<(eval N)[oldfilename:L]"}
1553              * to *{"::_<newfilename"} */
1554             /* However, the long form of evals is only turned on by the
1555                debugger - usually they're "(eval %lu)" */
1556             char smallbuf[128];
1557             char *tmpbuf;
1558             GV **gvp;
1559             STRLEN tmplen2 = len;
1560             if (tmplen + 2 <= sizeof smallbuf)
1561                 tmpbuf = smallbuf;
1562             else
1563                 Newx(tmpbuf, tmplen + 2, char);
1564             tmpbuf[0] = '_';
1565             tmpbuf[1] = '<';
1566             memcpy(tmpbuf + 2, cf, tmplen);
1567             tmplen += 2;
1568             gvp = (GV**)hv_fetch(PL_defstash, tmpbuf, tmplen, FALSE);
1569             if (gvp) {
1570                 char *tmpbuf2;
1571                 GV *gv2;
1572
1573                 if (tmplen2 + 2 <= sizeof smallbuf)
1574                     tmpbuf2 = smallbuf;
1575                 else
1576                     Newx(tmpbuf2, tmplen2 + 2, char);
1577
1578                 if (tmpbuf2 != smallbuf || tmpbuf != smallbuf) {
1579                     /* Either they malloc'd it, or we malloc'd it,
1580                        so no prefix is present in ours.  */
1581                     tmpbuf2[0] = '_';
1582                     tmpbuf2[1] = '<';
1583                 }
1584
1585                 memcpy(tmpbuf2 + 2, s, tmplen2);
1586                 tmplen2 += 2;
1587
1588                 gv2 = *(GV**)hv_fetch(PL_defstash, tmpbuf2, tmplen2, TRUE);
1589                 if (!isGV(gv2)) {
1590                     gv_init(gv2, PL_defstash, tmpbuf2, tmplen2, FALSE);
1591                     /* adjust ${"::_<newfilename"} to store the new file name */
1592                     GvSV(gv2) = newSVpvn(tmpbuf2 + 2, tmplen2 - 2);
1593                     GvHV(gv2) = MUTABLE_HV(SvREFCNT_inc(GvHV(*gvp)));
1594                     GvAV(gv2) = MUTABLE_AV(SvREFCNT_inc(GvAV(*gvp)));
1595                 }
1596
1597                 if (tmpbuf2 != smallbuf) Safefree(tmpbuf2);
1598             }
1599             if (tmpbuf != smallbuf) Safefree(tmpbuf);
1600         }
1601 #endif
1602         CopFILE_free(PL_curcop);
1603         CopFILE_setn(PL_curcop, s, len);
1604     }
1605     CopLINE_set(PL_curcop, atoi(n)-1);
1606 }
1607
1608 #ifdef PERL_MAD
1609 /* skip space before PL_thistoken */
1610
1611 STATIC char *
1612 S_skipspace0(pTHX_ register char *s)
1613 {
1614     PERL_ARGS_ASSERT_SKIPSPACE0;
1615
1616     s = skipspace(s);
1617     if (!PL_madskills)
1618         return s;
1619     if (PL_skipwhite) {
1620         if (!PL_thiswhite)
1621             PL_thiswhite = newSVpvs("");
1622         sv_catsv(PL_thiswhite, PL_skipwhite);
1623         sv_free(PL_skipwhite);
1624         PL_skipwhite = 0;
1625     }
1626     PL_realtokenstart = s - SvPVX(PL_linestr);
1627     return s;
1628 }
1629
1630 /* skip space after PL_thistoken */
1631
1632 STATIC char *
1633 S_skipspace1(pTHX_ register char *s)
1634 {
1635     const char *start = s;
1636     I32 startoff = start - SvPVX(PL_linestr);
1637
1638     PERL_ARGS_ASSERT_SKIPSPACE1;
1639
1640     s = skipspace(s);
1641     if (!PL_madskills)
1642         return s;
1643     start = SvPVX(PL_linestr) + startoff;
1644     if (!PL_thistoken && PL_realtokenstart >= 0) {
1645         const char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
1646         PL_thistoken = newSVpvn(tstart, start - tstart);
1647     }
1648     PL_realtokenstart = -1;
1649     if (PL_skipwhite) {
1650         if (!PL_nextwhite)
1651             PL_nextwhite = newSVpvs("");
1652         sv_catsv(PL_nextwhite, PL_skipwhite);
1653         sv_free(PL_skipwhite);
1654         PL_skipwhite = 0;
1655     }
1656     return s;
1657 }
1658
1659 STATIC char *
1660 S_skipspace2(pTHX_ register char *s, SV **svp)
1661 {
1662     char *start;
1663     const I32 bufptroff = PL_bufptr - SvPVX(PL_linestr);
1664     const I32 startoff = s - SvPVX(PL_linestr);
1665
1666     PERL_ARGS_ASSERT_SKIPSPACE2;
1667
1668     s = skipspace(s);
1669     PL_bufptr = SvPVX(PL_linestr) + bufptroff;
1670     if (!PL_madskills || !svp)
1671         return s;
1672     start = SvPVX(PL_linestr) + startoff;
1673     if (!PL_thistoken && PL_realtokenstart >= 0) {
1674         char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
1675         PL_thistoken = newSVpvn(tstart, start - tstart);
1676         PL_realtokenstart = -1;
1677     }
1678     if (PL_skipwhite) {
1679         if (!*svp)
1680             *svp = newSVpvs("");
1681         sv_setsv(*svp, PL_skipwhite);
1682         sv_free(PL_skipwhite);
1683         PL_skipwhite = 0;
1684     }
1685     
1686     return s;
1687 }
1688 #endif
1689
1690 STATIC void
1691 S_update_debugger_info(pTHX_ SV *orig_sv, const char *const buf, STRLEN len)
1692 {
1693     AV *av = CopFILEAVx(PL_curcop);
1694     if (av) {
1695         SV * const sv = newSV_type(SVt_PVMG);
1696         if (orig_sv)
1697             sv_setsv(sv, orig_sv);
1698         else
1699             sv_setpvn(sv, buf, len);
1700         (void)SvIOK_on(sv);
1701         SvIV_set(sv, 0);
1702         av_store(av, (I32)CopLINE(PL_curcop), sv);
1703     }
1704 }
1705
1706 /*
1707  * S_skipspace
1708  * Called to gobble the appropriate amount and type of whitespace.
1709  * Skips comments as well.
1710  */
1711
1712 STATIC char *
1713 S_skipspace(pTHX_ register char *s)
1714 {
1715 #ifdef PERL_MAD
1716     char *start = s;
1717 #endif /* PERL_MAD */
1718     PERL_ARGS_ASSERT_SKIPSPACE;
1719 #ifdef PERL_MAD
1720     if (PL_skipwhite) {
1721         sv_free(PL_skipwhite);
1722         PL_skipwhite = NULL;
1723     }
1724 #endif /* PERL_MAD */
1725     if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
1726         while (s < PL_bufend && SPACE_OR_TAB(*s))
1727             s++;
1728     } else {
1729         STRLEN bufptr_pos = PL_bufptr - SvPVX(PL_linestr);
1730         PL_bufptr = s;
1731         lex_read_space(LEX_KEEP_PREVIOUS |
1732                 (PL_sublex_info.sub_inwhat || PL_lex_state == LEX_FORMLINE ?
1733                     LEX_NO_NEXT_CHUNK : 0));
1734         s = PL_bufptr;
1735         PL_bufptr = SvPVX(PL_linestr) + bufptr_pos;
1736         if (PL_linestart > PL_bufptr)
1737             PL_bufptr = PL_linestart;
1738         return s;
1739     }
1740 #ifdef PERL_MAD
1741     if (PL_madskills)
1742         PL_skipwhite = newSVpvn(start, s-start);
1743 #endif /* PERL_MAD */
1744     return s;
1745 }
1746
1747 /*
1748  * S_check_uni
1749  * Check the unary operators to ensure there's no ambiguity in how they're
1750  * used.  An ambiguous piece of code would be:
1751  *     rand + 5
1752  * This doesn't mean rand() + 5.  Because rand() is a unary operator,
1753  * the +5 is its argument.
1754  */
1755
1756 STATIC void
1757 S_check_uni(pTHX)
1758 {
1759     dVAR;
1760     const char *s;
1761     const char *t;
1762
1763     if (PL_oldoldbufptr != PL_last_uni)
1764         return;
1765     while (isSPACE(*PL_last_uni))
1766         PL_last_uni++;
1767     s = PL_last_uni;
1768     while (isALNUM_lazy_if(s,UTF) || *s == '-')
1769         s++;
1770     if ((t = strchr(s, '(')) && t < PL_bufptr)
1771         return;
1772
1773     Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
1774                      "Warning: Use of \"%.*s\" without parentheses is ambiguous",
1775                      (int)(s - PL_last_uni), PL_last_uni);
1776 }
1777
1778 /*
1779  * LOP : macro to build a list operator.  Its behaviour has been replaced
1780  * with a subroutine, S_lop() for which LOP is just another name.
1781  */
1782
1783 #define LOP(f,x) return lop(f,x,s)
1784
1785 /*
1786  * S_lop
1787  * Build a list operator (or something that might be one).  The rules:
1788  *  - if we have a next token, then it's a list operator [why?]
1789  *  - if the next thing is an opening paren, then it's a function
1790  *  - else it's a list operator
1791  */
1792
1793 STATIC I32
1794 S_lop(pTHX_ I32 f, int x, char *s)
1795 {
1796     dVAR;
1797
1798     PERL_ARGS_ASSERT_LOP;
1799
1800     pl_yylval.ival = f;
1801     CLINE;
1802     PL_expect = x;
1803     PL_bufptr = s;
1804     PL_last_lop = PL_oldbufptr;
1805     PL_last_lop_op = (OPCODE)f;
1806 #ifdef PERL_MAD
1807     if (PL_lasttoke)
1808         return REPORT(LSTOP);
1809 #else
1810     if (PL_nexttoke)
1811         return REPORT(LSTOP);
1812 #endif
1813     if (*s == '(')
1814         return REPORT(FUNC);
1815     s = PEEKSPACE(s);
1816     if (*s == '(')
1817         return REPORT(FUNC);
1818     else
1819         return REPORT(LSTOP);
1820 }
1821
1822 #ifdef PERL_MAD
1823  /*
1824  * S_start_force
1825  * Sets up for an eventual force_next().  start_force(0) basically does
1826  * an unshift, while start_force(-1) does a push.  yylex removes items
1827  * on the "pop" end.
1828  */
1829
1830 STATIC void
1831 S_start_force(pTHX_ int where)
1832 {
1833     int i;
1834
1835     if (where < 0)      /* so people can duplicate start_force(PL_curforce) */
1836         where = PL_lasttoke;
1837     assert(PL_curforce < 0 || PL_curforce == where);
1838     if (PL_curforce != where) {
1839         for (i = PL_lasttoke; i > where; --i) {
1840             PL_nexttoke[i] = PL_nexttoke[i-1];
1841         }
1842         PL_lasttoke++;
1843     }
1844     if (PL_curforce < 0)        /* in case of duplicate start_force() */
1845         Zero(&PL_nexttoke[where], 1, NEXTTOKE);
1846     PL_curforce = where;
1847     if (PL_nextwhite) {
1848         if (PL_madskills)
1849             curmad('^', newSVpvs(""));
1850         CURMAD('_', PL_nextwhite);
1851     }
1852 }
1853
1854 STATIC void
1855 S_curmad(pTHX_ char slot, SV *sv)
1856 {
1857     MADPROP **where;
1858
1859     if (!sv)
1860         return;
1861     if (PL_curforce < 0)
1862         where = &PL_thismad;
1863     else
1864         where = &PL_nexttoke[PL_curforce].next_mad;
1865
1866     if (PL_faketokens)
1867         sv_setpvs(sv, "");
1868     else {
1869         if (!IN_BYTES) {
1870             if (UTF && is_utf8_string((U8*)SvPVX(sv), SvCUR(sv)))
1871                 SvUTF8_on(sv);
1872             else if (PL_encoding) {
1873                 sv_recode_to_utf8(sv, PL_encoding);
1874             }
1875         }
1876     }
1877
1878     /* keep a slot open for the head of the list? */
1879     if (slot != '_' && *where && (*where)->mad_key == '^') {
1880         (*where)->mad_key = slot;
1881         sv_free(MUTABLE_SV(((*where)->mad_val)));
1882         (*where)->mad_val = (void*)sv;
1883     }
1884     else
1885         addmad(newMADsv(slot, sv), where, 0);
1886 }
1887 #else
1888 #  define start_force(where)    NOOP
1889 #  define curmad(slot, sv)      NOOP
1890 #endif
1891
1892 /*
1893  * S_force_next
1894  * When the lexer realizes it knows the next token (for instance,
1895  * it is reordering tokens for the parser) then it can call S_force_next
1896  * to know what token to return the next time the lexer is called.  Caller
1897  * will need to set PL_nextval[] (or PL_nexttoke[].next_val with PERL_MAD),
1898  * and possibly PL_expect to ensure the lexer handles the token correctly.
1899  */
1900
1901 STATIC void
1902 S_force_next(pTHX_ I32 type)
1903 {
1904     dVAR;
1905 #ifdef DEBUGGING
1906     if (DEBUG_T_TEST) {
1907         PerlIO_printf(Perl_debug_log, "### forced token:\n");
1908         tokereport(type, &NEXTVAL_NEXTTOKE);
1909     }
1910 #endif
1911 #ifdef PERL_MAD
1912     if (PL_curforce < 0)
1913         start_force(PL_lasttoke);
1914     PL_nexttoke[PL_curforce].next_type = type;
1915     if (PL_lex_state != LEX_KNOWNEXT)
1916         PL_lex_defer = PL_lex_state;
1917     PL_lex_state = LEX_KNOWNEXT;
1918     PL_lex_expect = PL_expect;
1919     PL_curforce = -1;
1920 #else
1921     PL_nexttype[PL_nexttoke] = type;
1922     PL_nexttoke++;
1923     if (PL_lex_state != LEX_KNOWNEXT) {
1924         PL_lex_defer = PL_lex_state;
1925         PL_lex_expect = PL_expect;
1926         PL_lex_state = LEX_KNOWNEXT;
1927     }
1928 #endif
1929 }
1930
1931 STATIC SV *
1932 S_newSV_maybe_utf8(pTHX_ const char *const start, STRLEN len)
1933 {
1934     dVAR;
1935     SV * const sv = newSVpvn_utf8(start, len,
1936                                   !IN_BYTES
1937                                   && UTF
1938                                   && !is_ascii_string((const U8*)start, len)
1939                                   && is_utf8_string((const U8*)start, len));
1940     return sv;
1941 }
1942
1943 /*
1944  * S_force_word
1945  * When the lexer knows the next thing is a word (for instance, it has
1946  * just seen -> and it knows that the next char is a word char, then
1947  * it calls S_force_word to stick the next word into the PL_nexttoke/val
1948  * lookahead.
1949  *
1950  * Arguments:
1951  *   char *start : buffer position (must be within PL_linestr)
1952  *   int token   : PL_next* will be this type of bare word (e.g., METHOD,WORD)
1953  *   int check_keyword : if true, Perl checks to make sure the word isn't
1954  *       a keyword (do this if the word is a label, e.g. goto FOO)
1955  *   int allow_pack : if true, : characters will also be allowed (require,
1956  *       use, etc. do this)
1957  *   int allow_initial_tick : used by the "sub" lexer only.
1958  */
1959
1960 STATIC char *
1961 S_force_word(pTHX_ register char *start, int token, int check_keyword, int allow_pack, int allow_initial_tick)
1962 {
1963     dVAR;
1964     register char *s;
1965     STRLEN len;
1966
1967     PERL_ARGS_ASSERT_FORCE_WORD;
1968
1969     start = SKIPSPACE1(start);
1970     s = start;
1971     if (isIDFIRST_lazy_if(s,UTF) ||
1972         (allow_pack && *s == ':') ||
1973         (allow_initial_tick && *s == '\'') )
1974     {
1975         s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, allow_pack, &len);
1976         if (check_keyword && keyword(PL_tokenbuf, len, 0))
1977             return start;
1978         start_force(PL_curforce);
1979         if (PL_madskills)
1980             curmad('X', newSVpvn(start,s-start));
1981         if (token == METHOD) {
1982             s = SKIPSPACE1(s);
1983             if (*s == '(')
1984                 PL_expect = XTERM;
1985             else {
1986                 PL_expect = XOPERATOR;
1987             }
1988         }
1989         if (PL_madskills)
1990             curmad('g', newSVpvs( "forced" ));
1991         NEXTVAL_NEXTTOKE.opval
1992             = (OP*)newSVOP(OP_CONST,0,
1993                            S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
1994         NEXTVAL_NEXTTOKE.opval->op_private |= OPpCONST_BARE;
1995         force_next(token);
1996     }
1997     return s;
1998 }
1999
2000 /*
2001  * S_force_ident
2002  * Called when the lexer wants $foo *foo &foo etc, but the program
2003  * text only contains the "foo" portion.  The first argument is a pointer
2004  * to the "foo", and the second argument is the type symbol to prefix.
2005  * Forces the next token to be a "WORD".
2006  * Creates the symbol if it didn't already exist (via gv_fetchpv()).
2007  */
2008
2009 STATIC void
2010 S_force_ident(pTHX_ register const char *s, int kind)
2011 {
2012     dVAR;
2013
2014     PERL_ARGS_ASSERT_FORCE_IDENT;
2015
2016     if (*s) {
2017         const STRLEN len = strlen(s);
2018         OP* const o = (OP*)newSVOP(OP_CONST, 0, newSVpvn(s, len));
2019         start_force(PL_curforce);
2020         NEXTVAL_NEXTTOKE.opval = o;
2021         force_next(WORD);
2022         if (kind) {
2023             o->op_private = OPpCONST_ENTERED;
2024             /* XXX see note in pp_entereval() for why we forgo typo
2025                warnings if the symbol must be introduced in an eval.
2026                GSAR 96-10-12 */
2027             gv_fetchpvn_flags(s, len,
2028                               PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL)
2029                               : GV_ADD,
2030                               kind == '$' ? SVt_PV :
2031                               kind == '@' ? SVt_PVAV :
2032                               kind == '%' ? SVt_PVHV :
2033                               SVt_PVGV
2034                               );
2035         }
2036     }
2037 }
2038
2039 NV
2040 Perl_str_to_version(pTHX_ SV *sv)
2041 {
2042     NV retval = 0.0;
2043     NV nshift = 1.0;
2044     STRLEN len;
2045     const char *start = SvPV_const(sv,len);
2046     const char * const end = start + len;
2047     const bool utf = SvUTF8(sv) ? TRUE : FALSE;
2048
2049     PERL_ARGS_ASSERT_STR_TO_VERSION;
2050
2051     while (start < end) {
2052         STRLEN skip;
2053         UV n;
2054         if (utf)
2055             n = utf8n_to_uvchr((U8*)start, len, &skip, 0);
2056         else {
2057             n = *(U8*)start;
2058             skip = 1;
2059         }
2060         retval += ((NV)n)/nshift;
2061         start += skip;
2062         nshift *= 1000;
2063     }
2064     return retval;
2065 }
2066
2067 /*
2068  * S_force_version
2069  * Forces the next token to be a version number.
2070  * If the next token appears to be an invalid version number, (e.g. "v2b"),
2071  * and if "guessing" is TRUE, then no new token is created (and the caller
2072  * must use an alternative parsing method).
2073  */
2074
2075 STATIC char *
2076 S_force_version(pTHX_ char *s, int guessing)
2077 {
2078     dVAR;
2079     OP *version = NULL;
2080     char *d;
2081 #ifdef PERL_MAD
2082     I32 startoff = s - SvPVX(PL_linestr);
2083 #endif
2084
2085     PERL_ARGS_ASSERT_FORCE_VERSION;
2086
2087     s = SKIPSPACE1(s);
2088
2089     d = s;
2090     if (*d == 'v')
2091         d++;
2092     if (isDIGIT(*d)) {
2093         while (isDIGIT(*d) || *d == '_' || *d == '.')
2094             d++;
2095 #ifdef PERL_MAD
2096         if (PL_madskills) {
2097             start_force(PL_curforce);
2098             curmad('X', newSVpvn(s,d-s));
2099         }
2100 #endif
2101         if (*d == ';' || isSPACE(*d) || *d == '}' || !*d) {
2102             SV *ver;
2103 #ifdef USE_LOCALE_NUMERIC
2104             char *loc = setlocale(LC_NUMERIC, "C");
2105 #endif
2106             s = scan_num(s, &pl_yylval);
2107 #ifdef USE_LOCALE_NUMERIC
2108             setlocale(LC_NUMERIC, loc);
2109 #endif
2110             version = pl_yylval.opval;
2111             ver = cSVOPx(version)->op_sv;
2112             if (SvPOK(ver) && !SvNIOK(ver)) {
2113                 SvUPGRADE(ver, SVt_PVNV);
2114                 SvNV_set(ver, str_to_version(ver));
2115                 SvNOK_on(ver);          /* hint that it is a version */
2116             }
2117         }
2118         else if (guessing) {
2119 #ifdef PERL_MAD
2120             if (PL_madskills) {
2121                 sv_free(PL_nextwhite);  /* let next token collect whitespace */
2122                 PL_nextwhite = 0;
2123                 s = SvPVX(PL_linestr) + startoff;
2124             }
2125 #endif
2126             return s;
2127         }
2128     }
2129
2130 #ifdef PERL_MAD
2131     if (PL_madskills && !version) {
2132         sv_free(PL_nextwhite);  /* let next token collect whitespace */
2133         PL_nextwhite = 0;
2134         s = SvPVX(PL_linestr) + startoff;
2135     }
2136 #endif
2137     /* NOTE: The parser sees the package name and the VERSION swapped */
2138     start_force(PL_curforce);
2139     NEXTVAL_NEXTTOKE.opval = version;
2140     force_next(WORD);
2141
2142     return s;
2143 }
2144
2145 /*
2146  * S_force_strict_version
2147  * Forces the next token to be a version number using strict syntax rules.
2148  */
2149
2150 STATIC char *
2151 S_force_strict_version(pTHX_ char *s)
2152 {
2153     dVAR;
2154     OP *version = NULL;
2155 #ifdef PERL_MAD
2156     I32 startoff = s - SvPVX(PL_linestr);
2157 #endif
2158     const char *errstr = NULL;
2159
2160     PERL_ARGS_ASSERT_FORCE_STRICT_VERSION;
2161
2162     while (isSPACE(*s)) /* leading whitespace */
2163         s++;
2164
2165     if (is_STRICT_VERSION(s,&errstr)) {
2166         SV *ver = newSV(0);
2167         s = (char *)scan_version(s, ver, 0);
2168         version = newSVOP(OP_CONST, 0, ver);
2169     }
2170     else if ( (*s != ';' && *s != '}' ) && (s = SKIPSPACE1(s), (*s != ';' && *s !='}' ))) {
2171         PL_bufptr = s;
2172         if (errstr)
2173             yyerror(errstr); /* version required */
2174         return s;
2175     }
2176
2177 #ifdef PERL_MAD
2178     if (PL_madskills && !version) {
2179         sv_free(PL_nextwhite);  /* let next token collect whitespace */
2180         PL_nextwhite = 0;
2181         s = SvPVX(PL_linestr) + startoff;
2182     }
2183 #endif
2184     /* NOTE: The parser sees the package name and the VERSION swapped */
2185     start_force(PL_curforce);
2186     NEXTVAL_NEXTTOKE.opval = version;
2187     force_next(WORD);
2188
2189     return s;
2190 }
2191
2192 /*
2193  * S_tokeq
2194  * Tokenize a quoted string passed in as an SV.  It finds the next
2195  * chunk, up to end of string or a backslash.  It may make a new
2196  * SV containing that chunk (if HINT_NEW_STRING is on).  It also
2197  * turns \\ into \.
2198  */
2199
2200 STATIC SV *
2201 S_tokeq(pTHX_ SV *sv)
2202 {
2203     dVAR;
2204     register char *s;
2205     register char *send;
2206     register char *d;
2207     STRLEN len = 0;
2208     SV *pv = sv;
2209
2210     PERL_ARGS_ASSERT_TOKEQ;
2211
2212     if (!SvLEN(sv))
2213         goto finish;
2214
2215     s = SvPV_force(sv, len);
2216     if (SvTYPE(sv) >= SVt_PVIV && SvIVX(sv) == -1)
2217         goto finish;
2218     send = s + len;
2219     while (s < send && *s != '\\')
2220         s++;
2221     if (s == send)
2222         goto finish;
2223     d = s;
2224     if ( PL_hints & HINT_NEW_STRING ) {
2225         pv = newSVpvn_flags(SvPVX_const(pv), len, SVs_TEMP | SvUTF8(sv));
2226     }
2227     while (s < send) {
2228         if (*s == '\\') {
2229             if (s + 1 < send && (s[1] == '\\'))
2230                 s++;            /* all that, just for this */
2231         }
2232         *d++ = *s++;
2233     }
2234     *d = '\0';
2235     SvCUR_set(sv, d - SvPVX_const(sv));
2236   finish:
2237     if ( PL_hints & HINT_NEW_STRING )
2238        return new_constant(NULL, 0, "q", sv, pv, "q", 1);
2239     return sv;
2240 }
2241
2242 /*
2243  * Now come three functions related to double-quote context,
2244  * S_sublex_start, S_sublex_push, and S_sublex_done.  They're used when
2245  * converting things like "\u\Lgnat" into ucfirst(lc("gnat")).  They
2246  * interact with PL_lex_state, and create fake ( ... ) argument lists
2247  * to handle functions and concatenation.
2248  * They assume that whoever calls them will be setting up a fake
2249  * join call, because each subthing puts a ',' after it.  This lets
2250  *   "lower \luPpEr"
2251  * become
2252  *  join($, , 'lower ', lcfirst( 'uPpEr', ) ,)
2253  *
2254  * (I'm not sure whether the spurious commas at the end of lcfirst's
2255  * arguments and join's arguments are created or not).
2256  */
2257
2258 /*
2259  * S_sublex_start
2260  * Assumes that pl_yylval.ival is the op we're creating (e.g. OP_LCFIRST).
2261  *
2262  * Pattern matching will set PL_lex_op to the pattern-matching op to
2263  * make (we return THING if pl_yylval.ival is OP_NULL, PMFUNC otherwise).
2264  *
2265  * OP_CONST and OP_READLINE are easy--just make the new op and return.
2266  *
2267  * Everything else becomes a FUNC.
2268  *
2269  * Sets PL_lex_state to LEX_INTERPPUSH unless (ival was OP_NULL or we
2270  * had an OP_CONST or OP_READLINE).  This just sets us up for a
2271  * call to S_sublex_push().
2272  */
2273
2274 STATIC I32
2275 S_sublex_start(pTHX)
2276 {
2277     dVAR;
2278     register const I32 op_type = pl_yylval.ival;
2279
2280     if (op_type == OP_NULL) {
2281         pl_yylval.opval = PL_lex_op;
2282         PL_lex_op = NULL;
2283         return THING;
2284     }
2285     if (op_type == OP_CONST || op_type == OP_READLINE) {
2286         SV *sv = tokeq(PL_lex_stuff);
2287
2288         if (SvTYPE(sv) == SVt_PVIV) {
2289             /* Overloaded constants, nothing fancy: Convert to SVt_PV: */
2290             STRLEN len;
2291             const char * const p = SvPV_const(sv, len);
2292             SV * const nsv = newSVpvn_flags(p, len, SvUTF8(sv));
2293             SvREFCNT_dec(sv);
2294             sv = nsv;
2295         }
2296         pl_yylval.opval = (OP*)newSVOP(op_type, 0, sv);
2297         PL_lex_stuff = NULL;
2298         /* Allow <FH> // "foo" */
2299         if (op_type == OP_READLINE)
2300             PL_expect = XTERMORDORDOR;
2301         return THING;
2302     }
2303     else if (op_type == OP_BACKTICK && PL_lex_op) {
2304         /* readpipe() vas overriden */
2305         cSVOPx(cLISTOPx(cUNOPx(PL_lex_op)->op_first)->op_first->op_sibling)->op_sv = tokeq(PL_lex_stuff);
2306         pl_yylval.opval = PL_lex_op;
2307         PL_lex_op = NULL;
2308         PL_lex_stuff = NULL;
2309         return THING;
2310     }
2311
2312     PL_sublex_info.super_state = PL_lex_state;
2313     PL_sublex_info.sub_inwhat = (U16)op_type;
2314     PL_sublex_info.sub_op = PL_lex_op;
2315     PL_lex_state = LEX_INTERPPUSH;
2316
2317     PL_expect = XTERM;
2318     if (PL_lex_op) {
2319         pl_yylval.opval = PL_lex_op;
2320         PL_lex_op = NULL;
2321         return PMFUNC;
2322     }
2323     else
2324         return FUNC;
2325 }
2326
2327 /*
2328  * S_sublex_push
2329  * Create a new scope to save the lexing state.  The scope will be
2330  * ended in S_sublex_done.  Returns a '(', starting the function arguments
2331  * to the uc, lc, etc. found before.
2332  * Sets PL_lex_state to LEX_INTERPCONCAT.
2333  */
2334
2335 STATIC I32
2336 S_sublex_push(pTHX)
2337 {
2338     dVAR;
2339     ENTER;
2340
2341     PL_lex_state = PL_sublex_info.super_state;
2342     SAVEBOOL(PL_lex_dojoin);
2343     SAVEI32(PL_lex_brackets);
2344     SAVEI32(PL_lex_casemods);
2345     SAVEI32(PL_lex_starts);
2346     SAVEI8(PL_lex_state);
2347     SAVEVPTR(PL_lex_inpat);
2348     SAVEI16(PL_lex_inwhat);
2349     SAVECOPLINE(PL_curcop);
2350     SAVEPPTR(PL_bufptr);
2351     SAVEPPTR(PL_bufend);
2352     SAVEPPTR(PL_oldbufptr);
2353     SAVEPPTR(PL_oldoldbufptr);
2354     SAVEPPTR(PL_last_lop);
2355     SAVEPPTR(PL_last_uni);
2356     SAVEPPTR(PL_linestart);
2357     SAVESPTR(PL_linestr);
2358     SAVEGENERICPV(PL_lex_brackstack);
2359     SAVEGENERICPV(PL_lex_casestack);
2360
2361     PL_linestr = PL_lex_stuff;
2362     PL_lex_stuff = NULL;
2363
2364     PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart
2365         = SvPVX(PL_linestr);
2366     PL_bufend += SvCUR(PL_linestr);
2367     PL_last_lop = PL_last_uni = NULL;
2368     SAVEFREESV(PL_linestr);
2369
2370     PL_lex_dojoin = FALSE;
2371     PL_lex_brackets = 0;
2372     Newx(PL_lex_brackstack, 120, char);
2373     Newx(PL_lex_casestack, 12, char);
2374     PL_lex_casemods = 0;
2375     *PL_lex_casestack = '\0';
2376     PL_lex_starts = 0;
2377     PL_lex_state = LEX_INTERPCONCAT;
2378     CopLINE_set(PL_curcop, (line_t)PL_multi_start);
2379
2380     PL_lex_inwhat = PL_sublex_info.sub_inwhat;
2381     if (PL_lex_inwhat == OP_MATCH || PL_lex_inwhat == OP_QR || PL_lex_inwhat == OP_SUBST)
2382         PL_lex_inpat = PL_sublex_info.sub_op;
2383     else
2384         PL_lex_inpat = NULL;
2385
2386     return '(';
2387 }
2388
2389 /*
2390  * S_sublex_done
2391  * Restores lexer state after a S_sublex_push.
2392  */
2393
2394 STATIC I32
2395 S_sublex_done(pTHX)
2396 {
2397     dVAR;
2398     if (!PL_lex_starts++) {
2399         SV * const sv = newSVpvs("");
2400         if (SvUTF8(PL_linestr))
2401             SvUTF8_on(sv);
2402         PL_expect = XOPERATOR;
2403         pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
2404         return THING;
2405     }
2406
2407     if (PL_lex_casemods) {              /* oops, we've got some unbalanced parens */
2408         PL_lex_state = LEX_INTERPCASEMOD;
2409         return yylex();
2410     }
2411
2412     /* Is there a right-hand side to take care of? (s//RHS/ or tr//RHS/) */
2413     if (PL_lex_repl && (PL_lex_inwhat == OP_SUBST || PL_lex_inwhat == OP_TRANS)) {
2414         PL_linestr = PL_lex_repl;
2415         PL_lex_inpat = 0;
2416         PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
2417         PL_bufend += SvCUR(PL_linestr);
2418         PL_last_lop = PL_last_uni = NULL;
2419         SAVEFREESV(PL_linestr);
2420         PL_lex_dojoin = FALSE;
2421         PL_lex_brackets = 0;
2422         PL_lex_casemods = 0;
2423         *PL_lex_casestack = '\0';
2424         PL_lex_starts = 0;
2425         if (SvEVALED(PL_lex_repl)) {
2426             PL_lex_state = LEX_INTERPNORMAL;
2427             PL_lex_starts++;
2428             /*  we don't clear PL_lex_repl here, so that we can check later
2429                 whether this is an evalled subst; that means we rely on the
2430                 logic to ensure sublex_done() is called again only via the
2431                 branch (in yylex()) that clears PL_lex_repl, else we'll loop */
2432         }
2433         else {
2434             PL_lex_state = LEX_INTERPCONCAT;
2435             PL_lex_repl = NULL;
2436         }
2437         return ',';
2438     }
2439     else {
2440 #ifdef PERL_MAD
2441         if (PL_madskills) {
2442             if (PL_thiswhite) {
2443                 if (!PL_endwhite)
2444                     PL_endwhite = newSVpvs("");
2445                 sv_catsv(PL_endwhite, PL_thiswhite);
2446                 PL_thiswhite = 0;
2447             }
2448             if (PL_thistoken)
2449                 sv_setpvs(PL_thistoken,"");
2450             else
2451                 PL_realtokenstart = -1;
2452         }
2453 #endif
2454         LEAVE;
2455         PL_bufend = SvPVX(PL_linestr);
2456         PL_bufend += SvCUR(PL_linestr);
2457         PL_expect = XOPERATOR;
2458         PL_sublex_info.sub_inwhat = 0;
2459         return ')';
2460     }
2461 }
2462
2463 /*
2464   scan_const
2465
2466   Extracts a pattern, double-quoted string, or transliteration.  This
2467   is terrifying code.
2468
2469   It looks at PL_lex_inwhat and PL_lex_inpat to find out whether it's
2470   processing a pattern (PL_lex_inpat is true), a transliteration
2471   (PL_lex_inwhat == OP_TRANS is true), or a double-quoted string.
2472
2473   Returns a pointer to the character scanned up to. If this is
2474   advanced from the start pointer supplied (i.e. if anything was
2475   successfully parsed), will leave an OP for the substring scanned
2476   in pl_yylval. Caller must intuit reason for not parsing further
2477   by looking at the next characters herself.
2478
2479   In patterns:
2480     backslashes:
2481       constants: \N{NAME} only
2482       case and quoting: \U \Q \E
2483     stops on @ and $, but not for $ as tail anchor
2484
2485   In transliterations:
2486     characters are VERY literal, except for - not at the start or end
2487     of the string, which indicates a range. If the range is in bytes,
2488     scan_const expands the range to the full set of intermediate
2489     characters. If the range is in utf8, the hyphen is replaced with
2490     a certain range mark which will be handled by pmtrans() in op.c.
2491
2492   In double-quoted strings:
2493     backslashes:
2494       double-quoted style: \r and \n
2495       constants: \x31, etc.
2496       deprecated backrefs: \1 (in substitution replacements)
2497       case and quoting: \U \Q \E
2498     stops on @ and $
2499
2500   scan_const does *not* construct ops to handle interpolated strings.
2501   It stops processing as soon as it finds an embedded $ or @ variable
2502   and leaves it to the caller to work out what's going on.
2503
2504   embedded arrays (whether in pattern or not) could be:
2505       @foo, @::foo, @'foo, @{foo}, @$foo, @+, @-.
2506
2507   $ in double-quoted strings must be the symbol of an embedded scalar.
2508
2509   $ in pattern could be $foo or could be tail anchor.  Assumption:
2510   it's a tail anchor if $ is the last thing in the string, or if it's
2511   followed by one of "()| \r\n\t"
2512
2513   \1 (backreferences) are turned into $1
2514
2515   The structure of the code is
2516       while (there's a character to process) {
2517           handle transliteration ranges
2518           skip regexp comments /(?#comment)/ and codes /(?{code})/
2519           skip #-initiated comments in //x patterns
2520           check for embedded arrays
2521           check for embedded scalars
2522           if (backslash) {
2523               deprecate \1 in substitution replacements
2524               handle string-changing backslashes \l \U \Q \E, etc.
2525               switch (what was escaped) {
2526                   handle \- in a transliteration (becomes a literal -)
2527                   if a pattern and not \N{, go treat as regular character
2528                   handle \132 (octal characters)
2529                   handle \x15 and \x{1234} (hex characters)
2530                   handle \N{name} (named characters, also \N{3,5} in a pattern)
2531                   handle \cV (control characters)
2532                   handle printf-style backslashes (\f, \r, \n, etc)
2533               } (end switch)
2534               continue
2535           } (end if backslash)
2536           handle regular character
2537     } (end while character to read)
2538                 
2539 */
2540
2541 STATIC char *
2542 S_scan_const(pTHX_ char *start)
2543 {
2544     dVAR;
2545     register char *send = PL_bufend;            /* end of the constant */
2546     SV *sv = newSV(send - start);               /* sv for the constant.  See
2547                                                    note below on sizing. */
2548     register char *s = start;                   /* start of the constant */
2549     register char *d = SvPVX(sv);               /* destination for copies */
2550     bool dorange = FALSE;                       /* are we in a translit range? */
2551     bool didrange = FALSE;                      /* did we just finish a range? */
2552     I32  has_utf8 = FALSE;                      /* Output constant is UTF8 */
2553     I32  this_utf8 = UTF;                       /* Is the source string assumed
2554                                                    to be UTF8?  But, this can
2555                                                    show as true when the source
2556                                                    isn't utf8, as for example
2557                                                    when it is entirely composed
2558                                                    of hex constants */
2559
2560     /* Note on sizing:  The scanned constant is placed into sv, which is
2561      * initialized by newSV() assuming one byte of output for every byte of
2562      * input.  This routine expects newSV() to allocate an extra byte for a
2563      * trailing NUL, which this routine will append if it gets to the end of
2564      * the input.  There may be more bytes of input than output (eg., \N{LATIN
2565      * CAPITAL LETTER A}), or more output than input if the constant ends up
2566      * recoded to utf8, but each time a construct is found that might increase
2567      * the needed size, SvGROW() is called.  Its size parameter each time is
2568      * based on the best guess estimate at the time, namely the length used so
2569      * far, plus the length the current construct will occupy, plus room for
2570      * the trailing NUL, plus one byte for every input byte still unscanned */ 
2571
2572     UV uv;
2573 #ifdef EBCDIC
2574     UV literal_endpoint = 0;
2575     bool native_range = TRUE; /* turned to FALSE if the first endpoint is Unicode. */
2576 #endif
2577
2578     PERL_ARGS_ASSERT_SCAN_CONST;
2579
2580     if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
2581         /* If we are doing a trans and we know we want UTF8 set expectation */
2582         has_utf8   = PL_sublex_info.sub_op->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF);
2583         this_utf8  = PL_sublex_info.sub_op->op_private & (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
2584     }
2585
2586
2587     while (s < send || dorange) {
2588
2589         /* get transliterations out of the way (they're most literal) */
2590         if (PL_lex_inwhat == OP_TRANS) {
2591             /* expand a range A-Z to the full set of characters.  AIE! */
2592             if (dorange) {
2593                 I32 i;                          /* current expanded character */
2594                 I32 min;                        /* first character in range */
2595                 I32 max;                        /* last character in range */
2596
2597 #ifdef EBCDIC
2598                 UV uvmax = 0;
2599 #endif
2600
2601                 if (has_utf8
2602 #ifdef EBCDIC
2603                     && !native_range
2604 #endif
2605                     ) {
2606                     char * const c = (char*)utf8_hop((U8*)d, -1);
2607                     char *e = d++;
2608                     while (e-- > c)
2609                         *(e + 1) = *e;
2610                     *c = (char)UTF_TO_NATIVE(0xff);
2611                     /* mark the range as done, and continue */
2612                     dorange = FALSE;
2613                     didrange = TRUE;
2614                     continue;
2615                 }
2616
2617                 i = d - SvPVX_const(sv);                /* remember current offset */
2618 #ifdef EBCDIC
2619                 SvGROW(sv,
2620                        SvLEN(sv) + (has_utf8 ?
2621                                     (512 - UTF_CONTINUATION_MARK +
2622                                      UNISKIP(0x100))
2623                                     : 256));
2624                 /* How many two-byte within 0..255: 128 in UTF-8,
2625                  * 96 in UTF-8-mod. */
2626 #else
2627                 SvGROW(sv, SvLEN(sv) + 256);    /* never more than 256 chars in a range */
2628 #endif
2629                 d = SvPVX(sv) + i;              /* refresh d after realloc */
2630 #ifdef EBCDIC
2631                 if (has_utf8) {
2632                     int j;
2633                     for (j = 0; j <= 1; j++) {
2634                         char * const c = (char*)utf8_hop((U8*)d, -1);
2635                         const UV uv    = utf8n_to_uvchr((U8*)c, d - c, NULL, 0);
2636                         if (j)
2637                             min = (U8)uv;
2638                         else if (uv < 256)
2639                             max = (U8)uv;
2640                         else {
2641                             max = (U8)0xff; /* only to \xff */
2642                             uvmax = uv; /* \x{100} to uvmax */
2643                         }
2644                         d = c; /* eat endpoint chars */
2645                      }
2646                 }
2647                else {
2648 #endif
2649                    d -= 2;              /* eat the first char and the - */
2650                    min = (U8)*d;        /* first char in range */
2651                    max = (U8)d[1];      /* last char in range  */
2652 #ifdef EBCDIC
2653                }
2654 #endif
2655
2656                 if (min > max) {
2657                     Perl_croak(aTHX_
2658                                "Invalid range \"%c-%c\" in transliteration operator",
2659                                (char)min, (char)max);
2660                 }
2661
2662 #ifdef EBCDIC
2663                 if (literal_endpoint == 2 &&
2664                     ((isLOWER(min) && isLOWER(max)) ||
2665                      (isUPPER(min) && isUPPER(max)))) {
2666                     if (isLOWER(min)) {
2667                         for (i = min; i <= max; i++)
2668                             if (isLOWER(i))
2669                                 *d++ = NATIVE_TO_NEED(has_utf8,i);
2670                     } else {
2671                         for (i = min; i <= max; i++)
2672                             if (isUPPER(i))
2673                                 *d++ = NATIVE_TO_NEED(has_utf8,i);
2674                     }
2675                 }
2676                 else
2677 #endif
2678                     for (i = min; i <= max; i++)
2679 #ifdef EBCDIC
2680                         if (has_utf8) {
2681                             const U8 ch = (U8)NATIVE_TO_UTF(i);
2682                             if (UNI_IS_INVARIANT(ch))
2683                                 *d++ = (U8)i;
2684                             else {
2685                                 *d++ = (U8)UTF8_EIGHT_BIT_HI(ch);
2686                                 *d++ = (U8)UTF8_EIGHT_BIT_LO(ch);
2687                             }
2688                         }
2689                         else
2690 #endif
2691                             *d++ = (char)i;
2692  
2693 #ifdef EBCDIC
2694                 if (uvmax) {
2695                     d = (char*)uvchr_to_utf8((U8*)d, 0x100);
2696                     if (uvmax > 0x101)
2697                         *d++ = (char)UTF_TO_NATIVE(0xff);
2698                     if (uvmax > 0x100)
2699                         d = (char*)uvchr_to_utf8((U8*)d, uvmax);
2700                 }
2701 #endif
2702
2703                 /* mark the range as done, and continue */
2704                 dorange = FALSE;
2705                 didrange = TRUE;
2706 #ifdef EBCDIC
2707                 literal_endpoint = 0;
2708 #endif
2709                 continue;
2710             }
2711
2712             /* range begins (ignore - as first or last char) */
2713             else if (*s == '-' && s+1 < send  && s != start) {
2714                 if (didrange) {
2715                     Perl_croak(aTHX_ "Ambiguous range in transliteration operator");
2716                 }
2717                 if (has_utf8
2718 #ifdef EBCDIC
2719                     && !native_range
2720 #endif
2721                     ) {
2722                     *d++ = (char)UTF_TO_NATIVE(0xff);   /* use illegal utf8 byte--see pmtrans */
2723                     s++;
2724                     continue;
2725                 }
2726                 dorange = TRUE;
2727                 s++;
2728             }
2729             else {
2730                 didrange = FALSE;
2731 #ifdef EBCDIC
2732                 literal_endpoint = 0;
2733                 native_range = TRUE;
2734 #endif
2735             }
2736         }
2737
2738         /* if we get here, we're not doing a transliteration */
2739
2740         /* skip for regexp comments /(?#comment)/ and code /(?{code})/,
2741            except for the last char, which will be done separately. */
2742         else if (*s == '(' && PL_lex_inpat && s[1] == '?') {
2743             if (s[2] == '#') {
2744                 while (s+1 < send && *s != ')')
2745                     *d++ = NATIVE_TO_NEED(has_utf8,*s++);
2746             }
2747             else if (s[2] == '{' /* This should match regcomp.c */
2748                     || (s[2] == '?' && s[3] == '{'))
2749             {
2750                 I32 count = 1;
2751                 char *regparse = s + (s[2] == '{' ? 3 : 4);
2752                 char c;
2753
2754                 while (count && (c = *regparse)) {
2755                     if (c == '\\' && regparse[1])
2756                         regparse++;
2757                     else if (c == '{')
2758                         count++;
2759                     else if (c == '}')
2760                         count--;
2761                     regparse++;
2762                 }
2763                 if (*regparse != ')')
2764                     regparse--;         /* Leave one char for continuation. */
2765                 while (s < regparse)
2766                     *d++ = NATIVE_TO_NEED(has_utf8,*s++);
2767             }
2768         }
2769
2770         /* likewise skip #-initiated comments in //x patterns */
2771         else if (*s == '#' && PL_lex_inpat &&
2772           ((PMOP*)PL_lex_inpat)->op_pmflags & PMf_EXTENDED) {
2773             while (s+1 < send && *s != '\n')
2774                 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
2775         }
2776
2777         /* check for embedded arrays
2778            (@foo, @::foo, @'foo, @{foo}, @$foo, @+, @-)
2779            */
2780         else if (*s == '@' && s[1]) {
2781             if (isALNUM_lazy_if(s+1,UTF))
2782                 break;
2783             if (strchr(":'{$", s[1]))
2784                 break;
2785             if (!PL_lex_inpat && (s[1] == '+' || s[1] == '-'))
2786                 break; /* in regexp, neither @+ nor @- are interpolated */
2787         }
2788
2789         /* check for embedded scalars.  only stop if we're sure it's a
2790            variable.
2791         */
2792         else if (*s == '$') {
2793             if (!PL_lex_inpat)  /* not a regexp, so $ must be var */
2794                 break;
2795             if (s + 1 < send && !strchr("()| \r\n\t", s[1])) {
2796                 if (s[1] == '\\') {
2797                     Perl_ck_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
2798                                    "Possible unintended interpolation of $\\ in regex");
2799                 }
2800                 break;          /* in regexp, $ might be tail anchor */
2801             }
2802         }
2803
2804         /* End of else if chain - OP_TRANS rejoin rest */
2805
2806         /* backslashes */
2807         if (*s == '\\' && s+1 < send) {
2808             char* e;    /* Can be used for ending '}', etc. */
2809
2810             s++;
2811
2812             /* deprecate \1 in strings and substitution replacements */
2813             if (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat &&
2814                 isDIGIT(*s) && *s != '0' && !isDIGIT(s[1]))
2815             {
2816                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), "\\%c better written as $%c", *s, *s);
2817                 *--s = '$';
2818                 break;
2819             }
2820
2821             /* string-change backslash escapes */
2822             if (PL_lex_inwhat != OP_TRANS && *s && strchr("lLuUEQ", *s)) {
2823                 --s;
2824                 break;
2825             }
2826             /* In a pattern, process \N, but skip any other backslash escapes.
2827              * This is because we don't want to translate an escape sequence
2828              * into a meta symbol and have the regex compiler use the meta
2829              * symbol meaning, e.g. \x{2E} would be confused with a dot.  But
2830              * in spite of this, we do have to process \N here while the proper
2831              * charnames handler is in scope.  See bugs #56444 and #62056.
2832              * There is a complication because \N in a pattern may also stand
2833              * for 'match a non-nl', and not mean a charname, in which case its
2834              * processing should be deferred to the regex compiler.  To be a
2835              * charname it must be followed immediately by a '{', and not look
2836              * like \N followed by a curly quantifier, i.e., not something like
2837              * \N{3,}.  regcurly returns a boolean indicating if it is a legal
2838              * quantifier */
2839             else if (PL_lex_inpat
2840                     && (*s != 'N'
2841                         || s[1] != '{'
2842                         || regcurly(s + 1)))
2843             {
2844                 *d++ = NATIVE_TO_NEED(has_utf8,'\\');
2845                 goto default_action;
2846             }
2847
2848             switch (*s) {
2849
2850             /* quoted - in transliterations */
2851             case '-':
2852                 if (PL_lex_inwhat == OP_TRANS) {
2853                     *d++ = *s++;
2854                     continue;
2855                 }
2856                 /* FALL THROUGH */
2857             default:
2858                 {
2859                     if ((isALPHA(*s) || isDIGIT(*s)))
2860                         Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
2861                                        "Unrecognized escape \\%c passed through",
2862                                        *s);
2863                     /* default action is to copy the quoted character */
2864                     goto default_action;
2865                 }
2866
2867             /* eg. \132 indicates the octal constant 0x132 */
2868             case '0': case '1': case '2': case '3':
2869             case '4': case '5': case '6': case '7':
2870                 {
2871                     I32 flags = 0;
2872                     STRLEN len = 3;
2873                     uv = NATIVE_TO_UNI(grok_oct(s, &len, &flags, NULL));
2874                     s += len;
2875                 }
2876                 goto NUM_ESCAPE_INSERT;
2877
2878             /* eg. \x24 indicates the hex constant 0x24 */
2879             case 'x':
2880                 ++s;
2881                 if (*s == '{') {
2882                     char* const e = strchr(s, '}');
2883                     I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
2884                       PERL_SCAN_DISALLOW_PREFIX;
2885                     STRLEN len;
2886
2887                     ++s;
2888                     if (!e) {
2889                         yyerror("Missing right brace on \\x{}");
2890                         continue;
2891                     }
2892                     len = e - s;
2893                     uv = NATIVE_TO_UNI(grok_hex(s, &len, &flags, NULL));
2894                     s = e + 1;
2895                 }
2896                 else {
2897                     {
2898                         STRLEN len = 2;
2899                         I32 flags = PERL_SCAN_DISALLOW_PREFIX;
2900                         uv = NATIVE_TO_UNI(grok_hex(s, &len, &flags, NULL));
2901                         s += len;
2902                     }
2903                 }
2904
2905               NUM_ESCAPE_INSERT:
2906                 /* Insert oct or hex escaped character.  There will always be
2907                  * enough room in sv since such escapes will be longer than any
2908                  * UTF-8 sequence they can end up as, except if they force us
2909                  * to recode the rest of the string into utf8 */
2910                 
2911                 /* Here uv is the ordinal of the next character being added in
2912                  * unicode (converted from native). */
2913                 if (!UNI_IS_INVARIANT(uv)) {
2914                     if (!has_utf8 && uv > 255) {
2915                         /* Might need to recode whatever we have accumulated so
2916                          * far if it contains any chars variant in utf8 or
2917                          * utf-ebcdic. */
2918                           
2919                         SvCUR_set(sv, d - SvPVX_const(sv));
2920                         SvPOK_on(sv);
2921                         *d = '\0';
2922                         /* See Note on sizing above.  */
2923                         sv_utf8_upgrade_flags_grow(sv,
2924                                         SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
2925                                         UNISKIP(uv) + (STRLEN)(send - s) + 1);
2926                         d = SvPVX(sv) + SvCUR(sv);
2927                         has_utf8 = TRUE;
2928                     }
2929
2930                     if (has_utf8) {
2931                         d = (char*)uvuni_to_utf8((U8*)d, uv);
2932                         if (PL_lex_inwhat == OP_TRANS &&
2933                             PL_sublex_info.sub_op) {
2934                             PL_sublex_info.sub_op->op_private |=
2935                                 (PL_lex_repl ? OPpTRANS_FROM_UTF
2936                                              : OPpTRANS_TO_UTF);
2937                         }
2938 #ifdef EBCDIC
2939                         if (uv > 255 && !dorange)
2940                             native_range = FALSE;
2941 #endif
2942                     }
2943                     else {
2944                         *d++ = (char)uv;
2945                     }
2946                 }
2947                 else {
2948                     *d++ = (char) uv;
2949                 }
2950                 continue;
2951
2952             case 'N':
2953                 /* In a non-pattern \N must be a named character, like \N{LATIN
2954                  * SMALL LETTER A} or \N{U+0041}.  For patterns, it also can
2955                  * mean to match a non-newline.  For non-patterns, named
2956                  * characters are converted to their string equivalents. In
2957                  * patterns, named characters are not converted to their
2958                  * ultimate forms for the same reasons that other escapes
2959                  * aren't.  Instead, they are converted to the \N{U+...} form
2960                  * to get the value from the charnames that is in effect right
2961                  * now, while preserving the fact that it was a named character
2962                  * so that the regex compiler knows this */
2963
2964                 /* This section of code doesn't generally use the
2965                  * NATIVE_TO_NEED() macro to transform the input.  I (khw) did
2966                  * a close examination of this macro and determined it is a
2967                  * no-op except on utfebcdic variant characters.  Every
2968                  * character generated by this that would normally need to be
2969                  * enclosed by this macro is invariant, so the macro is not
2970                  * needed, and would complicate use of copy(). There are other
2971                  * parts of this file where the macro is used inconsistently,
2972                  * but are saved by it being a no-op */
2973
2974                 /* The structure of this section of code (besides checking for
2975                  * errors and upgrading to utf8) is:
2976                  *  Further disambiguate between the two meanings of \N, and if
2977                  *      not a charname, go process it elsewhere
2978                  *  If of form \N{U+...}, pass it through if a pattern;
2979                  *      otherwise convert to utf8
2980                  *  Otherwise must be \N{NAME}: convert to \N{U+c1.c2...} if a
2981                  *  pattern; otherwise convert to utf8 */
2982
2983                 /* Here, s points to the 'N'; the test below is guaranteed to
2984                  * succeed if we are being called on a pattern as we already
2985                  * know from a test above that the next character is a '{'.
2986                  * On a non-pattern \N must mean 'named sequence, which
2987                  * requires braces */
2988                 s++;
2989                 if (*s != '{') {
2990                     yyerror("Missing braces on \\N{}"); 
2991                     continue;
2992                 }
2993                 s++;
2994
2995                 /* If there is no matching '}', it is an error. */
2996                 if (! (e = strchr(s, '}'))) {
2997                     if (! PL_lex_inpat) {
2998                         yyerror("Missing right brace on \\N{}");
2999                     } else {
3000                         yyerror("Missing right brace on \\N{} or unescaped left brace after \\N.");
3001                     }
3002                     continue;
3003                 }
3004
3005                 /* Here it looks like a named character */
3006
3007                 if (PL_lex_inpat) {
3008
3009                     /* XXX This block is temporary code.  \N{} implies that the
3010                      * pattern is to have Unicode semantics, and therefore
3011                      * currently has to be encoded in utf8.  By putting it in
3012                      * utf8 now, we save a whole pass in the regular expression
3013                      * compiler.  Once that code is changed so Unicode
3014                      * semantics doesn't necessarily have to be in utf8, this
3015                      * block should be removed */
3016                     if (!has_utf8) {
3017                         SvCUR_set(sv, d - SvPVX_const(sv));
3018                         SvPOK_on(sv);
3019                         *d = '\0';
3020                         /* See Note on sizing above.  */
3021                         sv_utf8_upgrade_flags_grow(sv,
3022                                         SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
3023                                         /* 5 = '\N{' + cur char + NUL */
3024                                         (STRLEN)(send - s) + 5);
3025                         d = SvPVX(sv) + SvCUR(sv);
3026                         has_utf8 = TRUE;
3027                     }
3028                 }
3029
3030                 if (*s == 'U' && s[1] == '+') { /* \N{U+...} */
3031                     I32 flags = PERL_SCAN_ALLOW_UNDERSCORES
3032                                 | PERL_SCAN_DISALLOW_PREFIX;
3033                     STRLEN len;
3034
3035                     /* For \N{U+...}, the '...' is a unicode value even on
3036                      * EBCDIC machines */
3037                     s += 2;         /* Skip to next char after the 'U+' */
3038                     len = e - s;
3039                     uv = grok_hex(s, &len, &flags, NULL);
3040                     if (len == 0 || len != (STRLEN)(e - s)) {
3041                         yyerror("Invalid hexadecimal number in \\N{U+...}");
3042                         s = e + 1;
3043                         continue;
3044                     }
3045
3046                     if (PL_lex_inpat) {
3047
3048                         /* Pass through to the regex compiler unchanged.  The
3049                          * reason we evaluated the number above is to make sure
3050                          * there wasn't a syntax error. */
3051                         s -= 5;     /* Include the '\N{U+' */
3052                         Copy(s, d, e - s + 1, char);    /* 1 = include the } */
3053                         d += e - s + 1;
3054                     }
3055                     else {  /* Not a pattern: convert the hex to string */
3056
3057                          /* If destination is not in utf8, unconditionally
3058                           * recode it to be so.  This is because \N{} implies
3059                           * Unicode semantics, and scalars have to be in utf8
3060                           * to guarantee those semantics */
3061                         if (! has_utf8) {
3062                             SvCUR_set(sv, d - SvPVX_const(sv));
3063                             SvPOK_on(sv);
3064                             *d = '\0';
3065                             /* See Note on sizing above.  */
3066                             sv_utf8_upgrade_flags_grow(
3067                                         sv,
3068                                         SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
3069                                         UNISKIP(uv) + (STRLEN)(send - e) + 1);
3070                             d = SvPVX(sv) + SvCUR(sv);
3071                             has_utf8 = TRUE;
3072                         }
3073
3074                         /* Add the string to the output */
3075                         if (UNI_IS_INVARIANT(uv)) {
3076                             *d++ = (char) uv;
3077                         }
3078                         else d = (char*)uvuni_to_utf8((U8*)d, uv);
3079                     }
3080                 }
3081                 else { /* Here is \N{NAME} but not \N{U+...}. */
3082
3083                     SV *res;            /* result from charnames */
3084                     const char *str;    /* the string in 'res' */
3085                     STRLEN len;         /* its length */
3086
3087                     /* Get the value for NAME */
3088                     res = newSVpvn(s, e - s);
3089                     res = new_constant( NULL, 0, "charnames",
3090                                         /* includes all of: \N{...} */
3091                                         res, NULL, s - 3, e - s + 4 );
3092
3093                     /* Most likely res will be in utf8 already since the
3094                      * standard charnames uses pack U, but a custom translator
3095                      * can leave it otherwise, so make sure.  XXX This can be
3096                      * revisited to not have charnames use utf8 for characters
3097                      * that don't need it when regexes don't have to be in utf8
3098                      * for Unicode semantics.  If doing so, remember EBCDIC */
3099                     sv_utf8_upgrade(res);
3100                     str = SvPV_const(res, len);
3101
3102                     /* Don't accept malformed input */
3103                     if (! is_utf8_string((U8 *) str, len)) {
3104                         yyerror("Malformed UTF-8 returned by \\N");
3105                     }
3106                     else if (PL_lex_inpat) {
3107
3108                         if (! len) { /* The name resolved to an empty string */
3109                             Copy("\\N{}", d, 4, char);
3110                             d += 4;
3111                         }
3112                         else {
3113                             /* In order to not lose information for the regex
3114                             * compiler, pass the result in the specially made
3115                             * syntax: \N{U+c1.c2.c3...}, where c1 etc. are
3116                             * the code points in hex of each character
3117                             * returned by charnames */
3118
3119                             const char *str_end = str + len;
3120                             STRLEN char_length;     /* cur char's byte length */
3121                             STRLEN output_length;   /* and the number of bytes
3122                                                        after this is translated
3123                                                        into hex digits */
3124                             const STRLEN off = d - SvPVX_const(sv);
3125
3126                             /* 2 hex per byte; 2 chars for '\N'; 2 chars for
3127                              * max('U+', '.'); and 1 for NUL */
3128                             char hex_string[2 * UTF8_MAXBYTES + 5];
3129
3130                             /* Get the first character of the result. */
3131                             U32 uv = utf8n_to_uvuni((U8 *) str,
3132                                                     len,
3133                                                     &char_length,
3134                                                     UTF8_ALLOW_ANYUV);
3135
3136                             /* The call to is_utf8_string() above hopefully
3137                              * guarantees that there won't be an error.  But
3138                              * it's easy here to make sure.  The function just
3139                              * above warns and returns 0 if invalid utf8, but
3140                              * it can also return 0 if the input is validly a
3141                              * NUL. Disambiguate */
3142                             if (uv == 0 && NATIVE_TO_ASCII(*str) != '\0') {
3143                                 uv = UNICODE_REPLACEMENT;
3144                             }
3145
3146                             /* Convert first code point to hex, including the
3147                              * boiler plate before it */
3148                             sprintf(hex_string, "\\N{U+%X", (unsigned int) uv);
3149                             output_length = strlen(hex_string);
3150
3151                             /* Make sure there is enough space to hold it */
3152                             d = off + SvGROW(sv, off
3153                                                  + output_length
3154                                                  + (STRLEN)(send - e)
3155                                                  + 2);  /* '}' + NUL */
3156                             /* And output it */
3157                             Copy(hex_string, d, output_length, char);
3158                             d += output_length;
3159
3160                             /* For each subsequent character, append dot and
3161                              * its ordinal in hex */
3162                             while ((str += char_length) < str_end) {
3163                                 const STRLEN off = d - SvPVX_const(sv);
3164                                 U32 uv = utf8n_to_uvuni((U8 *) str,
3165                                                         str_end - str,
3166                                                         &char_length,
3167                                                         UTF8_ALLOW_ANYUV);
3168                                 if (uv == 0 && NATIVE_TO_ASCII(*str) != '\0') {
3169                                     uv = UNICODE_REPLACEMENT;
3170                                 }
3171
3172                                 sprintf(hex_string, ".%X", (unsigned int) uv);
3173                                 output_length = strlen(hex_string);
3174
3175                                 d = off + SvGROW(sv, off
3176                                                      + output_length
3177                                                      + (STRLEN)(send - e)
3178                                                      + 2);      /* '}' +  NUL */
3179                                 Copy(hex_string, d, output_length, char);
3180                                 d += output_length;
3181                             }
3182
3183                             *d++ = '}'; /* Done.  Add the trailing brace */
3184                         }
3185                     }
3186                     else { /* Here, not in a pattern.  Convert the name to a
3187                             * string. */
3188
3189                          /* If destination is not in utf8, unconditionally
3190                           * recode it to be so.  This is because \N{} implies
3191                           * Unicode semantics, and scalars have to be in utf8
3192                           * to guarantee those semantics */
3193                         if (! has_utf8) {
3194                             SvCUR_set(sv, d - SvPVX_const(sv));
3195                             SvPOK_on(sv);
3196                             *d = '\0';
3197                             /* See Note on sizing above.  */
3198                             sv_utf8_upgrade_flags_grow(sv,
3199                                                 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
3200                                                 len + (STRLEN)(send - s) + 1);
3201                             d = SvPVX(sv) + SvCUR(sv);
3202                             has_utf8 = TRUE;
3203                         } else if (len > (STRLEN)(e - s + 4)) { /* I _guess_ 4 is \N{} --jhi */
3204
3205                             /* See Note on sizing above.  (NOTE: SvCUR() is not
3206                              * set correctly here). */
3207                             const STRLEN off = d - SvPVX_const(sv);
3208                             d = off + SvGROW(sv, off + len + (STRLEN)(send - s) + 1);
3209                         }
3210                         Copy(str, d, len, char);
3211                         d += len;
3212                     }
3213                     SvREFCNT_dec(res);
3214
3215                     /* Deprecate non-approved name syntax */
3216                     if (ckWARN_d(WARN_DEPRECATED)) {
3217                         bool problematic = FALSE;
3218                         char* i = s;
3219
3220                         /* For non-ut8 input, look to see that the first
3221                          * character is an alpha, then loop through the rest
3222                          * checking that each is a continuation */
3223                         if (! this_utf8) {
3224                             if (! isALPHAU(*i)) problematic = TRUE;
3225                             else for (i = s + 1; i < e; i++) {
3226                                 if (isCHARNAME_CONT(*i)) continue;
3227                                 problematic = TRUE;
3228                                 break;
3229                             }
3230                         }
3231                         else {
3232                             /* Similarly for utf8.  For invariants can check
3233                              * directly.  We accept anything above the latin1
3234                              * range because it is immaterial to Perl if it is
3235                              * correct or not, and is expensive to check.  But
3236                              * it is fairly easy in the latin1 range to convert
3237                              * the variants into a single character and check
3238                              * those */
3239                             if (UTF8_IS_INVARIANT(*i)) {
3240                                 if (! isALPHAU(*i)) problematic = TRUE;
3241                             } else if (UTF8_IS_DOWNGRADEABLE_START(*i)) {
3242                                 if (! isALPHAU(UNI_TO_NATIVE(UTF8_ACCUMULATE(*i,
3243                                                                             *(i+1)))))
3244                                 {
3245                                     problematic = TRUE;
3246                                 }
3247                             }
3248                             if (! problematic) for (i = s + UTF8SKIP(s);
3249                                                     i < e;
3250                                                     i+= UTF8SKIP(i))
3251                             {
3252                                 if (UTF8_IS_INVARIANT(*i)) {
3253                                     if (isCHARNAME_CONT(*i)) continue;
3254                                 } else if (! UTF8_IS_DOWNGRADEABLE_START(*i)) {
3255                                     continue;
3256                                 } else if (isCHARNAME_CONT(
3257                                             UNI_TO_NATIVE(
3258                                             UTF8_ACCUMULATE(*i, *(i+1)))))
3259                                 {
3260                                     continue;
3261                                 }
3262                                 problematic = TRUE;
3263                                 break;
3264                             }
3265                         }
3266                         if (problematic) {
3267                             /* The e-i passed to the final %.*s makes sure that
3268                              * should the trailing NUL be missing that this
3269                              * print won't run off the end of the string */
3270                             Perl_warner(aTHX_ packWARN(WARN_DEPRECATED),
3271                                 "Deprecated character in \\N{...}; marked by <-- HERE  in \\N{%.*s<-- HERE %.*s", i - s + 1, s, e - i, i + 1);
3272                         }
3273                     }
3274                 } /* End \N{NAME} */
3275 #ifdef EBCDIC
3276                 if (!dorange) 
3277                     native_range = FALSE; /* \N{} is defined to be Unicode */
3278 #endif
3279                 s = e + 1;  /* Point to just after the '}' */
3280                 continue;
3281
3282             /* \c is a control character */
3283             case 'c':
3284                 s++;
3285                 if (s < send) {
3286                     U8 c = *s++;
3287 #ifdef EBCDIC
3288                     if (isLOWER(c))
3289                         c = toUPPER(c);
3290 #endif
3291                     *d++ = NATIVE_TO_NEED(has_utf8,toCTRL(c));
3292                 }
3293                 else {
3294                     yyerror("Missing control char name in \\c");
3295                 }
3296                 continue;
3297
3298             /* printf-style backslashes, formfeeds, newlines, etc */
3299             case 'b':
3300                 *d++ = NATIVE_TO_NEED(has_utf8,'\b');
3301                 break;
3302             case 'n':
3303                 *d++ = NATIVE_TO_NEED(has_utf8,'\n');
3304                 break;
3305             case 'r':
3306                 *d++ = NATIVE_TO_NEED(has_utf8,'\r');
3307                 break;
3308             case 'f':
3309                 *d++ = NATIVE_TO_NEED(has_utf8,'\f');
3310                 break;
3311             case 't':
3312                 *d++ = NATIVE_TO_NEED(has_utf8,'\t');
3313                 break;
3314             case 'e':
3315                 *d++ = ASCII_TO_NEED(has_utf8,'\033');
3316                 break;
3317             case 'a':
3318                 *d++ = ASCII_TO_NEED(has_utf8,'\007');
3319                 break;
3320             } /* end switch */
3321
3322             s++;
3323             continue;
3324         } /* end if (backslash) */
3325 #ifdef EBCDIC
3326         else
3327             literal_endpoint++;
3328 #endif
3329
3330     default_action:
3331         /* If we started with encoded form, or already know we want it,
3332            then encode the next character */
3333         if (! NATIVE_IS_INVARIANT((U8)(*s)) && (this_utf8 || has_utf8)) {
3334             STRLEN len  = 1;
3335
3336
3337             /* One might think that it is wasted effort in the case of the
3338              * source being utf8 (this_utf8 == TRUE) to take the next character
3339              * in the source, convert it to an unsigned value, and then convert
3340              * it back again.  But the source has not been validated here.  The
3341              * routine that does the conversion checks for errors like
3342              * malformed utf8 */
3343
3344             const UV nextuv   = (this_utf8) ? utf8n_to_uvchr((U8*)s, send - s, &len, 0) : (UV) ((U8) *s);
3345             const STRLEN need = UNISKIP(NATIVE_TO_UNI(nextuv));
3346             if (!has_utf8) {
3347                 SvCUR_set(sv, d - SvPVX_const(sv));
3348                 SvPOK_on(sv);
3349                 *d = '\0';
3350                 /* See Note on sizing above.  */
3351                 sv_utf8_upgrade_flags_grow(sv,
3352                                         SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
3353                                         need + (STRLEN)(send - s) + 1);
3354                 d = SvPVX(sv) + SvCUR(sv);
3355                 has_utf8 = TRUE;
3356             } else if (need > len) {
3357                 /* encoded value larger than old, may need extra space (NOTE:
3358                  * SvCUR() is not set correctly here).   See Note on sizing
3359                  * above.  */
3360                 const STRLEN off = d - SvPVX_const(sv);
3361                 d = SvGROW(sv, off + need + (STRLEN)(send - s) + 1) + off;
3362             }
3363             s += len;
3364
3365             d = (char*)uvchr_to_utf8((U8*)d, nextuv);
3366 #ifdef EBCDIC
3367             if (uv > 255 && !dorange)
3368                 native_range = FALSE;
3369 #endif
3370         }
3371         else {
3372             *d++ = NATIVE_TO_NEED(has_utf8,*s++);
3373         }
3374     } /* while loop to process each character */
3375
3376     /* terminate the string and set up the sv */
3377     *d = '\0';
3378     SvCUR_set(sv, d - SvPVX_const(sv));
3379     if (SvCUR(sv) >= SvLEN(sv))
3380         Perl_croak(aTHX_ "panic: constant overflowed allocated space");
3381
3382     SvPOK_on(sv);
3383     if (PL_encoding && !has_utf8) {
3384         sv_recode_to_utf8(sv, PL_encoding);
3385         if (SvUTF8(sv))
3386             has_utf8 = TRUE;
3387     }
3388     if (has_utf8) {
3389         SvUTF8_on(sv);
3390         if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
3391             PL_sublex_info.sub_op->op_private |=
3392                     (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
3393         }
3394     }
3395
3396     /* shrink the sv if we allocated more than we used */
3397     if (SvCUR(sv) + 5 < SvLEN(sv)) {
3398         SvPV_shrink_to_cur(sv);
3399     }
3400
3401     /* return the substring (via pl_yylval) only if we parsed anything */
3402     if (s > PL_bufptr) {
3403         if ( PL_hints & ( PL_lex_inpat ? HINT_NEW_RE : HINT_NEW_STRING ) ) {
3404             const char *const key = PL_lex_inpat ? "qr" : "q";
3405             const STRLEN keylen = PL_lex_inpat ? 2 : 1;
3406             const char *type;
3407             STRLEN typelen;
3408
3409             if (PL_lex_inwhat == OP_TRANS) {
3410                 type = "tr";
3411                 typelen = 2;
3412             } else if (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat) {
3413                 type = "s";
3414                 typelen = 1;
3415             } else  {
3416                 type = "qq";
3417                 typelen = 2;
3418             }
3419
3420             sv = S_new_constant(aTHX_ start, s - start, key, keylen, sv, NULL,
3421                                 type, typelen);
3422         }
3423         pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
3424     } else
3425         SvREFCNT_dec(sv);
3426     return s;
3427 }
3428
3429 /* S_intuit_more
3430  * Returns TRUE if there's more to the expression (e.g., a subscript),
3431  * FALSE otherwise.
3432  *
3433  * It deals with "$foo[3]" and /$foo[3]/ and /$foo[0123456789$]+/
3434  *
3435  * ->[ and ->{ return TRUE
3436  * { and [ outside a pattern are always subscripts, so return TRUE
3437  * if we're outside a pattern and it's not { or [, then return FALSE
3438  * if we're in a pattern and the first char is a {
3439  *   {4,5} (any digits around the comma) returns FALSE
3440  * if we're in a pattern and the first char is a [
3441  *   [] returns FALSE
3442  *   [SOMETHING] has a funky algorithm to decide whether it's a
3443  *      character class or not.  It has to deal with things like
3444  *      /$foo[-3]/ and /$foo[$bar]/ as well as /$foo[$\d]+/
3445  * anything else returns TRUE
3446  */
3447
3448 /* This is the one truly awful dwimmer necessary to conflate C and sed. */
3449
3450 STATIC int
3451 S_intuit_more(pTHX_ register char *s)
3452 {
3453     dVAR;
3454
3455     PERL_ARGS_ASSERT_INTUIT_MORE;
3456
3457     if (PL_lex_brackets)
3458         return TRUE;
3459     if (*s == '-' && s[1] == '>' && (s[2] == '[' || s[2] == '{'))
3460         return TRUE;
3461     if (*s != '{' && *s != '[')
3462         return FALSE;
3463     if (!PL_lex_inpat)
3464         return TRUE;
3465
3466     /* In a pattern, so maybe we have {n,m}. */
3467     if (*s == '{') {
3468         s++;
3469         if (!isDIGIT(*s))
3470             return TRUE;
3471         while (isDIGIT(*s))
3472             s++;
3473         if (*s == ',')
3474             s++;
3475         while (isDIGIT(*s))
3476             s++;
3477         if (*s == '}')
3478             return FALSE;
3479         return TRUE;
3480         
3481     }
3482
3483     /* On the other hand, maybe we have a character class */
3484
3485     s++;
3486     if (*s == ']' || *s == '^')
3487         return FALSE;
3488     else {
3489         /* this is terrifying, and it works */
3490         int weight = 2;         /* let's weigh the evidence */
3491         char seen[256];
3492         unsigned char un_char = 255, last_un_char;
3493         const char * const send = strchr(s,']');
3494         char tmpbuf[sizeof PL_tokenbuf * 4];
3495
3496         if (!send)              /* has to be an expression */
3497             return TRUE;
3498
3499         Zero(seen,256,char);
3500         if (*s == '$')
3501             weight -= 3;
3502         else if (isDIGIT(*s)) {
3503             if (s[1] != ']') {
3504                 if (isDIGIT(s[1]) && s[2] == ']')
3505                     weight -= 10;
3506             }
3507             else
3508                 weight -= 100;
3509         }
3510         for (; s < send; s++) {
3511             last_un_char = un_char;
3512             un_char = (unsigned char)*s;
3513             switch (*s) {
3514             case '@':
3515             case '&':
3516             case '$':
3517                 weight -= seen[un_char] * 10;
3518                 if (isALNUM_lazy_if(s+1,UTF)) {
3519                     int len;
3520                     scan_ident(s, send, tmpbuf, sizeof tmpbuf, FALSE);
3521                     len = (int)strlen(tmpbuf);
3522                     if (len > 1 && gv_fetchpvn_flags(tmpbuf, len, 0, SVt_PV))
3523                         weight -= 100;
3524                     else
3525                         weight -= 10;
3526                 }
3527                 else if (*s == '$' && s[1] &&
3528                   strchr("[#!%*<>()-=",s[1])) {
3529                     if (/*{*/ strchr("])} =",s[2]))
3530                         weight -= 10;
3531                     else
3532                         weight -= 1;
3533                 }
3534                 break;
3535             case '\\':
3536                 un_char = 254;
3537                 if (s[1]) {
3538                     if (strchr("wds]",s[1]))
3539                         weight += 100;
3540                     else if (seen[(U8)'\''] || seen[(U8)'"'])
3541                         weight += 1;
3542                     else if (strchr("rnftbxcav",s[1]))
3543                         weight += 40;
3544                     else if (isDIGIT(s[1])) {
3545                         weight += 40;
3546                         while (s[1] && isDIGIT(s[1]))
3547                             s++;
3548                     }
3549                 }
3550                 else
3551                     weight += 100;
3552                 break;
3553             case '-':
3554                 if (s[1] == '\\')
3555                     weight += 50;
3556                 if (strchr("aA01! ",last_un_char))
3557                     weight += 30;
3558                 if (strchr("zZ79~",s[1]))
3559                     weight += 30;
3560                 if (last_un_char == 255 && (isDIGIT(s[1]) || s[1] == '$'))
3561                     weight -= 5;        /* cope with negative subscript */
3562                 break;
3563             default:
3564                 if (!isALNUM(last_un_char)
3565                     && !(last_un_char == '$' || last_un_char == '@'
3566                          || last_un_char == '&')
3567                     && isALPHA(*s) && s[1] && isALPHA(s[1])) {
3568                     char *d = tmpbuf;
3569                     while (isALPHA(*s))
3570                         *d++ = *s++;
3571                     *d = '\0';
3572                     if (keyword(tmpbuf, d - tmpbuf, 0))
3573                         weight -= 150;
3574                 }
3575                 if (un_char == last_un_char + 1)
3576                     weight += 5;
3577                 weight -= seen[un_char];
3578                 break;
3579             }
3580             seen[un_char]++;
3581         }
3582         if (weight >= 0)        /* probably a character class */
3583             return FALSE;
3584     }
3585
3586     return TRUE;
3587 }
3588
3589 /*
3590  * S_intuit_method
3591  *
3592  * Does all the checking to disambiguate
3593  *   foo bar
3594  * between foo(bar) and bar->foo.  Returns 0 if not a method, otherwise
3595  * FUNCMETH (bar->foo(args)) or METHOD (bar->foo args).
3596  *
3597  * First argument is the stuff after the first token, e.g. "bar".
3598  *
3599  * Not a method if bar is a filehandle.
3600  * Not a method if foo is a subroutine prototyped to take a filehandle.
3601  * Not a method if it's really "Foo $bar"
3602  * Method if it's "foo $bar"
3603  * Not a method if it's really "print foo $bar"
3604  * Method if it's really "foo package::" (interpreted as package->foo)
3605  * Not a method if bar is known to be a subroutine ("sub bar; foo bar")
3606  * Not a method if bar is a filehandle or package, but is quoted with
3607  *   =>
3608  */
3609
3610 STATIC int
3611 S_intuit_method(pTHX_ char *start, GV *gv, CV *cv)
3612 {
3613     dVAR;
3614     char *s = start + (*start == '$');
3615     char tmpbuf[sizeof PL_tokenbuf];
3616     STRLEN len;
3617     GV* indirgv;
3618 #ifdef PERL_MAD
3619     int soff;
3620 #endif
3621
3622     PERL_ARGS_ASSERT_INTUIT_METHOD;
3623
3624     if (gv) {
3625         if (SvTYPE(gv) == SVt_PVGV && GvIO(gv))
3626             return 0;
3627         if (cv) {
3628             if (SvPOK(cv)) {
3629                 const char *proto = SvPVX_const(cv);
3630                 if (proto) {
3631                     if (*proto == ';')
3632                         proto++;
3633                     if (*proto == '*')
3634                         return 0;
3635                 }
3636             }
3637         } else
3638             gv = NULL;
3639     }
3640     s = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
3641     /* start is the beginning of the possible filehandle/object,
3642      * and s is the end of it
3643      * tmpbuf is a copy of it
3644      */
3645
3646     if (*start == '$') {
3647         if (gv || PL_last_lop_op == OP_PRINT || PL_last_lop_op == OP_SAY ||
3648                 isUPPER(*PL_tokenbuf))
3649             return 0;
3650 #ifdef PERL_MAD
3651         len = start - SvPVX(PL_linestr);
3652 #endif
3653         s = PEEKSPACE(s);
3654 #ifdef PERL_MAD
3655         start = SvPVX(PL_linestr) + len;
3656 #endif
3657         PL_bufptr = start;
3658         PL_expect = XREF;
3659         return *s == '(' ? FUNCMETH : METHOD;
3660     }
3661     if (!keyword(tmpbuf, len, 0)) {
3662         if (len > 2 && tmpbuf[len - 2] == ':' && tmpbuf[len - 1] == ':') {
3663             len -= 2;
3664             tmpbuf[len] = '\0';
3665 #ifdef PERL_MAD
3666             soff = s - SvPVX(PL_linestr);
3667 #endif
3668             goto bare_package;
3669         }
3670         indirgv = gv_fetchpvn_flags(tmpbuf, len, 0, SVt_PVCV);
3671         if (indirgv && GvCVu(indirgv))
3672             return 0;
3673         /* filehandle or package name makes it a method */
3674         if (!gv || GvIO(indirgv) || gv_stashpvn(tmpbuf, len, 0)) {
3675 #ifdef PERL_MAD
3676             soff = s - SvPVX(PL_linestr);
3677 #endif
3678             s = PEEKSPACE(s);
3679             if ((PL_bufend - s) >= 2 && *s == '=' && *(s+1) == '>')
3680                 return 0;       /* no assumptions -- "=>" quotes bearword */
3681       bare_package:
3682             start_force(PL_curforce);
3683             NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0,
3684                                                   S_newSV_maybe_utf8(aTHX_ tmpbuf, len));
3685             NEXTVAL_NEXTTOKE.opval->op_private = OPpCONST_BARE;
3686             if (PL_madskills)
3687                 curmad('X', newSVpvn(start,SvPVX(PL_linestr) + soff - start));
3688             PL_expect = XTERM;
3689             force_next(WORD);
3690             PL_bufptr = s;
3691 #ifdef PERL_MAD
3692             PL_bufptr = SvPVX(PL_linestr) + soff; /* restart before space */
3693 #endif
3694             return *s == '(' ? FUNCMETH : METHOD;
3695         }
3696     }
3697     return 0;
3698 }
3699
3700 /* Encoded script support. filter_add() effectively inserts a
3701  * 'pre-processing' function into the current source input stream.
3702  * Note that the filter function only applies to the current source file
3703  * (e.g., it will not affect files 'require'd or 'use'd by this one).
3704  *
3705  * The datasv parameter (which may be NULL) can be used to pass
3706  * private data to this instance of the filter. The filter function
3707  * can recover the SV using the FILTER_DATA macro and use it to
3708  * store private buffers and state information.
3709  *
3710  * The supplied datasv parameter is upgraded to a PVIO type
3711  * and the IoDIRP/IoANY field is used to store the function pointer,
3712  * and IOf_FAKE_DIRP is enabled on datasv to mark this as such.
3713  * Note that IoTOP_NAME, IoFMT_NAME, IoBOTTOM_NAME, if set for
3714  * private use must be set using malloc'd pointers.
3715  */
3716
3717 SV *
3718 Perl_filter_add(pTHX_ filter_t funcp, SV *datasv)
3719 {
3720     dVAR;
3721     if (!funcp)
3722         return NULL;
3723
3724     if (!PL_parser)
3725         return NULL;
3726
3727     if (!PL_rsfp_filters)
3728         PL_rsfp_filters = newAV();
3729     if (!datasv)
3730         datasv = newSV(0);
3731     SvUPGRADE(datasv, SVt_PVIO);
3732     IoANY(datasv) = FPTR2DPTR(void *, funcp); /* stash funcp into spare field */
3733     IoFLAGS(datasv) |= IOf_FAKE_DIRP;
3734     DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_add func %p (%s)\n",
3735                           FPTR2DPTR(void *, IoANY(datasv)),
3736                           SvPV_nolen(datasv)));
3737     av_unshift(PL_rsfp_filters, 1);
3738     av_store(PL_rsfp_filters, 0, datasv) ;
3739     return(datasv);
3740 }
3741
3742
3743 /* Delete most recently added instance of this filter function. */
3744 void
3745 Perl_filter_del(pTHX_ filter_t funcp)
3746 {
3747     dVAR;
3748     SV *datasv;
3749
3750     PERL_ARGS_ASSERT_FILTER_DEL;
3751
3752 #ifdef DEBUGGING
3753     DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_del func %p",
3754                           FPTR2DPTR(void*, funcp)));
3755 #endif
3756     if (!PL_parser || !PL_rsfp_filters || AvFILLp(PL_rsfp_filters)<0)
3757         return;
3758     /* if filter is on top of stack (usual case) just pop it off */
3759     datasv = FILTER_DATA(AvFILLp(PL_rsfp_filters));
3760     if (IoANY(datasv) == FPTR2DPTR(void *, funcp)) {
3761         IoFLAGS(datasv) &= ~IOf_FAKE_DIRP;
3762         IoANY(datasv) = (void *)NULL;
3763         sv_free(av_pop(PL_rsfp_filters));
3764
3765         return;
3766     }
3767     /* we need to search for the correct entry and clear it     */
3768     Perl_die(aTHX_ "filter_del can only delete in reverse order (currently)");
3769 }
3770
3771
3772 /* Invoke the idxth filter function for the current rsfp.        */
3773 /* maxlen 0 = read one text line */
3774 I32
3775 Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
3776 {
3777     dVAR;
3778     filter_t funcp;
3779     SV *datasv = NULL;
3780     /* This API is bad. It should have been using unsigned int for maxlen.
3781        Not sure if we want to change the API, but if not we should sanity
3782        check the value here.  */
3783     const unsigned int correct_length
3784         = maxlen < 0 ?
3785 #ifdef PERL_MICRO
3786         0x7FFFFFFF
3787 #else
3788         INT_MAX
3789 #endif
3790         : maxlen;
3791
3792     PERL_ARGS_ASSERT_FILTER_READ;
3793
3794     if (!PL_parser || !PL_rsfp_filters)
3795         return -1;
3796     if (idx > AvFILLp(PL_rsfp_filters)) {       /* Any more filters?    */
3797         /* Provide a default input filter to make life easy.    */
3798         /* Note that we append to the line. This is handy.      */
3799         DEBUG_P(PerlIO_printf(Perl_debug_log,
3800                               "filter_read %d: from rsfp\n", idx));
3801         if (correct_length) {
3802             /* Want a block */
3803             int len ;
3804             const int old_len = SvCUR(buf_sv);
3805
3806             /* ensure buf_sv is large enough */
3807             SvGROW(buf_sv, (STRLEN)(old_len + correct_length + 1)) ;
3808             if ((len = PerlIO_read(PL_rsfp, SvPVX(buf_sv) + old_len,
3809                                    correct_length)) <= 0) {
3810                 if (PerlIO_error(PL_rsfp))
3811                     return -1;          /* error */
3812                 else
3813                     return 0 ;          /* end of file */
3814             }
3815             SvCUR_set(buf_sv, old_len + len) ;
3816             SvPVX(buf_sv)[old_len + len] = '\0';
3817         } else {
3818             /* Want a line */
3819             if (sv_gets(buf_sv, PL_rsfp, SvCUR(buf_sv)) == NULL) {
3820                 if (PerlIO_error(PL_rsfp))
3821                     return -1;          /* error */
3822                 else
3823                     return 0 ;          /* end of file */
3824             }
3825         }
3826         return SvCUR(buf_sv);
3827     }
3828     /* Skip this filter slot if filter has been deleted */
3829     if ( (datasv = FILTER_DATA(idx)) == &PL_sv_undef) {
3830         DEBUG_P(PerlIO_printf(Perl_debug_log,
3831                               "filter_read %d: skipped (filter deleted)\n",
3832                               idx));
3833         return FILTER_READ(idx+1, buf_sv, correct_length); /* recurse */
3834     }
3835     /* Get function pointer hidden within datasv        */
3836     funcp = DPTR2FPTR(filter_t, IoANY(datasv));
3837     DEBUG_P(PerlIO_printf(Perl_debug_log,
3838                           "filter_read %d: via function %p (%s)\n",
3839                           idx, (void*)datasv, SvPV_nolen_const(datasv)));
3840     /* Call function. The function is expected to       */
3841     /* call "FILTER_READ(idx+1, buf_sv)" first.         */
3842     /* Return: <0:error, =0:eof, >0:not eof             */
3843     return (*funcp)(aTHX_ idx, buf_sv, correct_length);
3844 }
3845
3846 STATIC char *
3847 S_filter_gets(pTHX_ register SV *sv, STRLEN append)
3848 {
3849     dVAR;
3850
3851     PERL_ARGS_ASSERT_FILTER_GETS;
3852
3853 #ifdef PERL_CR_FILTER
3854     if (!PL_rsfp_filters) {
3855         filter_add(S_cr_textfilter,NULL);
3856     }
3857 #endif
3858     if (PL_rsfp_filters) {
3859         if (!append)
3860             SvCUR_set(sv, 0);   /* start with empty line        */
3861         if (FILTER_READ(0, sv, 0) > 0)
3862             return ( SvPVX(sv) ) ;
3863         else
3864             return NULL ;
3865     }
3866     else
3867         return (sv_gets(sv, PL_rsfp, append));
3868 }
3869
3870 STATIC HV *
3871 S_find_in_my_stash(pTHX_ const char *pkgname, STRLEN len)
3872 {
3873     dVAR;
3874     GV *gv;
3875
3876     PERL_ARGS_ASSERT_FIND_IN_MY_STASH;
3877
3878     if (len == 11 && *pkgname == '_' && strEQ(pkgname, "__PACKAGE__"))
3879         return PL_curstash;
3880
3881     if (len > 2 &&
3882         (pkgname[len - 2] == ':' && pkgname[len - 1] == ':') &&
3883         (gv = gv_fetchpvn_flags(pkgname, len, 0, SVt_PVHV)))
3884     {
3885         return GvHV(gv);                        /* Foo:: */
3886     }
3887
3888     /* use constant CLASS => 'MyClass' */
3889     gv = gv_fetchpvn_flags(pkgname, len, 0, SVt_PVCV);
3890     if (gv && GvCV(gv)) {
3891         SV * const sv = cv_const_sv(GvCV(gv));
3892         if (sv)
3893             pkgname = SvPV_const(sv, len);
3894     }
3895
3896     return gv_stashpvn(pkgname, len, 0);
3897 }
3898
3899 /*
3900  * S_readpipe_override
3901  * Check whether readpipe() is overriden, and generates the appropriate
3902  * optree, provided sublex_start() is called afterwards.
3903  */
3904 STATIC void
3905 S_readpipe_override(pTHX)
3906 {
3907     GV **gvp;
3908     GV *gv_readpipe = gv_fetchpvs("readpipe", GV_NOTQUAL, SVt_PVCV);
3909     pl_yylval.ival = OP_BACKTICK;
3910     if ((gv_readpipe
3911                 && GvCVu(gv_readpipe) && GvIMPORTED_CV(gv_readpipe))
3912             ||
3913             ((gvp = (GV**)hv_fetchs(PL_globalstash, "readpipe", FALSE))
3914              && (gv_readpipe = *gvp) && isGV_with_GP(gv_readpipe)
3915              && GvCVu(gv_readpipe) && GvIMPORTED_CV(gv_readpipe)))
3916     {
3917         PL_lex_op = (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
3918             append_elem(OP_LIST,
3919                 newSVOP(OP_CONST, 0, &PL_sv_undef), /* value will be read later */
3920                 newCVREF(0, newGVOP(OP_GV, 0, gv_readpipe))));
3921     }
3922 }
3923
3924 #ifdef PERL_MAD 
3925  /*
3926  * Perl_madlex
3927  * The intent of this yylex wrapper is to minimize the changes to the
3928  * tokener when we aren't interested in collecting madprops.  It remains
3929  * to be seen how successful this strategy will be...
3930  */
3931
3932 int
3933 Perl_madlex(pTHX)
3934 {
3935     int optype;
3936     char *s = PL_bufptr;
3937
3938     /* make sure PL_thiswhite is initialized */
3939     PL_thiswhite = 0;
3940     PL_thismad = 0;
3941
3942     /* just do what yylex would do on pending identifier; leave PL_thiswhite alone */
3943     if (PL_pending_ident)
3944         return S_pending_ident(aTHX);
3945
3946     /* previous token ate up our whitespace? */
3947     if (!PL_lasttoke && PL_nextwhite) {
3948         PL_thiswhite = PL_nextwhite;
3949         PL_nextwhite = 0;
3950     }
3951
3952     /* isolate the token, and figure out where it is without whitespace */
3953     PL_realtokenstart = -1;
3954     PL_thistoken = 0;
3955     optype = yylex();
3956     s = PL_bufptr;
3957     assert(PL_curforce < 0);
3958
3959     if (!PL_thismad || PL_thismad->mad_key == '^') {    /* not forced already? */
3960         if (!PL_thistoken) {
3961             if (PL_realtokenstart < 0 || !CopLINE(PL_curcop))
3962                 PL_thistoken = newSVpvs("");
3963             else {
3964                 char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
3965                 PL_thistoken = newSVpvn(tstart, s - tstart);
3966             }
3967         }
3968         if (PL_thismad) /* install head */
3969             CURMAD('X', PL_thistoken);
3970     }
3971
3972     /* last whitespace of a sublex? */
3973     if (optype == ')' && PL_endwhite) {
3974         CURMAD('X', PL_endwhite);
3975     }
3976
3977     if (!PL_thismad) {
3978
3979         /* if no whitespace and we're at EOF, bail.  Otherwise fake EOF below. */
3980         if (!PL_thiswhite && !PL_endwhite && !optype) {
3981             sv_free(PL_thistoken);
3982             PL_thistoken = 0;
3983             return 0;
3984         }
3985
3986         /* put off final whitespace till peg */
3987         if (optype == ';' && !PL_rsfp) {
3988             PL_nextwhite = PL_thiswhite;
3989             PL_thiswhite = 0;
3990         }
3991         else if (PL_thisopen) {
3992             CURMAD('q', PL_thisopen);
3993             if (PL_thistoken)
3994                 sv_free(PL_thistoken);
3995             PL_thistoken = 0;
3996         }
3997         else {
3998             /* Store actual token text as madprop X */
3999             CURMAD('X', PL_thistoken);
4000         }
4001
4002         if (PL_thiswhite) {
4003             /* add preceding whitespace as madprop _ */
4004             CURMAD('_', PL_thiswhite);
4005         }
4006
4007         if (PL_thisstuff) {
4008             /* add quoted material as madprop = */
4009             CURMAD('=', PL_thisstuff);
4010         }
4011
4012         if (PL_thisclose) {
4013             /* add terminating quote as madprop Q */
4014             CURMAD('Q', PL_thisclose);
4015         }
4016     }
4017
4018     /* special processing based on optype */
4019
4020     switch (optype) {
4021
4022     /* opval doesn't need a TOKEN since it can already store mp */
4023     case WORD:
4024     case METHOD:
4025     case FUNCMETH:
4026     case THING:
4027     case PMFUNC:
4028     case PRIVATEREF:
4029     case FUNC0SUB:
4030     case UNIOPSUB:
4031     case LSTOPSUB:
4032         if (pl_yylval.opval)
4033             append_madprops(PL_thismad, pl_yylval.opval, 0);
4034         PL_thismad = 0;
4035         return optype;
4036
4037     /* fake EOF */
4038     case 0:
4039         optype = PEG;
4040         if (PL_endwhite) {
4041             addmad(newMADsv('p', PL_endwhite), &PL_thismad, 0);
4042             PL_endwhite = 0;
4043         }
4044         break;
4045
4046     case ']':
4047     case '}':
4048         if (PL_faketokens)
4049             break;
4050         /* remember any fake bracket that lexer is about to discard */ 
4051         if (PL_lex_brackets == 1 &&
4052             ((expectation)PL_lex_brackstack[0] & XFAKEBRACK))
4053         {
4054             s = PL_bufptr;
4055             while (s < PL_bufend && (*s == ' ' || *s == '\t'))
4056                 s++;
4057             if (*s == '}') {
4058                 PL_thiswhite = newSVpvn(PL_bufptr, ++s - PL_bufptr);
4059                 addmad(newMADsv('#', PL_thiswhite), &PL_thismad, 0);
4060                 PL_thiswhite = 0;
4061                 PL_bufptr = s - 1;
4062                 break;  /* don't bother looking for trailing comment */
4063             }
4064             else
4065                 s = PL_bufptr;
4066         }
4067         if (optype == ']')
4068             break;
4069         /* FALLTHROUGH */
4070
4071     /* attach a trailing comment to its statement instead of next token */
4072     case ';':
4073         if (PL_faketokens)
4074             break;
4075         if (PL_bufptr > PL_oldbufptr && PL_bufptr[-1] == optype) {
4076             s = PL_bufptr;
4077             while (s < PL_bufend && (*s == ' ' || *s == '\t'))
4078                 s++;
4079             if (*s == '\n' || *s == '#') {
4080                 while (s < PL_bufend && *s != '\n')
4081                     s++;
4082                 if (s < PL_bufend)
4083                     s++;
4084                 PL_thiswhite = newSVpvn(PL_bufptr, s - PL_bufptr);
4085                 addmad(newMADsv('#', PL_thiswhite), &PL_thismad, 0);
4086                 PL_thiswhite = 0;
4087                 PL_bufptr = s;
4088             }
4089         }
4090         break;
4091
4092     /* pval */
4093     case LABEL:
4094         break;
4095
4096     /* ival */
4097     default:
4098         break;
4099
4100     }
4101
4102     /* Create new token struct.  Note: opvals return early above. */
4103     pl_yylval.tkval = newTOKEN(optype, pl_yylval, PL_thismad);
4104     PL_thismad = 0;
4105     return optype;
4106 }
4107 #endif
4108
4109 STATIC char *
4110 S_tokenize_use(pTHX_ int is_use, char *s) {
4111     dVAR;
4112
4113     PERL_ARGS_ASSERT_TOKENIZE_USE;
4114
4115     if (PL_expect != XSTATE)
4116         yyerror(Perl_form(aTHX_ "\"%s\" not allowed in expression",
4117                     is_use ? "use" : "no"));
4118     s = SKIPSPACE1(s);
4119     if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
4120         s = force_version(s, TRUE);
4121         if (*s == ';' || *s == '}'
4122                 || (s = SKIPSPACE1(s), (*s == ';' || *s == '}'))) {
4123             start_force(PL_curforce);
4124             NEXTVAL_NEXTTOKE.opval = NULL;
4125             force_next(WORD);
4126         }
4127         else if (*s == 'v') {
4128             s = force_word(s,WORD,FALSE,TRUE,FALSE);
4129             s = force_version(s, FALSE);
4130         }
4131     }
4132     else {
4133         s = force_word(s,WORD,FALSE,TRUE,FALSE);
4134         s = force_version(s, FALSE);
4135     }
4136     pl_yylval.ival = is_use;
4137     return s;
4138 }
4139 #ifdef DEBUGGING
4140     static const char* const exp_name[] =
4141         { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "ATTRBLOCK",
4142           "ATTRTERM", "TERMBLOCK", "TERMORDORDOR"
4143         };
4144 #endif
4145
4146 /*
4147   yylex
4148
4149   Works out what to call the token just pulled out of the input
4150   stream.  The yacc parser takes care of taking the ops we return and
4151   stitching them into a tree.
4152
4153   Returns:
4154     PRIVATEREF
4155
4156   Structure:
4157       if read an identifier
4158           if we're in a my declaration
4159               croak if they tried to say my($foo::bar)
4160               build the ops for a my() declaration
4161           if it's an access to a my() variable
4162               are we in a sort block?
4163                   croak if my($a); $a <=> $b
4164               build ops for access to a my() variable
4165           if in a dq string, and they've said @foo and we can't find @foo
4166               croak
4167           build ops for a bareword
4168       if we already built the token before, use it.
4169 */
4170
4171
4172 #ifdef __SC__
4173 #pragma segment Perl_yylex
4174 #endif
4175 int
4176 Perl_yylex(pTHX)
4177 {
4178     dVAR;
4179     register char *s = PL_bufptr;
4180     register char *d;
4181     STRLEN len;
4182     bool bof = FALSE;
4183     U32 fake_eof = 0;
4184
4185     /* orig_keyword, gvp, and gv are initialized here because
4186      * jump to the label just_a_word_zero can bypass their
4187      * initialization later. */
4188     I32 orig_keyword = 0;
4189     GV *gv = NULL;
4190     GV **gvp = NULL;
4191
4192     DEBUG_T( {
4193         SV* tmp = newSVpvs("");
4194         PerlIO_printf(Perl_debug_log, "### %"IVdf":LEX_%s/X%s %s\n",
4195             (IV)CopLINE(PL_curcop),
4196             lex_state_names[PL_lex_state],
4197             exp_name[PL_expect],
4198             pv_display(tmp, s, strlen(s), 0, 60));
4199         SvREFCNT_dec(tmp);
4200     } );
4201     /* check if there's an identifier for us to look at */
4202     if (PL_pending_ident)
4203         return REPORT(S_pending_ident(aTHX));
4204
4205     /* no identifier pending identification */
4206
4207     switch (PL_lex_state) {
4208 #ifdef COMMENTARY
4209     case LEX_NORMAL:            /* Some compilers will produce faster */
4210     case LEX_INTERPNORMAL:      /* code if we comment these out. */
4211         break;
4212 #endif
4213
4214     /* when we've already built the next token, just pull it out of the queue */
4215     case LEX_KNOWNEXT:
4216 #ifdef PERL_MAD
4217         PL_lasttoke--;
4218         pl_yylval = PL_nexttoke[PL_lasttoke].next_val;
4219         if (PL_madskills) {
4220             PL_thismad = PL_nexttoke[PL_lasttoke].next_mad;
4221             PL_nexttoke[PL_lasttoke].next_mad = 0;
4222             if (PL_thismad && PL_thismad->mad_key == '_') {
4223                 PL_thiswhite = MUTABLE_SV(PL_thismad->mad_val);
4224                 PL_thismad->mad_val = 0;
4225                 mad_free(PL_thismad);
4226                 PL_thismad = 0;
4227             }
4228         }
4229         if (!PL_lasttoke) {
4230             PL_lex_state = PL_lex_defer;
4231             PL_expect = PL_lex_expect;
4232             PL_lex_defer = LEX_NORMAL;
4233             if (!PL_nexttoke[PL_lasttoke].next_type)
4234                 return yylex();
4235         }
4236 #else
4237         PL_nexttoke--;
4238         pl_yylval = PL_nextval[PL_nexttoke];
4239         if (!PL_nexttoke) {
4240             PL_lex_state = PL_lex_defer;
4241             PL_expect = PL_lex_expect;
4242             PL_lex_defer = LEX_NORMAL;
4243         }
4244 #endif
4245 #ifdef PERL_MAD
4246         /* FIXME - can these be merged?  */
4247         return(PL_nexttoke[PL_lasttoke].next_type);
4248 #else
4249         return REPORT(PL_nexttype[PL_nexttoke]);
4250 #endif
4251
4252     /* interpolated case modifiers like \L \U, including \Q and \E.
4253        when we get here, PL_bufptr is at the \
4254     */
4255     case LEX_INTERPCASEMOD:
4256 #ifdef DEBUGGING
4257         if (PL_bufptr != PL_bufend && *PL_bufptr != '\\')
4258             Perl_croak(aTHX_ "panic: INTERPCASEMOD");
4259 #endif
4260         /* handle \E or end of string */
4261         if (PL_bufptr == PL_bufend || PL_bufptr[1] == 'E') {
4262             /* if at a \E */
4263             if (PL_lex_casemods) {
4264                 const char oldmod = PL_lex_casestack[--PL_lex_casemods];
4265                 PL_lex_casestack[PL_lex_casemods] = '\0';
4266
4267                 if (PL_bufptr != PL_bufend
4268                     && (oldmod == 'L' || oldmod == 'U' || oldmod == 'Q')) {
4269                     PL_bufptr += 2;
4270                     PL_lex_state = LEX_INTERPCONCAT;
4271 #ifdef PERL_MAD
4272                     if (PL_madskills)
4273                         PL_thistoken = newSVpvs("\\E");
4274 #endif
4275                 }
4276                 return REPORT(')');
4277             }
4278 #ifdef PERL_MAD
4279             while (PL_bufptr != PL_bufend &&
4280               PL_bufptr[0] == '\\' && PL_bufptr[1] == 'E') {
4281                 if (!PL_thiswhite)
4282                     PL_thiswhite = newSVpvs("");
4283                 sv_catpvn(PL_thiswhite, PL_bufptr, 2);
4284                 PL_bufptr += 2;
4285             }
4286 #else
4287             if (PL_bufptr != PL_bufend)
4288                 PL_bufptr += 2;
4289 #endif
4290             PL_lex_state = LEX_INTERPCONCAT;
4291             return yylex();
4292         }
4293         else {
4294             DEBUG_T({ PerlIO_printf(Perl_debug_log,
4295               "### Saw case modifier\n"); });
4296             s = PL_bufptr + 1;
4297             if (s[1] == '\\' && s[2] == 'E') {
4298 #ifdef PERL_MAD
4299                 if (!PL_thiswhite)
4300                     PL_thiswhite = newSVpvs("");
4301                 sv_catpvn(PL_thiswhite, PL_bufptr, 4);
4302 #endif
4303                 PL_bufptr = s + 3;
4304                 PL_lex_state = LEX_INTERPCONCAT;
4305                 return yylex();
4306             }
4307             else {
4308                 I32 tmp;
4309                 if (!PL_madskills) /* when just compiling don't need correct */
4310                     if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
4311                         tmp = *s, *s = s[2], s[2] = (char)tmp;  /* misordered... */
4312                 if ((*s == 'L' || *s == 'U') &&
4313                     (strchr(PL_lex_casestack, 'L') || strchr(PL_lex_casestack, 'U'))) {
4314                     PL_lex_casestack[--PL_lex_casemods] = '\0';
4315                     return REPORT(')');
4316                 }
4317                 if (PL_lex_casemods > 10)
4318                     Renew(PL_lex_casestack, PL_lex_casemods + 2, char);
4319                 PL_lex_casestack[PL_lex_casemods++] = *s;
4320                 PL_lex_casestack[PL_lex_casemods] = '\0';
4321                 PL_lex_state = LEX_INTERPCONCAT;
4322                 start_force(PL_curforce);
4323                 NEXTVAL_NEXTTOKE.ival = 0;
4324                 force_next('(');
4325                 start_force(PL_curforce);
4326                 if (*s == 'l')
4327                     NEXTVAL_NEXTTOKE.ival = OP_LCFIRST;
4328                 else if (*s == 'u')
4329                     NEXTVAL_NEXTTOKE.ival = OP_UCFIRST;
4330                 else if (*s == 'L')
4331                     NEXTVAL_NEXTTOKE.ival = OP_LC;
4332                 else if (*s == 'U')
4333                     NEXTVAL_NEXTTOKE.ival = OP_UC;
4334                 else if (*s == 'Q')
4335                     NEXTVAL_NEXTTOKE.ival = OP_QUOTEMETA;
4336                 else
4337                     Perl_croak(aTHX_ "panic: yylex");
4338                 if (PL_madskills) {
4339                     SV* const tmpsv = newSVpvs("\\ ");
4340                     /* replace the space with the character we want to escape
4341                      */
4342                     SvPVX(tmpsv)[1] = *s;
4343                     curmad('_', tmpsv);
4344                 }
4345                 PL_bufptr = s + 1;
4346             }
4347             force_next(FUNC);
4348             if (PL_lex_starts) {
4349                 s = PL_bufptr;
4350                 PL_lex_starts = 0;
4351 #ifdef PERL_MAD
4352                 if (PL_madskills) {
4353                     if (PL_thistoken)
4354                         sv_free(PL_thistoken);
4355                     PL_thistoken = newSVpvs("");
4356                 }
4357 #endif
4358                 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
4359                 if (PL_lex_casemods == 1 && PL_lex_inpat)
4360                     OPERATOR(',');
4361                 else
4362                     Aop(OP_CONCAT);
4363             }
4364             else
4365                 return yylex();
4366         }
4367
4368     case LEX_INTERPPUSH:
4369         return REPORT(sublex_push());
4370
4371     case LEX_INTERPSTART:
4372         if (PL_bufptr == PL_bufend)
4373             return REPORT(sublex_done());
4374         DEBUG_T({ PerlIO_printf(Perl_debug_log,
4375               "### Interpolated variable\n"); });
4376         PL_expect = XTERM;
4377         PL_lex_dojoin = (*PL_bufptr == '@');
4378         PL_lex_state = LEX_INTERPNORMAL;
4379         if (PL_lex_dojoin) {
4380             start_force(PL_curforce);
4381             NEXTVAL_NEXTTOKE.ival = 0;
4382             force_next(',');
4383             start_force(PL_curforce);
4384             force_ident("\"", '$');
4385             start_force(PL_curforce);
4386             NEXTVAL_NEXTTOKE.ival = 0;
4387             force_next('$');
4388             start_force(PL_curforce);
4389             NEXTVAL_NEXTTOKE.ival = 0;
4390             force_next('(');
4391             start_force(PL_curforce);
4392             NEXTVAL_NEXTTOKE.ival = OP_JOIN;    /* emulate join($", ...) */
4393             force_next(FUNC);
4394         }
4395         if (PL_lex_starts++) {
4396             s = PL_bufptr;
4397 #ifdef PERL_MAD
4398             if (PL_madskills) {
4399                 if (PL_thistoken)
4400                     sv_free(PL_thistoken);
4401                 PL_thistoken = newSVpvs("");
4402             }
4403 #endif
4404             /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
4405             if (!PL_lex_casemods && PL_lex_inpat)
4406                 OPERATOR(',');
4407             else
4408                 Aop(OP_CONCAT);
4409         }
4410         return yylex();
4411
4412     case LEX_INTERPENDMAYBE:
4413         if (intuit_more(PL_bufptr)) {
4414             PL_lex_state = LEX_INTERPNORMAL;    /* false alarm, more expr */
4415             break;
4416         }
4417         /* FALL THROUGH */
4418
4419     case LEX_INTERPEND:
4420         if (PL_lex_dojoin) {
4421             PL_lex_dojoin = FALSE;
4422             PL_lex_state = LEX_INTERPCONCAT;
4423 #ifdef PERL_MAD
4424             if (PL_madskills) {
4425                 if (PL_thistoken)
4426                     sv_free(PL_thistoken);
4427                 PL_thistoken = newSVpvs("");
4428             }
4429 #endif
4430             return REPORT(')');
4431         }
4432         if (PL_lex_inwhat == OP_SUBST && PL_linestr == PL_lex_repl
4433             && SvEVALED(PL_lex_repl))
4434         {
4435             if (PL_bufptr != PL_bufend)
4436                 Perl_croak(aTHX_ "Bad evalled substitution pattern");
4437             PL_lex_repl = NULL;
4438         }
4439         /* FALLTHROUGH */
4440     case LEX_INTERPCONCAT:
4441 #ifdef DEBUGGING
4442         if (PL_lex_brackets)
4443             Perl_croak(aTHX_ "panic: INTERPCONCAT");
4444 #endif
4445         if (PL_bufptr == PL_bufend)
4446             return REPORT(sublex_done());
4447
4448         if (SvIVX(PL_linestr) == '\'') {
4449             SV *sv = newSVsv(PL_linestr);
4450             if (!PL_lex_inpat)
4451                 sv = tokeq(sv);
4452             else if ( PL_hints & HINT_NEW_RE )
4453                 sv = new_constant(NULL, 0, "qr", sv, sv, "q", 1);
4454             pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
4455             s = PL_bufend;
4456         }
4457         else {
4458             s = scan_const(PL_bufptr);
4459             if (*s == '\\')
4460                 PL_lex_state = LEX_INTERPCASEMOD;
4461             else
4462                 PL_lex_state = LEX_INTERPSTART;
4463         }
4464
4465         if (s != PL_bufptr) {
4466             start_force(PL_curforce);
4467             if (PL_madskills) {
4468                 curmad('X', newSVpvn(PL_bufptr,s-PL_bufptr));
4469             }
4470             NEXTVAL_NEXTTOKE = pl_yylval;
4471             PL_expect = XTERM;
4472             force_next(THING);
4473             if (PL_lex_starts++) {
4474 #ifdef PERL_MAD
4475                 if (PL_madskills) {
4476                     if (PL_thistoken)
4477                         sv_free(PL_thistoken);
4478                     PL_thistoken = newSVpvs("");
4479                 }
4480 #endif
4481                 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
4482                 if (!PL_lex_casemods && PL_lex_inpat)
4483                     OPERATOR(',');
4484                 else
4485                     Aop(OP_CONCAT);
4486             }
4487             else {
4488                 PL_bufptr = s;
4489                 return yylex();
4490             }
4491         }
4492
4493         return yylex();
4494     case LEX_FORMLINE:
4495         PL_lex_state = LEX_NORMAL;
4496         s = scan_formline(PL_bufptr);
4497         if (!PL_lex_formbrack)
4498             goto rightbracket;
4499         OPERATOR(';');
4500     }
4501
4502     s = PL_bufptr;
4503     PL_oldoldbufptr = PL_oldbufptr;
4504     PL_oldbufptr = s;
4505
4506   retry:
4507 #ifdef PERL_MAD
4508     if (PL_thistoken) {
4509         sv_free(PL_thistoken);
4510         PL_thistoken = 0;
4511     }
4512     PL_realtokenstart = s - SvPVX(PL_linestr);  /* assume but undo on ws */
4513 #endif
4514     switch (*s) {
4515     default:
4516         if (isIDFIRST_lazy_if(s,UTF))
4517             goto keylookup;
4518         {
4519         unsigned char c = *s;
4520         len = UTF ? Perl_utf8_length(aTHX_ (U8 *) PL_linestart, (U8 *) s) : (STRLEN) (s - PL_linestart);
4521         if (len > UNRECOGNIZED_PRECEDE_COUNT) {
4522             d = UTF ? (char *) Perl_utf8_hop(aTHX_ (U8 *) s, -UNRECOGNIZED_PRECEDE_COUNT) : s - UNRECOGNIZED_PRECEDE_COUNT;
4523         } else {
4524             d = PL_linestart;
4525         }       
4526         *s = '\0';
4527         Perl_croak(aTHX_ "Unrecognized character \\x%02X; marked by <-- HERE after %s<-- HERE near column %d", c, d, (int) len + 1);
4528     }
4529     case 4:
4530     case 26:
4531         goto fake_eof;                  /* emulate EOF on ^D or ^Z */
4532     case 0:
4533 #ifdef PERL_MAD
4534         if (PL_madskills)
4535             PL_faketokens = 0;
4536 #endif
4537         if (!PL_rsfp) {
4538             PL_last_uni = 0;
4539             PL_last_lop = 0;
4540             if (PL_lex_brackets) {
4541                 yyerror((const char *)
4542                         (PL_lex_formbrack
4543                          ? "Format not terminated"
4544                          : "Missing right curly or square bracket"));
4545             }
4546             DEBUG_T( { PerlIO_printf(Perl_debug_log,
4547                         "### Tokener got EOF\n");
4548             } );
4549             TOKEN(0);
4550         }
4551         if (s++ < PL_bufend)
4552             goto retry;                 /* ignore stray nulls */
4553         PL_last_uni = 0;
4554         PL_last_lop = 0;
4555         if (!PL_in_eval && !PL_preambled) {
4556             PL_preambled = TRUE;
4557 #ifdef PERL_MAD
4558             if (PL_madskills)
4559                 PL_faketokens = 1;
4560 #endif
4561             if (PL_perldb) {
4562                 /* Generate a string of Perl code to load the debugger.
4563                  * If PERL5DB is set, it will return the contents of that,
4564                  * otherwise a compile-time require of perl5db.pl.  */
4565
4566                 const char * const pdb = PerlEnv_getenv("PERL5DB");
4567
4568                 if (pdb) {
4569                     sv_setpv(PL_linestr, pdb);
4570                     sv_catpvs(PL_linestr,";");
4571                 } else {
4572                     SETERRNO(0,SS_NORMAL);
4573                     sv_setpvs(PL_linestr, "BEGIN { require 'perl5db.pl' };");
4574                 }
4575             } else
4576                 sv_setpvs(PL_linestr,"");
4577             if (PL_preambleav) {
4578                 SV **svp = AvARRAY(PL_preambleav);
4579                 SV **const end = svp + AvFILLp(PL_preambleav);
4580                 while(svp <= end) {
4581                     sv_catsv(PL_linestr, *svp);
4582                     ++svp;
4583                     sv_catpvs(PL_linestr, ";");
4584                 }
4585                 sv_free(MUTABLE_SV(PL_preambleav));
4586                 PL_preambleav = NULL;
4587             }
4588             if (PL_minus_E)
4589                 sv_catpvs(PL_linestr,
4590                           "use feature ':5." STRINGIFY(PERL_VERSION) "';");
4591             if (PL_minus_n || PL_minus_p) {
4592                 sv_catpvs(PL_linestr, "LINE: while (<>) {"/*}*/);
4593                 if (PL_minus_l)
4594                     sv_catpvs(PL_linestr,"chomp;");
4595                 if (PL_minus_a) {
4596                     if (PL_minus_F) {
4597                         if ((*PL_splitstr == '/' || *PL_splitstr == '\''
4598                              || *PL_splitstr == '"')
4599                               && strchr(PL_splitstr + 1, *PL_splitstr))
4600                             Perl_sv_catpvf(aTHX_ PL_linestr, "our @F=split(%s);", PL_splitstr);
4601                         else {
4602                             /* "q\0${splitstr}\0" is legal perl. Yes, even NUL
4603                                bytes can be used as quoting characters.  :-) */
4604                             const char *splits = PL_splitstr;
4605                             sv_catpvs(PL_linestr, "our @F=split(q\0");
4606                             do {
4607                                 /* Need to \ \s  */
4608                                 if (*splits == '\\')
4609                                     sv_catpvn(PL_linestr, splits, 1);
4610                                 sv_catpvn(PL_linestr, splits, 1);
4611                             } while (*splits++);
4612                             /* This loop will embed the trailing NUL of
4613                                PL_linestr as the last thing it does before
4614                                terminating.  */
4615                             sv_catpvs(PL_linestr, ");");
4616                         }
4617                     }
4618                     else
4619                         sv_catpvs(PL_linestr,"our @F=split(' ');");
4620                 }
4621             }
4622             sv_catpvs(PL_linestr, "\n");
4623             PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
4624             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4625             PL_last_lop = PL_last_uni = NULL;
4626             if ((PERLDB_LINE || PERLDB_SAVESRC) && PL_curstash != PL_debstash)
4627                 update_debugger_info(PL_linestr, NULL, 0);
4628             goto retry;
4629         }
4630         do {
4631             fake_eof = 0;
4632             bof = PL_rsfp ? TRUE : FALSE;
4633             if (0) {
4634               fake_eof:
4635                 fake_eof = LEX_FAKE_EOF;
4636             }
4637             PL_bufptr = PL_bufend;
4638             CopLINE_inc(PL_curcop);
4639             if (!lex_next_chunk(fake_eof)) {
4640                 CopLINE_dec(PL_curcop);
4641                 s = PL_bufptr;
4642                 TOKEN(';');     /* not infinite loop because rsfp is NULL now */
4643             }
4644             CopLINE_dec(PL_curcop);
4645 #ifdef PERL_MAD
4646             if (!PL_rsfp)
4647                 PL_realtokenstart = -1;
4648 #endif
4649             s = PL_bufptr;
4650             /* If it looks like the start of a BOM or raw UTF-16,
4651              * check if it in fact is. */
4652             if (bof && PL_rsfp &&
4653                      (*s == 0 ||
4654                       *(U8*)s == 0xEF ||
4655                       *(U8*)s >= 0xFE ||
4656                       s[1] == 0)) {
4657                 bof = PerlIO_tell(PL_rsfp) == (Off_t)SvCUR(PL_linestr);
4658                 if (bof) {
4659                     PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4660                     s = swallow_bom((U8*)s);
4661                 }
4662             }
4663             if (PL_doextract) {
4664                 /* Incest with pod. */
4665 #ifdef PERL_MAD
4666                 if (PL_madskills)
4667                     sv_catsv(PL_thiswhite, PL_linestr);
4668 #endif
4669                 if (*s == '=' && strnEQ(s, "=cut", 4) && !isALPHA(s[4])) {
4670                     sv_setpvs(PL_linestr, "");
4671                     PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
4672                     PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4673                     PL_last_lop = PL_last_uni = NULL;
4674                     PL_doextract = FALSE;
4675                 }
4676             }
4677             if (PL_rsfp)
4678                 incline(s);
4679         } while (PL_doextract);
4680         PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = s;
4681         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4682         PL_last_lop = PL_last_uni = NULL;
4683         if (CopLINE(PL_curcop) == 1) {
4684             while (s < PL_bufend && isSPACE(*s))
4685                 s++;
4686             if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
4687                 s++;
4688 #ifdef PERL_MAD
4689             if (PL_madskills)
4690                 PL_thiswhite = newSVpvn(PL_linestart, s - PL_linestart);
4691 #endif
4692             d = NULL;
4693             if (!PL_in_eval) {
4694                 if (*s == '#' && *(s+1) == '!')
4695                     d = s + 2;
4696 #ifdef ALTERNATE_SHEBANG
4697                 else {
4698                     static char const as[] = ALTERNATE_SHEBANG;
4699                     if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
4700                         d = s + (sizeof(as) - 1);
4701                 }
4702 #endif /* ALTERNATE_SHEBANG */
4703             }
4704             if (d) {
4705                 char *ipath;
4706                 char *ipathend;
4707
4708                 while (isSPACE(*d))
4709                     d++;
4710                 ipath = d;
4711                 while (*d && !isSPACE(*d))
4712                     d++;
4713                 ipathend = d;
4714
4715 #ifdef ARG_ZERO_IS_SCRIPT
4716                 if (ipathend > ipath) {
4717                     /*
4718                      * HP-UX (at least) sets argv[0] to the script name,
4719                      * which makes $^X incorrect.  And Digital UNIX and Linux,
4720                      * at least, set argv[0] to the basename of the Perl
4721                      * interpreter. So, having found "#!", we'll set it right.
4722                      */
4723                     SV * const x = GvSV(gv_fetchpvs("\030", GV_ADD|GV_NOTQUAL,
4724                                                     SVt_PV)); /* $^X */
4725                     assert(SvPOK(x) || SvGMAGICAL(x));
4726                     if (sv_eq(x, CopFILESV(PL_curcop))) {
4727                         sv_setpvn(x, ipath, ipathend - ipath);
4728                         SvSETMAGIC(x);
4729                     }
4730                     else {
4731                         STRLEN blen;
4732                         STRLEN llen;
4733                         const char *bstart = SvPV_const(CopFILESV(PL_curcop),blen);
4734                         const char * const lstart = SvPV_const(x,llen);
4735                         if (llen < blen) {
4736                             bstart += blen - llen;
4737                             if (strnEQ(bstart, lstart, llen) && bstart[-1] == '/') {
4738                                 sv_setpvn(x, ipath, ipathend - ipath);
4739                                 SvSETMAGIC(x);
4740                             }
4741                         }
4742                     }
4743                     TAINT_NOT;  /* $^X is always tainted, but that's OK */
4744                 }
4745 #endif /* ARG_ZERO_IS_SCRIPT */
4746
4747                 /*
4748                  * Look for options.
4749                  */
4750                 d = instr(s,"perl -");
4751                 if (!d) {
4752                     d = instr(s,"perl");
4753 #if defined(DOSISH)
4754                     /* avoid getting into infinite loops when shebang
4755                      * line contains "Perl" rather than "perl" */
4756                     if (!d) {
4757                         for (d = ipathend-4; d >= ipath; --d) {
4758                             if ((*d == 'p' || *d == 'P')
4759                                 && !ibcmp(d, "perl", 4))
4760                             {
4761                                 break;
4762                             }
4763                         }
4764                         if (d < ipath)
4765                             d = NULL;
4766                     }
4767 #endif
4768                 }
4769 #ifdef ALTERNATE_SHEBANG
4770                 /*
4771                  * If the ALTERNATE_SHEBANG on this system starts with a
4772                  * character that can be part of a Perl expression, then if
4773                  * we see it but not "perl", we're probably looking at the
4774                  * start of Perl code, not a request to hand off to some
4775                  * other interpreter.  Similarly, if "perl" is there, but
4776                  * not in the first 'word' of the line, we assume the line
4777                  * contains the start of the Perl program.
4778                  */
4779                 if (d && *s != '#') {
4780                     const char *c = ipath;
4781                     while (*c && !strchr("; \t\r\n\f\v#", *c))
4782                         c++;
4783                     if (c < d)
4784                         d = NULL;       /* "perl" not in first word; ignore */
4785                     else
4786                         *s = '#';       /* Don't try to parse shebang line */
4787                 }
4788 #endif /* ALTERNATE_SHEBANG */
4789                 if (!d &&
4790                     *s == '#' &&
4791                     ipathend > ipath &&
4792                     !PL_minus_c &&
4793                     !instr(s,"indir") &&
4794                     instr(PL_origargv[0],"perl"))
4795                 {
4796                     dVAR;
4797                     char **newargv;
4798
4799                     *ipathend = '\0';
4800                     s = ipathend + 1;
4801                     while (s < PL_bufend && isSPACE(*s))
4802                         s++;
4803                     if (s < PL_bufend) {
4804                         Newx(newargv,PL_origargc+3,char*);
4805                         newargv[1] = s;
4806                         while (s < PL_bufend && !isSPACE(*s))
4807                             s++;
4808                         *s = '\0';
4809                         Copy(PL_origargv+1, newargv+2, PL_origargc+1, char*);
4810                     }
4811                     else
4812                         newargv = PL_origargv;
4813                     newargv[0] = ipath;
4814                     PERL_FPU_PRE_EXEC
4815                     PerlProc_execv(ipath, EXEC_ARGV_CAST(newargv));
4816                     PERL_FPU_POST_EXEC
4817                     Perl_croak(aTHX_ "Can't exec %s", ipath);
4818                 }
4819                 if (d) {
4820                     while (*d && !isSPACE(*d))
4821                         d++;
4822                     while (SPACE_OR_TAB(*d))
4823                         d++;
4824
4825                     if (*d++ == '-') {
4826                         const bool switches_done = PL_doswitches;
4827                         const U32 oldpdb = PL_perldb;
4828                         const bool oldn = PL_minus_n;
4829                         const bool oldp = PL_minus_p;
4830                         const char *d1 = d;
4831
4832                         do {
4833                             bool baduni = FALSE;
4834                             if (*d1 == 'C') {
4835                                 const char *d2 = d1 + 1;
4836                                 if (parse_unicode_opts((const char **)&d2)
4837                                     != PL_unicode)
4838                                     baduni = TRUE;
4839                             }
4840                             if (baduni || *d1 == 'M' || *d1 == 'm') {
4841                                 const char * const m = d1;
4842                                 while (*d1 && !isSPACE(*d1))
4843                                     d1++;
4844                                 Perl_croak(aTHX_ "Too late for \"-%.*s\" option",
4845                                       (int)(d1 - m), m);
4846                             }
4847                             d1 = moreswitches(d1);
4848                         } while (d1);
4849                         if (PL_doswitches && !switches_done) {
4850                             int argc = PL_origargc;
4851                             char **argv = PL_origargv;
4852                             do {
4853                                 argc--,argv++;
4854                             } while (argc && argv[0][0] == '-' && argv[0][1]);
4855                             init_argv_symbols(argc,argv);
4856                         }
4857                         if (((PERLDB_LINE || PERLDB_SAVESRC) && !oldpdb) ||
4858                             ((PL_minus_n || PL_minus_p) && !(oldn || oldp)))
4859                               /* if we have already added "LINE: while (<>) {",
4860                                  we must not do it again */
4861                         {
4862                             sv_setpvs(PL_linestr, "");
4863                             PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
4864                             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4865                             PL_last_lop = PL_last_uni = NULL;
4866                             PL_preambled = FALSE;
4867                             if (PERLDB_LINE || PERLDB_SAVESRC)
4868                                 (void)gv_fetchfile(PL_origfilename);
4869                             goto retry;
4870                         }
4871                     }
4872                 }
4873             }
4874         }
4875         if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
4876             PL_bufptr = s;
4877             PL_lex_state = LEX_FORMLINE;
4878             return yylex();
4879         }
4880         goto retry;
4881     case '\r':
4882 #ifdef PERL_STRICT_CR
4883         Perl_warn(aTHX_ "Illegal character \\%03o (carriage return)", '\r');
4884         Perl_croak(aTHX_
4885       "\t(Maybe you didn't strip carriage returns after a network transfer?)\n");
4886 #endif
4887     case ' ': case '\t': case '\f': case 013:
4888 #ifdef PERL_MAD
4889         PL_realtokenstart = -1;
4890         if (!PL_thiswhite)
4891             PL_thiswhite = newSVpvs("");
4892         sv_catpvn(PL_thiswhite, s, 1);
4893 #endif
4894         s++;
4895         goto retry;
4896     case '#':
4897     case '\n':
4898 #ifdef PERL_MAD
4899         PL_realtokenstart = -1;
4900         if (PL_madskills)
4901             PL_faketokens = 0;
4902 #endif
4903         if (PL_lex_state != LEX_NORMAL || (PL_in_eval && !PL_rsfp)) {
4904             if (*s == '#' && s == PL_linestart && PL_in_eval && !PL_rsfp) {
4905                 /* handle eval qq[#line 1 "foo"\n ...] */
4906                 CopLINE_dec(PL_curcop);
4907                 incline(s);
4908             }
4909             if (PL_madskills && !PL_lex_formbrack && !PL_in_eval) {
4910                 s = SKIPSPACE0(s);
4911                 if (!PL_in_eval || PL_rsfp)
4912                     incline(s);
4913             }
4914             else {
4915                 d = s;
4916                 while (d < PL_bufend && *d != '\n')
4917                     d++;
4918                 if (d < PL_bufend)
4919                     d++;
4920                 else if (d > PL_bufend) /* Found by Ilya: feed random input to Perl. */
4921                   Perl_croak(aTHX_ "panic: input overflow");
4922 #ifdef PERL_MAD
4923                 if (PL_madskills)
4924                     PL_thiswhite = newSVpvn(s, d - s);
4925 #endif
4926                 s = d;
4927                 incline(s);
4928             }
4929             if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
4930                 PL_bufptr = s;
4931                 PL_lex_state = LEX_FORMLINE;
4932                 return yylex();
4933             }
4934         }
4935         else {
4936 #ifdef PERL_MAD
4937             if (PL_madskills && CopLINE(PL_curcop) >= 1 && !PL_lex_formbrack) {
4938                 if (CopLINE(PL_curcop) == 1 && s[0] == '#' && s[1] == '!') {
4939                     PL_faketokens = 0;
4940                     s = SKIPSPACE0(s);
4941                     TOKEN(PEG); /* make sure any #! line is accessible */
4942                 }
4943                 s = SKIPSPACE0(s);
4944             }
4945             else {
4946 /*              if (PL_madskills && PL_lex_formbrack) { */
4947                     d = s;
4948                     while (d < PL_bufend && *d != '\n')
4949                         d++;
4950                     if (d < PL_bufend)
4951                         d++;
4952                     else if (d > PL_bufend) /* Found by Ilya: feed random input to Perl. */
4953                       Perl_croak(aTHX_ "panic: input overflow");
4954                     if (PL_madskills && CopLINE(PL_curcop) >= 1) {
4955                         if (!PL_thiswhite)
4956                             PL_thiswhite = newSVpvs("");
4957                         if (CopLINE(PL_curcop) == 1) {
4958                             sv_setpvs(PL_thiswhite, "");
4959                             PL_faketokens = 0;
4960                         }
4961                         sv_catpvn(PL_thiswhite, s, d - s);
4962                     }
4963                     s = d;
4964 /*              }
4965                 *s = '\0';
4966                 PL_bufend = s; */
4967             }
4968 #else
4969             *s = '\0';
4970             PL_bufend = s;
4971 #endif
4972         }
4973         goto retry;
4974     case '-':
4975         if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
4976             I32 ftst = 0;
4977             char tmp;
4978
4979             s++;
4980             PL_bufptr = s;
4981             tmp = *s++;
4982
4983             while (s < PL_bufend && SPACE_OR_TAB(*s))
4984                 s++;
4985
4986             if (strnEQ(s,"=>",2)) {
4987                 s = force_word(PL_bufptr,WORD,FALSE,FALSE,FALSE);
4988                 DEBUG_T( { printbuf("### Saw unary minus before =>, forcing word %s\n", s); } );
4989                 OPERATOR('-');          /* unary minus */
4990             }
4991             PL_last_uni = PL_oldbufptr;
4992             switch (tmp) {
4993             case 'r': ftst = OP_FTEREAD;        break;
4994             case 'w': ftst = OP_FTEWRITE;       break;
4995             case 'x': ftst = OP_FTEEXEC;        break;
4996             case 'o': ftst = OP_FTEOWNED;       break;
4997             case 'R': ftst = OP_FTRREAD;        break;
4998             case 'W': ftst = OP_FTRWRITE;       break;
4999             case 'X': ftst = OP_FTREXEC;        break;
5000             case 'O': ftst = OP_FTROWNED;       break;
5001             case 'e': ftst = OP_FTIS;           break;
5002             case 'z': ftst = OP_FTZERO;         break;
5003             case 's': ftst = OP_FTSIZE;         break;
5004             case 'f': ftst = OP_FTFILE;         break;
5005             case 'd': ftst = OP_FTDIR;          break;
5006             case 'l': ftst = OP_FTLINK;         break;
5007             case 'p': ftst = OP_FTPIPE;         break;
5008             case 'S': ftst = OP_FTSOCK;         break;
5009             case 'u': ftst = OP_FTSUID;         break;
5010             case 'g': ftst = OP_FTSGID;         break;
5011             case 'k': ftst = OP_FTSVTX;         break;
5012             case 'b': ftst = OP_FTBLK;          break;
5013             case 'c': ftst = OP_FTCHR;          break;
5014             case 't': ftst = OP_FTTTY;          break;
5015             case 'T': ftst = OP_FTTEXT;         break;
5016             case 'B': ftst = OP_FTBINARY;       break;
5017             case 'M': case 'A': case 'C':
5018                 gv_fetchpvs("\024", GV_ADD|GV_NOTQUAL, SVt_PV);
5019                 switch (tmp) {
5020                 case 'M': ftst = OP_FTMTIME;    break;
5021                 case 'A': ftst = OP_FTATIME;    break;
5022                 case 'C': ftst = OP_FTCTIME;    break;
5023                 default:                        break;
5024                 }
5025                 break;
5026             default:
5027                 break;
5028             }
5029             if (ftst) {
5030                 PL_last_lop_op = (OPCODE)ftst;
5031                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
5032                         "### Saw file test %c\n", (int)tmp);
5033                 } );
5034                 FTST(ftst);
5035             }
5036             else {
5037                 /* Assume it was a minus followed by a one-letter named
5038                  * subroutine call (or a -bareword), then. */
5039                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
5040                         "### '-%c' looked like a file test but was not\n",
5041                         (int) tmp);
5042                 } );
5043                 s = --PL_bufptr;
5044             }
5045         }
5046         {
5047             const char tmp = *s++;
5048             if (*s == tmp) {
5049                 s++;
5050                 if (PL_expect == XOPERATOR)
5051                     TERM(POSTDEC);
5052                 else
5053                     OPERATOR(PREDEC);
5054             }
5055             else if (*s == '>') {
5056                 s++;
5057                 s = SKIPSPACE1(s);
5058                 if (isIDFIRST_lazy_if(s,UTF)) {
5059                     s = force_word(s,METHOD,FALSE,TRUE,FALSE);
5060                     TOKEN(ARROW);
5061                 }
5062                 else if (*s == '$')
5063                     OPERATOR(ARROW);
5064                 else
5065                     TERM(ARROW);
5066             }
5067             if (PL_expect == XOPERATOR)
5068                 Aop(OP_SUBTRACT);
5069             else {
5070                 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
5071                     check_uni();
5072                 OPERATOR('-');          /* unary minus */
5073             }
5074         }
5075
5076     case '+':
5077         {
5078             const char tmp = *s++;
5079             if (*s == tmp) {
5080                 s++;
5081                 if (PL_expect == XOPERATOR)
5082                     TERM(POSTINC);
5083                 else
5084                     OPERATOR(PREINC);
5085             }
5086             if (PL_expect == XOPERATOR)
5087                 Aop(OP_ADD);
5088             else {
5089                 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
5090                     check_uni();
5091                 OPERATOR('+');
5092             }
5093         }
5094
5095     case '*':
5096         if (PL_expect != XOPERATOR) {
5097             s = scan_ident(s, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
5098             PL_expect = XOPERATOR;
5099             force_ident(PL_tokenbuf, '*');
5100             if (!*PL_tokenbuf)
5101                 PREREF('*');
5102             TERM('*');
5103         }
5104         s++;
5105         if (*s == '*') {
5106             s++;
5107             PWop(OP_POW);
5108         }
5109         Mop(OP_MULTIPLY);
5110
5111     case '%':
5112         if (PL_expect == XOPERATOR) {
5113             ++s;
5114             Mop(OP_MODULO);
5115         }
5116         PL_tokenbuf[0] = '%';
5117         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
5118                 sizeof PL_tokenbuf - 1, FALSE);
5119         if (!PL_tokenbuf[1]) {
5120             PREREF('%');
5121         }
5122         PL_pending_ident = '%';
5123         TERM('%');
5124
5125     case '^':
5126         s++;
5127         BOop(OP_BIT_XOR);
5128     case '[':
5129         PL_lex_brackets++;
5130         {
5131             const char tmp = *s++;
5132             OPERATOR(tmp);
5133         }
5134     case '~':
5135         if (s[1] == '~'
5136             && (PL_expect == XOPERATOR || PL_expect == XTERMORDORDOR))
5137         {
5138             s += 2;
5139             Eop(OP_SMARTMATCH);
5140         }
5141     case ',':
5142         {
5143             const char tmp = *s++;
5144             OPERATOR(tmp);
5145         }
5146     case ':':
5147         if (s[1] == ':') {
5148             len = 0;
5149             goto just_a_word_zero_gv;
5150         }
5151         s++;
5152         switch (PL_expect) {
5153             OP *attrs;
5154 #ifdef PERL_MAD
5155             I32 stuffstart;
5156 #endif
5157         case XOPERATOR:
5158             if (!PL_in_my || PL_lex_state != LEX_NORMAL)
5159                 break;
5160             PL_bufptr = s;      /* update in case we back off */
5161             if (*s == '=') {
5162                 deprecate(":= for an empty attribute list");
5163             }
5164             goto grabattrs;
5165         case XATTRBLOCK:
5166             PL_expect = XBLOCK;
5167             goto grabattrs;
5168         case XATTRTERM:
5169             PL_expect = XTERMBLOCK;
5170          grabattrs:
5171 #ifdef PERL_MAD
5172             stuffstart = s - SvPVX(PL_linestr) - 1;
5173 #endif
5174             s = PEEKSPACE(s);
5175             attrs = NULL;
5176             while (isIDFIRST_lazy_if(s,UTF)) {
5177                 I32 tmp;
5178                 SV *sv;
5179                 d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
5180                 if (isLOWER(*s) && (tmp = keyword(PL_tokenbuf, len, 0))) {
5181                     if (tmp < 0) tmp = -tmp;
5182                     switch (tmp) {
5183                     case KEY_or:
5184                     case KEY_and:
5185                     case KEY_for:
5186                     case KEY_foreach:
5187                     case KEY_unless:
5188                     case KEY_if:
5189                     case KEY_while:
5190                     case KEY_until:
5191                         goto got_attrs;
5192                     default:
5193                         break;
5194                     }
5195                 }
5196                 sv = newSVpvn(s, len);
5197                 if (*d == '(') {
5198                     d = scan_str(d,TRUE,TRUE);
5199                     if (!d) {
5200                         /* MUST advance bufptr here to avoid bogus
5201                            "at end of line" context messages from yyerror().
5202                          */
5203                         PL_bufptr = s + len;
5204                         yyerror("Unterminated attribute parameter in attribute list");
5205                         if (attrs)
5206                             op_free(attrs);
5207                         sv_free(sv);
5208                         return REPORT(0);       /* EOF indicator */
5209                     }
5210                 }
5211                 if (PL_lex_stuff) {
5212                     sv_catsv(sv, PL_lex_stuff);
5213                     attrs = append_elem(OP_LIST, attrs,
5214                                         newSVOP(OP_CONST, 0, sv));
5215                     SvREFCNT_dec(PL_lex_stuff);
5216                     PL_lex_stuff = NULL;
5217                 }
5218                 else {
5219                     if (len == 6 && strnEQ(SvPVX(sv), "unique", len)) {
5220                         sv_free(sv);
5221                         if (PL_in_my == KEY_our) {
5222                             deprecate(":unique");
5223                         }
5224                         else
5225                             Perl_croak(aTHX_ "The 'unique' attribute may only be applied to 'our' variables");
5226                     }
5227
5228                     /* NOTE: any CV attrs applied here need to be part of
5229                        the CVf_BUILTIN_ATTRS define in cv.h! */
5230                     else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "lvalue", len)) {
5231                         sv_free(sv);
5232                         CvLVALUE_on(PL_compcv);
5233                     }
5234                     else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "locked", len)) {
5235                         sv_free(sv);
5236                         deprecate(":locked");
5237                     }
5238                     else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "method", len)) {
5239                         sv_free(sv);
5240                         CvMETHOD_on(PL_compcv);
5241                     }
5242                     /* After we've set the flags, it could be argued that
5243                        we don't need to do the attributes.pm-based setting
5244                        process, and shouldn't bother appending recognized
5245                        flags.  To experiment with that, uncomment the
5246                        following "else".  (Note that's already been
5247                        uncommented.  That keeps the above-applied built-in
5248                        attributes from being intercepted (and possibly
5249                        rejected) by a package's attribute routines, but is
5250                        justified by the performance win for the common case
5251                        of applying only built-in attributes.) */
5252                     else
5253                         attrs = append_elem(OP_LIST, attrs,
5254                                             newSVOP(OP_CONST, 0,
5255                                                     sv));
5256                 }
5257                 s = PEEKSPACE(d);
5258                 if (*s == ':' && s[1] != ':')
5259                     s = PEEKSPACE(s+1);
5260                 else if (s == d)
5261                     break;      /* require real whitespace or :'s */
5262                 /* XXX losing whitespace on sequential attributes here */
5263             }
5264             {
5265                 const char tmp
5266                     = (PL_expect == XOPERATOR ? '=' : '{'); /*'}(' for vi */
5267                 if (*s != ';' && *s != '}' && *s != tmp
5268                     && (tmp != '=' || *s != ')')) {
5269                     const char q = ((*s == '\'') ? '"' : '\'');
5270                     /* If here for an expression, and parsed no attrs, back
5271                        off. */
5272                     if (tmp == '=' && !attrs) {
5273                         s = PL_bufptr;
5274                         break;
5275                     }
5276                     /* MUST advance bufptr here to avoid bogus "at end of line"
5277                        context messages from yyerror().
5278                     */
5279                     PL_bufptr = s;
5280                     yyerror( (const char *)
5281                              (*s
5282                               ? Perl_form(aTHX_ "Invalid separator character "
5283                                           "%c%c%c in attribute list", q, *s, q)
5284                               : "Unterminated attribute list" ) );
5285                     if (attrs)
5286                         op_free(attrs);
5287                     OPERATOR(':');
5288                 }
5289             }
5290         got_attrs:
5291             if (attrs) {
5292                 start_force(PL_curforce);
5293                 NEXTVAL_NEXTTOKE.opval = attrs;
5294                 CURMAD('_', PL_nextwhite);
5295                 force_next(THING);
5296             }
5297 #ifdef PERL_MAD
5298             if (PL_madskills) {
5299                 PL_thistoken = newSVpvn(SvPVX(PL_linestr) + stuffstart,
5300                                      (s - SvPVX(PL_linestr)) - stuffstart);
5301             }
5302 #endif
5303             TOKEN(COLONATTR);
5304         }
5305         OPERATOR(':');
5306     case '(':
5307         s++;
5308         if (PL_last_lop == PL_oldoldbufptr || PL_last_uni == PL_oldoldbufptr)
5309             PL_oldbufptr = PL_oldoldbufptr;             /* allow print(STDOUT 123) */
5310         else
5311             PL_expect = XTERM;
5312         s = SKIPSPACE1(s);
5313         TOKEN('(');
5314     case ';':
5315         CLINE;
5316         {
5317             const char tmp = *s++;
5318             OPERATOR(tmp);
5319         }
5320     case ')':
5321         {
5322             const char tmp = *s++;
5323             s = SKIPSPACE1(s);
5324             if (*s == '{')
5325                 PREBLOCK(tmp);
5326             TERM(tmp);
5327         }
5328     case ']':
5329         s++;
5330         if (PL_lex_brackets <= 0)
5331             yyerror("Unmatched right square bracket");
5332         else
5333             --PL_lex_brackets;
5334         if (PL_lex_state == LEX_INTERPNORMAL) {
5335             if (PL_lex_brackets == 0) {
5336                 if (*s == '-' && s[1] == '>')
5337                     PL_lex_state = LEX_INTERPENDMAYBE;
5338                 else if (*s != '[' && *s != '{')
5339                     PL_lex_state = LEX_INTERPEND;
5340             }
5341         }
5342         TERM(']');
5343     case '{':
5344       leftbracket:
5345         s++;
5346         if (PL_lex_brackets > 100) {
5347             Renew(PL_lex_brackstack, PL_lex_brackets + 10, char);
5348         }
5349         switch (PL_expect) {
5350         case XTERM:
5351             if (PL_lex_formbrack) {
5352                 s--;
5353                 PRETERMBLOCK(DO);
5354             }
5355             if (PL_oldoldbufptr == PL_last_lop)
5356                 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
5357             else
5358                 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
5359             OPERATOR(HASHBRACK);
5360         case XOPERATOR:
5361             while (s < PL_bufend && SPACE_OR_TAB(*s))
5362                 s++;
5363             d = s;
5364             PL_tokenbuf[0] = '\0';
5365             if (d < PL_bufend && *d == '-') {
5366                 PL_tokenbuf[0] = '-';
5367                 d++;
5368                 while (d < PL_bufend && SPACE_OR_TAB(*d))
5369                     d++;
5370             }
5371             if (d < PL_bufend && isIDFIRST_lazy_if(d,UTF)) {
5372                 d = scan_word(d, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
5373                               FALSE, &len);
5374                 while (d < PL_bufend && SPACE_OR_TAB(*d))
5375                     d++;
5376                 if (*d == '}') {
5377                     const char minus = (PL_tokenbuf[0] == '-');
5378                     s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
5379                     if (minus)
5380                         force_next('-');
5381                 }
5382             }
5383             /* FALL THROUGH */
5384         case XATTRBLOCK:
5385         case XBLOCK:
5386             PL_lex_brackstack[PL_lex_brackets++] = XSTATE;
5387             PL_expect = XSTATE;
5388             break;
5389         case XATTRTERM:
5390         case XTERMBLOCK:
5391             PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
5392             PL_expect = XSTATE;
5393             break;
5394         default: {
5395                 const char *t;
5396                 if (PL_oldoldbufptr == PL_last_lop)
5397                     PL_lex_brackstack[PL_lex_brackets++] = XTERM;
5398                 else
5399                     PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
5400                 s = SKIPSPACE1(s);
5401                 if (*s == '}') {
5402                     if (PL_expect == XREF && PL_lex_state == LEX_INTERPNORMAL) {
5403                         PL_expect = XTERM;
5404                         /* This hack is to get the ${} in the message. */
5405                         PL_bufptr = s+1;
5406                         yyerror("syntax error");
5407                         break;
5408                     }
5409                     OPERATOR(HASHBRACK);
5410                 }
5411                 /* This hack serves to disambiguate a pair of curlies
5412                  * as being a block or an anon hash.  Normally, expectation
5413                  * determines that, but in cases where we're not in a
5414                  * position to expect anything in particular (like inside
5415                  * eval"") we have to resolve the ambiguity.  This code
5416                  * covers the case where the first term in the curlies is a
5417                  * quoted string.  Most other cases need to be explicitly
5418                  * disambiguated by prepending a "+" before the opening
5419                  * curly in order to force resolution as an anon hash.
5420                  *
5421                  * XXX should probably propagate the outer expectation
5422                  * into eval"" to rely less on this hack, but that could
5423                  * potentially break current behavior of eval"".
5424                  * GSAR 97-07-21
5425                  */
5426                 t = s;
5427                 if (*s == '\'' || *s == '"' || *s == '`') {
5428                     /* common case: get past first string, handling escapes */
5429                     for (t++; t < PL_bufend && *t != *s;)
5430                         if (*t++ == '\\' && (*t == '\\' || *t == *s))
5431                             t++;
5432                     t++;
5433                 }
5434                 else if (*s == 'q') {
5435                     if (++t < PL_bufend
5436                         && (!isALNUM(*t)
5437                             || ((*t == 'q' || *t == 'x') && ++t < PL_bufend
5438                                 && !isALNUM(*t))))
5439                     {
5440                         /* skip q//-like construct */
5441                         const char *tmps;
5442                         char open, close, term;
5443                         I32 brackets = 1;
5444
5445                         while (t < PL_bufend && isSPACE(*t))
5446                             t++;
5447                         /* check for q => */
5448                         if (t+1 < PL_bufend && t[0] == '=' && t[1] == '>') {
5449                             OPERATOR(HASHBRACK);
5450                         }
5451                         term = *t;
5452                         open = term;
5453                         if (term && (tmps = strchr("([{< )]}> )]}>",term)))
5454                             term = tmps[5];
5455                         close = term;
5456                         if (open == close)
5457                             for (t++; t < PL_bufend; t++) {
5458                                 if (*t == '\\' && t+1 < PL_bufend && open != '\\')
5459                                     t++;
5460                                 else if (*t == open)
5461                                     break;
5462                             }
5463                         else {
5464                             for (t++; t < PL_bufend; t++) {
5465                                 if (*t == '\\' && t+1 < PL_bufend)
5466                                     t++;
5467                                 else if (*t == close && --brackets <= 0)
5468                                     break;
5469                                 else if (*t == open)
5470                                     brackets++;
5471                             }
5472                         }
5473                         t++;
5474                     }
5475                     else
5476                         /* skip plain q word */
5477                         while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
5478                              t += UTF8SKIP(t);
5479                 }
5480                 else if (isALNUM_lazy_if(t,UTF)) {
5481                     t += UTF8SKIP(t);
5482                     while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
5483                          t += UTF8SKIP(t);
5484                 }
5485                 while (t < PL_bufend && isSPACE(*t))
5486                     t++;
5487                 /* if comma follows first term, call it an anon hash */
5488                 /* XXX it could be a comma expression with loop modifiers */
5489                 if (t < PL_bufend && ((*t == ',' && (*s == 'q' || !isLOWER(*s)))
5490                                    || (*t == '=' && t[1] == '>')))
5491                     OPERATOR(HASHBRACK);
5492                 if (PL_expect == XREF)
5493                     PL_expect = XTERM;
5494                 else {
5495                     PL_lex_brackstack[PL_lex_brackets-1] = XSTATE;
5496                     PL_expect = XSTATE;
5497                 }
5498             }
5499             break;
5500         }
5501         pl_yylval.ival = CopLINE(PL_curcop);
5502         if (isSPACE(*s) || *s == '#')
5503             PL_copline = NOLINE;   /* invalidate current command line number */
5504         TOKEN('{');
5505     case '}':
5506       rightbracket:
5507         s++;
5508         if (PL_lex_brackets <= 0)
5509             yyerror("Unmatched right curly bracket");
5510         else
5511             PL_expect = (expectation)PL_lex_brackstack[--PL_lex_brackets];
5512         if (PL_lex_brackets < PL_lex_formbrack && PL_lex_state != LEX_INTERPNORMAL)
5513             PL_lex_formbrack = 0;
5514         if (PL_lex_state == LEX_INTERPNORMAL) {
5515             if (PL_lex_brackets == 0) {
5516                 if (PL_expect & XFAKEBRACK) {
5517                     PL_expect &= XENUMMASK;
5518                     PL_lex_state = LEX_INTERPEND;
5519                     PL_bufptr = s;
5520 #if 0
5521                     if (PL_madskills) {
5522                         if (!PL_thiswhite)
5523                             PL_thiswhite = newSVpvs("");
5524                         sv_catpvs(PL_thiswhite,"}");
5525                     }
5526 #endif
5527                     return yylex();     /* ignore fake brackets */
5528                 }
5529                 if (*s == '-' && s[1] == '>')
5530                     PL_lex_state = LEX_INTERPENDMAYBE;
5531                 else if (*s != '[' && *s != '{')
5532                     PL_lex_state = LEX_INTERPEND;
5533             }
5534         }
5535         if (PL_expect & XFAKEBRACK) {
5536             PL_expect &= XENUMMASK;
5537             PL_bufptr = s;
5538             return yylex();             /* ignore fake brackets */
5539         }
5540         start_force(PL_curforce);
5541         if (PL_madskills) {
5542             curmad('X', newSVpvn(s-1,1));
5543             CURMAD('_', PL_thiswhite);
5544         }
5545         force_next('}');
5546 #ifdef PERL_MAD
5547         if (!PL_thistoken)
5548             PL_thistoken = newSVpvs("");
5549 #endif
5550         TOKEN(';');
5551     case '&':
5552         s++;
5553         if (*s++ == '&')
5554             AOPERATOR(ANDAND);
5555         s--;
5556         if (PL_expect == XOPERATOR) {
5557             if (PL_bufptr == PL_linestart && ckWARN(WARN_SEMICOLON)
5558                 && isIDFIRST_lazy_if(s,UTF))
5559             {
5560                 CopLINE_dec(PL_curcop);
5561                 Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), "%s", PL_warn_nosemi);
5562                 CopLINE_inc(PL_curcop);
5563             }
5564             BAop(OP_BIT_AND);
5565         }
5566
5567         s = scan_ident(s - 1, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
5568         if (*PL_tokenbuf) {
5569             PL_expect = XOPERATOR;
5570             force_ident(PL_tokenbuf, '&');
5571         }
5572         else
5573             PREREF('&');
5574         pl_yylval.ival = (OPpENTERSUB_AMPER<<8);
5575         TERM('&');
5576
5577     case '|':
5578         s++;
5579         if (*s++ == '|')
5580             AOPERATOR(OROR);
5581         s--;
5582         BOop(OP_BIT_OR);
5583     case '=':
5584         s++;
5585         {
5586             const char tmp = *s++;
5587             if (tmp == '=')
5588                 Eop(OP_EQ);
5589             if (tmp == '>')
5590                 OPERATOR(',');
5591             if (tmp == '~')
5592                 PMop(OP_MATCH);
5593             if (tmp && isSPACE(*s) && ckWARN(WARN_SYNTAX)
5594                 && strchr("+-*/%.^&|<",tmp))
5595                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5596                             "Reversed %c= operator",(int)tmp);
5597             s--;
5598             if (PL_expect == XSTATE && isALPHA(tmp) &&
5599                 (s == PL_linestart+1 || s[-2] == '\n') )
5600                 {
5601                     if (PL_in_eval && !PL_rsfp) {
5602                         d = PL_bufend;
5603                         while (s < d) {
5604                             if (*s++ == '\n') {
5605                                 incline(s);
5606                                 if (strnEQ(s,"=cut",4)) {
5607                                     s = strchr(s,'\n');
5608                                     if (s)
5609                                         s++;
5610                                     else
5611                                         s = d;
5612                                     incline(s);
5613                                     goto retry;
5614                                 }
5615                             }
5616                         }
5617                         goto retry;
5618                     }
5619 #ifdef PERL_MAD
5620                     if (PL_madskills) {
5621                         if (!PL_thiswhite)
5622                             PL_thiswhite = newSVpvs("");
5623                         sv_catpvn(PL_thiswhite, PL_linestart,
5624                                   PL_bufend - PL_linestart);
5625                     }
5626 #endif
5627                     s = PL_bufend;
5628                     PL_doextract = TRUE;
5629                     goto retry;
5630                 }
5631         }
5632         if (PL_lex_brackets < PL_lex_formbrack) {
5633             const char *t = s;
5634 #ifdef PERL_STRICT_CR
5635             while (SPACE_OR_TAB(*t))
5636 #else
5637             while (SPACE_OR_TAB(*t) || *t == '\r')
5638 #endif
5639                 t++;
5640             if (*t == '\n' || *t == '#') {
5641                 s--;
5642                 PL_expect = XBLOCK;
5643                 goto leftbracket;
5644             }
5645         }
5646         pl_yylval.ival = 0;
5647         OPERATOR(ASSIGNOP);
5648     case '!':
5649         s++;
5650         {
5651             const char tmp = *s++;
5652             if (tmp == '=') {
5653                 /* was this !=~ where !~ was meant?
5654                  * warn on m:!=~\s+([/?]|[msy]\W|tr\W): */
5655
5656                 if (*s == '~' && ckWARN(WARN_SYNTAX)) {
5657                     const char *t = s+1;
5658
5659                     while (t < PL_bufend && isSPACE(*t))
5660                         ++t;
5661
5662                     if (*t == '/' || *t == '?' ||
5663                         ((*t == 'm' || *t == 's' || *t == 'y')
5664                          && !isALNUM(t[1])) ||
5665                         (*t == 't' && t[1] == 'r' && !isALNUM(t[2])))
5666                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5667                                     "!=~ should be !~");
5668                 }
5669                 Eop(OP_NE);
5670             }
5671             if (tmp == '~')
5672                 PMop(OP_NOT);
5673         }
5674         s--;
5675         OPERATOR('!');
5676     case '<':
5677         if (PL_expect != XOPERATOR) {
5678             if (s[1] != '<' && !strchr(s,'>'))
5679                 check_uni();
5680             if (s[1] == '<')
5681                 s = scan_heredoc(s);
5682             else
5683                 s = scan_inputsymbol(s);
5684             TERM(sublex_start());
5685         }
5686         s++;
5687         {
5688             char tmp = *s++;
5689             if (tmp == '<')
5690                 SHop(OP_LEFT_SHIFT);
5691             if (tmp == '=') {
5692                 tmp = *s++;
5693                 if (tmp == '>')
5694                     Eop(OP_NCMP);
5695                 s--;
5696                 Rop(OP_LE);
5697             }
5698         }
5699         s--;
5700         Rop(OP_LT);
5701     case '>':
5702         s++;
5703         {
5704             const char tmp = *s++;
5705             if (tmp == '>')
5706                 SHop(OP_RIGHT_SHIFT);
5707             else if (tmp == '=')
5708                 Rop(OP_GE);
5709         }
5710         s--;
5711         Rop(OP_GT);
5712
5713     case '$':
5714         CLINE;
5715
5716         if (PL_expect == XOPERATOR) {
5717             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
5718                 return deprecate_commaless_var_list();
5719             }
5720         }
5721
5722         if (s[1] == '#' && (isIDFIRST_lazy_if(s+2,UTF) || strchr("{$:+-", s[2]))) {
5723             PL_tokenbuf[0] = '@';
5724             s = scan_ident(s + 1, PL_bufend, PL_tokenbuf + 1,
5725                            sizeof PL_tokenbuf - 1, FALSE);
5726             if (PL_expect == XOPERATOR)
5727                 no_op("Array length", s);
5728             if (!PL_tokenbuf[1])
5729                 PREREF(DOLSHARP);
5730             PL_expect = XOPERATOR;
5731             PL_pending_ident = '#';
5732             TOKEN(DOLSHARP);
5733         }
5734
5735         PL_tokenbuf[0] = '$';
5736         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
5737                        sizeof PL_tokenbuf - 1, FALSE);
5738         if (PL_expect == XOPERATOR)
5739             no_op("Scalar", s);
5740         if (!PL_tokenbuf[1]) {
5741             if (s == PL_bufend)
5742                 yyerror("Final $ should be \\$ or $name");
5743             PREREF('$');
5744         }
5745
5746         /* This kludge not intended to be bulletproof. */
5747         if (PL_tokenbuf[1] == '[' && !PL_tokenbuf[2]) {
5748             pl_yylval.opval = newSVOP(OP_CONST, 0,
5749                                    newSViv(CopARYBASE_get(&PL_compiling)));
5750             pl_yylval.opval->op_private = OPpCONST_ARYBASE;
5751             TERM(THING);
5752         }
5753
5754         d = s;
5755         {
5756             const char tmp = *s;
5757             if (PL_lex_state == LEX_NORMAL || PL_lex_brackets)
5758                 s = SKIPSPACE1(s);
5759
5760             if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop)
5761                 && intuit_more(s)) {
5762                 if (*s == '[') {
5763                     PL_tokenbuf[0] = '@';
5764                     if (ckWARN(WARN_SYNTAX)) {
5765                         char *t = s+1;
5766
5767                         while (isSPACE(*t) || isALNUM_lazy_if(t,UTF) || *t == '$')
5768                             t++;
5769                         if (*t++ == ',') {
5770                             PL_bufptr = PEEKSPACE(PL_bufptr); /* XXX can realloc */
5771                             while (t < PL_bufend && *t != ']')
5772                                 t++;
5773                             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5774                                         "Multidimensional syntax %.*s not supported",
5775                                     (int)((t - PL_bufptr) + 1), PL_bufptr);
5776                         }
5777                     }
5778                 }
5779                 else if (*s == '{') {
5780                     char *t;
5781                     PL_tokenbuf[0] = '%';
5782                     if (strEQ(PL_tokenbuf+1, "SIG")  && ckWARN(WARN_SYNTAX)
5783                         && (t = strchr(s, '}')) && (t = strchr(t, '=')))
5784                         {
5785                             char tmpbuf[sizeof PL_tokenbuf];
5786                             do {
5787                                 t++;
5788                             } while (isSPACE(*t));
5789                             if (isIDFIRST_lazy_if(t,UTF)) {
5790                                 STRLEN len;
5791                                 t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE,
5792                                               &len);
5793                                 while (isSPACE(*t))
5794                                     t++;
5795                                 if (*t == ';' && get_cvn_flags(tmpbuf, len, 0))
5796                                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5797                                                 "You need to quote \"%s\"",
5798                                                 tmpbuf);
5799                             }
5800                         }
5801                 }
5802             }
5803
5804             PL_expect = XOPERATOR;
5805             if (PL_lex_state == LEX_NORMAL && isSPACE((char)tmp)) {
5806                 const bool islop = (PL_last_lop == PL_oldoldbufptr);
5807                 if (!islop || PL_last_lop_op == OP_GREPSTART)
5808                     PL_expect = XOPERATOR;
5809                 else if (strchr("$@\"'`q", *s))
5810                     PL_expect = XTERM;          /* e.g. print $fh "foo" */
5811                 else if (strchr("&*<%", *s) && isIDFIRST_lazy_if(s+1,UTF))
5812                     PL_expect = XTERM;          /* e.g. print $fh &sub */
5813                 else if (isIDFIRST_lazy_if(s,UTF)) {
5814                     char tmpbuf[sizeof PL_tokenbuf];
5815                     int t2;
5816                     scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
5817                     if ((t2 = keyword(tmpbuf, len, 0))) {
5818                         /* binary operators exclude handle interpretations */
5819                         switch (t2) {
5820                         case -KEY_x:
5821                         case -KEY_eq:
5822                         case -KEY_ne:
5823                         case -KEY_gt:
5824                         case -KEY_lt:
5825                         case -KEY_ge:
5826                         case -KEY_le:
5827                         case -KEY_cmp:
5828                             break;
5829                         default:
5830                             PL_expect = XTERM;  /* e.g. print $fh length() */
5831                             break;
5832                         }
5833                     }
5834                     else {
5835                         PL_expect = XTERM;      /* e.g. print $fh subr() */
5836                     }
5837                 }
5838                 else if (isDIGIT(*s))
5839                     PL_expect = XTERM;          /* e.g. print $fh 3 */
5840                 else if (*s == '.' && isDIGIT(s[1]))
5841                     PL_expect = XTERM;          /* e.g. print $fh .3 */
5842                 else if ((*s == '?' || *s == '-' || *s == '+')
5843                          && !isSPACE(s[1]) && s[1] != '=')
5844                     PL_expect = XTERM;          /* e.g. print $fh -1 */
5845                 else if (*s == '/' && !isSPACE(s[1]) && s[1] != '='
5846                          && s[1] != '/')
5847                     PL_expect = XTERM;          /* e.g. print $fh /.../
5848                                                    XXX except DORDOR operator
5849                                                 */
5850                 else if (*s == '<' && s[1] == '<' && !isSPACE(s[2])
5851                          && s[2] != '=')
5852                     PL_expect = XTERM;          /* print $fh <<"EOF" */
5853             }
5854         }
5855         PL_pending_ident = '$';
5856         TOKEN('$');
5857
5858     case '@':
5859         if (PL_expect == XOPERATOR)
5860             no_op("Array", s);
5861         PL_tokenbuf[0] = '@';
5862         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, FALSE);
5863         if (!PL_tokenbuf[1]) {
5864             PREREF('@');
5865         }
5866         if (PL_lex_state == LEX_NORMAL)
5867             s = SKIPSPACE1(s);
5868         if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
5869             if (*s == '{')
5870                 PL_tokenbuf[0] = '%';
5871
5872             /* Warn about @ where they meant $. */
5873             if (*s == '[' || *s == '{') {
5874                 if (ckWARN(WARN_SYNTAX)) {
5875                     const char *t = s + 1;
5876                     while (*t && (isALNUM_lazy_if(t,UTF) || strchr(" \t$#+-'\"", *t)))
5877                         t++;
5878                     if (*t == '}' || *t == ']') {
5879                         t++;
5880                         PL_bufptr = PEEKSPACE(PL_bufptr); /* XXX can realloc */
5881                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5882                             "Scalar value %.*s better written as $%.*s",
5883                             (int)(t-PL_bufptr), PL_bufptr,
5884                             (int)(t-PL_bufptr-1), PL_bufptr+1);
5885                     }
5886                 }
5887             }
5888         }
5889         PL_pending_ident = '@';
5890         TERM('@');
5891
5892      case '/':                  /* may be division, defined-or, or pattern */
5893         if (PL_expect == XTERMORDORDOR && s[1] == '/') {
5894             s += 2;
5895             AOPERATOR(DORDOR);
5896         }
5897      case '?':                  /* may either be conditional or pattern */
5898         if (PL_expect == XOPERATOR) {
5899              char tmp = *s++;
5900              if(tmp == '?') {
5901                 OPERATOR('?');
5902              }
5903              else {
5904                  tmp = *s++;
5905                  if(tmp == '/') {
5906                      /* A // operator. */
5907                     AOPERATOR(DORDOR);
5908                  }
5909                  else {
5910                      s--;
5911                      Mop(OP_DIVIDE);
5912                  }
5913              }
5914          }
5915          else {
5916              /* Disable warning on "study /blah/" */
5917              if (PL_oldoldbufptr == PL_last_uni
5918               && (*PL_last_uni != 's' || s - PL_last_uni < 5
5919                   || memNE(PL_last_uni, "study", 5)
5920                   || isALNUM_lazy_if(PL_last_uni+5,UTF)
5921               ))
5922                  check_uni();
5923              s = scan_pat(s,OP_MATCH);
5924              TERM(sublex_start());
5925          }
5926
5927     case '.':
5928         if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack
5929 #ifdef PERL_STRICT_CR
5930             && s[1] == '\n'
5931 #else
5932             && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n'))
5933 #endif
5934             && (s == PL_linestart || s[-1] == '\n') )
5935         {
5936             PL_lex_formbrack = 0;
5937             PL_expect = XSTATE;
5938             goto rightbracket;
5939         }
5940         if (PL_expect == XSTATE && s[1] == '.' && s[2] == '.') {
5941             s += 3;
5942             OPERATOR(YADAYADA);
5943         }
5944         if (PL_expect == XOPERATOR || !isDIGIT(s[1])) {
5945             char tmp = *s++;
5946             if (*s == tmp) {
5947                 s++;
5948                 if (*s == tmp) {
5949                     s++;
5950                     pl_yylval.ival = OPf_SPECIAL;
5951                 }
5952                 else
5953                     pl_yylval.ival = 0;
5954                 OPERATOR(DOTDOT);
5955             }
5956             Aop(OP_CONCAT);
5957         }
5958         /* FALL THROUGH */
5959     case '0': case '1': case '2': case '3': case '4':
5960     case '5': case '6': case '7': case '8': case '9':
5961         s = scan_num(s, &pl_yylval);
5962         DEBUG_T( { printbuf("### Saw number in %s\n", s); } );
5963         if (PL_expect == XOPERATOR)
5964             no_op("Number",s);
5965         TERM(THING);
5966
5967     case '\'':
5968         s = scan_str(s,!!PL_madskills,FALSE);
5969         DEBUG_T( { printbuf("### Saw string before %s\n", s); } );
5970         if (PL_expect == XOPERATOR) {
5971             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
5972                 return deprecate_commaless_var_list();
5973             }
5974             else
5975                 no_op("String",s);
5976         }
5977         if (!s)
5978             missingterm(NULL);
5979         pl_yylval.ival = OP_CONST;
5980         TERM(sublex_start());
5981
5982     case '"':
5983         s = scan_str(s,!!PL_madskills,FALSE);
5984         DEBUG_T( { printbuf("### Saw string before %s\n", s); } );
5985         if (PL_expect == XOPERATOR) {
5986             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
5987                 return deprecate_commaless_var_list();
5988             }
5989             else
5990                 no_op("String",s);
5991         }
5992         if (!s)
5993             missingterm(NULL);
5994         pl_yylval.ival = OP_CONST;
5995         /* FIXME. I think that this can be const if char *d is replaced by
5996            more localised variables.  */
5997         for (d = SvPV(PL_lex_stuff, len); len; len--, d++) {
5998             if (*d == '$' || *d == '@' || *d == '\\' || !UTF8_IS_INVARIANT((U8)*d)) {
5999                 pl_yylval.ival = OP_STRINGIFY;
6000                 break;
6001             }
6002         }
6003         TERM(sublex_start());
6004
6005     case '`':
6006         s = scan_str(s,!!PL_madskills,FALSE);
6007         DEBUG_T( { printbuf("### Saw backtick string before %s\n", s); } );
6008         if (PL_expect == XOPERATOR)
6009             no_op("Backticks",s);
6010         if (!s)
6011             missingterm(NULL);
6012         readpipe_override();
6013         TERM(sublex_start());
6014
6015     case '\\':
6016         s++;
6017         if (PL_lex_inwhat && isDIGIT(*s))
6018             Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),"Can't use \\%c to mean $%c in expression",
6019                            *s, *s);
6020         if (PL_expect == XOPERATOR)
6021             no_op("Backslash",s);
6022         OPERATOR(REFGEN);
6023
6024     case 'v':
6025         if (isDIGIT(s[1]) && PL_expect != XOPERATOR) {
6026             char *start = s + 2;
6027             while (isDIGIT(*start) || *start == '_')
6028                 start++;
6029             if (*start == '.' && isDIGIT(start[1])) {
6030                 s = scan_num(s, &pl_yylval);
6031                 TERM(THING);
6032             }
6033             /* avoid v123abc() or $h{v1}, allow C<print v10;> */
6034             else if (!isALPHA(*start) && (PL_expect == XTERM
6035                         || PL_expect == XREF || PL_expect == XSTATE
6036                         || PL_expect == XTERMORDORDOR)) {
6037                 GV *const gv = gv_fetchpvn_flags(s, start - s, 0, SVt_PVCV);
6038                 if (!gv) {
6039                     s = scan_num(s, &pl_yylval);
6040                     TERM(THING);
6041                 }
6042             }
6043         }
6044         goto keylookup;
6045     case 'x':
6046         if (isDIGIT(s[1]) && PL_expect == XOPERATOR) {
6047             s++;
6048             Mop(OP_REPEAT);
6049         }
6050         goto keylookup;
6051
6052     case '_':
6053     case 'a': case 'A':
6054     case 'b': case 'B':
6055     case 'c': case 'C':
6056     case 'd': case 'D':
6057     case 'e': case 'E':
6058     case 'f': case 'F':
6059     case 'g': case 'G':
6060     case 'h': case 'H':
6061     case 'i': case 'I':
6062     case 'j': case 'J':
6063     case 'k': case 'K':
6064     case 'l': case 'L':
6065     case 'm': case 'M':
6066     case 'n': case 'N':
6067     case 'o': case 'O':
6068     case 'p': case 'P':
6069     case 'q': case 'Q':
6070     case 'r': case 'R':
6071     case 's': case 'S':
6072     case 't': case 'T':
6073     case 'u': case 'U':
6074               case 'V':
6075     case 'w': case 'W':
6076               case 'X':
6077     case 'y': case 'Y':
6078     case 'z': case 'Z':
6079
6080       keylookup: {
6081         bool anydelim;
6082         I32 tmp;
6083
6084         orig_keyword = 0;
6085         gv = NULL;
6086         gvp = NULL;
6087
6088         PL_bufptr = s;
6089         s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
6090
6091         /* Some keywords can be followed by any delimiter, including ':' */
6092         anydelim = ((len == 1 && strchr("msyq", PL_tokenbuf[0])) ||
6093                (len == 2 && ((PL_tokenbuf[0] == 't' && PL_tokenbuf[1] == 'r') ||
6094                              (PL_tokenbuf[0] == 'q' &&
6095                               strchr("qwxr", PL_tokenbuf[1])))));
6096
6097         /* x::* is just a word, unless x is "CORE" */
6098         if (!anydelim && *s == ':' && s[1] == ':' && strNE(PL_tokenbuf, "CORE"))
6099             goto just_a_word;
6100
6101         d = s;
6102         while (d < PL_bufend && isSPACE(*d))
6103                 d++;    /* no comments skipped here, or s### is misparsed */
6104
6105         /* Is this a word before a => operator? */
6106         if (*d == '=' && d[1] == '>') {
6107             CLINE;
6108             pl_yylval.opval
6109                 = (OP*)newSVOP(OP_CONST, 0,
6110                                S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
6111             pl_yylval.opval->op_private = OPpCONST_BARE;
6112             TERM(WORD);
6113         }
6114
6115         /* Check for plugged-in keyword */
6116         {
6117             OP *o;
6118             int result;
6119             char *saved_bufptr = PL_bufptr;
6120             PL_bufptr = s;
6121             result = CALL_FPTR(PL_keyword_plugin)(aTHX_ PL_tokenbuf, len, &o);
6122             s = PL_bufptr;
6123             if (result == KEYWORD_PLUGIN_DECLINE) {
6124                 /* not a plugged-in keyword */
6125                 PL_bufptr = saved_bufptr;
6126             } else if (result == KEYWORD_PLUGIN_STMT) {
6127                 pl_yylval.opval = o;
6128                 CLINE;
6129                 PL_expect = XSTATE;
6130                 return REPORT(PLUGSTMT);
6131             } else if (result == KEYWORD_PLUGIN_EXPR) {
6132                 pl_yylval.opval = o;
6133                 CLINE;
6134                 PL_expect = XOPERATOR;
6135                 return REPORT(PLUGEXPR);
6136             } else {
6137                 Perl_croak(aTHX_ "Bad plugin affecting keyword '%s'",
6138                                         PL_tokenbuf);
6139             }
6140         }
6141
6142         /* Check for built-in keyword */
6143         tmp = keyword(PL_tokenbuf, len, 0);
6144
6145         /* Is this a label? */
6146         if (!anydelim && PL_expect == XSTATE
6147               && d < PL_bufend && *d == ':' && *(d + 1) != ':') {
6148             s = d + 1;
6149             pl_yylval.pval = CopLABEL_alloc(PL_tokenbuf);
6150             CLINE;
6151             TOKEN(LABEL);
6152         }
6153
6154         if (tmp < 0) {                  /* second-class keyword? */
6155             GV *ogv = NULL;     /* override (winner) */
6156             GV *hgv = NULL;     /* hidden (loser) */
6157             if (PL_expect != XOPERATOR && (*s != ':' || s[1] != ':')) {
6158                 CV *cv;
6159                 if ((gv = gv_fetchpvn_flags(PL_tokenbuf, len, 0, SVt_PVCV)) &&
6160                     (cv = GvCVu(gv)))
6161                 {
6162                     if (GvIMPORTED_CV(gv))
6163                         ogv = gv;
6164                     else if (! CvMETHOD(cv))
6165                         hgv = gv;
6166                 }
6167                 if (!ogv &&
6168                     (gvp = (GV**)hv_fetch(PL_globalstash,PL_tokenbuf,len,FALSE)) &&
6169                     (gv = *gvp) && isGV_with_GP(gv) &&
6170                     GvCVu(gv) && GvIMPORTED_CV(gv))
6171                 {
6172                     ogv = gv;
6173                 }
6174             }
6175             if (ogv) {
6176                 orig_keyword = tmp;
6177                 tmp = 0;                /* overridden by import or by GLOBAL */
6178             }
6179             else if (gv && !gvp
6180                      && -tmp==KEY_lock  /* XXX generalizable kludge */
6181                      && GvCVu(gv))
6182             {
6183                 tmp = 0;                /* any sub overrides "weak" keyword */
6184             }
6185             else {                      /* no override */
6186                 tmp = -tmp;
6187                 if (tmp == KEY_dump) {
6188                     Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
6189                                    "dump() better written as CORE::dump()");
6190                 }
6191                 gv = NULL;
6192                 gvp = 0;
6193                 if (hgv && tmp != KEY_x && tmp != KEY_CORE)     /* never ambiguous */
6194                     Perl_ck_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
6195                                    "Ambiguous call resolved as CORE::%s(), %s",
6196                                    GvENAME(hgv), "qualify as such or use &");
6197             }
6198         }
6199
6200       reserved_word:
6201         switch (tmp) {
6202
6203         default:                        /* not a keyword */
6204             /* Trade off - by using this evil construction we can pull the
6205                variable gv into the block labelled keylookup. If not, then
6206                we have to give it function scope so that the goto from the
6207                earlier ':' case doesn't bypass the initialisation.  */
6208             if (0) {
6209             just_a_word_zero_gv:
6210                 gv = NULL;
6211                 gvp = NULL;
6212                 orig_keyword = 0;
6213             }
6214           just_a_word: {
6215                 SV *sv;
6216                 int pkgname = 0;
6217                 const char lastchar = (PL_bufptr == PL_oldoldbufptr ? 0 : PL_bufptr[-1]);
6218                 OP *rv2cv_op;
6219                 CV *cv;
6220 #ifdef PERL_MAD
6221                 SV *nextPL_nextwhite = 0;
6222 #endif
6223
6224
6225                 /* Get the rest if it looks like a package qualifier */
6226
6227                 if (*s == '\'' || (*s == ':' && s[1] == ':')) {
6228                     STRLEN morelen;
6229                     s = scan_word(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len,
6230                                   TRUE, &morelen);
6231                     if (!morelen)
6232                         Perl_croak(aTHX_ "Bad name after %s%s", PL_tokenbuf,
6233                                 *s == '\'' ? "'" : "::");
6234                     len += morelen;
6235                     pkgname = 1;
6236                 }
6237
6238                 if (PL_expect == XOPERATOR) {
6239                     if (PL_bufptr == PL_linestart) {
6240                         CopLINE_dec(PL_curcop);
6241                         Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), "%s", PL_warn_nosemi);
6242                         CopLINE_inc(PL_curcop);
6243                     }
6244                     else
6245                         no_op("Bareword",s);
6246                 }
6247
6248                 /* Look for a subroutine with this name in current package,
6249                    unless name is "Foo::", in which case Foo is a bearword
6250                    (and a package name). */
6251
6252                 if (len > 2 && !PL_madskills &&
6253                     PL_tokenbuf[len - 2] == ':' && PL_tokenbuf[len - 1] == ':')
6254                 {
6255                     if (ckWARN(WARN_BAREWORD)
6256                         && ! gv_fetchpvn_flags(PL_tokenbuf, len, 0, SVt_PVHV))
6257                         Perl_warner(aTHX_ packWARN(WARN_BAREWORD),
6258                             "Bareword \"%s\" refers to nonexistent package",
6259                              PL_tokenbuf);
6260                     len -= 2;
6261                     PL_tokenbuf[len] = '\0';
6262                     gv = NULL;
6263                     gvp = 0;
6264                 }
6265                 else {
6266                     if (!gv) {
6267                         /* Mustn't actually add anything to a symbol table.
6268                            But also don't want to "initialise" any placeholder
6269                            constants that might already be there into full
6270                            blown PVGVs with attached PVCV.  */
6271                         gv = gv_fetchpvn_flags(PL_tokenbuf, len,
6272                                                GV_NOADD_NOINIT, SVt_PVCV);
6273                     }
6274                     len = 0;
6275                 }
6276
6277                 /* if we saw a global override before, get the right name */
6278
6279                 if (gvp) {
6280                     sv = newSVpvs("CORE::GLOBAL::");
6281                     sv_catpv(sv,PL_tokenbuf);
6282                 }
6283                 else {
6284                     /* If len is 0, newSVpv does strlen(), which is correct.
6285                        If len is non-zero, then it will be the true length,
6286                        and so the scalar will be created correctly.  */
6287                     sv = newSVpv(PL_tokenbuf,len);
6288                 }
6289 #ifdef PERL_MAD
6290                 if (PL_madskills && !PL_thistoken) {
6291                     char *start = SvPVX(PL_linestr) + PL_realtokenstart;
6292                     PL_thistoken = newSVpvn(start,s - start);
6293                     PL_realtokenstart = s - SvPVX(PL_linestr);
6294                 }
6295 #endif
6296
6297                 /* Presume this is going to be a bareword of some sort. */
6298
6299                 CLINE;
6300                 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
6301                 pl_yylval.opval->op_private = OPpCONST_BARE;
6302                 /* UTF-8 package name? */
6303                 if (UTF && !IN_BYTES &&
6304                     is_utf8_string((U8*)SvPVX_const(sv), SvCUR(sv)))
6305                     SvUTF8_on(sv);
6306
6307                 /* And if "Foo::", then that's what it certainly is. */
6308
6309                 if (len)
6310                     goto safe_bareword;
6311
6312                 cv = NULL;
6313                 {
6314                     OP *const_op = newSVOP(OP_CONST, 0, SvREFCNT_inc(sv));
6315                     const_op->op_private = OPpCONST_BARE;
6316                     rv2cv_op = newCVREF(0, const_op);
6317                 }
6318                 if (rv2cv_op->op_type == OP_RV2CV &&
6319                         (rv2cv_op->op_flags & OPf_KIDS)) {
6320                     OP *rv_op = cUNOPx(rv2cv_op)->op_first;
6321                     switch (rv_op->op_type) {
6322                         case OP_CONST: {
6323                             SV *sv = cSVOPx_sv(rv_op);
6324                             if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV)
6325                                 cv = (CV*)SvRV(sv);
6326                         } break;
6327                         case OP_GV: {
6328                             GV *gv = cGVOPx_gv(rv_op);
6329                             CV *maybe_cv = GvCVu(gv);
6330                             if (maybe_cv && SvTYPE((SV*)maybe_cv) == SVt_PVCV)
6331                                 cv = maybe_cv;
6332                         } break;
6333                     }
6334                 }
6335
6336                 /* See if it's the indirect object for a list operator. */
6337
6338                 if (PL_oldoldbufptr &&
6339                     PL_oldoldbufptr < PL_bufptr &&
6340                     (PL_oldoldbufptr == PL_last_lop
6341                      || PL_oldoldbufptr == PL_last_uni) &&
6342                     /* NO SKIPSPACE BEFORE HERE! */
6343                     (PL_expect == XREF ||
6344                      ((PL_opargs[PL_last_lop_op] >> OASHIFT)& 7) == OA_FILEREF))
6345                 {
6346                     bool immediate_paren = *s == '(';
6347
6348                     /* (Now we can afford to cross potential line boundary.) */
6349                     s = SKIPSPACE2(s,nextPL_nextwhite);
6350 #ifdef PERL_MAD
6351                     PL_nextwhite = nextPL_nextwhite;    /* assume no & deception */
6352 #endif
6353
6354                     /* Two barewords in a row may indicate method call. */
6355
6356                     if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') &&
6357                         (tmp = intuit_method(s, gv, cv))) {
6358                         op_free(rv2cv_op);
6359                         return REPORT(tmp);
6360                     }
6361
6362                     /* If not a declared subroutine, it's an indirect object. */
6363                     /* (But it's an indir obj regardless for sort.) */
6364                     /* Also, if "_" follows a filetest operator, it's a bareword */
6365
6366                     if (
6367                         ( !immediate_paren && (PL_last_lop_op == OP_SORT ||
6368                          (!cv &&
6369                         (PL_last_lop_op != OP_MAPSTART &&
6370                          PL_last_lop_op != OP_GREPSTART))))
6371                        || (PL_tokenbuf[0] == '_' && PL_tokenbuf[1] == '\0'
6372                             && ((PL_opargs[PL_last_lop_op] & OA_CLASS_MASK) == OA_FILESTATOP))
6373                        )
6374                     {
6375                         PL_expect = (PL_last_lop == PL_oldoldbufptr) ? XTERM : XOPERATOR;
6376                         goto bareword;
6377                     }
6378                 }
6379
6380                 PL_expect = XOPERATOR;
6381 #ifdef PERL_MAD
6382                 if (isSPACE(*s))
6383                     s = SKIPSPACE2(s,nextPL_nextwhite);
6384                 PL_nextwhite = nextPL_nextwhite;
6385 #else
6386                 s = skipspace(s);
6387 #endif
6388
6389                 /* Is this a word before a => operator? */
6390                 if (*s == '=' && s[1] == '>' && !pkgname) {
6391                     op_free(rv2cv_op);
6392                     CLINE;
6393                     sv_setpv(((SVOP*)pl_yylval.opval)->op_sv, PL_tokenbuf);
6394                     if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
6395                       SvUTF8_on(((SVOP*)pl_yylval.opval)->op_sv);
6396                     TERM(WORD);
6397                 }
6398
6399                 /* If followed by a paren, it's certainly a subroutine. */
6400                 if (*s == '(') {
6401                     CLINE;
6402                     if (cv) {
6403                         d = s + 1;
6404                         while (SPACE_OR_TAB(*d))
6405                             d++;
6406                         if (*d == ')' && (sv = cv_const_sv(cv))) {
6407                             s = d + 1;
6408                             goto its_constant;
6409                         }
6410                     }
6411 #ifdef PERL_MAD
6412                     if (PL_madskills) {
6413                         PL_nextwhite = PL_thiswhite;
6414                         PL_thiswhite = 0;
6415                     }
6416                     start_force(PL_curforce);
6417 #endif
6418                     NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
6419                     PL_expect = XOPERATOR;
6420 #ifdef PERL_MAD
6421                     if (PL_madskills) {
6422                         PL_nextwhite = nextPL_nextwhite;
6423                         curmad('X', PL_thistoken);
6424                         PL_thistoken = newSVpvs("");
6425                     }
6426 #endif
6427                     op_free(rv2cv_op);
6428                     force_next(WORD);
6429                     pl_yylval.ival = 0;
6430                     TOKEN('&');
6431                 }
6432
6433                 /* If followed by var or block, call it a method (unless sub) */
6434
6435                 if ((*s == '$' || *s == '{') && !cv) {
6436                     op_free(rv2cv_op);
6437                     PL_last_lop = PL_oldbufptr;
6438                     PL_last_lop_op = OP_METHOD;
6439                     PREBLOCK(METHOD);
6440                 }
6441
6442                 /* If followed by a bareword, see if it looks like indir obj. */
6443
6444                 if (!orig_keyword
6445                         && (isIDFIRST_lazy_if(s,UTF) || *s == '$')
6446                         && (tmp = intuit_method(s, gv, cv))) {
6447                     op_free(rv2cv_op);
6448                     return REPORT(tmp);
6449                 }
6450
6451                 /* Not a method, so call it a subroutine (if defined) */
6452
6453                 if (cv) {
6454                     if (lastchar == '-')
6455                         Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
6456                                          "Ambiguous use of -%s resolved as -&%s()",
6457                                          PL_tokenbuf, PL_tokenbuf);
6458                     /* Check for a constant sub */
6459                     if ((sv = cv_const_sv(cv))) {
6460                   its_constant:
6461                         op_free(rv2cv_op);
6462                         SvREFCNT_dec(((SVOP*)pl_yylval.opval)->op_sv);
6463                         ((SVOP*)pl_yylval.opval)->op_sv = SvREFCNT_inc_simple(sv);
6464                         pl_yylval.opval->op_private = 0;
6465                         TOKEN(WORD);
6466                     }
6467
6468                     op_free(pl_yylval.opval);
6469                     pl_yylval.opval = rv2cv_op;
6470                     pl_yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
6471                     PL_last_lop = PL_oldbufptr;
6472                     PL_last_lop_op = OP_ENTERSUB;
6473                     /* Is there a prototype? */
6474                     if (
6475 #ifdef PERL_MAD
6476                         cv &&
6477 #endif
6478                         SvPOK(cv))
6479                     {
6480                         STRLEN protolen;
6481                         const char *proto = SvPV_const(MUTABLE_SV(cv), protolen);
6482                         if (!protolen)
6483                             TERM(FUNC0SUB);
6484                         if ((*proto == '$' || *proto == '_') && proto[1] == '\0')
6485                             OPERATOR(UNIOPSUB);
6486                         while (*proto == ';')
6487                             proto++;
6488                         if (*proto == '&' && *s == '{') {
6489                             if (PL_curstash)
6490                                 sv_setpvs(PL_subname, "__ANON__");
6491                             else
6492                                 sv_setpvs(PL_subname, "__ANON__::__ANON__");
6493                             PREBLOCK(LSTOPSUB);
6494                         }
6495                     }
6496 #ifdef PERL_MAD
6497                     {
6498                         if (PL_madskills) {
6499                             PL_nextwhite = PL_thiswhite;
6500                             PL_thiswhite = 0;
6501                         }
6502                         start_force(PL_curforce);
6503                         NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
6504                         PL_expect = XTERM;
6505                         if (PL_madskills) {
6506                             PL_nextwhite = nextPL_nextwhite;
6507                             curmad('X', PL_thistoken);
6508                             PL_thistoken = newSVpvs("");
6509                         }
6510                         force_next(WORD);
6511                         TOKEN(NOAMP);
6512                     }
6513                 }
6514
6515                 /* Guess harder when madskills require "best effort". */
6516                 if (PL_madskills && (!gv || !GvCVu(gv))) {
6517                     int probable_sub = 0;
6518                     if (strchr("\"'`$@%0123456789!*+{[<", *s))
6519                         probable_sub = 1;
6520                     else if (isALPHA(*s)) {
6521                         char tmpbuf[1024];
6522                         STRLEN tmplen;
6523                         d = s;
6524                         d = scan_word(d, tmpbuf, sizeof tmpbuf, TRUE, &tmplen);
6525                         if (!keyword(tmpbuf, tmplen, 0))
6526                             probable_sub = 1;
6527                         else {
6528                             while (d < PL_bufend && isSPACE(*d))
6529                                 d++;
6530                             if (*d == '=' && d[1] == '>')
6531                                 probable_sub = 1;
6532                         }
6533                     }
6534                     if (probable_sub) {
6535                         gv = gv_fetchpv(PL_tokenbuf, GV_ADD, SVt_PVCV);
6536                         op_free(pl_yylval.opval);
6537                         pl_yylval.opval = rv2cv_op;
6538                         pl_yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
6539                         PL_last_lop = PL_oldbufptr;
6540                         PL_last_lop_op = OP_ENTERSUB;
6541                         PL_nextwhite = PL_thiswhite;
6542                         PL_thiswhite = 0;
6543                         start_force(PL_curforce);
6544                         NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
6545                         PL_expect = XTERM;
6546                         PL_nextwhite = nextPL_nextwhite;
6547                         curmad('X', PL_thistoken);
6548                         PL_thistoken = newSVpvs("");
6549                         force_next(WORD);
6550                         TOKEN(NOAMP);
6551                     }
6552 #else
6553                     NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
6554                     PL_expect = XTERM;
6555                     force_next(WORD);
6556                     TOKEN(NOAMP);
6557 #endif
6558                 }
6559
6560                 /* Call it a bare word */
6561
6562                 if (PL_hints & HINT_STRICT_SUBS)
6563                     pl_yylval.opval->op_private |= OPpCONST_STRICT;
6564                 else {
6565                 bareword:
6566                     /* after "print" and similar functions (corresponding to
6567                      * "F? L" in opcode.pl), whatever wasn't already parsed as
6568                      * a filehandle should be subject to "strict subs".
6569                      * Likewise for the optional indirect-object argument to system
6570                      * or exec, which can't be a bareword */
6571                     if ((PL_last_lop_op == OP_PRINT
6572                             || PL_last_lop_op == OP_PRTF
6573                             || PL_last_lop_op == OP_SAY
6574                             || PL_last_lop_op == OP_SYSTEM
6575                             || PL_last_lop_op == OP_EXEC)
6576                             && (PL_hints & HINT_STRICT_SUBS))
6577                         pl_yylval.opval->op_private |= OPpCONST_STRICT;
6578                     if (lastchar != '-') {
6579                         if (ckWARN(WARN_RESERVED)) {
6580                             d = PL_tokenbuf;
6581                             while (isLOWER(*d))
6582                                 d++;
6583                             if (!*d && !gv_stashpv(PL_tokenbuf, 0))
6584                                 Perl_warner(aTHX_ packWARN(WARN_RESERVED), PL_warn_reserved,
6585                                        PL_tokenbuf);
6586                         }
6587                     }
6588                 }
6589                 op_free(rv2cv_op);
6590
6591             safe_bareword:
6592                 if ((lastchar == '*' || lastchar == '%' || lastchar == '&')) {
6593                     Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
6594                                      "Operator or semicolon missing before %c%s",
6595                                      lastchar, PL_tokenbuf);
6596                     Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
6597                                      "Ambiguous use of %c resolved as operator %c",
6598                                      lastchar, lastchar);
6599                 }
6600                 TOKEN(WORD);
6601             }
6602
6603         case KEY___FILE__:
6604             pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0,
6605                                         newSVpv(CopFILE(PL_curcop),0));
6606             TERM(THING);
6607
6608         case KEY___LINE__:
6609             pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0,
6610                                     Perl_newSVpvf(aTHX_ "%"IVdf, (IV)CopLINE(PL_curcop)));
6611             TERM(THING);
6612
6613         case KEY___PACKAGE__:
6614             pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0,
6615                                         (PL_curstash
6616                                          ? newSVhek(HvNAME_HEK(PL_curstash))
6617                                          : &PL_sv_undef));
6618             TERM(THING);
6619
6620         case KEY___DATA__:
6621         case KEY___END__: {
6622             GV *gv;
6623             if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
6624                 const char *pname = "main";
6625                 if (PL_tokenbuf[2] == 'D')
6626                     pname = HvNAME_get(PL_curstash ? PL_curstash : PL_defstash);
6627                 gv = gv_fetchpv(Perl_form(aTHX_ "%s::DATA", pname), GV_ADD,
6628                                 SVt_PVIO);
6629                 GvMULTI_on(gv);
6630                 if (!GvIO(gv))
6631                     GvIOp(gv) = newIO();
6632                 IoIFP(GvIOp(gv)) = PL_rsfp;
6633 #if defined(HAS_FCNTL) && defined(F_SETFD)
6634                 {
6635                     const int fd = PerlIO_fileno(PL_rsfp);
6636                     fcntl(fd,F_SETFD,fd >= 3);
6637                 }
6638 #endif
6639                 /* Mark this internal pseudo-handle as clean */
6640                 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
6641                 if ((PerlIO*)PL_rsfp == PerlIO_stdin())
6642                     IoTYPE(GvIOp(gv)) = IoTYPE_STD;
6643                 else
6644                     IoTYPE(GvIOp(gv)) = IoTYPE_RDONLY;
6645 #if defined(WIN32) && !defined(PERL_TEXTMODE_SCRIPTS)
6646                 /* if the script was opened in binmode, we need to revert
6647                  * it to text mode for compatibility; but only iff it has CRs
6648                  * XXX this is a questionable hack at best. */
6649                 if (PL_bufend-PL_bufptr > 2
6650                     && PL_bufend[-1] == '\n' && PL_bufend[-2] == '\r')
6651                 {
6652                     Off_t loc = 0;
6653                     if (IoTYPE(GvIOp(gv)) == IoTYPE_RDONLY) {
6654                         loc = PerlIO_tell(PL_rsfp);
6655                         (void)PerlIO_seek(PL_rsfp, 0L, 0);
6656                     }
6657 #ifdef NETWARE
6658                         if (PerlLIO_setmode(PL_rsfp, O_TEXT) != -1) {
6659 #else
6660                     if (PerlLIO_setmode(PerlIO_fileno(PL_rsfp), O_TEXT) != -1) {
6661 #endif  /* NETWARE */
6662 #ifdef PERLIO_IS_STDIO /* really? */
6663 #  if defined(__BORLANDC__)
6664                         /* XXX see note in do_binmode() */
6665                         ((FILE*)PL_rsfp)->flags &= ~_F_BIN;
6666 #  endif
6667 #endif
6668                         if (loc > 0)
6669                             PerlIO_seek(PL_rsfp, loc, 0);
6670                     }
6671                 }
6672 #endif
6673 #ifdef PERLIO_LAYERS
6674                 if (!IN_BYTES) {
6675                     if (UTF)
6676                         PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, ":utf8");
6677                     else if (PL_encoding) {
6678                         SV *name;
6679                         dSP;
6680                         ENTER;
6681                         SAVETMPS;
6682                         PUSHMARK(sp);
6683                         EXTEND(SP, 1);
6684                         XPUSHs(PL_encoding);
6685                         PUTBACK;
6686                         call_method("name", G_SCALAR);
6687                         SPAGAIN;
6688                         name = POPs;
6689                         PUTBACK;
6690                         PerlIO_apply_layers(aTHX_ PL_rsfp, NULL,
6691                                             Perl_form(aTHX_ ":encoding(%"SVf")",
6692                                                       SVfARG(name)));
6693                         FREETMPS;
6694                         LEAVE;
6695                     }
6696                 }
6697 #endif
6698 #ifdef PERL_MAD
6699                 if (PL_madskills) {
6700                     if (PL_realtokenstart >= 0) {
6701                         char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
6702                         if (!PL_endwhite)
6703                             PL_endwhite = newSVpvs("");
6704                         sv_catsv(PL_endwhite, PL_thiswhite);
6705                         PL_thiswhite = 0;
6706                         sv_catpvn(PL_endwhite, tstart, PL_bufend - tstart);
6707                         PL_realtokenstart = -1;
6708                     }
6709                     while ((s = filter_gets(PL_endwhite, SvCUR(PL_endwhite)))
6710                            != NULL) ;
6711                 }
6712 #endif
6713                 PL_rsfp = NULL;
6714             }
6715             goto fake_eof;
6716         }
6717
6718         case KEY_AUTOLOAD:
6719         case KEY_DESTROY:
6720         case KEY_BEGIN:
6721         case KEY_UNITCHECK:
6722         case KEY_CHECK:
6723         case KEY_INIT:
6724         case KEY_END:
6725             if (PL_expect == XSTATE) {
6726                 s = PL_bufptr;
6727                 goto really_sub;
6728             }
6729             goto just_a_word;
6730
6731         case KEY_CORE:
6732             if (*s == ':' && s[1] == ':') {
6733                 s += 2;
6734                 d = s;
6735                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
6736                 if (!(tmp = keyword(PL_tokenbuf, len, 0)))
6737                     Perl_croak(aTHX_ "CORE::%s is not a keyword", PL_tokenbuf);
6738                 if (tmp < 0)
6739                     tmp = -tmp;
6740                 else if (tmp == KEY_require || tmp == KEY_do)
6741                     /* that's a way to remember we saw "CORE::" */
6742                     orig_keyword = tmp;
6743                 goto reserved_word;
6744             }
6745             goto just_a_word;
6746
6747         case KEY_abs:
6748             UNI(OP_ABS);
6749
6750         case KEY_alarm:
6751             UNI(OP_ALARM);
6752
6753         case KEY_accept:
6754             LOP(OP_ACCEPT,XTERM);
6755
6756         case KEY_and:
6757             OPERATOR(ANDOP);
6758
6759         case KEY_atan2:
6760             LOP(OP_ATAN2,XTERM);
6761
6762         case KEY_bind:
6763             LOP(OP_BIND,XTERM);
6764
6765         case KEY_binmode:
6766             LOP(OP_BINMODE,XTERM);
6767
6768         case KEY_bless:
6769             LOP(OP_BLESS,XTERM);
6770
6771         case KEY_break:
6772             FUN0(OP_BREAK);
6773
6774         case KEY_chop:
6775             UNI(OP_CHOP);
6776
6777         case KEY_continue:
6778             /* When 'use switch' is in effect, continue has a dual
6779                life as a control operator. */
6780             {
6781                 if (!FEATURE_IS_ENABLED("switch"))
6782                     PREBLOCK(CONTINUE);
6783                 else {
6784                     /* We have to disambiguate the two senses of
6785                       "continue". If the next token is a '{' then
6786                       treat it as the start of a continue block;
6787                       otherwise treat it as a control operator.
6788                      */
6789                     s = skipspace(s);
6790                     if (*s == '{')
6791             PREBLOCK(CONTINUE);
6792                     else
6793                         FUN0(OP_CONTINUE);
6794                 }
6795             }
6796
6797         case KEY_chdir:
6798             /* may use HOME */
6799             (void)gv_fetchpvs("ENV", GV_ADD|GV_NOTQUAL, SVt_PVHV);
6800             UNI(OP_CHDIR);
6801
6802         case KEY_close:
6803             UNI(OP_CLOSE);
6804
6805         case KEY_closedir:
6806             UNI(OP_CLOSEDIR);
6807
6808         case KEY_cmp:
6809             Eop(OP_SCMP);
6810
6811         case KEY_caller:
6812             UNI(OP_CALLER);
6813
6814         case KEY_crypt:
6815 #ifdef FCRYPT
6816             if (!PL_cryptseen) {
6817                 PL_cryptseen = TRUE;
6818                 init_des();
6819             }
6820 #endif
6821             LOP(OP_CRYPT,XTERM);
6822
6823         case KEY_chmod:
6824             LOP(OP_CHMOD,XTERM);
6825
6826         case KEY_chown:
6827             LOP(OP_CHOWN,XTERM);
6828
6829         case KEY_connect:
6830             LOP(OP_CONNECT,XTERM);
6831
6832         case KEY_chr:
6833             UNI(OP_CHR);
6834
6835         case KEY_cos:
6836             UNI(OP_COS);
6837
6838         case KEY_chroot:
6839             UNI(OP_CHROOT);
6840
6841         case KEY_default:
6842             PREBLOCK(DEFAULT);
6843
6844         case KEY_do:
6845             s = SKIPSPACE1(s);
6846             if (*s == '{')
6847                 PRETERMBLOCK(DO);
6848             if (*s != '\'')
6849                 s = force_word(s,WORD,TRUE,TRUE,FALSE);
6850             if (orig_keyword == KEY_do) {
6851                 orig_keyword = 0;
6852                 pl_yylval.ival = 1;
6853             }
6854             else
6855                 pl_yylval.ival = 0;
6856             OPERATOR(DO);
6857
6858         case KEY_die:
6859             PL_hints |= HINT_BLOCK_SCOPE;
6860             LOP(OP_DIE,XTERM);
6861
6862         case KEY_defined:
6863             UNI(OP_DEFINED);
6864
6865         case KEY_delete:
6866             UNI(OP_DELETE);
6867
6868         case KEY_dbmopen:
6869             gv_fetchpvs("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
6870             LOP(OP_DBMOPEN,XTERM);
6871
6872         case KEY_dbmclose:
6873             UNI(OP_DBMCLOSE);
6874
6875         case KEY_dump:
6876             s = force_word(s,WORD,TRUE,FALSE,FALSE);
6877             LOOPX(OP_DUMP);
6878
6879         case KEY_else:
6880             PREBLOCK(ELSE);
6881
6882         case KEY_elsif:
6883             pl_yylval.ival = CopLINE(PL_curcop);
6884             OPERATOR(ELSIF);
6885
6886         case KEY_eq:
6887             Eop(OP_SEQ);
6888
6889         case KEY_exists:
6890             UNI(OP_EXISTS);
6891         
6892         case KEY_exit:
6893             if (PL_madskills)
6894                 UNI(OP_INT);
6895             UNI(OP_EXIT);
6896
6897         case KEY_eval:
6898             s = SKIPSPACE1(s);
6899             if (*s == '{') { /* block eval */
6900                 PL_expect = XTERMBLOCK;
6901                 UNIBRACK(OP_ENTERTRY);
6902             }
6903             else { /* string eval */
6904                 PL_expect = XTERM;
6905                 UNIBRACK(OP_ENTEREVAL);
6906             }
6907
6908         case KEY_eof:
6909             UNI(OP_EOF);
6910
6911         case KEY_exp:
6912             UNI(OP_EXP);
6913
6914         case KEY_each:
6915             UNI(OP_EACH);
6916
6917         case KEY_exec:
6918             LOP(OP_EXEC,XREF);
6919
6920         case KEY_endhostent:
6921             FUN0(OP_EHOSTENT);
6922
6923         case KEY_endnetent:
6924             FUN0(OP_ENETENT);
6925
6926         case KEY_endservent:
6927             FUN0(OP_ESERVENT);
6928
6929         case KEY_endprotoent:
6930             FUN0(OP_EPROTOENT);
6931
6932         case KEY_endpwent:
6933             FUN0(OP_EPWENT);
6934
6935         case KEY_endgrent:
6936             FUN0(OP_EGRENT);
6937
6938         case KEY_for:
6939         case KEY_foreach:
6940             pl_yylval.ival = CopLINE(PL_curcop);
6941             s = SKIPSPACE1(s);
6942             if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) {
6943                 char *p = s;
6944 #ifdef PERL_MAD
6945                 int soff = s - SvPVX(PL_linestr); /* for skipspace realloc */
6946 #endif
6947
6948                 if ((PL_bufend - p) >= 3 &&
6949                     strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
6950                     p += 2;
6951                 else if ((PL_bufend - p) >= 4 &&
6952                     strnEQ(p, "our", 3) && isSPACE(*(p + 3)))
6953                     p += 3;
6954                 p = PEEKSPACE(p);
6955                 if (isIDFIRST_lazy_if(p,UTF)) {
6956                     p = scan_ident(p, PL_bufend,
6957                         PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
6958                     p = PEEKSPACE(p);
6959                 }
6960                 if (*p != '$')
6961                     Perl_croak(aTHX_ "Missing $ on loop variable");
6962 #ifdef PERL_MAD
6963                 s = SvPVX(PL_linestr) + soff;
6964 #endif
6965             }
6966             OPERATOR(FOR);
6967
6968         case KEY_formline:
6969             LOP(OP_FORMLINE,XTERM);
6970
6971         case KEY_fork:
6972             FUN0(OP_FORK);
6973
6974         case KEY_fcntl:
6975             LOP(OP_FCNTL,XTERM);
6976
6977         case KEY_fileno:
6978             UNI(OP_FILENO);
6979
6980         case KEY_flock:
6981             LOP(OP_FLOCK,XTERM);
6982
6983         case KEY_gt:
6984             Rop(OP_SGT);
6985
6986         case KEY_ge:
6987             Rop(OP_SGE);
6988
6989         case KEY_grep:
6990             LOP(OP_GREPSTART, XREF);
6991
6992         case KEY_goto:
6993             s = force_word(s,WORD,TRUE,FALSE,FALSE);
6994             LOOPX(OP_GOTO);
6995
6996         case KEY_gmtime:
6997             UNI(OP_GMTIME);
6998
6999         case KEY_getc:
7000             UNIDOR(OP_GETC);
7001
7002         case KEY_getppid:
7003             FUN0(OP_GETPPID);
7004
7005         case KEY_getpgrp:
7006             UNI(OP_GETPGRP);
7007
7008         case KEY_getpriority:
7009             LOP(OP_GETPRIORITY,XTERM);
7010
7011         case KEY_getprotobyname:
7012             UNI(OP_GPBYNAME);
7013
7014         case KEY_getprotobynumber:
7015             LOP(OP_GPBYNUMBER,XTERM);
7016
7017         case KEY_getprotoent:
7018             FUN0(OP_GPROTOENT);
7019
7020         case KEY_getpwent:
7021             FUN0(OP_GPWENT);
7022
7023         case KEY_getpwnam:
7024             UNI(OP_GPWNAM);
7025
7026         case KEY_getpwuid:
7027             UNI(OP_GPWUID);
7028
7029         case KEY_getpeername:
7030             UNI(OP_GETPEERNAME);
7031
7032         case KEY_gethostbyname:
7033             UNI(OP_GHBYNAME);
7034
7035         case KEY_gethostbyaddr:
7036             LOP(OP_GHBYADDR,XTERM);
7037
7038         case KEY_gethostent:
7039             FUN0(OP_GHOSTENT);
7040
7041         case KEY_getnetbyname:
7042             UNI(OP_GNBYNAME);
7043
7044         case KEY_getnetbyaddr:
7045             LOP(OP_GNBYADDR,XTERM);
7046
7047         case KEY_getnetent:
7048             FUN0(OP_GNETENT);
7049
7050         case KEY_getservbyname:
7051             LOP(OP_GSBYNAME,XTERM);
7052
7053         case KEY_getservbyport:
7054             LOP(OP_GSBYPORT,XTERM);
7055
7056         case KEY_getservent:
7057             FUN0(OP_GSERVENT);
7058
7059         case KEY_getsockname:
7060             UNI(OP_GETSOCKNAME);
7061
7062         case KEY_getsockopt:
7063             LOP(OP_GSOCKOPT,XTERM);
7064
7065         case KEY_getgrent:
7066             FUN0(OP_GGRENT);
7067
7068         case KEY_getgrnam:
7069             UNI(OP_GGRNAM);
7070
7071         case KEY_getgrgid:
7072             UNI(OP_GGRGID);
7073
7074         case KEY_getlogin:
7075             FUN0(OP_GETLOGIN);
7076
7077         case KEY_given:
7078             pl_yylval.ival = CopLINE(PL_curcop);
7079             OPERATOR(GIVEN);
7080
7081         case KEY_glob:
7082             LOP(OP_GLOB,XTERM);
7083
7084         case KEY_hex:
7085             UNI(OP_HEX);
7086
7087         case KEY_if:
7088             pl_yylval.ival = CopLINE(PL_curcop);
7089             OPERATOR(IF);
7090
7091         case KEY_index:
7092             LOP(OP_INDEX,XTERM);
7093
7094         case KEY_int:
7095             UNI(OP_INT);
7096
7097         case KEY_ioctl:
7098             LOP(OP_IOCTL,XTERM);
7099
7100         case KEY_join:
7101             LOP(OP_JOIN,XTERM);
7102
7103         case KEY_keys:
7104             UNI(OP_KEYS);
7105
7106         case KEY_kill:
7107             LOP(OP_KILL,XTERM);
7108
7109         case KEY_last:
7110             s = force_word(s,WORD,TRUE,FALSE,FALSE);
7111             LOOPX(OP_LAST);
7112         
7113         case KEY_lc:
7114             UNI(OP_LC);
7115
7116         case KEY_lcfirst:
7117             UNI(OP_LCFIRST);
7118
7119         case KEY_local:
7120             pl_yylval.ival = 0;
7121             OPERATOR(LOCAL);
7122
7123         case KEY_length:
7124             UNI(OP_LENGTH);
7125
7126         case KEY_lt:
7127             Rop(OP_SLT);
7128
7129         case KEY_le:
7130             Rop(OP_SLE);
7131
7132         case KEY_localtime:
7133             UNI(OP_LOCALTIME);
7134
7135         case KEY_log:
7136             UNI(OP_LOG);
7137
7138         case KEY_link:
7139             LOP(OP_LINK,XTERM);
7140
7141         case KEY_listen:
7142             LOP(OP_LISTEN,XTERM);
7143
7144         case KEY_lock:
7145             UNI(OP_LOCK);
7146
7147         case KEY_lstat:
7148             UNI(OP_LSTAT);
7149
7150         case KEY_m:
7151             s = scan_pat(s,OP_MATCH);
7152             TERM(sublex_start());
7153
7154         case KEY_map:
7155             LOP(OP_MAPSTART, XREF);
7156
7157         case KEY_mkdir:
7158             LOP(OP_MKDIR,XTERM);
7159
7160         case KEY_msgctl:
7161             LOP(OP_MSGCTL,XTERM);
7162
7163         case KEY_msgget:
7164             LOP(OP_MSGGET,XTERM);
7165
7166         case KEY_msgrcv:
7167             LOP(OP_MSGRCV,XTERM);
7168
7169         case KEY_msgsnd:
7170             LOP(OP_MSGSND,XTERM);
7171
7172         case KEY_our:
7173         case KEY_my:
7174         case KEY_state:
7175             PL_in_my = (U16)tmp;
7176             s = SKIPSPACE1(s);
7177             if (isIDFIRST_lazy_if(s,UTF)) {
7178 #ifdef PERL_MAD
7179                 char* start = s;
7180 #endif
7181                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
7182                 if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
7183                     goto really_sub;
7184                 PL_in_my_stash = find_in_my_stash(PL_tokenbuf, len);
7185                 if (!PL_in_my_stash) {
7186                     char tmpbuf[1024];
7187                     PL_bufptr = s;
7188                     my_snprintf(tmpbuf, sizeof(tmpbuf), "No such class %.1000s", PL_tokenbuf);
7189                     yyerror(tmpbuf);
7190                 }
7191 #ifdef PERL_MAD
7192                 if (PL_madskills) {     /* just add type to declarator token */
7193                     sv_catsv(PL_thistoken, PL_nextwhite);
7194                     PL_nextwhite = 0;
7195                     sv_catpvn(PL_thistoken, start, s - start);
7196                 }
7197 #endif
7198             }
7199             pl_yylval.ival = 1;
7200             OPERATOR(MY);
7201
7202         case KEY_next:
7203             s = force_word(s,WORD,TRUE,FALSE,FALSE);
7204             LOOPX(OP_NEXT);
7205
7206         case KEY_ne:
7207             Eop(OP_SNE);
7208
7209         case KEY_no:
7210             s = tokenize_use(0, s);
7211             OPERATOR(USE);
7212
7213         case KEY_not:
7214             if (*s == '(' || (s = SKIPSPACE1(s), *s == '('))
7215                 FUN1(OP_NOT);
7216             else
7217                 OPERATOR(NOTOP);
7218
7219         case KEY_open:
7220             s = SKIPSPACE1(s);
7221             if (isIDFIRST_lazy_if(s,UTF)) {
7222                 const char *t;
7223                 for (d = s; isALNUM_lazy_if(d,UTF);)
7224                     d++;
7225                 for (t=d; isSPACE(*t);)
7226                     t++;
7227                 if ( *t && strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
7228                     /* [perl #16184] */
7229                     && !(t[0] == '=' && t[1] == '>')
7230                 ) {
7231                     int parms_len = (int)(d-s);
7232                     Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE),
7233                            "Precedence problem: open %.*s should be open(%.*s)",
7234                             parms_len, s, parms_len, s);
7235                 }
7236             }
7237             LOP(OP_OPEN,XTERM);
7238
7239         case KEY_or:
7240             pl_yylval.ival = OP_OR;
7241             OPERATOR(OROP);
7242
7243         case KEY_ord:
7244             UNI(OP_ORD);
7245
7246         case KEY_oct:
7247             UNI(OP_OCT);
7248
7249         case KEY_opendir:
7250             LOP(OP_OPEN_DIR,XTERM);
7251
7252         case KEY_print:
7253             checkcomma(s,PL_tokenbuf,"filehandle");
7254             LOP(OP_PRINT,XREF);
7255
7256         case KEY_printf:
7257             checkcomma(s,PL_tokenbuf,"filehandle");
7258             LOP(OP_PRTF,XREF);
7259
7260         case KEY_prototype:
7261             UNI(OP_PROTOTYPE);
7262
7263         case KEY_push:
7264             LOP(OP_PUSH,XTERM);
7265
7266         case KEY_pop:
7267             UNIDOR(OP_POP);
7268
7269         case KEY_pos:
7270             UNIDOR(OP_POS);
7271         
7272         case KEY_pack:
7273             LOP(OP_PACK,XTERM);
7274
7275         case KEY_package:
7276             s = force_word(s,WORD,FALSE,TRUE,FALSE);
7277             s = SKIPSPACE1(s);
7278             s = force_strict_version(s);
7279             OPERATOR(PACKAGE);
7280
7281         case KEY_pipe:
7282             LOP(OP_PIPE_OP,XTERM);
7283
7284         case KEY_q:
7285             s = scan_str(s,!!PL_madskills,FALSE);
7286             if (!s)
7287                 missingterm(NULL);
7288             pl_yylval.ival = OP_CONST;
7289             TERM(sublex_start());
7290
7291         case KEY_quotemeta:
7292             UNI(OP_QUOTEMETA);
7293
7294         case KEY_qw:
7295             s = scan_str(s,!!PL_madskills,FALSE);
7296             if (!s)
7297                 missingterm(NULL);
7298             PL_expect = XOPERATOR;
7299             force_next(')');
7300             if (SvCUR(PL_lex_stuff)) {
7301                 OP *words = NULL;
7302                 int warned = 0;
7303                 d = SvPV_force(PL_lex_stuff, len);
7304                 while (len) {
7305                     for (; isSPACE(*d) && len; --len, ++d)
7306                         /**/;
7307                     if (len) {
7308                         SV *sv;
7309                         const char *b = d;
7310                         if (!warned && ckWARN(WARN_QW)) {
7311                             for (; !isSPACE(*d) && len; --len, ++d) {
7312                                 if (*d == ',') {
7313                                     Perl_warner(aTHX_ packWARN(WARN_QW),
7314                                         "Possible attempt to separate words with commas");
7315                                     ++warned;
7316                                 }
7317                                 else if (*d == '#') {
7318                                     Perl_warner(aTHX_ packWARN(WARN_QW),
7319                                         "Possible attempt to put comments in qw() list");
7320                                     ++warned;
7321                                 }
7322                             }
7323                         }
7324                         else {
7325                             for (; !isSPACE(*d) && len; --len, ++d)
7326                                 /**/;
7327                         }
7328                         sv = newSVpvn_utf8(b, d-b, DO_UTF8(PL_lex_stuff));
7329                         words = append_elem(OP_LIST, words,
7330                                             newSVOP(OP_CONST, 0, tokeq(sv)));
7331                     }
7332                 }
7333                 if (words) {
7334                     start_force(PL_curforce);
7335                     NEXTVAL_NEXTTOKE.opval = words;
7336                     force_next(THING);
7337                 }
7338             }
7339             if (PL_lex_stuff) {
7340                 SvREFCNT_dec(PL_lex_stuff);
7341                 PL_lex_stuff = NULL;
7342             }
7343             PL_expect = XTERM;
7344             TOKEN('(');
7345
7346         case KEY_qq:
7347             s = scan_str(s,!!PL_madskills,FALSE);
7348             if (!s)
7349                 missingterm(NULL);
7350             pl_yylval.ival = OP_STRINGIFY;
7351             if (SvIVX(PL_lex_stuff) == '\'')
7352                 SvIV_set(PL_lex_stuff, 0);      /* qq'$foo' should intepolate */
7353             TERM(sublex_start());
7354
7355         case KEY_qr:
7356             s = scan_pat(s,OP_QR);
7357             TERM(sublex_start());
7358
7359         case KEY_qx:
7360             s = scan_str(s,!!PL_madskills,FALSE);
7361             if (!s)
7362                 missingterm(NULL);
7363             readpipe_override();
7364             TERM(sublex_start());
7365
7366         case KEY_return:
7367             OLDLOP(OP_RETURN);
7368
7369         case KEY_require:
7370             s = SKIPSPACE1(s);
7371             if (isDIGIT(*s)) {
7372                 s = force_version(s, FALSE);
7373             }
7374             else if (*s != 'v' || !isDIGIT(s[1])
7375                     || (s = force_version(s, TRUE), *s == 'v'))
7376             {
7377                 *PL_tokenbuf = '\0';
7378                 s = force_word(s,WORD,TRUE,TRUE,FALSE);
7379                 if (isIDFIRST_lazy_if(PL_tokenbuf,UTF))
7380                     gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf), GV_ADD);
7381                 else if (*s == '<')
7382                     yyerror("<> should be quotes");
7383             }
7384             if (orig_keyword == KEY_require) {
7385                 orig_keyword = 0;
7386                 pl_yylval.ival = 1;
7387             }
7388             else 
7389                 pl_yylval.ival = 0;
7390             PL_expect = XTERM;
7391             PL_bufptr = s;
7392             PL_last_uni = PL_oldbufptr;
7393             PL_last_lop_op = OP_REQUIRE;
7394             s = skipspace(s);
7395             return REPORT( (int)REQUIRE );
7396
7397         case KEY_reset:
7398             UNI(OP_RESET);
7399
7400         case KEY_redo:
7401             s = force_word(s,WORD,TRUE,FALSE,FALSE);
7402             LOOPX(OP_REDO);
7403
7404         case KEY_rename:
7405             LOP(OP_RENAME,XTERM);
7406
7407         case KEY_rand:
7408             UNI(OP_RAND);
7409
7410         case KEY_rmdir:
7411             UNI(OP_RMDIR);
7412
7413         case KEY_rindex:
7414             LOP(OP_RINDEX,XTERM);
7415
7416         case KEY_read:
7417             LOP(OP_READ,XTERM);
7418
7419         case KEY_readdir:
7420             UNI(OP_READDIR);
7421
7422         case KEY_readline:
7423             UNIDOR(OP_READLINE);
7424
7425         case KEY_readpipe:
7426             UNIDOR(OP_BACKTICK);
7427
7428         case KEY_rewinddir:
7429             UNI(OP_REWINDDIR);
7430
7431         case KEY_recv:
7432             LOP(OP_RECV,XTERM);
7433
7434         case KEY_reverse:
7435             LOP(OP_REVERSE,XTERM);
7436
7437         case KEY_readlink:
7438             UNIDOR(OP_READLINK);
7439
7440         case KEY_ref:
7441             UNI(OP_REF);
7442
7443         case KEY_s:
7444             s = scan_subst(s);
7445             if (pl_yylval.opval)
7446                 TERM(sublex_start());
7447             else
7448                 TOKEN(1);       /* force error */
7449
7450         case KEY_say:
7451             checkcomma(s,PL_tokenbuf,"filehandle");
7452             LOP(OP_SAY,XREF);
7453
7454         case KEY_chomp:
7455             UNI(OP_CHOMP);
7456         
7457         case KEY_scalar:
7458             UNI(OP_SCALAR);
7459
7460         case KEY_select:
7461             LOP(OP_SELECT,XTERM);
7462
7463         case KEY_seek:
7464             LOP(OP_SEEK,XTERM);
7465
7466         case KEY_semctl:
7467             LOP(OP_SEMCTL,XTERM);
7468
7469         case KEY_semget:
7470             LOP(OP_SEMGET,XTERM);
7471
7472         case KEY_semop:
7473             LOP(OP_SEMOP,XTERM);
7474
7475         case KEY_send:
7476             LOP(OP_SEND,XTERM);
7477
7478         case KEY_setpgrp:
7479             LOP(OP_SETPGRP,XTERM);
7480
7481         case KEY_setpriority:
7482             LOP(OP_SETPRIORITY,XTERM);
7483
7484         case KEY_sethostent:
7485             UNI(OP_SHOSTENT);
7486
7487         case KEY_setnetent:
7488             UNI(OP_SNETENT);
7489
7490         case KEY_setservent:
7491             UNI(OP_SSERVENT);
7492
7493         case KEY_setprotoent:
7494             UNI(OP_SPROTOENT);
7495
7496         case KEY_setpwent:
7497             FUN0(OP_SPWENT);
7498
7499         case KEY_setgrent:
7500             FUN0(OP_SGRENT);
7501
7502         case KEY_seekdir:
7503             LOP(OP_SEEKDIR,XTERM);
7504
7505         case KEY_setsockopt:
7506             LOP(OP_SSOCKOPT,XTERM);
7507
7508         case KEY_shift:
7509             UNIDOR(OP_SHIFT);
7510
7511         case KEY_shmctl:
7512             LOP(OP_SHMCTL,XTERM);
7513
7514         case KEY_shmget:
7515             LOP(OP_SHMGET,XTERM);
7516
7517         case KEY_shmread:
7518             LOP(OP_SHMREAD,XTERM);
7519
7520         case KEY_shmwrite:
7521             LOP(OP_SHMWRITE,XTERM);
7522
7523         case KEY_shutdown:
7524             LOP(OP_SHUTDOWN,XTERM);
7525
7526         case KEY_sin:
7527             UNI(OP_SIN);
7528
7529         case KEY_sleep:
7530             UNI(OP_SLEEP);
7531
7532         case KEY_socket:
7533             LOP(OP_SOCKET,XTERM);
7534
7535         case KEY_socketpair:
7536             LOP(OP_SOCKPAIR,XTERM);
7537
7538         case KEY_sort:
7539             checkcomma(s,PL_tokenbuf,"subroutine name");
7540             s = SKIPSPACE1(s);
7541             if (*s == ';' || *s == ')')         /* probably a close */
7542                 Perl_croak(aTHX_ "sort is now a reserved word");
7543             PL_expect = XTERM;
7544             s = force_word(s,WORD,TRUE,TRUE,FALSE);
7545             LOP(OP_SORT,XREF);
7546
7547         case KEY_split:
7548             LOP(OP_SPLIT,XTERM);
7549
7550         case KEY_sprintf:
7551             LOP(OP_SPRINTF,XTERM);
7552
7553         case KEY_splice:
7554             LOP(OP_SPLICE,XTERM);
7555
7556         case KEY_sqrt:
7557             UNI(OP_SQRT);
7558
7559         case KEY_srand:
7560             UNI(OP_SRAND);
7561
7562         case KEY_stat:
7563             UNI(OP_STAT);
7564
7565         case KEY_study:
7566             UNI(OP_STUDY);
7567
7568         case KEY_substr:
7569             LOP(OP_SUBSTR,XTERM);
7570
7571         case KEY_format:
7572         case KEY_sub:
7573           really_sub:
7574             {
7575                 char tmpbuf[sizeof PL_tokenbuf];
7576                 SSize_t tboffset = 0;
7577                 expectation attrful;
7578                 bool have_name, have_proto;
7579                 const int key = tmp;
7580
7581 #ifdef PERL_MAD
7582                 SV *tmpwhite = 0;
7583
7584                 char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
7585                 SV *subtoken = newSVpvn(tstart, s - tstart);
7586                 PL_thistoken = 0;
7587
7588                 d = s;
7589                 s = SKIPSPACE2(s,tmpwhite);
7590 #else
7591                 s = skipspace(s);
7592 #endif
7593
7594                 if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' ||
7595                     (*s == ':' && s[1] == ':'))
7596                 {
7597 #ifdef PERL_MAD
7598                     SV *nametoke = NULL;
7599 #endif
7600
7601                     PL_expect = XBLOCK;
7602                     attrful = XATTRBLOCK;
7603                     /* remember buffer pos'n for later force_word */
7604                     tboffset = s - PL_oldbufptr;
7605                     d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
7606 #ifdef PERL_MAD
7607                     if (PL_madskills)
7608                         nametoke = newSVpvn(s, d - s);
7609 #endif
7610                     if (memchr(tmpbuf, ':', len))
7611                         sv_setpvn(PL_subname, tmpbuf, len);
7612                     else {
7613                         sv_setsv(PL_subname,PL_curstname);
7614                         sv_catpvs(PL_subname,"::");
7615                         sv_catpvn(PL_subname,tmpbuf,len);
7616                     }
7617                     have_name = TRUE;
7618
7619 #ifdef PERL_MAD
7620
7621                     start_force(0);
7622                     CURMAD('X', nametoke);
7623                     CURMAD('_', tmpwhite);
7624                     (void) force_word(PL_oldbufptr + tboffset, WORD,
7625                                       FALSE, TRUE, TRUE);
7626
7627                     s = SKIPSPACE2(d,tmpwhite);
7628 #else
7629                     s = skipspace(d);
7630 #endif
7631                 }
7632                 else {
7633                     if (key == KEY_my)
7634                         Perl_croak(aTHX_ "Missing name in \"my sub\"");
7635                     PL_expect = XTERMBLOCK;
7636                     attrful = XATTRTERM;
7637                     sv_setpvs(PL_subname,"?");
7638                     have_name = FALSE;
7639                 }
7640
7641                 if (key == KEY_format) {
7642                     if (*s == '=')
7643                         PL_lex_formbrack = PL_lex_brackets + 1;
7644 #ifdef PERL_MAD
7645                     PL_thistoken = subtoken;
7646                     s = d;
7647 #else
7648                     if (have_name)
7649                         (void) force_word(PL_oldbufptr + tboffset, WORD,
7650                                           FALSE, TRUE, TRUE);
7651 #endif
7652                     OPERATOR(FORMAT);
7653                 }
7654
7655                 /* Look for a prototype */
7656                 if (*s == '(') {
7657                     char *p;
7658                     bool bad_proto = FALSE;
7659                     bool in_brackets = FALSE;
7660                     char greedy_proto = ' ';
7661                     bool proto_after_greedy_proto = FALSE;
7662                     bool must_be_last = FALSE;
7663                     bool underscore = FALSE;
7664                     bool seen_underscore = FALSE;
7665                     const bool warnillegalproto = ckWARN(WARN_ILLEGALPROTO);
7666
7667                     s = scan_str(s,!!PL_madskills,FALSE);
7668                     if (!s)
7669                         Perl_croak(aTHX_ "Prototype not terminated");
7670                     /* strip spaces and check for bad characters */
7671                     d = SvPVX(PL_lex_stuff);
7672                     tmp = 0;
7673                     for (p = d; *p; ++p) {
7674                         if (!isSPACE(*p)) {
7675                             d[tmp++] = *p;
7676
7677                             if (warnillegalproto) {
7678                                 if (must_be_last)
7679                                     proto_after_greedy_proto = TRUE;
7680                                 if (!strchr("$@%*;[]&\\_", *p)) {
7681                                     bad_proto = TRUE;
7682                                 }
7683                                 else {
7684                                     if ( underscore ) {
7685                                         if ( *p != ';' )
7686                                             bad_proto = TRUE;
7687                                         underscore = FALSE;
7688                                     }
7689                                     if ( *p == '[' ) {
7690                                         in_brackets = TRUE;
7691                                     }
7692                                     else if ( *p == ']' ) {
7693                                         in_brackets = FALSE;
7694                                     }
7695                                     else if ( (*p == '@' || *p == '%') &&
7696                                          ( tmp < 2 || d[tmp-2] != '\\' ) &&
7697                                          !in_brackets ) {
7698                                         must_be_last = TRUE;
7699                                         greedy_proto = *p;
7700                                     }
7701                                     else if ( *p == '_' ) {
7702                                         underscore = seen_underscore = TRUE;
7703                                     }
7704                                 }
7705                             }
7706                         }
7707                     }
7708                     d[tmp] = '\0';
7709                     if (proto_after_greedy_proto)
7710                         Perl_warner(aTHX_ packWARN(WARN_ILLEGALPROTO),
7711                                     "Prototype after '%c' for %"SVf" : %s",
7712                                     greedy_proto, SVfARG(PL_subname), d);
7713                     if (bad_proto)
7714                         Perl_warner(aTHX_ packWARN(WARN_ILLEGALPROTO),
7715                                     "Illegal character %sin prototype for %"SVf" : %s",
7716                                     seen_underscore ? "after '_' " : "",
7717                                     SVfARG(PL_subname), d);
7718                     SvCUR_set(PL_lex_stuff, tmp);
7719                     have_proto = TRUE;
7720
7721 #ifdef PERL_MAD
7722                     start_force(0);
7723                     CURMAD('q', PL_thisopen);
7724                     CURMAD('_', tmpwhite);
7725                     CURMAD('=', PL_thisstuff);
7726                     CURMAD('Q', PL_thisclose);
7727                     NEXTVAL_NEXTTOKE.opval =
7728                         (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
7729                     PL_lex_stuff = NULL;
7730                     force_next(THING);
7731
7732                     s = SKIPSPACE2(s,tmpwhite);
7733 #else
7734                     s = skipspace(s);
7735 #endif
7736                 }
7737                 else
7738                     have_proto = FALSE;
7739
7740                 if (*s == ':' && s[1] != ':')
7741                     PL_expect = attrful;
7742                 else if (*s != '{' && key == KEY_sub) {
7743                     if (!have_name)
7744                         Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine");
7745                     else if (*s != ';' && *s != '}')
7746                         Perl_croak(aTHX_ "Illegal declaration of subroutine %"SVf, SVfARG(PL_subname));
7747                 }
7748
7749 #ifdef PERL_MAD
7750                 start_force(0);
7751                 if (tmpwhite) {
7752                     if (PL_madskills)
7753                         curmad('^', newSVpvs(""));
7754                     CURMAD('_', tmpwhite);
7755                 }
7756                 force_next(0);
7757
7758                 PL_thistoken = subtoken;
7759 #else
7760                 if (have_proto) {
7761                     NEXTVAL_NEXTTOKE.opval =
7762                         (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
7763                     PL_lex_stuff = NULL;
7764                     force_next(THING);
7765                 }
7766 #endif
7767                 if (!have_name) {
7768                     if (PL_curstash)
7769                         sv_setpvs(PL_subname, "__ANON__");
7770                     else
7771                         sv_setpvs(PL_subname, "__ANON__::__ANON__");
7772                     TOKEN(ANONSUB);
7773                 }
7774 #ifndef PERL_MAD
7775                 (void) force_word(PL_oldbufptr + tboffset, WORD,
7776                                   FALSE, TRUE, TRUE);
7777 #endif
7778                 if (key == KEY_my)
7779                     TOKEN(MYSUB);
7780                 TOKEN(SUB);
7781             }
7782
7783         case KEY_system:
7784             LOP(OP_SYSTEM,XREF);
7785
7786         case KEY_symlink:
7787             LOP(OP_SYMLINK,XTERM);
7788
7789         case KEY_syscall:
7790             LOP(OP_SYSCALL,XTERM);
7791
7792         case KEY_sysopen:
7793             LOP(OP_SYSOPEN,XTERM);
7794
7795         case KEY_sysseek:
7796             LOP(OP_SYSSEEK,XTERM);
7797
7798         case KEY_sysread:
7799             LOP(OP_SYSREAD,XTERM);
7800
7801         case KEY_syswrite:
7802             LOP(OP_SYSWRITE,XTERM);
7803
7804         case KEY_tr:
7805             s = scan_trans(s);
7806             TERM(sublex_start());
7807
7808         case KEY_tell:
7809             UNI(OP_TELL);
7810
7811         case KEY_telldir:
7812             UNI(OP_TELLDIR);
7813
7814         case KEY_tie:
7815             LOP(OP_TIE,XTERM);
7816
7817         case KEY_tied:
7818             UNI(OP_TIED);
7819
7820         case KEY_time:
7821             FUN0(OP_TIME);
7822
7823         case KEY_times:
7824             FUN0(OP_TMS);
7825
7826         case KEY_truncate:
7827             LOP(OP_TRUNCATE,XTERM);
7828
7829         case KEY_uc:
7830             UNI(OP_UC);
7831
7832         case KEY_ucfirst:
7833             UNI(OP_UCFIRST);
7834
7835         case KEY_untie:
7836             UNI(OP_UNTIE);
7837
7838         case KEY_until:
7839             pl_yylval.ival = CopLINE(PL_curcop);
7840             OPERATOR(UNTIL);
7841
7842         case KEY_unless:
7843             pl_yylval.ival = CopLINE(PL_curcop);
7844             OPERATOR(UNLESS);
7845
7846         case KEY_unlink:
7847             LOP(OP_UNLINK,XTERM);
7848
7849         case KEY_undef:
7850             UNIDOR(OP_UNDEF);
7851
7852         case KEY_unpack:
7853             LOP(OP_UNPACK,XTERM);
7854
7855         case KEY_utime:
7856             LOP(OP_UTIME,XTERM);
7857
7858         case KEY_umask:
7859             UNIDOR(OP_UMASK);
7860
7861         case KEY_unshift:
7862             LOP(OP_UNSHIFT,XTERM);
7863
7864         case KEY_use:
7865             s = tokenize_use(1, s);
7866             OPERATOR(USE);
7867
7868         case KEY_values:
7869             UNI(OP_VALUES);
7870
7871         case KEY_vec:
7872             LOP(OP_VEC,XTERM);
7873
7874         case KEY_when:
7875             pl_yylval.ival = CopLINE(PL_curcop);
7876             OPERATOR(WHEN);
7877
7878         case KEY_while:
7879             pl_yylval.ival = CopLINE(PL_curcop);
7880             OPERATOR(WHILE);
7881
7882         case KEY_warn:
7883             PL_hints |= HINT_BLOCK_SCOPE;
7884             LOP(OP_WARN,XTERM);
7885
7886         case KEY_wait:
7887             FUN0(OP_WAIT);
7888
7889         case KEY_waitpid:
7890             LOP(OP_WAITPID,XTERM);
7891
7892         case KEY_wantarray:
7893             FUN0(OP_WANTARRAY);
7894
7895         case KEY_write:
7896 #ifdef EBCDIC
7897         {
7898             char ctl_l[2];
7899             ctl_l[0] = toCTRL('L');
7900             ctl_l[1] = '\0';
7901             gv_fetchpvn_flags(ctl_l, 1, GV_ADD|GV_NOTQUAL, SVt_PV);
7902         }
7903 #else
7904             /* Make sure $^L is defined */
7905             gv_fetchpvs("\f", GV_ADD|GV_NOTQUAL, SVt_PV);
7906 #endif
7907             UNI(OP_ENTERWRITE);
7908
7909         case KEY_x:
7910             if (PL_expect == XOPERATOR)
7911                 Mop(OP_REPEAT);
7912             check_uni();
7913             goto just_a_word;
7914
7915         case KEY_xor:
7916             pl_yylval.ival = OP_XOR;
7917             OPERATOR(OROP);
7918
7919         case KEY_y:
7920             s = scan_trans(s);
7921             TERM(sublex_start());
7922         }
7923     }}
7924 }
7925 #ifdef __SC__
7926 #pragma segment Main
7927 #endif
7928
7929 static int
7930 S_pending_ident(pTHX)
7931 {
7932     dVAR;
7933     register char *d;
7934     PADOFFSET tmp = 0;
7935     /* pit holds the identifier we read and pending_ident is reset */
7936     char pit = PL_pending_ident;
7937     const STRLEN tokenbuf_len = strlen(PL_tokenbuf);
7938     /* All routes through this function want to know if there is a colon.  */
7939     const char *const has_colon = (const char*) memchr (PL_tokenbuf, ':', tokenbuf_len);
7940     PL_pending_ident = 0;
7941
7942     /* PL_realtokenstart = realtokenend = PL_bufptr - SvPVX(PL_linestr); */
7943     DEBUG_T({ PerlIO_printf(Perl_debug_log,
7944           "### Pending identifier '%s'\n", PL_tokenbuf); });
7945
7946     /* if we're in a my(), we can't allow dynamics here.
7947        $foo'bar has already been turned into $foo::bar, so
7948        just check for colons.
7949
7950        if it's a legal name, the OP is a PADANY.
7951     */
7952     if (PL_in_my) {
7953         if (PL_in_my == KEY_our) {      /* "our" is merely analogous to "my" */
7954             if (has_colon)
7955                 yyerror(Perl_form(aTHX_ "No package name allowed for "
7956                                   "variable %s in \"our\"",
7957                                   PL_tokenbuf));
7958             tmp = allocmy(PL_tokenbuf, tokenbuf_len, 0);
7959         }
7960         else {
7961             if (has_colon)
7962                 yyerror(Perl_form(aTHX_ PL_no_myglob,
7963                             PL_in_my == KEY_my ? "my" : "state", PL_tokenbuf));
7964
7965             pl_yylval.opval = newOP(OP_PADANY, 0);
7966             pl_yylval.opval->op_targ = allocmy(PL_tokenbuf, tokenbuf_len, 0);
7967             return PRIVATEREF;
7968         }
7969     }
7970
7971     /*
7972        build the ops for accesses to a my() variable.
7973
7974        Deny my($a) or my($b) in a sort block, *if* $a or $b is
7975        then used in a comparison.  This catches most, but not
7976        all cases.  For instance, it catches
7977            sort { my($a); $a <=> $b }
7978        but not
7979            sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
7980        (although why you'd do that is anyone's guess).
7981     */
7982
7983     if (!has_colon) {
7984         if (!PL_in_my)
7985             tmp = pad_findmy(PL_tokenbuf, tokenbuf_len, 0);
7986         if (tmp != NOT_IN_PAD) {
7987             /* might be an "our" variable" */
7988             if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
7989                 /* build ops for a bareword */
7990                 HV *  const stash = PAD_COMPNAME_OURSTASH(tmp);
7991                 HEK * const stashname = HvNAME_HEK(stash);
7992                 SV *  const sym = newSVhek(stashname);
7993                 sv_catpvs(sym, "::");
7994                 sv_catpvn(sym, PL_tokenbuf+1, tokenbuf_len - 1);
7995                 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
7996                 pl_yylval.opval->op_private = OPpCONST_ENTERED;
7997                 gv_fetchsv(sym,
7998                     (PL_in_eval
7999                         ? (GV_ADDMULTI | GV_ADDINEVAL)
8000                         : GV_ADDMULTI
8001                     ),
8002                     ((PL_tokenbuf[0] == '$') ? SVt_PV
8003                      : (PL_tokenbuf[0] == '@') ? SVt_PVAV
8004                      : SVt_PVHV));
8005                 return WORD;
8006             }
8007
8008             /* if it's a sort block and they're naming $a or $b */
8009             if (PL_last_lop_op == OP_SORT &&
8010                 PL_tokenbuf[0] == '$' &&
8011                 (PL_tokenbuf[1] == 'a' || PL_tokenbuf[1] == 'b')
8012                 && !PL_tokenbuf[2])
8013             {
8014                 for (d = PL_in_eval ? PL_oldoldbufptr : PL_linestart;
8015                      d < PL_bufend && *d != '\n';
8016                      d++)
8017                 {
8018                     if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
8019                         Perl_croak(aTHX_ "Can't use \"my %s\" in sort comparison",
8020                               PL_tokenbuf);
8021                     }
8022                 }
8023             }
8024
8025             pl_yylval.opval = newOP(OP_PADANY, 0);
8026             pl_yylval.opval->op_targ = tmp;
8027             return PRIVATEREF;
8028         }
8029     }
8030
8031     /*
8032        Whine if they've said @foo in a doublequoted string,
8033        and @foo isn't a variable we can find in the symbol
8034        table.
8035     */
8036     if (ckWARN(WARN_AMBIGUOUS) &&
8037         pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
8038         GV *const gv = gv_fetchpvn_flags(PL_tokenbuf + 1, tokenbuf_len - 1, 0,
8039                                          SVt_PVAV);
8040         if ((!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
8041                 /* DO NOT warn for @- and @+ */
8042                 && !( PL_tokenbuf[2] == '\0' &&
8043                     ( PL_tokenbuf[1] == '-' || PL_tokenbuf[1] == '+' ))
8044            )
8045         {
8046             /* Downgraded from fatal to warning 20000522 mjd */
8047             Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
8048                         "Possible unintended interpolation of %s in string",
8049                         PL_tokenbuf);
8050         }
8051     }
8052
8053     /* build ops for a bareword */
8054     pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpvn(PL_tokenbuf + 1,
8055                                                       tokenbuf_len - 1));
8056     pl_yylval.opval->op_private = OPpCONST_ENTERED;
8057     gv_fetchpvn_flags(
8058             PL_tokenbuf + 1, tokenbuf_len - 1,
8059             /* If the identifier refers to a stash, don't autovivify it.
8060              * Change 24660 had the side effect of causing symbol table
8061              * hashes to always be defined, even if they were freshly
8062              * created and the only reference in the entire program was
8063              * the single statement with the defined %foo::bar:: test.
8064              * It appears that all code in the wild doing this actually
8065              * wants to know whether sub-packages have been loaded, so
8066              * by avoiding auto-vivifying symbol tables, we ensure that
8067              * defined %foo::bar:: continues to be false, and the existing
8068              * tests still give the expected answers, even though what
8069              * they're actually testing has now changed subtly.
8070              */
8071             (*PL_tokenbuf == '%'
8072              && *(d = PL_tokenbuf + tokenbuf_len - 1) == ':'
8073              && d[-1] == ':'
8074              ? 0
8075              : PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : GV_ADD),
8076             ((PL_tokenbuf[0] == '$') ? SVt_PV
8077              : (PL_tokenbuf[0] == '@') ? SVt_PVAV
8078              : SVt_PVHV));
8079     return WORD;
8080 }
8081
8082 /*
8083  *  The following code was generated by perl_keyword.pl.
8084  */
8085
8086 I32
8087 Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords)
8088 {
8089     dVAR;
8090
8091     PERL_ARGS_ASSERT_KEYWORD;
8092
8093   switch (len)
8094   {
8095     case 1: /* 5 tokens of length 1 */
8096       switch (name[0])
8097       {
8098         case 'm':
8099           {                                       /* m          */
8100             return KEY_m;
8101           }
8102
8103         case 'q':
8104           {                                       /* q          */
8105             return KEY_q;
8106           }
8107
8108         case 's':
8109           {                                       /* s          */
8110             return KEY_s;
8111           }
8112
8113         case 'x':
8114           {                                       /* x          */
8115             return -KEY_x;
8116           }
8117
8118         case 'y':
8119           {                                       /* y          */
8120             return KEY_y;
8121           }
8122
8123         default:
8124           goto unknown;
8125       }
8126
8127     case 2: /* 18 tokens of length 2 */
8128       switch (name[0])
8129       {
8130         case 'd':
8131           if (name[1] == 'o')
8132           {                                       /* do         */
8133             return KEY_do;
8134           }
8135
8136           goto unknown;
8137
8138         case 'e':
8139           if (name[1] == 'q')
8140           {                                       /* eq         */
8141             return -KEY_eq;
8142           }
8143
8144           goto unknown;
8145
8146         case 'g':
8147           switch (name[1])
8148           {
8149             case 'e':
8150               {                                   /* ge         */
8151                 return -KEY_ge;
8152               }
8153
8154             case 't':
8155               {                                   /* gt         */
8156                 return -KEY_gt;
8157               }
8158
8159             default:
8160               goto unknown;
8161           }
8162
8163         case 'i':
8164           if (name[1] == 'f')
8165           {                                       /* if         */
8166             return KEY_if;
8167           }
8168
8169           goto unknown;
8170
8171         case 'l':
8172           switch (name[1])
8173           {
8174             case 'c':
8175               {                                   /* lc         */
8176                 return -KEY_lc;
8177               }
8178
8179             case 'e':
8180               {                                   /* le         */
8181                 return -KEY_le;
8182               }
8183
8184             case 't':
8185               {                                   /* lt         */
8186                 return -KEY_lt;
8187               }
8188
8189             default:
8190               goto unknown;
8191           }
8192
8193         case 'm':
8194           if (name[1] == 'y')
8195           {                                       /* my         */
8196             return KEY_my;
8197           }
8198
8199           goto unknown;
8200
8201         case 'n':
8202           switch (name[1])
8203           {
8204             case 'e':
8205               {                                   /* ne         */
8206                 return -KEY_ne;
8207               }
8208
8209             case 'o':
8210               {                                   /* no         */
8211                 return KEY_no;
8212               }
8213
8214             default:
8215               goto unknown;
8216           }
8217
8218         case 'o':
8219           if (name[1] == 'r')
8220           {                                       /* or         */
8221             return -KEY_or;
8222           }
8223
8224           goto unknown;
8225
8226         case 'q':
8227           switch (name[1])
8228           {
8229             case 'q':
8230               {                                   /* qq         */
8231                 return KEY_qq;
8232               }
8233
8234             case 'r':
8235               {                                   /* qr         */
8236                 return KEY_qr;
8237               }
8238
8239             case 'w':
8240               {                                   /* qw         */
8241                 return KEY_qw;
8242               }
8243
8244             case 'x':
8245               {                                   /* qx         */
8246                 return KEY_qx;
8247               }
8248
8249             default:
8250               goto unknown;
8251           }
8252
8253         case 't':
8254           if (name[1] == 'r')
8255           {                                       /* tr         */
8256             return KEY_tr;
8257           }
8258
8259           goto unknown;
8260
8261         case 'u':
8262           if (name[1] == 'c')
8263           {                                       /* uc         */
8264             return -KEY_uc;
8265           }
8266
8267           goto unknown;
8268
8269         default:
8270           goto unknown;
8271       }
8272
8273     case 3: /* 29 tokens of length 3 */
8274       switch (name[0])
8275       {
8276         case 'E':
8277           if (name[1] == 'N' &&
8278               name[2] == 'D')
8279           {                                       /* END        */
8280             return KEY_END;
8281           }
8282
8283           goto unknown;
8284
8285         case 'a':
8286           switch (name[1])
8287           {
8288             case 'b':
8289               if (name[2] == 's')
8290               {                                   /* abs        */
8291                 return -KEY_abs;
8292               }
8293
8294               goto unknown;
8295
8296             case 'n':
8297               if (name[2] == 'd')
8298               {                                   /* and        */
8299                 return -KEY_and;
8300               }
8301
8302               goto unknown;
8303
8304             default:
8305               goto unknown;
8306           }
8307
8308         case 'c':
8309           switch (name[1])
8310           {
8311             case 'h':
8312               if (name[2] == 'r')
8313               {                                   /* chr        */
8314                 return -KEY_chr;
8315               }
8316
8317               goto unknown;
8318
8319             case 'm':
8320               if (name[2] == 'p')
8321               {                                   /* cmp        */
8322                 return -KEY_cmp;
8323               }
8324
8325               goto unknown;
8326
8327             case 'o':
8328               if (name[2] == 's')
8329               {                                   /* cos        */
8330                 return -KEY_cos;
8331               }
8332
8333               goto unknown;
8334
8335             default:
8336               goto unknown;
8337           }
8338
8339         case 'd':
8340           if (name[1] == 'i' &&
8341               name[2] == 'e')
8342           {                                       /* die        */
8343             return -KEY_die;
8344           }
8345
8346           goto unknown;
8347
8348         case 'e':
8349           switch (name[1])
8350           {
8351             case 'o':
8352               if (name[2] == 'f')
8353               {                                   /* eof        */
8354                 return -KEY_eof;
8355               }
8356
8357               goto unknown;
8358
8359             case 'x':
8360               if (name[2] == 'p')
8361               {                                   /* exp        */
8362                 return -KEY_exp;
8363               }
8364
8365               goto unknown;
8366
8367             default:
8368               goto unknown;
8369           }
8370
8371         case 'f':
8372           if (name[1] == 'o' &&
8373               name[2] == 'r')
8374           {                                       /* for        */
8375             return KEY_for;
8376           }
8377
8378           goto unknown;
8379
8380         case 'h':
8381           if (name[1] == 'e' &&
8382               name[2] == 'x')
8383           {                                       /* hex        */
8384             return -KEY_hex;
8385           }
8386
8387           goto unknown;
8388
8389         case 'i':
8390           if (name[1] == 'n' &&
8391               name[2] == 't')
8392           {                                       /* int        */
8393             return -KEY_int;
8394           }
8395
8396           goto unknown;
8397
8398         case 'l':
8399           if (name[1] == 'o' &&
8400               name[2] == 'g')
8401           {                                       /* log        */
8402             return -KEY_log;
8403           }
8404
8405           goto unknown;
8406
8407         case 'm':
8408           if (name[1] == 'a' &&
8409               name[2] == 'p')
8410           {                                       /* map        */
8411             return KEY_map;
8412           }
8413
8414           goto unknown;
8415
8416         case 'n':
8417           if (name[1] == 'o' &&
8418               name[2] == 't')
8419           {                                       /* not        */
8420             return -KEY_not;
8421           }
8422
8423           goto unknown;
8424
8425         case 'o':
8426           switch (name[1])
8427           {
8428             case 'c':
8429               if (name[2] == 't')
8430               {                                   /* oct        */
8431                 return -KEY_oct;
8432               }
8433
8434               goto unknown;
8435
8436             case 'r':
8437               if (name[2] == 'd')
8438               {                                   /* ord        */
8439                 return -KEY_ord;
8440               }
8441
8442               goto unknown;
8443
8444             case 'u':
8445               if (name[2] == 'r')
8446               {                                   /* our        */
8447                 return KEY_our;
8448               }
8449
8450               goto unknown;
8451
8452             default:
8453               goto unknown;
8454           }
8455
8456         case 'p':
8457           if (name[1] == 'o')
8458           {
8459             switch (name[2])
8460             {
8461               case 'p':
8462                 {                                 /* pop        */
8463                   return -KEY_pop;
8464                 }
8465
8466               case 's':
8467                 {                                 /* pos        */
8468                   return KEY_pos;
8469                 }
8470
8471               default:
8472                 goto unknown;
8473             }
8474           }
8475
8476           goto unknown;
8477
8478         case 'r':
8479           if (name[1] == 'e' &&
8480               name[2] == 'f')
8481           {                                       /* ref        */
8482             return -KEY_ref;
8483           }
8484
8485           goto unknown;
8486
8487         case 's':
8488           switch (name[1])
8489           {
8490             case 'a':
8491               if (name[2] == 'y')
8492               {                                   /* say        */
8493                 return (all_keywords || FEATURE_IS_ENABLED("say") ? KEY_say : 0);
8494               }
8495
8496               goto unknown;
8497
8498             case 'i':
8499               if (name[2] == 'n')
8500               {                                   /* sin        */
8501                 return -KEY_sin;
8502               }
8503
8504               goto unknown;
8505
8506             case 'u':
8507               if (name[2] == 'b')
8508               {                                   /* sub        */
8509                 return KEY_sub;
8510               }
8511
8512               goto unknown;
8513
8514             default:
8515               goto unknown;
8516           }
8517
8518         case 't':
8519           if (name[1] == 'i' &&
8520               name[2] == 'e')
8521           {                                       /* tie        */
8522             return KEY_tie;
8523           }
8524
8525           goto unknown;
8526
8527         case 'u':
8528           if (name[1] == 's' &&
8529               name[2] == 'e')
8530           {                                       /* use        */
8531             return KEY_use;
8532           }
8533
8534           goto unknown;
8535
8536         case 'v':
8537           if (name[1] == 'e' &&
8538               name[2] == 'c')
8539           {                                       /* vec        */
8540             return -KEY_vec;
8541           }
8542
8543           goto unknown;
8544
8545         case 'x':
8546           if (name[1] == 'o' &&
8547               name[2] == 'r')
8548           {                                       /* xor        */
8549             return -KEY_xor;
8550           }
8551
8552           goto unknown;
8553
8554         default:
8555           goto unknown;
8556       }
8557
8558     case 4: /* 41 tokens of length 4 */
8559       switch (name[0])
8560       {
8561         case 'C':
8562           if (name[1] == 'O' &&
8563               name[2] == 'R' &&
8564               name[3] == 'E')
8565           {                                       /* CORE       */
8566             return -KEY_CORE;
8567           }
8568
8569           goto unknown;
8570
8571         case 'I':
8572           if (name[1] == 'N' &&
8573               name[2] == 'I' &&
8574               name[3] == 'T')
8575           {                                       /* INIT       */
8576             return KEY_INIT;
8577           }
8578
8579           goto unknown;
8580
8581         case 'b':
8582           if (name[1] == 'i' &&
8583               name[2] == 'n' &&
8584               name[3] == 'd')
8585           {                                       /* bind       */
8586             return -KEY_bind;
8587           }
8588
8589           goto unknown;
8590
8591         case 'c':
8592           if (name[1] == 'h' &&
8593               name[2] == 'o' &&
8594               name[3] == 'p')
8595           {                                       /* chop       */
8596             return -KEY_chop;
8597           }
8598
8599           goto unknown;
8600
8601         case 'd':
8602           if (name[1] == 'u' &&
8603               name[2] == 'm' &&
8604               name[3] == 'p')
8605           {                                       /* dump       */
8606             return -KEY_dump;
8607           }
8608
8609           goto unknown;
8610
8611         case 'e':
8612           switch (name[1])
8613           {
8614             case 'a':
8615               if (name[2] == 'c' &&
8616                   name[3] == 'h')
8617               {                                   /* each       */
8618                 return -KEY_each;
8619               }
8620
8621               goto unknown;
8622
8623             case 'l':
8624               if (name[2] == 's' &&
8625                   name[3] == 'e')
8626               {                                   /* else       */
8627                 return KEY_else;
8628               }
8629
8630               goto unknown;
8631
8632             case 'v':
8633               if (name[2] == 'a' &&
8634                   name[3] == 'l')
8635               {                                   /* eval       */
8636                 return KEY_eval;
8637               }
8638
8639               goto unknown;
8640
8641             case 'x':
8642               switch (name[2])
8643               {
8644                 case 'e':
8645                   if (name[3] == 'c')
8646                   {                               /* exec       */
8647                     return -KEY_exec;
8648                   }
8649
8650                   goto unknown;
8651
8652                 case 'i':
8653                   if (name[3] == 't')
8654                   {                               /* exit       */
8655                     return -KEY_exit;
8656                   }
8657
8658                   goto unknown;
8659
8660                 default:
8661                   goto unknown;
8662               }
8663
8664             default:
8665               goto unknown;
8666           }
8667
8668         case 'f':
8669           if (name[1] == 'o' &&
8670               name[2] == 'r' &&
8671               name[3] == 'k')
8672           {                                       /* fork       */
8673             return -KEY_fork;
8674           }
8675
8676           goto unknown;
8677
8678         case 'g':
8679           switch (name[1])
8680           {
8681             case 'e':
8682               if (name[2] == 't' &&
8683                   name[3] == 'c')
8684               {                                   /* getc       */
8685                 return -KEY_getc;
8686               }
8687
8688               goto unknown;
8689
8690             case 'l':
8691               if (name[2] == 'o' &&
8692                   name[3] == 'b')
8693               {                                   /* glob       */
8694                 return KEY_glob;
8695               }
8696
8697               goto unknown;
8698
8699             case 'o':
8700               if (name[2] == 't' &&
8701                   name[3] == 'o')
8702               {                                   /* goto       */
8703                 return KEY_goto;
8704               }
8705
8706               goto unknown;
8707
8708             case 'r':
8709               if (name[2] == 'e' &&
8710                   name[3] == 'p')
8711               {                                   /* grep       */
8712                 return KEY_grep;
8713               }
8714
8715               goto unknown;
8716
8717             default:
8718               goto unknown;
8719           }
8720
8721         case 'j':
8722           if (name[1] == 'o' &&
8723               name[2] == 'i' &&
8724               name[3] == 'n')
8725           {                                       /* join       */
8726             return -KEY_join;
8727           }
8728
8729           goto unknown;
8730
8731         case 'k':
8732           switch (name[1])
8733           {
8734             case 'e':
8735               if (name[2] == 'y' &&
8736                   name[3] == 's')
8737               {                                   /* keys       */
8738                 return -KEY_keys;
8739               }
8740
8741               goto unknown;
8742
8743             case 'i':
8744               if (name[2] == 'l' &&
8745                   name[3] == 'l')
8746               {                                   /* kill       */
8747                 return -KEY_kill;
8748               }
8749
8750               goto unknown;
8751
8752             default:
8753               goto unknown;
8754           }
8755
8756         case 'l':
8757           switch (name[1])
8758           {
8759             case 'a':
8760               if (name[2] == 's' &&
8761                   name[3] == 't')
8762               {                                   /* last       */
8763                 return KEY_last;
8764               }
8765
8766               goto unknown;
8767
8768             case 'i':
8769               if (name[2] == 'n' &&
8770                   name[3] == 'k')
8771               {                                   /* link       */
8772                 return -KEY_link;
8773               }
8774
8775               goto unknown;
8776
8777             case 'o':
8778               if (name[2] == 'c' &&
8779                   name[3] == 'k')
8780               {                                   /* lock       */
8781                 return -KEY_lock;
8782               }
8783
8784               goto unknown;
8785
8786             default:
8787               goto unknown;
8788           }
8789
8790         case 'n':
8791           if (name[1] == 'e' &&
8792               name[2] == 'x' &&
8793               name[3] == 't')
8794           {                                       /* next       */
8795             return KEY_next;
8796           }
8797
8798           goto unknown;
8799
8800         case 'o':
8801           if (name[1] == 'p' &&
8802               name[2] == 'e' &&
8803               name[3] == 'n')
8804           {                                       /* open       */
8805             return -KEY_open;
8806           }
8807
8808           goto unknown;
8809
8810         case 'p':
8811           switch (name[1])
8812           {
8813             case 'a':
8814               if (name[2] == 'c' &&
8815                   name[3] == 'k')
8816               {                                   /* pack       */
8817                 return -KEY_pack;
8818               }
8819
8820               goto unknown;
8821
8822             case 'i':
8823               if (name[2] == 'p' &&
8824                   name[3] == 'e')
8825               {                                   /* pipe       */
8826                 return -KEY_pipe;
8827               }
8828
8829               goto unknown;
8830
8831             case 'u':
8832               if (name[2] == 's' &&
8833                   name[3] == 'h')
8834               {                                   /* push       */
8835                 return -KEY_push;
8836               }
8837
8838               goto unknown;
8839
8840             default:
8841               goto unknown;
8842           }
8843
8844         case 'r':
8845           switch (name[1])
8846           {
8847             case 'a':
8848               if (name[2] == 'n' &&
8849                   name[3] == 'd')
8850               {                                   /* rand       */
8851                 return -KEY_rand;
8852               }
8853
8854               goto unknown;
8855
8856             case 'e':
8857               switch (name[2])
8858               {
8859                 case 'a':
8860                   if (name[3] == 'd')
8861                   {                               /* read       */
8862                     return -KEY_read;
8863                   }
8864
8865                   goto unknown;
8866
8867                 case 'c':
8868                   if (name[3] == 'v')
8869                   {                               /* recv       */
8870                     return -KEY_recv;
8871                   }
8872
8873                   goto unknown;
8874
8875                 case 'd':
8876                   if (name[3] == 'o')
8877                   {                               /* redo       */
8878                     return KEY_redo;
8879                   }
8880
8881                   goto unknown;
8882
8883                 default:
8884                   goto unknown;
8885               }
8886
8887             default:
8888               goto unknown;
8889           }
8890
8891         case 's':
8892           switch (name[1])
8893           {
8894             case 'e':
8895               switch (name[2])
8896               {
8897                 case 'e':
8898                   if (name[3] == 'k')
8899                   {                               /* seek       */
8900                     return -KEY_seek;
8901                   }
8902
8903                   goto unknown;
8904
8905                 case 'n':
8906                   if (name[3] == 'd')
8907                   {                               /* send       */
8908                     return -KEY_send;
8909                   }
8910
8911                   goto unknown;
8912
8913                 default:
8914                   goto unknown;
8915               }
8916
8917             case 'o':
8918               if (name[2] == 'r' &&
8919                   name[3] == 't')
8920               {                                   /* sort       */
8921                 return KEY_sort;
8922               }
8923
8924               goto unknown;
8925
8926             case 'q':
8927               if (name[2] == 'r' &&
8928                   name[3] == 't')
8929               {                                   /* sqrt       */
8930                 return -KEY_sqrt;
8931               }
8932
8933               goto unknown;
8934
8935             case 't':
8936               if (name[2] == 'a' &&
8937                   name[3] == 't')
8938               {                                   /* stat       */
8939                 return -KEY_stat;
8940               }
8941
8942               goto unknown;
8943
8944             default:
8945               goto unknown;
8946           }
8947
8948         case 't':
8949           switch (name[1])
8950           {
8951             case 'e':
8952               if (name[2] == 'l' &&
8953                   name[3] == 'l')
8954               {                                   /* tell       */
8955                 return -KEY_tell;
8956               }
8957
8958               goto unknown;
8959
8960             case 'i':
8961               switch (name[2])
8962               {
8963                 case 'e':
8964                   if (name[3] == 'd')
8965                   {                               /* tied       */
8966                     return KEY_tied;
8967                   }
8968
8969                   goto unknown;
8970
8971                 case 'm':
8972                   if (name[3] == 'e')
8973                   {                               /* time       */
8974                     return -KEY_time;
8975                   }
8976
8977                   goto unknown;
8978
8979                 default:
8980                   goto unknown;
8981               }
8982
8983             default:
8984               goto unknown;
8985           }
8986
8987         case 'w':
8988           switch (name[1])
8989           {
8990             case 'a':
8991               switch (name[2])
8992               {
8993                 case 'i':
8994                   if (name[3] == 't')
8995                   {                               /* wait       */
8996                     return -KEY_wait;
8997                   }
8998
8999                   goto unknown;
9000
9001                 case 'r':
9002                   if (name[3] == 'n')
9003                   {                               /* warn       */
9004                     return -KEY_warn;
9005                   }
9006
9007                   goto unknown;
9008
9009                 default:
9010                   goto unknown;
9011               }
9012
9013             case 'h':
9014               if (name[2] == 'e' &&
9015                   name[3] == 'n')
9016               {                                   /* when       */
9017                 return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_when : 0);
9018               }
9019
9020               goto unknown;
9021
9022             default:
9023               goto unknown;
9024           }
9025
9026         default:
9027           goto unknown;
9028       }
9029
9030     case 5: /* 39 tokens of length 5 */
9031       switch (name[0])
9032       {
9033         case 'B':
9034           if (name[1] == 'E' &&
9035               name[2] == 'G' &&
9036               name[3] == 'I' &&
9037               name[4] == 'N')
9038           {                                       /* BEGIN      */
9039             return KEY_BEGIN;
9040           }
9041
9042           goto unknown;
9043
9044         case 'C':
9045           if (name[1] == 'H' &&
9046               name[2] == 'E' &&
9047               name[3] == 'C' &&
9048               name[4] == 'K')
9049           {                                       /* CHECK      */
9050             return KEY_CHECK;
9051           }
9052
9053           goto unknown;
9054
9055         case 'a':
9056           switch (name[1])
9057           {
9058             case 'l':
9059               if (name[2] == 'a' &&
9060                   name[3] == 'r' &&
9061                   name[4] == 'm')
9062               {                                   /* alarm      */
9063                 return -KEY_alarm;
9064               }
9065
9066               goto unknown;
9067
9068             case 't':
9069               if (name[2] == 'a' &&
9070                   name[3] == 'n' &&
9071                   name[4] == '2')
9072               {                                   /* atan2      */
9073                 return -KEY_atan2;
9074               }
9075
9076               goto unknown;
9077
9078             default:
9079               goto unknown;
9080           }
9081
9082         case 'b':
9083           switch (name[1])
9084           {
9085             case 'l':
9086               if (name[2] == 'e' &&
9087                   name[3] == 's' &&
9088                   name[4] == 's')
9089               {                                   /* bless      */
9090                 return -KEY_bless;
9091               }
9092
9093               goto unknown;
9094
9095             case 'r':
9096               if (name[2] == 'e' &&
9097                   name[3] == 'a' &&
9098                   name[4] == 'k')
9099               {                                   /* break      */
9100                 return (all_keywords || FEATURE_IS_ENABLED("switch") ? -KEY_break : 0);
9101               }
9102
9103               goto unknown;
9104
9105             default:
9106               goto unknown;
9107           }
9108
9109         case 'c':
9110           switch (name[1])
9111           {
9112             case 'h':
9113               switch (name[2])
9114               {
9115                 case 'd':
9116                   if (name[3] == 'i' &&
9117                       name[4] == 'r')
9118                   {                               /* chdir      */
9119                     return -KEY_chdir;
9120                   }
9121
9122                   goto unknown;
9123
9124                 case 'm':
9125                   if (name[3] == 'o' &&
9126                       name[4] == 'd')
9127                   {                               /* chmod      */
9128                     return -KEY_chmod;
9129                   }
9130
9131                   goto unknown;
9132
9133                 case 'o':
9134                   switch (name[3])
9135                   {
9136                     case 'm':
9137                       if (name[4] == 'p')
9138                       {                           /* chomp      */
9139                         return -KEY_chomp;
9140                       }
9141
9142                       goto unknown;
9143
9144                     case 'w':
9145                       if (name[4] == 'n')
9146                       {                           /* chown      */
9147                         return -KEY_chown;
9148                       }
9149
9150                       goto unknown;
9151
9152                     default:
9153                       goto unknown;
9154                   }
9155
9156                 default:
9157                   goto unknown;
9158               }
9159
9160             case 'l':
9161               if (name[2] == 'o' &&
9162                   name[3] == 's' &&
9163                   name[4] == 'e')
9164               {                                   /* close      */
9165                 return -KEY_close;
9166               }
9167
9168               goto unknown;
9169
9170             case 'r':
9171               if (name[2] == 'y' &&
9172                   name[3] == 'p' &&
9173                   name[4] == 't')
9174               {                                   /* crypt      */
9175                 return -KEY_crypt;
9176               }
9177
9178               goto unknown;
9179
9180             default:
9181               goto unknown;
9182           }
9183
9184         case 'e':
9185           if (name[1] == 'l' &&
9186               name[2] == 's' &&
9187               name[3] == 'i' &&
9188               name[4] == 'f')
9189           {                                       /* elsif      */
9190             return KEY_elsif;
9191           }
9192
9193           goto unknown;
9194
9195         case 'f':
9196           switch (name[1])
9197           {
9198             case 'c':
9199               if (name[2] == 'n' &&
9200                   name[3] == 't' &&
9201                   name[4] == 'l')
9202               {                                   /* fcntl      */
9203                 return -KEY_fcntl;
9204               }
9205
9206               goto unknown;
9207
9208             case 'l':
9209               if (name[2] == 'o' &&
9210                   name[3] == 'c' &&
9211                   name[4] == 'k')
9212               {                                   /* flock      */
9213                 return -KEY_flock;
9214               }
9215
9216               goto unknown;
9217
9218             default:
9219               goto unknown;
9220           }
9221
9222         case 'g':
9223           if (name[1] == 'i' &&
9224               name[2] == 'v' &&
9225               name[3] == 'e' &&
9226               name[4] == 'n')
9227           {                                       /* given      */
9228             return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_given : 0);
9229           }
9230
9231           goto unknown;
9232
9233         case 'i':
9234           switch (name[1])
9235           {
9236             case 'n':
9237               if (name[2] == 'd' &&
9238                   name[3] == 'e' &&
9239                   name[4] == 'x')
9240               {                                   /* index      */
9241                 return -KEY_index;
9242               }
9243
9244               goto unknown;
9245
9246             case 'o':
9247               if (name[2] == 'c' &&
9248                   name[3] == 't' &&
9249                   name[4] == 'l')
9250               {                                   /* ioctl      */
9251                 return -KEY_ioctl;
9252               }
9253
9254               goto unknown;
9255
9256             default:
9257               goto unknown;
9258           }
9259
9260         case 'l':
9261           switch (name[1])
9262           {
9263             case 'o':
9264               if (name[2] == 'c' &&
9265                   name[3] == 'a' &&
9266                   name[4] == 'l')
9267               {                                   /* local      */
9268                 return KEY_local;
9269               }
9270
9271               goto unknown;
9272
9273             case 's':
9274               if (name[2] == 't' &&
9275                   name[3] == 'a' &&
9276                   name[4] == 't')
9277               {                                   /* lstat      */
9278                 return -KEY_lstat;
9279               }
9280
9281               goto unknown;
9282
9283             default:
9284               goto unknown;
9285           }
9286
9287         case 'm':
9288           if (name[1] == 'k' &&
9289               name[2] == 'd' &&
9290               name[3] == 'i' &&
9291               name[4] == 'r')
9292           {                                       /* mkdir      */
9293             return -KEY_mkdir;
9294           }
9295
9296           goto unknown;
9297
9298         case 'p':
9299           if (name[1] == 'r' &&
9300               name[2] == 'i' &&
9301               name[3] == 'n' &&
9302               name[4] == 't')
9303           {                                       /* print      */
9304             return KEY_print;
9305           }
9306
9307           goto unknown;
9308
9309         case 'r':
9310           switch (name[1])
9311           {
9312             case 'e':
9313               if (name[2] == 's' &&
9314                   name[3] == 'e' &&
9315                   name[4] == 't')
9316               {                                   /* reset      */
9317                 return -KEY_reset;
9318               }
9319
9320               goto unknown;
9321
9322             case 'm':
9323               if (name[2] == 'd' &&
9324                   name[3] == 'i' &&
9325                   name[4] == 'r')
9326               {                                   /* rmdir      */
9327                 return -KEY_rmdir;
9328               }
9329
9330               goto unknown;
9331
9332             default:
9333               goto unknown;
9334           }
9335
9336         case 's':
9337           switch (name[1])
9338           {
9339             case 'e':
9340               if (name[2] == 'm' &&
9341                   name[3] == 'o' &&
9342                   name[4] == 'p')
9343               {                                   /* semop      */
9344                 return -KEY_semop;
9345               }
9346
9347               goto unknown;
9348
9349             case 'h':
9350               if (name[2] == 'i' &&
9351                   name[3] == 'f' &&
9352                   name[4] == 't')
9353               {                                   /* shift      */
9354                 return -KEY_shift;
9355               }
9356
9357               goto unknown;
9358
9359             case 'l':
9360               if (name[2] == 'e' &&
9361                   name[3] == 'e' &&
9362                   name[4] == 'p')
9363               {                                   /* sleep      */
9364                 return -KEY_sleep;
9365               }
9366
9367               goto unknown;
9368
9369             case 'p':
9370               if (name[2] == 'l' &&
9371                   name[3] == 'i' &&
9372                   name[4] == 't')
9373               {                                   /* split      */
9374                 return KEY_split;
9375               }
9376
9377               goto unknown;
9378
9379             case 'r':
9380               if (name[2] == 'a' &&
9381                   name[3] == 'n' &&
9382                   name[4] == 'd')
9383               {                                   /* srand      */
9384                 return -KEY_srand;
9385               }
9386
9387               goto unknown;
9388
9389             case 't':
9390               switch (name[2])
9391               {
9392                 case 'a':
9393                   if (name[3] == 't' &&
9394                       name[4] == 'e')
9395                   {                               /* state      */
9396                     return (all_keywords || FEATURE_IS_ENABLED("state") ? KEY_state : 0);
9397                   }
9398
9399                   goto unknown;
9400
9401                 case 'u':
9402                   if (name[3] == 'd' &&
9403                       name[4] == 'y')
9404                   {                               /* study      */
9405                     return KEY_study;
9406                   }
9407
9408                   goto unknown;
9409
9410                 default:
9411                   goto unknown;
9412               }
9413
9414             default:
9415               goto unknown;
9416           }
9417
9418         case 't':
9419           if (name[1] == 'i' &&
9420               name[2] == 'm' &&
9421               name[3] == 'e' &&
9422               name[4] == 's')
9423           {                                       /* times      */
9424             return -KEY_times;
9425           }
9426
9427           goto unknown;
9428
9429         case 'u':
9430           switch (name[1])
9431           {
9432             case 'm':
9433               if (name[2] == 'a' &&
9434                   name[3] == 's' &&
9435                   name[4] == 'k')
9436               {                                   /* umask      */
9437                 return -KEY_umask;
9438               }
9439
9440               goto unknown;
9441
9442             case 'n':
9443               switch (name[2])
9444               {
9445                 case 'd':
9446                   if (name[3] == 'e' &&
9447                       name[4] == 'f')
9448                   {                               /* undef      */
9449                     return KEY_undef;
9450                   }
9451
9452                   goto unknown;
9453
9454                 case 't':
9455                   if (name[3] == 'i')
9456                   {
9457                     switch (name[4])
9458                     {
9459                       case 'e':
9460                         {                         /* untie      */
9461                           return KEY_untie;
9462                         }
9463
9464                       case 'l':
9465                         {                         /* until      */
9466                           return KEY_until;
9467                         }
9468
9469                       default:
9470                         goto unknown;
9471                     }
9472                   }
9473
9474                   goto unknown;
9475
9476                 default:
9477                   goto unknown;
9478               }
9479
9480             case 't':
9481               if (name[2] == 'i' &&
9482                   name[3] == 'm' &&
9483                   name[4] == 'e')
9484               {                                   /* utime      */
9485                 return -KEY_utime;
9486               }
9487
9488               goto unknown;
9489
9490             default:
9491               goto unknown;
9492           }
9493
9494         case 'w':
9495           switch (name[1])
9496           {
9497             case 'h':
9498               if (name[2] == 'i' &&
9499                   name[3] == 'l' &&
9500                   name[4] == 'e')
9501               {                                   /* while      */
9502                 return KEY_while;
9503               }
9504
9505               goto unknown;
9506
9507             case 'r':
9508               if (name[2] == 'i' &&
9509                   name[3] == 't' &&
9510                   name[4] == 'e')
9511               {                                   /* write      */
9512                 return -KEY_write;
9513               }
9514
9515               goto unknown;
9516
9517             default:
9518               goto unknown;
9519           }
9520
9521         default:
9522           goto unknown;
9523       }
9524
9525     case 6: /* 33 tokens of length 6 */
9526       switch (name[0])
9527       {
9528         case 'a':
9529           if (name[1] == 'c' &&
9530               name[2] == 'c' &&
9531               name[3] == 'e' &&
9532               name[4] == 'p' &&
9533               name[5] == 't')
9534           {                                       /* accept     */
9535             return -KEY_accept;
9536           }
9537
9538           goto unknown;
9539
9540         case 'c':
9541           switch (name[1])
9542           {
9543             case 'a':
9544               if (name[2] == 'l' &&
9545                   name[3] == 'l' &&
9546                   name[4] == 'e' &&
9547                   name[5] == 'r')
9548               {                                   /* caller     */
9549                 return -KEY_caller;
9550               }
9551
9552               goto unknown;
9553
9554             case 'h':
9555               if (name[2] == 'r' &&
9556                   name[3] == 'o' &&
9557                   name[4] == 'o' &&
9558                   name[5] == 't')
9559               {                                   /* chroot     */
9560                 return -KEY_chroot;
9561               }
9562
9563               goto unknown;
9564
9565             default:
9566               goto unknown;
9567           }
9568
9569         case 'd':
9570           if (name[1] == 'e' &&
9571               name[2] == 'l' &&
9572               name[3] == 'e' &&
9573               name[4] == 't' &&
9574               name[5] == 'e')
9575           {                                       /* delete     */
9576             return KEY_delete;
9577           }
9578
9579           goto unknown;
9580
9581         case 'e':
9582           switch (name[1])
9583           {
9584             case 'l':
9585               if (name[2] == 's' &&
9586                   name[3] == 'e' &&
9587                   name[4] == 'i' &&
9588                   name[5] == 'f')
9589               {                                   /* elseif     */
9590                   Perl_ck_warner_d(aTHX_ packWARN(WARN_SYNTAX), "elseif should be elsif");
9591               }
9592
9593               goto unknown;
9594
9595             case 'x':
9596               if (name[2] == 'i' &&
9597                   name[3] == 's' &&
9598                   name[4] == 't' &&
9599                   name[5] == 's')
9600               {                                   /* exists     */
9601                 return KEY_exists;
9602               }
9603
9604               goto unknown;
9605
9606             default:
9607               goto unknown;
9608           }
9609
9610         case 'f':
9611           switch (name[1])
9612           {
9613             case 'i':
9614               if (name[2] == 'l' &&
9615                   name[3] == 'e' &&
9616                   name[4] == 'n' &&
9617                   name[5] == 'o')
9618               {                                   /* fileno     */
9619                 return -KEY_fileno;
9620               }
9621
9622               goto unknown;
9623
9624             case 'o':
9625               if (name[2] == 'r' &&
9626                   name[3] == 'm' &&
9627                   name[4] == 'a' &&
9628                   name[5] == 't')
9629               {                                   /* format     */
9630                 return KEY_format;
9631               }
9632
9633               goto unknown;
9634
9635             default:
9636               goto unknown;
9637           }
9638
9639         case 'g':
9640           if (name[1] == 'm' &&
9641               name[2] == 't' &&
9642               name[3] == 'i' &&
9643               name[4] == 'm' &&
9644               name[5] == 'e')
9645           {                                       /* gmtime     */
9646             return -KEY_gmtime;
9647           }
9648
9649           goto unknown;
9650
9651         case 'l':
9652           switch (name[1])
9653           {
9654             case 'e':
9655               if (name[2] == 'n' &&
9656                   name[3] == 'g' &&
9657                   name[4] == 't' &&
9658                   name[5] == 'h')
9659               {                                   /* length     */
9660                 return -KEY_length;
9661               }
9662
9663               goto unknown;
9664
9665             case 'i':
9666               if (name[2] == 's' &&
9667                   name[3] == 't' &&
9668                   name[4] == 'e' &&
9669                   name[5] == 'n')
9670               {                                   /* listen     */
9671                 return -KEY_listen;
9672               }
9673
9674               goto unknown;
9675
9676             default:
9677               goto unknown;
9678           }
9679
9680         case 'm':
9681           if (name[1] == 's' &&
9682               name[2] == 'g')
9683           {
9684             switch (name[3])
9685             {
9686               case 'c':
9687                 if (name[4] == 't' &&
9688                     name[5] == 'l')
9689                 {                                 /* msgctl     */
9690                   return -KEY_msgctl;
9691                 }
9692
9693                 goto unknown;
9694
9695               case 'g':
9696                 if (name[4] == 'e' &&
9697                     name[5] == 't')
9698                 {                                 /* msgget     */
9699                   return -KEY_msgget;
9700                 }
9701
9702                 goto unknown;
9703
9704               case 'r':
9705                 if (name[4] == 'c' &&
9706                     name[5] == 'v')
9707                 {                                 /* msgrcv     */
9708                   return -KEY_msgrcv;
9709                 }
9710
9711                 goto unknown;
9712
9713               case 's':
9714                 if (name[4] == 'n' &&
9715                     name[5] == 'd')
9716                 {                                 /* msgsnd     */
9717                   return -KEY_msgsnd;
9718                 }
9719
9720                 goto unknown;
9721
9722               default:
9723                 goto unknown;
9724             }
9725           }
9726
9727           goto unknown;
9728
9729         case 'p':
9730           if (name[1] == 'r' &&
9731               name[2] == 'i' &&
9732               name[3] == 'n' &&
9733               name[4] == 't' &&
9734               name[5] == 'f')
9735           {                                       /* printf     */
9736             return KEY_printf;
9737           }
9738
9739           goto unknown;
9740
9741         case 'r':
9742           switch (name[1])
9743           {
9744             case 'e':
9745               switch (name[2])
9746               {
9747                 case 'n':
9748                   if (name[3] == 'a' &&
9749                       name[4] == 'm' &&
9750                       name[5] == 'e')
9751                   {                               /* rename     */
9752                     return -KEY_rename;
9753                   }
9754
9755                   goto unknown;
9756
9757                 case 't':
9758                   if (name[3] == 'u' &&
9759                       name[4] == 'r' &&
9760                       name[5] == 'n')
9761                   {                               /* return     */
9762                     return KEY_return;
9763                   }
9764
9765                   goto unknown;
9766
9767                 default:
9768                   goto unknown;
9769               }
9770
9771             case 'i':
9772               if (name[2] == 'n' &&
9773                   name[3] == 'd' &&
9774                   name[4] == 'e' &&
9775                   name[5] == 'x')
9776               {                                   /* rindex     */
9777                 return -KEY_rindex;
9778               }
9779
9780               goto unknown;
9781
9782             default:
9783               goto unknown;
9784           }
9785
9786         case 's':
9787           switch (name[1])
9788           {
9789             case 'c':
9790               if (name[2] == 'a' &&
9791                   name[3] == 'l' &&
9792                   name[4] == 'a' &&
9793                   name[5] == 'r')
9794               {                                   /* scalar     */
9795                 return KEY_scalar;
9796               }
9797
9798               goto unknown;
9799
9800             case 'e':
9801               switch (name[2])
9802               {
9803                 case 'l':
9804                   if (name[3] == 'e' &&
9805                       name[4] == 'c' &&
9806                       name[5] == 't')
9807                   {                               /* select     */
9808                     return -KEY_select;
9809                   }
9810
9811                   goto unknown;
9812
9813                 case 'm':
9814                   switch (name[3])
9815                   {
9816                     case 'c':
9817                       if (name[4] == 't' &&
9818                           name[5] == 'l')
9819                       {                           /* semctl     */
9820                         return -KEY_semctl;
9821                       }
9822
9823                       goto unknown;
9824
9825                     case 'g':
9826                       if (name[4] == 'e' &&
9827                           name[5] == 't')
9828                       {                           /* semget     */
9829                         return -KEY_semget;
9830                       }
9831
9832                       goto unknown;
9833
9834                     default:
9835                       goto unknown;
9836                   }
9837
9838                 default:
9839                   goto unknown;
9840               }
9841
9842             case 'h':
9843               if (name[2] == 'm')
9844               {
9845                 switch (name[3])
9846                 {
9847                   case 'c':
9848                     if (name[4] == 't' &&
9849                         name[5] == 'l')
9850                     {                             /* shmctl     */
9851                       return -KEY_shmctl;
9852                     }
9853
9854                     goto unknown;
9855
9856                   case 'g':
9857                     if (name[4] == 'e' &&
9858                         name[5] == 't')
9859                     {                             /* shmget     */
9860                       return -KEY_shmget;
9861                     }
9862
9863                     goto unknown;
9864
9865                   default:
9866                     goto unknown;
9867                 }
9868               }
9869
9870               goto unknown;
9871
9872             case 'o':
9873               if (name[2] == 'c' &&
9874                   name[3] == 'k' &&
9875                   name[4] == 'e' &&
9876                   name[5] == 't')
9877               {                                   /* socket     */
9878                 return -KEY_socket;
9879               }
9880
9881               goto unknown;
9882
9883             case 'p':
9884               if (name[2] == 'l' &&
9885                   name[3] == 'i' &&
9886                   name[4] == 'c' &&
9887                   name[5] == 'e')
9888               {                                   /* splice     */
9889                 return -KEY_splice;
9890               }
9891
9892               goto unknown;
9893
9894             case 'u':
9895               if (name[2] == 'b' &&
9896                   name[3] == 's' &&
9897                   name[4] == 't' &&
9898                   name[5] == 'r')
9899               {                                   /* substr     */
9900                 return -KEY_substr;
9901               }
9902
9903               goto unknown;
9904
9905             case 'y':
9906               if (name[2] == 's' &&
9907                   name[3] == 't' &&
9908                   name[4] == 'e' &&
9909                   name[5] == 'm')
9910               {                                   /* system     */
9911                 return -KEY_system;
9912               }
9913
9914               goto unknown;
9915
9916             default:
9917               goto unknown;
9918           }
9919
9920         case 'u':
9921           if (name[1] == 'n')
9922           {
9923             switch (name[2])
9924             {
9925               case 'l':
9926                 switch (name[3])
9927                 {
9928                   case 'e':
9929                     if (name[4] == 's' &&
9930                         name[5] == 's')
9931                     {                             /* unless     */
9932                       return KEY_unless;
9933                     }
9934
9935                     goto unknown;
9936
9937                   case 'i':
9938                     if (name[4] == 'n' &&
9939                         name[5] == 'k')
9940                     {                             /* unlink     */
9941                       return -KEY_unlink;
9942                     }
9943
9944                     goto unknown;
9945
9946                   default:
9947                     goto unknown;
9948                 }
9949
9950               case 'p':
9951                 if (name[3] == 'a' &&
9952                     name[4] == 'c' &&
9953                     name[5] == 'k')
9954                 {                                 /* unpack     */
9955                   return -KEY_unpack;
9956                 }
9957
9958                 goto unknown;
9959
9960               default:
9961                 goto unknown;
9962             }
9963           }
9964
9965           goto unknown;
9966
9967         case 'v':
9968           if (name[1] == 'a' &&
9969               name[2] == 'l' &&
9970               name[3] == 'u' &&
9971               name[4] == 'e' &&
9972               name[5] == 's')
9973           {                                       /* values     */
9974             return -KEY_values;
9975           }
9976
9977           goto unknown;
9978
9979         default:
9980           goto unknown;
9981       }
9982
9983     case 7: /* 29 tokens of length 7 */
9984       switch (name[0])
9985       {
9986         case 'D':
9987           if (name[1] == 'E' &&
9988               name[2] == 'S' &&
9989               name[3] == 'T' &&
9990               name[4] == 'R' &&
9991               name[5] == 'O' &&
9992               name[6] == 'Y')
9993           {                                       /* DESTROY    */
9994             return KEY_DESTROY;
9995           }
9996
9997           goto unknown;
9998
9999         case '_':
10000           if (name[1] == '_' &&
10001               name[2] == 'E' &&
10002               name[3] == 'N' &&
10003               name[4] == 'D' &&
10004               name[5] == '_' &&
10005               name[6] == '_')
10006           {                                       /* __END__    */
10007             return KEY___END__;
10008           }
10009
10010           goto unknown;
10011
10012         case 'b':
10013           if (name[1] == 'i' &&
10014               name[2] == 'n' &&
10015               name[3] == 'm' &&
10016               name[4] == 'o' &&
10017               name[5] == 'd' &&
10018               name[6] == 'e')
10019           {                                       /* binmode    */
10020             return -KEY_binmode;
10021           }
10022
10023           goto unknown;
10024
10025         case 'c':
10026           if (name[1] == 'o' &&
10027               name[2] == 'n' &&
10028               name[3] == 'n' &&
10029               name[4] == 'e' &&
10030               name[5] == 'c' &&
10031               name[6] == 't')
10032           {                                       /* connect    */
10033             return -KEY_connect;
10034           }
10035
10036           goto unknown;
10037
10038         case 'd':
10039           switch (name[1])
10040           {
10041             case 'b':
10042               if (name[2] == 'm' &&
10043                   name[3] == 'o' &&
10044                   name[4] == 'p' &&
10045                   name[5] == 'e' &&
10046                   name[6] == 'n')
10047               {                                   /* dbmopen    */
10048                 return -KEY_dbmopen;
10049               }
10050
10051               goto unknown;
10052
10053             case 'e':
10054               if (name[2] == 'f')
10055               {
10056                 switch (name[3])
10057                 {
10058                   case 'a':
10059                     if (name[4] == 'u' &&
10060                         name[5] == 'l' &&
10061                         name[6] == 't')
10062                     {                             /* default    */
10063                       return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_default : 0);
10064                     }
10065
10066                     goto unknown;
10067
10068                   case 'i':
10069                     if (name[4] == 'n' &&
10070                         name[5] == 'e' &&
10071                         name[6] == 'd')
10072                     {                             /* defined    */
10073                       return KEY_defined;
10074                     }
10075
10076                     goto unknown;
10077
10078                   default:
10079                     goto unknown;
10080                 }
10081               }
10082
10083               goto unknown;
10084
10085             default:
10086               goto unknown;
10087           }
10088
10089         case 'f':
10090           if (name[1] == 'o' &&
10091               name[2] == 'r' &&
10092               name[3] == 'e' &&
10093               name[4] == 'a' &&
10094               name[5] == 'c' &&
10095               name[6] == 'h')
10096           {                                       /* foreach    */
10097             return KEY_foreach;
10098           }
10099
10100           goto unknown;
10101
10102         case 'g':
10103           if (name[1] == 'e' &&
10104               name[2] == 't' &&
10105               name[3] == 'p')
10106           {
10107             switch (name[4])
10108             {
10109               case 'g':
10110                 if (name[5] == 'r' &&
10111                     name[6] == 'p')
10112                 {                                 /* getpgrp    */
10113                   return -KEY_getpgrp;
10114                 }
10115
10116                 goto unknown;
10117
10118               case 'p':
10119                 if (name[5] == 'i' &&
10120                     name[6] == 'd')
10121                 {                                 /* getppid    */
10122                   return -KEY_getppid;
10123                 }
10124
10125                 goto unknown;
10126
10127               default:
10128                 goto unknown;
10129             }
10130           }
10131
10132           goto unknown;
10133
10134         case 'l':
10135           if (name[1] == 'c' &&
10136               name[2] == 'f' &&
10137               name[3] == 'i' &&
10138               name[4] == 'r' &&
10139               name[5] == 's' &&
10140               name[6] == 't')
10141           {                                       /* lcfirst    */
10142             return -KEY_lcfirst;
10143           }
10144
10145           goto unknown;
10146
10147         case 'o':
10148           if (name[1] == 'p' &&
10149               name[2] == 'e' &&
10150               name[3] == 'n' &&
10151               name[4] == 'd' &&
10152               name[5] == 'i' &&
10153               name[6] == 'r')
10154           {                                       /* opendir    */
10155             return -KEY_opendir;
10156           }
10157
10158           goto unknown;
10159
10160         case 'p':
10161           if (name[1] == 'a' &&
10162               name[2] == 'c' &&
10163               name[3] == 'k' &&
10164               name[4] == 'a' &&
10165               name[5] == 'g' &&
10166               name[6] == 'e')
10167           {                                       /* package    */
10168             return KEY_package;
10169           }
10170
10171           goto unknown;
10172
10173         case 'r':
10174           if (name[1] == 'e')
10175           {
10176             switch (name[2])
10177             {
10178               case 'a':
10179                 if (name[3] == 'd' &&
10180                     name[4] == 'd' &&
10181                     name[5] == 'i' &&
10182                     name[6] == 'r')
10183                 {                                 /* readdir    */
10184                   return -KEY_readdir;
10185                 }
10186
10187                 goto unknown;
10188
10189               case 'q':
10190                 if (name[3] == 'u' &&
10191                     name[4] == 'i' &&
10192                     name[5] == 'r' &&
10193                     name[6] == 'e')
10194                 {                                 /* require    */
10195                   return KEY_require;
10196                 }
10197
10198                 goto unknown;
10199
10200               case 'v':
10201                 if (name[3] == 'e' &&
10202                     name[4] == 'r' &&
10203                     name[5] == 's' &&
10204                     name[6] == 'e')
10205                 {                                 /* reverse    */
10206                   return -KEY_reverse;
10207                 }
10208
10209                 goto unknown;
10210
10211               default:
10212                 goto unknown;
10213             }
10214           }
10215
10216           goto unknown;
10217
10218         case 's':
10219           switch (name[1])
10220           {
10221             case 'e':
10222               switch (name[2])
10223               {
10224                 case 'e':
10225                   if (name[3] == 'k' &&
10226                       name[4] == 'd' &&
10227                       name[5] == 'i' &&
10228                       name[6] == 'r')
10229                   {                               /* seekdir    */
10230                     return -KEY_seekdir;
10231                   }
10232
10233                   goto unknown;
10234
10235                 case 't':
10236                   if (name[3] == 'p' &&
10237                       name[4] == 'g' &&
10238                       name[5] == 'r' &&
10239                       name[6] == 'p')
10240                   {                               /* setpgrp    */
10241                     return -KEY_setpgrp;
10242                   }
10243
10244                   goto unknown;
10245
10246                 default:
10247                   goto unknown;
10248               }
10249
10250             case 'h':
10251               if (name[2] == 'm' &&
10252                   name[3] == 'r' &&
10253                   name[4] == 'e' &&
10254                   name[5] == 'a' &&
10255                   name[6] == 'd')
10256               {                                   /* shmread    */
10257                 return -KEY_shmread;
10258               }
10259
10260               goto unknown;
10261
10262             case 'p':
10263               if (name[2] == 'r' &&
10264                   name[3] == 'i' &&
10265                   name[4] == 'n' &&
10266                   name[5] == 't' &&
10267                   name[6] == 'f')
10268               {                                   /* sprintf    */
10269                 return -KEY_sprintf;
10270               }
10271
10272               goto unknown;
10273
10274             case 'y':
10275               switch (name[2])
10276               {
10277                 case 'm':
10278                   if (name[3] == 'l' &&
10279                       name[4] == 'i' &&
10280                       name[5] == 'n' &&
10281                       name[6] == 'k')
10282                   {                               /* symlink    */
10283                     return -KEY_symlink;
10284                   }
10285
10286                   goto unknown;
10287
10288                 case 's':
10289                   switch (name[3])
10290                   {
10291                     case 'c':
10292                       if (name[4] == 'a' &&
10293                           name[5] == 'l' &&
10294                           name[6] == 'l')
10295                       {                           /* syscall    */
10296                         return -KEY_syscall;
10297                       }
10298
10299                       goto unknown;
10300
10301                     case 'o':
10302                       if (name[4] == 'p' &&
10303                           name[5] == 'e' &&
10304                           name[6] == 'n')
10305                       {                           /* sysopen    */
10306                         return -KEY_sysopen;
10307                       }
10308
10309                       goto unknown;
10310
10311                     case 'r':
10312                       if (name[4] == 'e' &&
10313                           name[5] == 'a' &&
10314                           name[6] == 'd')
10315                       {                           /* sysread    */
10316                         return -KEY_sysread;
10317                       }
10318
10319                       goto unknown;
10320
10321                     case 's':
10322                       if (name[4] == 'e' &&
10323                           name[5] == 'e' &&
10324                           name[6] == 'k')
10325                       {                           /* sysseek    */
10326                         return -KEY_sysseek;
10327                       }
10328
10329                       goto unknown;
10330
10331                     default:
10332                       goto unknown;
10333                   }
10334
10335                 default:
10336                   goto unknown;
10337               }
10338
10339             default:
10340               goto unknown;
10341           }
10342
10343         case 't':
10344           if (name[1] == 'e' &&
10345               name[2] == 'l' &&
10346               name[3] == 'l' &&
10347               name[4] == 'd' &&
10348               name[5] == 'i' &&
10349               name[6] == 'r')
10350           {                                       /* telldir    */
10351             return -KEY_telldir;
10352           }
10353
10354           goto unknown;
10355
10356         case 'u':
10357           switch (name[1])
10358           {
10359             case 'c':
10360               if (name[2] == 'f' &&
10361                   name[3] == 'i' &&
10362                   name[4] == 'r' &&
10363                   name[5] == 's' &&
10364                   name[6] == 't')
10365               {                                   /* ucfirst    */
10366                 return -KEY_ucfirst;
10367               }
10368
10369               goto unknown;
10370
10371             case 'n':
10372               if (name[2] == 's' &&
10373                   name[3] == 'h' &&
10374                   name[4] == 'i' &&
10375                   name[5] == 'f' &&
10376                   name[6] == 't')
10377               {                                   /* unshift    */
10378                 return -KEY_unshift;
10379               }
10380
10381               goto unknown;
10382
10383             default:
10384               goto unknown;
10385           }
10386
10387         case 'w':
10388           if (name[1] == 'a' &&
10389               name[2] == 'i' &&
10390               name[3] == 't' &&
10391               name[4] == 'p' &&
10392               name[5] == 'i' &&
10393               name[6] == 'd')
10394           {                                       /* waitpid    */
10395             return -KEY_waitpid;
10396           }
10397
10398           goto unknown;
10399
10400         default:
10401           goto unknown;
10402       }
10403
10404     case 8: /* 26 tokens of length 8 */
10405       switch (name[0])
10406       {
10407         case 'A':
10408           if (name[1] == 'U' &&
10409               name[2] == 'T' &&
10410               name[3] == 'O' &&
10411               name[4] == 'L' &&
10412               name[5] == 'O' &&
10413               name[6] == 'A' &&
10414               name[7] == 'D')
10415           {                                       /* AUTOLOAD   */
10416             return KEY_AUTOLOAD;
10417           }
10418
10419           goto unknown;
10420
10421         case '_':
10422           if (name[1] == '_')
10423           {
10424             switch (name[2])
10425             {
10426               case 'D':
10427                 if (name[3] == 'A' &&
10428                     name[4] == 'T' &&
10429                     name[5] == 'A' &&
10430                     name[6] == '_' &&
10431                     name[7] == '_')
10432                 {                                 /* __DATA__   */
10433                   return KEY___DATA__;
10434                 }
10435
10436                 goto unknown;
10437
10438               case 'F':
10439                 if (name[3] == 'I' &&
10440                     name[4] == 'L' &&
10441                     name[5] == 'E' &&
10442                     name[6] == '_' &&
10443                     name[7] == '_')
10444                 {                                 /* __FILE__   */
10445                   return -KEY___FILE__;
10446                 }
10447
10448                 goto unknown;
10449
10450               case 'L':
10451                 if (name[3] == 'I' &&
10452                     name[4] == 'N' &&
10453                     name[5] == 'E' &&
10454                     name[6] == '_' &&
10455                     name[7] == '_')
10456                 {                                 /* __LINE__   */
10457                   return -KEY___LINE__;
10458                 }
10459
10460                 goto unknown;
10461
10462               default:
10463                 goto unknown;
10464             }
10465           }
10466
10467           goto unknown;
10468
10469         case 'c':
10470           switch (name[1])
10471           {
10472             case 'l':
10473               if (name[2] == 'o' &&
10474                   name[3] == 's' &&
10475                   name[4] == 'e' &&
10476                   name[5] == 'd' &&
10477                   name[6] == 'i' &&
10478                   name[7] == 'r')
10479               {                                   /* closedir   */
10480                 return -KEY_closedir;
10481               }
10482
10483               goto unknown;
10484
10485             case 'o':
10486               if (name[2] == 'n' &&
10487                   name[3] == 't' &&
10488                   name[4] == 'i' &&
10489                   name[5] == 'n' &&
10490                   name[6] == 'u' &&
10491                   name[7] == 'e')
10492               {                                   /* continue   */
10493                 return -KEY_continue;
10494               }
10495
10496               goto unknown;
10497
10498             default:
10499               goto unknown;
10500           }
10501
10502         case 'd':
10503           if (name[1] == 'b' &&
10504               name[2] == 'm' &&
10505               name[3] == 'c' &&
10506               name[4] == 'l' &&
10507               name[5] == 'o' &&
10508               name[6] == 's' &&
10509               name[7] == 'e')
10510           {                                       /* dbmclose   */
10511             return -KEY_dbmclose;
10512           }
10513
10514           goto unknown;
10515
10516         case 'e':
10517           if (name[1] == 'n' &&
10518               name[2] == 'd')
10519           {
10520             switch (name[3])
10521             {
10522               case 'g':
10523                 if (name[4] == 'r' &&
10524                     name[5] == 'e' &&
10525                     name[6] == 'n' &&
10526                     name[7] == 't')
10527                 {                                 /* endgrent   */
10528                   return -KEY_endgrent;
10529                 }
10530
10531                 goto unknown;
10532
10533               case 'p':
10534                 if (name[4] == 'w' &&
10535                     name[5] == 'e' &&
10536                     name[6] == 'n' &&
10537                     name[7] == 't')
10538                 {                                 /* endpwent   */
10539                   return -KEY_endpwent;
10540                 }
10541
10542                 goto unknown;
10543
10544               default:
10545                 goto unknown;
10546             }
10547           }
10548
10549           goto unknown;
10550
10551         case 'f':
10552           if (name[1] == 'o' &&
10553               name[2] == 'r' &&
10554               name[3] == 'm' &&
10555               name[4] == 'l' &&
10556               name[5] == 'i' &&
10557               name[6] == 'n' &&
10558               name[7] == 'e')
10559           {                                       /* formline   */
10560             return -KEY_formline;
10561           }
10562
10563           goto unknown;
10564
10565         case 'g':
10566           if (name[1] == 'e' &&
10567               name[2] == 't')
10568           {
10569             switch (name[3])
10570             {
10571               case 'g':
10572                 if (name[4] == 'r')
10573                 {
10574                   switch (name[5])
10575                   {
10576                     case 'e':
10577                       if (name[6] == 'n' &&
10578                           name[7] == 't')
10579                       {                           /* getgrent   */
10580                         return -KEY_getgrent;
10581                       }
10582
10583                       goto unknown;
10584
10585                     case 'g':
10586                       if (name[6] == 'i' &&
10587                           name[7] == 'd')
10588                       {                           /* getgrgid   */
10589                         return -KEY_getgrgid;
10590                       }
10591
10592                       goto unknown;
10593
10594                     case 'n':
10595                       if (name[6] == 'a' &&
10596                           name[7] == 'm')
10597                       {                           /* getgrnam   */
10598                         return -KEY_getgrnam;
10599                       }
10600
10601                       goto unknown;
10602
10603                     default:
10604                       goto unknown;
10605                   }
10606                 }
10607
10608                 goto unknown;
10609
10610               case 'l':
10611                 if (name[4] == 'o' &&
10612                     name[5] == 'g' &&
10613                     name[6] == 'i' &&
10614                     name[7] == 'n')
10615                 {                                 /* getlogin   */
10616                   return -KEY_getlogin;
10617                 }
10618
10619                 goto unknown;
10620
10621               case 'p':
10622                 if (name[4] == 'w')
10623                 {
10624                   switch (name[5])
10625                   {
10626                     case 'e':
10627                       if (name[6] == 'n' &&
10628                           name[7] == 't')
10629                       {                           /* getpwent   */
10630                         return -KEY_getpwent;
10631                       }
10632
10633                       goto unknown;
10634
10635                     case 'n':
10636                       if (name[6] == 'a' &&
10637                           name[7] == 'm')
10638                       {                           /* getpwnam   */
10639                         return -KEY_getpwnam;
10640                       }
10641
10642                       goto unknown;
10643
10644                     case 'u':
10645                       if (name[6] == 'i' &&
10646                           name[7] == 'd')
10647                       {                           /* getpwuid   */
10648                         return -KEY_getpwuid;
10649                       }
10650
10651                       goto unknown;
10652
10653                     default:
10654                       goto unknown;
10655                   }
10656                 }
10657
10658                 goto unknown;
10659
10660               default:
10661                 goto unknown;
10662             }
10663           }
10664
10665           goto unknown;
10666
10667         case 'r':
10668           if (name[1] == 'e' &&
10669               name[2] == 'a' &&
10670               name[3] == 'd')
10671           {
10672             switch (name[4])
10673             {
10674               case 'l':
10675                 if (name[5] == 'i' &&
10676                     name[6] == 'n')
10677                 {
10678                   switch (name[7])
10679                   {
10680                     case 'e':
10681                       {                           /* readline   */
10682                         return -KEY_readline;
10683                       }
10684
10685                     case 'k':
10686                       {                           /* readlink   */
10687                         return -KEY_readlink;
10688                       }
10689
10690                     default:
10691                       goto unknown;
10692                   }
10693                 }
10694
10695                 goto unknown;
10696
10697               case 'p':
10698                 if (name[5] == 'i' &&
10699                     name[6] == 'p' &&
10700                     name[7] == 'e')
10701                 {                                 /* readpipe   */
10702                   return -KEY_readpipe;
10703                 }
10704
10705                 goto unknown;
10706
10707               default:
10708                 goto unknown;
10709             }
10710           }
10711
10712           goto unknown;
10713
10714         case 's':
10715           switch (name[1])
10716           {
10717             case 'e':
10718               if (name[2] == 't')
10719               {
10720                 switch (name[3])
10721                 {
10722                   case 'g':
10723                     if (name[4] == 'r' &&
10724                         name[5] == 'e' &&
10725                         name[6] == 'n' &&
10726                         name[7] == 't')
10727                     {                             /* setgrent   */
10728                       return -KEY_setgrent;
10729                     }
10730
10731                     goto unknown;
10732
10733                   case 'p':
10734                     if (name[4] == 'w' &&
10735                         name[5] == 'e' &&
10736                         name[6] == 'n' &&
10737                         name[7] == 't')
10738                     {                             /* setpwent   */
10739                       return -KEY_setpwent;
10740                     }
10741
10742                     goto unknown;
10743
10744                   default:
10745                     goto unknown;
10746                 }
10747               }
10748
10749               goto unknown;
10750
10751             case 'h':
10752               switch (name[2])
10753               {
10754                 case 'm':
10755                   if (name[3] == 'w' &&
10756                       name[4] == 'r' &&
10757                       name[5] == 'i' &&
10758                       name[6] == 't' &&
10759                       name[7] == 'e')
10760                   {                               /* shmwrite   */
10761                     return -KEY_shmwrite;
10762                   }
10763
10764                   goto unknown;
10765
10766                 case 'u':
10767                   if (name[3] == 't' &&
10768                       name[4] == 'd' &&
10769                       name[5] == 'o' &&
10770                       name[6] == 'w' &&
10771                       name[7] == 'n')
10772                   {                               /* shutdown   */
10773                     return -KEY_shutdown;
10774                   }
10775
10776                   goto unknown;
10777
10778                 default:
10779                   goto unknown;
10780               }
10781
10782             case 'y':
10783               if (name[2] == 's' &&
10784                   name[3] == 'w' &&
10785                   name[4] == 'r' &&
10786                   name[5] == 'i' &&
10787                   name[6] == 't' &&
10788                   name[7] == 'e')
10789               {                                   /* syswrite   */
10790                 return -KEY_syswrite;
10791               }
10792
10793               goto unknown;
10794
10795             default:
10796               goto unknown;
10797           }
10798
10799         case 't':
10800           if (name[1] == 'r' &&
10801               name[2] == 'u' &&
10802               name[3] == 'n' &&
10803               name[4] == 'c' &&
10804               name[5] == 'a' &&
10805               name[6] == 't' &&
10806               name[7] == 'e')
10807           {                                       /* truncate   */
10808             return -KEY_truncate;
10809           }
10810
10811           goto unknown;
10812
10813         default:
10814           goto unknown;
10815       }
10816
10817     case 9: /* 9 tokens of length 9 */
10818       switch (name[0])
10819       {
10820         case 'U':
10821           if (name[1] == 'N' &&
10822               name[2] == 'I' &&
10823               name[3] == 'T' &&
10824               name[4] == 'C' &&
10825               name[5] == 'H' &&
10826               name[6] == 'E' &&
10827               name[7] == 'C' &&
10828               name[8] == 'K')
10829           {                                       /* UNITCHECK  */
10830             return KEY_UNITCHECK;
10831           }
10832
10833           goto unknown;
10834
10835         case 'e':
10836           if (name[1] == 'n' &&
10837               name[2] == 'd' &&
10838               name[3] == 'n' &&
10839               name[4] == 'e' &&
10840               name[5] == 't' &&
10841               name[6] == 'e' &&
10842               name[7] == 'n' &&
10843               name[8] == 't')
10844           {                                       /* endnetent  */
10845             return -KEY_endnetent;
10846           }
10847
10848           goto unknown;
10849
10850         case 'g':
10851           if (name[1] == 'e' &&
10852               name[2] == 't' &&
10853               name[3] == 'n' &&
10854               name[4] == 'e' &&
10855               name[5] == 't' &&
10856               name[6] == 'e' &&
10857               name[7] == 'n' &&
10858               name[8] == 't')
10859           {                                       /* getnetent  */
10860             return -KEY_getnetent;
10861           }
10862
10863           goto unknown;
10864
10865         case 'l':
10866           if (name[1] == 'o' &&
10867               name[2] == 'c' &&
10868               name[3] == 'a' &&
10869               name[4] == 'l' &&
10870               name[5] == 't' &&
10871               name[6] == 'i' &&
10872               name[7] == 'm' &&
10873               name[8] == 'e')
10874           {                                       /* localtime  */
10875             return -KEY_localtime;
10876           }
10877
10878           goto unknown;
10879
10880         case 'p':
10881           if (name[1] == 'r' &&
10882               name[2] == 'o' &&
10883               name[3] == 't' &&
10884               name[4] == 'o' &&
10885               name[5] == 't' &&
10886               name[6] == 'y' &&
10887               name[7] == 'p' &&
10888               name[8] == 'e')
10889           {                                       /* prototype  */
10890             return KEY_prototype;
10891           }
10892
10893           goto unknown;
10894
10895         case 'q':
10896           if (name[1] == 'u' &&
10897               name[2] == 'o' &&
10898               name[3] == 't' &&
10899               name[4] == 'e' &&
10900               name[5] == 'm' &&
10901               name[6] == 'e' &&
10902               name[7] == 't' &&
10903               name[8] == 'a')
10904           {                                       /* quotemeta  */
10905             return -KEY_quotemeta;
10906           }
10907
10908           goto unknown;
10909
10910         case 'r':
10911           if (name[1] == 'e' &&
10912               name[2] == 'w' &&
10913               name[3] == 'i' &&
10914               name[4] == 'n' &&
10915               name[5] == 'd' &&
10916               name[6] == 'd' &&
10917               name[7] == 'i' &&
10918               name[8] == 'r')
10919           {                                       /* rewinddir  */
10920             return -KEY_rewinddir;
10921           }
10922
10923           goto unknown;
10924
10925         case 's':
10926           if (name[1] == 'e' &&
10927               name[2] == 't' &&
10928               name[3] == 'n' &&
10929               name[4] == 'e' &&
10930               name[5] == 't' &&
10931               name[6] == 'e' &&
10932               name[7] == 'n' &&
10933               name[8] == 't')
10934           {                                       /* setnetent  */
10935             return -KEY_setnetent;
10936           }
10937
10938           goto unknown;
10939
10940         case 'w':
10941           if (name[1] == 'a' &&
10942               name[2] == 'n' &&
10943               name[3] == 't' &&
10944               name[4] == 'a' &&
10945               name[5] == 'r' &&
10946               name[6] == 'r' &&
10947               name[7] == 'a' &&
10948               name[8] == 'y')
10949           {                                       /* wantarray  */
10950             return -KEY_wantarray;
10951           }
10952
10953           goto unknown;
10954
10955         default:
10956           goto unknown;
10957       }
10958
10959     case 10: /* 9 tokens of length 10 */
10960       switch (name[0])
10961       {
10962         case 'e':
10963           if (name[1] == 'n' &&
10964               name[2] == 'd')
10965           {
10966             switch (name[3])
10967             {
10968               case 'h':
10969                 if (name[4] == 'o' &&
10970                     name[5] == 's' &&
10971                     name[6] == 't' &&
10972                     name[7] == 'e' &&
10973                     name[8] == 'n' &&
10974                     name[9] == 't')
10975                 {                                 /* endhostent */
10976                   return -KEY_endhostent;
10977                 }
10978
10979                 goto unknown;
10980
10981               case 's':
10982                 if (name[4] == 'e' &&
10983                     name[5] == 'r' &&
10984                     name[6] == 'v' &&
10985                     name[7] == 'e' &&
10986                     name[8] == 'n' &&
10987                     name[9] == 't')
10988                 {                                 /* endservent */
10989                   return -KEY_endservent;
10990                 }
10991
10992                 goto unknown;
10993
10994               default:
10995                 goto unknown;
10996             }
10997           }
10998
10999           goto unknown;
11000
11001         case 'g':
11002           if (name[1] == 'e' &&
11003               name[2] == 't')
11004           {
11005             switch (name[3])
11006             {
11007               case 'h':
11008                 if (name[4] == 'o' &&
11009                     name[5] == 's' &&
11010                     name[6] == 't' &&
11011                     name[7] == 'e' &&
11012                     name[8] == 'n' &&
11013                     name[9] == 't')
11014                 {                                 /* gethostent */
11015                   return -KEY_gethostent;
11016                 }
11017
11018                 goto unknown;
11019
11020               case 's':
11021                 switch (name[4])
11022                 {
11023                   case 'e':
11024                     if (name[5] == 'r' &&
11025                         name[6] == 'v' &&
11026                         name[7] == 'e' &&
11027                         name[8] == 'n' &&
11028                         name[9] == 't')
11029                     {                             /* getservent */
11030                       return -KEY_getservent;
11031                     }
11032
11033                     goto unknown;
11034
11035                   case 'o':
11036                     if (name[5] == 'c' &&
11037                         name[6] == 'k' &&
11038                         name[7] == 'o' &&
11039                         name[8] == 'p' &&
11040                         name[9] == 't')
11041                     {                             /* getsockopt */
11042                       return -KEY_getsockopt;
11043                     }
11044
11045                     goto unknown;
11046
11047                   default:
11048                     goto unknown;
11049                 }
11050
11051               default:
11052                 goto unknown;
11053             }
11054           }
11055
11056           goto unknown;
11057
11058         case 's':
11059           switch (name[1])
11060           {
11061             case 'e':
11062               if (name[2] == 't')
11063               {
11064                 switch (name[3])
11065                 {
11066                   case 'h':
11067                     if (name[4] == 'o' &&
11068                         name[5] == 's' &&
11069                         name[6] == 't' &&
11070                         name[7] == 'e' &&
11071                         name[8] == 'n' &&
11072                         name[9] == 't')
11073                     {                             /* sethostent */
11074                       return -KEY_sethostent;
11075                     }
11076
11077                     goto unknown;
11078
11079                   case 's':
11080                     switch (name[4])
11081                     {
11082                       case 'e':
11083                         if (name[5] == 'r' &&
11084                             name[6] == 'v' &&
11085                             name[7] == 'e' &&
11086                             name[8] == 'n' &&
11087                             name[9] == 't')
11088                         {                         /* setservent */
11089                           return -KEY_setservent;
11090                         }
11091
11092                         goto unknown;
11093
11094                       case 'o':
11095                         if (name[5] == 'c' &&
11096                             name[6] == 'k' &&
11097                             name[7] == 'o' &&
11098                             name[8] == 'p' &&
11099                             name[9] == 't')
11100                         {                         /* setsockopt */
11101                           return -KEY_setsockopt;
11102                         }
11103
11104                         goto unknown;
11105
11106                       default:
11107                         goto unknown;
11108                     }
11109
11110                   default:
11111                     goto unknown;
11112                 }
11113               }
11114
11115               goto unknown;
11116
11117             case 'o':
11118               if (name[2] == 'c' &&
11119                   name[3] == 'k' &&
11120                   name[4] == 'e' &&
11121                   name[5] == 't' &&
11122                   name[6] == 'p' &&
11123                   name[7] == 'a' &&
11124                   name[8] == 'i' &&
11125                   name[9] == 'r')
11126               {                                   /* socketpair */
11127                 return -KEY_socketpair;
11128               }
11129
11130               goto unknown;
11131
11132             default:
11133               goto unknown;
11134           }
11135
11136         default:
11137           goto unknown;
11138       }
11139
11140     case 11: /* 8 tokens of length 11 */
11141       switch (name[0])
11142       {
11143         case '_':
11144           if (name[1] == '_' &&
11145               name[2] == 'P' &&
11146               name[3] == 'A' &&
11147               name[4] == 'C' &&
11148               name[5] == 'K' &&
11149               name[6] == 'A' &&
11150               name[7] == 'G' &&
11151               name[8] == 'E' &&
11152               name[9] == '_' &&
11153               name[10] == '_')
11154           {                                       /* __PACKAGE__ */
11155             return -KEY___PACKAGE__;
11156           }
11157
11158           goto unknown;
11159
11160         case 'e':
11161           if (name[1] == 'n' &&
11162               name[2] == 'd' &&
11163               name[3] == 'p' &&
11164               name[4] == 'r' &&
11165               name[5] == 'o' &&
11166               name[6] == 't' &&
11167               name[7] == 'o' &&
11168               name[8] == 'e' &&
11169               name[9] == 'n' &&
11170               name[10] == 't')
11171           {                                       /* endprotoent */
11172             return -KEY_endprotoent;
11173           }
11174
11175           goto unknown;
11176
11177         case 'g':
11178           if (name[1] == 'e' &&
11179               name[2] == 't')
11180           {
11181             switch (name[3])
11182             {
11183               case 'p':
11184                 switch (name[4])
11185                 {
11186                   case 'e':
11187                     if (name[5] == 'e' &&
11188                         name[6] == 'r' &&
11189                         name[7] == 'n' &&
11190                         name[8] == 'a' &&
11191                         name[9] == 'm' &&
11192                         name[10] == 'e')
11193                     {                             /* getpeername */
11194                       return -KEY_getpeername;
11195                     }
11196
11197                     goto unknown;
11198
11199                   case 'r':
11200                     switch (name[5])
11201                     {
11202                       case 'i':
11203                         if (name[6] == 'o' &&
11204                             name[7] == 'r' &&
11205                             name[8] == 'i' &&
11206                             name[9] == 't' &&
11207                             name[10] == 'y')
11208                         {                         /* getpriority */
11209                           return -KEY_getpriority;
11210                         }
11211
11212                         goto unknown;
11213
11214                       case 'o':
11215                         if (name[6] == 't' &&
11216                             name[7] == 'o' &&
11217                             name[8] == 'e' &&
11218                             name[9] == 'n' &&
11219                             name[10] == 't')
11220                         {                         /* getprotoent */
11221                           return -KEY_getprotoent;
11222                         }
11223
11224                         goto unknown;
11225
11226                       default:
11227                         goto unknown;
11228                     }
11229
11230                   default:
11231                     goto unknown;
11232                 }
11233
11234               case 's':
11235                 if (name[4] == 'o' &&
11236                     name[5] == 'c' &&
11237                     name[6] == 'k' &&
11238                     name[7] == 'n' &&
11239                     name[8] == 'a' &&
11240                     name[9] == 'm' &&
11241                     name[10] == 'e')
11242                 {                                 /* getsockname */
11243                   return -KEY_getsockname;
11244                 }
11245
11246                 goto unknown;
11247
11248               default:
11249                 goto unknown;
11250             }
11251           }
11252
11253           goto unknown;
11254
11255         case 's':
11256           if (name[1] == 'e' &&
11257               name[2] == 't' &&
11258               name[3] == 'p' &&
11259               name[4] == 'r')
11260           {
11261             switch (name[5])
11262             {
11263               case 'i':
11264                 if (name[6] == 'o' &&
11265                     name[7] == 'r' &&
11266                     name[8] == 'i' &&
11267                     name[9] == 't' &&
11268                     name[10] == 'y')
11269                 {                                 /* setpriority */
11270                   return -KEY_setpriority;
11271                 }
11272
11273                 goto unknown;
11274
11275               case 'o':
11276                 if (name[6] == 't' &&
11277                     name[7] == 'o' &&
11278                     name[8] == 'e' &&
11279                     name[9] == 'n' &&
11280                     name[10] == 't')
11281                 {                                 /* setprotoent */
11282                   return -KEY_setprotoent;
11283                 }
11284
11285                 goto unknown;
11286
11287               default:
11288                 goto unknown;
11289             }
11290           }
11291
11292           goto unknown;
11293
11294         default:
11295           goto unknown;
11296       }
11297
11298     case 12: /* 2 tokens of length 12 */
11299       if (name[0] == 'g' &&
11300           name[1] == 'e' &&
11301           name[2] == 't' &&
11302           name[3] == 'n' &&
11303           name[4] == 'e' &&
11304           name[5] == 't' &&
11305           name[6] == 'b' &&
11306           name[7] == 'y')
11307       {
11308         switch (name[8])
11309         {
11310           case 'a':
11311             if (name[9] == 'd' &&
11312                 name[10] == 'd' &&
11313                 name[11] == 'r')
11314             {                                     /* getnetbyaddr */
11315               return -KEY_getnetbyaddr;
11316             }
11317
11318             goto unknown;
11319
11320           case 'n':
11321             if (name[9] == 'a' &&
11322                 name[10] == 'm' &&
11323                 name[11] == 'e')
11324             {                                     /* getnetbyname */
11325               return -KEY_getnetbyname;
11326             }
11327
11328             goto unknown;
11329
11330           default:
11331             goto unknown;
11332         }
11333       }
11334
11335       goto unknown;
11336
11337     case 13: /* 4 tokens of length 13 */
11338       if (name[0] == 'g' &&
11339           name[1] == 'e' &&
11340           name[2] == 't')
11341       {
11342         switch (name[3])
11343         {
11344           case 'h':
11345             if (name[4] == 'o' &&
11346                 name[5] == 's' &&
11347                 name[6] == 't' &&
11348                 name[7] == 'b' &&
11349                 name[8] == 'y')
11350             {
11351               switch (name[9])
11352               {
11353                 case 'a':
11354                   if (name[10] == 'd' &&
11355                       name[11] == 'd' &&
11356                       name[12] == 'r')
11357                   {                               /* gethostbyaddr */
11358                     return -KEY_gethostbyaddr;
11359                   }
11360
11361                   goto unknown;
11362
11363                 case 'n':
11364                   if (name[10] == 'a' &&
11365                       name[11] == 'm' &&
11366                       name[12] == 'e')
11367                   {                               /* gethostbyname */
11368                     return -KEY_gethostbyname;
11369                   }
11370
11371                   goto unknown;
11372
11373                 default:
11374                   goto unknown;
11375               }
11376             }
11377
11378             goto unknown;
11379
11380           case 's':
11381             if (name[4] == 'e' &&
11382                 name[5] == 'r' &&
11383                 name[6] == 'v' &&
11384                 name[7] == 'b' &&
11385                 name[8] == 'y')
11386             {
11387               switch (name[9])
11388               {
11389                 case 'n':
11390                   if (name[10] == 'a' &&
11391                       name[11] == 'm' &&
11392                       name[12] == 'e')
11393                   {                               /* getservbyname */
11394                     return -KEY_getservbyname;
11395                   }
11396
11397                   goto unknown;
11398
11399                 case 'p':
11400                   if (name[10] == 'o' &&
11401                       name[11] == 'r' &&
11402                       name[12] == 't')
11403                   {                               /* getservbyport */
11404                     return -KEY_getservbyport;
11405                   }
11406
11407                   goto unknown;
11408
11409                 default:
11410                   goto unknown;
11411               }
11412             }
11413
11414             goto unknown;
11415
11416           default:
11417             goto unknown;
11418         }
11419       }
11420
11421       goto unknown;
11422
11423     case 14: /* 1 tokens of length 14 */
11424       if (name[0] == 'g' &&
11425           name[1] == 'e' &&
11426           name[2] == 't' &&
11427           name[3] == 'p' &&
11428           name[4] == 'r' &&
11429           name[5] == 'o' &&
11430           name[6] == 't' &&
11431           name[7] == 'o' &&
11432           name[8] == 'b' &&
11433           name[9] == 'y' &&
11434           name[10] == 'n' &&
11435           name[11] == 'a' &&
11436           name[12] == 'm' &&
11437           name[13] == 'e')
11438       {                                           /* getprotobyname */
11439         return -KEY_getprotobyname;
11440       }
11441
11442       goto unknown;
11443
11444     case 16: /* 1 tokens of length 16 */
11445       if (name[0] == 'g' &&
11446           name[1] == 'e' &&
11447           name[2] == 't' &&
11448           name[3] == 'p' &&
11449           name[4] == 'r' &&
11450           name[5] == 'o' &&
11451           name[6] == 't' &&
11452           name[7] == 'o' &&
11453           name[8] == 'b' &&
11454           name[9] == 'y' &&
11455           name[10] == 'n' &&
11456           name[11] == 'u' &&
11457           name[12] == 'm' &&
11458           name[13] == 'b' &&
11459           name[14] == 'e' &&
11460           name[15] == 'r')
11461       {                                           /* getprotobynumber */
11462         return -KEY_getprotobynumber;
11463       }
11464
11465       goto unknown;
11466
11467     default:
11468       goto unknown;
11469   }
11470
11471 unknown:
11472   return 0;
11473 }
11474
11475 STATIC void
11476 S_checkcomma(pTHX_ const char *s, const char *name, const char *what)
11477 {
11478     dVAR;
11479
11480     PERL_ARGS_ASSERT_CHECKCOMMA;
11481
11482     if (*s == ' ' && s[1] == '(') {     /* XXX gotta be a better way */
11483         if (ckWARN(WARN_SYNTAX)) {
11484             int level = 1;
11485             const char *w;
11486             for (w = s+2; *w && level; w++) {
11487                 if (*w == '(')
11488                     ++level;
11489                 else if (*w == ')')
11490                     --level;
11491             }
11492             while (isSPACE(*w))
11493                 ++w;
11494             /* the list of chars below is for end of statements or
11495              * block / parens, boolean operators (&&, ||, //) and branch
11496              * constructs (or, and, if, until, unless, while, err, for).
11497              * Not a very solid hack... */
11498             if (!*w || !strchr(";&/|})]oaiuwef!=", *w))
11499                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
11500                             "%s (...) interpreted as function",name);
11501         }
11502     }
11503     while (s < PL_bufend && isSPACE(*s))
11504         s++;
11505     if (*s == '(')
11506         s++;
11507     while (s < PL_bufend && isSPACE(*s))
11508         s++;
11509     if (isIDFIRST_lazy_if(s,UTF)) {
11510         const char * const w = s++;
11511         while (isALNUM_lazy_if(s,UTF))
11512             s++;
11513         while (s < PL_bufend && isSPACE(*s))
11514             s++;
11515         if (*s == ',') {
11516             GV* gv;
11517             if (keyword(w, s - w, 0))
11518                 return;
11519
11520             gv = gv_fetchpvn_flags(w, s - w, 0, SVt_PVCV);
11521             if (gv && GvCVu(gv))
11522                 return;
11523             Perl_croak(aTHX_ "No comma allowed after %s", what);
11524         }
11525     }
11526 }
11527
11528 /* Either returns sv, or mortalizes sv and returns a new SV*.
11529    Best used as sv=new_constant(..., sv, ...).
11530    If s, pv are NULL, calls subroutine with one argument,
11531    and type is used with error messages only. */
11532
11533 STATIC SV *
11534 S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, STRLEN keylen,
11535                SV *sv, SV *pv, const char *type, STRLEN typelen)
11536 {
11537     dVAR; dSP;
11538     HV * const table = GvHV(PL_hintgv);          /* ^H */
11539     SV *res;
11540     SV **cvp;
11541     SV *cv, *typesv;
11542     const char *why1 = "", *why2 = "", *why3 = "";
11543
11544     PERL_ARGS_ASSERT_NEW_CONSTANT;
11545
11546     if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
11547         SV *msg;
11548         
11549         why2 = (const char *)
11550             (strEQ(key,"charnames")
11551              ? "(possibly a missing \"use charnames ...\")"
11552              : "");
11553         msg = Perl_newSVpvf(aTHX_ "Constant(%s) unknown: %s",
11554                             (type ? type: "undef"), why2);
11555
11556         /* This is convoluted and evil ("goto considered harmful")
11557          * but I do not understand the intricacies of all the different
11558          * failure modes of %^H in here.  The goal here is to make
11559          * the most probable error message user-friendly. --jhi */
11560
11561         goto msgdone;
11562
11563     report:
11564         msg = Perl_newSVpvf(aTHX_ "Constant(%s): %s%s%s",
11565                             (type ? type: "undef"), why1, why2, why3);
11566     msgdone:
11567         yyerror(SvPVX_const(msg));
11568         SvREFCNT_dec(msg);
11569         return sv;
11570     }
11571
11572     /* charnames doesn't work well if there have been errors found */
11573     if (PL_error_count > 0 && strEQ(key,"charnames"))
11574         return &PL_sv_undef;
11575
11576     cvp = hv_fetch(table, key, keylen, FALSE);
11577     if (!cvp || !SvOK(*cvp)) {
11578         why1 = "$^H{";
11579         why2 = key;
11580         why3 = "} is not defined";
11581         goto report;
11582     }
11583     sv_2mortal(sv);                     /* Parent created it permanently */
11584     cv = *cvp;
11585     if (!pv && s)
11586         pv = newSVpvn_flags(s, len, SVs_TEMP);
11587     if (type && pv)
11588         typesv = newSVpvn_flags(type, typelen, SVs_TEMP);
11589     else
11590         typesv = &PL_sv_undef;
11591
11592     PUSHSTACKi(PERLSI_OVERLOAD);
11593     ENTER ;
11594     SAVETMPS;
11595
11596     PUSHMARK(SP) ;
11597     EXTEND(sp, 3);
11598     if (pv)
11599         PUSHs(pv);
11600     PUSHs(sv);
11601     if (pv)
11602         PUSHs(typesv);
11603     PUTBACK;
11604     call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
11605
11606     SPAGAIN ;
11607
11608     /* Check the eval first */
11609     if (!PL_in_eval && SvTRUE(ERRSV)) {
11610         sv_catpvs(ERRSV, "Propagated");
11611         yyerror(SvPV_nolen_const(ERRSV)); /* Duplicates the message inside eval */
11612         (void)POPs;
11613         res = SvREFCNT_inc_simple(sv);
11614     }
11615     else {
11616         res = POPs;
11617         SvREFCNT_inc_simple_void(res);
11618     }
11619
11620     PUTBACK ;
11621     FREETMPS ;
11622     LEAVE ;
11623     POPSTACK;
11624
11625     if (!SvOK(res)) {
11626         why1 = "Call to &{$^H{";
11627         why2 = key;
11628         why3 = "}} did not return a defined value";
11629         sv = res;
11630         goto report;
11631     }
11632
11633     return res;
11634 }
11635
11636 /* Returns a NUL terminated string, with the length of the string written to
11637    *slp
11638    */
11639 STATIC char *
11640 S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
11641 {
11642     dVAR;
11643     register char *d = dest;
11644     register char * const e = d + destlen - 3;  /* two-character token, ending NUL */
11645
11646     PERL_ARGS_ASSERT_SCAN_WORD;
11647
11648     for (;;) {
11649         if (d >= e)
11650             Perl_croak(aTHX_ ident_too_long);
11651         if (isALNUM(*s))        /* UTF handled below */
11652             *d++ = *s++;
11653         else if (allow_package && (*s == '\'') && isIDFIRST_lazy_if(s+1,UTF)) {
11654             *d++ = ':';
11655             *d++ = ':';
11656             s++;
11657         }
11658         else if (allow_package && (s[0] == ':') && (s[1] == ':') && (s[2] != '$')) {
11659             *d++ = *s++;
11660             *d++ = *s++;
11661         }
11662         else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
11663             char *t = s + UTF8SKIP(s);
11664             size_t len;
11665             while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
11666                 t += UTF8SKIP(t);
11667             len = t - s;
11668             if (d + len > e)
11669                 Perl_croak(aTHX_ ident_too_long);
11670             Copy(s, d, len, char);
11671             d += len;
11672             s = t;
11673         }
11674         else {
11675             *d = '\0';
11676             *slp = d - dest;
11677             return s;
11678         }
11679     }
11680 }
11681
11682 STATIC char *
11683 S_scan_ident(pTHX_ register char *s, register const char *send, char *dest, STRLEN destlen, I32 ck_uni)
11684 {
11685     dVAR;
11686     char *bracket = NULL;
11687     char funny = *s++;
11688     register char *d = dest;
11689     register char * const e = d + destlen - 3;    /* two-character token, ending NUL */
11690
11691     PERL_ARGS_ASSERT_SCAN_IDENT;
11692
11693     if (isSPACE(*s))
11694         s = PEEKSPACE(s);
11695     if (isDIGIT(*s)) {
11696         while (isDIGIT(*s)) {
11697             if (d >= e)
11698                 Perl_croak(aTHX_ ident_too_long);
11699             *d++ = *s++;
11700         }
11701     }
11702     else {
11703         for (;;) {
11704             if (d >= e)
11705                 Perl_croak(aTHX_ ident_too_long);
11706             if (isALNUM(*s))    /* UTF handled below */
11707                 *d++ = *s++;
11708             else if (*s == '\'' && isIDFIRST_lazy_if(s+1,UTF)) {
11709                 *d++ = ':';
11710                 *d++ = ':';
11711                 s++;
11712             }
11713             else if (*s == ':' && s[1] == ':') {
11714                 *d++ = *s++;
11715                 *d++ = *s++;
11716             }
11717             else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
11718                 char *t = s + UTF8SKIP(s);
11719                 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
11720                     t += UTF8SKIP(t);
11721                 if (d + (t - s) > e)
11722                     Perl_croak(aTHX_ ident_too_long);
11723                 Copy(s, d, t - s, char);
11724                 d += t - s;
11725                 s = t;
11726             }
11727             else
11728                 break;
11729         }
11730     }
11731     *d = '\0';
11732     d = dest;
11733     if (*d) {
11734         if (PL_lex_state != LEX_NORMAL)
11735             PL_lex_state = LEX_INTERPENDMAYBE;
11736         return s;
11737     }
11738     if (*s == '$' && s[1] &&
11739         (isALNUM_lazy_if(s+1,UTF) || s[1] == '$' || s[1] == '{' || strnEQ(s+1,"::",2)) )
11740     {
11741         return s;
11742     }
11743     if (*s == '{') {
11744         bracket = s;
11745         s++;
11746     }
11747     else if (ck_uni)
11748         check_uni();
11749     if (s < send)
11750         *d = *s++;
11751     d[1] = '\0';
11752     if (*d == '^' && *s && isCONTROLVAR(*s)) {
11753         *d = toCTRL(*s);
11754         s++;
11755     }
11756     if (bracket) {
11757         if (isSPACE(s[-1])) {
11758             while (s < send) {
11759                 const char ch = *s++;
11760                 if (!SPACE_OR_TAB(ch)) {
11761                     *d = ch;
11762                     break;
11763                 }
11764             }
11765         }
11766         if (isIDFIRST_lazy_if(d,UTF)) {
11767             d++;
11768             if (UTF) {
11769                 char *end = s;
11770                 while ((end < send && isALNUM_lazy_if(end,UTF)) || *end == ':') {
11771                     end += UTF8SKIP(end);
11772                     while (end < send && UTF8_IS_CONTINUED(*end) && is_utf8_mark((U8*)end))
11773                         end += UTF8SKIP(end);
11774                 }
11775                 Copy(s, d, end - s, char);
11776                 d += end - s;
11777                 s = end;
11778             }
11779             else {
11780                 while ((isALNUM(*s) || *s == ':') && d < e)
11781                     *d++ = *s++;
11782                 if (d >= e)
11783                     Perl_croak(aTHX_ ident_too_long);
11784             }
11785             *d = '\0';
11786             while (s < send && SPACE_OR_TAB(*s))
11787                 s++;
11788             if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
11789                 if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest, 0)) {
11790                     const char * const brack =
11791                         (const char *)
11792                         ((*s == '[') ? "[...]" : "{...}");
11793                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
11794                         "Ambiguous use of %c{%s%s} resolved to %c%s%s",
11795                         funny, dest, brack, funny, dest, brack);
11796                 }
11797                 bracket++;
11798                 PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
11799                 return s;
11800             }
11801         }
11802         /* Handle extended ${^Foo} variables
11803          * 1999-02-27 mjd-perl-patch@plover.com */
11804         else if (!isALNUM(*d) && !isPRINT(*d) /* isCTRL(d) */
11805                  && isALNUM(*s))
11806         {
11807             d++;
11808             while (isALNUM(*s) && d < e) {
11809                 *d++ = *s++;
11810             }
11811             if (d >= e)
11812                 Perl_croak(aTHX_ ident_too_long);
11813             *d = '\0';
11814         }
11815         if (*s == '}') {
11816             s++;
11817             if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) {
11818                 PL_lex_state = LEX_INTERPEND;
11819                 PL_expect = XREF;
11820             }
11821             if (PL_lex_state == LEX_NORMAL) {
11822                 if (ckWARN(WARN_AMBIGUOUS) &&
11823                     (keyword(dest, d - dest, 0)
11824                      || get_cvn_flags(dest, d - dest, 0)))
11825                 {
11826                     if (funny == '#')
11827                         funny = '@';
11828                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
11829                         "Ambiguous use of %c{%s} resolved to %c%s",
11830                         funny, dest, funny, dest);
11831                 }
11832             }
11833         }
11834         else {
11835             s = bracket;                /* let the parser handle it */
11836             *dest = '\0';
11837         }
11838     }
11839     else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
11840         PL_lex_state = LEX_INTERPEND;
11841     return s;
11842 }
11843
11844 static U32
11845 S_pmflag(U32 pmfl, const char ch) {
11846     switch (ch) {
11847         CASE_STD_PMMOD_FLAGS_PARSE_SET(&pmfl);
11848     case GLOBAL_PAT_MOD:    pmfl |= PMf_GLOBAL; break;
11849     case CONTINUE_PAT_MOD:  pmfl |= PMf_CONTINUE; break;
11850     case ONCE_PAT_MOD:      pmfl |= PMf_KEEP; break;
11851     case KEEPCOPY_PAT_MOD:  pmfl |= PMf_KEEPCOPY; break;
11852     }
11853     return pmfl;
11854 }
11855
11856 void
11857 Perl_pmflag(pTHX_ U32* pmfl, int ch)
11858 {
11859     PERL_ARGS_ASSERT_PMFLAG;
11860
11861     Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
11862                      "Perl_pmflag() is deprecated, and will be removed from the XS API");
11863
11864     if (ch<256) {
11865         *pmfl = S_pmflag(*pmfl, (char)ch);
11866     }
11867 }
11868
11869 STATIC char *
11870 S_scan_pat(pTHX_ char *start, I32 type)
11871 {
11872     dVAR;
11873     PMOP *pm;
11874     char *s = scan_str(start,!!PL_madskills,FALSE);
11875     const char * const valid_flags =
11876         (const char *)((type == OP_QR) ? QR_PAT_MODS : M_PAT_MODS);
11877 #ifdef PERL_MAD
11878     char *modstart;
11879 #endif
11880
11881     PERL_ARGS_ASSERT_SCAN_PAT;
11882
11883     if (!s) {
11884         const char * const delimiter = skipspace(start);
11885         Perl_croak(aTHX_
11886                    (const char *)
11887                    (*delimiter == '?'
11888                     ? "Search pattern not terminated or ternary operator parsed as search pattern"
11889                     : "Search pattern not terminated" ));
11890     }
11891
11892     pm = (PMOP*)newPMOP(type, 0);
11893     if (PL_multi_open == '?') {
11894         /* This is the only point in the code that sets PMf_ONCE:  */
11895         pm->op_pmflags |= PMf_ONCE;
11896
11897         /* Hence it's safe to do this bit of PMOP book-keeping here, which
11898            allows us to restrict the list needed by reset to just the ??
11899            matches.  */
11900         assert(type != OP_TRANS);
11901         if (PL_curstash) {
11902             MAGIC *mg = mg_find((const SV *)PL_curstash, PERL_MAGIC_symtab);
11903             U32 elements;
11904             if (!mg) {
11905                 mg = sv_magicext(MUTABLE_SV(PL_curstash), 0, PERL_MAGIC_symtab, 0, 0,
11906                                  0);
11907             }
11908             elements = mg->mg_len / sizeof(PMOP**);
11909             Renewc(mg->mg_ptr, elements + 1, PMOP*, char);
11910             ((PMOP**)mg->mg_ptr) [elements++] = pm;
11911             mg->mg_len = elements * sizeof(PMOP**);
11912             PmopSTASH_set(pm,PL_curstash);
11913         }
11914     }
11915 #ifdef PERL_MAD
11916     modstart = s;
11917 #endif
11918     while (*s && strchr(valid_flags, *s))
11919         pm->op_pmflags = S_pmflag(pm->op_pmflags, *s++);
11920 #ifdef PERL_MAD
11921     if (PL_madskills && modstart != s) {
11922         SV* tmptoken = newSVpvn(modstart, s - modstart);
11923         append_madprops(newMADPROP('m', MAD_SV, tmptoken, 0), (OP*)pm, 0);
11924     }
11925 #endif
11926     /* issue a warning if /c is specified,but /g is not */
11927     if ((pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL))
11928     {
11929         Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), 
11930                        "Use of /c modifier is meaningless without /g" );
11931     }
11932
11933     PL_lex_op = (OP*)pm;
11934     pl_yylval.ival = OP_MATCH;
11935     return s;
11936 }
11937
11938 STATIC char *
11939 S_scan_subst(pTHX_ char *start)
11940 {
11941     dVAR;
11942     register char *s;
11943     register PMOP *pm;
11944     I32 first_start;
11945     I32 es = 0;
11946 #ifdef PERL_MAD
11947     char *modstart;
11948 #endif
11949
11950     PERL_ARGS_ASSERT_SCAN_SUBST;
11951
11952     pl_yylval.ival = OP_NULL;
11953
11954     s = scan_str(start,!!PL_madskills,FALSE);
11955
11956     if (!s)
11957         Perl_croak(aTHX_ "Substitution pattern not terminated");
11958
11959     if (s[-1] == PL_multi_open)
11960         s--;
11961 #ifdef PERL_MAD
11962     if (PL_madskills) {
11963         CURMAD('q', PL_thisopen);
11964         CURMAD('_', PL_thiswhite);
11965         CURMAD('E', PL_thisstuff);
11966         CURMAD('Q', PL_thisclose);
11967         PL_realtokenstart = s - SvPVX(PL_linestr);
11968     }
11969 #endif
11970
11971     first_start = PL_multi_start;
11972     s = scan_str(s,!!PL_madskills,FALSE);
11973     if (!s) {
11974         if (PL_lex_stuff) {
11975             SvREFCNT_dec(PL_lex_stuff);
11976             PL_lex_stuff = NULL;
11977         }
11978         Perl_croak(aTHX_ "Substitution replacement not terminated");
11979     }
11980     PL_multi_start = first_start;       /* so whole substitution is taken together */
11981
11982     pm = (PMOP*)newPMOP(OP_SUBST, 0);
11983
11984 #ifdef PERL_MAD
11985     if (PL_madskills) {
11986         CURMAD('z', PL_thisopen);
11987         CURMAD('R', PL_thisstuff);
11988         CURMAD('Z', PL_thisclose);
11989     }
11990     modstart = s;
11991 #endif
11992
11993     while (*s) {
11994         if (*s == EXEC_PAT_MOD) {
11995             s++;
11996             es++;
11997         }
11998         else if (strchr(S_PAT_MODS, *s))
11999             pm->op_pmflags = S_pmflag(pm->op_pmflags, *s++);
12000         else
12001             break;
12002     }
12003
12004 #ifdef PERL_MAD
12005     if (PL_madskills) {
12006         if (modstart != s)
12007             curmad('m', newSVpvn(modstart, s - modstart));
12008         append_madprops(PL_thismad, (OP*)pm, 0);
12009         PL_thismad = 0;
12010     }
12011 #endif
12012     if ((pm->op_pmflags & PMf_CONTINUE)) {
12013         Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), "Use of /c modifier is meaningless in s///" );
12014     }
12015
12016     if (es) {
12017         SV * const repl = newSVpvs("");
12018
12019         PL_sublex_info.super_bufptr = s;
12020         PL_sublex_info.super_bufend = PL_bufend;
12021         PL_multi_end = 0;
12022         pm->op_pmflags |= PMf_EVAL;
12023         while (es-- > 0) {
12024             if (es)
12025                 sv_catpvs(repl, "eval ");
12026             else
12027                 sv_catpvs(repl, "do ");
12028         }
12029         sv_catpvs(repl, "{");
12030         sv_catsv(repl, PL_lex_repl);
12031         if (strchr(SvPVX(PL_lex_repl), '#'))
12032             sv_catpvs(repl, "\n");
12033         sv_catpvs(repl, "}");
12034         SvEVALED_on(repl);
12035         SvREFCNT_dec(PL_lex_repl);
12036         PL_lex_repl = repl;
12037     }
12038
12039     PL_lex_op = (OP*)pm;
12040     pl_yylval.ival = OP_SUBST;
12041     return s;
12042 }
12043
12044 STATIC char *
12045 S_scan_trans(pTHX_ char *start)
12046 {
12047     dVAR;
12048     register char* s;
12049     OP *o;
12050     short *tbl;
12051     U8 squash;
12052     U8 del;
12053     U8 complement;
12054 #ifdef PERL_MAD
12055     char *modstart;
12056 #endif
12057
12058     PERL_ARGS_ASSERT_SCAN_TRANS;
12059
12060     pl_yylval.ival = OP_NULL;
12061
12062     s = scan_str(start,!!PL_madskills,FALSE);
12063     if (!s)
12064         Perl_croak(aTHX_ "Transliteration pattern not terminated");
12065
12066     if (s[-1] == PL_multi_open)
12067         s--;
12068 #ifdef PERL_MAD
12069     if (PL_madskills) {
12070         CURMAD('q', PL_thisopen);
12071         CURMAD('_', PL_thiswhite);
12072         CURMAD('E', PL_thisstuff);
12073         CURMAD('Q', PL_thisclose);
12074         PL_realtokenstart = s - SvPVX(PL_linestr);
12075     }
12076 #endif
12077
12078     s = scan_str(s,!!PL_madskills,FALSE);
12079     if (!s) {
12080         if (PL_lex_stuff) {
12081             SvREFCNT_dec(PL_lex_stuff);
12082             PL_lex_stuff = NULL;
12083         }
12084         Perl_croak(aTHX_ "Transliteration replacement not terminated");
12085     }
12086     if (PL_madskills) {
12087         CURMAD('z', PL_thisopen);
12088         CURMAD('R', PL_thisstuff);
12089         CURMAD('Z', PL_thisclose);
12090     }
12091
12092     complement = del = squash = 0;
12093 #ifdef PERL_MAD
12094     modstart = s;
12095 #endif
12096     while (1) {
12097         switch (*s) {
12098         case 'c':
12099             complement = OPpTRANS_COMPLEMENT;
12100             break;
12101         case 'd':
12102             del = OPpTRANS_DELETE;
12103             break;
12104         case 's':
12105             squash = OPpTRANS_SQUASH;
12106             break;
12107         default:
12108             goto no_more;
12109         }
12110         s++;
12111     }
12112   no_more:
12113
12114     tbl = (short *)PerlMemShared_calloc(complement&&!del?258:256, sizeof(short));
12115     o = newPVOP(OP_TRANS, 0, (char*)tbl);
12116     o->op_private &= ~OPpTRANS_ALL;
12117     o->op_private |= del|squash|complement|
12118       (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
12119       (DO_UTF8(PL_lex_repl) ? OPpTRANS_TO_UTF   : 0);
12120
12121     PL_lex_op = o;
12122     pl_yylval.ival = OP_TRANS;
12123
12124 #ifdef PERL_MAD
12125     if (PL_madskills) {
12126         if (modstart != s)
12127             curmad('m', newSVpvn(modstart, s - modstart));
12128         append_madprops(PL_thismad, o, 0);
12129         PL_thismad = 0;
12130     }
12131 #endif
12132
12133     return s;
12134 }
12135
12136 STATIC char *
12137 S_scan_heredoc(pTHX_ register char *s)
12138 {
12139     dVAR;
12140     SV *herewas;
12141     I32 op_type = OP_SCALAR;
12142     I32 len;
12143     SV *tmpstr;
12144     char term;
12145     const char *found_newline;
12146     register char *d;
12147     register char *e;
12148     char *peek;
12149     const int outer = (PL_rsfp && !(PL_lex_inwhat == OP_SCALAR));
12150 #ifdef PERL_MAD
12151     I32 stuffstart = s - SvPVX(PL_linestr);
12152     char *tstart;
12153  
12154     PL_realtokenstart = -1;
12155 #endif
12156
12157     PERL_ARGS_ASSERT_SCAN_HEREDOC;
12158
12159     s += 2;
12160     d = PL_tokenbuf;
12161     e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
12162     if (!outer)
12163         *d++ = '\n';
12164     peek = s;
12165     while (SPACE_OR_TAB(*peek))
12166         peek++;
12167     if (*peek == '`' || *peek == '\'' || *peek =='"') {
12168         s = peek;
12169         term = *s++;
12170         s = delimcpy(d, e, s, PL_bufend, term, &len);
12171         d += len;
12172         if (s < PL_bufend)
12173             s++;
12174     }
12175     else {
12176         if (*s == '\\')
12177             s++, term = '\'';
12178         else
12179             term = '"';
12180         if (!isALNUM_lazy_if(s,UTF))
12181             deprecate("bare << to mean <<\"\"");
12182         for (; isALNUM_lazy_if(s,UTF); s++) {
12183             if (d < e)
12184                 *d++ = *s;
12185         }
12186     }
12187     if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
12188         Perl_croak(aTHX_ "Delimiter for here document is too long");
12189     *d++ = '\n';
12190     *d = '\0';
12191     len = d - PL_tokenbuf;
12192
12193 #ifdef PERL_MAD
12194     if (PL_madskills) {
12195         tstart = PL_tokenbuf + !outer;
12196         PL_thisclose = newSVpvn(tstart, len - !outer);
12197         tstart = SvPVX(PL_linestr) + stuffstart;
12198         PL_thisopen = newSVpvn(tstart, s - tstart);
12199         stuffstart = s - SvPVX(PL_linestr);
12200     }
12201 #endif
12202 #ifndef PERL_STRICT_CR
12203     d = strchr(s, '\r');
12204     if (d) {
12205         char * const olds = s;
12206         s = d;
12207         while (s < PL_bufend) {
12208             if (*s == '\r') {
12209                 *d++ = '\n';
12210                 if (*++s == '\n')
12211                     s++;
12212             }
12213             else if (*s == '\n' && s[1] == '\r') {      /* \015\013 on a mac? */
12214                 *d++ = *s++;
12215                 s++;
12216             }
12217             else
12218                 *d++ = *s++;
12219         }
12220         *d = '\0';
12221         PL_bufend = d;
12222         SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
12223         s = olds;
12224     }
12225 #endif
12226 #ifdef PERL_MAD
12227     found_newline = 0;
12228 #endif
12229     if ( outer || !(found_newline = (char*)memchr((void*)s, '\n', PL_bufend - s)) ) {
12230         herewas = newSVpvn(s,PL_bufend-s);
12231     }
12232     else {
12233 #ifdef PERL_MAD
12234         herewas = newSVpvn(s-1,found_newline-s+1);
12235 #else
12236         s--;
12237         herewas = newSVpvn(s,found_newline-s);
12238 #endif
12239     }
12240 #ifdef PERL_MAD
12241     if (PL_madskills) {
12242         tstart = SvPVX(PL_linestr) + stuffstart;
12243         if (PL_thisstuff)
12244             sv_catpvn(PL_thisstuff, tstart, s - tstart);
12245         else
12246             PL_thisstuff = newSVpvn(tstart, s - tstart);
12247     }
12248 #endif
12249     s += SvCUR(herewas);
12250
12251 #ifdef PERL_MAD
12252     stuffstart = s - SvPVX(PL_linestr);
12253
12254     if (found_newline)
12255         s--;
12256 #endif
12257
12258     tmpstr = newSV_type(SVt_PVIV);
12259     SvGROW(tmpstr, 80);
12260     if (term == '\'') {
12261         op_type = OP_CONST;
12262         SvIV_set(tmpstr, -1);
12263     }
12264     else if (term == '`') {
12265         op_type = OP_BACKTICK;
12266         SvIV_set(tmpstr, '\\');
12267     }
12268
12269     CLINE;
12270     PL_multi_start = CopLINE(PL_curcop);
12271     PL_multi_open = PL_multi_close = '<';
12272     term = *PL_tokenbuf;
12273     if (PL_lex_inwhat == OP_SUBST && PL_in_eval && !PL_rsfp) {
12274         char * const bufptr = PL_sublex_info.super_bufptr;
12275         char * const bufend = PL_sublex_info.super_bufend;
12276         char * const olds = s - SvCUR(herewas);
12277         s = strchr(bufptr, '\n');
12278         if (!s)
12279             s = bufend;
12280         d = s;
12281         while (s < bufend &&
12282           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
12283             if (*s++ == '\n')
12284                 CopLINE_inc(PL_curcop);
12285         }
12286         if (s >= bufend) {
12287             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
12288             missingterm(PL_tokenbuf);
12289         }
12290         sv_setpvn(herewas,bufptr,d-bufptr+1);
12291         sv_setpvn(tmpstr,d+1,s-d);
12292         s += len - 1;
12293         sv_catpvn(herewas,s,bufend-s);
12294         Copy(SvPVX_const(herewas),bufptr,SvCUR(herewas) + 1,char);
12295
12296         s = olds;
12297         goto retval;
12298     }
12299     else if (!outer) {
12300         d = s;
12301         while (s < PL_bufend &&
12302           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
12303             if (*s++ == '\n')
12304                 CopLINE_inc(PL_curcop);
12305         }
12306         if (s >= PL_bufend) {
12307             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
12308             missingterm(PL_tokenbuf);
12309         }
12310         sv_setpvn(tmpstr,d+1,s-d);
12311 #ifdef PERL_MAD
12312         if (PL_madskills) {
12313             if (PL_thisstuff)
12314                 sv_catpvn(PL_thisstuff, d + 1, s - d);
12315             else
12316                 PL_thisstuff = newSVpvn(d + 1, s - d);
12317             stuffstart = s - SvPVX(PL_linestr);
12318         }
12319 #endif
12320         s += len - 1;
12321         CopLINE_inc(PL_curcop); /* the preceding stmt passes a newline */
12322
12323         sv_catpvn(herewas,s,PL_bufend-s);
12324         sv_setsv(PL_linestr,herewas);
12325         PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
12326         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
12327         PL_last_lop = PL_last_uni = NULL;
12328     }
12329     else
12330         sv_setpvs(tmpstr,"");   /* avoid "uninitialized" warning */
12331     while (s >= PL_bufend) {    /* multiple line string? */
12332 #ifdef PERL_MAD
12333         if (PL_madskills) {
12334             tstart = SvPVX(PL_linestr) + stuffstart;
12335             if (PL_thisstuff)
12336                 sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
12337             else
12338                 PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
12339         }
12340 #endif
12341         PL_bufptr = s;
12342         CopLINE_inc(PL_curcop);
12343         if (!outer || !lex_next_chunk(0)) {
12344             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
12345             missingterm(PL_tokenbuf);
12346         }
12347         CopLINE_dec(PL_curcop);
12348         s = PL_bufptr;
12349 #ifdef PERL_MAD
12350         stuffstart = s - SvPVX(PL_linestr);
12351 #endif
12352         CopLINE_inc(PL_curcop);
12353         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
12354         PL_last_lop = PL_last_uni = NULL;
12355 #ifndef PERL_STRICT_CR
12356         if (PL_bufend - PL_linestart >= 2) {
12357             if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
12358                 (PL_bufend[-2] == '\n' && PL_bufend[-1] == '\r'))
12359             {
12360                 PL_bufend[-2] = '\n';
12361                 PL_bufend--;
12362                 SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
12363             }
12364             else if (PL_bufend[-1] == '\r')
12365                 PL_bufend[-1] = '\n';
12366         }
12367         else if (PL_bufend - PL_linestart == 1 && PL_bufend[-1] == '\r')
12368             PL_bufend[-1] = '\n';
12369 #endif
12370         if (*s == term && memEQ(s,PL_tokenbuf,len)) {
12371             STRLEN off = PL_bufend - 1 - SvPVX_const(PL_linestr);
12372             *(SvPVX(PL_linestr) + off ) = ' ';
12373             sv_catsv(PL_linestr,herewas);
12374             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
12375             s = SvPVX(PL_linestr) + off; /* In case PV of PL_linestr moved. */
12376         }
12377         else {
12378             s = PL_bufend;
12379             sv_catsv(tmpstr,PL_linestr);
12380         }
12381     }
12382     s++;
12383 retval:
12384     PL_multi_end = CopLINE(PL_curcop);
12385     if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
12386         SvPV_shrink_to_cur(tmpstr);
12387     }
12388     SvREFCNT_dec(herewas);
12389     if (!IN_BYTES) {
12390         if (UTF && is_utf8_string((U8*)SvPVX_const(tmpstr), SvCUR(tmpstr)))
12391             SvUTF8_on(tmpstr);
12392         else if (PL_encoding)
12393             sv_recode_to_utf8(tmpstr, PL_encoding);
12394     }
12395     PL_lex_stuff = tmpstr;
12396     pl_yylval.ival = op_type;
12397     return s;
12398 }
12399
12400 /* scan_inputsymbol
12401    takes: current position in input buffer
12402    returns: new position in input buffer
12403    side-effects: pl_yylval and lex_op are set.
12404
12405    This code handles:
12406
12407    <>           read from ARGV
12408    <FH>         read from filehandle
12409    <pkg::FH>    read from package qualified filehandle
12410    <pkg'FH>     read from package qualified filehandle
12411    <$fh>        read from filehandle in $fh
12412    <*.h>        filename glob
12413
12414 */
12415
12416 STATIC char *
12417 S_scan_inputsymbol(pTHX_ char *start)
12418 {
12419     dVAR;
12420     register char *s = start;           /* current position in buffer */
12421     char *end;
12422     I32 len;
12423     char *d = PL_tokenbuf;                                      /* start of temp holding space */
12424     const char * const e = PL_tokenbuf + sizeof PL_tokenbuf;    /* end of temp holding space */
12425
12426     PERL_ARGS_ASSERT_SCAN_INPUTSYMBOL;
12427
12428     end = strchr(s, '\n');
12429     if (!end)
12430         end = PL_bufend;
12431     s = delimcpy(d, e, s + 1, end, '>', &len);  /* extract until > */
12432
12433     /* die if we didn't have space for the contents of the <>,
12434        or if it didn't end, or if we see a newline
12435     */
12436
12437     if (len >= (I32)sizeof PL_tokenbuf)
12438         Perl_croak(aTHX_ "Excessively long <> operator");
12439     if (s >= end)
12440         Perl_croak(aTHX_ "Unterminated <> operator");
12441
12442     s++;
12443
12444     /* check for <$fh>
12445        Remember, only scalar variables are interpreted as filehandles by
12446        this code.  Anything more complex (e.g., <$fh{$num}>) will be
12447        treated as a glob() call.
12448        This code makes use of the fact that except for the $ at the front,
12449        a scalar variable and a filehandle look the same.
12450     */
12451     if (*d == '$' && d[1]) d++;
12452
12453     /* allow <Pkg'VALUE> or <Pkg::VALUE> */
12454     while (*d && (isALNUM_lazy_if(d,UTF) || *d == '\'' || *d == ':'))
12455         d++;
12456
12457     /* If we've tried to read what we allow filehandles to look like, and
12458        there's still text left, then it must be a glob() and not a getline.
12459        Use scan_str to pull out the stuff between the <> and treat it
12460        as nothing more than a string.
12461     */
12462
12463     if (d - PL_tokenbuf != len) {
12464         pl_yylval.ival = OP_GLOB;
12465         s = scan_str(start,!!PL_madskills,FALSE);
12466         if (!s)
12467            Perl_croak(aTHX_ "Glob not terminated");
12468         return s;
12469     }
12470     else {
12471         bool readline_overriden = FALSE;
12472         GV *gv_readline;
12473         GV **gvp;
12474         /* we're in a filehandle read situation */
12475         d = PL_tokenbuf;
12476
12477         /* turn <> into <ARGV> */
12478         if (!len)
12479             Copy("ARGV",d,5,char);
12480
12481         /* Check whether readline() is overriden */
12482         gv_readline = gv_fetchpvs("readline", GV_NOTQUAL, SVt_PVCV);
12483         if ((gv_readline
12484                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline))
12485                 ||
12486                 ((gvp = (GV**)hv_fetchs(PL_globalstash, "readline", FALSE))
12487                  && (gv_readline = *gvp) && isGV_with_GP(gv_readline)
12488                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline)))
12489             readline_overriden = TRUE;
12490
12491         /* if <$fh>, create the ops to turn the variable into a
12492            filehandle
12493         */
12494         if (*d == '$') {
12495             /* try to find it in the pad for this block, otherwise find
12496                add symbol table ops
12497             */
12498             const PADOFFSET tmp = pad_findmy(d, len, 0);
12499             if (tmp != NOT_IN_PAD) {
12500                 if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
12501                     HV * const stash = PAD_COMPNAME_OURSTASH(tmp);
12502                     HEK * const stashname = HvNAME_HEK(stash);
12503                     SV * const sym = sv_2mortal(newSVhek(stashname));
12504                     sv_catpvs(sym, "::");
12505                     sv_catpv(sym, d+1);
12506                     d = SvPVX(sym);
12507                     goto intro_sym;
12508                 }
12509                 else {
12510                     OP * const o = newOP(OP_PADSV, 0);
12511                     o->op_targ = tmp;
12512                     PL_lex_op = readline_overriden
12513                         ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
12514                                 append_elem(OP_LIST, o,
12515                                     newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
12516                         : (OP*)newUNOP(OP_READLINE, 0, o);
12517                 }
12518             }
12519             else {
12520                 GV *gv;
12521                 ++d;
12522 intro_sym:
12523                 gv = gv_fetchpv(d,
12524                                 (PL_in_eval
12525                                  ? (GV_ADDMULTI | GV_ADDINEVAL)
12526                                  : GV_ADDMULTI),
12527                                 SVt_PV);
12528                 PL_lex_op = readline_overriden
12529                     ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
12530                             append_elem(OP_LIST,
12531                                 newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
12532                                 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
12533                     : (OP*)newUNOP(OP_READLINE, 0,
12534                             newUNOP(OP_RV2SV, 0,
12535                                 newGVOP(OP_GV, 0, gv)));
12536             }
12537             if (!readline_overriden)
12538                 PL_lex_op->op_flags |= OPf_SPECIAL;
12539             /* we created the ops in PL_lex_op, so make pl_yylval.ival a null op */
12540             pl_yylval.ival = OP_NULL;
12541         }
12542
12543         /* If it's none of the above, it must be a literal filehandle
12544            (<Foo::BAR> or <FOO>) so build a simple readline OP */
12545         else {
12546             GV * const gv = gv_fetchpv(d, GV_ADD, SVt_PVIO);
12547             PL_lex_op = readline_overriden
12548                 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
12549                         append_elem(OP_LIST,
12550                             newGVOP(OP_GV, 0, gv),
12551                             newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
12552                 : (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
12553             pl_yylval.ival = OP_NULL;
12554         }
12555     }
12556
12557     return s;
12558 }
12559
12560
12561 /* scan_str
12562    takes: start position in buffer
12563           keep_quoted preserve \ on the embedded delimiter(s)
12564           keep_delims preserve the delimiters around the string
12565    returns: position to continue reading from buffer
12566    side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
12567         updates the read buffer.
12568
12569    This subroutine pulls a string out of the input.  It is called for:
12570         q               single quotes           q(literal text)
12571         '               single quotes           'literal text'
12572         qq              double quotes           qq(interpolate $here please)
12573         "               double quotes           "interpolate $here please"
12574         qx              backticks               qx(/bin/ls -l)
12575         `               backticks               `/bin/ls -l`
12576         qw              quote words             @EXPORT_OK = qw( func() $spam )
12577         m//             regexp match            m/this/
12578         s///            regexp substitute       s/this/that/
12579         tr///           string transliterate    tr/this/that/
12580         y///            string transliterate    y/this/that/
12581         ($*@)           sub prototypes          sub foo ($)
12582         (stuff)         sub attr parameters     sub foo : attr(stuff)
12583         <>              readline or globs       <FOO>, <>, <$fh>, or <*.c>
12584         
12585    In most of these cases (all but <>, patterns and transliterate)
12586    yylex() calls scan_str().  m// makes yylex() call scan_pat() which
12587    calls scan_str().  s/// makes yylex() call scan_subst() which calls
12588    scan_str().  tr/// and y/// make yylex() call scan_trans() which
12589    calls scan_str().
12590
12591    It skips whitespace before the string starts, and treats the first
12592    character as the delimiter.  If the delimiter is one of ([{< then
12593    the corresponding "close" character )]}> is used as the closing
12594    delimiter.  It allows quoting of delimiters, and if the string has
12595    balanced delimiters ([{<>}]) it allows nesting.
12596
12597    On success, the SV with the resulting string is put into lex_stuff or,
12598    if that is already non-NULL, into lex_repl. The second case occurs only
12599    when parsing the RHS of the special constructs s/// and tr/// (y///).
12600    For convenience, the terminating delimiter character is stuffed into
12601    SvIVX of the SV.
12602 */
12603
12604 STATIC char *
12605 S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
12606 {
12607     dVAR;
12608     SV *sv;                             /* scalar value: string */
12609     const char *tmps;                   /* temp string, used for delimiter matching */
12610     register char *s = start;           /* current position in the buffer */
12611     register char term;                 /* terminating character */
12612     register char *to;                  /* current position in the sv's data */
12613     I32 brackets = 1;                   /* bracket nesting level */
12614     bool has_utf8 = FALSE;              /* is there any utf8 content? */
12615     I32 termcode;                       /* terminating char. code */
12616     U8 termstr[UTF8_MAXBYTES];          /* terminating string */
12617     STRLEN termlen;                     /* length of terminating string */
12618     int last_off = 0;                   /* last position for nesting bracket */
12619 #ifdef PERL_MAD
12620     int stuffstart;
12621     char *tstart;
12622 #endif
12623
12624     PERL_ARGS_ASSERT_SCAN_STR;
12625
12626     /* skip space before the delimiter */
12627     if (isSPACE(*s)) {
12628         s = PEEKSPACE(s);
12629     }
12630
12631 #ifdef PERL_MAD
12632     if (PL_realtokenstart >= 0) {
12633         stuffstart = PL_realtokenstart;
12634         PL_realtokenstart = -1;
12635     }
12636     else
12637         stuffstart = start - SvPVX(PL_linestr);
12638 #endif
12639     /* mark where we are, in case we need to report errors */
12640     CLINE;
12641
12642     /* after skipping whitespace, the next character is the terminator */
12643     term = *s;
12644     if (!UTF) {
12645         termcode = termstr[0] = term;
12646         termlen = 1;
12647     }
12648     else {
12649         termcode = utf8_to_uvchr((U8*)s, &termlen);
12650         Copy(s, termstr, termlen, U8);
12651         if (!UTF8_IS_INVARIANT(term))
12652             has_utf8 = TRUE;
12653     }
12654
12655     /* mark where we are */
12656     PL_multi_start = CopLINE(PL_curcop);
12657     PL_multi_open = term;
12658
12659     /* find corresponding closing delimiter */
12660     if (term && (tmps = strchr("([{< )]}> )]}>",term)))
12661         termcode = termstr[0] = term = tmps[5];
12662
12663     PL_multi_close = term;
12664
12665     /* create a new SV to hold the contents.  79 is the SV's initial length.
12666        What a random number. */
12667     sv = newSV_type(SVt_PVIV);
12668     SvGROW(sv, 80);
12669     SvIV_set(sv, termcode);
12670     (void)SvPOK_only(sv);               /* validate pointer */
12671
12672     /* move past delimiter and try to read a complete string */
12673     if (keep_delims)
12674         sv_catpvn(sv, s, termlen);
12675     s += termlen;
12676 #ifdef PERL_MAD
12677     tstart = SvPVX(PL_linestr) + stuffstart;
12678     if (!PL_thisopen && !keep_delims) {
12679         PL_thisopen = newSVpvn(tstart, s - tstart);
12680         stuffstart = s - SvPVX(PL_linestr);
12681     }
12682 #endif
12683     for (;;) {
12684         if (PL_encoding && !UTF) {
12685             bool cont = TRUE;
12686
12687             while (cont) {
12688                 int offset = s - SvPVX_const(PL_linestr);
12689                 const bool found = sv_cat_decode(sv, PL_encoding, PL_linestr,
12690                                            &offset, (char*)termstr, termlen);
12691                 const char * const ns = SvPVX_const(PL_linestr) + offset;
12692                 char * const svlast = SvEND(sv) - 1;
12693
12694                 for (; s < ns; s++) {
12695                     if (*s == '\n' && !PL_rsfp)
12696                         CopLINE_inc(PL_curcop);
12697                 }
12698                 if (!found)
12699                     goto read_more_line;
12700                 else {
12701                     /* handle quoted delimiters */
12702                     if (SvCUR(sv) > 1 && *(svlast-1) == '\\') {
12703                         const char *t;
12704                         for (t = svlast-2; t >= SvPVX_const(sv) && *t == '\\';)
12705                             t--;
12706                         if ((svlast-1 - t) % 2) {
12707                             if (!keep_quoted) {
12708                                 *(svlast-1) = term;
12709                                 *svlast = '\0';
12710                                 SvCUR_set(sv, SvCUR(sv) - 1);
12711                             }
12712                             continue;
12713                         }
12714                     }
12715                     if (PL_multi_open == PL_multi_close) {
12716                         cont = FALSE;
12717                     }
12718                     else {
12719                         const char *t;
12720                         char *w;
12721                         for (t = w = SvPVX(sv)+last_off; t < svlast; w++, t++) {
12722                             /* At here, all closes are "was quoted" one,
12723                                so we don't check PL_multi_close. */
12724                             if (*t == '\\') {
12725                                 if (!keep_quoted && *(t+1) == PL_multi_open)
12726                                     t++;
12727                                 else
12728                                     *w++ = *t++;
12729                             }
12730                             else if (*t == PL_multi_open)
12731                                 brackets++;
12732
12733                             *w = *t;
12734                         }
12735                         if (w < t) {
12736                             *w++ = term;
12737                             *w = '\0';
12738                             SvCUR_set(sv, w - SvPVX_const(sv));
12739                         }
12740                         last_off = w - SvPVX(sv);
12741                         if (--brackets <= 0)
12742                             cont = FALSE;
12743                     }
12744                 }
12745             }
12746             if (!keep_delims) {
12747                 SvCUR_set(sv, SvCUR(sv) - 1);
12748                 *SvEND(sv) = '\0';
12749             }
12750             break;
12751         }
12752
12753         /* extend sv if need be */
12754         SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
12755         /* set 'to' to the next character in the sv's string */
12756         to = SvPVX(sv)+SvCUR(sv);
12757
12758         /* if open delimiter is the close delimiter read unbridle */
12759         if (PL_multi_open == PL_multi_close) {
12760             for (; s < PL_bufend; s++,to++) {
12761                 /* embedded newlines increment the current line number */
12762                 if (*s == '\n' && !PL_rsfp)
12763                     CopLINE_inc(PL_curcop);
12764                 /* handle quoted delimiters */
12765                 if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
12766                     if (!keep_quoted && s[1] == term)
12767                         s++;
12768                 /* any other quotes are simply copied straight through */
12769                     else
12770                         *to++ = *s++;
12771                 }
12772                 /* terminate when run out of buffer (the for() condition), or
12773                    have found the terminator */
12774                 else if (*s == term) {
12775                     if (termlen == 1)
12776                         break;
12777                     if (s+termlen <= PL_bufend && memEQ(s, (char*)termstr, termlen))
12778                         break;
12779                 }
12780                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
12781                     has_utf8 = TRUE;
12782                 *to = *s;
12783             }
12784         }
12785         
12786         /* if the terminator isn't the same as the start character (e.g.,
12787            matched brackets), we have to allow more in the quoting, and
12788            be prepared for nested brackets.
12789         */
12790         else {
12791             /* read until we run out of string, or we find the terminator */
12792             for (; s < PL_bufend; s++,to++) {
12793                 /* embedded newlines increment the line count */
12794                 if (*s == '\n' && !PL_rsfp)
12795                     CopLINE_inc(PL_curcop);
12796                 /* backslashes can escape the open or closing characters */
12797                 if (*s == '\\' && s+1 < PL_bufend) {
12798                     if (!keep_quoted &&
12799                         ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
12800                         s++;
12801                     else
12802                         *to++ = *s++;
12803                 }
12804                 /* allow nested opens and closes */
12805                 else if (*s == PL_multi_close && --brackets <= 0)
12806                     break;
12807                 else if (*s == PL_multi_open)
12808                     brackets++;
12809                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
12810                     has_utf8 = TRUE;
12811                 *to = *s;
12812             }
12813         }
12814         /* terminate the copied string and update the sv's end-of-string */
12815         *to = '\0';
12816         SvCUR_set(sv, to - SvPVX_const(sv));
12817
12818         /*
12819          * this next chunk reads more into the buffer if we're not done yet
12820          */
12821
12822         if (s < PL_bufend)
12823             break;              /* handle case where we are done yet :-) */
12824
12825 #ifndef PERL_STRICT_CR
12826         if (to - SvPVX_const(sv) >= 2) {
12827             if ((to[-2] == '\r' && to[-1] == '\n') ||
12828                 (to[-2] == '\n' && to[-1] == '\r'))
12829             {
12830                 to[-2] = '\n';
12831                 to--;
12832                 SvCUR_set(sv, to - SvPVX_const(sv));
12833             }
12834             else if (to[-1] == '\r')
12835                 to[-1] = '\n';
12836         }
12837         else if (to - SvPVX_const(sv) == 1 && to[-1] == '\r')
12838             to[-1] = '\n';
12839 #endif
12840         
12841      read_more_line:
12842         /* if we're out of file, or a read fails, bail and reset the current
12843            line marker so we can report where the unterminated string began
12844         */
12845 #ifdef PERL_MAD
12846         if (PL_madskills) {
12847             char * const tstart = SvPVX(PL_linestr) + stuffstart;
12848             if (PL_thisstuff)
12849                 sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
12850             else
12851                 PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
12852         }
12853 #endif
12854         CopLINE_inc(PL_curcop);
12855         PL_bufptr = PL_bufend;
12856         if (!lex_next_chunk(0)) {
12857             sv_free(sv);
12858             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
12859             return NULL;
12860         }
12861         s = PL_bufptr;
12862 #ifdef PERL_MAD
12863         stuffstart = 0;
12864 #endif
12865     }
12866
12867     /* at this point, we have successfully read the delimited string */
12868
12869     if (!PL_encoding || UTF) {
12870 #ifdef PERL_MAD
12871         if (PL_madskills) {
12872             char * const tstart = SvPVX(PL_linestr) + stuffstart;
12873             const int len = s - tstart;
12874             if (PL_thisstuff)
12875                 sv_catpvn(PL_thisstuff, tstart, len);
12876             else
12877                 PL_thisstuff = newSVpvn(tstart, len);
12878             if (!PL_thisclose && !keep_delims)
12879                 PL_thisclose = newSVpvn(s,termlen);
12880         }
12881 #endif
12882
12883         if (keep_delims)
12884             sv_catpvn(sv, s, termlen);
12885         s += termlen;
12886     }
12887 #ifdef PERL_MAD
12888     else {
12889         if (PL_madskills) {
12890             char * const tstart = SvPVX(PL_linestr) + stuffstart;
12891             const int len = s - tstart - termlen;
12892             if (PL_thisstuff)
12893                 sv_catpvn(PL_thisstuff, tstart, len);
12894             else
12895                 PL_thisstuff = newSVpvn(tstart, len);
12896             if (!PL_thisclose && !keep_delims)
12897                 PL_thisclose = newSVpvn(s - termlen,termlen);
12898         }
12899     }
12900 #endif
12901     if (has_utf8 || PL_encoding)
12902         SvUTF8_on(sv);
12903
12904     PL_multi_end = CopLINE(PL_curcop);
12905
12906     /* if we allocated too much space, give some back */
12907     if (SvCUR(sv) + 5 < SvLEN(sv)) {
12908         SvLEN_set(sv, SvCUR(sv) + 1);
12909         SvPV_renew(sv, SvLEN(sv));
12910     }
12911
12912     /* decide whether this is the first or second quoted string we've read
12913        for this op
12914     */
12915
12916     if (PL_lex_stuff)
12917         PL_lex_repl = sv;
12918     else
12919         PL_lex_stuff = sv;
12920     return s;
12921 }
12922
12923 /*
12924   scan_num
12925   takes: pointer to position in buffer
12926   returns: pointer to new position in buffer
12927   side-effects: builds ops for the constant in pl_yylval.op
12928
12929   Read a number in any of the formats that Perl accepts:
12930
12931   \d(_?\d)*(\.(\d(_?\d)*)?)?[Ee][\+\-]?(\d(_?\d)*)      12 12.34 12.
12932   \.\d(_?\d)*[Ee][\+\-]?(\d(_?\d)*)                     .34
12933   0b[01](_?[01])*
12934   0[0-7](_?[0-7])*
12935   0x[0-9A-Fa-f](_?[0-9A-Fa-f])*
12936
12937   Like most scan_ routines, it uses the PL_tokenbuf buffer to hold the
12938   thing it reads.
12939
12940   If it reads a number without a decimal point or an exponent, it will
12941   try converting the number to an integer and see if it can do so
12942   without loss of precision.
12943 */
12944
12945 char *
12946 Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
12947 {
12948     dVAR;
12949     register const char *s = start;     /* current position in buffer */
12950     register char *d;                   /* destination in temp buffer */
12951     register char *e;                   /* end of temp buffer */
12952     NV nv;                              /* number read, as a double */
12953     SV *sv = NULL;                      /* place to put the converted number */
12954     bool floatit;                       /* boolean: int or float? */
12955     const char *lastub = NULL;          /* position of last underbar */
12956     static char const number_too_long[] = "Number too long";
12957
12958     PERL_ARGS_ASSERT_SCAN_NUM;
12959
12960     /* We use the first character to decide what type of number this is */
12961
12962     switch (*s) {
12963     default:
12964       Perl_croak(aTHX_ "panic: scan_num");
12965
12966     /* if it starts with a 0, it could be an octal number, a decimal in
12967        0.13 disguise, or a hexadecimal number, or a binary number. */
12968     case '0':
12969         {
12970           /* variables:
12971              u          holds the "number so far"
12972              shift      the power of 2 of the base
12973                         (hex == 4, octal == 3, binary == 1)
12974              overflowed was the number more than we can hold?
12975
12976              Shift is used when we add a digit.  It also serves as an "are
12977              we in octal/hex/binary?" indicator to disallow hex characters
12978              when in octal mode.
12979            */
12980             NV n = 0.0;
12981             UV u = 0;
12982             I32 shift;
12983             bool overflowed = FALSE;
12984             bool just_zero  = TRUE;     /* just plain 0 or binary number? */
12985             static const NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
12986             static const char* const bases[5] =
12987               { "", "binary", "", "octal", "hexadecimal" };
12988             static const char* const Bases[5] =
12989               { "", "Binary", "", "Octal", "Hexadecimal" };
12990             static const char* const maxima[5] =
12991               { "",
12992                 "0b11111111111111111111111111111111",
12993                 "",
12994                 "037777777777",
12995                 "0xffffffff" };
12996             const char *base, *Base, *max;
12997
12998             /* check for hex */
12999             if (s[1] == 'x') {
13000                 shift = 4;
13001                 s += 2;
13002                 just_zero = FALSE;
13003             } else if (s[1] == 'b') {
13004                 shift = 1;
13005                 s += 2;
13006                 just_zero = FALSE;
13007             }
13008             /* check for a decimal in disguise */
13009             else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
13010                 goto decimal;
13011             /* so it must be octal */
13012             else {
13013                 shift = 3;
13014                 s++;
13015             }
13016
13017             if (*s == '_') {
13018                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13019                                "Misplaced _ in number");
13020                lastub = s++;
13021             }
13022
13023             base = bases[shift];
13024             Base = Bases[shift];
13025             max  = maxima[shift];
13026
13027             /* read the rest of the number */
13028             for (;;) {
13029                 /* x is used in the overflow test,
13030                    b is the digit we're adding on. */
13031                 UV x, b;
13032
13033                 switch (*s) {
13034
13035                 /* if we don't mention it, we're done */
13036                 default:
13037                     goto out;
13038
13039                 /* _ are ignored -- but warned about if consecutive */
13040                 case '_':
13041                     if (lastub && s == lastub + 1)
13042                         Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13043                                        "Misplaced _ in number");
13044                     lastub = s++;
13045                     break;
13046
13047                 /* 8 and 9 are not octal */
13048                 case '8': case '9':
13049                     if (shift == 3)
13050                         yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
13051                     /* FALL THROUGH */
13052
13053                 /* octal digits */
13054                 case '2': case '3': case '4':
13055                 case '5': case '6': case '7':
13056                     if (shift == 1)
13057                         yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
13058                     /* FALL THROUGH */
13059
13060                 case '0': case '1':
13061                     b = *s++ & 15;              /* ASCII digit -> value of digit */
13062                     goto digit;
13063
13064                 /* hex digits */
13065                 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
13066                 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
13067                     /* make sure they said 0x */
13068                     if (shift != 4)
13069                         goto out;
13070                     b = (*s++ & 7) + 9;
13071
13072                     /* Prepare to put the digit we have onto the end
13073                        of the number so far.  We check for overflows.
13074                     */
13075
13076                   digit:
13077                     just_zero = FALSE;
13078                     if (!overflowed) {
13079                         x = u << shift; /* make room for the digit */
13080
13081                         if ((x >> shift) != u
13082                             && !(PL_hints & HINT_NEW_BINARY)) {
13083                             overflowed = TRUE;
13084                             n = (NV) u;
13085                             Perl_ck_warner_d(aTHX_ packWARN(WARN_OVERFLOW),
13086                                              "Integer overflow in %s number",
13087                                              base);
13088                         } else
13089                             u = x | b;          /* add the digit to the end */
13090                     }
13091                     if (overflowed) {
13092                         n *= nvshift[shift];
13093                         /* If an NV has not enough bits in its
13094                          * mantissa to represent an UV this summing of
13095                          * small low-order numbers is a waste of time
13096                          * (because the NV cannot preserve the
13097                          * low-order bits anyway): we could just
13098                          * remember when did we overflow and in the
13099                          * end just multiply n by the right
13100                          * amount. */
13101                         n += (NV) b;
13102                     }
13103                     break;
13104                 }
13105             }
13106
13107           /* if we get here, we had success: make a scalar value from
13108              the number.
13109           */
13110           out:
13111
13112             /* final misplaced underbar check */
13113             if (s[-1] == '_') {
13114                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
13115             }
13116
13117             /* Dot here is historically concat, not a radix point.
13118                Deprecate that; it's confusing, and gets in the way of
13119                hex(ish) fractions... but '..' is OK. */
13120             if (s[0] == '.' &&
13121                 s[1] != '.') {
13122                 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
13123                         "Dot after %s literal is concatenation", base);
13124             }
13125
13126             sv = newSV(0);
13127             if (overflowed) {
13128                 if (n > 4294967295.0)
13129                     Perl_ck_warner(aTHX_ packWARN(WARN_PORTABLE),
13130                                    "%s number > %s non-portable",
13131                                    Base, max);
13132                 sv_setnv(sv, n);
13133             }
13134             else {
13135 #if UVSIZE > 4
13136                 if (u > 0xffffffff)
13137                     Perl_ck_warner(aTHX_ packWARN(WARN_PORTABLE),
13138                                    "%s number > %s non-portable",
13139                                    Base, max);
13140 #endif
13141                 sv_setuv(sv, u);
13142             }
13143             if (just_zero && (PL_hints & HINT_NEW_INTEGER))
13144                 sv = new_constant(start, s - start, "integer",
13145                                   sv, NULL, NULL, 0);
13146             else if (PL_hints & HINT_NEW_BINARY)
13147                 sv = new_constant(start, s - start, "binary", sv, NULL, NULL, 0);
13148         }
13149         break;
13150
13151     /*
13152       handle decimal numbers.
13153       we're also sent here when we read a 0 as the first digit
13154     */
13155     case '1': case '2': case '3': case '4': case '5':
13156     case '6': case '7': case '8': case '9': case '.':
13157       decimal:
13158         d = PL_tokenbuf;
13159         e = PL_tokenbuf + sizeof PL_tokenbuf - 6; /* room for various punctuation */
13160         floatit = FALSE;
13161
13162         /* read next group of digits and _ and copy into d */
13163         while (isDIGIT(*s) || *s == '_') {
13164             /* skip underscores, checking for misplaced ones
13165                if -w is on
13166             */
13167             if (*s == '_') {
13168                 if (lastub && s == lastub + 1)
13169                     Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13170                                    "Misplaced _ in number");
13171                 lastub = s++;
13172             }
13173             else {
13174                 /* check for end of fixed-length buffer */
13175                 if (d >= e)
13176                     Perl_croak(aTHX_ number_too_long);
13177                 /* if we're ok, copy the character */
13178                 *d++ = *s++;
13179             }
13180         }
13181
13182         /* final misplaced underbar check */
13183         if (lastub && s == lastub + 1) {
13184             Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
13185         }
13186
13187         /* read a decimal portion if there is one.  avoid
13188            3..5 being interpreted as the number 3. followed
13189            by .5
13190         */
13191         if (*s == '.' && s[1] != '.') {
13192             floatit = TRUE;
13193             *d++ = *s++;
13194
13195             if (*s == '_') {
13196                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13197                                "Misplaced _ in number");
13198                 lastub = s;
13199             }
13200
13201             /* copy, ignoring underbars, until we run out of digits.
13202             */
13203             for (; isDIGIT(*s) || *s == '_'; s++) {
13204                 /* fixed length buffer check */
13205                 if (d >= e)
13206                     Perl_croak(aTHX_ number_too_long);
13207                 if (*s == '_') {
13208                    if (lastub && s == lastub + 1)
13209                        Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13210                                       "Misplaced _ in number");
13211                    lastub = s;
13212                 }
13213                 else
13214                     *d++ = *s;
13215             }
13216             /* fractional part ending in underbar? */
13217             if (s[-1] == '_') {
13218                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13219                                "Misplaced _ in number");
13220             }
13221             if (*s == '.' && isDIGIT(s[1])) {
13222                 /* oops, it's really a v-string, but without the "v" */
13223                 s = start;
13224                 goto vstring;
13225             }
13226         }
13227
13228         /* read exponent part, if present */
13229         if ((*s == 'e' || *s == 'E') && strchr("+-0123456789_", s[1])) {
13230             floatit = TRUE;
13231             s++;
13232
13233             /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
13234             *d++ = 'e';         /* At least some Mach atof()s don't grok 'E' */
13235
13236             /* stray preinitial _ */
13237             if (*s == '_') {
13238                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13239                                "Misplaced _ in number");
13240                 lastub = s++;
13241             }
13242
13243             /* allow positive or negative exponent */
13244             if (*s == '+' || *s == '-')
13245                 *d++ = *s++;
13246
13247             /* stray initial _ */
13248             if (*s == '_') {
13249                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13250                                "Misplaced _ in number");
13251                 lastub = s++;
13252             }
13253
13254             /* read digits of exponent */
13255             while (isDIGIT(*s) || *s == '_') {
13256                 if (isDIGIT(*s)) {
13257                     if (d >= e)
13258                         Perl_croak(aTHX_ number_too_long);
13259                     *d++ = *s++;
13260                 }
13261                 else {
13262                    if (((lastub && s == lastub + 1) ||
13263                         (!isDIGIT(s[1]) && s[1] != '_')))
13264                        Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13265                                       "Misplaced _ in number");
13266                    lastub = s++;
13267                 }
13268             }
13269         }
13270
13271
13272         /* make an sv from the string */
13273         sv = newSV(0);
13274
13275         /*
13276            We try to do an integer conversion first if no characters
13277            indicating "float" have been found.
13278          */
13279
13280         if (!floatit) {
13281             UV uv;
13282             const int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
13283
13284             if (flags == IS_NUMBER_IN_UV) {
13285               if (uv <= IV_MAX)
13286                 sv_setiv(sv, uv); /* Prefer IVs over UVs. */
13287               else
13288                 sv_setuv(sv, uv);
13289             } else if (flags == (IS_NUMBER_IN_UV | IS_NUMBER_NEG)) {
13290               if (uv <= (UV) IV_MIN)
13291                 sv_setiv(sv, -(IV)uv);
13292               else
13293                 floatit = TRUE;
13294             } else
13295               floatit = TRUE;
13296         }
13297         if (floatit) {
13298             /* terminate the string */
13299             *d = '\0';
13300             nv = Atof(PL_tokenbuf);
13301             sv_setnv(sv, nv);
13302         }
13303
13304         if ( floatit
13305              ? (PL_hints & HINT_NEW_FLOAT) : (PL_hints & HINT_NEW_INTEGER) ) {
13306             const char *const key = floatit ? "float" : "integer";
13307             const STRLEN keylen = floatit ? 5 : 7;
13308             sv = S_new_constant(aTHX_ PL_tokenbuf, d - PL_tokenbuf,
13309                                 key, keylen, sv, NULL, NULL, 0);
13310         }
13311         break;
13312
13313     /* if it starts with a v, it could be a v-string */
13314     case 'v':
13315 vstring:
13316                 sv = newSV(5); /* preallocate storage space */
13317                 s = scan_vstring(s, PL_bufend, sv);
13318         break;
13319     }
13320
13321     /* make the op for the constant and return */
13322
13323     if (sv)
13324         lvalp->opval = newSVOP(OP_CONST, 0, sv);
13325     else
13326         lvalp->opval = NULL;
13327
13328     return (char *)s;
13329 }
13330
13331 STATIC char *
13332 S_scan_formline(pTHX_ register char *s)
13333 {
13334     dVAR;
13335     register char *eol;
13336     register char *t;
13337     SV * const stuff = newSVpvs("");
13338     bool needargs = FALSE;
13339     bool eofmt = FALSE;
13340 #ifdef PERL_MAD
13341     char *tokenstart = s;
13342     SV* savewhite = NULL;
13343
13344     if (PL_madskills) {
13345         savewhite = PL_thiswhite;
13346         PL_thiswhite = 0;
13347     }
13348 #endif
13349
13350     PERL_ARGS_ASSERT_SCAN_FORMLINE;
13351
13352     while (!needargs) {
13353         if (*s == '.') {
13354             t = s+1;
13355 #ifdef PERL_STRICT_CR
13356             while (SPACE_OR_TAB(*t))
13357                 t++;
13358 #else
13359             while (SPACE_OR_TAB(*t) || *t == '\r')
13360                 t++;
13361 #endif
13362             if (*t == '\n' || t == PL_bufend) {
13363                 eofmt = TRUE;
13364                 break;
13365             }
13366         }
13367         if (PL_in_eval && !PL_rsfp) {
13368             eol = (char *) memchr(s,'\n',PL_bufend-s);
13369             if (!eol++)
13370                 eol = PL_bufend;
13371         }
13372         else
13373             eol = PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
13374         if (*s != '#') {
13375             for (t = s; t < eol; t++) {
13376                 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
13377                     needargs = FALSE;
13378                     goto enough;        /* ~~ must be first line in formline */
13379                 }
13380                 if (*t == '@' || *t == '^')
13381                     needargs = TRUE;
13382             }
13383             if (eol > s) {
13384                 sv_catpvn(stuff, s, eol-s);
13385 #ifndef PERL_STRICT_CR
13386                 if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
13387                     char *end = SvPVX(stuff) + SvCUR(stuff);
13388                     end[-2] = '\n';
13389                     end[-1] = '\0';
13390                     SvCUR_set(stuff, SvCUR(stuff) - 1);
13391                 }
13392 #endif
13393             }
13394             else
13395               break;
13396         }
13397         s = (char*)eol;
13398         if (PL_rsfp) {
13399             bool got_some;
13400 #ifdef PERL_MAD
13401             if (PL_madskills) {
13402                 if (PL_thistoken)
13403                     sv_catpvn(PL_thistoken, tokenstart, PL_bufend - tokenstart);
13404                 else
13405                     PL_thistoken = newSVpvn(tokenstart, PL_bufend - tokenstart);
13406             }
13407 #endif
13408             PL_bufptr = PL_bufend;
13409             CopLINE_inc(PL_curcop);
13410             got_some = lex_next_chunk(0);
13411             CopLINE_dec(PL_curcop);
13412             s = PL_bufptr;
13413 #ifdef PERL_MAD
13414             tokenstart = PL_bufptr;
13415 #endif
13416             if (!got_some)
13417                 break;
13418         }
13419         incline(s);
13420     }
13421   enough:
13422     if (SvCUR(stuff)) {
13423         PL_expect = XTERM;
13424         if (needargs) {
13425             PL_lex_state = LEX_NORMAL;
13426             start_force(PL_curforce);
13427             NEXTVAL_NEXTTOKE.ival = 0;
13428             force_next(',');
13429         }
13430         else
13431             PL_lex_state = LEX_FORMLINE;
13432         if (!IN_BYTES) {
13433             if (UTF && is_utf8_string((U8*)SvPVX_const(stuff), SvCUR(stuff)))
13434                 SvUTF8_on(stuff);
13435             else if (PL_encoding)
13436                 sv_recode_to_utf8(stuff, PL_encoding);
13437         }
13438         start_force(PL_curforce);
13439         NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0, stuff);
13440         force_next(THING);
13441         start_force(PL_curforce);
13442         NEXTVAL_NEXTTOKE.ival = OP_FORMLINE;
13443         force_next(LSTOP);
13444     }
13445     else {
13446         SvREFCNT_dec(stuff);
13447         if (eofmt)
13448             PL_lex_formbrack = 0;
13449         PL_bufptr = s;
13450     }
13451 #ifdef PERL_MAD
13452     if (PL_madskills) {
13453         if (PL_thistoken)
13454             sv_catpvn(PL_thistoken, tokenstart, s - tokenstart);
13455         else
13456             PL_thistoken = newSVpvn(tokenstart, s - tokenstart);
13457         PL_thiswhite = savewhite;
13458     }
13459 #endif
13460     return s;
13461 }
13462
13463 I32
13464 Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
13465 {
13466     dVAR;
13467     const I32 oldsavestack_ix = PL_savestack_ix;
13468     CV* const outsidecv = PL_compcv;
13469
13470     if (PL_compcv) {
13471         assert(SvTYPE(PL_compcv) == SVt_PVCV);
13472     }
13473     SAVEI32(PL_subline);
13474     save_item(PL_subname);
13475     SAVESPTR(PL_compcv);
13476
13477     PL_compcv = MUTABLE_CV(newSV_type(is_format ? SVt_PVFM : SVt_PVCV));
13478     CvFLAGS(PL_compcv) |= flags;
13479
13480     PL_subline = CopLINE(PL_curcop);
13481     CvPADLIST(PL_compcv) = pad_new(padnew_SAVE|padnew_SAVESUB);
13482     CvOUTSIDE(PL_compcv) = MUTABLE_CV(SvREFCNT_inc_simple(outsidecv));
13483     CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
13484
13485     return oldsavestack_ix;
13486 }
13487
13488 #ifdef __SC__
13489 #pragma segment Perl_yylex
13490 #endif
13491 static int
13492 S_yywarn(pTHX_ const char *const s)
13493 {
13494     dVAR;
13495
13496     PERL_ARGS_ASSERT_YYWARN;
13497
13498     PL_in_eval |= EVAL_WARNONLY;
13499     yyerror(s);
13500     PL_in_eval &= ~EVAL_WARNONLY;
13501     return 0;
13502 }
13503
13504 int
13505 Perl_yyerror(pTHX_ const char *const s)
13506 {
13507     dVAR;
13508     const char *where = NULL;
13509     const char *context = NULL;
13510     int contlen = -1;
13511     SV *msg;
13512     int yychar  = PL_parser->yychar;
13513
13514     PERL_ARGS_ASSERT_YYERROR;
13515
13516     if (!yychar || (yychar == ';' && !PL_rsfp))
13517         where = "at EOF";
13518     else if (PL_oldoldbufptr && PL_bufptr > PL_oldoldbufptr &&
13519       PL_bufptr - PL_oldoldbufptr < 200 && PL_oldoldbufptr != PL_oldbufptr &&
13520       PL_oldbufptr != PL_bufptr) {
13521         /*
13522                 Only for NetWare:
13523                 The code below is removed for NetWare because it abends/crashes on NetWare
13524                 when the script has error such as not having the closing quotes like:
13525                     if ($var eq "value)
13526                 Checking of white spaces is anyway done in NetWare code.
13527         */
13528 #ifndef NETWARE
13529         while (isSPACE(*PL_oldoldbufptr))
13530             PL_oldoldbufptr++;
13531 #endif
13532         context = PL_oldoldbufptr;
13533         contlen = PL_bufptr - PL_oldoldbufptr;
13534     }
13535     else if (PL_oldbufptr && PL_bufptr > PL_oldbufptr &&
13536       PL_bufptr - PL_oldbufptr < 200 && PL_oldbufptr != PL_bufptr) {
13537         /*
13538                 Only for NetWare:
13539                 The code below is removed for NetWare because it abends/crashes on NetWare
13540                 when the script has error such as not having the closing quotes like:
13541                     if ($var eq "value)
13542                 Checking of white spaces is anyway done in NetWare code.
13543         */
13544 #ifndef NETWARE
13545         while (isSPACE(*PL_oldbufptr))
13546             PL_oldbufptr++;
13547 #endif
13548         context = PL_oldbufptr;
13549         contlen = PL_bufptr - PL_oldbufptr;
13550     }
13551     else if (yychar > 255)
13552         where = "next token ???";
13553     else if (yychar == -2) { /* YYEMPTY */
13554         if (PL_lex_state == LEX_NORMAL ||
13555            (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
13556             where = "at end of line";
13557         else if (PL_lex_inpat)
13558             where = "within pattern";
13559         else
13560             where = "within string";
13561     }
13562     else {
13563         SV * const where_sv = newSVpvs_flags("next char ", SVs_TEMP);
13564         if (yychar < 32)
13565             Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
13566         else if (isPRINT_LC(yychar)) {
13567             const char string = yychar;
13568             sv_catpvn(where_sv, &string, 1);
13569         }
13570         else
13571             Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
13572         where = SvPVX_const(where_sv);
13573     }
13574     msg = sv_2mortal(newSVpv(s, 0));
13575     Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
13576         OutCopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
13577     if (context)
13578         Perl_sv_catpvf(aTHX_ msg, "near \"%.*s\"\n", contlen, context);
13579     else
13580         Perl_sv_catpvf(aTHX_ msg, "%s\n", where);
13581     if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
13582         Perl_sv_catpvf(aTHX_ msg,
13583         "  (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
13584                 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
13585         PL_multi_end = 0;
13586     }
13587     if (PL_in_eval & EVAL_WARNONLY) {
13588         Perl_ck_warner_d(aTHX_ packWARN(WARN_SYNTAX), "%"SVf, SVfARG(msg));
13589     }
13590     else
13591         qerror(msg);
13592     if (PL_error_count >= 10) {
13593         if (PL_in_eval && SvCUR(ERRSV))
13594             Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
13595                        SVfARG(ERRSV), OutCopFILE(PL_curcop));
13596         else
13597             Perl_croak(aTHX_ "%s has too many errors.\n",
13598             OutCopFILE(PL_curcop));
13599     }
13600     PL_in_my = 0;
13601     PL_in_my_stash = NULL;
13602     return 0;
13603 }
13604 #ifdef __SC__
13605 #pragma segment Main
13606 #endif
13607
13608 STATIC char*
13609 S_swallow_bom(pTHX_ U8 *s)
13610 {
13611     dVAR;
13612     const STRLEN slen = SvCUR(PL_linestr);
13613
13614     PERL_ARGS_ASSERT_SWALLOW_BOM;
13615
13616     switch (s[0]) {
13617     case 0xFF:
13618         if (s[1] == 0xFE) {
13619             /* UTF-16 little-endian? (or UTF-32LE?) */
13620             if (s[2] == 0 && s[3] == 0)  /* UTF-32 little-endian */
13621                 Perl_croak(aTHX_ "Unsupported script encoding UTF-32LE");
13622 #ifndef PERL_NO_UTF16_FILTER
13623             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (BOM)\n");
13624             s += 2;
13625             if (PL_bufend > (char*)s) {
13626                 s = add_utf16_textfilter(s, TRUE);
13627             }
13628 #else
13629             Perl_croak(aTHX_ "Unsupported script encoding UTF-16LE");
13630 #endif
13631         }
13632         break;
13633     case 0xFE:
13634         if (s[1] == 0xFF) {   /* UTF-16 big-endian? */
13635 #ifndef PERL_NO_UTF16_FILTER
13636             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (BOM)\n");
13637             s += 2;
13638             if (PL_bufend > (char *)s) {
13639                 s = add_utf16_textfilter(s, FALSE);
13640             }
13641 #else
13642             Perl_croak(aTHX_ "Unsupported script encoding UTF-16BE");
13643 #endif
13644         }
13645         break;
13646     case 0xEF:
13647         if (slen > 2 && s[1] == 0xBB && s[2] == 0xBF) {
13648             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
13649             s += 3;                      /* UTF-8 */
13650         }
13651         break;
13652     case 0:
13653         if (slen > 3) {
13654              if (s[1] == 0) {
13655                   if (s[2] == 0xFE && s[3] == 0xFF) {
13656                        /* UTF-32 big-endian */
13657                        Perl_croak(aTHX_ "Unsupported script encoding UTF-32BE");
13658                   }
13659              }
13660              else if (s[2] == 0 && s[3] != 0) {
13661                   /* Leading bytes
13662                    * 00 xx 00 xx
13663                    * are a good indicator of UTF-16BE. */
13664 #ifndef PERL_NO_UTF16_FILTER
13665                   if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (no BOM)\n");
13666                   s = add_utf16_textfilter(s, FALSE);
13667 #else
13668                   Perl_croak(aTHX_ "Unsupported script encoding UTF-16BE");
13669 #endif
13670              }
13671         }
13672 #ifdef EBCDIC
13673     case 0xDD:
13674         if (slen > 3 && s[1] == 0x73 && s[2] == 0x66 && s[3] == 0x73) {
13675             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
13676             s += 4;                      /* UTF-8 */
13677         }
13678         break;
13679 #endif
13680
13681     default:
13682          if (slen > 3 && s[1] == 0 && s[2] != 0 && s[3] == 0) {
13683                   /* Leading bytes
13684                    * xx 00 xx 00
13685                    * are a good indicator of UTF-16LE. */
13686 #ifndef PERL_NO_UTF16_FILTER
13687               if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (no BOM)\n");
13688               s = add_utf16_textfilter(s, TRUE);
13689 #else
13690               Perl_croak(aTHX_ "Unsupported script encoding UTF-16LE");
13691 #endif
13692          }
13693     }
13694     return (char*)s;
13695 }
13696
13697
13698 #ifndef PERL_NO_UTF16_FILTER
13699 static I32
13700 S_utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
13701 {
13702     dVAR;
13703     SV *const filter = FILTER_DATA(idx);
13704     /* We re-use this each time round, throwing the contents away before we
13705        return.  */
13706     SV *const utf16_buffer = MUTABLE_SV(IoTOP_GV(filter));
13707     SV *const utf8_buffer = filter;
13708     IV status = IoPAGE(filter);
13709     const bool reverse = cBOOL(IoLINES(filter));
13710     I32 retval;
13711
13712     /* As we're automatically added, at the lowest level, and hence only called
13713        from this file, we can be sure that we're not called in block mode. Hence
13714        don't bother writing code to deal with block mode.  */
13715     if (maxlen) {
13716         Perl_croak(aTHX_ "panic: utf16_textfilter called in block mode (for %d characters)", maxlen);
13717     }
13718     if (status < 0) {
13719         Perl_croak(aTHX_ "panic: utf16_textfilter called after error (status=%"IVdf")", status);
13720     }
13721     DEBUG_P(PerlIO_printf(Perl_debug_log,
13722                           "utf16_textfilter(%p,%ce): idx=%d maxlen=%d status=%"IVdf" utf16=%"UVuf" utf8=%"UVuf"\n",
13723                           FPTR2DPTR(void *, S_utf16_textfilter),
13724                           reverse ? 'l' : 'b', idx, maxlen, status,
13725                           (UV)SvCUR(utf16_buffer), (UV)SvCUR(utf8_buffer)));
13726
13727     while (1) {
13728         STRLEN chars;
13729         STRLEN have;
13730         I32 newlen;
13731         U8 *end;
13732         /* First, look in our buffer of existing UTF-8 data:  */
13733         char *nl = (char *)memchr(SvPVX(utf8_buffer), '\n', SvCUR(utf8_buffer));
13734
13735         if (nl) {
13736             ++nl;
13737         } else if (status == 0) {
13738             /* EOF */
13739             IoPAGE(filter) = 0;
13740             nl = SvEND(utf8_buffer);
13741         }
13742         if (nl) {
13743             STRLEN got = nl - SvPVX(utf8_buffer);
13744             /* Did we have anything to append?  */
13745             retval = got != 0;
13746             sv_catpvn(sv, SvPVX(utf8_buffer), got);
13747             /* Everything else in this code works just fine if SVp_POK isn't
13748                set.  This, however, needs it, and we need it to work, else
13749                we loop infinitely because the buffer is never consumed.  */
13750             sv_chop(utf8_buffer, nl);
13751             break;
13752         }
13753
13754         /* OK, not a complete line there, so need to read some more UTF-16.
13755            Read an extra octect if the buffer currently has an odd number. */
13756         while (1) {
13757             if (status <= 0)
13758                 break;
13759             if (SvCUR(utf16_buffer) >= 2) {
13760                 /* Location of the high octet of the last complete code point.
13761                    Gosh, UTF-16 is a pain. All the benefits of variable length,
13762                    *coupled* with all the benefits of partial reads and
13763                    endianness.  */
13764                 const U8 *const last_hi = (U8*)SvPVX(utf16_buffer)
13765                     + ((SvCUR(utf16_buffer) & ~1) - (reverse ? 1 : 2));
13766
13767                 if (*last_hi < 0xd8 || *last_hi > 0xdb) {
13768                     break;
13769                 }
13770
13771                 /* We have the first half of a surrogate. Read more.  */
13772                 DEBUG_P(PerlIO_printf(Perl_debug_log, "utf16_textfilter partial surrogate detected at %p\n", last_hi));
13773             }
13774
13775             status = FILTER_READ(idx + 1, utf16_buffer,
13776                                  160 + (SvCUR(utf16_buffer) & 1));
13777             DEBUG_P(PerlIO_printf(Perl_debug_log, "utf16_textfilter status=%"IVdf" SvCUR(sv)=%"UVuf"\n", status, (UV)SvCUR(utf16_buffer)));
13778             DEBUG_P({ sv_dump(utf16_buffer); sv_dump(utf8_buffer);});
13779             if (status < 0) {
13780                 /* Error */
13781                 IoPAGE(filter) = status;
13782                 return status;
13783             }
13784         }
13785
13786         chars = SvCUR(utf16_buffer) >> 1;
13787         have = SvCUR(utf8_buffer);
13788         SvGROW(utf8_buffer, have + chars * 3 + 1);
13789
13790         if (reverse) {
13791             end = utf16_to_utf8_reversed((U8*)SvPVX(utf16_buffer),
13792                                          (U8*)SvPVX_const(utf8_buffer) + have,
13793                                          chars * 2, &newlen);
13794         } else {
13795             end = utf16_to_utf8((U8*)SvPVX(utf16_buffer),
13796                                 (U8*)SvPVX_const(utf8_buffer) + have,
13797                                 chars * 2, &newlen);
13798         }
13799         SvCUR_set(utf8_buffer, have + newlen);
13800         *end = '\0';
13801
13802         /* No need to keep this SV "well-formed" with a '\0' after the end, as
13803            it's private to us, and utf16_to_utf8{,reversed} take a
13804            (pointer,length) pair, rather than a NUL-terminated string.  */
13805         if(SvCUR(utf16_buffer) & 1) {
13806             *SvPVX(utf16_buffer) = SvEND(utf16_buffer)[-1];
13807             SvCUR_set(utf16_buffer, 1);
13808         } else {
13809             SvCUR_set(utf16_buffer, 0);
13810         }
13811     }
13812     DEBUG_P(PerlIO_printf(Perl_debug_log,
13813                           "utf16_textfilter: returns, status=%"IVdf" utf16=%"UVuf" utf8=%"UVuf"\n",
13814                           status,
13815                           (UV)SvCUR(utf16_buffer), (UV)SvCUR(utf8_buffer)));
13816     DEBUG_P({ sv_dump(utf8_buffer); sv_dump(sv);});
13817     return retval;
13818 }
13819
13820 static U8 *
13821 S_add_utf16_textfilter(pTHX_ U8 *const s, bool reversed)
13822 {
13823     SV *filter = filter_add(S_utf16_textfilter, NULL);
13824
13825     IoTOP_GV(filter) = MUTABLE_GV(newSVpvn((char *)s, PL_bufend - (char*)s));
13826     sv_setpvs(filter, "");
13827     IoLINES(filter) = reversed;
13828     IoPAGE(filter) = 1; /* Not EOF */
13829
13830     /* Sadly, we have to return a valid pointer, come what may, so we have to
13831        ignore any error return from this.  */
13832     SvCUR_set(PL_linestr, 0);
13833     if (FILTER_READ(0, PL_linestr, 0)) {
13834         SvUTF8_on(PL_linestr);
13835     } else {
13836         SvUTF8_on(PL_linestr);
13837     }
13838     PL_bufend = SvEND(PL_linestr);
13839     return (U8*)SvPVX(PL_linestr);
13840 }
13841 #endif
13842
13843 /*
13844 Returns a pointer to the next character after the parsed
13845 vstring, as well as updating the passed in sv.
13846
13847 Function must be called like
13848
13849         sv = newSV(5);
13850         s = scan_vstring(s,e,sv);
13851
13852 where s and e are the start and end of the string.
13853 The sv should already be large enough to store the vstring
13854 passed in, for performance reasons.
13855
13856 */
13857
13858 char *
13859 Perl_scan_vstring(pTHX_ const char *s, const char *const e, SV *sv)
13860 {
13861     dVAR;
13862     const char *pos = s;
13863     const char *start = s;
13864
13865     PERL_ARGS_ASSERT_SCAN_VSTRING;
13866
13867     if (*pos == 'v') pos++;  /* get past 'v' */
13868     while (pos < e && (isDIGIT(*pos) || *pos == '_'))
13869         pos++;
13870     if ( *pos != '.') {
13871         /* this may not be a v-string if followed by => */
13872         const char *next = pos;
13873         while (next < e && isSPACE(*next))
13874             ++next;
13875         if ((e - next) >= 2 && *next == '=' && next[1] == '>' ) {
13876             /* return string not v-string */
13877             sv_setpvn(sv,(char *)s,pos-s);
13878             return (char *)pos;
13879         }
13880     }
13881
13882     if (!isALPHA(*pos)) {
13883         U8 tmpbuf[UTF8_MAXBYTES+1];
13884
13885         if (*s == 'v')
13886             s++;  /* get past 'v' */
13887
13888         sv_setpvs(sv, "");
13889
13890         for (;;) {
13891             /* this is atoi() that tolerates underscores */
13892             U8 *tmpend;
13893             UV rev = 0;
13894             const char *end = pos;
13895             UV mult = 1;
13896             while (--end >= s) {
13897                 if (*end != '_') {
13898                     const UV orev = rev;
13899                     rev += (*end - '0') * mult;
13900                     mult *= 10;
13901                     if (orev > rev)
13902                         Perl_ck_warner_d(aTHX_ packWARN(WARN_OVERFLOW),
13903                                          "Integer overflow in decimal number");
13904                 }
13905             }
13906 #ifdef EBCDIC
13907             if (rev > 0x7FFFFFFF)
13908                  Perl_croak(aTHX_ "In EBCDIC the v-string components cannot exceed 2147483647");
13909 #endif
13910             /* Append native character for the rev point */
13911             tmpend = uvchr_to_utf8(tmpbuf, rev);
13912             sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
13913             if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(rev)))
13914                  SvUTF8_on(sv);
13915             if (pos + 1 < e && *pos == '.' && isDIGIT(pos[1]))
13916                  s = ++pos;
13917             else {
13918                  s = pos;
13919                  break;
13920             }
13921             while (pos < e && (isDIGIT(*pos) || *pos == '_'))
13922                  pos++;
13923         }
13924         SvPOK_on(sv);
13925         sv_magic(sv,NULL,PERL_MAGIC_vstring,(const char*)start, pos-start);
13926         SvRMAGICAL_on(sv);
13927     }
13928     return (char *)s;
13929 }
13930
13931 int
13932 Perl_keyword_plugin_standard(pTHX_
13933         char *keyword_ptr, STRLEN keyword_len, OP **op_ptr)
13934 {
13935     PERL_ARGS_ASSERT_KEYWORD_PLUGIN_STANDARD;
13936     PERL_UNUSED_CONTEXT;
13937     PERL_UNUSED_ARG(keyword_ptr);
13938     PERL_UNUSED_ARG(keyword_len);
13939     PERL_UNUSED_ARG(op_ptr);
13940     return KEYWORD_PLUGIN_DECLINE;
13941 }
13942
13943 /*
13944  * Local variables:
13945  * c-indentation-style: bsd
13946  * c-basic-offset: 4
13947  * indent-tabs-mode: t
13948  * End:
13949  *
13950  * ex: set ts=8 sts=4 sw=4 noet:
13951  */