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