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