This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Following b0e687f7 Win32 requires an -Ilib to run pl2bat.pl with miniperl.
[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             OPERATOR(PACKAGE);
6414
6415         case KEY_pipe:
6416             LOP(OP_PIPE_OP,XTERM);
6417
6418         case KEY_q:
6419             s = scan_str(s,!!PL_madskills,FALSE);
6420             if (!s)
6421                 missingterm(NULL);
6422             pl_yylval.ival = OP_CONST;
6423             TERM(sublex_start());
6424
6425         case KEY_quotemeta:
6426             UNI(OP_QUOTEMETA);
6427
6428         case KEY_qw:
6429             s = scan_str(s,!!PL_madskills,FALSE);
6430             if (!s)
6431                 missingterm(NULL);
6432             PL_expect = XOPERATOR;
6433             force_next(')');
6434             if (SvCUR(PL_lex_stuff)) {
6435                 OP *words = NULL;
6436                 int warned = 0;
6437                 d = SvPV_force(PL_lex_stuff, len);
6438                 while (len) {
6439                     for (; isSPACE(*d) && len; --len, ++d)
6440                         /**/;
6441                     if (len) {
6442                         SV *sv;
6443                         const char *b = d;
6444                         if (!warned && ckWARN(WARN_QW)) {
6445                             for (; !isSPACE(*d) && len; --len, ++d) {
6446                                 if (*d == ',') {
6447                                     Perl_warner(aTHX_ packWARN(WARN_QW),
6448                                         "Possible attempt to separate words with commas");
6449                                     ++warned;
6450                                 }
6451                                 else if (*d == '#') {
6452                                     Perl_warner(aTHX_ packWARN(WARN_QW),
6453                                         "Possible attempt to put comments in qw() list");
6454                                     ++warned;
6455                                 }
6456                             }
6457                         }
6458                         else {
6459                             for (; !isSPACE(*d) && len; --len, ++d)
6460                                 /**/;
6461                         }
6462                         sv = newSVpvn_utf8(b, d-b, DO_UTF8(PL_lex_stuff));
6463                         words = append_elem(OP_LIST, words,
6464                                             newSVOP(OP_CONST, 0, tokeq(sv)));
6465                     }
6466                 }
6467                 if (words) {
6468                     start_force(PL_curforce);
6469                     NEXTVAL_NEXTTOKE.opval = words;
6470                     force_next(THING);
6471                 }
6472             }
6473             if (PL_lex_stuff) {
6474                 SvREFCNT_dec(PL_lex_stuff);
6475                 PL_lex_stuff = NULL;
6476             }
6477             PL_expect = XTERM;
6478             TOKEN('(');
6479
6480         case KEY_qq:
6481             s = scan_str(s,!!PL_madskills,FALSE);
6482             if (!s)
6483                 missingterm(NULL);
6484             pl_yylval.ival = OP_STRINGIFY;
6485             if (SvIVX(PL_lex_stuff) == '\'')
6486                 SvIV_set(PL_lex_stuff, 0);      /* qq'$foo' should intepolate */
6487             TERM(sublex_start());
6488
6489         case KEY_qr:
6490             s = scan_pat(s,OP_QR);
6491             TERM(sublex_start());
6492
6493         case KEY_qx:
6494             s = scan_str(s,!!PL_madskills,FALSE);
6495             if (!s)
6496                 missingterm(NULL);
6497             readpipe_override();
6498             TERM(sublex_start());
6499
6500         case KEY_return:
6501             OLDLOP(OP_RETURN);
6502
6503         case KEY_require:
6504             s = SKIPSPACE1(s);
6505             if (isDIGIT(*s)) {
6506                 s = force_version(s, FALSE);
6507             }
6508             else if (*s != 'v' || !isDIGIT(s[1])
6509                     || (s = force_version(s, TRUE), *s == 'v'))
6510             {
6511                 *PL_tokenbuf = '\0';
6512                 s = force_word(s,WORD,TRUE,TRUE,FALSE);
6513                 if (isIDFIRST_lazy_if(PL_tokenbuf,UTF))
6514                     gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf), GV_ADD);
6515                 else if (*s == '<')
6516                     yyerror("<> should be quotes");
6517             }
6518             if (orig_keyword == KEY_require) {
6519                 orig_keyword = 0;
6520                 pl_yylval.ival = 1;
6521             }
6522             else 
6523                 pl_yylval.ival = 0;
6524             PL_expect = XTERM;
6525             PL_bufptr = s;
6526             PL_last_uni = PL_oldbufptr;
6527             PL_last_lop_op = OP_REQUIRE;
6528             s = skipspace(s);
6529             return REPORT( (int)REQUIRE );
6530
6531         case KEY_reset:
6532             UNI(OP_RESET);
6533
6534         case KEY_redo:
6535             s = force_word(s,WORD,TRUE,FALSE,FALSE);
6536             LOOPX(OP_REDO);
6537
6538         case KEY_rename:
6539             LOP(OP_RENAME,XTERM);
6540
6541         case KEY_rand:
6542             UNI(OP_RAND);
6543
6544         case KEY_rmdir:
6545             UNI(OP_RMDIR);
6546
6547         case KEY_rindex:
6548             LOP(OP_RINDEX,XTERM);
6549
6550         case KEY_read:
6551             LOP(OP_READ,XTERM);
6552
6553         case KEY_readdir:
6554             UNI(OP_READDIR);
6555
6556         case KEY_readline:
6557             UNIDOR(OP_READLINE);
6558
6559         case KEY_readpipe:
6560             UNIDOR(OP_BACKTICK);
6561
6562         case KEY_rewinddir:
6563             UNI(OP_REWINDDIR);
6564
6565         case KEY_recv:
6566             LOP(OP_RECV,XTERM);
6567
6568         case KEY_reverse:
6569             LOP(OP_REVERSE,XTERM);
6570
6571         case KEY_readlink:
6572             UNIDOR(OP_READLINK);
6573
6574         case KEY_ref:
6575             UNI(OP_REF);
6576
6577         case KEY_s:
6578             s = scan_subst(s);
6579             if (pl_yylval.opval)
6580                 TERM(sublex_start());
6581             else
6582                 TOKEN(1);       /* force error */
6583
6584         case KEY_say:
6585             checkcomma(s,PL_tokenbuf,"filehandle");
6586             LOP(OP_SAY,XREF);
6587
6588         case KEY_chomp:
6589             UNI(OP_CHOMP);
6590         
6591         case KEY_scalar:
6592             UNI(OP_SCALAR);
6593
6594         case KEY_select:
6595             LOP(OP_SELECT,XTERM);
6596
6597         case KEY_seek:
6598             LOP(OP_SEEK,XTERM);
6599
6600         case KEY_semctl:
6601             LOP(OP_SEMCTL,XTERM);
6602
6603         case KEY_semget:
6604             LOP(OP_SEMGET,XTERM);
6605
6606         case KEY_semop:
6607             LOP(OP_SEMOP,XTERM);
6608
6609         case KEY_send:
6610             LOP(OP_SEND,XTERM);
6611
6612         case KEY_setpgrp:
6613             LOP(OP_SETPGRP,XTERM);
6614
6615         case KEY_setpriority:
6616             LOP(OP_SETPRIORITY,XTERM);
6617
6618         case KEY_sethostent:
6619             UNI(OP_SHOSTENT);
6620
6621         case KEY_setnetent:
6622             UNI(OP_SNETENT);
6623
6624         case KEY_setservent:
6625             UNI(OP_SSERVENT);
6626
6627         case KEY_setprotoent:
6628             UNI(OP_SPROTOENT);
6629
6630         case KEY_setpwent:
6631             FUN0(OP_SPWENT);
6632
6633         case KEY_setgrent:
6634             FUN0(OP_SGRENT);
6635
6636         case KEY_seekdir:
6637             LOP(OP_SEEKDIR,XTERM);
6638
6639         case KEY_setsockopt:
6640             LOP(OP_SSOCKOPT,XTERM);
6641
6642         case KEY_shift:
6643             UNIDOR(OP_SHIFT);
6644
6645         case KEY_shmctl:
6646             LOP(OP_SHMCTL,XTERM);
6647
6648         case KEY_shmget:
6649             LOP(OP_SHMGET,XTERM);
6650
6651         case KEY_shmread:
6652             LOP(OP_SHMREAD,XTERM);
6653
6654         case KEY_shmwrite:
6655             LOP(OP_SHMWRITE,XTERM);
6656
6657         case KEY_shutdown:
6658             LOP(OP_SHUTDOWN,XTERM);
6659
6660         case KEY_sin:
6661             UNI(OP_SIN);
6662
6663         case KEY_sleep:
6664             UNI(OP_SLEEP);
6665
6666         case KEY_socket:
6667             LOP(OP_SOCKET,XTERM);
6668
6669         case KEY_socketpair:
6670             LOP(OP_SOCKPAIR,XTERM);
6671
6672         case KEY_sort:
6673             checkcomma(s,PL_tokenbuf,"subroutine name");
6674             s = SKIPSPACE1(s);
6675             if (*s == ';' || *s == ')')         /* probably a close */
6676                 Perl_croak(aTHX_ "sort is now a reserved word");
6677             PL_expect = XTERM;
6678             s = force_word(s,WORD,TRUE,TRUE,FALSE);
6679             LOP(OP_SORT,XREF);
6680
6681         case KEY_split:
6682             LOP(OP_SPLIT,XTERM);
6683
6684         case KEY_sprintf:
6685             LOP(OP_SPRINTF,XTERM);
6686
6687         case KEY_splice:
6688             LOP(OP_SPLICE,XTERM);
6689
6690         case KEY_sqrt:
6691             UNI(OP_SQRT);
6692
6693         case KEY_srand:
6694             UNI(OP_SRAND);
6695
6696         case KEY_stat:
6697             UNI(OP_STAT);
6698
6699         case KEY_study:
6700             UNI(OP_STUDY);
6701
6702         case KEY_substr:
6703             LOP(OP_SUBSTR,XTERM);
6704
6705         case KEY_format:
6706         case KEY_sub:
6707           really_sub:
6708             {
6709                 char tmpbuf[sizeof PL_tokenbuf];
6710                 SSize_t tboffset = 0;
6711                 expectation attrful;
6712                 bool have_name, have_proto;
6713                 const int key = tmp;
6714
6715 #ifdef PERL_MAD
6716                 SV *tmpwhite = 0;
6717
6718                 char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
6719                 SV *subtoken = newSVpvn(tstart, s - tstart);
6720                 PL_thistoken = 0;
6721
6722                 d = s;
6723                 s = SKIPSPACE2(s,tmpwhite);
6724 #else
6725                 s = skipspace(s);
6726 #endif
6727
6728                 if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' ||
6729                     (*s == ':' && s[1] == ':'))
6730                 {
6731 #ifdef PERL_MAD
6732                     SV *nametoke = NULL;
6733 #endif
6734
6735                     PL_expect = XBLOCK;
6736                     attrful = XATTRBLOCK;
6737                     /* remember buffer pos'n for later force_word */
6738                     tboffset = s - PL_oldbufptr;
6739                     d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
6740 #ifdef PERL_MAD
6741                     if (PL_madskills)
6742                         nametoke = newSVpvn(s, d - s);
6743 #endif
6744                     if (memchr(tmpbuf, ':', len))
6745                         sv_setpvn(PL_subname, tmpbuf, len);
6746                     else {
6747                         sv_setsv(PL_subname,PL_curstname);
6748                         sv_catpvs(PL_subname,"::");
6749                         sv_catpvn(PL_subname,tmpbuf,len);
6750                     }
6751                     have_name = TRUE;
6752
6753 #ifdef PERL_MAD
6754
6755                     start_force(0);
6756                     CURMAD('X', nametoke);
6757                     CURMAD('_', tmpwhite);
6758                     (void) force_word(PL_oldbufptr + tboffset, WORD,
6759                                       FALSE, TRUE, TRUE);
6760
6761                     s = SKIPSPACE2(d,tmpwhite);
6762 #else
6763                     s = skipspace(d);
6764 #endif
6765                 }
6766                 else {
6767                     if (key == KEY_my)
6768                         Perl_croak(aTHX_ "Missing name in \"my sub\"");
6769                     PL_expect = XTERMBLOCK;
6770                     attrful = XATTRTERM;
6771                     sv_setpvs(PL_subname,"?");
6772                     have_name = FALSE;
6773                 }
6774
6775                 if (key == KEY_format) {
6776                     if (*s == '=')
6777                         PL_lex_formbrack = PL_lex_brackets + 1;
6778 #ifdef PERL_MAD
6779                     PL_thistoken = subtoken;
6780                     s = d;
6781 #else
6782                     if (have_name)
6783                         (void) force_word(PL_oldbufptr + tboffset, WORD,
6784                                           FALSE, TRUE, TRUE);
6785 #endif
6786                     OPERATOR(FORMAT);
6787                 }
6788
6789                 /* Look for a prototype */
6790                 if (*s == '(') {
6791                     char *p;
6792                     bool bad_proto = FALSE;
6793                     bool in_brackets = FALSE;
6794                     char greedy_proto = ' ';
6795                     bool proto_after_greedy_proto = FALSE;
6796                     bool must_be_last = FALSE;
6797                     bool underscore = FALSE;
6798                     bool seen_underscore = FALSE;
6799                     const bool warnsyntax = ckWARN(WARN_SYNTAX);
6800
6801                     s = scan_str(s,!!PL_madskills,FALSE);
6802                     if (!s)
6803                         Perl_croak(aTHX_ "Prototype not terminated");
6804                     /* strip spaces and check for bad characters */
6805                     d = SvPVX(PL_lex_stuff);
6806                     tmp = 0;
6807                     for (p = d; *p; ++p) {
6808                         if (!isSPACE(*p)) {
6809                             d[tmp++] = *p;
6810
6811                             if (warnsyntax) {
6812                                 if (must_be_last)
6813                                     proto_after_greedy_proto = TRUE;
6814                                 if (!strchr("$@%*;[]&\\_", *p)) {
6815                                     bad_proto = TRUE;
6816                                 }
6817                                 else {
6818                                     if ( underscore ) {
6819                                         if ( *p != ';' )
6820                                             bad_proto = TRUE;
6821                                         underscore = FALSE;
6822                                     }
6823                                     if ( *p == '[' ) {
6824                                         in_brackets = TRUE;
6825                                     }
6826                                     else if ( *p == ']' ) {
6827                                         in_brackets = FALSE;
6828                                     }
6829                                     else if ( (*p == '@' || *p == '%') &&
6830                                          ( tmp < 2 || d[tmp-2] != '\\' ) &&
6831                                          !in_brackets ) {
6832                                         must_be_last = TRUE;
6833                                         greedy_proto = *p;
6834                                     }
6835                                     else if ( *p == '_' ) {
6836                                         underscore = seen_underscore = TRUE;
6837                                     }
6838                                 }
6839                             }
6840                         }
6841                     }
6842                     d[tmp] = '\0';
6843                     if (proto_after_greedy_proto)
6844                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
6845                                     "Prototype after '%c' for %"SVf" : %s",
6846                                     greedy_proto, SVfARG(PL_subname), d);
6847                     if (bad_proto)
6848                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
6849                                     "Illegal character %sin prototype for %"SVf" : %s",
6850                                     seen_underscore ? "after '_' " : "",
6851                                     SVfARG(PL_subname), d);
6852                     SvCUR_set(PL_lex_stuff, tmp);
6853                     have_proto = TRUE;
6854
6855 #ifdef PERL_MAD
6856                     start_force(0);
6857                     CURMAD('q', PL_thisopen);
6858                     CURMAD('_', tmpwhite);
6859                     CURMAD('=', PL_thisstuff);
6860                     CURMAD('Q', PL_thisclose);
6861                     NEXTVAL_NEXTTOKE.opval =
6862                         (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
6863                     PL_lex_stuff = NULL;
6864                     force_next(THING);
6865
6866                     s = SKIPSPACE2(s,tmpwhite);
6867 #else
6868                     s = skipspace(s);
6869 #endif
6870                 }
6871                 else
6872                     have_proto = FALSE;
6873
6874                 if (*s == ':' && s[1] != ':')
6875                     PL_expect = attrful;
6876                 else if (*s != '{' && key == KEY_sub) {
6877                     if (!have_name)
6878                         Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine");
6879                     else if (*s != ';')
6880                         Perl_croak(aTHX_ "Illegal declaration of subroutine %"SVf, SVfARG(PL_subname));
6881                 }
6882
6883 #ifdef PERL_MAD
6884                 start_force(0);
6885                 if (tmpwhite) {
6886                     if (PL_madskills)
6887                         curmad('^', newSVpvs(""));
6888                     CURMAD('_', tmpwhite);
6889                 }
6890                 force_next(0);
6891
6892                 PL_thistoken = subtoken;
6893 #else
6894                 if (have_proto) {
6895                     NEXTVAL_NEXTTOKE.opval =
6896                         (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
6897                     PL_lex_stuff = NULL;
6898                     force_next(THING);
6899                 }
6900 #endif
6901                 if (!have_name) {
6902                     if (PL_curstash)
6903                         sv_setpvs(PL_subname, "__ANON__");
6904                     else
6905                         sv_setpvs(PL_subname, "__ANON__::__ANON__");
6906                     TOKEN(ANONSUB);
6907                 }
6908 #ifndef PERL_MAD
6909                 (void) force_word(PL_oldbufptr + tboffset, WORD,
6910                                   FALSE, TRUE, TRUE);
6911 #endif
6912                 if (key == KEY_my)
6913                     TOKEN(MYSUB);
6914                 TOKEN(SUB);
6915             }
6916
6917         case KEY_system:
6918             LOP(OP_SYSTEM,XREF);
6919
6920         case KEY_symlink:
6921             LOP(OP_SYMLINK,XTERM);
6922
6923         case KEY_syscall:
6924             LOP(OP_SYSCALL,XTERM);
6925
6926         case KEY_sysopen:
6927             LOP(OP_SYSOPEN,XTERM);
6928
6929         case KEY_sysseek:
6930             LOP(OP_SYSSEEK,XTERM);
6931
6932         case KEY_sysread:
6933             LOP(OP_SYSREAD,XTERM);
6934
6935         case KEY_syswrite:
6936             LOP(OP_SYSWRITE,XTERM);
6937
6938         case KEY_tr:
6939             s = scan_trans(s);
6940             TERM(sublex_start());
6941
6942         case KEY_tell:
6943             UNI(OP_TELL);
6944
6945         case KEY_telldir:
6946             UNI(OP_TELLDIR);
6947
6948         case KEY_tie:
6949             LOP(OP_TIE,XTERM);
6950
6951         case KEY_tied:
6952             UNI(OP_TIED);
6953
6954         case KEY_time:
6955             FUN0(OP_TIME);
6956
6957         case KEY_times:
6958             FUN0(OP_TMS);
6959
6960         case KEY_truncate:
6961             LOP(OP_TRUNCATE,XTERM);
6962
6963         case KEY_uc:
6964             UNI(OP_UC);
6965
6966         case KEY_ucfirst:
6967             UNI(OP_UCFIRST);
6968
6969         case KEY_untie:
6970             UNI(OP_UNTIE);
6971
6972         case KEY_until:
6973             pl_yylval.ival = CopLINE(PL_curcop);
6974             OPERATOR(UNTIL);
6975
6976         case KEY_unless:
6977             pl_yylval.ival = CopLINE(PL_curcop);
6978             OPERATOR(UNLESS);
6979
6980         case KEY_unlink:
6981             LOP(OP_UNLINK,XTERM);
6982
6983         case KEY_undef:
6984             UNIDOR(OP_UNDEF);
6985
6986         case KEY_unpack:
6987             LOP(OP_UNPACK,XTERM);
6988
6989         case KEY_utime:
6990             LOP(OP_UTIME,XTERM);
6991
6992         case KEY_umask:
6993             UNIDOR(OP_UMASK);
6994
6995         case KEY_unshift:
6996             LOP(OP_UNSHIFT,XTERM);
6997
6998         case KEY_use:
6999             s = tokenize_use(1, s);
7000             OPERATOR(USE);
7001
7002         case KEY_values:
7003             UNI(OP_VALUES);
7004
7005         case KEY_vec:
7006             LOP(OP_VEC,XTERM);
7007
7008         case KEY_when:
7009             pl_yylval.ival = CopLINE(PL_curcop);
7010             OPERATOR(WHEN);
7011
7012         case KEY_while:
7013             pl_yylval.ival = CopLINE(PL_curcop);
7014             OPERATOR(WHILE);
7015
7016         case KEY_warn:
7017             PL_hints |= HINT_BLOCK_SCOPE;
7018             LOP(OP_WARN,XTERM);
7019
7020         case KEY_wait:
7021             FUN0(OP_WAIT);
7022
7023         case KEY_waitpid:
7024             LOP(OP_WAITPID,XTERM);
7025
7026         case KEY_wantarray:
7027             FUN0(OP_WANTARRAY);
7028
7029         case KEY_write:
7030 #ifdef EBCDIC
7031         {
7032             char ctl_l[2];
7033             ctl_l[0] = toCTRL('L');
7034             ctl_l[1] = '\0';
7035             gv_fetchpvn_flags(ctl_l, 1, GV_ADD|GV_NOTQUAL, SVt_PV);
7036         }
7037 #else
7038             /* Make sure $^L is defined */
7039             gv_fetchpvs("\f", GV_ADD|GV_NOTQUAL, SVt_PV);
7040 #endif
7041             UNI(OP_ENTERWRITE);
7042
7043         case KEY_x:
7044             if (PL_expect == XOPERATOR)
7045                 Mop(OP_REPEAT);
7046             check_uni();
7047             goto just_a_word;
7048
7049         case KEY_xor:
7050             pl_yylval.ival = OP_XOR;
7051             OPERATOR(OROP);
7052
7053         case KEY_y:
7054             s = scan_trans(s);
7055             TERM(sublex_start());
7056         }
7057     }}
7058 }
7059 #ifdef __SC__
7060 #pragma segment Main
7061 #endif
7062
7063 static int
7064 S_pending_ident(pTHX)
7065 {
7066     dVAR;
7067     register char *d;
7068     PADOFFSET tmp = 0;
7069     /* pit holds the identifier we read and pending_ident is reset */
7070     char pit = PL_pending_ident;
7071     const STRLEN tokenbuf_len = strlen(PL_tokenbuf);
7072     /* All routes through this function want to know if there is a colon.  */
7073     const char *const has_colon = (const char*) memchr (PL_tokenbuf, ':', tokenbuf_len);
7074     PL_pending_ident = 0;
7075
7076     /* PL_realtokenstart = realtokenend = PL_bufptr - SvPVX(PL_linestr); */
7077     DEBUG_T({ PerlIO_printf(Perl_debug_log,
7078           "### Pending identifier '%s'\n", PL_tokenbuf); });
7079
7080     /* if we're in a my(), we can't allow dynamics here.
7081        $foo'bar has already been turned into $foo::bar, so
7082        just check for colons.
7083
7084        if it's a legal name, the OP is a PADANY.
7085     */
7086     if (PL_in_my) {
7087         if (PL_in_my == KEY_our) {      /* "our" is merely analogous to "my" */
7088             if (has_colon)
7089                 yyerror(Perl_form(aTHX_ "No package name allowed for "
7090                                   "variable %s in \"our\"",
7091                                   PL_tokenbuf));
7092             tmp = allocmy(PL_tokenbuf);
7093         }
7094         else {
7095             if (has_colon)
7096                 yyerror(Perl_form(aTHX_ PL_no_myglob,
7097                             PL_in_my == KEY_my ? "my" : "state", PL_tokenbuf));
7098
7099             pl_yylval.opval = newOP(OP_PADANY, 0);
7100             pl_yylval.opval->op_targ = allocmy(PL_tokenbuf);
7101             return PRIVATEREF;
7102         }
7103     }
7104
7105     /*
7106        build the ops for accesses to a my() variable.
7107
7108        Deny my($a) or my($b) in a sort block, *if* $a or $b is
7109        then used in a comparison.  This catches most, but not
7110        all cases.  For instance, it catches
7111            sort { my($a); $a <=> $b }
7112        but not
7113            sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
7114        (although why you'd do that is anyone's guess).
7115     */
7116
7117     if (!has_colon) {
7118         if (!PL_in_my)
7119             tmp = pad_findmy(PL_tokenbuf);
7120         if (tmp != NOT_IN_PAD) {
7121             /* might be an "our" variable" */
7122             if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
7123                 /* build ops for a bareword */
7124                 HV *  const stash = PAD_COMPNAME_OURSTASH(tmp);
7125                 HEK * const stashname = HvNAME_HEK(stash);
7126                 SV *  const sym = newSVhek(stashname);
7127                 sv_catpvs(sym, "::");
7128                 sv_catpvn(sym, PL_tokenbuf+1, tokenbuf_len - 1);
7129                 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
7130                 pl_yylval.opval->op_private = OPpCONST_ENTERED;
7131                 gv_fetchsv(sym,
7132                     (PL_in_eval
7133                         ? (GV_ADDMULTI | GV_ADDINEVAL)
7134                         : GV_ADDMULTI
7135                     ),
7136                     ((PL_tokenbuf[0] == '$') ? SVt_PV
7137                      : (PL_tokenbuf[0] == '@') ? SVt_PVAV
7138                      : SVt_PVHV));
7139                 return WORD;
7140             }
7141
7142             /* if it's a sort block and they're naming $a or $b */
7143             if (PL_last_lop_op == OP_SORT &&
7144                 PL_tokenbuf[0] == '$' &&
7145                 (PL_tokenbuf[1] == 'a' || PL_tokenbuf[1] == 'b')
7146                 && !PL_tokenbuf[2])
7147             {
7148                 for (d = PL_in_eval ? PL_oldoldbufptr : PL_linestart;
7149                      d < PL_bufend && *d != '\n';
7150                      d++)
7151                 {
7152                     if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
7153                         Perl_croak(aTHX_ "Can't use \"my %s\" in sort comparison",
7154                               PL_tokenbuf);
7155                     }
7156                 }
7157             }
7158
7159             pl_yylval.opval = newOP(OP_PADANY, 0);
7160             pl_yylval.opval->op_targ = tmp;
7161             return PRIVATEREF;
7162         }
7163     }
7164
7165     /*
7166        Whine if they've said @foo in a doublequoted string,
7167        and @foo isn't a variable we can find in the symbol
7168        table.
7169     */
7170     if (pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
7171         GV *const gv = gv_fetchpvn_flags(PL_tokenbuf + 1, tokenbuf_len - 1, 0,
7172                                          SVt_PVAV);
7173         if ((!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
7174                 && ckWARN(WARN_AMBIGUOUS)
7175                 /* DO NOT warn for @- and @+ */
7176                 && !( PL_tokenbuf[2] == '\0' &&
7177                     ( PL_tokenbuf[1] == '-' || PL_tokenbuf[1] == '+' ))
7178            )
7179         {
7180             /* Downgraded from fatal to warning 20000522 mjd */
7181             Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
7182                         "Possible unintended interpolation of %s in string",
7183                          PL_tokenbuf);
7184         }
7185     }
7186
7187     /* build ops for a bareword */
7188     pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpvn(PL_tokenbuf + 1,
7189                                                       tokenbuf_len - 1));
7190     pl_yylval.opval->op_private = OPpCONST_ENTERED;
7191     gv_fetchpvn_flags(
7192             PL_tokenbuf + 1, tokenbuf_len - 1,
7193             /* If the identifier refers to a stash, don't autovivify it.
7194              * Change 24660 had the side effect of causing symbol table
7195              * hashes to always be defined, even if they were freshly
7196              * created and the only reference in the entire program was
7197              * the single statement with the defined %foo::bar:: test.
7198              * It appears that all code in the wild doing this actually
7199              * wants to know whether sub-packages have been loaded, so
7200              * by avoiding auto-vivifying symbol tables, we ensure that
7201              * defined %foo::bar:: continues to be false, and the existing
7202              * tests still give the expected answers, even though what
7203              * they're actually testing has now changed subtly.
7204              */
7205             (*PL_tokenbuf == '%'
7206              && *(d = PL_tokenbuf + tokenbuf_len - 1) == ':'
7207              && d[-1] == ':'
7208              ? 0
7209              : PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : GV_ADD),
7210             ((PL_tokenbuf[0] == '$') ? SVt_PV
7211              : (PL_tokenbuf[0] == '@') ? SVt_PVAV
7212              : SVt_PVHV));
7213     return WORD;
7214 }
7215
7216 /*
7217  *  The following code was generated by perl_keyword.pl.
7218  */
7219
7220 I32
7221 Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords)
7222 {
7223     dVAR;
7224
7225     PERL_ARGS_ASSERT_KEYWORD;
7226
7227   switch (len)
7228   {
7229     case 1: /* 5 tokens of length 1 */
7230       switch (name[0])
7231       {
7232         case 'm':
7233           {                                       /* m          */
7234             return KEY_m;
7235           }
7236
7237         case 'q':
7238           {                                       /* q          */
7239             return KEY_q;
7240           }
7241
7242         case 's':
7243           {                                       /* s          */
7244             return KEY_s;
7245           }
7246
7247         case 'x':
7248           {                                       /* x          */
7249             return -KEY_x;
7250           }
7251
7252         case 'y':
7253           {                                       /* y          */
7254             return KEY_y;
7255           }
7256
7257         default:
7258           goto unknown;
7259       }
7260
7261     case 2: /* 18 tokens of length 2 */
7262       switch (name[0])
7263       {
7264         case 'd':
7265           if (name[1] == 'o')
7266           {                                       /* do         */
7267             return KEY_do;
7268           }
7269
7270           goto unknown;
7271
7272         case 'e':
7273           if (name[1] == 'q')
7274           {                                       /* eq         */
7275             return -KEY_eq;
7276           }
7277
7278           goto unknown;
7279
7280         case 'g':
7281           switch (name[1])
7282           {
7283             case 'e':
7284               {                                   /* ge         */
7285                 return -KEY_ge;
7286               }
7287
7288             case 't':
7289               {                                   /* gt         */
7290                 return -KEY_gt;
7291               }
7292
7293             default:
7294               goto unknown;
7295           }
7296
7297         case 'i':
7298           if (name[1] == 'f')
7299           {                                       /* if         */
7300             return KEY_if;
7301           }
7302
7303           goto unknown;
7304
7305         case 'l':
7306           switch (name[1])
7307           {
7308             case 'c':
7309               {                                   /* lc         */
7310                 return -KEY_lc;
7311               }
7312
7313             case 'e':
7314               {                                   /* le         */
7315                 return -KEY_le;
7316               }
7317
7318             case 't':
7319               {                                   /* lt         */
7320                 return -KEY_lt;
7321               }
7322
7323             default:
7324               goto unknown;
7325           }
7326
7327         case 'm':
7328           if (name[1] == 'y')
7329           {                                       /* my         */
7330             return KEY_my;
7331           }
7332
7333           goto unknown;
7334
7335         case 'n':
7336           switch (name[1])
7337           {
7338             case 'e':
7339               {                                   /* ne         */
7340                 return -KEY_ne;
7341               }
7342
7343             case 'o':
7344               {                                   /* no         */
7345                 return KEY_no;
7346               }
7347
7348             default:
7349               goto unknown;
7350           }
7351
7352         case 'o':
7353           if (name[1] == 'r')
7354           {                                       /* or         */
7355             return -KEY_or;
7356           }
7357
7358           goto unknown;
7359
7360         case 'q':
7361           switch (name[1])
7362           {
7363             case 'q':
7364               {                                   /* qq         */
7365                 return KEY_qq;
7366               }
7367
7368             case 'r':
7369               {                                   /* qr         */
7370                 return KEY_qr;
7371               }
7372
7373             case 'w':
7374               {                                   /* qw         */
7375                 return KEY_qw;
7376               }
7377
7378             case 'x':
7379               {                                   /* qx         */
7380                 return KEY_qx;
7381               }
7382
7383             default:
7384               goto unknown;
7385           }
7386
7387         case 't':
7388           if (name[1] == 'r')
7389           {                                       /* tr         */
7390             return KEY_tr;
7391           }
7392
7393           goto unknown;
7394
7395         case 'u':
7396           if (name[1] == 'c')
7397           {                                       /* uc         */
7398             return -KEY_uc;
7399           }
7400
7401           goto unknown;
7402
7403         default:
7404           goto unknown;
7405       }
7406
7407     case 3: /* 29 tokens of length 3 */
7408       switch (name[0])
7409       {
7410         case 'E':
7411           if (name[1] == 'N' &&
7412               name[2] == 'D')
7413           {                                       /* END        */
7414             return KEY_END;
7415           }
7416
7417           goto unknown;
7418
7419         case 'a':
7420           switch (name[1])
7421           {
7422             case 'b':
7423               if (name[2] == 's')
7424               {                                   /* abs        */
7425                 return -KEY_abs;
7426               }
7427
7428               goto unknown;
7429
7430             case 'n':
7431               if (name[2] == 'd')
7432               {                                   /* and        */
7433                 return -KEY_and;
7434               }
7435
7436               goto unknown;
7437
7438             default:
7439               goto unknown;
7440           }
7441
7442         case 'c':
7443           switch (name[1])
7444           {
7445             case 'h':
7446               if (name[2] == 'r')
7447               {                                   /* chr        */
7448                 return -KEY_chr;
7449               }
7450
7451               goto unknown;
7452
7453             case 'm':
7454               if (name[2] == 'p')
7455               {                                   /* cmp        */
7456                 return -KEY_cmp;
7457               }
7458
7459               goto unknown;
7460
7461             case 'o':
7462               if (name[2] == 's')
7463               {                                   /* cos        */
7464                 return -KEY_cos;
7465               }
7466
7467               goto unknown;
7468
7469             default:
7470               goto unknown;
7471           }
7472
7473         case 'd':
7474           if (name[1] == 'i' &&
7475               name[2] == 'e')
7476           {                                       /* die        */
7477             return -KEY_die;
7478           }
7479
7480           goto unknown;
7481
7482         case 'e':
7483           switch (name[1])
7484           {
7485             case 'o':
7486               if (name[2] == 'f')
7487               {                                   /* eof        */
7488                 return -KEY_eof;
7489               }
7490
7491               goto unknown;
7492
7493             case 'x':
7494               if (name[2] == 'p')
7495               {                                   /* exp        */
7496                 return -KEY_exp;
7497               }
7498
7499               goto unknown;
7500
7501             default:
7502               goto unknown;
7503           }
7504
7505         case 'f':
7506           if (name[1] == 'o' &&
7507               name[2] == 'r')
7508           {                                       /* for        */
7509             return KEY_for;
7510           }
7511
7512           goto unknown;
7513
7514         case 'h':
7515           if (name[1] == 'e' &&
7516               name[2] == 'x')
7517           {                                       /* hex        */
7518             return -KEY_hex;
7519           }
7520
7521           goto unknown;
7522
7523         case 'i':
7524           if (name[1] == 'n' &&
7525               name[2] == 't')
7526           {                                       /* int        */
7527             return -KEY_int;
7528           }
7529
7530           goto unknown;
7531
7532         case 'l':
7533           if (name[1] == 'o' &&
7534               name[2] == 'g')
7535           {                                       /* log        */
7536             return -KEY_log;
7537           }
7538
7539           goto unknown;
7540
7541         case 'm':
7542           if (name[1] == 'a' &&
7543               name[2] == 'p')
7544           {                                       /* map        */
7545             return KEY_map;
7546           }
7547
7548           goto unknown;
7549
7550         case 'n':
7551           if (name[1] == 'o' &&
7552               name[2] == 't')
7553           {                                       /* not        */
7554             return -KEY_not;
7555           }
7556
7557           goto unknown;
7558
7559         case 'o':
7560           switch (name[1])
7561           {
7562             case 'c':
7563               if (name[2] == 't')
7564               {                                   /* oct        */
7565                 return -KEY_oct;
7566               }
7567
7568               goto unknown;
7569
7570             case 'r':
7571               if (name[2] == 'd')
7572               {                                   /* ord        */
7573                 return -KEY_ord;
7574               }
7575
7576               goto unknown;
7577
7578             case 'u':
7579               if (name[2] == 'r')
7580               {                                   /* our        */
7581                 return KEY_our;
7582               }
7583
7584               goto unknown;
7585
7586             default:
7587               goto unknown;
7588           }
7589
7590         case 'p':
7591           if (name[1] == 'o')
7592           {
7593             switch (name[2])
7594             {
7595               case 'p':
7596                 {                                 /* pop        */
7597                   return -KEY_pop;
7598                 }
7599
7600               case 's':
7601                 {                                 /* pos        */
7602                   return KEY_pos;
7603                 }
7604
7605               default:
7606                 goto unknown;
7607             }
7608           }
7609
7610           goto unknown;
7611
7612         case 'r':
7613           if (name[1] == 'e' &&
7614               name[2] == 'f')
7615           {                                       /* ref        */
7616             return -KEY_ref;
7617           }
7618
7619           goto unknown;
7620
7621         case 's':
7622           switch (name[1])
7623           {
7624             case 'a':
7625               if (name[2] == 'y')
7626               {                                   /* say        */
7627                 return (all_keywords || FEATURE_IS_ENABLED("say") ? KEY_say : 0);
7628               }
7629
7630               goto unknown;
7631
7632             case 'i':
7633               if (name[2] == 'n')
7634               {                                   /* sin        */
7635                 return -KEY_sin;
7636               }
7637
7638               goto unknown;
7639
7640             case 'u':
7641               if (name[2] == 'b')
7642               {                                   /* sub        */
7643                 return KEY_sub;
7644               }
7645
7646               goto unknown;
7647
7648             default:
7649               goto unknown;
7650           }
7651
7652         case 't':
7653           if (name[1] == 'i' &&
7654               name[2] == 'e')
7655           {                                       /* tie        */
7656             return KEY_tie;
7657           }
7658
7659           goto unknown;
7660
7661         case 'u':
7662           if (name[1] == 's' &&
7663               name[2] == 'e')
7664           {                                       /* use        */
7665             return KEY_use;
7666           }
7667
7668           goto unknown;
7669
7670         case 'v':
7671           if (name[1] == 'e' &&
7672               name[2] == 'c')
7673           {                                       /* vec        */
7674             return -KEY_vec;
7675           }
7676
7677           goto unknown;
7678
7679         case 'x':
7680           if (name[1] == 'o' &&
7681               name[2] == 'r')
7682           {                                       /* xor        */
7683             return -KEY_xor;
7684           }
7685
7686           goto unknown;
7687
7688         default:
7689           goto unknown;
7690       }
7691
7692     case 4: /* 41 tokens of length 4 */
7693       switch (name[0])
7694       {
7695         case 'C':
7696           if (name[1] == 'O' &&
7697               name[2] == 'R' &&
7698               name[3] == 'E')
7699           {                                       /* CORE       */
7700             return -KEY_CORE;
7701           }
7702
7703           goto unknown;
7704
7705         case 'I':
7706           if (name[1] == 'N' &&
7707               name[2] == 'I' &&
7708               name[3] == 'T')
7709           {                                       /* INIT       */
7710             return KEY_INIT;
7711           }
7712
7713           goto unknown;
7714
7715         case 'b':
7716           if (name[1] == 'i' &&
7717               name[2] == 'n' &&
7718               name[3] == 'd')
7719           {                                       /* bind       */
7720             return -KEY_bind;
7721           }
7722
7723           goto unknown;
7724
7725         case 'c':
7726           if (name[1] == 'h' &&
7727               name[2] == 'o' &&
7728               name[3] == 'p')
7729           {                                       /* chop       */
7730             return -KEY_chop;
7731           }
7732
7733           goto unknown;
7734
7735         case 'd':
7736           if (name[1] == 'u' &&
7737               name[2] == 'm' &&
7738               name[3] == 'p')
7739           {                                       /* dump       */
7740             return -KEY_dump;
7741           }
7742
7743           goto unknown;
7744
7745         case 'e':
7746           switch (name[1])
7747           {
7748             case 'a':
7749               if (name[2] == 'c' &&
7750                   name[3] == 'h')
7751               {                                   /* each       */
7752                 return -KEY_each;
7753               }
7754
7755               goto unknown;
7756
7757             case 'l':
7758               if (name[2] == 's' &&
7759                   name[3] == 'e')
7760               {                                   /* else       */
7761                 return KEY_else;
7762               }
7763
7764               goto unknown;
7765
7766             case 'v':
7767               if (name[2] == 'a' &&
7768                   name[3] == 'l')
7769               {                                   /* eval       */
7770                 return KEY_eval;
7771               }
7772
7773               goto unknown;
7774
7775             case 'x':
7776               switch (name[2])
7777               {
7778                 case 'e':
7779                   if (name[3] == 'c')
7780                   {                               /* exec       */
7781                     return -KEY_exec;
7782                   }
7783
7784                   goto unknown;
7785
7786                 case 'i':
7787                   if (name[3] == 't')
7788                   {                               /* exit       */
7789                     return -KEY_exit;
7790                   }
7791
7792                   goto unknown;
7793
7794                 default:
7795                   goto unknown;
7796               }
7797
7798             default:
7799               goto unknown;
7800           }
7801
7802         case 'f':
7803           if (name[1] == 'o' &&
7804               name[2] == 'r' &&
7805               name[3] == 'k')
7806           {                                       /* fork       */
7807             return -KEY_fork;
7808           }
7809
7810           goto unknown;
7811
7812         case 'g':
7813           switch (name[1])
7814           {
7815             case 'e':
7816               if (name[2] == 't' &&
7817                   name[3] == 'c')
7818               {                                   /* getc       */
7819                 return -KEY_getc;
7820               }
7821
7822               goto unknown;
7823
7824             case 'l':
7825               if (name[2] == 'o' &&
7826                   name[3] == 'b')
7827               {                                   /* glob       */
7828                 return KEY_glob;
7829               }
7830
7831               goto unknown;
7832
7833             case 'o':
7834               if (name[2] == 't' &&
7835                   name[3] == 'o')
7836               {                                   /* goto       */
7837                 return KEY_goto;
7838               }
7839
7840               goto unknown;
7841
7842             case 'r':
7843               if (name[2] == 'e' &&
7844                   name[3] == 'p')
7845               {                                   /* grep       */
7846                 return KEY_grep;
7847               }
7848
7849               goto unknown;
7850
7851             default:
7852               goto unknown;
7853           }
7854
7855         case 'j':
7856           if (name[1] == 'o' &&
7857               name[2] == 'i' &&
7858               name[3] == 'n')
7859           {                                       /* join       */
7860             return -KEY_join;
7861           }
7862
7863           goto unknown;
7864
7865         case 'k':
7866           switch (name[1])
7867           {
7868             case 'e':
7869               if (name[2] == 'y' &&
7870                   name[3] == 's')
7871               {                                   /* keys       */
7872                 return -KEY_keys;
7873               }
7874
7875               goto unknown;
7876
7877             case 'i':
7878               if (name[2] == 'l' &&
7879                   name[3] == 'l')
7880               {                                   /* kill       */
7881                 return -KEY_kill;
7882               }
7883
7884               goto unknown;
7885
7886             default:
7887               goto unknown;
7888           }
7889
7890         case 'l':
7891           switch (name[1])
7892           {
7893             case 'a':
7894               if (name[2] == 's' &&
7895                   name[3] == 't')
7896               {                                   /* last       */
7897                 return KEY_last;
7898               }
7899
7900               goto unknown;
7901
7902             case 'i':
7903               if (name[2] == 'n' &&
7904                   name[3] == 'k')
7905               {                                   /* link       */
7906                 return -KEY_link;
7907               }
7908
7909               goto unknown;
7910
7911             case 'o':
7912               if (name[2] == 'c' &&
7913                   name[3] == 'k')
7914               {                                   /* lock       */
7915                 return -KEY_lock;
7916               }
7917
7918               goto unknown;
7919
7920             default:
7921               goto unknown;
7922           }
7923
7924         case 'n':
7925           if (name[1] == 'e' &&
7926               name[2] == 'x' &&
7927               name[3] == 't')
7928           {                                       /* next       */
7929             return KEY_next;
7930           }
7931
7932           goto unknown;
7933
7934         case 'o':
7935           if (name[1] == 'p' &&
7936               name[2] == 'e' &&
7937               name[3] == 'n')
7938           {                                       /* open       */
7939             return -KEY_open;
7940           }
7941
7942           goto unknown;
7943
7944         case 'p':
7945           switch (name[1])
7946           {
7947             case 'a':
7948               if (name[2] == 'c' &&
7949                   name[3] == 'k')
7950               {                                   /* pack       */
7951                 return -KEY_pack;
7952               }
7953
7954               goto unknown;
7955
7956             case 'i':
7957               if (name[2] == 'p' &&
7958                   name[3] == 'e')
7959               {                                   /* pipe       */
7960                 return -KEY_pipe;
7961               }
7962
7963               goto unknown;
7964
7965             case 'u':
7966               if (name[2] == 's' &&
7967                   name[3] == 'h')
7968               {                                   /* push       */
7969                 return -KEY_push;
7970               }
7971
7972               goto unknown;
7973
7974             default:
7975               goto unknown;
7976           }
7977
7978         case 'r':
7979           switch (name[1])
7980           {
7981             case 'a':
7982               if (name[2] == 'n' &&
7983                   name[3] == 'd')
7984               {                                   /* rand       */
7985                 return -KEY_rand;
7986               }
7987
7988               goto unknown;
7989
7990             case 'e':
7991               switch (name[2])
7992               {
7993                 case 'a':
7994                   if (name[3] == 'd')
7995                   {                               /* read       */
7996                     return -KEY_read;
7997                   }
7998
7999                   goto unknown;
8000
8001                 case 'c':
8002                   if (name[3] == 'v')
8003                   {                               /* recv       */
8004                     return -KEY_recv;
8005                   }
8006
8007                   goto unknown;
8008
8009                 case 'd':
8010                   if (name[3] == 'o')
8011                   {                               /* redo       */
8012                     return KEY_redo;
8013                   }
8014
8015                   goto unknown;
8016
8017                 default:
8018                   goto unknown;
8019               }
8020
8021             default:
8022               goto unknown;
8023           }
8024
8025         case 's':
8026           switch (name[1])
8027           {
8028             case 'e':
8029               switch (name[2])
8030               {
8031                 case 'e':
8032                   if (name[3] == 'k')
8033                   {                               /* seek       */
8034                     return -KEY_seek;
8035                   }
8036
8037                   goto unknown;
8038
8039                 case 'n':
8040                   if (name[3] == 'd')
8041                   {                               /* send       */
8042                     return -KEY_send;
8043                   }
8044
8045                   goto unknown;
8046
8047                 default:
8048                   goto unknown;
8049               }
8050
8051             case 'o':
8052               if (name[2] == 'r' &&
8053                   name[3] == 't')
8054               {                                   /* sort       */
8055                 return KEY_sort;
8056               }
8057
8058               goto unknown;
8059
8060             case 'q':
8061               if (name[2] == 'r' &&
8062                   name[3] == 't')
8063               {                                   /* sqrt       */
8064                 return -KEY_sqrt;
8065               }
8066
8067               goto unknown;
8068
8069             case 't':
8070               if (name[2] == 'a' &&
8071                   name[3] == 't')
8072               {                                   /* stat       */
8073                 return -KEY_stat;
8074               }
8075
8076               goto unknown;
8077
8078             default:
8079               goto unknown;
8080           }
8081
8082         case 't':
8083           switch (name[1])
8084           {
8085             case 'e':
8086               if (name[2] == 'l' &&
8087                   name[3] == 'l')
8088               {                                   /* tell       */
8089                 return -KEY_tell;
8090               }
8091
8092               goto unknown;
8093
8094             case 'i':
8095               switch (name[2])
8096               {
8097                 case 'e':
8098                   if (name[3] == 'd')
8099                   {                               /* tied       */
8100                     return KEY_tied;
8101                   }
8102
8103                   goto unknown;
8104
8105                 case 'm':
8106                   if (name[3] == 'e')
8107                   {                               /* time       */
8108                     return -KEY_time;
8109                   }
8110
8111                   goto unknown;
8112
8113                 default:
8114                   goto unknown;
8115               }
8116
8117             default:
8118               goto unknown;
8119           }
8120
8121         case 'w':
8122           switch (name[1])
8123           {
8124             case 'a':
8125               switch (name[2])
8126               {
8127                 case 'i':
8128                   if (name[3] == 't')
8129                   {                               /* wait       */
8130                     return -KEY_wait;
8131                   }
8132
8133                   goto unknown;
8134
8135                 case 'r':
8136                   if (name[3] == 'n')
8137                   {                               /* warn       */
8138                     return -KEY_warn;
8139                   }
8140
8141                   goto unknown;
8142
8143                 default:
8144                   goto unknown;
8145               }
8146
8147             case 'h':
8148               if (name[2] == 'e' &&
8149                   name[3] == 'n')
8150               {                                   /* when       */
8151                 return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_when : 0);
8152               }
8153
8154               goto unknown;
8155
8156             default:
8157               goto unknown;
8158           }
8159
8160         default:
8161           goto unknown;
8162       }
8163
8164     case 5: /* 39 tokens of length 5 */
8165       switch (name[0])
8166       {
8167         case 'B':
8168           if (name[1] == 'E' &&
8169               name[2] == 'G' &&
8170               name[3] == 'I' &&
8171               name[4] == 'N')
8172           {                                       /* BEGIN      */
8173             return KEY_BEGIN;
8174           }
8175
8176           goto unknown;
8177
8178         case 'C':
8179           if (name[1] == 'H' &&
8180               name[2] == 'E' &&
8181               name[3] == 'C' &&
8182               name[4] == 'K')
8183           {                                       /* CHECK      */
8184             return KEY_CHECK;
8185           }
8186
8187           goto unknown;
8188
8189         case 'a':
8190           switch (name[1])
8191           {
8192             case 'l':
8193               if (name[2] == 'a' &&
8194                   name[3] == 'r' &&
8195                   name[4] == 'm')
8196               {                                   /* alarm      */
8197                 return -KEY_alarm;
8198               }
8199
8200               goto unknown;
8201
8202             case 't':
8203               if (name[2] == 'a' &&
8204                   name[3] == 'n' &&
8205                   name[4] == '2')
8206               {                                   /* atan2      */
8207                 return -KEY_atan2;
8208               }
8209
8210               goto unknown;
8211
8212             default:
8213               goto unknown;
8214           }
8215
8216         case 'b':
8217           switch (name[1])
8218           {
8219             case 'l':
8220               if (name[2] == 'e' &&
8221                   name[3] == 's' &&
8222                   name[4] == 's')
8223               {                                   /* bless      */
8224                 return -KEY_bless;
8225               }
8226
8227               goto unknown;
8228
8229             case 'r':
8230               if (name[2] == 'e' &&
8231                   name[3] == 'a' &&
8232                   name[4] == 'k')
8233               {                                   /* break      */
8234                 return (all_keywords || FEATURE_IS_ENABLED("switch") ? -KEY_break : 0);
8235               }
8236
8237               goto unknown;
8238
8239             default:
8240               goto unknown;
8241           }
8242
8243         case 'c':
8244           switch (name[1])
8245           {
8246             case 'h':
8247               switch (name[2])
8248               {
8249                 case 'd':
8250                   if (name[3] == 'i' &&
8251                       name[4] == 'r')
8252                   {                               /* chdir      */
8253                     return -KEY_chdir;
8254                   }
8255
8256                   goto unknown;
8257
8258                 case 'm':
8259                   if (name[3] == 'o' &&
8260                       name[4] == 'd')
8261                   {                               /* chmod      */
8262                     return -KEY_chmod;
8263                   }
8264
8265                   goto unknown;
8266
8267                 case 'o':
8268                   switch (name[3])
8269                   {
8270                     case 'm':
8271                       if (name[4] == 'p')
8272                       {                           /* chomp      */
8273                         return -KEY_chomp;
8274                       }
8275
8276                       goto unknown;
8277
8278                     case 'w':
8279                       if (name[4] == 'n')
8280                       {                           /* chown      */
8281                         return -KEY_chown;
8282                       }
8283
8284                       goto unknown;
8285
8286                     default:
8287                       goto unknown;
8288                   }
8289
8290                 default:
8291                   goto unknown;
8292               }
8293
8294             case 'l':
8295               if (name[2] == 'o' &&
8296                   name[3] == 's' &&
8297                   name[4] == 'e')
8298               {                                   /* close      */
8299                 return -KEY_close;
8300               }
8301
8302               goto unknown;
8303
8304             case 'r':
8305               if (name[2] == 'y' &&
8306                   name[3] == 'p' &&
8307                   name[4] == 't')
8308               {                                   /* crypt      */
8309                 return -KEY_crypt;
8310               }
8311
8312               goto unknown;
8313
8314             default:
8315               goto unknown;
8316           }
8317
8318         case 'e':
8319           if (name[1] == 'l' &&
8320               name[2] == 's' &&
8321               name[3] == 'i' &&
8322               name[4] == 'f')
8323           {                                       /* elsif      */
8324             return KEY_elsif;
8325           }
8326
8327           goto unknown;
8328
8329         case 'f':
8330           switch (name[1])
8331           {
8332             case 'c':
8333               if (name[2] == 'n' &&
8334                   name[3] == 't' &&
8335                   name[4] == 'l')
8336               {                                   /* fcntl      */
8337                 return -KEY_fcntl;
8338               }
8339
8340               goto unknown;
8341
8342             case 'l':
8343               if (name[2] == 'o' &&
8344                   name[3] == 'c' &&
8345                   name[4] == 'k')
8346               {                                   /* flock      */
8347                 return -KEY_flock;
8348               }
8349
8350               goto unknown;
8351
8352             default:
8353               goto unknown;
8354           }
8355
8356         case 'g':
8357           if (name[1] == 'i' &&
8358               name[2] == 'v' &&
8359               name[3] == 'e' &&
8360               name[4] == 'n')
8361           {                                       /* given      */
8362             return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_given : 0);
8363           }
8364
8365           goto unknown;
8366
8367         case 'i':
8368           switch (name[1])
8369           {
8370             case 'n':
8371               if (name[2] == 'd' &&
8372                   name[3] == 'e' &&
8373                   name[4] == 'x')
8374               {                                   /* index      */
8375                 return -KEY_index;
8376               }
8377
8378               goto unknown;
8379
8380             case 'o':
8381               if (name[2] == 'c' &&
8382                   name[3] == 't' &&
8383                   name[4] == 'l')
8384               {                                   /* ioctl      */
8385                 return -KEY_ioctl;
8386               }
8387
8388               goto unknown;
8389
8390             default:
8391               goto unknown;
8392           }
8393
8394         case 'l':
8395           switch (name[1])
8396           {
8397             case 'o':
8398               if (name[2] == 'c' &&
8399                   name[3] == 'a' &&
8400                   name[4] == 'l')
8401               {                                   /* local      */
8402                 return KEY_local;
8403               }
8404
8405               goto unknown;
8406
8407             case 's':
8408               if (name[2] == 't' &&
8409                   name[3] == 'a' &&
8410                   name[4] == 't')
8411               {                                   /* lstat      */
8412                 return -KEY_lstat;
8413               }
8414
8415               goto unknown;
8416
8417             default:
8418               goto unknown;
8419           }
8420
8421         case 'm':
8422           if (name[1] == 'k' &&
8423               name[2] == 'd' &&
8424               name[3] == 'i' &&
8425               name[4] == 'r')
8426           {                                       /* mkdir      */
8427             return -KEY_mkdir;
8428           }
8429
8430           goto unknown;
8431
8432         case 'p':
8433           if (name[1] == 'r' &&
8434               name[2] == 'i' &&
8435               name[3] == 'n' &&
8436               name[4] == 't')
8437           {                                       /* print      */
8438             return KEY_print;
8439           }
8440
8441           goto unknown;
8442
8443         case 'r':
8444           switch (name[1])
8445           {
8446             case 'e':
8447               if (name[2] == 's' &&
8448                   name[3] == 'e' &&
8449                   name[4] == 't')
8450               {                                   /* reset      */
8451                 return -KEY_reset;
8452               }
8453
8454               goto unknown;
8455
8456             case 'm':
8457               if (name[2] == 'd' &&
8458                   name[3] == 'i' &&
8459                   name[4] == 'r')
8460               {                                   /* rmdir      */
8461                 return -KEY_rmdir;
8462               }
8463
8464               goto unknown;
8465
8466             default:
8467               goto unknown;
8468           }
8469
8470         case 's':
8471           switch (name[1])
8472           {
8473             case 'e':
8474               if (name[2] == 'm' &&
8475                   name[3] == 'o' &&
8476                   name[4] == 'p')
8477               {                                   /* semop      */
8478                 return -KEY_semop;
8479               }
8480
8481               goto unknown;
8482
8483             case 'h':
8484               if (name[2] == 'i' &&
8485                   name[3] == 'f' &&
8486                   name[4] == 't')
8487               {                                   /* shift      */
8488                 return -KEY_shift;
8489               }
8490
8491               goto unknown;
8492
8493             case 'l':
8494               if (name[2] == 'e' &&
8495                   name[3] == 'e' &&
8496                   name[4] == 'p')
8497               {                                   /* sleep      */
8498                 return -KEY_sleep;
8499               }
8500
8501               goto unknown;
8502
8503             case 'p':
8504               if (name[2] == 'l' &&
8505                   name[3] == 'i' &&
8506                   name[4] == 't')
8507               {                                   /* split      */
8508                 return KEY_split;
8509               }
8510
8511               goto unknown;
8512
8513             case 'r':
8514               if (name[2] == 'a' &&
8515                   name[3] == 'n' &&
8516                   name[4] == 'd')
8517               {                                   /* srand      */
8518                 return -KEY_srand;
8519               }
8520
8521               goto unknown;
8522
8523             case 't':
8524               switch (name[2])
8525               {
8526                 case 'a':
8527                   if (name[3] == 't' &&
8528                       name[4] == 'e')
8529                   {                               /* state      */
8530                     return (all_keywords || FEATURE_IS_ENABLED("state") ? KEY_state : 0);
8531                   }
8532
8533                   goto unknown;
8534
8535                 case 'u':
8536                   if (name[3] == 'd' &&
8537                       name[4] == 'y')
8538                   {                               /* study      */
8539                     return KEY_study;
8540                   }
8541
8542                   goto unknown;
8543
8544                 default:
8545                   goto unknown;
8546               }
8547
8548             default:
8549               goto unknown;
8550           }
8551
8552         case 't':
8553           if (name[1] == 'i' &&
8554               name[2] == 'm' &&
8555               name[3] == 'e' &&
8556               name[4] == 's')
8557           {                                       /* times      */
8558             return -KEY_times;
8559           }
8560
8561           goto unknown;
8562
8563         case 'u':
8564           switch (name[1])
8565           {
8566             case 'm':
8567               if (name[2] == 'a' &&
8568                   name[3] == 's' &&
8569                   name[4] == 'k')
8570               {                                   /* umask      */
8571                 return -KEY_umask;
8572               }
8573
8574               goto unknown;
8575
8576             case 'n':
8577               switch (name[2])
8578               {
8579                 case 'd':
8580                   if (name[3] == 'e' &&
8581                       name[4] == 'f')
8582                   {                               /* undef      */
8583                     return KEY_undef;
8584                   }
8585
8586                   goto unknown;
8587
8588                 case 't':
8589                   if (name[3] == 'i')
8590                   {
8591                     switch (name[4])
8592                     {
8593                       case 'e':
8594                         {                         /* untie      */
8595                           return KEY_untie;
8596                         }
8597
8598                       case 'l':
8599                         {                         /* until      */
8600                           return KEY_until;
8601                         }
8602
8603                       default:
8604                         goto unknown;
8605                     }
8606                   }
8607
8608                   goto unknown;
8609
8610                 default:
8611                   goto unknown;
8612               }
8613
8614             case 't':
8615               if (name[2] == 'i' &&
8616                   name[3] == 'm' &&
8617                   name[4] == 'e')
8618               {                                   /* utime      */
8619                 return -KEY_utime;
8620               }
8621
8622               goto unknown;
8623
8624             default:
8625               goto unknown;
8626           }
8627
8628         case 'w':
8629           switch (name[1])
8630           {
8631             case 'h':
8632               if (name[2] == 'i' &&
8633                   name[3] == 'l' &&
8634                   name[4] == 'e')
8635               {                                   /* while      */
8636                 return KEY_while;
8637               }
8638
8639               goto unknown;
8640
8641             case 'r':
8642               if (name[2] == 'i' &&
8643                   name[3] == 't' &&
8644                   name[4] == 'e')
8645               {                                   /* write      */
8646                 return -KEY_write;
8647               }
8648
8649               goto unknown;
8650
8651             default:
8652               goto unknown;
8653           }
8654
8655         default:
8656           goto unknown;
8657       }
8658
8659     case 6: /* 33 tokens of length 6 */
8660       switch (name[0])
8661       {
8662         case 'a':
8663           if (name[1] == 'c' &&
8664               name[2] == 'c' &&
8665               name[3] == 'e' &&
8666               name[4] == 'p' &&
8667               name[5] == 't')
8668           {                                       /* accept     */
8669             return -KEY_accept;
8670           }
8671
8672           goto unknown;
8673
8674         case 'c':
8675           switch (name[1])
8676           {
8677             case 'a':
8678               if (name[2] == 'l' &&
8679                   name[3] == 'l' &&
8680                   name[4] == 'e' &&
8681                   name[5] == 'r')
8682               {                                   /* caller     */
8683                 return -KEY_caller;
8684               }
8685
8686               goto unknown;
8687
8688             case 'h':
8689               if (name[2] == 'r' &&
8690                   name[3] == 'o' &&
8691                   name[4] == 'o' &&
8692                   name[5] == 't')
8693               {                                   /* chroot     */
8694                 return -KEY_chroot;
8695               }
8696
8697               goto unknown;
8698
8699             default:
8700               goto unknown;
8701           }
8702
8703         case 'd':
8704           if (name[1] == 'e' &&
8705               name[2] == 'l' &&
8706               name[3] == 'e' &&
8707               name[4] == 't' &&
8708               name[5] == 'e')
8709           {                                       /* delete     */
8710             return KEY_delete;
8711           }
8712
8713           goto unknown;
8714
8715         case 'e':
8716           switch (name[1])
8717           {
8718             case 'l':
8719               if (name[2] == 's' &&
8720                   name[3] == 'e' &&
8721                   name[4] == 'i' &&
8722                   name[5] == 'f')
8723               {                                   /* elseif     */
8724                 if(ckWARN_d(WARN_SYNTAX))
8725                   Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "elseif should be elsif");
8726               }
8727
8728               goto unknown;
8729
8730             case 'x':
8731               if (name[2] == 'i' &&
8732                   name[3] == 's' &&
8733                   name[4] == 't' &&
8734                   name[5] == 's')
8735               {                                   /* exists     */
8736                 return KEY_exists;
8737               }
8738
8739               goto unknown;
8740
8741             default:
8742               goto unknown;
8743           }
8744
8745         case 'f':
8746           switch (name[1])
8747           {
8748             case 'i':
8749               if (name[2] == 'l' &&
8750                   name[3] == 'e' &&
8751                   name[4] == 'n' &&
8752                   name[5] == 'o')
8753               {                                   /* fileno     */
8754                 return -KEY_fileno;
8755               }
8756
8757               goto unknown;
8758
8759             case 'o':
8760               if (name[2] == 'r' &&
8761                   name[3] == 'm' &&
8762                   name[4] == 'a' &&
8763                   name[5] == 't')
8764               {                                   /* format     */
8765                 return KEY_format;
8766               }
8767
8768               goto unknown;
8769
8770             default:
8771               goto unknown;
8772           }
8773
8774         case 'g':
8775           if (name[1] == 'm' &&
8776               name[2] == 't' &&
8777               name[3] == 'i' &&
8778               name[4] == 'm' &&
8779               name[5] == 'e')
8780           {                                       /* gmtime     */
8781             return -KEY_gmtime;
8782           }
8783
8784           goto unknown;
8785
8786         case 'l':
8787           switch (name[1])
8788           {
8789             case 'e':
8790               if (name[2] == 'n' &&
8791                   name[3] == 'g' &&
8792                   name[4] == 't' &&
8793                   name[5] == 'h')
8794               {                                   /* length     */
8795                 return -KEY_length;
8796               }
8797
8798               goto unknown;
8799
8800             case 'i':
8801               if (name[2] == 's' &&
8802                   name[3] == 't' &&
8803                   name[4] == 'e' &&
8804                   name[5] == 'n')
8805               {                                   /* listen     */
8806                 return -KEY_listen;
8807               }
8808
8809               goto unknown;
8810
8811             default:
8812               goto unknown;
8813           }
8814
8815         case 'm':
8816           if (name[1] == 's' &&
8817               name[2] == 'g')
8818           {
8819             switch (name[3])
8820             {
8821               case 'c':
8822                 if (name[4] == 't' &&
8823                     name[5] == 'l')
8824                 {                                 /* msgctl     */
8825                   return -KEY_msgctl;
8826                 }
8827
8828                 goto unknown;
8829
8830               case 'g':
8831                 if (name[4] == 'e' &&
8832                     name[5] == 't')
8833                 {                                 /* msgget     */
8834                   return -KEY_msgget;
8835                 }
8836
8837                 goto unknown;
8838
8839               case 'r':
8840                 if (name[4] == 'c' &&
8841                     name[5] == 'v')
8842                 {                                 /* msgrcv     */
8843                   return -KEY_msgrcv;
8844                 }
8845
8846                 goto unknown;
8847
8848               case 's':
8849                 if (name[4] == 'n' &&
8850                     name[5] == 'd')
8851                 {                                 /* msgsnd     */
8852                   return -KEY_msgsnd;
8853                 }
8854
8855                 goto unknown;
8856
8857               default:
8858                 goto unknown;
8859             }
8860           }
8861
8862           goto unknown;
8863
8864         case 'p':
8865           if (name[1] == 'r' &&
8866               name[2] == 'i' &&
8867               name[3] == 'n' &&
8868               name[4] == 't' &&
8869               name[5] == 'f')
8870           {                                       /* printf     */
8871             return KEY_printf;
8872           }
8873
8874           goto unknown;
8875
8876         case 'r':
8877           switch (name[1])
8878           {
8879             case 'e':
8880               switch (name[2])
8881               {
8882                 case 'n':
8883                   if (name[3] == 'a' &&
8884                       name[4] == 'm' &&
8885                       name[5] == 'e')
8886                   {                               /* rename     */
8887                     return -KEY_rename;
8888                   }
8889
8890                   goto unknown;
8891
8892                 case 't':
8893                   if (name[3] == 'u' &&
8894                       name[4] == 'r' &&
8895                       name[5] == 'n')
8896                   {                               /* return     */
8897                     return KEY_return;
8898                   }
8899
8900                   goto unknown;
8901
8902                 default:
8903                   goto unknown;
8904               }
8905
8906             case 'i':
8907               if (name[2] == 'n' &&
8908                   name[3] == 'd' &&
8909                   name[4] == 'e' &&
8910                   name[5] == 'x')
8911               {                                   /* rindex     */
8912                 return -KEY_rindex;
8913               }
8914
8915               goto unknown;
8916
8917             default:
8918               goto unknown;
8919           }
8920
8921         case 's':
8922           switch (name[1])
8923           {
8924             case 'c':
8925               if (name[2] == 'a' &&
8926                   name[3] == 'l' &&
8927                   name[4] == 'a' &&
8928                   name[5] == 'r')
8929               {                                   /* scalar     */
8930                 return KEY_scalar;
8931               }
8932
8933               goto unknown;
8934
8935             case 'e':
8936               switch (name[2])
8937               {
8938                 case 'l':
8939                   if (name[3] == 'e' &&
8940                       name[4] == 'c' &&
8941                       name[5] == 't')
8942                   {                               /* select     */
8943                     return -KEY_select;
8944                   }
8945
8946                   goto unknown;
8947
8948                 case 'm':
8949                   switch (name[3])
8950                   {
8951                     case 'c':
8952                       if (name[4] == 't' &&
8953                           name[5] == 'l')
8954                       {                           /* semctl     */
8955                         return -KEY_semctl;
8956                       }
8957
8958                       goto unknown;
8959
8960                     case 'g':
8961                       if (name[4] == 'e' &&
8962                           name[5] == 't')
8963                       {                           /* semget     */
8964                         return -KEY_semget;
8965                       }
8966
8967                       goto unknown;
8968
8969                     default:
8970                       goto unknown;
8971                   }
8972
8973                 default:
8974                   goto unknown;
8975               }
8976
8977             case 'h':
8978               if (name[2] == 'm')
8979               {
8980                 switch (name[3])
8981                 {
8982                   case 'c':
8983                     if (name[4] == 't' &&
8984                         name[5] == 'l')
8985                     {                             /* shmctl     */
8986                       return -KEY_shmctl;
8987                     }
8988
8989                     goto unknown;
8990
8991                   case 'g':
8992                     if (name[4] == 'e' &&
8993                         name[5] == 't')
8994                     {                             /* shmget     */
8995                       return -KEY_shmget;
8996                     }
8997
8998                     goto unknown;
8999
9000                   default:
9001                     goto unknown;
9002                 }
9003               }
9004
9005               goto unknown;
9006
9007             case 'o':
9008               if (name[2] == 'c' &&
9009                   name[3] == 'k' &&
9010                   name[4] == 'e' &&
9011                   name[5] == 't')
9012               {                                   /* socket     */
9013                 return -KEY_socket;
9014               }
9015
9016               goto unknown;
9017
9018             case 'p':
9019               if (name[2] == 'l' &&
9020                   name[3] == 'i' &&
9021                   name[4] == 'c' &&
9022                   name[5] == 'e')
9023               {                                   /* splice     */
9024                 return -KEY_splice;
9025               }
9026
9027               goto unknown;
9028
9029             case 'u':
9030               if (name[2] == 'b' &&
9031                   name[3] == 's' &&
9032                   name[4] == 't' &&
9033                   name[5] == 'r')
9034               {                                   /* substr     */
9035                 return -KEY_substr;
9036               }
9037
9038               goto unknown;
9039
9040             case 'y':
9041               if (name[2] == 's' &&
9042                   name[3] == 't' &&
9043                   name[4] == 'e' &&
9044                   name[5] == 'm')
9045               {                                   /* system     */
9046                 return -KEY_system;
9047               }
9048
9049               goto unknown;
9050
9051             default:
9052               goto unknown;
9053           }
9054
9055         case 'u':
9056           if (name[1] == 'n')
9057           {
9058             switch (name[2])
9059             {
9060               case 'l':
9061                 switch (name[3])
9062                 {
9063                   case 'e':
9064                     if (name[4] == 's' &&
9065                         name[5] == 's')
9066                     {                             /* unless     */
9067                       return KEY_unless;
9068                     }
9069
9070                     goto unknown;
9071
9072                   case 'i':
9073                     if (name[4] == 'n' &&
9074                         name[5] == 'k')
9075                     {                             /* unlink     */
9076                       return -KEY_unlink;
9077                     }
9078
9079                     goto unknown;
9080
9081                   default:
9082                     goto unknown;
9083                 }
9084
9085               case 'p':
9086                 if (name[3] == 'a' &&
9087                     name[4] == 'c' &&
9088                     name[5] == 'k')
9089                 {                                 /* unpack     */
9090                   return -KEY_unpack;
9091                 }
9092
9093                 goto unknown;
9094
9095               default:
9096                 goto unknown;
9097             }
9098           }
9099
9100           goto unknown;
9101
9102         case 'v':
9103           if (name[1] == 'a' &&
9104               name[2] == 'l' &&
9105               name[3] == 'u' &&
9106               name[4] == 'e' &&
9107               name[5] == 's')
9108           {                                       /* values     */
9109             return -KEY_values;
9110           }
9111
9112           goto unknown;
9113
9114         default:
9115           goto unknown;
9116       }
9117
9118     case 7: /* 29 tokens of length 7 */
9119       switch (name[0])
9120       {
9121         case 'D':
9122           if (name[1] == 'E' &&
9123               name[2] == 'S' &&
9124               name[3] == 'T' &&
9125               name[4] == 'R' &&
9126               name[5] == 'O' &&
9127               name[6] == 'Y')
9128           {                                       /* DESTROY    */
9129             return KEY_DESTROY;
9130           }
9131
9132           goto unknown;
9133
9134         case '_':
9135           if (name[1] == '_' &&
9136               name[2] == 'E' &&
9137               name[3] == 'N' &&
9138               name[4] == 'D' &&
9139               name[5] == '_' &&
9140               name[6] == '_')
9141           {                                       /* __END__    */
9142             return KEY___END__;
9143           }
9144
9145           goto unknown;
9146
9147         case 'b':
9148           if (name[1] == 'i' &&
9149               name[2] == 'n' &&
9150               name[3] == 'm' &&
9151               name[4] == 'o' &&
9152               name[5] == 'd' &&
9153               name[6] == 'e')
9154           {                                       /* binmode    */
9155             return -KEY_binmode;
9156           }
9157
9158           goto unknown;
9159
9160         case 'c':
9161           if (name[1] == 'o' &&
9162               name[2] == 'n' &&
9163               name[3] == 'n' &&
9164               name[4] == 'e' &&
9165               name[5] == 'c' &&
9166               name[6] == 't')
9167           {                                       /* connect    */
9168             return -KEY_connect;
9169           }
9170
9171           goto unknown;
9172
9173         case 'd':
9174           switch (name[1])
9175           {
9176             case 'b':
9177               if (name[2] == 'm' &&
9178                   name[3] == 'o' &&
9179                   name[4] == 'p' &&
9180                   name[5] == 'e' &&
9181                   name[6] == 'n')
9182               {                                   /* dbmopen    */
9183                 return -KEY_dbmopen;
9184               }
9185
9186               goto unknown;
9187
9188             case 'e':
9189               if (name[2] == 'f')
9190               {
9191                 switch (name[3])
9192                 {
9193                   case 'a':
9194                     if (name[4] == 'u' &&
9195                         name[5] == 'l' &&
9196                         name[6] == 't')
9197                     {                             /* default    */
9198                       return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_default : 0);
9199                     }
9200
9201                     goto unknown;
9202
9203                   case 'i':
9204                     if (name[4] == 'n' &&
9205                         name[5] == 'e' &&
9206                         name[6] == 'd')
9207                     {                             /* defined    */
9208                       return KEY_defined;
9209                     }
9210
9211                     goto unknown;
9212
9213                   default:
9214                     goto unknown;
9215                 }
9216               }
9217
9218               goto unknown;
9219
9220             default:
9221               goto unknown;
9222           }
9223
9224         case 'f':
9225           if (name[1] == 'o' &&
9226               name[2] == 'r' &&
9227               name[3] == 'e' &&
9228               name[4] == 'a' &&
9229               name[5] == 'c' &&
9230               name[6] == 'h')
9231           {                                       /* foreach    */
9232             return KEY_foreach;
9233           }
9234
9235           goto unknown;
9236
9237         case 'g':
9238           if (name[1] == 'e' &&
9239               name[2] == 't' &&
9240               name[3] == 'p')
9241           {
9242             switch (name[4])
9243             {
9244               case 'g':
9245                 if (name[5] == 'r' &&
9246                     name[6] == 'p')
9247                 {                                 /* getpgrp    */
9248                   return -KEY_getpgrp;
9249                 }
9250
9251                 goto unknown;
9252
9253               case 'p':
9254                 if (name[5] == 'i' &&
9255                     name[6] == 'd')
9256                 {                                 /* getppid    */
9257                   return -KEY_getppid;
9258                 }
9259
9260                 goto unknown;
9261
9262               default:
9263                 goto unknown;
9264             }
9265           }
9266
9267           goto unknown;
9268
9269         case 'l':
9270           if (name[1] == 'c' &&
9271               name[2] == 'f' &&
9272               name[3] == 'i' &&
9273               name[4] == 'r' &&
9274               name[5] == 's' &&
9275               name[6] == 't')
9276           {                                       /* lcfirst    */
9277             return -KEY_lcfirst;
9278           }
9279
9280           goto unknown;
9281
9282         case 'o':
9283           if (name[1] == 'p' &&
9284               name[2] == 'e' &&
9285               name[3] == 'n' &&
9286               name[4] == 'd' &&
9287               name[5] == 'i' &&
9288               name[6] == 'r')
9289           {                                       /* opendir    */
9290             return -KEY_opendir;
9291           }
9292
9293           goto unknown;
9294
9295         case 'p':
9296           if (name[1] == 'a' &&
9297               name[2] == 'c' &&
9298               name[3] == 'k' &&
9299               name[4] == 'a' &&
9300               name[5] == 'g' &&
9301               name[6] == 'e')
9302           {                                       /* package    */
9303             return KEY_package;
9304           }
9305
9306           goto unknown;
9307
9308         case 'r':
9309           if (name[1] == 'e')
9310           {
9311             switch (name[2])
9312             {
9313               case 'a':
9314                 if (name[3] == 'd' &&
9315                     name[4] == 'd' &&
9316                     name[5] == 'i' &&
9317                     name[6] == 'r')
9318                 {                                 /* readdir    */
9319                   return -KEY_readdir;
9320                 }
9321
9322                 goto unknown;
9323
9324               case 'q':
9325                 if (name[3] == 'u' &&
9326                     name[4] == 'i' &&
9327                     name[5] == 'r' &&
9328                     name[6] == 'e')
9329                 {                                 /* require    */
9330                   return KEY_require;
9331                 }
9332
9333                 goto unknown;
9334
9335               case 'v':
9336                 if (name[3] == 'e' &&
9337                     name[4] == 'r' &&
9338                     name[5] == 's' &&
9339                     name[6] == 'e')
9340                 {                                 /* reverse    */
9341                   return -KEY_reverse;
9342                 }
9343
9344                 goto unknown;
9345
9346               default:
9347                 goto unknown;
9348             }
9349           }
9350
9351           goto unknown;
9352
9353         case 's':
9354           switch (name[1])
9355           {
9356             case 'e':
9357               switch (name[2])
9358               {
9359                 case 'e':
9360                   if (name[3] == 'k' &&
9361                       name[4] == 'd' &&
9362                       name[5] == 'i' &&
9363                       name[6] == 'r')
9364                   {                               /* seekdir    */
9365                     return -KEY_seekdir;
9366                   }
9367
9368                   goto unknown;
9369
9370                 case 't':
9371                   if (name[3] == 'p' &&
9372                       name[4] == 'g' &&
9373                       name[5] == 'r' &&
9374                       name[6] == 'p')
9375                   {                               /* setpgrp    */
9376                     return -KEY_setpgrp;
9377                   }
9378
9379                   goto unknown;
9380
9381                 default:
9382                   goto unknown;
9383               }
9384
9385             case 'h':
9386               if (name[2] == 'm' &&
9387                   name[3] == 'r' &&
9388                   name[4] == 'e' &&
9389                   name[5] == 'a' &&
9390                   name[6] == 'd')
9391               {                                   /* shmread    */
9392                 return -KEY_shmread;
9393               }
9394
9395               goto unknown;
9396
9397             case 'p':
9398               if (name[2] == 'r' &&
9399                   name[3] == 'i' &&
9400                   name[4] == 'n' &&
9401                   name[5] == 't' &&
9402                   name[6] == 'f')
9403               {                                   /* sprintf    */
9404                 return -KEY_sprintf;
9405               }
9406
9407               goto unknown;
9408
9409             case 'y':
9410               switch (name[2])
9411               {
9412                 case 'm':
9413                   if (name[3] == 'l' &&
9414                       name[4] == 'i' &&
9415                       name[5] == 'n' &&
9416                       name[6] == 'k')
9417                   {                               /* symlink    */
9418                     return -KEY_symlink;
9419                   }
9420
9421                   goto unknown;
9422
9423                 case 's':
9424                   switch (name[3])
9425                   {
9426                     case 'c':
9427                       if (name[4] == 'a' &&
9428                           name[5] == 'l' &&
9429                           name[6] == 'l')
9430                       {                           /* syscall    */
9431                         return -KEY_syscall;
9432                       }
9433
9434                       goto unknown;
9435
9436                     case 'o':
9437                       if (name[4] == 'p' &&
9438                           name[5] == 'e' &&
9439                           name[6] == 'n')
9440                       {                           /* sysopen    */
9441                         return -KEY_sysopen;
9442                       }
9443
9444                       goto unknown;
9445
9446                     case 'r':
9447                       if (name[4] == 'e' &&
9448                           name[5] == 'a' &&
9449                           name[6] == 'd')
9450                       {                           /* sysread    */
9451                         return -KEY_sysread;
9452                       }
9453
9454                       goto unknown;
9455
9456                     case 's':
9457                       if (name[4] == 'e' &&
9458                           name[5] == 'e' &&
9459                           name[6] == 'k')
9460                       {                           /* sysseek    */
9461                         return -KEY_sysseek;
9462                       }
9463
9464                       goto unknown;
9465
9466                     default:
9467                       goto unknown;
9468                   }
9469
9470                 default:
9471                   goto unknown;
9472               }
9473
9474             default:
9475               goto unknown;
9476           }
9477
9478         case 't':
9479           if (name[1] == 'e' &&
9480               name[2] == 'l' &&
9481               name[3] == 'l' &&
9482               name[4] == 'd' &&
9483               name[5] == 'i' &&
9484               name[6] == 'r')
9485           {                                       /* telldir    */
9486             return -KEY_telldir;
9487           }
9488
9489           goto unknown;
9490
9491         case 'u':
9492           switch (name[1])
9493           {
9494             case 'c':
9495               if (name[2] == 'f' &&
9496                   name[3] == 'i' &&
9497                   name[4] == 'r' &&
9498                   name[5] == 's' &&
9499                   name[6] == 't')
9500               {                                   /* ucfirst    */
9501                 return -KEY_ucfirst;
9502               }
9503
9504               goto unknown;
9505
9506             case 'n':
9507               if (name[2] == 's' &&
9508                   name[3] == 'h' &&
9509                   name[4] == 'i' &&
9510                   name[5] == 'f' &&
9511                   name[6] == 't')
9512               {                                   /* unshift    */
9513                 return -KEY_unshift;
9514               }
9515
9516               goto unknown;
9517
9518             default:
9519               goto unknown;
9520           }
9521
9522         case 'w':
9523           if (name[1] == 'a' &&
9524               name[2] == 'i' &&
9525               name[3] == 't' &&
9526               name[4] == 'p' &&
9527               name[5] == 'i' &&
9528               name[6] == 'd')
9529           {                                       /* waitpid    */
9530             return -KEY_waitpid;
9531           }
9532
9533           goto unknown;
9534
9535         default:
9536           goto unknown;
9537       }
9538
9539     case 8: /* 26 tokens of length 8 */
9540       switch (name[0])
9541       {
9542         case 'A':
9543           if (name[1] == 'U' &&
9544               name[2] == 'T' &&
9545               name[3] == 'O' &&
9546               name[4] == 'L' &&
9547               name[5] == 'O' &&
9548               name[6] == 'A' &&
9549               name[7] == 'D')
9550           {                                       /* AUTOLOAD   */
9551             return KEY_AUTOLOAD;
9552           }
9553
9554           goto unknown;
9555
9556         case '_':
9557           if (name[1] == '_')
9558           {
9559             switch (name[2])
9560             {
9561               case 'D':
9562                 if (name[3] == 'A' &&
9563                     name[4] == 'T' &&
9564                     name[5] == 'A' &&
9565                     name[6] == '_' &&
9566                     name[7] == '_')
9567                 {                                 /* __DATA__   */
9568                   return KEY___DATA__;
9569                 }
9570
9571                 goto unknown;
9572
9573               case 'F':
9574                 if (name[3] == 'I' &&
9575                     name[4] == 'L' &&
9576                     name[5] == 'E' &&
9577                     name[6] == '_' &&
9578                     name[7] == '_')
9579                 {                                 /* __FILE__   */
9580                   return -KEY___FILE__;
9581                 }
9582
9583                 goto unknown;
9584
9585               case 'L':
9586                 if (name[3] == 'I' &&
9587                     name[4] == 'N' &&
9588                     name[5] == 'E' &&
9589                     name[6] == '_' &&
9590                     name[7] == '_')
9591                 {                                 /* __LINE__   */
9592                   return -KEY___LINE__;
9593                 }
9594
9595                 goto unknown;
9596
9597               default:
9598                 goto unknown;
9599             }
9600           }
9601
9602           goto unknown;
9603
9604         case 'c':
9605           switch (name[1])
9606           {
9607             case 'l':
9608               if (name[2] == 'o' &&
9609                   name[3] == 's' &&
9610                   name[4] == 'e' &&
9611                   name[5] == 'd' &&
9612                   name[6] == 'i' &&
9613                   name[7] == 'r')
9614               {                                   /* closedir   */
9615                 return -KEY_closedir;
9616               }
9617
9618               goto unknown;
9619
9620             case 'o':
9621               if (name[2] == 'n' &&
9622                   name[3] == 't' &&
9623                   name[4] == 'i' &&
9624                   name[5] == 'n' &&
9625                   name[6] == 'u' &&
9626                   name[7] == 'e')
9627               {                                   /* continue   */
9628                 return -KEY_continue;
9629               }
9630
9631               goto unknown;
9632
9633             default:
9634               goto unknown;
9635           }
9636
9637         case 'd':
9638           if (name[1] == 'b' &&
9639               name[2] == 'm' &&
9640               name[3] == 'c' &&
9641               name[4] == 'l' &&
9642               name[5] == 'o' &&
9643               name[6] == 's' &&
9644               name[7] == 'e')
9645           {                                       /* dbmclose   */
9646             return -KEY_dbmclose;
9647           }
9648
9649           goto unknown;
9650
9651         case 'e':
9652           if (name[1] == 'n' &&
9653               name[2] == 'd')
9654           {
9655             switch (name[3])
9656             {
9657               case 'g':
9658                 if (name[4] == 'r' &&
9659                     name[5] == 'e' &&
9660                     name[6] == 'n' &&
9661                     name[7] == 't')
9662                 {                                 /* endgrent   */
9663                   return -KEY_endgrent;
9664                 }
9665
9666                 goto unknown;
9667
9668               case 'p':
9669                 if (name[4] == 'w' &&
9670                     name[5] == 'e' &&
9671                     name[6] == 'n' &&
9672                     name[7] == 't')
9673                 {                                 /* endpwent   */
9674                   return -KEY_endpwent;
9675                 }
9676
9677                 goto unknown;
9678
9679               default:
9680                 goto unknown;
9681             }
9682           }
9683
9684           goto unknown;
9685
9686         case 'f':
9687           if (name[1] == 'o' &&
9688               name[2] == 'r' &&
9689               name[3] == 'm' &&
9690               name[4] == 'l' &&
9691               name[5] == 'i' &&
9692               name[6] == 'n' &&
9693               name[7] == 'e')
9694           {                                       /* formline   */
9695             return -KEY_formline;
9696           }
9697
9698           goto unknown;
9699
9700         case 'g':
9701           if (name[1] == 'e' &&
9702               name[2] == 't')
9703           {
9704             switch (name[3])
9705             {
9706               case 'g':
9707                 if (name[4] == 'r')
9708                 {
9709                   switch (name[5])
9710                   {
9711                     case 'e':
9712                       if (name[6] == 'n' &&
9713                           name[7] == 't')
9714                       {                           /* getgrent   */
9715                         return -KEY_getgrent;
9716                       }
9717
9718                       goto unknown;
9719
9720                     case 'g':
9721                       if (name[6] == 'i' &&
9722                           name[7] == 'd')
9723                       {                           /* getgrgid   */
9724                         return -KEY_getgrgid;
9725                       }
9726
9727                       goto unknown;
9728
9729                     case 'n':
9730                       if (name[6] == 'a' &&
9731                           name[7] == 'm')
9732                       {                           /* getgrnam   */
9733                         return -KEY_getgrnam;
9734                       }
9735
9736                       goto unknown;
9737
9738                     default:
9739                       goto unknown;
9740                   }
9741                 }
9742
9743                 goto unknown;
9744
9745               case 'l':
9746                 if (name[4] == 'o' &&
9747                     name[5] == 'g' &&
9748                     name[6] == 'i' &&
9749                     name[7] == 'n')
9750                 {                                 /* getlogin   */
9751                   return -KEY_getlogin;
9752                 }
9753
9754                 goto unknown;
9755
9756               case 'p':
9757                 if (name[4] == 'w')
9758                 {
9759                   switch (name[5])
9760                   {
9761                     case 'e':
9762                       if (name[6] == 'n' &&
9763                           name[7] == 't')
9764                       {                           /* getpwent   */
9765                         return -KEY_getpwent;
9766                       }
9767
9768                       goto unknown;
9769
9770                     case 'n':
9771                       if (name[6] == 'a' &&
9772                           name[7] == 'm')
9773                       {                           /* getpwnam   */
9774                         return -KEY_getpwnam;
9775                       }
9776
9777                       goto unknown;
9778
9779                     case 'u':
9780                       if (name[6] == 'i' &&
9781                           name[7] == 'd')
9782                       {                           /* getpwuid   */
9783                         return -KEY_getpwuid;
9784                       }
9785
9786                       goto unknown;
9787
9788                     default:
9789                       goto unknown;
9790                   }
9791                 }
9792
9793                 goto unknown;
9794
9795               default:
9796                 goto unknown;
9797             }
9798           }
9799
9800           goto unknown;
9801
9802         case 'r':
9803           if (name[1] == 'e' &&
9804               name[2] == 'a' &&
9805               name[3] == 'd')
9806           {
9807             switch (name[4])
9808             {
9809               case 'l':
9810                 if (name[5] == 'i' &&
9811                     name[6] == 'n')
9812                 {
9813                   switch (name[7])
9814                   {
9815                     case 'e':
9816                       {                           /* readline   */
9817                         return -KEY_readline;
9818                       }
9819
9820                     case 'k':
9821                       {                           /* readlink   */
9822                         return -KEY_readlink;
9823                       }
9824
9825                     default:
9826                       goto unknown;
9827                   }
9828                 }
9829
9830                 goto unknown;
9831
9832               case 'p':
9833                 if (name[5] == 'i' &&
9834                     name[6] == 'p' &&
9835                     name[7] == 'e')
9836                 {                                 /* readpipe   */
9837                   return -KEY_readpipe;
9838                 }
9839
9840                 goto unknown;
9841
9842               default:
9843                 goto unknown;
9844             }
9845           }
9846
9847           goto unknown;
9848
9849         case 's':
9850           switch (name[1])
9851           {
9852             case 'e':
9853               if (name[2] == 't')
9854               {
9855                 switch (name[3])
9856                 {
9857                   case 'g':
9858                     if (name[4] == 'r' &&
9859                         name[5] == 'e' &&
9860                         name[6] == 'n' &&
9861                         name[7] == 't')
9862                     {                             /* setgrent   */
9863                       return -KEY_setgrent;
9864                     }
9865
9866                     goto unknown;
9867
9868                   case 'p':
9869                     if (name[4] == 'w' &&
9870                         name[5] == 'e' &&
9871                         name[6] == 'n' &&
9872                         name[7] == 't')
9873                     {                             /* setpwent   */
9874                       return -KEY_setpwent;
9875                     }
9876
9877                     goto unknown;
9878
9879                   default:
9880                     goto unknown;
9881                 }
9882               }
9883
9884               goto unknown;
9885
9886             case 'h':
9887               switch (name[2])
9888               {
9889                 case 'm':
9890                   if (name[3] == 'w' &&
9891                       name[4] == 'r' &&
9892                       name[5] == 'i' &&
9893                       name[6] == 't' &&
9894                       name[7] == 'e')
9895                   {                               /* shmwrite   */
9896                     return -KEY_shmwrite;
9897                   }
9898
9899                   goto unknown;
9900
9901                 case 'u':
9902                   if (name[3] == 't' &&
9903                       name[4] == 'd' &&
9904                       name[5] == 'o' &&
9905                       name[6] == 'w' &&
9906                       name[7] == 'n')
9907                   {                               /* shutdown   */
9908                     return -KEY_shutdown;
9909                   }
9910
9911                   goto unknown;
9912
9913                 default:
9914                   goto unknown;
9915               }
9916
9917             case 'y':
9918               if (name[2] == 's' &&
9919                   name[3] == 'w' &&
9920                   name[4] == 'r' &&
9921                   name[5] == 'i' &&
9922                   name[6] == 't' &&
9923                   name[7] == 'e')
9924               {                                   /* syswrite   */
9925                 return -KEY_syswrite;
9926               }
9927
9928               goto unknown;
9929
9930             default:
9931               goto unknown;
9932           }
9933
9934         case 't':
9935           if (name[1] == 'r' &&
9936               name[2] == 'u' &&
9937               name[3] == 'n' &&
9938               name[4] == 'c' &&
9939               name[5] == 'a' &&
9940               name[6] == 't' &&
9941               name[7] == 'e')
9942           {                                       /* truncate   */
9943             return -KEY_truncate;
9944           }
9945
9946           goto unknown;
9947
9948         default:
9949           goto unknown;
9950       }
9951
9952     case 9: /* 9 tokens of length 9 */
9953       switch (name[0])
9954       {
9955         case 'U':
9956           if (name[1] == 'N' &&
9957               name[2] == 'I' &&
9958               name[3] == 'T' &&
9959               name[4] == 'C' &&
9960               name[5] == 'H' &&
9961               name[6] == 'E' &&
9962               name[7] == 'C' &&
9963               name[8] == 'K')
9964           {                                       /* UNITCHECK  */
9965             return KEY_UNITCHECK;
9966           }
9967
9968           goto unknown;
9969
9970         case 'e':
9971           if (name[1] == 'n' &&
9972               name[2] == 'd' &&
9973               name[3] == 'n' &&
9974               name[4] == 'e' &&
9975               name[5] == 't' &&
9976               name[6] == 'e' &&
9977               name[7] == 'n' &&
9978               name[8] == 't')
9979           {                                       /* endnetent  */
9980             return -KEY_endnetent;
9981           }
9982
9983           goto unknown;
9984
9985         case 'g':
9986           if (name[1] == 'e' &&
9987               name[2] == 't' &&
9988               name[3] == 'n' &&
9989               name[4] == 'e' &&
9990               name[5] == 't' &&
9991               name[6] == 'e' &&
9992               name[7] == 'n' &&
9993               name[8] == 't')
9994           {                                       /* getnetent  */
9995             return -KEY_getnetent;
9996           }
9997
9998           goto unknown;
9999
10000         case 'l':
10001           if (name[1] == 'o' &&
10002               name[2] == 'c' &&
10003               name[3] == 'a' &&
10004               name[4] == 'l' &&
10005               name[5] == 't' &&
10006               name[6] == 'i' &&
10007               name[7] == 'm' &&
10008               name[8] == 'e')
10009           {                                       /* localtime  */
10010             return -KEY_localtime;
10011           }
10012
10013           goto unknown;
10014
10015         case 'p':
10016           if (name[1] == 'r' &&
10017               name[2] == 'o' &&
10018               name[3] == 't' &&
10019               name[4] == 'o' &&
10020               name[5] == 't' &&
10021               name[6] == 'y' &&
10022               name[7] == 'p' &&
10023               name[8] == 'e')
10024           {                                       /* prototype  */
10025             return KEY_prototype;
10026           }
10027
10028           goto unknown;
10029
10030         case 'q':
10031           if (name[1] == 'u' &&
10032               name[2] == 'o' &&
10033               name[3] == 't' &&
10034               name[4] == 'e' &&
10035               name[5] == 'm' &&
10036               name[6] == 'e' &&
10037               name[7] == 't' &&
10038               name[8] == 'a')
10039           {                                       /* quotemeta  */
10040             return -KEY_quotemeta;
10041           }
10042
10043           goto unknown;
10044
10045         case 'r':
10046           if (name[1] == 'e' &&
10047               name[2] == 'w' &&
10048               name[3] == 'i' &&
10049               name[4] == 'n' &&
10050               name[5] == 'd' &&
10051               name[6] == 'd' &&
10052               name[7] == 'i' &&
10053               name[8] == 'r')
10054           {                                       /* rewinddir  */
10055             return -KEY_rewinddir;
10056           }
10057
10058           goto unknown;
10059
10060         case 's':
10061           if (name[1] == 'e' &&
10062               name[2] == 't' &&
10063               name[3] == 'n' &&
10064               name[4] == 'e' &&
10065               name[5] == 't' &&
10066               name[6] == 'e' &&
10067               name[7] == 'n' &&
10068               name[8] == 't')
10069           {                                       /* setnetent  */
10070             return -KEY_setnetent;
10071           }
10072
10073           goto unknown;
10074
10075         case 'w':
10076           if (name[1] == 'a' &&
10077               name[2] == 'n' &&
10078               name[3] == 't' &&
10079               name[4] == 'a' &&
10080               name[5] == 'r' &&
10081               name[6] == 'r' &&
10082               name[7] == 'a' &&
10083               name[8] == 'y')
10084           {                                       /* wantarray  */
10085             return -KEY_wantarray;
10086           }
10087
10088           goto unknown;
10089
10090         default:
10091           goto unknown;
10092       }
10093
10094     case 10: /* 9 tokens of length 10 */
10095       switch (name[0])
10096       {
10097         case 'e':
10098           if (name[1] == 'n' &&
10099               name[2] == 'd')
10100           {
10101             switch (name[3])
10102             {
10103               case 'h':
10104                 if (name[4] == 'o' &&
10105                     name[5] == 's' &&
10106                     name[6] == 't' &&
10107                     name[7] == 'e' &&
10108                     name[8] == 'n' &&
10109                     name[9] == 't')
10110                 {                                 /* endhostent */
10111                   return -KEY_endhostent;
10112                 }
10113
10114                 goto unknown;
10115
10116               case 's':
10117                 if (name[4] == 'e' &&
10118                     name[5] == 'r' &&
10119                     name[6] == 'v' &&
10120                     name[7] == 'e' &&
10121                     name[8] == 'n' &&
10122                     name[9] == 't')
10123                 {                                 /* endservent */
10124                   return -KEY_endservent;
10125                 }
10126
10127                 goto unknown;
10128
10129               default:
10130                 goto unknown;
10131             }
10132           }
10133
10134           goto unknown;
10135
10136         case 'g':
10137           if (name[1] == 'e' &&
10138               name[2] == 't')
10139           {
10140             switch (name[3])
10141             {
10142               case 'h':
10143                 if (name[4] == 'o' &&
10144                     name[5] == 's' &&
10145                     name[6] == 't' &&
10146                     name[7] == 'e' &&
10147                     name[8] == 'n' &&
10148                     name[9] == 't')
10149                 {                                 /* gethostent */
10150                   return -KEY_gethostent;
10151                 }
10152
10153                 goto unknown;
10154
10155               case 's':
10156                 switch (name[4])
10157                 {
10158                   case 'e':
10159                     if (name[5] == 'r' &&
10160                         name[6] == 'v' &&
10161                         name[7] == 'e' &&
10162                         name[8] == 'n' &&
10163                         name[9] == 't')
10164                     {                             /* getservent */
10165                       return -KEY_getservent;
10166                     }
10167
10168                     goto unknown;
10169
10170                   case 'o':
10171                     if (name[5] == 'c' &&
10172                         name[6] == 'k' &&
10173                         name[7] == 'o' &&
10174                         name[8] == 'p' &&
10175                         name[9] == 't')
10176                     {                             /* getsockopt */
10177                       return -KEY_getsockopt;
10178                     }
10179
10180                     goto unknown;
10181
10182                   default:
10183                     goto unknown;
10184                 }
10185
10186               default:
10187                 goto unknown;
10188             }
10189           }
10190
10191           goto unknown;
10192
10193         case 's':
10194           switch (name[1])
10195           {
10196             case 'e':
10197               if (name[2] == 't')
10198               {
10199                 switch (name[3])
10200                 {
10201                   case 'h':
10202                     if (name[4] == 'o' &&
10203                         name[5] == 's' &&
10204                         name[6] == 't' &&
10205                         name[7] == 'e' &&
10206                         name[8] == 'n' &&
10207                         name[9] == 't')
10208                     {                             /* sethostent */
10209                       return -KEY_sethostent;
10210                     }
10211
10212                     goto unknown;
10213
10214                   case 's':
10215                     switch (name[4])
10216                     {
10217                       case 'e':
10218                         if (name[5] == 'r' &&
10219                             name[6] == 'v' &&
10220                             name[7] == 'e' &&
10221                             name[8] == 'n' &&
10222                             name[9] == 't')
10223                         {                         /* setservent */
10224                           return -KEY_setservent;
10225                         }
10226
10227                         goto unknown;
10228
10229                       case 'o':
10230                         if (name[5] == 'c' &&
10231                             name[6] == 'k' &&
10232                             name[7] == 'o' &&
10233                             name[8] == 'p' &&
10234                             name[9] == 't')
10235                         {                         /* setsockopt */
10236                           return -KEY_setsockopt;
10237                         }
10238
10239                         goto unknown;
10240
10241                       default:
10242                         goto unknown;
10243                     }
10244
10245                   default:
10246                     goto unknown;
10247                 }
10248               }
10249
10250               goto unknown;
10251
10252             case 'o':
10253               if (name[2] == 'c' &&
10254                   name[3] == 'k' &&
10255                   name[4] == 'e' &&
10256                   name[5] == 't' &&
10257                   name[6] == 'p' &&
10258                   name[7] == 'a' &&
10259                   name[8] == 'i' &&
10260                   name[9] == 'r')
10261               {                                   /* socketpair */
10262                 return -KEY_socketpair;
10263               }
10264
10265               goto unknown;
10266
10267             default:
10268               goto unknown;
10269           }
10270
10271         default:
10272           goto unknown;
10273       }
10274
10275     case 11: /* 8 tokens of length 11 */
10276       switch (name[0])
10277       {
10278         case '_':
10279           if (name[1] == '_' &&
10280               name[2] == 'P' &&
10281               name[3] == 'A' &&
10282               name[4] == 'C' &&
10283               name[5] == 'K' &&
10284               name[6] == 'A' &&
10285               name[7] == 'G' &&
10286               name[8] == 'E' &&
10287               name[9] == '_' &&
10288               name[10] == '_')
10289           {                                       /* __PACKAGE__ */
10290             return -KEY___PACKAGE__;
10291           }
10292
10293           goto unknown;
10294
10295         case 'e':
10296           if (name[1] == 'n' &&
10297               name[2] == 'd' &&
10298               name[3] == 'p' &&
10299               name[4] == 'r' &&
10300               name[5] == 'o' &&
10301               name[6] == 't' &&
10302               name[7] == 'o' &&
10303               name[8] == 'e' &&
10304               name[9] == 'n' &&
10305               name[10] == 't')
10306           {                                       /* endprotoent */
10307             return -KEY_endprotoent;
10308           }
10309
10310           goto unknown;
10311
10312         case 'g':
10313           if (name[1] == 'e' &&
10314               name[2] == 't')
10315           {
10316             switch (name[3])
10317             {
10318               case 'p':
10319                 switch (name[4])
10320                 {
10321                   case 'e':
10322                     if (name[5] == 'e' &&
10323                         name[6] == 'r' &&
10324                         name[7] == 'n' &&
10325                         name[8] == 'a' &&
10326                         name[9] == 'm' &&
10327                         name[10] == 'e')
10328                     {                             /* getpeername */
10329                       return -KEY_getpeername;
10330                     }
10331
10332                     goto unknown;
10333
10334                   case 'r':
10335                     switch (name[5])
10336                     {
10337                       case 'i':
10338                         if (name[6] == 'o' &&
10339                             name[7] == 'r' &&
10340                             name[8] == 'i' &&
10341                             name[9] == 't' &&
10342                             name[10] == 'y')
10343                         {                         /* getpriority */
10344                           return -KEY_getpriority;
10345                         }
10346
10347                         goto unknown;
10348
10349                       case 'o':
10350                         if (name[6] == 't' &&
10351                             name[7] == 'o' &&
10352                             name[8] == 'e' &&
10353                             name[9] == 'n' &&
10354                             name[10] == 't')
10355                         {                         /* getprotoent */
10356                           return -KEY_getprotoent;
10357                         }
10358
10359                         goto unknown;
10360
10361                       default:
10362                         goto unknown;
10363                     }
10364
10365                   default:
10366                     goto unknown;
10367                 }
10368
10369               case 's':
10370                 if (name[4] == 'o' &&
10371                     name[5] == 'c' &&
10372                     name[6] == 'k' &&
10373                     name[7] == 'n' &&
10374                     name[8] == 'a' &&
10375                     name[9] == 'm' &&
10376                     name[10] == 'e')
10377                 {                                 /* getsockname */
10378                   return -KEY_getsockname;
10379                 }
10380
10381                 goto unknown;
10382
10383               default:
10384                 goto unknown;
10385             }
10386           }
10387
10388           goto unknown;
10389
10390         case 's':
10391           if (name[1] == 'e' &&
10392               name[2] == 't' &&
10393               name[3] == 'p' &&
10394               name[4] == 'r')
10395           {
10396             switch (name[5])
10397             {
10398               case 'i':
10399                 if (name[6] == 'o' &&
10400                     name[7] == 'r' &&
10401                     name[8] == 'i' &&
10402                     name[9] == 't' &&
10403                     name[10] == 'y')
10404                 {                                 /* setpriority */
10405                   return -KEY_setpriority;
10406                 }
10407
10408                 goto unknown;
10409
10410               case 'o':
10411                 if (name[6] == 't' &&
10412                     name[7] == 'o' &&
10413                     name[8] == 'e' &&
10414                     name[9] == 'n' &&
10415                     name[10] == 't')
10416                 {                                 /* setprotoent */
10417                   return -KEY_setprotoent;
10418                 }
10419
10420                 goto unknown;
10421
10422               default:
10423                 goto unknown;
10424             }
10425           }
10426
10427           goto unknown;
10428
10429         default:
10430           goto unknown;
10431       }
10432
10433     case 12: /* 2 tokens of length 12 */
10434       if (name[0] == 'g' &&
10435           name[1] == 'e' &&
10436           name[2] == 't' &&
10437           name[3] == 'n' &&
10438           name[4] == 'e' &&
10439           name[5] == 't' &&
10440           name[6] == 'b' &&
10441           name[7] == 'y')
10442       {
10443         switch (name[8])
10444         {
10445           case 'a':
10446             if (name[9] == 'd' &&
10447                 name[10] == 'd' &&
10448                 name[11] == 'r')
10449             {                                     /* getnetbyaddr */
10450               return -KEY_getnetbyaddr;
10451             }
10452
10453             goto unknown;
10454
10455           case 'n':
10456             if (name[9] == 'a' &&
10457                 name[10] == 'm' &&
10458                 name[11] == 'e')
10459             {                                     /* getnetbyname */
10460               return -KEY_getnetbyname;
10461             }
10462
10463             goto unknown;
10464
10465           default:
10466             goto unknown;
10467         }
10468       }
10469
10470       goto unknown;
10471
10472     case 13: /* 4 tokens of length 13 */
10473       if (name[0] == 'g' &&
10474           name[1] == 'e' &&
10475           name[2] == 't')
10476       {
10477         switch (name[3])
10478         {
10479           case 'h':
10480             if (name[4] == 'o' &&
10481                 name[5] == 's' &&
10482                 name[6] == 't' &&
10483                 name[7] == 'b' &&
10484                 name[8] == 'y')
10485             {
10486               switch (name[9])
10487               {
10488                 case 'a':
10489                   if (name[10] == 'd' &&
10490                       name[11] == 'd' &&
10491                       name[12] == 'r')
10492                   {                               /* gethostbyaddr */
10493                     return -KEY_gethostbyaddr;
10494                   }
10495
10496                   goto unknown;
10497
10498                 case 'n':
10499                   if (name[10] == 'a' &&
10500                       name[11] == 'm' &&
10501                       name[12] == 'e')
10502                   {                               /* gethostbyname */
10503                     return -KEY_gethostbyname;
10504                   }
10505
10506                   goto unknown;
10507
10508                 default:
10509                   goto unknown;
10510               }
10511             }
10512
10513             goto unknown;
10514
10515           case 's':
10516             if (name[4] == 'e' &&
10517                 name[5] == 'r' &&
10518                 name[6] == 'v' &&
10519                 name[7] == 'b' &&
10520                 name[8] == 'y')
10521             {
10522               switch (name[9])
10523               {
10524                 case 'n':
10525                   if (name[10] == 'a' &&
10526                       name[11] == 'm' &&
10527                       name[12] == 'e')
10528                   {                               /* getservbyname */
10529                     return -KEY_getservbyname;
10530                   }
10531
10532                   goto unknown;
10533
10534                 case 'p':
10535                   if (name[10] == 'o' &&
10536                       name[11] == 'r' &&
10537                       name[12] == 't')
10538                   {                               /* getservbyport */
10539                     return -KEY_getservbyport;
10540                   }
10541
10542                   goto unknown;
10543
10544                 default:
10545                   goto unknown;
10546               }
10547             }
10548
10549             goto unknown;
10550
10551           default:
10552             goto unknown;
10553         }
10554       }
10555
10556       goto unknown;
10557
10558     case 14: /* 1 tokens of length 14 */
10559       if (name[0] == 'g' &&
10560           name[1] == 'e' &&
10561           name[2] == 't' &&
10562           name[3] == 'p' &&
10563           name[4] == 'r' &&
10564           name[5] == 'o' &&
10565           name[6] == 't' &&
10566           name[7] == 'o' &&
10567           name[8] == 'b' &&
10568           name[9] == 'y' &&
10569           name[10] == 'n' &&
10570           name[11] == 'a' &&
10571           name[12] == 'm' &&
10572           name[13] == 'e')
10573       {                                           /* getprotobyname */
10574         return -KEY_getprotobyname;
10575       }
10576
10577       goto unknown;
10578
10579     case 16: /* 1 tokens of length 16 */
10580       if (name[0] == 'g' &&
10581           name[1] == 'e' &&
10582           name[2] == 't' &&
10583           name[3] == 'p' &&
10584           name[4] == 'r' &&
10585           name[5] == 'o' &&
10586           name[6] == 't' &&
10587           name[7] == 'o' &&
10588           name[8] == 'b' &&
10589           name[9] == 'y' &&
10590           name[10] == 'n' &&
10591           name[11] == 'u' &&
10592           name[12] == 'm' &&
10593           name[13] == 'b' &&
10594           name[14] == 'e' &&
10595           name[15] == 'r')
10596       {                                           /* getprotobynumber */
10597         return -KEY_getprotobynumber;
10598       }
10599
10600       goto unknown;
10601
10602     default:
10603       goto unknown;
10604   }
10605
10606 unknown:
10607   return 0;
10608 }
10609
10610 STATIC void
10611 S_checkcomma(pTHX_ const char *s, const char *name, const char *what)
10612 {
10613     dVAR;
10614
10615     PERL_ARGS_ASSERT_CHECKCOMMA;
10616
10617     if (*s == ' ' && s[1] == '(') {     /* XXX gotta be a better way */
10618         if (ckWARN(WARN_SYNTAX)) {
10619             int level = 1;
10620             const char *w;
10621             for (w = s+2; *w && level; w++) {
10622                 if (*w == '(')
10623                     ++level;
10624                 else if (*w == ')')
10625                     --level;
10626             }
10627             while (isSPACE(*w))
10628                 ++w;
10629             /* the list of chars below is for end of statements or
10630              * block / parens, boolean operators (&&, ||, //) and branch
10631              * constructs (or, and, if, until, unless, while, err, for).
10632              * Not a very solid hack... */
10633             if (!*w || !strchr(";&/|})]oaiuwef!=", *w))
10634                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
10635                             "%s (...) interpreted as function",name);
10636         }
10637     }
10638     while (s < PL_bufend && isSPACE(*s))
10639         s++;
10640     if (*s == '(')
10641         s++;
10642     while (s < PL_bufend && isSPACE(*s))
10643         s++;
10644     if (isIDFIRST_lazy_if(s,UTF)) {
10645         const char * const w = s++;
10646         while (isALNUM_lazy_if(s,UTF))
10647             s++;
10648         while (s < PL_bufend && isSPACE(*s))
10649             s++;
10650         if (*s == ',') {
10651             GV* gv;
10652             if (keyword(w, s - w, 0))
10653                 return;
10654
10655             gv = gv_fetchpvn_flags(w, s - w, 0, SVt_PVCV);
10656             if (gv && GvCVu(gv))
10657                 return;
10658             Perl_croak(aTHX_ "No comma allowed after %s", what);
10659         }
10660     }
10661 }
10662
10663 /* Either returns sv, or mortalizes sv and returns a new SV*.
10664    Best used as sv=new_constant(..., sv, ...).
10665    If s, pv are NULL, calls subroutine with one argument,
10666    and type is used with error messages only. */
10667
10668 STATIC SV *
10669 S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, STRLEN keylen,
10670                SV *sv, SV *pv, const char *type, STRLEN typelen)
10671 {
10672     dVAR; dSP;
10673     HV * const table = GvHV(PL_hintgv);          /* ^H */
10674     SV *res;
10675     SV **cvp;
10676     SV *cv, *typesv;
10677     const char *why1 = "", *why2 = "", *why3 = "";
10678
10679     PERL_ARGS_ASSERT_NEW_CONSTANT;
10680
10681     if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
10682         SV *msg;
10683         
10684         why2 = (const char *)
10685             (strEQ(key,"charnames")
10686              ? "(possibly a missing \"use charnames ...\")"
10687              : "");
10688         msg = Perl_newSVpvf(aTHX_ "Constant(%s) unknown: %s",
10689                             (type ? type: "undef"), why2);
10690
10691         /* This is convoluted and evil ("goto considered harmful")
10692          * but I do not understand the intricacies of all the different
10693          * failure modes of %^H in here.  The goal here is to make
10694          * the most probable error message user-friendly. --jhi */
10695
10696         goto msgdone;
10697
10698     report:
10699         msg = Perl_newSVpvf(aTHX_ "Constant(%s): %s%s%s",
10700                             (type ? type: "undef"), why1, why2, why3);
10701     msgdone:
10702         yyerror(SvPVX_const(msg));
10703         SvREFCNT_dec(msg);
10704         return sv;
10705     }
10706     cvp = hv_fetch(table, key, keylen, FALSE);
10707     if (!cvp || !SvOK(*cvp)) {
10708         why1 = "$^H{";
10709         why2 = key;
10710         why3 = "} is not defined";
10711         goto report;
10712     }
10713     sv_2mortal(sv);                     /* Parent created it permanently */
10714     cv = *cvp;
10715     if (!pv && s)
10716         pv = newSVpvn_flags(s, len, SVs_TEMP);
10717     if (type && pv)
10718         typesv = newSVpvn_flags(type, typelen, SVs_TEMP);
10719     else
10720         typesv = &PL_sv_undef;
10721
10722     PUSHSTACKi(PERLSI_OVERLOAD);
10723     ENTER ;
10724     SAVETMPS;
10725
10726     PUSHMARK(SP) ;
10727     EXTEND(sp, 3);
10728     if (pv)
10729         PUSHs(pv);
10730     PUSHs(sv);
10731     if (pv)
10732         PUSHs(typesv);
10733     PUTBACK;
10734     call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
10735
10736     SPAGAIN ;
10737
10738     /* Check the eval first */
10739     if (!PL_in_eval && SvTRUE(ERRSV)) {
10740         sv_catpvs(ERRSV, "Propagated");
10741         yyerror(SvPV_nolen_const(ERRSV)); /* Duplicates the message inside eval */
10742         (void)POPs;
10743         res = SvREFCNT_inc_simple(sv);
10744     }
10745     else {
10746         res = POPs;
10747         SvREFCNT_inc_simple_void(res);
10748     }
10749
10750     PUTBACK ;
10751     FREETMPS ;
10752     LEAVE ;
10753     POPSTACK;
10754
10755     if (!SvOK(res)) {
10756         why1 = "Call to &{$^H{";
10757         why2 = key;
10758         why3 = "}} did not return a defined value";
10759         sv = res;
10760         goto report;
10761     }
10762
10763     return res;
10764 }
10765
10766 /* Returns a NUL terminated string, with the length of the string written to
10767    *slp
10768    */
10769 STATIC char *
10770 S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
10771 {
10772     dVAR;
10773     register char *d = dest;
10774     register char * const e = d + destlen - 3;  /* two-character token, ending NUL */
10775
10776     PERL_ARGS_ASSERT_SCAN_WORD;
10777
10778     for (;;) {
10779         if (d >= e)
10780             Perl_croak(aTHX_ ident_too_long);
10781         if (isALNUM(*s))        /* UTF handled below */
10782             *d++ = *s++;
10783         else if (allow_package && (*s == '\'') && isIDFIRST_lazy_if(s+1,UTF)) {
10784             *d++ = ':';
10785             *d++ = ':';
10786             s++;
10787         }
10788         else if (allow_package && (s[0] == ':') && (s[1] == ':') && (s[2] != '$')) {
10789             *d++ = *s++;
10790             *d++ = *s++;
10791         }
10792         else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
10793             char *t = s + UTF8SKIP(s);
10794             size_t len;
10795             while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
10796                 t += UTF8SKIP(t);
10797             len = t - s;
10798             if (d + len > e)
10799                 Perl_croak(aTHX_ ident_too_long);
10800             Copy(s, d, len, char);
10801             d += len;
10802             s = t;
10803         }
10804         else {
10805             *d = '\0';
10806             *slp = d - dest;
10807             return s;
10808         }
10809     }
10810 }
10811
10812 STATIC char *
10813 S_scan_ident(pTHX_ register char *s, register const char *send, char *dest, STRLEN destlen, I32 ck_uni)
10814 {
10815     dVAR;
10816     char *bracket = NULL;
10817     char funny = *s++;
10818     register char *d = dest;
10819     register char * const e = d + destlen + 3;    /* two-character token, ending NUL */
10820
10821     PERL_ARGS_ASSERT_SCAN_IDENT;
10822
10823     if (isSPACE(*s))
10824         s = PEEKSPACE(s);
10825     if (isDIGIT(*s)) {
10826         while (isDIGIT(*s)) {
10827             if (d >= e)
10828                 Perl_croak(aTHX_ ident_too_long);
10829             *d++ = *s++;
10830         }
10831     }
10832     else {
10833         for (;;) {
10834             if (d >= e)
10835                 Perl_croak(aTHX_ ident_too_long);
10836             if (isALNUM(*s))    /* UTF handled below */
10837                 *d++ = *s++;
10838             else if (*s == '\'' && isIDFIRST_lazy_if(s+1,UTF)) {
10839                 *d++ = ':';
10840                 *d++ = ':';
10841                 s++;
10842             }
10843             else if (*s == ':' && s[1] == ':') {
10844                 *d++ = *s++;
10845                 *d++ = *s++;
10846             }
10847             else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
10848                 char *t = s + UTF8SKIP(s);
10849                 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
10850                     t += UTF8SKIP(t);
10851                 if (d + (t - s) > e)
10852                     Perl_croak(aTHX_ ident_too_long);
10853                 Copy(s, d, t - s, char);
10854                 d += t - s;
10855                 s = t;
10856             }
10857             else
10858                 break;
10859         }
10860     }
10861     *d = '\0';
10862     d = dest;
10863     if (*d) {
10864         if (PL_lex_state != LEX_NORMAL)
10865             PL_lex_state = LEX_INTERPENDMAYBE;
10866         return s;
10867     }
10868     if (*s == '$' && s[1] &&
10869         (isALNUM_lazy_if(s+1,UTF) || s[1] == '$' || s[1] == '{' || strnEQ(s+1,"::",2)) )
10870     {
10871         return s;
10872     }
10873     if (*s == '{') {
10874         bracket = s;
10875         s++;
10876     }
10877     else if (ck_uni)
10878         check_uni();
10879     if (s < send)
10880         *d = *s++;
10881     d[1] = '\0';
10882     if (*d == '^' && *s && isCONTROLVAR(*s)) {
10883         *d = toCTRL(*s);
10884         s++;
10885     }
10886     if (bracket) {
10887         if (isSPACE(s[-1])) {
10888             while (s < send) {
10889                 const char ch = *s++;
10890                 if (!SPACE_OR_TAB(ch)) {
10891                     *d = ch;
10892                     break;
10893                 }
10894             }
10895         }
10896         if (isIDFIRST_lazy_if(d,UTF)) {
10897             d++;
10898             if (UTF) {
10899                 char *end = s;
10900                 while ((end < send && isALNUM_lazy_if(end,UTF)) || *end == ':') {
10901                     end += UTF8SKIP(end);
10902                     while (end < send && UTF8_IS_CONTINUED(*end) && is_utf8_mark((U8*)end))
10903                         end += UTF8SKIP(end);
10904                 }
10905                 Copy(s, d, end - s, char);
10906                 d += end - s;
10907                 s = end;
10908             }
10909             else {
10910                 while ((isALNUM(*s) || *s == ':') && d < e)
10911                     *d++ = *s++;
10912                 if (d >= e)
10913                     Perl_croak(aTHX_ ident_too_long);
10914             }
10915             *d = '\0';
10916             while (s < send && SPACE_OR_TAB(*s))
10917                 s++;
10918             if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
10919                 if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest, 0)) {
10920                     const char * const brack =
10921                         (const char *)
10922                         ((*s == '[') ? "[...]" : "{...}");
10923                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
10924                         "Ambiguous use of %c{%s%s} resolved to %c%s%s",
10925                         funny, dest, brack, funny, dest, brack);
10926                 }
10927                 bracket++;
10928                 PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
10929                 return s;
10930             }
10931         }
10932         /* Handle extended ${^Foo} variables
10933          * 1999-02-27 mjd-perl-patch@plover.com */
10934         else if (!isALNUM(*d) && !isPRINT(*d) /* isCTRL(d) */
10935                  && isALNUM(*s))
10936         {
10937             d++;
10938             while (isALNUM(*s) && d < e) {
10939                 *d++ = *s++;
10940             }
10941             if (d >= e)
10942                 Perl_croak(aTHX_ ident_too_long);
10943             *d = '\0';
10944         }
10945         if (*s == '}') {
10946             s++;
10947             if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) {
10948                 PL_lex_state = LEX_INTERPEND;
10949                 PL_expect = XREF;
10950             }
10951             if (PL_lex_state == LEX_NORMAL) {
10952                 if (ckWARN(WARN_AMBIGUOUS) &&
10953                     (keyword(dest, d - dest, 0)
10954                      || get_cvn_flags(dest, d - dest, 0)))
10955                 {
10956                     if (funny == '#')
10957                         funny = '@';
10958                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
10959                         "Ambiguous use of %c{%s} resolved to %c%s",
10960                         funny, dest, funny, dest);
10961                 }
10962             }
10963         }
10964         else {
10965             s = bracket;                /* let the parser handle it */
10966             *dest = '\0';
10967         }
10968     }
10969     else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
10970         PL_lex_state = LEX_INTERPEND;
10971     return s;
10972 }
10973
10974 void
10975 Perl_pmflag(pTHX_ U32* pmfl, int ch)
10976 {
10977     PERL_ARGS_ASSERT_PMFLAG;
10978
10979     PERL_UNUSED_CONTEXT;
10980     if (ch<256) {
10981         const char c = (char)ch;
10982         switch (c) {
10983             CASE_STD_PMMOD_FLAGS_PARSE_SET(pmfl);
10984             case GLOBAL_PAT_MOD:    *pmfl |= PMf_GLOBAL; break;
10985             case CONTINUE_PAT_MOD:  *pmfl |= PMf_CONTINUE; break;
10986             case ONCE_PAT_MOD:      *pmfl |= PMf_KEEP; break;
10987             case KEEPCOPY_PAT_MOD:  *pmfl |= PMf_KEEPCOPY; break;
10988         }
10989     }
10990 }
10991
10992 STATIC char *
10993 S_scan_pat(pTHX_ char *start, I32 type)
10994 {
10995     dVAR;
10996     PMOP *pm;
10997     char *s = scan_str(start,!!PL_madskills,FALSE);
10998     const char * const valid_flags =
10999         (const char *)((type == OP_QR) ? QR_PAT_MODS : M_PAT_MODS);
11000 #ifdef PERL_MAD
11001     char *modstart;
11002 #endif
11003
11004     PERL_ARGS_ASSERT_SCAN_PAT;
11005
11006     if (!s) {
11007         const char * const delimiter = skipspace(start);
11008         Perl_croak(aTHX_
11009                    (const char *)
11010                    (*delimiter == '?'
11011                     ? "Search pattern not terminated or ternary operator parsed as search pattern"
11012                     : "Search pattern not terminated" ));
11013     }
11014
11015     pm = (PMOP*)newPMOP(type, 0);
11016     if (PL_multi_open == '?') {
11017         /* This is the only point in the code that sets PMf_ONCE:  */
11018         pm->op_pmflags |= PMf_ONCE;
11019
11020         /* Hence it's safe to do this bit of PMOP book-keeping here, which
11021            allows us to restrict the list needed by reset to just the ??
11022            matches.  */
11023         assert(type != OP_TRANS);
11024         if (PL_curstash) {
11025             MAGIC *mg = mg_find((const SV *)PL_curstash, PERL_MAGIC_symtab);
11026             U32 elements;
11027             if (!mg) {
11028                 mg = sv_magicext(MUTABLE_SV(PL_curstash), 0, PERL_MAGIC_symtab, 0, 0,
11029                                  0);
11030             }
11031             elements = mg->mg_len / sizeof(PMOP**);
11032             Renewc(mg->mg_ptr, elements + 1, PMOP*, char);
11033             ((PMOP**)mg->mg_ptr) [elements++] = pm;
11034             mg->mg_len = elements * sizeof(PMOP**);
11035             PmopSTASH_set(pm,PL_curstash);
11036         }
11037     }
11038 #ifdef PERL_MAD
11039     modstart = s;
11040 #endif
11041     while (*s && strchr(valid_flags, *s))
11042         pmflag(&pm->op_pmflags,*s++);
11043 #ifdef PERL_MAD
11044     if (PL_madskills && modstart != s) {
11045         SV* tmptoken = newSVpvn(modstart, s - modstart);
11046         append_madprops(newMADPROP('m', MAD_SV, tmptoken, 0), (OP*)pm, 0);
11047     }
11048 #endif
11049     /* issue a warning if /c is specified,but /g is not */
11050     if ((pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL)
11051             && ckWARN(WARN_REGEXP))
11052     {
11053         Perl_warner(aTHX_ packWARN(WARN_REGEXP), 
11054             "Use of /c modifier is meaningless without /g" );
11055     }
11056
11057     PL_lex_op = (OP*)pm;
11058     pl_yylval.ival = OP_MATCH;
11059     return s;
11060 }
11061
11062 STATIC char *
11063 S_scan_subst(pTHX_ char *start)
11064 {
11065     dVAR;
11066     register char *s;
11067     register PMOP *pm;
11068     I32 first_start;
11069     I32 es = 0;
11070 #ifdef PERL_MAD
11071     char *modstart;
11072 #endif
11073
11074     PERL_ARGS_ASSERT_SCAN_SUBST;
11075
11076     pl_yylval.ival = OP_NULL;
11077
11078     s = scan_str(start,!!PL_madskills,FALSE);
11079
11080     if (!s)
11081         Perl_croak(aTHX_ "Substitution pattern not terminated");
11082
11083     if (s[-1] == PL_multi_open)
11084         s--;
11085 #ifdef PERL_MAD
11086     if (PL_madskills) {
11087         CURMAD('q', PL_thisopen);
11088         CURMAD('_', PL_thiswhite);
11089         CURMAD('E', PL_thisstuff);
11090         CURMAD('Q', PL_thisclose);
11091         PL_realtokenstart = s - SvPVX(PL_linestr);
11092     }
11093 #endif
11094
11095     first_start = PL_multi_start;
11096     s = scan_str(s,!!PL_madskills,FALSE);
11097     if (!s) {
11098         if (PL_lex_stuff) {
11099             SvREFCNT_dec(PL_lex_stuff);
11100             PL_lex_stuff = NULL;
11101         }
11102         Perl_croak(aTHX_ "Substitution replacement not terminated");
11103     }
11104     PL_multi_start = first_start;       /* so whole substitution is taken together */
11105
11106     pm = (PMOP*)newPMOP(OP_SUBST, 0);
11107
11108 #ifdef PERL_MAD
11109     if (PL_madskills) {
11110         CURMAD('z', PL_thisopen);
11111         CURMAD('R', PL_thisstuff);
11112         CURMAD('Z', PL_thisclose);
11113     }
11114     modstart = s;
11115 #endif
11116
11117     while (*s) {
11118         if (*s == EXEC_PAT_MOD) {
11119             s++;
11120             es++;
11121         }
11122         else if (strchr(S_PAT_MODS, *s))
11123             pmflag(&pm->op_pmflags,*s++);
11124         else
11125             break;
11126     }
11127
11128 #ifdef PERL_MAD
11129     if (PL_madskills) {
11130         if (modstart != s)
11131             curmad('m', newSVpvn(modstart, s - modstart));
11132         append_madprops(PL_thismad, (OP*)pm, 0);
11133         PL_thismad = 0;
11134     }
11135 #endif
11136     if ((pm->op_pmflags & PMf_CONTINUE) && ckWARN(WARN_REGEXP)) {
11137         Perl_warner(aTHX_ packWARN(WARN_REGEXP), "Use of /c modifier is meaningless in s///" );
11138     }
11139
11140     if (es) {
11141         SV * const repl = newSVpvs("");
11142
11143         PL_sublex_info.super_bufptr = s;
11144         PL_sublex_info.super_bufend = PL_bufend;
11145         PL_multi_end = 0;
11146         pm->op_pmflags |= PMf_EVAL;
11147         while (es-- > 0) {
11148             if (es)
11149                 sv_catpvs(repl, "eval ");
11150             else
11151                 sv_catpvs(repl, "do ");
11152         }
11153         sv_catpvs(repl, "{");
11154         sv_catsv(repl, PL_lex_repl);
11155         if (strchr(SvPVX(PL_lex_repl), '#'))
11156             sv_catpvs(repl, "\n");
11157         sv_catpvs(repl, "}");
11158         SvEVALED_on(repl);
11159         SvREFCNT_dec(PL_lex_repl);
11160         PL_lex_repl = repl;
11161     }
11162
11163     PL_lex_op = (OP*)pm;
11164     pl_yylval.ival = OP_SUBST;
11165     return s;
11166 }
11167
11168 STATIC char *
11169 S_scan_trans(pTHX_ char *start)
11170 {
11171     dVAR;
11172     register char* s;
11173     OP *o;
11174     short *tbl;
11175     U8 squash;
11176     U8 del;
11177     U8 complement;
11178 #ifdef PERL_MAD
11179     char *modstart;
11180 #endif
11181
11182     PERL_ARGS_ASSERT_SCAN_TRANS;
11183
11184     pl_yylval.ival = OP_NULL;
11185
11186     s = scan_str(start,!!PL_madskills,FALSE);
11187     if (!s)
11188         Perl_croak(aTHX_ "Transliteration pattern not terminated");
11189
11190     if (s[-1] == PL_multi_open)
11191         s--;
11192 #ifdef PERL_MAD
11193     if (PL_madskills) {
11194         CURMAD('q', PL_thisopen);
11195         CURMAD('_', PL_thiswhite);
11196         CURMAD('E', PL_thisstuff);
11197         CURMAD('Q', PL_thisclose);
11198         PL_realtokenstart = s - SvPVX(PL_linestr);
11199     }
11200 #endif
11201
11202     s = scan_str(s,!!PL_madskills,FALSE);
11203     if (!s) {
11204         if (PL_lex_stuff) {
11205             SvREFCNT_dec(PL_lex_stuff);
11206             PL_lex_stuff = NULL;
11207         }
11208         Perl_croak(aTHX_ "Transliteration replacement not terminated");
11209     }
11210     if (PL_madskills) {
11211         CURMAD('z', PL_thisopen);
11212         CURMAD('R', PL_thisstuff);
11213         CURMAD('Z', PL_thisclose);
11214     }
11215
11216     complement = del = squash = 0;
11217 #ifdef PERL_MAD
11218     modstart = s;
11219 #endif
11220     while (1) {
11221         switch (*s) {
11222         case 'c':
11223             complement = OPpTRANS_COMPLEMENT;
11224             break;
11225         case 'd':
11226             del = OPpTRANS_DELETE;
11227             break;
11228         case 's':
11229             squash = OPpTRANS_SQUASH;
11230             break;
11231         default:
11232             goto no_more;
11233         }
11234         s++;
11235     }
11236   no_more:
11237
11238     tbl = (short *)PerlMemShared_calloc(complement&&!del?258:256, sizeof(short));
11239     o = newPVOP(OP_TRANS, 0, (char*)tbl);
11240     o->op_private &= ~OPpTRANS_ALL;
11241     o->op_private |= del|squash|complement|
11242       (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
11243       (DO_UTF8(PL_lex_repl) ? OPpTRANS_TO_UTF   : 0);
11244
11245     PL_lex_op = o;
11246     pl_yylval.ival = OP_TRANS;
11247
11248 #ifdef PERL_MAD
11249     if (PL_madskills) {
11250         if (modstart != s)
11251             curmad('m', newSVpvn(modstart, s - modstart));
11252         append_madprops(PL_thismad, o, 0);
11253         PL_thismad = 0;
11254     }
11255 #endif
11256
11257     return s;
11258 }
11259
11260 STATIC char *
11261 S_scan_heredoc(pTHX_ register char *s)
11262 {
11263     dVAR;
11264     SV *herewas;
11265     I32 op_type = OP_SCALAR;
11266     I32 len;
11267     SV *tmpstr;
11268     char term;
11269     const char *found_newline;
11270     register char *d;
11271     register char *e;
11272     char *peek;
11273     const int outer = (PL_rsfp && !(PL_lex_inwhat == OP_SCALAR));
11274 #ifdef PERL_MAD
11275     I32 stuffstart = s - SvPVX(PL_linestr);
11276     char *tstart;
11277  
11278     PL_realtokenstart = -1;
11279 #endif
11280
11281     PERL_ARGS_ASSERT_SCAN_HEREDOC;
11282
11283     s += 2;
11284     d = PL_tokenbuf;
11285     e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
11286     if (!outer)
11287         *d++ = '\n';
11288     peek = s;
11289     while (SPACE_OR_TAB(*peek))
11290         peek++;
11291     if (*peek == '`' || *peek == '\'' || *peek =='"') {
11292         s = peek;
11293         term = *s++;
11294         s = delimcpy(d, e, s, PL_bufend, term, &len);
11295         d += len;
11296         if (s < PL_bufend)
11297             s++;
11298     }
11299     else {
11300         if (*s == '\\')
11301             s++, term = '\'';
11302         else
11303             term = '"';
11304         if (!isALNUM_lazy_if(s,UTF))
11305             deprecate_old("bare << to mean <<\"\"");
11306         for (; isALNUM_lazy_if(s,UTF); s++) {
11307             if (d < e)
11308                 *d++ = *s;
11309         }
11310     }
11311     if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
11312         Perl_croak(aTHX_ "Delimiter for here document is too long");
11313     *d++ = '\n';
11314     *d = '\0';
11315     len = d - PL_tokenbuf;
11316
11317 #ifdef PERL_MAD
11318     if (PL_madskills) {
11319         tstart = PL_tokenbuf + !outer;
11320         PL_thisclose = newSVpvn(tstart, len - !outer);
11321         tstart = SvPVX(PL_linestr) + stuffstart;
11322         PL_thisopen = newSVpvn(tstart, s - tstart);
11323         stuffstart = s - SvPVX(PL_linestr);
11324     }
11325 #endif
11326 #ifndef PERL_STRICT_CR
11327     d = strchr(s, '\r');
11328     if (d) {
11329         char * const olds = s;
11330         s = d;
11331         while (s < PL_bufend) {
11332             if (*s == '\r') {
11333                 *d++ = '\n';
11334                 if (*++s == '\n')
11335                     s++;
11336             }
11337             else if (*s == '\n' && s[1] == '\r') {      /* \015\013 on a mac? */
11338                 *d++ = *s++;
11339                 s++;
11340             }
11341             else
11342                 *d++ = *s++;
11343         }
11344         *d = '\0';
11345         PL_bufend = d;
11346         SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
11347         s = olds;
11348     }
11349 #endif
11350 #ifdef PERL_MAD
11351     found_newline = 0;
11352 #endif
11353     if ( outer || !(found_newline = (char*)memchr((void*)s, '\n', PL_bufend - s)) ) {
11354         herewas = newSVpvn(s,PL_bufend-s);
11355     }
11356     else {
11357 #ifdef PERL_MAD
11358         herewas = newSVpvn(s-1,found_newline-s+1);
11359 #else
11360         s--;
11361         herewas = newSVpvn(s,found_newline-s);
11362 #endif
11363     }
11364 #ifdef PERL_MAD
11365     if (PL_madskills) {
11366         tstart = SvPVX(PL_linestr) + stuffstart;
11367         if (PL_thisstuff)
11368             sv_catpvn(PL_thisstuff, tstart, s - tstart);
11369         else
11370             PL_thisstuff = newSVpvn(tstart, s - tstart);
11371     }
11372 #endif
11373     s += SvCUR(herewas);
11374
11375 #ifdef PERL_MAD
11376     stuffstart = s - SvPVX(PL_linestr);
11377
11378     if (found_newline)
11379         s--;
11380 #endif
11381
11382     tmpstr = newSV_type(SVt_PVIV);
11383     SvGROW(tmpstr, 80);
11384     if (term == '\'') {
11385         op_type = OP_CONST;
11386         SvIV_set(tmpstr, -1);
11387     }
11388     else if (term == '`') {
11389         op_type = OP_BACKTICK;
11390         SvIV_set(tmpstr, '\\');
11391     }
11392
11393     CLINE;
11394     PL_multi_start = CopLINE(PL_curcop);
11395     PL_multi_open = PL_multi_close = '<';
11396     term = *PL_tokenbuf;
11397     if (PL_lex_inwhat == OP_SUBST && PL_in_eval && !PL_rsfp) {
11398         char * const bufptr = PL_sublex_info.super_bufptr;
11399         char * const bufend = PL_sublex_info.super_bufend;
11400         char * const olds = s - SvCUR(herewas);
11401         s = strchr(bufptr, '\n');
11402         if (!s)
11403             s = bufend;
11404         d = s;
11405         while (s < bufend &&
11406           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
11407             if (*s++ == '\n')
11408                 CopLINE_inc(PL_curcop);
11409         }
11410         if (s >= bufend) {
11411             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
11412             missingterm(PL_tokenbuf);
11413         }
11414         sv_setpvn(herewas,bufptr,d-bufptr+1);
11415         sv_setpvn(tmpstr,d+1,s-d);
11416         s += len - 1;
11417         sv_catpvn(herewas,s,bufend-s);
11418         Copy(SvPVX_const(herewas),bufptr,SvCUR(herewas) + 1,char);
11419
11420         s = olds;
11421         goto retval;
11422     }
11423     else if (!outer) {
11424         d = s;
11425         while (s < PL_bufend &&
11426           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
11427             if (*s++ == '\n')
11428                 CopLINE_inc(PL_curcop);
11429         }
11430         if (s >= PL_bufend) {
11431             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
11432             missingterm(PL_tokenbuf);
11433         }
11434         sv_setpvn(tmpstr,d+1,s-d);
11435 #ifdef PERL_MAD
11436         if (PL_madskills) {
11437             if (PL_thisstuff)
11438                 sv_catpvn(PL_thisstuff, d + 1, s - d);
11439             else
11440                 PL_thisstuff = newSVpvn(d + 1, s - d);
11441             stuffstart = s - SvPVX(PL_linestr);
11442         }
11443 #endif
11444         s += len - 1;
11445         CopLINE_inc(PL_curcop); /* the preceding stmt passes a newline */
11446
11447         sv_catpvn(herewas,s,PL_bufend-s);
11448         sv_setsv(PL_linestr,herewas);
11449         PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
11450         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
11451         PL_last_lop = PL_last_uni = NULL;
11452     }
11453     else
11454         sv_setpvs(tmpstr,"");   /* avoid "uninitialized" warning */
11455     while (s >= PL_bufend) {    /* multiple line string? */
11456 #ifdef PERL_MAD
11457         if (PL_madskills) {
11458             tstart = SvPVX(PL_linestr) + stuffstart;
11459             if (PL_thisstuff)
11460                 sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
11461             else
11462                 PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
11463         }
11464 #endif
11465         if (!outer ||
11466          !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
11467             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
11468             missingterm(PL_tokenbuf);
11469         }
11470 #ifdef PERL_MAD
11471         stuffstart = s - SvPVX(PL_linestr);
11472 #endif
11473         CopLINE_inc(PL_curcop);
11474         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
11475         PL_last_lop = PL_last_uni = NULL;
11476 #ifndef PERL_STRICT_CR
11477         if (PL_bufend - PL_linestart >= 2) {
11478             if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
11479                 (PL_bufend[-2] == '\n' && PL_bufend[-1] == '\r'))
11480             {
11481                 PL_bufend[-2] = '\n';
11482                 PL_bufend--;
11483                 SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
11484             }
11485             else if (PL_bufend[-1] == '\r')
11486                 PL_bufend[-1] = '\n';
11487         }
11488         else if (PL_bufend - PL_linestart == 1 && PL_bufend[-1] == '\r')
11489             PL_bufend[-1] = '\n';
11490 #endif
11491         if ((PERLDB_LINE || PERLDB_SAVESRC) && PL_curstash != PL_debstash)
11492             update_debugger_info(PL_linestr, NULL, 0);
11493         if (*s == term && memEQ(s,PL_tokenbuf,len)) {
11494             STRLEN off = PL_bufend - 1 - SvPVX_const(PL_linestr);
11495             *(SvPVX(PL_linestr) + off ) = ' ';
11496             sv_catsv(PL_linestr,herewas);
11497             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
11498             s = SvPVX(PL_linestr) + off; /* In case PV of PL_linestr moved. */
11499         }
11500         else {
11501             s = PL_bufend;
11502             sv_catsv(tmpstr,PL_linestr);
11503         }
11504     }
11505     s++;
11506 retval:
11507     PL_multi_end = CopLINE(PL_curcop);
11508     if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
11509         SvPV_shrink_to_cur(tmpstr);
11510     }
11511     SvREFCNT_dec(herewas);
11512     if (!IN_BYTES) {
11513         if (UTF && is_utf8_string((U8*)SvPVX_const(tmpstr), SvCUR(tmpstr)))
11514             SvUTF8_on(tmpstr);
11515         else if (PL_encoding)
11516             sv_recode_to_utf8(tmpstr, PL_encoding);
11517     }
11518     PL_lex_stuff = tmpstr;
11519     pl_yylval.ival = op_type;
11520     return s;
11521 }
11522
11523 /* scan_inputsymbol
11524    takes: current position in input buffer
11525    returns: new position in input buffer
11526    side-effects: pl_yylval and lex_op are set.
11527
11528    This code handles:
11529
11530    <>           read from ARGV
11531    <FH>         read from filehandle
11532    <pkg::FH>    read from package qualified filehandle
11533    <pkg'FH>     read from package qualified filehandle
11534    <$fh>        read from filehandle in $fh
11535    <*.h>        filename glob
11536
11537 */
11538
11539 STATIC char *
11540 S_scan_inputsymbol(pTHX_ char *start)
11541 {
11542     dVAR;
11543     register char *s = start;           /* current position in buffer */
11544     char *end;
11545     I32 len;
11546     char *d = PL_tokenbuf;                                      /* start of temp holding space */
11547     const char * const e = PL_tokenbuf + sizeof PL_tokenbuf;    /* end of temp holding space */
11548
11549     PERL_ARGS_ASSERT_SCAN_INPUTSYMBOL;
11550
11551     end = strchr(s, '\n');
11552     if (!end)
11553         end = PL_bufend;
11554     s = delimcpy(d, e, s + 1, end, '>', &len);  /* extract until > */
11555
11556     /* die if we didn't have space for the contents of the <>,
11557        or if it didn't end, or if we see a newline
11558     */
11559
11560     if (len >= (I32)sizeof PL_tokenbuf)
11561         Perl_croak(aTHX_ "Excessively long <> operator");
11562     if (s >= end)
11563         Perl_croak(aTHX_ "Unterminated <> operator");
11564
11565     s++;
11566
11567     /* check for <$fh>
11568        Remember, only scalar variables are interpreted as filehandles by
11569        this code.  Anything more complex (e.g., <$fh{$num}>) will be
11570        treated as a glob() call.
11571        This code makes use of the fact that except for the $ at the front,
11572        a scalar variable and a filehandle look the same.
11573     */
11574     if (*d == '$' && d[1]) d++;
11575
11576     /* allow <Pkg'VALUE> or <Pkg::VALUE> */
11577     while (*d && (isALNUM_lazy_if(d,UTF) || *d == '\'' || *d == ':'))
11578         d++;
11579
11580     /* If we've tried to read what we allow filehandles to look like, and
11581        there's still text left, then it must be a glob() and not a getline.
11582        Use scan_str to pull out the stuff between the <> and treat it
11583        as nothing more than a string.
11584     */
11585
11586     if (d - PL_tokenbuf != len) {
11587         pl_yylval.ival = OP_GLOB;
11588         s = scan_str(start,!!PL_madskills,FALSE);
11589         if (!s)
11590            Perl_croak(aTHX_ "Glob not terminated");
11591         return s;
11592     }
11593     else {
11594         bool readline_overriden = FALSE;
11595         GV *gv_readline;
11596         GV **gvp;
11597         /* we're in a filehandle read situation */
11598         d = PL_tokenbuf;
11599
11600         /* turn <> into <ARGV> */
11601         if (!len)
11602             Copy("ARGV",d,5,char);
11603
11604         /* Check whether readline() is overriden */
11605         gv_readline = gv_fetchpvs("readline", GV_NOTQUAL, SVt_PVCV);
11606         if ((gv_readline
11607                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline))
11608                 ||
11609                 ((gvp = (GV**)hv_fetchs(PL_globalstash, "readline", FALSE))
11610                  && (gv_readline = *gvp) && isGV_with_GP(gv_readline)
11611                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline)))
11612             readline_overriden = TRUE;
11613
11614         /* if <$fh>, create the ops to turn the variable into a
11615            filehandle
11616         */
11617         if (*d == '$') {
11618             /* try to find it in the pad for this block, otherwise find
11619                add symbol table ops
11620             */
11621             const PADOFFSET tmp = pad_findmy(d);
11622             if (tmp != NOT_IN_PAD) {
11623                 if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
11624                     HV * const stash = PAD_COMPNAME_OURSTASH(tmp);
11625                     HEK * const stashname = HvNAME_HEK(stash);
11626                     SV * const sym = sv_2mortal(newSVhek(stashname));
11627                     sv_catpvs(sym, "::");
11628                     sv_catpv(sym, d+1);
11629                     d = SvPVX(sym);
11630                     goto intro_sym;
11631                 }
11632                 else {
11633                     OP * const o = newOP(OP_PADSV, 0);
11634                     o->op_targ = tmp;
11635                     PL_lex_op = readline_overriden
11636                         ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
11637                                 append_elem(OP_LIST, o,
11638                                     newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
11639                         : (OP*)newUNOP(OP_READLINE, 0, o);
11640                 }
11641             }
11642             else {
11643                 GV *gv;
11644                 ++d;
11645 intro_sym:
11646                 gv = gv_fetchpv(d,
11647                                 (PL_in_eval
11648                                  ? (GV_ADDMULTI | GV_ADDINEVAL)
11649                                  : GV_ADDMULTI),
11650                                 SVt_PV);
11651                 PL_lex_op = readline_overriden
11652                     ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
11653                             append_elem(OP_LIST,
11654                                 newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
11655                                 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
11656                     : (OP*)newUNOP(OP_READLINE, 0,
11657                             newUNOP(OP_RV2SV, 0,
11658                                 newGVOP(OP_GV, 0, gv)));
11659             }
11660             if (!readline_overriden)
11661                 PL_lex_op->op_flags |= OPf_SPECIAL;
11662             /* we created the ops in PL_lex_op, so make pl_yylval.ival a null op */
11663             pl_yylval.ival = OP_NULL;
11664         }
11665
11666         /* If it's none of the above, it must be a literal filehandle
11667            (<Foo::BAR> or <FOO>) so build a simple readline OP */
11668         else {
11669             GV * const gv = gv_fetchpv(d, GV_ADD, SVt_PVIO);
11670             PL_lex_op = readline_overriden
11671                 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
11672                         append_elem(OP_LIST,
11673                             newGVOP(OP_GV, 0, gv),
11674                             newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
11675                 : (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
11676             pl_yylval.ival = OP_NULL;
11677         }
11678     }
11679
11680     return s;
11681 }
11682
11683
11684 /* scan_str
11685    takes: start position in buffer
11686           keep_quoted preserve \ on the embedded delimiter(s)
11687           keep_delims preserve the delimiters around the string
11688    returns: position to continue reading from buffer
11689    side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
11690         updates the read buffer.
11691
11692    This subroutine pulls a string out of the input.  It is called for:
11693         q               single quotes           q(literal text)
11694         '               single quotes           'literal text'
11695         qq              double quotes           qq(interpolate $here please)
11696         "               double quotes           "interpolate $here please"
11697         qx              backticks               qx(/bin/ls -l)
11698         `               backticks               `/bin/ls -l`
11699         qw              quote words             @EXPORT_OK = qw( func() $spam )
11700         m//             regexp match            m/this/
11701         s///            regexp substitute       s/this/that/
11702         tr///           string transliterate    tr/this/that/
11703         y///            string transliterate    y/this/that/
11704         ($*@)           sub prototypes          sub foo ($)
11705         (stuff)         sub attr parameters     sub foo : attr(stuff)
11706         <>              readline or globs       <FOO>, <>, <$fh>, or <*.c>
11707         
11708    In most of these cases (all but <>, patterns and transliterate)
11709    yylex() calls scan_str().  m// makes yylex() call scan_pat() which
11710    calls scan_str().  s/// makes yylex() call scan_subst() which calls
11711    scan_str().  tr/// and y/// make yylex() call scan_trans() which
11712    calls scan_str().
11713
11714    It skips whitespace before the string starts, and treats the first
11715    character as the delimiter.  If the delimiter is one of ([{< then
11716    the corresponding "close" character )]}> is used as the closing
11717    delimiter.  It allows quoting of delimiters, and if the string has
11718    balanced delimiters ([{<>}]) it allows nesting.
11719
11720    On success, the SV with the resulting string is put into lex_stuff or,
11721    if that is already non-NULL, into lex_repl. The second case occurs only
11722    when parsing the RHS of the special constructs s/// and tr/// (y///).
11723    For convenience, the terminating delimiter character is stuffed into
11724    SvIVX of the SV.
11725 */
11726
11727 STATIC char *
11728 S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
11729 {
11730     dVAR;
11731     SV *sv;                             /* scalar value: string */
11732     const char *tmps;                   /* temp string, used for delimiter matching */
11733     register char *s = start;           /* current position in the buffer */
11734     register char term;                 /* terminating character */
11735     register char *to;                  /* current position in the sv's data */
11736     I32 brackets = 1;                   /* bracket nesting level */
11737     bool has_utf8 = FALSE;              /* is there any utf8 content? */
11738     I32 termcode;                       /* terminating char. code */
11739     U8 termstr[UTF8_MAXBYTES];          /* terminating string */
11740     STRLEN termlen;                     /* length of terminating string */
11741     int last_off = 0;                   /* last position for nesting bracket */
11742 #ifdef PERL_MAD
11743     int stuffstart;
11744     char *tstart;
11745 #endif
11746
11747     PERL_ARGS_ASSERT_SCAN_STR;
11748
11749     /* skip space before the delimiter */
11750     if (isSPACE(*s)) {
11751         s = PEEKSPACE(s);
11752     }
11753
11754 #ifdef PERL_MAD
11755     if (PL_realtokenstart >= 0) {
11756         stuffstart = PL_realtokenstart;
11757         PL_realtokenstart = -1;
11758     }
11759     else
11760         stuffstart = start - SvPVX(PL_linestr);
11761 #endif
11762     /* mark where we are, in case we need to report errors */
11763     CLINE;
11764
11765     /* after skipping whitespace, the next character is the terminator */
11766     term = *s;
11767     if (!UTF) {
11768         termcode = termstr[0] = term;
11769         termlen = 1;
11770     }
11771     else {
11772         termcode = utf8_to_uvchr((U8*)s, &termlen);
11773         Copy(s, termstr, termlen, U8);
11774         if (!UTF8_IS_INVARIANT(term))
11775             has_utf8 = TRUE;
11776     }
11777
11778     /* mark where we are */
11779     PL_multi_start = CopLINE(PL_curcop);
11780     PL_multi_open = term;
11781
11782     /* find corresponding closing delimiter */
11783     if (term && (tmps = strchr("([{< )]}> )]}>",term)))
11784         termcode = termstr[0] = term = tmps[5];
11785
11786     PL_multi_close = term;
11787
11788     /* create a new SV to hold the contents.  79 is the SV's initial length.
11789        What a random number. */
11790     sv = newSV_type(SVt_PVIV);
11791     SvGROW(sv, 80);
11792     SvIV_set(sv, termcode);
11793     (void)SvPOK_only(sv);               /* validate pointer */
11794
11795     /* move past delimiter and try to read a complete string */
11796     if (keep_delims)
11797         sv_catpvn(sv, s, termlen);
11798     s += termlen;
11799 #ifdef PERL_MAD
11800     tstart = SvPVX(PL_linestr) + stuffstart;
11801     if (!PL_thisopen && !keep_delims) {
11802         PL_thisopen = newSVpvn(tstart, s - tstart);
11803         stuffstart = s - SvPVX(PL_linestr);
11804     }
11805 #endif
11806     for (;;) {
11807         if (PL_encoding && !UTF) {
11808             bool cont = TRUE;
11809
11810             while (cont) {
11811                 int offset = s - SvPVX_const(PL_linestr);
11812                 const bool found = sv_cat_decode(sv, PL_encoding, PL_linestr,
11813                                            &offset, (char*)termstr, termlen);
11814                 const char * const ns = SvPVX_const(PL_linestr) + offset;
11815                 char * const svlast = SvEND(sv) - 1;
11816
11817                 for (; s < ns; s++) {
11818                     if (*s == '\n' && !PL_rsfp)
11819                         CopLINE_inc(PL_curcop);
11820                 }
11821                 if (!found)
11822                     goto read_more_line;
11823                 else {
11824                     /* handle quoted delimiters */
11825                     if (SvCUR(sv) > 1 && *(svlast-1) == '\\') {
11826                         const char *t;
11827                         for (t = svlast-2; t >= SvPVX_const(sv) && *t == '\\';)
11828                             t--;
11829                         if ((svlast-1 - t) % 2) {
11830                             if (!keep_quoted) {
11831                                 *(svlast-1) = term;
11832                                 *svlast = '\0';
11833                                 SvCUR_set(sv, SvCUR(sv) - 1);
11834                             }
11835                             continue;
11836                         }
11837                     }
11838                     if (PL_multi_open == PL_multi_close) {
11839                         cont = FALSE;
11840                     }
11841                     else {
11842                         const char *t;
11843                         char *w;
11844                         for (t = w = SvPVX(sv)+last_off; t < svlast; w++, t++) {
11845                             /* At here, all closes are "was quoted" one,
11846                                so we don't check PL_multi_close. */
11847                             if (*t == '\\') {
11848                                 if (!keep_quoted && *(t+1) == PL_multi_open)
11849                                     t++;
11850                                 else
11851                                     *w++ = *t++;
11852                             }
11853                             else if (*t == PL_multi_open)
11854                                 brackets++;
11855
11856                             *w = *t;
11857                         }
11858                         if (w < t) {
11859                             *w++ = term;
11860                             *w = '\0';
11861                             SvCUR_set(sv, w - SvPVX_const(sv));
11862                         }
11863                         last_off = w - SvPVX(sv);
11864                         if (--brackets <= 0)
11865                             cont = FALSE;
11866                     }
11867                 }
11868             }
11869             if (!keep_delims) {
11870                 SvCUR_set(sv, SvCUR(sv) - 1);
11871                 *SvEND(sv) = '\0';
11872             }
11873             break;
11874         }
11875
11876         /* extend sv if need be */
11877         SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
11878         /* set 'to' to the next character in the sv's string */
11879         to = SvPVX(sv)+SvCUR(sv);
11880
11881         /* if open delimiter is the close delimiter read unbridle */
11882         if (PL_multi_open == PL_multi_close) {
11883             for (; s < PL_bufend; s++,to++) {
11884                 /* embedded newlines increment the current line number */
11885                 if (*s == '\n' && !PL_rsfp)
11886                     CopLINE_inc(PL_curcop);
11887                 /* handle quoted delimiters */
11888                 if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
11889                     if (!keep_quoted && s[1] == term)
11890                         s++;
11891                 /* any other quotes are simply copied straight through */
11892                     else
11893                         *to++ = *s++;
11894                 }
11895                 /* terminate when run out of buffer (the for() condition), or
11896                    have found the terminator */
11897                 else if (*s == term) {
11898                     if (termlen == 1)
11899                         break;
11900                     if (s+termlen <= PL_bufend && memEQ(s, (char*)termstr, termlen))
11901                         break;
11902                 }
11903                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
11904                     has_utf8 = TRUE;
11905                 *to = *s;
11906             }
11907         }
11908         
11909         /* if the terminator isn't the same as the start character (e.g.,
11910            matched brackets), we have to allow more in the quoting, and
11911            be prepared for nested brackets.
11912         */
11913         else {
11914             /* read until we run out of string, or we find the terminator */
11915             for (; s < PL_bufend; s++,to++) {
11916                 /* embedded newlines increment the line count */
11917                 if (*s == '\n' && !PL_rsfp)
11918                     CopLINE_inc(PL_curcop);
11919                 /* backslashes can escape the open or closing characters */
11920                 if (*s == '\\' && s+1 < PL_bufend) {
11921                     if (!keep_quoted &&
11922                         ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
11923                         s++;
11924                     else
11925                         *to++ = *s++;
11926                 }
11927                 /* allow nested opens and closes */
11928                 else if (*s == PL_multi_close && --brackets <= 0)
11929                     break;
11930                 else if (*s == PL_multi_open)
11931                     brackets++;
11932                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
11933                     has_utf8 = TRUE;
11934                 *to = *s;
11935             }
11936         }
11937         /* terminate the copied string and update the sv's end-of-string */
11938         *to = '\0';
11939         SvCUR_set(sv, to - SvPVX_const(sv));
11940
11941         /*
11942          * this next chunk reads more into the buffer if we're not done yet
11943          */
11944
11945         if (s < PL_bufend)
11946             break;              /* handle case where we are done yet :-) */
11947
11948 #ifndef PERL_STRICT_CR
11949         if (to - SvPVX_const(sv) >= 2) {
11950             if ((to[-2] == '\r' && to[-1] == '\n') ||
11951                 (to[-2] == '\n' && to[-1] == '\r'))
11952             {
11953                 to[-2] = '\n';
11954                 to--;
11955                 SvCUR_set(sv, to - SvPVX_const(sv));
11956             }
11957             else if (to[-1] == '\r')
11958                 to[-1] = '\n';
11959         }
11960         else if (to - SvPVX_const(sv) == 1 && to[-1] == '\r')
11961             to[-1] = '\n';
11962 #endif
11963         
11964      read_more_line:
11965         /* if we're out of file, or a read fails, bail and reset the current
11966            line marker so we can report where the unterminated string began
11967         */
11968 #ifdef PERL_MAD
11969         if (PL_madskills) {
11970             char * const tstart = SvPVX(PL_linestr) + stuffstart;
11971             if (PL_thisstuff)
11972                 sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
11973             else
11974                 PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
11975         }
11976 #endif
11977         if (!PL_rsfp ||
11978          !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
11979             sv_free(sv);
11980             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
11981             return NULL;
11982         }
11983 #ifdef PERL_MAD
11984         stuffstart = 0;
11985 #endif
11986         /* we read a line, so increment our line counter */
11987         CopLINE_inc(PL_curcop);
11988
11989         /* update debugger info */
11990         if ((PERLDB_LINE || PERLDB_SAVESRC) && PL_curstash != PL_debstash)
11991             update_debugger_info(PL_linestr, NULL, 0);
11992
11993         /* having changed the buffer, we must update PL_bufend */
11994         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
11995         PL_last_lop = PL_last_uni = NULL;
11996     }
11997
11998     /* at this point, we have successfully read the delimited string */
11999
12000     if (!PL_encoding || UTF) {
12001 #ifdef PERL_MAD
12002         if (PL_madskills) {
12003             char * const tstart = SvPVX(PL_linestr) + stuffstart;
12004             const int len = s - tstart;
12005             if (PL_thisstuff)
12006                 sv_catpvn(PL_thisstuff, tstart, len);
12007             else
12008                 PL_thisstuff = newSVpvn(tstart, len);
12009             if (!PL_thisclose && !keep_delims)
12010                 PL_thisclose = newSVpvn(s,termlen);
12011         }
12012 #endif
12013
12014         if (keep_delims)
12015             sv_catpvn(sv, s, termlen);
12016         s += termlen;
12017     }
12018 #ifdef PERL_MAD
12019     else {
12020         if (PL_madskills) {
12021             char * const tstart = SvPVX(PL_linestr) + stuffstart;
12022             const int len = s - tstart - termlen;
12023             if (PL_thisstuff)
12024                 sv_catpvn(PL_thisstuff, tstart, len);
12025             else
12026                 PL_thisstuff = newSVpvn(tstart, len);
12027             if (!PL_thisclose && !keep_delims)
12028                 PL_thisclose = newSVpvn(s - termlen,termlen);
12029         }
12030     }
12031 #endif
12032     if (has_utf8 || PL_encoding)
12033         SvUTF8_on(sv);
12034
12035     PL_multi_end = CopLINE(PL_curcop);
12036
12037     /* if we allocated too much space, give some back */
12038     if (SvCUR(sv) + 5 < SvLEN(sv)) {
12039         SvLEN_set(sv, SvCUR(sv) + 1);
12040         SvPV_renew(sv, SvLEN(sv));
12041     }
12042
12043     /* decide whether this is the first or second quoted string we've read
12044        for this op
12045     */
12046
12047     if (PL_lex_stuff)
12048         PL_lex_repl = sv;
12049     else
12050         PL_lex_stuff = sv;
12051     return s;
12052 }
12053
12054 /*
12055   scan_num
12056   takes: pointer to position in buffer
12057   returns: pointer to new position in buffer
12058   side-effects: builds ops for the constant in pl_yylval.op
12059
12060   Read a number in any of the formats that Perl accepts:
12061
12062   \d(_?\d)*(\.(\d(_?\d)*)?)?[Ee][\+\-]?(\d(_?\d)*)      12 12.34 12.
12063   \.\d(_?\d)*[Ee][\+\-]?(\d(_?\d)*)                     .34
12064   0b[01](_?[01])*
12065   0[0-7](_?[0-7])*
12066   0x[0-9A-Fa-f](_?[0-9A-Fa-f])*
12067
12068   Like most scan_ routines, it uses the PL_tokenbuf buffer to hold the
12069   thing it reads.
12070
12071   If it reads a number without a decimal point or an exponent, it will
12072   try converting the number to an integer and see if it can do so
12073   without loss of precision.
12074 */
12075
12076 char *
12077 Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
12078 {
12079     dVAR;
12080     register const char *s = start;     /* current position in buffer */
12081     register char *d;                   /* destination in temp buffer */
12082     register char *e;                   /* end of temp buffer */
12083     NV nv;                              /* number read, as a double */
12084     SV *sv = NULL;                      /* place to put the converted number */
12085     bool floatit;                       /* boolean: int or float? */
12086     const char *lastub = NULL;          /* position of last underbar */
12087     static char const number_too_long[] = "Number too long";
12088
12089     PERL_ARGS_ASSERT_SCAN_NUM;
12090
12091     /* We use the first character to decide what type of number this is */
12092
12093     switch (*s) {
12094     default:
12095       Perl_croak(aTHX_ "panic: scan_num");
12096
12097     /* if it starts with a 0, it could be an octal number, a decimal in
12098        0.13 disguise, or a hexadecimal number, or a binary number. */
12099     case '0':
12100         {
12101           /* variables:
12102              u          holds the "number so far"
12103              shift      the power of 2 of the base
12104                         (hex == 4, octal == 3, binary == 1)
12105              overflowed was the number more than we can hold?
12106
12107              Shift is used when we add a digit.  It also serves as an "are
12108              we in octal/hex/binary?" indicator to disallow hex characters
12109              when in octal mode.
12110            */
12111             NV n = 0.0;
12112             UV u = 0;
12113             I32 shift;
12114             bool overflowed = FALSE;
12115             bool just_zero  = TRUE;     /* just plain 0 or binary number? */
12116             static const NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
12117             static const char* const bases[5] =
12118               { "", "binary", "", "octal", "hexadecimal" };
12119             static const char* const Bases[5] =
12120               { "", "Binary", "", "Octal", "Hexadecimal" };
12121             static const char* const maxima[5] =
12122               { "",
12123                 "0b11111111111111111111111111111111",
12124                 "",
12125                 "037777777777",
12126                 "0xffffffff" };
12127             const char *base, *Base, *max;
12128
12129             /* check for hex */
12130             if (s[1] == 'x') {
12131                 shift = 4;
12132                 s += 2;
12133                 just_zero = FALSE;
12134             } else if (s[1] == 'b') {
12135                 shift = 1;
12136                 s += 2;
12137                 just_zero = FALSE;
12138             }
12139             /* check for a decimal in disguise */
12140             else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
12141                 goto decimal;
12142             /* so it must be octal */
12143             else {
12144                 shift = 3;
12145                 s++;
12146             }
12147
12148             if (*s == '_') {
12149                if (ckWARN(WARN_SYNTAX))
12150                    Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
12151                                "Misplaced _ in number");
12152                lastub = s++;
12153             }
12154
12155             base = bases[shift];
12156             Base = Bases[shift];
12157             max  = maxima[shift];
12158
12159             /* read the rest of the number */
12160             for (;;) {
12161                 /* x is used in the overflow test,
12162                    b is the digit we're adding on. */
12163                 UV x, b;
12164
12165                 switch (*s) {
12166
12167                 /* if we don't mention it, we're done */
12168                 default:
12169                     goto out;
12170
12171                 /* _ are ignored -- but warned about if consecutive */
12172                 case '_':
12173                     if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
12174                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
12175                                     "Misplaced _ in number");
12176                     lastub = s++;
12177                     break;
12178
12179                 /* 8 and 9 are not octal */
12180                 case '8': case '9':
12181                     if (shift == 3)
12182                         yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
12183                     /* FALL THROUGH */
12184
12185                 /* octal digits */
12186                 case '2': case '3': case '4':
12187                 case '5': case '6': case '7':
12188                     if (shift == 1)
12189                         yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
12190                     /* FALL THROUGH */
12191
12192                 case '0': case '1':
12193                     b = *s++ & 15;              /* ASCII digit -> value of digit */
12194                     goto digit;
12195
12196                 /* hex digits */
12197                 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
12198                 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
12199                     /* make sure they said 0x */
12200                     if (shift != 4)
12201                         goto out;
12202                     b = (*s++ & 7) + 9;
12203
12204                     /* Prepare to put the digit we have onto the end
12205                        of the number so far.  We check for overflows.
12206                     */
12207
12208                   digit:
12209                     just_zero = FALSE;
12210                     if (!overflowed) {
12211                         x = u << shift; /* make room for the digit */
12212
12213                         if ((x >> shift) != u
12214                             && !(PL_hints & HINT_NEW_BINARY)) {
12215                             overflowed = TRUE;
12216                             n = (NV) u;
12217                             if (ckWARN_d(WARN_OVERFLOW))
12218                                 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
12219                                             "Integer overflow in %s number",
12220                                             base);
12221                         } else
12222                             u = x | b;          /* add the digit to the end */
12223                     }
12224                     if (overflowed) {
12225                         n *= nvshift[shift];
12226                         /* If an NV has not enough bits in its
12227                          * mantissa to represent an UV this summing of
12228                          * small low-order numbers is a waste of time
12229                          * (because the NV cannot preserve the
12230                          * low-order bits anyway): we could just
12231                          * remember when did we overflow and in the
12232                          * end just multiply n by the right
12233                          * amount. */
12234                         n += (NV) b;
12235                     }
12236                     break;
12237                 }
12238             }
12239
12240           /* if we get here, we had success: make a scalar value from
12241              the number.
12242           */
12243           out:
12244
12245             /* final misplaced underbar check */
12246             if (s[-1] == '_') {
12247                 if (ckWARN(WARN_SYNTAX))
12248                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
12249             }
12250
12251             sv = newSV(0);
12252             if (overflowed) {
12253                 if (n > 4294967295.0 && ckWARN(WARN_PORTABLE))
12254                     Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
12255                                 "%s number > %s non-portable",
12256                                 Base, max);
12257                 sv_setnv(sv, n);
12258             }
12259             else {
12260 #if UVSIZE > 4
12261                 if (u > 0xffffffff && ckWARN(WARN_PORTABLE))
12262                     Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
12263                                 "%s number > %s non-portable",
12264                                 Base, max);
12265 #endif
12266                 sv_setuv(sv, u);
12267             }
12268             if (just_zero && (PL_hints & HINT_NEW_INTEGER))
12269                 sv = new_constant(start, s - start, "integer",
12270                                   sv, NULL, NULL, 0);
12271             else if (PL_hints & HINT_NEW_BINARY)
12272                 sv = new_constant(start, s - start, "binary", sv, NULL, NULL, 0);
12273         }
12274         break;
12275
12276     /*
12277       handle decimal numbers.
12278       we're also sent here when we read a 0 as the first digit
12279     */
12280     case '1': case '2': case '3': case '4': case '5':
12281     case '6': case '7': case '8': case '9': case '.':
12282       decimal:
12283         d = PL_tokenbuf;
12284         e = PL_tokenbuf + sizeof PL_tokenbuf - 6; /* room for various punctuation */
12285         floatit = FALSE;
12286
12287         /* read next group of digits and _ and copy into d */
12288         while (isDIGIT(*s) || *s == '_') {
12289             /* skip underscores, checking for misplaced ones
12290                if -w is on
12291             */
12292             if (*s == '_') {
12293                 if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
12294                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
12295                                 "Misplaced _ in number");
12296                 lastub = s++;
12297             }
12298             else {
12299                 /* check for end of fixed-length buffer */
12300                 if (d >= e)
12301                     Perl_croak(aTHX_ number_too_long);
12302                 /* if we're ok, copy the character */
12303                 *d++ = *s++;
12304             }
12305         }
12306
12307         /* final misplaced underbar check */
12308         if (lastub && s == lastub + 1) {
12309             if (ckWARN(WARN_SYNTAX))
12310                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
12311         }
12312
12313         /* read a decimal portion if there is one.  avoid
12314            3..5 being interpreted as the number 3. followed
12315            by .5
12316         */
12317         if (*s == '.' && s[1] != '.') {
12318             floatit = TRUE;
12319             *d++ = *s++;
12320
12321             if (*s == '_') {
12322                 if (ckWARN(WARN_SYNTAX))
12323                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
12324                                 "Misplaced _ in number");
12325                 lastub = s;
12326             }
12327
12328             /* copy, ignoring underbars, until we run out of digits.
12329             */
12330             for (; isDIGIT(*s) || *s == '_'; s++) {
12331                 /* fixed length buffer check */
12332                 if (d >= e)
12333                     Perl_croak(aTHX_ number_too_long);
12334                 if (*s == '_') {
12335                    if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
12336                        Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
12337                                    "Misplaced _ in number");
12338                    lastub = s;
12339                 }
12340                 else
12341                     *d++ = *s;
12342             }
12343             /* fractional part ending in underbar? */
12344             if (s[-1] == '_') {
12345                 if (ckWARN(WARN_SYNTAX))
12346                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
12347                                 "Misplaced _ in number");
12348             }
12349             if (*s == '.' && isDIGIT(s[1])) {
12350                 /* oops, it's really a v-string, but without the "v" */
12351                 s = start;
12352                 goto vstring;
12353             }
12354         }
12355
12356         /* read exponent part, if present */
12357         if ((*s == 'e' || *s == 'E') && strchr("+-0123456789_", s[1])) {
12358             floatit = TRUE;
12359             s++;
12360
12361             /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
12362             *d++ = 'e';         /* At least some Mach atof()s don't grok 'E' */
12363
12364             /* stray preinitial _ */
12365             if (*s == '_') {
12366                 if (ckWARN(WARN_SYNTAX))
12367                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
12368                                 "Misplaced _ in number");
12369                 lastub = s++;
12370             }
12371
12372             /* allow positive or negative exponent */
12373             if (*s == '+' || *s == '-')
12374                 *d++ = *s++;
12375
12376             /* stray initial _ */
12377             if (*s == '_') {
12378                 if (ckWARN(WARN_SYNTAX))
12379                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
12380                                 "Misplaced _ in number");
12381                 lastub = s++;
12382             }
12383
12384             /* read digits of exponent */
12385             while (isDIGIT(*s) || *s == '_') {
12386                 if (isDIGIT(*s)) {
12387                     if (d >= e)
12388                         Perl_croak(aTHX_ number_too_long);
12389                     *d++ = *s++;
12390                 }
12391                 else {
12392                    if (((lastub && s == lastub + 1) ||
12393                         (!isDIGIT(s[1]) && s[1] != '_'))
12394                     && ckWARN(WARN_SYNTAX))
12395                        Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
12396                                    "Misplaced _ in number");
12397                    lastub = s++;
12398                 }
12399             }
12400         }
12401
12402
12403         /* make an sv from the string */
12404         sv = newSV(0);
12405
12406         /*
12407            We try to do an integer conversion first if no characters
12408            indicating "float" have been found.
12409          */
12410
12411         if (!floatit) {
12412             UV uv;
12413             const int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
12414
12415             if (flags == IS_NUMBER_IN_UV) {
12416               if (uv <= IV_MAX)
12417                 sv_setiv(sv, uv); /* Prefer IVs over UVs. */
12418               else
12419                 sv_setuv(sv, uv);
12420             } else if (flags == (IS_NUMBER_IN_UV | IS_NUMBER_NEG)) {
12421               if (uv <= (UV) IV_MIN)
12422                 sv_setiv(sv, -(IV)uv);
12423               else
12424                 floatit = TRUE;
12425             } else
12426               floatit = TRUE;
12427         }
12428         if (floatit) {
12429             /* terminate the string */
12430             *d = '\0';
12431             nv = Atof(PL_tokenbuf);
12432             sv_setnv(sv, nv);
12433         }
12434
12435         if ( floatit
12436              ? (PL_hints & HINT_NEW_FLOAT) : (PL_hints & HINT_NEW_INTEGER) ) {
12437             const char *const key = floatit ? "float" : "integer";
12438             const STRLEN keylen = floatit ? 5 : 7;
12439             sv = S_new_constant(aTHX_ PL_tokenbuf, d - PL_tokenbuf,
12440                                 key, keylen, sv, NULL, NULL, 0);
12441         }
12442         break;
12443
12444     /* if it starts with a v, it could be a v-string */
12445     case 'v':
12446 vstring:
12447                 sv = newSV(5); /* preallocate storage space */
12448                 s = scan_vstring(s, PL_bufend, sv);
12449         break;
12450     }
12451
12452     /* make the op for the constant and return */
12453
12454     if (sv)
12455         lvalp->opval = newSVOP(OP_CONST, 0, sv);
12456     else
12457         lvalp->opval = NULL;
12458
12459     return (char *)s;
12460 }
12461
12462 STATIC char *
12463 S_scan_formline(pTHX_ register char *s)
12464 {
12465     dVAR;
12466     register char *eol;
12467     register char *t;
12468     SV * const stuff = newSVpvs("");
12469     bool needargs = FALSE;
12470     bool eofmt = FALSE;
12471 #ifdef PERL_MAD
12472     char *tokenstart = s;
12473     SV* savewhite = NULL;
12474
12475     if (PL_madskills) {
12476         savewhite = PL_thiswhite;
12477         PL_thiswhite = 0;
12478     }
12479 #endif
12480
12481     PERL_ARGS_ASSERT_SCAN_FORMLINE;
12482
12483     while (!needargs) {
12484         if (*s == '.') {
12485             t = s+1;
12486 #ifdef PERL_STRICT_CR
12487             while (SPACE_OR_TAB(*t))
12488                 t++;
12489 #else
12490             while (SPACE_OR_TAB(*t) || *t == '\r')
12491                 t++;
12492 #endif
12493             if (*t == '\n' || t == PL_bufend) {
12494                 eofmt = TRUE;
12495                 break;
12496             }
12497         }
12498         if (PL_in_eval && !PL_rsfp) {
12499             eol = (char *) memchr(s,'\n',PL_bufend-s);
12500             if (!eol++)
12501                 eol = PL_bufend;
12502         }
12503         else
12504             eol = PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
12505         if (*s != '#') {
12506             for (t = s; t < eol; t++) {
12507                 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
12508                     needargs = FALSE;
12509                     goto enough;        /* ~~ must be first line in formline */
12510                 }
12511                 if (*t == '@' || *t == '^')
12512                     needargs = TRUE;
12513             }
12514             if (eol > s) {
12515                 sv_catpvn(stuff, s, eol-s);
12516 #ifndef PERL_STRICT_CR
12517                 if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
12518                     char *end = SvPVX(stuff) + SvCUR(stuff);
12519                     end[-2] = '\n';
12520                     end[-1] = '\0';
12521                     SvCUR_set(stuff, SvCUR(stuff) - 1);
12522                 }
12523 #endif
12524             }
12525             else
12526               break;
12527         }
12528         s = (char*)eol;
12529         if (PL_rsfp) {
12530 #ifdef PERL_MAD
12531             if (PL_madskills) {
12532                 if (PL_thistoken)
12533                     sv_catpvn(PL_thistoken, tokenstart, PL_bufend - tokenstart);
12534                 else
12535                     PL_thistoken = newSVpvn(tokenstart, PL_bufend - tokenstart);
12536             }
12537 #endif
12538             s = filter_gets(PL_linestr, PL_rsfp, 0);
12539 #ifdef PERL_MAD
12540             tokenstart = PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
12541 #else
12542             PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
12543 #endif
12544             PL_bufend = PL_bufptr + SvCUR(PL_linestr);
12545             PL_last_lop = PL_last_uni = NULL;
12546             if (!s) {
12547                 s = PL_bufptr;
12548                 break;
12549             }
12550         }
12551         incline(s);
12552     }
12553   enough:
12554     if (SvCUR(stuff)) {
12555         PL_expect = XTERM;
12556         if (needargs) {
12557             PL_lex_state = LEX_NORMAL;
12558             start_force(PL_curforce);
12559             NEXTVAL_NEXTTOKE.ival = 0;
12560             force_next(',');
12561         }
12562         else
12563             PL_lex_state = LEX_FORMLINE;
12564         if (!IN_BYTES) {
12565             if (UTF && is_utf8_string((U8*)SvPVX_const(stuff), SvCUR(stuff)))
12566                 SvUTF8_on(stuff);
12567             else if (PL_encoding)
12568                 sv_recode_to_utf8(stuff, PL_encoding);
12569         }
12570         start_force(PL_curforce);
12571         NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0, stuff);
12572         force_next(THING);
12573         start_force(PL_curforce);
12574         NEXTVAL_NEXTTOKE.ival = OP_FORMLINE;
12575         force_next(LSTOP);
12576     }
12577     else {
12578         SvREFCNT_dec(stuff);
12579         if (eofmt)
12580             PL_lex_formbrack = 0;
12581         PL_bufptr = s;
12582     }
12583 #ifdef PERL_MAD
12584     if (PL_madskills) {
12585         if (PL_thistoken)
12586             sv_catpvn(PL_thistoken, tokenstart, s - tokenstart);
12587         else
12588             PL_thistoken = newSVpvn(tokenstart, s - tokenstart);
12589         PL_thiswhite = savewhite;
12590     }
12591 #endif
12592     return s;
12593 }
12594
12595 I32
12596 Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
12597 {
12598     dVAR;
12599     const I32 oldsavestack_ix = PL_savestack_ix;
12600     CV* const outsidecv = PL_compcv;
12601
12602     if (PL_compcv) {
12603         assert(SvTYPE(PL_compcv) == SVt_PVCV);
12604     }
12605     SAVEI32(PL_subline);
12606     save_item(PL_subname);
12607     SAVESPTR(PL_compcv);
12608
12609     PL_compcv = MUTABLE_CV(newSV_type(is_format ? SVt_PVFM : SVt_PVCV));
12610     CvFLAGS(PL_compcv) |= flags;
12611
12612     PL_subline = CopLINE(PL_curcop);
12613     CvPADLIST(PL_compcv) = pad_new(padnew_SAVE|padnew_SAVESUB);
12614     CvOUTSIDE(PL_compcv) = MUTABLE_CV(SvREFCNT_inc_simple(outsidecv));
12615     CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
12616
12617     return oldsavestack_ix;
12618 }
12619
12620 #ifdef __SC__
12621 #pragma segment Perl_yylex
12622 #endif
12623 static int
12624 S_yywarn(pTHX_ const char *const s)
12625 {
12626     dVAR;
12627
12628     PERL_ARGS_ASSERT_YYWARN;
12629
12630     PL_in_eval |= EVAL_WARNONLY;
12631     yyerror(s);
12632     PL_in_eval &= ~EVAL_WARNONLY;
12633     return 0;
12634 }
12635
12636 int
12637 Perl_yyerror(pTHX_ const char *const s)
12638 {
12639     dVAR;
12640     const char *where = NULL;
12641     const char *context = NULL;
12642     int contlen = -1;
12643     SV *msg;
12644     int yychar  = PL_parser->yychar;
12645
12646     PERL_ARGS_ASSERT_YYERROR;
12647
12648     if (!yychar || (yychar == ';' && !PL_rsfp))
12649         where = "at EOF";
12650     else if (PL_oldoldbufptr && PL_bufptr > PL_oldoldbufptr &&
12651       PL_bufptr - PL_oldoldbufptr < 200 && PL_oldoldbufptr != PL_oldbufptr &&
12652       PL_oldbufptr != PL_bufptr) {
12653         /*
12654                 Only for NetWare:
12655                 The code below is removed for NetWare because it abends/crashes on NetWare
12656                 when the script has error such as not having the closing quotes like:
12657                     if ($var eq "value)
12658                 Checking of white spaces is anyway done in NetWare code.
12659         */
12660 #ifndef NETWARE
12661         while (isSPACE(*PL_oldoldbufptr))
12662             PL_oldoldbufptr++;
12663 #endif
12664         context = PL_oldoldbufptr;
12665         contlen = PL_bufptr - PL_oldoldbufptr;
12666     }
12667     else if (PL_oldbufptr && PL_bufptr > PL_oldbufptr &&
12668       PL_bufptr - PL_oldbufptr < 200 && PL_oldbufptr != PL_bufptr) {
12669         /*
12670                 Only for NetWare:
12671                 The code below is removed for NetWare because it abends/crashes on NetWare
12672                 when the script has error such as not having the closing quotes like:
12673                     if ($var eq "value)
12674                 Checking of white spaces is anyway done in NetWare code.
12675         */
12676 #ifndef NETWARE
12677         while (isSPACE(*PL_oldbufptr))
12678             PL_oldbufptr++;
12679 #endif
12680         context = PL_oldbufptr;
12681         contlen = PL_bufptr - PL_oldbufptr;
12682     }
12683     else if (yychar > 255)
12684         where = "next token ???";
12685     else if (yychar == -2) { /* YYEMPTY */
12686         if (PL_lex_state == LEX_NORMAL ||
12687            (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
12688             where = "at end of line";
12689         else if (PL_lex_inpat)
12690             where = "within pattern";
12691         else
12692             where = "within string";
12693     }
12694     else {
12695         SV * const where_sv = newSVpvs_flags("next char ", SVs_TEMP);
12696         if (yychar < 32)
12697             Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
12698         else if (isPRINT_LC(yychar)) {
12699             const char string = yychar;
12700             sv_catpvn(where_sv, &string, 1);
12701         }
12702         else
12703             Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
12704         where = SvPVX_const(where_sv);
12705     }
12706     msg = sv_2mortal(newSVpv(s, 0));
12707     Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
12708         OutCopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
12709     if (context)
12710         Perl_sv_catpvf(aTHX_ msg, "near \"%.*s\"\n", contlen, context);
12711     else
12712         Perl_sv_catpvf(aTHX_ msg, "%s\n", where);
12713     if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
12714         Perl_sv_catpvf(aTHX_ msg,
12715         "  (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
12716                 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
12717         PL_multi_end = 0;
12718     }
12719     if (PL_in_eval & EVAL_WARNONLY) {
12720         if (ckWARN_d(WARN_SYNTAX))
12721             Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "%"SVf, SVfARG(msg));
12722     }
12723     else
12724         qerror(msg);
12725     if (PL_error_count >= 10) {
12726         if (PL_in_eval && SvCUR(ERRSV))
12727             Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
12728                        SVfARG(ERRSV), OutCopFILE(PL_curcop));
12729         else
12730             Perl_croak(aTHX_ "%s has too many errors.\n",
12731             OutCopFILE(PL_curcop));
12732     }
12733     PL_in_my = 0;
12734     PL_in_my_stash = NULL;
12735     return 0;
12736 }
12737 #ifdef __SC__
12738 #pragma segment Main
12739 #endif
12740
12741 STATIC char*
12742 S_swallow_bom(pTHX_ U8 *s)
12743 {
12744     dVAR;
12745     const STRLEN slen = SvCUR(PL_linestr);
12746
12747     PERL_ARGS_ASSERT_SWALLOW_BOM;
12748
12749     switch (s[0]) {
12750     case 0xFF:
12751         if (s[1] == 0xFE) {
12752             /* UTF-16 little-endian? (or UTF32-LE?) */
12753             if (s[2] == 0 && s[3] == 0)  /* UTF-32 little-endian */
12754                 Perl_croak(aTHX_ "Unsupported script encoding UTF32-LE");
12755 #ifndef PERL_NO_UTF16_FILTER
12756             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF16-LE script encoding (BOM)\n");
12757             s += 2;
12758         utf16le:
12759             if (PL_bufend > (char*)s) {
12760                 U8 *news;
12761                 I32 newlen;
12762
12763                 filter_add(utf16rev_textfilter, NULL);
12764                 Newx(news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
12765                 utf16_to_utf8_reversed(s, news,
12766                                        PL_bufend - (char*)s - 1,
12767                                        &newlen);
12768                 sv_setpvn(PL_linestr, (const char*)news, newlen);
12769 #ifdef PERL_MAD
12770                 s = (U8*)SvPVX(PL_linestr);
12771                 Copy(news, s, newlen, U8);
12772                 s[newlen] = '\0';
12773 #endif
12774                 Safefree(news);
12775                 SvUTF8_on(PL_linestr);
12776                 s = (U8*)SvPVX(PL_linestr);
12777 #ifdef PERL_MAD
12778                 /* FIXME - is this a general bug fix?  */
12779                 s[newlen] = '\0';
12780 #endif
12781                 PL_bufend = SvPVX(PL_linestr) + newlen;
12782             }
12783 #else
12784             Perl_croak(aTHX_ "Unsupported script encoding UTF16-LE");
12785 #endif
12786         }
12787         break;
12788     case 0xFE:
12789         if (s[1] == 0xFF) {   /* UTF-16 big-endian? */
12790 #ifndef PERL_NO_UTF16_FILTER
12791             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (BOM)\n");
12792             s += 2;
12793         utf16be:
12794             if (PL_bufend > (char *)s) {
12795                 U8 *news;
12796                 I32 newlen;
12797
12798                 filter_add(utf16_textfilter, NULL);
12799                 Newx(news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
12800                 utf16_to_utf8(s, news,
12801                               PL_bufend - (char*)s,
12802                               &newlen);
12803                 sv_setpvn(PL_linestr, (const char*)news, newlen);
12804                 Safefree(news);
12805                 SvUTF8_on(PL_linestr);
12806                 s = (U8*)SvPVX(PL_linestr);
12807                 PL_bufend = SvPVX(PL_linestr) + newlen;
12808             }
12809 #else
12810             Perl_croak(aTHX_ "Unsupported script encoding UTF16-BE");
12811 #endif
12812         }
12813         break;
12814     case 0xEF:
12815         if (slen > 2 && s[1] == 0xBB && s[2] == 0xBF) {
12816             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
12817             s += 3;                      /* UTF-8 */
12818         }
12819         break;
12820     case 0:
12821         if (slen > 3) {
12822              if (s[1] == 0) {
12823                   if (s[2] == 0xFE && s[3] == 0xFF) {
12824                        /* UTF-32 big-endian */
12825                        Perl_croak(aTHX_ "Unsupported script encoding UTF32-BE");
12826                   }
12827              }
12828              else if (s[2] == 0 && s[3] != 0) {
12829                   /* Leading bytes
12830                    * 00 xx 00 xx
12831                    * are a good indicator of UTF-16BE. */
12832                   if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (no BOM)\n");
12833                   goto utf16be;
12834              }
12835         }
12836 #ifdef EBCDIC
12837     case 0xDD:
12838         if (slen > 3 && s[1] == 0x73 && s[2] == 0x66 && s[3] == 0x73) {
12839             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
12840             s += 4;                      /* UTF-8 */
12841         }
12842         break;
12843 #endif
12844
12845     default:
12846          if (slen > 3 && s[1] == 0 && s[2] != 0 && s[3] == 0) {
12847                   /* Leading bytes
12848                    * xx 00 xx 00
12849                    * are a good indicator of UTF-16LE. */
12850               if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (no BOM)\n");
12851               goto utf16le;
12852          }
12853     }
12854     return (char*)s;
12855 }
12856
12857
12858 #ifndef PERL_NO_UTF16_FILTER
12859 static I32
12860 utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
12861 {
12862     dVAR;
12863     const STRLEN old = SvCUR(sv);
12864     const I32 count = FILTER_READ(idx+1, sv, maxlen);
12865     DEBUG_P(PerlIO_printf(Perl_debug_log,
12866                           "utf16_textfilter(%p): %d %d (%d)\n",
12867                           FPTR2DPTR(void *, utf16_textfilter),
12868                           idx, maxlen, (int) count));
12869     if (count) {
12870         U8* tmps;
12871         I32 newlen;
12872         Newx(tmps, SvCUR(sv) * 3 / 2 + 1, U8);
12873         Copy(SvPVX_const(sv), tmps, old, char);
12874         utf16_to_utf8((U8*)SvPVX_const(sv) + old, tmps + old,
12875                       SvCUR(sv) - old, &newlen);
12876         sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
12877     }
12878     DEBUG_P({sv_dump(sv);});
12879     return SvCUR(sv);
12880 }
12881
12882 static I32
12883 utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen)
12884 {
12885     dVAR;
12886     const STRLEN old = SvCUR(sv);
12887     const I32 count = FILTER_READ(idx+1, sv, maxlen);
12888     DEBUG_P(PerlIO_printf(Perl_debug_log,
12889                           "utf16rev_textfilter(%p): %d %d (%d)\n",
12890                           FPTR2DPTR(void *, utf16rev_textfilter),
12891                           idx, maxlen, (int) count));
12892     if (count) {
12893         U8* tmps;
12894         I32 newlen;
12895         Newx(tmps, SvCUR(sv) * 3 / 2 + 1, U8);
12896         Copy(SvPVX_const(sv), tmps, old, char);
12897         utf16_to_utf8((U8*)SvPVX_const(sv) + old, tmps + old,
12898                       SvCUR(sv) - old, &newlen);
12899         sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
12900     }
12901     DEBUG_P({ sv_dump(sv); });
12902     return count;
12903 }
12904 #endif
12905
12906 /*
12907 Returns a pointer to the next character after the parsed
12908 vstring, as well as updating the passed in sv.
12909
12910 Function must be called like
12911
12912         sv = newSV(5);
12913         s = scan_vstring(s,e,sv);
12914
12915 where s and e are the start and end of the string.
12916 The sv should already be large enough to store the vstring
12917 passed in, for performance reasons.
12918
12919 */
12920
12921 char *
12922 Perl_scan_vstring(pTHX_ const char *s, const char *const e, SV *sv)
12923 {
12924     dVAR;
12925     const char *pos = s;
12926     const char *start = s;
12927
12928     PERL_ARGS_ASSERT_SCAN_VSTRING;
12929
12930     if (*pos == 'v') pos++;  /* get past 'v' */
12931     while (pos < e && (isDIGIT(*pos) || *pos == '_'))
12932         pos++;
12933     if ( *pos != '.') {
12934         /* this may not be a v-string if followed by => */
12935         const char *next = pos;
12936         while (next < e && isSPACE(*next))
12937             ++next;
12938         if ((e - next) >= 2 && *next == '=' && next[1] == '>' ) {
12939             /* return string not v-string */
12940             sv_setpvn(sv,(char *)s,pos-s);
12941             return (char *)pos;
12942         }
12943     }
12944
12945     if (!isALPHA(*pos)) {
12946         U8 tmpbuf[UTF8_MAXBYTES+1];
12947
12948         if (*s == 'v')
12949             s++;  /* get past 'v' */
12950
12951         sv_setpvs(sv, "");
12952
12953         for (;;) {
12954             /* this is atoi() that tolerates underscores */
12955             U8 *tmpend;
12956             UV rev = 0;
12957             const char *end = pos;
12958             UV mult = 1;
12959             while (--end >= s) {
12960                 if (*end != '_') {
12961                     const UV orev = rev;
12962                     rev += (*end - '0') * mult;
12963                     mult *= 10;
12964                     if (orev > rev && ckWARN_d(WARN_OVERFLOW))
12965                         Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
12966                                     "Integer overflow in decimal number");
12967                 }
12968             }
12969 #ifdef EBCDIC
12970             if (rev > 0x7FFFFFFF)
12971                  Perl_croak(aTHX_ "In EBCDIC the v-string components cannot exceed 2147483647");
12972 #endif
12973             /* Append native character for the rev point */
12974             tmpend = uvchr_to_utf8(tmpbuf, rev);
12975             sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
12976             if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(rev)))
12977                  SvUTF8_on(sv);
12978             if (pos + 1 < e && *pos == '.' && isDIGIT(pos[1]))
12979                  s = ++pos;
12980             else {
12981                  s = pos;
12982                  break;
12983             }
12984             while (pos < e && (isDIGIT(*pos) || *pos == '_'))
12985                  pos++;
12986         }
12987         SvPOK_on(sv);
12988         sv_magic(sv,NULL,PERL_MAGIC_vstring,(const char*)start, pos-start);
12989         SvRMAGICAL_on(sv);
12990     }
12991     return (char *)s;
12992 }
12993
12994 /*
12995  * Local variables:
12996  * c-indentation-style: bsd
12997  * c-basic-offset: 4
12998  * indent-tabs-mode: t
12999  * End:
13000  *
13001  * ex: set ts=8 sts=4 sw=4 noet:
13002  */