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