This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
svleak.t: Add test for #123198
[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, 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, (int)BITOROP))
224 #define BAop(f)  return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, (int)BITANDOP))
225 #define SHop(f)  return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, (int)SHIFTOP))
226 #define PWop(f)  return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, (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, (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, (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 REPORT(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                      * Skip the disambiguation and treat this as a block.
5506                      */
5507                     goto block_expectation;
5508                 }
5509                 /* This hack serves to disambiguate a pair of curlies
5510                  * as being a block or an anon hash.  Normally, expectation
5511                  * determines that, but in cases where we're not in a
5512                  * position to expect anything in particular (like inside
5513                  * eval"") we have to resolve the ambiguity.  This code
5514                  * covers the case where the first term in the curlies is a
5515                  * quoted string.  Most other cases need to be explicitly
5516                  * disambiguated by prepending a "+" before the opening
5517                  * curly in order to force resolution as an anon hash.
5518                  *
5519                  * XXX should probably propagate the outer expectation
5520                  * into eval"" to rely less on this hack, but that could
5521                  * potentially break current behavior of eval"".
5522                  * GSAR 97-07-21
5523                  */
5524                 t = s;
5525                 if (*s == '\'' || *s == '"' || *s == '`') {
5526                     /* common case: get past first string, handling escapes */
5527                     for (t++; t < PL_bufend && *t != *s;)
5528                         if (*t++ == '\\')
5529                             t++;
5530                     t++;
5531                 }
5532                 else if (*s == 'q') {
5533                     if (++t < PL_bufend
5534                         && (!isWORDCHAR(*t)
5535                             || ((*t == 'q' || *t == 'x') && ++t < PL_bufend
5536                                 && !isWORDCHAR(*t))))
5537                     {
5538                         /* skip q//-like construct */
5539                         const char *tmps;
5540                         char open, close, term;
5541                         I32 brackets = 1;
5542
5543                         while (t < PL_bufend && isSPACE(*t))
5544                             t++;
5545                         /* check for q => */
5546                         if (t+1 < PL_bufend && t[0] == '=' && t[1] == '>') {
5547                             OPERATOR(HASHBRACK);
5548                         }
5549                         term = *t;
5550                         open = term;
5551                         if (term && (tmps = strchr("([{< )]}> )]}>",term)))
5552                             term = tmps[5];
5553                         close = term;
5554                         if (open == close)
5555                             for (t++; t < PL_bufend; t++) {
5556                                 if (*t == '\\' && t+1 < PL_bufend && open != '\\')
5557                                     t++;
5558                                 else if (*t == open)
5559                                     break;
5560                             }
5561                         else {
5562                             for (t++; t < PL_bufend; t++) {
5563                                 if (*t == '\\' && t+1 < PL_bufend)
5564                                     t++;
5565                                 else if (*t == close && --brackets <= 0)
5566                                     break;
5567                                 else if (*t == open)
5568                                     brackets++;
5569                             }
5570                         }
5571                         t++;
5572                     }
5573                     else
5574                         /* skip plain q word */
5575                         while (t < PL_bufend && isWORDCHAR_lazy_if(t,UTF))
5576                              t += UTF8SKIP(t);
5577                 }
5578                 else if (isWORDCHAR_lazy_if(t,UTF)) {
5579                     t += UTF8SKIP(t);
5580                     while (t < PL_bufend && isWORDCHAR_lazy_if(t,UTF))
5581                          t += UTF8SKIP(t);
5582                 }
5583                 while (t < PL_bufend && isSPACE(*t))
5584                     t++;
5585                 /* if comma follows first term, call it an anon hash */
5586                 /* XXX it could be a comma expression with loop modifiers */
5587                 if (t < PL_bufend && ((*t == ',' && (*s == 'q' || !isLOWER(*s)))
5588                                    || (*t == '=' && t[1] == '>')))
5589                     OPERATOR(HASHBRACK);
5590                 if (PL_expect == XREF)
5591                 {
5592                   block_expectation:
5593                     /* If there is an opening brace or 'sub:', treat it
5594                        as a term to make ${{...}}{k} and &{sub:attr...}
5595                        dwim.  Otherwise, treat it as a statement, so
5596                        map {no strict; ...} works.
5597                      */
5598                     s = skipspace(s);
5599                     if (*s == '{') {
5600                         PL_expect = XTERM;
5601                         break;
5602                     }
5603                     if (strnEQ(s, "sub", 3)) {
5604                         d = s + 3;
5605                         d = skipspace(d);
5606                         if (*d == ':') {
5607                             PL_expect = XTERM;
5608                             break;
5609                         }
5610                     }
5611                     PL_expect = XSTATE;
5612                 }
5613                 else {
5614                     PL_lex_brackstack[PL_lex_brackets-1] = XSTATE;
5615                     PL_expect = XSTATE;
5616                 }
5617             }
5618             break;
5619         }
5620         pl_yylval.ival = CopLINE(PL_curcop);
5621         PL_copline = NOLINE;   /* invalidate current command line number */
5622         TOKEN(formbrack ? '=' : '{');
5623     case '}':
5624         if (PL_lex_brackets && PL_lex_brackstack[PL_lex_brackets-1] == XFAKEEOF)
5625             TOKEN(0);
5626       rightbracket:
5627         s++;
5628         if (PL_lex_brackets <= 0)
5629             /* diag_listed_as: Unmatched right %s bracket */
5630             yyerror("Unmatched right curly bracket");
5631         else
5632             PL_expect = (expectation)PL_lex_brackstack[--PL_lex_brackets];
5633         PL_lex_allbrackets--;
5634         if (PL_lex_state == LEX_INTERPNORMAL) {
5635             if (PL_lex_brackets == 0) {
5636                 if (PL_expect & XFAKEBRACK) {
5637                     PL_expect &= XENUMMASK;
5638                     PL_lex_state = LEX_INTERPEND;
5639                     PL_bufptr = s;
5640                     return yylex();     /* ignore fake brackets */
5641                 }
5642                 if (PL_lex_inwhat == OP_SUBST && PL_lex_repl == PL_linestr
5643                  && SvEVALED(PL_lex_repl))
5644                     PL_lex_state = LEX_INTERPEND;
5645                 else if (*s == '-' && s[1] == '>')
5646                     PL_lex_state = LEX_INTERPENDMAYBE;
5647                 else if (*s != '[' && *s != '{')
5648                     PL_lex_state = LEX_INTERPEND;
5649             }
5650         }
5651         if (PL_expect & XFAKEBRACK) {
5652             PL_expect &= XENUMMASK;
5653             PL_bufptr = s;
5654             return yylex();             /* ignore fake brackets */
5655         }
5656         force_next(formbrack ? '.' : '}');
5657         if (formbrack) LEAVE;
5658         if (formbrack == 2) { /* means . where arguments were expected */
5659             force_next(';');
5660             TOKEN(FORMRBRACK);
5661         }
5662         TOKEN(';');
5663     case '&':
5664         if (PL_expect == XPOSTDEREF) POSTDEREF('&');
5665         s++;
5666         if (*s++ == '&') {
5667             if (!PL_lex_allbrackets && PL_lex_fakeeof >=
5668                     (*s == '=' ? LEX_FAKEEOF_ASSIGN : LEX_FAKEEOF_LOGIC)) {
5669                 s -= 2;
5670                 TOKEN(0);
5671             }
5672             AOPERATOR(ANDAND);
5673         }
5674         s--;
5675         if (PL_expect == XOPERATOR) {
5676             if (PL_bufptr == PL_linestart && ckWARN(WARN_SEMICOLON)
5677                 && isIDFIRST_lazy_if(s,UTF))
5678             {
5679                 CopLINE_dec(PL_curcop);
5680                 Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), "%s", PL_warn_nosemi);
5681                 CopLINE_inc(PL_curcop);
5682             }
5683             if (!PL_lex_allbrackets && PL_lex_fakeeof >=
5684                     (*s == '=' ? LEX_FAKEEOF_ASSIGN : LEX_FAKEEOF_BITWISE)) {
5685                 s--;
5686                 TOKEN(0);
5687             }
5688             PL_parser->saw_infix_sigil = 1;
5689             BAop(OP_BIT_AND);
5690         }
5691
5692         PL_tokenbuf[0] = '&';
5693         s = scan_ident(s - 1, PL_tokenbuf + 1,
5694                        sizeof PL_tokenbuf - 1, TRUE);
5695         if (PL_tokenbuf[1]) {
5696             PL_expect = XOPERATOR;
5697             force_ident_maybe_lex('&');
5698         }
5699         else
5700             PREREF('&');
5701         pl_yylval.ival = (OPpENTERSUB_AMPER<<8);
5702         TERM('&');
5703
5704     case '|':
5705         s++;
5706         if (*s++ == '|') {
5707             if (!PL_lex_allbrackets && PL_lex_fakeeof >=
5708                     (*s == '=' ? LEX_FAKEEOF_ASSIGN : LEX_FAKEEOF_LOGIC)) {
5709                 s -= 2;
5710                 TOKEN(0);
5711             }
5712             AOPERATOR(OROR);
5713         }
5714         s--;
5715         if (!PL_lex_allbrackets && PL_lex_fakeeof >=
5716                 (*s == '=' ? LEX_FAKEEOF_ASSIGN : LEX_FAKEEOF_BITWISE)) {
5717             s--;
5718             TOKEN(0);
5719         }
5720         BOop(OP_BIT_OR);
5721     case '=':
5722         s++;
5723         {
5724             const char tmp = *s++;
5725             if (tmp == '=') {
5726                 if (!PL_lex_allbrackets &&
5727                         PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) {
5728                     s -= 2;
5729                     TOKEN(0);
5730                 }
5731                 Eop(OP_EQ);
5732             }
5733             if (tmp == '>') {
5734                 if (!PL_lex_allbrackets &&
5735                         PL_lex_fakeeof >= LEX_FAKEEOF_COMMA) {
5736                     s -= 2;
5737                     TOKEN(0);
5738                 }
5739                 OPERATOR(',');
5740             }
5741             if (tmp == '~')
5742                 PMop(OP_MATCH);
5743             if (tmp && isSPACE(*s) && ckWARN(WARN_SYNTAX)
5744                 && strchr("+-*/%.^&|<",tmp))
5745                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5746                             "Reversed %c= operator",(int)tmp);
5747             s--;
5748             if (PL_expect == XSTATE && isALPHA(tmp) &&
5749                 (s == PL_linestart+1 || s[-2] == '\n') )
5750                 {
5751                     if ((PL_in_eval && !PL_rsfp && !PL_parser->filtered)
5752                         || PL_lex_state != LEX_NORMAL) {
5753                         d = PL_bufend;
5754                         while (s < d) {
5755                             if (*s++ == '\n') {
5756                                 incline(s);
5757                                 if (strnEQ(s,"=cut",4)) {
5758                                     s = strchr(s,'\n');
5759                                     if (s)
5760                                         s++;
5761                                     else
5762                                         s = d;
5763                                     incline(s);
5764                                     goto retry;
5765                                 }
5766                             }
5767                         }
5768                         goto retry;
5769                     }
5770                     s = PL_bufend;
5771                     PL_parser->in_pod = 1;
5772                     goto retry;
5773                 }
5774         }
5775         if (PL_expect == XBLOCK) {
5776             const char *t = s;
5777 #ifdef PERL_STRICT_CR
5778             while (SPACE_OR_TAB(*t))
5779 #else
5780             while (SPACE_OR_TAB(*t) || *t == '\r')
5781 #endif
5782                 t++;
5783             if (*t == '\n' || *t == '#') {
5784                 formbrack = 1;
5785                 ENTER;
5786                 SAVEI8(PL_parser->form_lex_state);
5787                 SAVEI32(PL_lex_formbrack);
5788                 PL_parser->form_lex_state = PL_lex_state;
5789                 PL_lex_formbrack = PL_lex_brackets + 1;
5790                 goto leftbracket;
5791             }
5792         }
5793         if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) {
5794             s--;
5795             TOKEN(0);
5796         }
5797         pl_yylval.ival = 0;
5798         OPERATOR(ASSIGNOP);
5799     case '!':
5800         s++;
5801         {
5802             const char tmp = *s++;
5803             if (tmp == '=') {
5804                 /* was this !=~ where !~ was meant?
5805                  * warn on m:!=~\s+([/?]|[msy]\W|tr\W): */
5806
5807                 if (*s == '~' && ckWARN(WARN_SYNTAX)) {
5808                     const char *t = s+1;
5809
5810                     while (t < PL_bufend && isSPACE(*t))
5811                         ++t;
5812
5813                     if (*t == '/' || *t == '?' ||
5814                         ((*t == 'm' || *t == 's' || *t == 'y')
5815                          && !isWORDCHAR(t[1])) ||
5816                         (*t == 't' && t[1] == 'r' && !isWORDCHAR(t[2])))
5817                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5818                                     "!=~ should be !~");
5819                 }
5820                 if (!PL_lex_allbrackets &&
5821                         PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) {
5822                     s -= 2;
5823                     TOKEN(0);
5824                 }
5825                 Eop(OP_NE);
5826             }
5827             if (tmp == '~')
5828                 PMop(OP_NOT);
5829         }
5830         s--;
5831         OPERATOR('!');
5832     case '<':
5833         if (PL_expect != XOPERATOR) {
5834             if (s[1] != '<' && !strchr(s,'>'))
5835                 check_uni();
5836             if (s[1] == '<' && s[2] != '>')
5837                 s = scan_heredoc(s);
5838             else
5839                 s = scan_inputsymbol(s);
5840             PL_expect = XOPERATOR;
5841             TOKEN(sublex_start());
5842         }
5843         s++;
5844         {
5845             char tmp = *s++;
5846             if (tmp == '<') {
5847                 if (*s == '=' && !PL_lex_allbrackets &&
5848                         PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) {
5849                     s -= 2;
5850                     TOKEN(0);
5851                 }
5852                 SHop(OP_LEFT_SHIFT);
5853             }
5854             if (tmp == '=') {
5855                 tmp = *s++;
5856                 if (tmp == '>') {
5857                     if (!PL_lex_allbrackets &&
5858                             PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) {
5859                         s -= 3;
5860                         TOKEN(0);
5861                     }
5862                     Eop(OP_NCMP);
5863                 }
5864                 s--;
5865                 if (!PL_lex_allbrackets &&
5866                         PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) {
5867                     s -= 2;
5868                     TOKEN(0);
5869                 }
5870                 Rop(OP_LE);
5871             }
5872         }
5873         s--;
5874         if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) {
5875             s--;
5876             TOKEN(0);
5877         }
5878         Rop(OP_LT);
5879     case '>':
5880         s++;
5881         {
5882             const char tmp = *s++;
5883             if (tmp == '>') {
5884                 if (*s == '=' && !PL_lex_allbrackets &&
5885                         PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) {
5886                     s -= 2;
5887                     TOKEN(0);
5888                 }
5889                 SHop(OP_RIGHT_SHIFT);
5890             }
5891             else if (tmp == '=') {
5892                 if (!PL_lex_allbrackets &&
5893                         PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) {
5894                     s -= 2;
5895                     TOKEN(0);
5896                 }
5897                 Rop(OP_GE);
5898             }
5899         }
5900         s--;
5901         if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) {
5902             s--;
5903             TOKEN(0);
5904         }
5905         Rop(OP_GT);
5906
5907     case '$':
5908         CLINE;
5909
5910         if (PL_expect == XOPERATOR) {
5911             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
5912                 return deprecate_commaless_var_list();
5913             }
5914         }
5915         else if (PL_expect == XPOSTDEREF) {
5916             if (s[1] == '#') {
5917                 s++;
5918                 POSTDEREF(DOLSHARP);
5919             }
5920             POSTDEREF('$');
5921         }
5922
5923         if (s[1] == '#' && (isIDFIRST_lazy_if(s+2,UTF) || strchr("{$:+-@", s[2]))) {
5924             PL_tokenbuf[0] = '@';
5925             s = scan_ident(s + 1, PL_tokenbuf + 1,
5926                            sizeof PL_tokenbuf - 1, FALSE);
5927             if (PL_expect == XOPERATOR)
5928                 no_op("Array length", s);
5929             if (!PL_tokenbuf[1])
5930                 PREREF(DOLSHARP);
5931             PL_expect = XOPERATOR;
5932             force_ident_maybe_lex('#');
5933             TOKEN(DOLSHARP);
5934         }
5935
5936         PL_tokenbuf[0] = '$';
5937         s = scan_ident(s, PL_tokenbuf + 1,
5938                        sizeof PL_tokenbuf - 1, FALSE);
5939         if (PL_expect == XOPERATOR)
5940             no_op("Scalar", s);
5941         if (!PL_tokenbuf[1]) {
5942             if (s == PL_bufend)
5943                 yyerror("Final $ should be \\$ or $name");
5944             PREREF('$');
5945         }
5946
5947         d = s;
5948         {
5949             const char tmp = *s;
5950             if (PL_lex_state == LEX_NORMAL || PL_lex_brackets)
5951                 s = skipspace(s);
5952
5953             if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop)
5954                 && intuit_more(s)) {
5955                 if (*s == '[') {
5956                     PL_tokenbuf[0] = '@';
5957                     if (ckWARN(WARN_SYNTAX)) {
5958                         char *t = s+1;
5959
5960                         while (isSPACE(*t) || isWORDCHAR_lazy_if(t,UTF) || *t == '$')
5961                             t++;
5962                         if (*t++ == ',') {
5963                             PL_bufptr = skipspace(PL_bufptr); /* XXX can realloc */
5964                             while (t < PL_bufend && *t != ']')
5965                                 t++;
5966                             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5967                                         "Multidimensional syntax %.*s not supported",
5968                                     (int)((t - PL_bufptr) + 1), PL_bufptr);
5969                         }
5970                     }
5971                 }
5972                 else if (*s == '{') {
5973                     char *t;
5974                     PL_tokenbuf[0] = '%';
5975                     if (strEQ(PL_tokenbuf+1, "SIG")  && ckWARN(WARN_SYNTAX)
5976                         && (t = strchr(s, '}')) && (t = strchr(t, '=')))
5977                         {
5978                             char tmpbuf[sizeof PL_tokenbuf];
5979                             do {
5980                                 t++;
5981                             } while (isSPACE(*t));
5982                             if (isIDFIRST_lazy_if(t,UTF)) {
5983                                 STRLEN len;
5984                                 t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE,
5985                                               &len);
5986                                 while (isSPACE(*t))
5987                                     t++;
5988                                 if (*t == ';'
5989                                        && get_cvn_flags(tmpbuf, len, UTF ? SVf_UTF8 : 0))
5990                                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5991                                         "You need to quote \"%"UTF8f"\"",
5992                                          UTF8fARG(UTF, len, tmpbuf));
5993                             }
5994                         }
5995                 }
5996             }
5997
5998             PL_expect = XOPERATOR;
5999             if (PL_lex_state == LEX_NORMAL && isSPACE((char)tmp)) {
6000                 const bool islop = (PL_last_lop == PL_oldoldbufptr);
6001                 if (!islop || PL_last_lop_op == OP_GREPSTART)
6002                     PL_expect = XOPERATOR;
6003                 else if (strchr("$@\"'`q", *s))
6004                     PL_expect = XTERM;          /* e.g. print $fh "foo" */
6005                 else if (strchr("&*<%", *s) && isIDFIRST_lazy_if(s+1,UTF))
6006                     PL_expect = XTERM;          /* e.g. print $fh &sub */
6007                 else if (isIDFIRST_lazy_if(s,UTF)) {
6008                     char tmpbuf[sizeof PL_tokenbuf];
6009                     int t2;
6010                     scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
6011                     if ((t2 = keyword(tmpbuf, len, 0))) {
6012                         /* binary operators exclude handle interpretations */
6013                         switch (t2) {
6014                         case -KEY_x:
6015                         case -KEY_eq:
6016                         case -KEY_ne:
6017                         case -KEY_gt:
6018                         case -KEY_lt:
6019                         case -KEY_ge:
6020                         case -KEY_le:
6021                         case -KEY_cmp:
6022                             break;
6023                         default:
6024                             PL_expect = XTERM;  /* e.g. print $fh length() */
6025                             break;
6026                         }
6027                     }
6028                     else {
6029                         PL_expect = XTERM;      /* e.g. print $fh subr() */
6030                     }
6031                 }
6032                 else if (isDIGIT(*s))
6033                     PL_expect = XTERM;          /* e.g. print $fh 3 */
6034                 else if (*s == '.' && isDIGIT(s[1]))
6035                     PL_expect = XTERM;          /* e.g. print $fh .3 */
6036                 else if ((*s == '?' || *s == '-' || *s == '+')
6037                          && !isSPACE(s[1]) && s[1] != '=')
6038                     PL_expect = XTERM;          /* e.g. print $fh -1 */
6039                 else if (*s == '/' && !isSPACE(s[1]) && s[1] != '='
6040                          && s[1] != '/')
6041                     PL_expect = XTERM;          /* e.g. print $fh /.../
6042                                                    XXX except DORDOR operator
6043                                                 */
6044                 else if (*s == '<' && s[1] == '<' && !isSPACE(s[2])
6045                          && s[2] != '=')
6046                     PL_expect = XTERM;          /* print $fh <<"EOF" */
6047             }
6048         }
6049         force_ident_maybe_lex('$');
6050         TOKEN('$');
6051
6052     case '@':
6053         if (PL_expect == XOPERATOR)
6054             no_op("Array", s);
6055         else if (PL_expect == XPOSTDEREF) POSTDEREF('@');
6056         PL_tokenbuf[0] = '@';
6057         s = scan_ident(s, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, FALSE);
6058         pl_yylval.ival = 0;
6059         if (!PL_tokenbuf[1]) {
6060             PREREF('@');
6061         }
6062         if (PL_lex_state == LEX_NORMAL)
6063             s = skipspace(s);
6064         if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
6065             if (*s == '{')
6066                 PL_tokenbuf[0] = '%';
6067
6068             /* Warn about @ where they meant $. */
6069             if (*s == '[' || *s == '{') {
6070                 if (ckWARN(WARN_SYNTAX)) {
6071                     S_check_scalar_slice(aTHX_ s);
6072                 }
6073             }
6074         }
6075         PL_expect = XOPERATOR;
6076         force_ident_maybe_lex('@');
6077         TERM('@');
6078
6079      case '/':                  /* may be division, defined-or, or pattern */
6080         if ((PL_expect == XOPERATOR || PL_expect == XTERMORDORDOR) && s[1] == '/') {
6081             if (!PL_lex_allbrackets && PL_lex_fakeeof >=
6082                     (s[2] == '=' ? LEX_FAKEEOF_ASSIGN : LEX_FAKEEOF_LOGIC))
6083                 TOKEN(0);
6084             s += 2;
6085             AOPERATOR(DORDOR);
6086         }
6087         else if (PL_expect == XOPERATOR) {
6088             s++;
6089             if (*s == '=' && !PL_lex_allbrackets &&
6090                 PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) {
6091                 s--;
6092                 TOKEN(0);
6093             }
6094             Mop(OP_DIVIDE);
6095         }
6096         else {
6097             /* Disable warning on "study /blah/" */
6098             if (PL_oldoldbufptr == PL_last_uni
6099              && (*PL_last_uni != 's' || s - PL_last_uni < 5
6100                  || memNE(PL_last_uni, "study", 5)
6101                  || isWORDCHAR_lazy_if(PL_last_uni+5,UTF)
6102              ))
6103                 check_uni();
6104             s = scan_pat(s,OP_MATCH);
6105             TERM(sublex_start());
6106         }
6107
6108      case '?':                  /* conditional */
6109         s++;
6110         if (!PL_lex_allbrackets &&
6111             PL_lex_fakeeof >= LEX_FAKEEOF_IFELSE) {
6112             s--;
6113             TOKEN(0);
6114         }
6115         PL_lex_allbrackets++;
6116         OPERATOR('?');
6117
6118     case '.':
6119         if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack
6120 #ifdef PERL_STRICT_CR
6121             && s[1] == '\n'
6122 #else
6123             && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n'))
6124 #endif
6125             && (s == PL_linestart || s[-1] == '\n') )
6126         {
6127             PL_expect = XSTATE;
6128             formbrack = 2; /* dot seen where arguments expected */
6129             goto rightbracket;
6130         }
6131         if (PL_expect == XSTATE && s[1] == '.' && s[2] == '.') {
6132             s += 3;
6133             OPERATOR(YADAYADA);
6134         }
6135         if (PL_expect == XOPERATOR || !isDIGIT(s[1])) {
6136             char tmp = *s++;
6137             if (*s == tmp) {
6138                 if (!PL_lex_allbrackets &&
6139                         PL_lex_fakeeof >= LEX_FAKEEOF_RANGE) {
6140                     s--;
6141                     TOKEN(0);
6142                 }
6143                 s++;
6144                 if (*s == tmp) {
6145                     s++;
6146                     pl_yylval.ival = OPf_SPECIAL;
6147                 }
6148                 else
6149                     pl_yylval.ival = 0;
6150                 OPERATOR(DOTDOT);
6151             }
6152             if (*s == '=' && !PL_lex_allbrackets &&
6153                     PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) {
6154                 s--;
6155                 TOKEN(0);
6156             }
6157             Aop(OP_CONCAT);
6158         }
6159         /* FALLTHROUGH */
6160     case '0': case '1': case '2': case '3': case '4':
6161     case '5': case '6': case '7': case '8': case '9':
6162         s = scan_num(s, &pl_yylval);
6163         DEBUG_T( { printbuf("### Saw number in %s\n", s); } );
6164         if (PL_expect == XOPERATOR)
6165             no_op("Number",s);
6166         TERM(THING);
6167
6168     case '\'':
6169         s = scan_str(s,FALSE,FALSE,FALSE,NULL);
6170         if (!s)
6171             missingterm(NULL);
6172         COPLINE_SET_FROM_MULTI_END;
6173         DEBUG_T( { printbuf("### Saw string before %s\n", s); } );
6174         if (PL_expect == XOPERATOR) {
6175             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
6176                 return deprecate_commaless_var_list();
6177             }
6178             else
6179                 no_op("String",s);
6180         }
6181         pl_yylval.ival = OP_CONST;
6182         TERM(sublex_start());
6183
6184     case '"':
6185         s = scan_str(s,FALSE,FALSE,FALSE,NULL);
6186         DEBUG_T( {
6187             if (s)
6188                 printbuf("### Saw string before %s\n", s);
6189             else
6190                 PerlIO_printf(Perl_debug_log,
6191                              "### Saw unterminated string\n");
6192         } );
6193         if (PL_expect == XOPERATOR) {
6194             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
6195                 return deprecate_commaless_var_list();
6196             }
6197             else
6198                 no_op("String",s);
6199         }
6200         if (!s)
6201             missingterm(NULL);
6202         pl_yylval.ival = OP_CONST;
6203         /* FIXME. I think that this can be const if char *d is replaced by
6204            more localised variables.  */
6205         for (d = SvPV(PL_lex_stuff, len); len; len--, d++) {
6206             if (*d == '$' || *d == '@' || *d == '\\' || !UTF8_IS_INVARIANT((U8)*d)) {
6207                 pl_yylval.ival = OP_STRINGIFY;
6208                 break;
6209             }
6210         }
6211         if (pl_yylval.ival == OP_CONST)
6212             COPLINE_SET_FROM_MULTI_END;
6213         TERM(sublex_start());
6214
6215     case '`':
6216         s = scan_str(s,FALSE,FALSE,FALSE,NULL);
6217         DEBUG_T( { printbuf("### Saw backtick string before %s\n", s); } );
6218         if (PL_expect == XOPERATOR)
6219             no_op("Backticks",s);
6220         if (!s)
6221             missingterm(NULL);
6222         pl_yylval.ival = OP_BACKTICK;
6223         TERM(sublex_start());
6224
6225     case '\\':
6226         s++;
6227         if (PL_lex_inwhat == OP_SUBST && PL_lex_repl == PL_linestr
6228          && isDIGIT(*s))
6229             Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),"Can't use \\%c to mean $%c in expression",
6230                            *s, *s);
6231         if (PL_expect == XOPERATOR)
6232             no_op("Backslash",s);
6233         OPERATOR(REFGEN);
6234
6235     case 'v':
6236         if (isDIGIT(s[1]) && PL_expect != XOPERATOR) {
6237             char *start = s + 2;
6238             while (isDIGIT(*start) || *start == '_')
6239                 start++;
6240             if (*start == '.' && isDIGIT(start[1])) {
6241                 s = scan_num(s, &pl_yylval);
6242                 TERM(THING);
6243             }
6244             else if ((*start == ':' && start[1] == ':')
6245                   || (PL_expect == XSTATE && *start == ':'))
6246                 goto keylookup;
6247             else if (PL_expect == XSTATE) {
6248                 d = start;
6249                 while (d < PL_bufend && isSPACE(*d)) d++;
6250                 if (*d == ':') goto keylookup;
6251             }
6252             /* avoid v123abc() or $h{v1}, allow C<print v10;> */
6253             if (!isALPHA(*start) && (PL_expect == XTERM
6254                         || PL_expect == XSTATE
6255                         || PL_expect == XTERMORDORDOR)) {
6256                 GV *const gv = gv_fetchpvn_flags(s, start - s,
6257                                                     UTF ? SVf_UTF8 : 0, SVt_PVCV);
6258                 if (!gv) {
6259                     s = scan_num(s, &pl_yylval);
6260                     TERM(THING);
6261                 }
6262             }
6263         }
6264         goto keylookup;
6265     case 'x':
6266         if (isDIGIT(s[1]) && PL_expect == XOPERATOR) {
6267             s++;
6268             Mop(OP_REPEAT);
6269         }
6270         goto keylookup;
6271
6272     case '_':
6273     case 'a': case 'A':
6274     case 'b': case 'B':
6275     case 'c': case 'C':
6276     case 'd': case 'D':
6277     case 'e': case 'E':
6278     case 'f': case 'F':
6279     case 'g': case 'G':
6280     case 'h': case 'H':
6281     case 'i': case 'I':
6282     case 'j': case 'J':
6283     case 'k': case 'K':
6284     case 'l': case 'L':
6285     case 'm': case 'M':
6286     case 'n': case 'N':
6287     case 'o': case 'O':
6288     case 'p': case 'P':
6289     case 'q': case 'Q':
6290     case 'r': case 'R':
6291     case 's': case 'S':
6292     case 't': case 'T':
6293     case 'u': case 'U':
6294               case 'V':
6295     case 'w': case 'W':
6296               case 'X':
6297     case 'y': case 'Y':
6298     case 'z': case 'Z':
6299
6300       keylookup: {
6301         bool anydelim;
6302         bool lex;
6303         I32 tmp;
6304         SV *sv;
6305         CV *cv;
6306         PADOFFSET off;
6307         OP *rv2cv_op;
6308
6309         lex = FALSE;
6310         orig_keyword = 0;
6311         off = 0;
6312         sv = NULL;
6313         cv = NULL;
6314         gv = NULL;
6315         gvp = NULL;
6316         rv2cv_op = NULL;
6317
6318         PL_bufptr = s;
6319         s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
6320
6321         /* Some keywords can be followed by any delimiter, including ':' */
6322         anydelim = word_takes_any_delimeter(PL_tokenbuf, len);
6323
6324         /* x::* is just a word, unless x is "CORE" */
6325         if (!anydelim && *s == ':' && s[1] == ':') {
6326             if (strEQ(PL_tokenbuf, "CORE")) goto case_KEY_CORE;
6327             goto just_a_word;
6328         }
6329
6330         d = s;
6331         while (d < PL_bufend && isSPACE(*d))
6332                 d++;    /* no comments skipped here, or s### is misparsed */
6333
6334         /* Is this a word before a => operator? */
6335         if (*d == '=' && d[1] == '>') {
6336           fat_arrow:
6337             CLINE;
6338             pl_yylval.opval
6339                 = (OP*)newSVOP(OP_CONST, 0,
6340                                S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
6341             pl_yylval.opval->op_private = OPpCONST_BARE;
6342             TERM(WORD);
6343         }
6344
6345         /* Check for plugged-in keyword */
6346         {
6347             OP *o;
6348             int result;
6349             char *saved_bufptr = PL_bufptr;
6350             PL_bufptr = s;
6351             result = PL_keyword_plugin(aTHX_ PL_tokenbuf, len, &o);
6352             s = PL_bufptr;
6353             if (result == KEYWORD_PLUGIN_DECLINE) {
6354                 /* not a plugged-in keyword */
6355                 PL_bufptr = saved_bufptr;
6356             } else if (result == KEYWORD_PLUGIN_STMT) {
6357                 pl_yylval.opval = o;
6358                 CLINE;
6359                 if (!PL_nexttoke) PL_expect = XSTATE;
6360                 return REPORT(PLUGSTMT);
6361             } else if (result == KEYWORD_PLUGIN_EXPR) {
6362                 pl_yylval.opval = o;
6363                 CLINE;
6364                 if (!PL_nexttoke) PL_expect = XOPERATOR;
6365                 return REPORT(PLUGEXPR);
6366             } else {
6367                 Perl_croak(aTHX_ "Bad plugin affecting keyword '%s'",
6368                                         PL_tokenbuf);
6369             }
6370         }
6371
6372         /* Check for built-in keyword */
6373         tmp = keyword(PL_tokenbuf, len, 0);
6374
6375         /* Is this a label? */
6376         if (!anydelim && PL_expect == XSTATE
6377               && d < PL_bufend && *d == ':' && *(d + 1) != ':') {
6378             s = d + 1;
6379             pl_yylval.pval = savepvn(PL_tokenbuf, len+1);
6380             pl_yylval.pval[len] = '\0';
6381             pl_yylval.pval[len+1] = UTF ? 1 : 0;
6382             CLINE;
6383             TOKEN(LABEL);
6384         }
6385
6386         /* Check for lexical sub */
6387         if (PL_expect != XOPERATOR) {
6388             char tmpbuf[sizeof PL_tokenbuf + 1];
6389             *tmpbuf = '&';
6390             Copy(PL_tokenbuf, tmpbuf+1, len, char);
6391             off = pad_findmy_pvn(tmpbuf, len+1, UTF ? SVf_UTF8 : 0);
6392             if (off != NOT_IN_PAD) {
6393                 assert(off); /* we assume this is boolean-true below */
6394                 if (PAD_COMPNAME_FLAGS_isOUR(off)) {
6395                     HV *  const stash = PAD_COMPNAME_OURSTASH(off);
6396                     HEK * const stashname = HvNAME_HEK(stash);
6397                     sv = newSVhek(stashname);
6398                     sv_catpvs(sv, "::");
6399                     sv_catpvn_flags(sv, PL_tokenbuf, len,
6400                                     (UTF ? SV_CATUTF8 : SV_CATBYTES));
6401                     gv = gv_fetchsv(sv, GV_NOADD_NOINIT | SvUTF8(sv),
6402                                     SVt_PVCV);
6403                     off = 0;
6404                     if (!gv) {
6405                         sv_free(sv);
6406                         sv = NULL;
6407                         goto just_a_word;
6408                     }
6409                 }
6410                 else {
6411                     rv2cv_op = newOP(OP_PADANY, 0);
6412                     rv2cv_op->op_targ = off;
6413                     cv = find_lexical_cv(off);
6414                 }
6415                 lex = TRUE;
6416                 goto just_a_word;
6417             }
6418             off = 0;
6419         }
6420
6421         if (tmp < 0) {                  /* second-class keyword? */
6422             GV *ogv = NULL;     /* override (winner) */
6423             GV *hgv = NULL;     /* hidden (loser) */
6424             if (PL_expect != XOPERATOR && (*s != ':' || s[1] != ':')) {
6425                 CV *cv;
6426                 if ((gv = gv_fetchpvn_flags(PL_tokenbuf, len,
6427                                             (UTF ? SVf_UTF8 : 0)|GV_NOTQUAL,
6428                                             SVt_PVCV)) &&
6429                     (cv = GvCVu(gv)))
6430                 {
6431                     if (GvIMPORTED_CV(gv))
6432                         ogv = gv;
6433                     else if (! CvMETHOD(cv))
6434                         hgv = gv;
6435                 }
6436                 if (!ogv &&
6437                     (gvp = (GV**)hv_fetch(PL_globalstash, PL_tokenbuf,
6438                                           len, FALSE)) &&
6439                     (gv = *gvp) && (
6440                         isGV_with_GP(gv)
6441                             ? GvCVu(gv) && GvIMPORTED_CV(gv)
6442                             :   SvPCS_IMPORTED(gv)
6443                              && (gv_init(gv, PL_globalstash, PL_tokenbuf,
6444                                          len, 0), 1)
6445                    ))
6446                 {
6447                     ogv = gv;
6448                 }
6449             }
6450             if (ogv) {
6451                 orig_keyword = tmp;
6452                 tmp = 0;                /* overridden by import or by GLOBAL */
6453             }
6454             else if (gv && !gvp
6455                      && -tmp==KEY_lock  /* XXX generalizable kludge */
6456                      && GvCVu(gv))
6457             {
6458                 tmp = 0;                /* any sub overrides "weak" keyword */
6459             }
6460             else {                      /* no override */
6461                 tmp = -tmp;
6462                 if (tmp == KEY_dump) {
6463                     Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
6464                                    "dump() better written as CORE::dump()");
6465                 }
6466                 gv = NULL;
6467                 gvp = 0;
6468                 if (hgv && tmp != KEY_x)        /* never ambiguous */
6469                     Perl_ck_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
6470                                    "Ambiguous call resolved as CORE::%s(), "
6471                                    "qualify as such or use &",
6472                                    GvENAME(hgv));
6473             }
6474         }
6475
6476         if (tmp && tmp != KEY___DATA__ && tmp != KEY___END__
6477          && (!anydelim || *s != '#')) {
6478             /* no override, and not s### either; skipspace is safe here
6479              * check for => on following line */
6480             bool arrow;
6481             STRLEN bufoff = PL_bufptr - SvPVX(PL_linestr);
6482             STRLEN   soff = s         - SvPVX(PL_linestr);
6483             s = skipspace_flags(s, LEX_NO_INCLINE);
6484             arrow = *s == '=' && s[1] == '>';
6485             PL_bufptr = SvPVX(PL_linestr) + bufoff;
6486             s         = SvPVX(PL_linestr) +   soff;
6487             if (arrow)
6488                 goto fat_arrow;
6489         }
6490
6491       reserved_word:
6492         switch (tmp) {
6493
6494         default:                        /* not a keyword */
6495             /* Trade off - by using this evil construction we can pull the
6496                variable gv into the block labelled keylookup. If not, then
6497                we have to give it function scope so that the goto from the
6498                earlier ':' case doesn't bypass the initialisation.  */
6499             if (0) {
6500             just_a_word_zero_gv:
6501                 sv = NULL;
6502                 cv = NULL;
6503                 gv = NULL;
6504                 gvp = NULL;
6505                 rv2cv_op = NULL;
6506                 orig_keyword = 0;
6507                 lex = 0;
6508                 off = 0;
6509             }
6510           just_a_word: {
6511                 int pkgname = 0;
6512                 const char lastchar = (PL_bufptr == PL_oldoldbufptr ? 0 : PL_bufptr[-1]);
6513                 bool safebw;
6514
6515
6516                 /* Get the rest if it looks like a package qualifier */
6517
6518                 if (*s == '\'' || (*s == ':' && s[1] == ':')) {
6519                     STRLEN morelen;
6520                     s = scan_word(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len,
6521                                   TRUE, &morelen);
6522                     if (!morelen)
6523                         Perl_croak(aTHX_ "Bad name after %"UTF8f"%s",
6524                                 UTF8fARG(UTF, len, PL_tokenbuf),
6525                                 *s == '\'' ? "'" : "::");
6526                     len += morelen;
6527                     pkgname = 1;
6528                 }
6529
6530                 if (PL_expect == XOPERATOR) {
6531                     if (PL_bufptr == PL_linestart) {
6532                         CopLINE_dec(PL_curcop);
6533                         Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), "%s", PL_warn_nosemi);
6534                         CopLINE_inc(PL_curcop);
6535                     }
6536                     else
6537                         no_op("Bareword",s);
6538                 }
6539
6540                 /* See if the name is "Foo::",
6541                    in which case Foo is a bareword
6542                    (and a package name). */
6543
6544                 if (len > 2 &&
6545                     PL_tokenbuf[len - 2] == ':' && PL_tokenbuf[len - 1] == ':')
6546                 {
6547                     if (ckWARN(WARN_BAREWORD)
6548                         && ! gv_fetchpvn_flags(PL_tokenbuf, len, UTF ? SVf_UTF8 : 0, SVt_PVHV))
6549                         Perl_warner(aTHX_ packWARN(WARN_BAREWORD),
6550                           "Bareword \"%"UTF8f"\" refers to nonexistent package",
6551                            UTF8fARG(UTF, len, PL_tokenbuf));
6552                     len -= 2;
6553                     PL_tokenbuf[len] = '\0';
6554                     gv = NULL;
6555                     gvp = 0;
6556                     safebw = TRUE;
6557                 }
6558                 else {
6559                     safebw = FALSE;
6560                 }
6561
6562                 /* if we saw a global override before, get the right name */
6563
6564                 if (!sv)
6565                   sv = S_newSV_maybe_utf8(aTHX_ PL_tokenbuf,
6566                                                 len);
6567                 if (gvp) {
6568                     SV * const tmp_sv = sv;
6569                     sv = newSVpvs("CORE::GLOBAL::");
6570                     sv_catsv(sv, tmp_sv);
6571                     SvREFCNT_dec(tmp_sv);
6572                 }
6573
6574
6575                 /* Presume this is going to be a bareword of some sort. */
6576                 CLINE;
6577                 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
6578                 pl_yylval.opval->op_private = OPpCONST_BARE;
6579
6580                 /* And if "Foo::", then that's what it certainly is. */
6581                 if (safebw)
6582                     goto safe_bareword;
6583
6584                 if (!off)
6585                 {
6586                     OP *const_op = newSVOP(OP_CONST, 0, SvREFCNT_inc_NN(sv));
6587                     const_op->op_private = OPpCONST_BARE;
6588                     rv2cv_op =
6589                         newCVREF(OPpMAY_RETURN_CONSTANT<<8, const_op);
6590                     cv = lex
6591                         ? isGV(gv)
6592                             ? GvCV(gv)
6593                             : SvROK(gv) && SvTYPE(SvRV(gv)) == SVt_PVCV
6594                                 ? (CV *)SvRV(gv)
6595                                 : ((CV *)gv)
6596                         : rv2cv_op_cv(rv2cv_op, RV2CVOPCV_RETURN_STUB);
6597                 }
6598
6599                 /* Use this var to track whether intuit_method has been
6600                    called.  intuit_method returns 0 or > 255.  */
6601                 tmp = 1;
6602
6603                 /* See if it's the indirect object for a list operator. */
6604
6605                 if (PL_oldoldbufptr &&
6606                     PL_oldoldbufptr < PL_bufptr &&
6607                     (PL_oldoldbufptr == PL_last_lop
6608                      || PL_oldoldbufptr == PL_last_uni) &&
6609                     /* NO SKIPSPACE BEFORE HERE! */
6610                     (PL_expect == XREF ||
6611                      ((PL_opargs[PL_last_lop_op] >> OASHIFT)& 7) == OA_FILEREF))
6612                 {
6613                     bool immediate_paren = *s == '(';
6614
6615                     /* (Now we can afford to cross potential line boundary.) */
6616                     s = skipspace(s);
6617
6618                     /* Two barewords in a row may indicate method call. */
6619
6620                     if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') &&
6621                         (tmp = intuit_method(s, lex ? NULL : sv, cv))) {
6622                         goto method;
6623                     }
6624
6625                     /* If not a declared subroutine, it's an indirect object. */
6626                     /* (But it's an indir obj regardless for sort.) */
6627                     /* Also, if "_" follows a filetest operator, it's a bareword */
6628
6629                     if (
6630                         ( !immediate_paren && (PL_last_lop_op == OP_SORT ||
6631                          (!cv &&
6632                         (PL_last_lop_op != OP_MAPSTART &&
6633                          PL_last_lop_op != OP_GREPSTART))))
6634                        || (PL_tokenbuf[0] == '_' && PL_tokenbuf[1] == '\0'
6635                             && ((PL_opargs[PL_last_lop_op] & OA_CLASS_MASK) == OA_FILESTATOP))
6636                        )
6637                     {
6638                         PL_expect = (PL_last_lop == PL_oldoldbufptr) ? XTERM : XOPERATOR;
6639                         goto bareword;
6640                     }
6641                 }
6642
6643                 PL_expect = XOPERATOR;
6644                 s = skipspace(s);
6645
6646                 /* Is this a word before a => operator? */
6647                 if (*s == '=' && s[1] == '>' && !pkgname) {
6648                     op_free(rv2cv_op);
6649                     CLINE;
6650                     if (gvp || (lex && !off)) {
6651                         assert (cSVOPx(pl_yylval.opval)->op_sv == sv);
6652                         /* This is our own scalar, created a few lines
6653                            above, so this is safe. */
6654                         SvREADONLY_off(sv);
6655                         sv_setpv(sv, PL_tokenbuf);
6656                         if (UTF && !IN_BYTES
6657                          && is_utf8_string((U8*)PL_tokenbuf, len))
6658                               SvUTF8_on(sv);
6659                         SvREADONLY_on(sv);
6660                     }
6661                     TERM(WORD);
6662                 }
6663
6664                 /* If followed by a paren, it's certainly a subroutine. */
6665                 if (*s == '(') {
6666                     CLINE;
6667                     if (cv) {
6668                         d = s + 1;
6669                         while (SPACE_OR_TAB(*d))
6670                             d++;
6671                         if (*d == ')' && (sv = cv_const_sv_or_av(cv))) {
6672                             s = d + 1;
6673                             goto its_constant;
6674                         }
6675                     }
6676                     NEXTVAL_NEXTTOKE.opval =
6677                         off ? rv2cv_op : pl_yylval.opval;
6678                     if (off)
6679                          op_free(pl_yylval.opval), force_next(PRIVATEREF);
6680                     else op_free(rv2cv_op),        force_next(WORD);
6681                     pl_yylval.ival = 0;
6682                     TOKEN('&');
6683                 }
6684
6685                 /* If followed by var or block, call it a method (unless sub) */
6686
6687                 if ((*s == '$' || *s == '{') && !cv) {
6688                     op_free(rv2cv_op);
6689                     PL_last_lop = PL_oldbufptr;
6690                     PL_last_lop_op = OP_METHOD;
6691                     if (!PL_lex_allbrackets &&
6692                             PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC)
6693                         PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC;
6694                     PL_expect = XBLOCKTERM;
6695                     PL_bufptr = s;
6696                     return REPORT(METHOD);
6697                 }
6698
6699                 /* If followed by a bareword, see if it looks like indir obj. */
6700
6701                 if (tmp == 1 && !orig_keyword
6702                         && (isIDFIRST_lazy_if(s,UTF) || *s == '$')
6703                         && (tmp = intuit_method(s, lex ? NULL : sv, cv))) {
6704                   method:
6705                     if (lex && !off) {
6706                         assert(cSVOPx(pl_yylval.opval)->op_sv == sv);
6707                         SvREADONLY_off(sv);
6708                         sv_setpvn(sv, PL_tokenbuf, len);
6709                         if (UTF && !IN_BYTES
6710                          && is_utf8_string((U8*)PL_tokenbuf, len))
6711                             SvUTF8_on (sv);
6712                         else SvUTF8_off(sv);
6713                     }
6714                     op_free(rv2cv_op);
6715                     if (tmp == METHOD && !PL_lex_allbrackets &&
6716                             PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC)
6717                         PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC;
6718                     return REPORT(tmp);
6719                 }
6720
6721                 /* Not a method, so call it a subroutine (if defined) */
6722
6723                 if (cv) {
6724                     /* Check for a constant sub */
6725                     if ((sv = cv_const_sv_or_av(cv))) {
6726                   its_constant:
6727                         op_free(rv2cv_op);
6728                         SvREFCNT_dec(((SVOP*)pl_yylval.opval)->op_sv);
6729                         ((SVOP*)pl_yylval.opval)->op_sv = SvREFCNT_inc_simple(sv);
6730                         if (SvTYPE(sv) == SVt_PVAV)
6731                             pl_yylval.opval = newUNOP(OP_RV2AV, OPf_PARENS,
6732                                                       pl_yylval.opval);
6733                         else {
6734                             pl_yylval.opval->op_private = 0;
6735                             pl_yylval.opval->op_folded = 1;
6736                             pl_yylval.opval->op_flags |= OPf_SPECIAL;
6737                         }
6738                         TOKEN(WORD);
6739                     }
6740
6741                     op_free(pl_yylval.opval);
6742                     pl_yylval.opval =
6743                         off ? (OP *)newCVREF(0, rv2cv_op) : rv2cv_op;
6744                     pl_yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
6745                     PL_last_lop = PL_oldbufptr;
6746                     PL_last_lop_op = OP_ENTERSUB;
6747                     /* Is there a prototype? */
6748                     if (
6749                         SvPOK(cv))
6750                     {
6751                         STRLEN protolen = CvPROTOLEN(cv);
6752                         const char *proto = CvPROTO(cv);
6753                         bool optional;
6754                         proto = S_strip_spaces(aTHX_ proto, &protolen);
6755                         if (!protolen)
6756                             TERM(FUNC0SUB);
6757                         if ((optional = *proto == ';'))
6758                           do
6759                             proto++;
6760                           while (*proto == ';');
6761                         if (
6762                             (
6763                                 (
6764                                     *proto == '$' || *proto == '_'
6765                                  || *proto == '*' || *proto == '+'
6766                                 )
6767                              && proto[1] == '\0'
6768                             )
6769                          || (
6770                              *proto == '\\' && proto[1] && proto[2] == '\0'
6771                             )
6772                         )
6773                             UNIPROTO(UNIOPSUB,optional);
6774                         if (*proto == '\\' && proto[1] == '[') {
6775                             const char *p = proto + 2;
6776                             while(*p && *p != ']')
6777                                 ++p;
6778                             if(*p == ']' && !p[1])
6779                                 UNIPROTO(UNIOPSUB,optional);
6780                         }
6781                         if (*proto == '&' && *s == '{') {
6782                             if (PL_curstash)
6783                                 sv_setpvs(PL_subname, "__ANON__");
6784                             else
6785                                 sv_setpvs(PL_subname, "__ANON__::__ANON__");
6786                             if (!PL_lex_allbrackets &&
6787                                     PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC)
6788                                 PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC;
6789                             PREBLOCK(LSTOPSUB);
6790                         }
6791                     }
6792                     NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
6793                     PL_expect = XTERM;
6794                     force_next(off ? PRIVATEREF : WORD);
6795                     if (!PL_lex_allbrackets &&
6796                             PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC)
6797                         PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC;
6798                     TOKEN(NOAMP);
6799                 }
6800
6801                 /* Call it a bare word */
6802
6803                 if (PL_hints & HINT_STRICT_SUBS)
6804                     pl_yylval.opval->op_private |= OPpCONST_STRICT;
6805                 else {
6806                 bareword:
6807                     /* after "print" and similar functions (corresponding to
6808                      * "F? L" in opcode.pl), whatever wasn't already parsed as
6809                      * a filehandle should be subject to "strict subs".
6810                      * Likewise for the optional indirect-object argument to system
6811                      * or exec, which can't be a bareword */
6812                     if ((PL_last_lop_op == OP_PRINT
6813                             || PL_last_lop_op == OP_PRTF
6814                             || PL_last_lop_op == OP_SAY
6815                             || PL_last_lop_op == OP_SYSTEM
6816                             || PL_last_lop_op == OP_EXEC)
6817                             && (PL_hints & HINT_STRICT_SUBS))
6818                         pl_yylval.opval->op_private |= OPpCONST_STRICT;
6819                     if (lastchar != '-') {
6820                         if (ckWARN(WARN_RESERVED)) {
6821                             d = PL_tokenbuf;
6822                             while (isLOWER(*d))
6823                                 d++;
6824                             if (!*d && !gv_stashpv(PL_tokenbuf, UTF ? SVf_UTF8 : 0))
6825                             {
6826                                 /* PL_warn_reserved is constant */
6827                                 GCC_DIAG_IGNORE(-Wformat-nonliteral);
6828                                 Perl_warner(aTHX_ packWARN(WARN_RESERVED), PL_warn_reserved,
6829                                        PL_tokenbuf);
6830                                 GCC_DIAG_RESTORE;
6831                             }
6832                         }
6833                     }
6834                 }
6835                 op_free(rv2cv_op);
6836
6837             safe_bareword:
6838                 if ((lastchar == '*' || lastchar == '%' || lastchar == '&')
6839                  && saw_infix_sigil) {
6840                     Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
6841                                      "Operator or semicolon missing before %c%"UTF8f,
6842                                      lastchar,
6843                                      UTF8fARG(UTF, strlen(PL_tokenbuf),
6844                                               PL_tokenbuf));
6845                     Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
6846                                      "Ambiguous use of %c resolved as operator %c",
6847                                      lastchar, lastchar);
6848                 }
6849                 TOKEN(WORD);
6850             }
6851
6852         case KEY___FILE__:
6853             FUN0OP(
6854                 (OP*)newSVOP(OP_CONST, 0, newSVpv(CopFILE(PL_curcop),0))
6855             );
6856
6857         case KEY___LINE__:
6858             FUN0OP(
6859                 (OP*)newSVOP(OP_CONST, 0,
6860                     Perl_newSVpvf(aTHX_ "%"IVdf, (IV)CopLINE(PL_curcop)))
6861             );
6862
6863         case KEY___PACKAGE__:
6864             FUN0OP(
6865                 (OP*)newSVOP(OP_CONST, 0,
6866                                         (PL_curstash
6867                                          ? newSVhek(HvNAME_HEK(PL_curstash))
6868                                          : &PL_sv_undef))
6869             );
6870
6871         case KEY___DATA__:
6872         case KEY___END__: {
6873             GV *gv;
6874             if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
6875                 HV * const stash = PL_tokenbuf[2] == 'D' && PL_curstash
6876                                         ? PL_curstash
6877                                         : PL_defstash;
6878                 gv = (GV *)*hv_fetchs(stash, "DATA", 1);
6879                 if (!isGV(gv))
6880                     gv_init(gv,stash,"DATA",4,0);
6881                 GvMULTI_on(gv);
6882                 if (!GvIO(gv))
6883                     GvIOp(gv) = newIO();
6884                 IoIFP(GvIOp(gv)) = PL_rsfp;
6885 #if defined(HAS_FCNTL) && defined(F_SETFD)
6886                 {
6887                     const int fd = PerlIO_fileno(PL_rsfp);
6888                     fcntl(fd,F_SETFD,fd >= 3);
6889                 }
6890 #endif
6891                 /* Mark this internal pseudo-handle as clean */
6892                 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
6893                 if ((PerlIO*)PL_rsfp == PerlIO_stdin())
6894                     IoTYPE(GvIOp(gv)) = IoTYPE_STD;
6895                 else
6896                     IoTYPE(GvIOp(gv)) = IoTYPE_RDONLY;
6897 #if defined(WIN32) && !defined(PERL_TEXTMODE_SCRIPTS)
6898                 /* if the script was opened in binmode, we need to revert
6899                  * it to text mode for compatibility; but only iff it has CRs
6900                  * XXX this is a questionable hack at best. */
6901                 if (PL_bufend-PL_bufptr > 2
6902                     && PL_bufend[-1] == '\n' && PL_bufend[-2] == '\r')
6903                 {
6904                     Off_t loc = 0;
6905                     if (IoTYPE(GvIOp(gv)) == IoTYPE_RDONLY) {
6906                         loc = PerlIO_tell(PL_rsfp);
6907                         (void)PerlIO_seek(PL_rsfp, 0L, 0);
6908                     }
6909 #ifdef NETWARE
6910                         if (PerlLIO_setmode(PL_rsfp, O_TEXT) != -1) {
6911 #else
6912                     if (PerlLIO_setmode(PerlIO_fileno(PL_rsfp), O_TEXT) != -1) {
6913 #endif  /* NETWARE */
6914                         if (loc > 0)
6915                             PerlIO_seek(PL_rsfp, loc, 0);
6916                     }
6917                 }
6918 #endif
6919 #ifdef PERLIO_LAYERS
6920                 if (!IN_BYTES) {
6921                     if (UTF)
6922                         PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, ":utf8");
6923                     else if (PL_encoding) {
6924                         SV *name;
6925                         dSP;
6926                         ENTER;
6927                         SAVETMPS;
6928                         PUSHMARK(sp);
6929                         XPUSHs(PL_encoding);
6930                         PUTBACK;
6931                         call_method("name", G_SCALAR);
6932                         SPAGAIN;
6933                         name = POPs;
6934                         PUTBACK;
6935                         PerlIO_apply_layers(aTHX_ PL_rsfp, NULL,
6936                                             Perl_form(aTHX_ ":encoding(%"SVf")",
6937                                                       SVfARG(name)));
6938                         FREETMPS;
6939                         LEAVE;
6940                     }
6941                 }
6942 #endif
6943                 PL_rsfp = NULL;
6944             }
6945             goto fake_eof;
6946         }
6947
6948         case KEY___SUB__:
6949             FUN0OP(CvCLONE(PL_compcv)
6950                         ? newOP(OP_RUNCV, 0)
6951                         : newPVOP(OP_RUNCV,0,NULL));
6952
6953         case KEY_AUTOLOAD:
6954         case KEY_DESTROY:
6955         case KEY_BEGIN:
6956         case KEY_UNITCHECK:
6957         case KEY_CHECK:
6958         case KEY_INIT:
6959         case KEY_END:
6960             if (PL_expect == XSTATE) {
6961                 s = PL_bufptr;
6962                 goto really_sub;
6963             }
6964             goto just_a_word;
6965
6966         case_KEY_CORE:
6967             {
6968                 STRLEN olen = len;
6969                 d = s;
6970                 s += 2;
6971                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
6972                 if ((*s == ':' && s[1] == ':')
6973                  || (!(tmp = keyword(PL_tokenbuf, len, 1)) && *s == '\''))
6974                 {
6975                     s = d;
6976                     len = olen;
6977                     Copy(PL_bufptr, PL_tokenbuf, olen, char);
6978                     goto just_a_word;
6979                 }
6980                 if (!tmp)
6981                     Perl_croak(aTHX_ "CORE::%"UTF8f" is not a keyword",
6982                                       UTF8fARG(UTF, len, PL_tokenbuf));
6983                 if (tmp < 0)
6984                     tmp = -tmp;
6985                 else if (tmp == KEY_require || tmp == KEY_do
6986                       || tmp == KEY_glob)
6987                     /* that's a way to remember we saw "CORE::" */
6988                     orig_keyword = tmp;
6989                 goto reserved_word;
6990             }
6991
6992         case KEY_abs:
6993             UNI(OP_ABS);
6994
6995         case KEY_alarm:
6996             UNI(OP_ALARM);
6997
6998         case KEY_accept:
6999             LOP(OP_ACCEPT,XTERM);
7000
7001         case KEY_and:
7002             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_LOWLOGIC)
7003                 return REPORT(0);
7004             OPERATOR(ANDOP);
7005
7006         case KEY_atan2:
7007             LOP(OP_ATAN2,XTERM);
7008
7009         case KEY_bind:
7010             LOP(OP_BIND,XTERM);
7011
7012         case KEY_binmode:
7013             LOP(OP_BINMODE,XTERM);
7014
7015         case KEY_bless:
7016             LOP(OP_BLESS,XTERM);
7017
7018         case KEY_break:
7019             FUN0(OP_BREAK);
7020
7021         case KEY_chop:
7022             UNI(OP_CHOP);
7023
7024         case KEY_continue:
7025                     /* We have to disambiguate the two senses of
7026                       "continue". If the next token is a '{' then
7027                       treat it as the start of a continue block;
7028                       otherwise treat it as a control operator.
7029                      */
7030                     s = skipspace(s);
7031                     if (*s == '{')
7032             PREBLOCK(CONTINUE);
7033                     else
7034                         FUN0(OP_CONTINUE);
7035
7036         case KEY_chdir:
7037             /* may use HOME */
7038             (void)gv_fetchpvs("ENV", GV_ADD|GV_NOTQUAL, SVt_PVHV);
7039             UNI(OP_CHDIR);
7040
7041         case KEY_close:
7042             UNI(OP_CLOSE);
7043
7044         case KEY_closedir:
7045             UNI(OP_CLOSEDIR);
7046
7047         case KEY_cmp:
7048             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE)
7049                 return REPORT(0);
7050             Eop(OP_SCMP);
7051
7052         case KEY_caller:
7053             UNI(OP_CALLER);
7054
7055         case KEY_crypt:
7056 #ifdef FCRYPT
7057             if (!PL_cryptseen) {
7058                 PL_cryptseen = TRUE;
7059                 init_des();
7060             }
7061 #endif
7062             LOP(OP_CRYPT,XTERM);
7063
7064         case KEY_chmod:
7065             LOP(OP_CHMOD,XTERM);
7066
7067         case KEY_chown:
7068             LOP(OP_CHOWN,XTERM);
7069
7070         case KEY_connect:
7071             LOP(OP_CONNECT,XTERM);
7072
7073         case KEY_chr:
7074             UNI(OP_CHR);
7075
7076         case KEY_cos:
7077             UNI(OP_COS);
7078
7079         case KEY_chroot:
7080             UNI(OP_CHROOT);
7081
7082         case KEY_default:
7083             PREBLOCK(DEFAULT);
7084
7085         case KEY_do:
7086             s = skipspace(s);
7087             if (*s == '{')
7088                 PRETERMBLOCK(DO);
7089             if (*s != '\'') {
7090                 *PL_tokenbuf = '&';
7091                 d = scan_word(s, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
7092                               1, &len);
7093                 if (len && (len != 4 || strNE(PL_tokenbuf+1, "CORE"))
7094                  && !keyword(PL_tokenbuf + 1, len, 0)) {
7095                     d = skipspace(d);
7096                     if (*d == '(') {
7097                         force_ident_maybe_lex('&');
7098                         s = d;
7099                     }
7100                 }
7101             }
7102             if (orig_keyword == KEY_do) {
7103                 orig_keyword = 0;
7104                 pl_yylval.ival = 1;
7105             }
7106             else
7107                 pl_yylval.ival = 0;
7108             OPERATOR(DO);
7109
7110         case KEY_die:
7111             PL_hints |= HINT_BLOCK_SCOPE;
7112             LOP(OP_DIE,XTERM);
7113
7114         case KEY_defined:
7115             UNI(OP_DEFINED);
7116
7117         case KEY_delete:
7118             UNI(OP_DELETE);
7119
7120         case KEY_dbmopen:
7121             Perl_populate_isa(aTHX_ STR_WITH_LEN("AnyDBM_File::ISA"),
7122                               STR_WITH_LEN("NDBM_File::"),
7123                               STR_WITH_LEN("DB_File::"),
7124                               STR_WITH_LEN("GDBM_File::"),
7125                               STR_WITH_LEN("SDBM_File::"),
7126                               STR_WITH_LEN("ODBM_File::"),
7127                               NULL);
7128             LOP(OP_DBMOPEN,XTERM);
7129
7130         case KEY_dbmclose:
7131             UNI(OP_DBMCLOSE);
7132
7133         case KEY_dump:
7134             LOOPX(OP_DUMP);
7135
7136         case KEY_else:
7137             PREBLOCK(ELSE);
7138
7139         case KEY_elsif:
7140             pl_yylval.ival = CopLINE(PL_curcop);
7141             OPERATOR(ELSIF);
7142
7143         case KEY_eq:
7144             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE)
7145                 return REPORT(0);
7146             Eop(OP_SEQ);
7147
7148         case KEY_exists:
7149             UNI(OP_EXISTS);
7150         
7151         case KEY_exit:
7152             UNI(OP_EXIT);
7153
7154         case KEY_eval:
7155             s = skipspace(s);
7156             if (*s == '{') { /* block eval */
7157                 PL_expect = XTERMBLOCK;
7158                 UNIBRACK(OP_ENTERTRY);
7159             }
7160             else { /* string eval */
7161                 PL_expect = XTERM;
7162                 UNIBRACK(OP_ENTEREVAL);
7163             }
7164
7165         case KEY_evalbytes:
7166             PL_expect = XTERM;
7167             UNIBRACK(-OP_ENTEREVAL);
7168
7169         case KEY_eof:
7170             UNI(OP_EOF);
7171
7172         case KEY_exp:
7173             UNI(OP_EXP);
7174
7175         case KEY_each:
7176             UNI(OP_EACH);
7177
7178         case KEY_exec:
7179             LOP(OP_EXEC,XREF);
7180
7181         case KEY_endhostent:
7182             FUN0(OP_EHOSTENT);
7183
7184         case KEY_endnetent:
7185             FUN0(OP_ENETENT);
7186
7187         case KEY_endservent:
7188             FUN0(OP_ESERVENT);
7189
7190         case KEY_endprotoent:
7191             FUN0(OP_EPROTOENT);
7192
7193         case KEY_endpwent:
7194             FUN0(OP_EPWENT);
7195
7196         case KEY_endgrent:
7197             FUN0(OP_EGRENT);
7198
7199         case KEY_for:
7200         case KEY_foreach:
7201             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR)
7202                 return REPORT(0);
7203             pl_yylval.ival = CopLINE(PL_curcop);
7204             s = skipspace(s);
7205             if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) {
7206                 char *p = s;
7207
7208                 if ((PL_bufend - p) >= 3 &&
7209                     strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
7210                     p += 2;
7211                 else if ((PL_bufend - p) >= 4 &&
7212                     strnEQ(p, "our", 3) && isSPACE(*(p + 3)))
7213                     p += 3;
7214                 p = skipspace(p);
7215                 /* skip optional package name, as in "for my abc $x (..)" */
7216                 if (isIDFIRST_lazy_if(p,UTF)) {
7217                     p = scan_word(p, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
7218                     p = skipspace(p);
7219                 }
7220                 if (*p != '$')
7221                     Perl_croak(aTHX_ "Missing $ on loop variable");
7222             }
7223             OPERATOR(FOR);
7224
7225         case KEY_formline:
7226             LOP(OP_FORMLINE,XTERM);
7227
7228         case KEY_fork:
7229             FUN0(OP_FORK);
7230
7231         case KEY_fc:
7232             UNI(OP_FC);
7233
7234         case KEY_fcntl:
7235             LOP(OP_FCNTL,XTERM);
7236
7237         case KEY_fileno:
7238             UNI(OP_FILENO);
7239
7240         case KEY_flock:
7241             LOP(OP_FLOCK,XTERM);
7242
7243         case KEY_gt:
7244             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE)
7245                 return REPORT(0);
7246             Rop(OP_SGT);
7247
7248         case KEY_ge:
7249             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE)
7250                 return REPORT(0);
7251             Rop(OP_SGE);
7252
7253         case KEY_grep:
7254             LOP(OP_GREPSTART, XREF);
7255
7256         case KEY_goto:
7257             LOOPX(OP_GOTO);
7258
7259         case KEY_gmtime:
7260             UNI(OP_GMTIME);
7261
7262         case KEY_getc:
7263             UNIDOR(OP_GETC);
7264
7265         case KEY_getppid:
7266             FUN0(OP_GETPPID);
7267
7268         case KEY_getpgrp:
7269             UNI(OP_GETPGRP);
7270
7271         case KEY_getpriority:
7272             LOP(OP_GETPRIORITY,XTERM);
7273
7274         case KEY_getprotobyname:
7275             UNI(OP_GPBYNAME);
7276
7277         case KEY_getprotobynumber:
7278             LOP(OP_GPBYNUMBER,XTERM);
7279
7280         case KEY_getprotoent:
7281             FUN0(OP_GPROTOENT);
7282
7283         case KEY_getpwent:
7284             FUN0(OP_GPWENT);
7285
7286         case KEY_getpwnam:
7287             UNI(OP_GPWNAM);
7288
7289         case KEY_getpwuid:
7290             UNI(OP_GPWUID);
7291
7292         case KEY_getpeername:
7293             UNI(OP_GETPEERNAME);
7294
7295         case KEY_gethostbyname:
7296             UNI(OP_GHBYNAME);
7297
7298         case KEY_gethostbyaddr:
7299             LOP(OP_GHBYADDR,XTERM);
7300
7301         case KEY_gethostent:
7302             FUN0(OP_GHOSTENT);
7303
7304         case KEY_getnetbyname:
7305             UNI(OP_GNBYNAME);
7306
7307         case KEY_getnetbyaddr:
7308             LOP(OP_GNBYADDR,XTERM);
7309
7310         case KEY_getnetent:
7311             FUN0(OP_GNETENT);
7312
7313         case KEY_getservbyname:
7314             LOP(OP_GSBYNAME,XTERM);
7315
7316         case KEY_getservbyport:
7317             LOP(OP_GSBYPORT,XTERM);
7318
7319         case KEY_getservent:
7320             FUN0(OP_GSERVENT);
7321
7322         case KEY_getsockname:
7323             UNI(OP_GETSOCKNAME);
7324
7325         case KEY_getsockopt:
7326             LOP(OP_GSOCKOPT,XTERM);
7327
7328         case KEY_getgrent:
7329             FUN0(OP_GGRENT);
7330
7331         case KEY_getgrnam:
7332             UNI(OP_GGRNAM);
7333
7334         case KEY_getgrgid:
7335             UNI(OP_GGRGID);
7336
7337         case KEY_getlogin:
7338             FUN0(OP_GETLOGIN);
7339
7340         case KEY_given:
7341             pl_yylval.ival = CopLINE(PL_curcop);
7342             Perl_ck_warner_d(aTHX_
7343                 packWARN(WARN_EXPERIMENTAL__SMARTMATCH),
7344                 "given is experimental");
7345             OPERATOR(GIVEN);
7346
7347         case KEY_glob:
7348             LOP(
7349              orig_keyword==KEY_glob ? -OP_GLOB : OP_GLOB,
7350              XTERM
7351             );
7352
7353         case KEY_hex:
7354             UNI(OP_HEX);
7355
7356         case KEY_if:
7357             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR)
7358                 return REPORT(0);
7359             pl_yylval.ival = CopLINE(PL_curcop);
7360             OPERATOR(IF);
7361
7362         case KEY_index:
7363             LOP(OP_INDEX,XTERM);
7364
7365         case KEY_int:
7366             UNI(OP_INT);
7367
7368         case KEY_ioctl:
7369             LOP(OP_IOCTL,XTERM);
7370
7371         case KEY_join:
7372             LOP(OP_JOIN,XTERM);
7373
7374         case KEY_keys:
7375             UNI(OP_KEYS);
7376
7377         case KEY_kill:
7378             LOP(OP_KILL,XTERM);
7379
7380         case KEY_last:
7381             LOOPX(OP_LAST);
7382         
7383         case KEY_lc:
7384             UNI(OP_LC);
7385
7386         case KEY_lcfirst:
7387             UNI(OP_LCFIRST);
7388
7389         case KEY_local:
7390             pl_yylval.ival = 0;
7391             OPERATOR(LOCAL);
7392
7393         case KEY_length:
7394             UNI(OP_LENGTH);
7395
7396         case KEY_lt:
7397             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE)
7398                 return REPORT(0);
7399             Rop(OP_SLT);
7400
7401         case KEY_le:
7402             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE)
7403                 return REPORT(0);
7404             Rop(OP_SLE);
7405
7406         case KEY_localtime:
7407             UNI(OP_LOCALTIME);
7408
7409         case KEY_log:
7410             UNI(OP_LOG);
7411
7412         case KEY_link:
7413             LOP(OP_LINK,XTERM);
7414
7415         case KEY_listen:
7416             LOP(OP_LISTEN,XTERM);
7417
7418         case KEY_lock:
7419             UNI(OP_LOCK);
7420
7421         case KEY_lstat:
7422             UNI(OP_LSTAT);
7423
7424         case KEY_m:
7425             s = scan_pat(s,OP_MATCH);
7426             TERM(sublex_start());
7427
7428         case KEY_map:
7429             LOP(OP_MAPSTART, XREF);
7430
7431         case KEY_mkdir:
7432             LOP(OP_MKDIR,XTERM);
7433
7434         case KEY_msgctl:
7435             LOP(OP_MSGCTL,XTERM);
7436
7437         case KEY_msgget:
7438             LOP(OP_MSGGET,XTERM);
7439
7440         case KEY_msgrcv:
7441             LOP(OP_MSGRCV,XTERM);
7442
7443         case KEY_msgsnd:
7444             LOP(OP_MSGSND,XTERM);
7445
7446         case KEY_our:
7447         case KEY_my:
7448         case KEY_state:
7449             PL_in_my = (U16)tmp;
7450             s = skipspace(s);
7451             if (isIDFIRST_lazy_if(s,UTF)) {
7452                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
7453                 if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
7454                 {
7455                     if (!FEATURE_LEXSUBS_IS_ENABLED)
7456                         Perl_croak(aTHX_
7457                                   "Experimental \"%s\" subs not enabled",
7458                                    tmp == KEY_my    ? "my"    :
7459                                    tmp == KEY_state ? "state" : "our");
7460                     Perl_ck_warner_d(aTHX_
7461                         packWARN(WARN_EXPERIMENTAL__LEXICAL_SUBS),
7462                         "The lexical_subs feature is experimental");
7463                     goto really_sub;
7464                 }
7465                 PL_in_my_stash = find_in_my_stash(PL_tokenbuf, len);
7466                 if (!PL_in_my_stash) {
7467                     char tmpbuf[1024];
7468                     int len;
7469                     PL_bufptr = s;
7470                     len = my_snprintf(tmpbuf, sizeof(tmpbuf), "No such class %.1000s", PL_tokenbuf);
7471                     PERL_MY_SNPRINTF_POST_GUARD(len, sizeof(tmpbuf));
7472                     yyerror_pv(tmpbuf, UTF ? SVf_UTF8 : 0);
7473                 }
7474             }
7475             pl_yylval.ival = 1;
7476             OPERATOR(MY);
7477
7478         case KEY_next:
7479             LOOPX(OP_NEXT);
7480
7481         case KEY_ne:
7482             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE)
7483                 return REPORT(0);
7484             Eop(OP_SNE);
7485
7486         case KEY_no:
7487             s = tokenize_use(0, s);
7488             TOKEN(USE);
7489
7490         case KEY_not:
7491             if (*s == '(' || (s = skipspace(s), *s == '('))
7492                 FUN1(OP_NOT);
7493             else {
7494                 if (!PL_lex_allbrackets &&
7495                         PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC)
7496                     PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC;
7497                 OPERATOR(NOTOP);
7498             }
7499
7500         case KEY_open:
7501             s = skipspace(s);
7502             if (isIDFIRST_lazy_if(s,UTF)) {
7503           const char *t;
7504           d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE,
7505               &len);
7506                 for (t=d; isSPACE(*t);)
7507                     t++;
7508                 if ( *t && strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
7509                     /* [perl #16184] */
7510                     && !(t[0] == '=' && t[1] == '>')
7511                     && !(t[0] == ':' && t[1] == ':')
7512                     && !keyword(s, d-s, 0)
7513                 ) {
7514                     Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE),
7515                        "Precedence problem: open %"UTF8f" should be open(%"UTF8f")",
7516                         UTF8fARG(UTF, d-s, s), UTF8fARG(UTF, d-s, s));
7517                 }
7518             }
7519             LOP(OP_OPEN,XTERM);
7520
7521         case KEY_or:
7522             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_LOWLOGIC)
7523                 return REPORT(0);
7524             pl_yylval.ival = OP_OR;
7525             OPERATOR(OROP);
7526
7527         case KEY_ord:
7528             UNI(OP_ORD);
7529
7530         case KEY_oct:
7531             UNI(OP_OCT);
7532
7533         case KEY_opendir:
7534             LOP(OP_OPEN_DIR,XTERM);
7535
7536         case KEY_print:
7537             checkcomma(s,PL_tokenbuf,"filehandle");
7538             LOP(OP_PRINT,XREF);
7539
7540         case KEY_printf:
7541             checkcomma(s,PL_tokenbuf,"filehandle");
7542             LOP(OP_PRTF,XREF);
7543
7544         case KEY_prototype:
7545             UNI(OP_PROTOTYPE);
7546
7547         case KEY_push:
7548             LOP(OP_PUSH,XTERM);
7549
7550         case KEY_pop:
7551             UNIDOR(OP_POP);
7552
7553         case KEY_pos:
7554             UNIDOR(OP_POS);
7555         
7556         case KEY_pack:
7557             LOP(OP_PACK,XTERM);
7558
7559         case KEY_package:
7560             s = force_word(s,WORD,FALSE,TRUE);
7561             s = skipspace(s);
7562             s = force_strict_version(s);
7563             PREBLOCK(PACKAGE);
7564
7565         case KEY_pipe:
7566             LOP(OP_PIPE_OP,XTERM);
7567
7568         case KEY_q:
7569             s = scan_str(s,FALSE,FALSE,FALSE,NULL);
7570             if (!s)
7571                 missingterm(NULL);
7572             COPLINE_SET_FROM_MULTI_END;
7573             pl_yylval.ival = OP_CONST;
7574             TERM(sublex_start());
7575
7576         case KEY_quotemeta:
7577             UNI(OP_QUOTEMETA);
7578
7579         case KEY_qw: {
7580             OP *words = NULL;
7581             s = scan_str(s,FALSE,FALSE,FALSE,NULL);
7582             if (!s)
7583                 missingterm(NULL);
7584             COPLINE_SET_FROM_MULTI_END;
7585             PL_expect = XOPERATOR;
7586             if (SvCUR(PL_lex_stuff)) {
7587                 int warned_comma = !ckWARN(WARN_QW);
7588                 int warned_comment = warned_comma;
7589                 d = SvPV_force(PL_lex_stuff, len);
7590                 while (len) {
7591                     for (; isSPACE(*d) && len; --len, ++d)
7592                         /**/;
7593                     if (len) {
7594                         SV *sv;
7595                         const char *b = d;
7596                         if (!warned_comma || !warned_comment) {
7597                             for (; !isSPACE(*d) && len; --len, ++d) {
7598                                 if (!warned_comma && *d == ',') {
7599                                     Perl_warner(aTHX_ packWARN(WARN_QW),
7600                                         "Possible attempt to separate words with commas");
7601                                     ++warned_comma;
7602                                 }
7603                                 else if (!warned_comment && *d == '#') {
7604                                     Perl_warner(aTHX_ packWARN(WARN_QW),
7605                                         "Possible attempt to put comments in qw() list");
7606                                     ++warned_comment;
7607                                 }
7608                             }
7609                         }
7610                         else {
7611                             for (; !isSPACE(*d) && len; --len, ++d)
7612                                 /**/;
7613                         }
7614                         sv = newSVpvn_utf8(b, d-b, DO_UTF8(PL_lex_stuff));
7615                         words = op_append_elem(OP_LIST, words,
7616                                             newSVOP(OP_CONST, 0, tokeq(sv)));
7617                     }
7618                 }
7619             }
7620             if (!words)
7621                 words = newNULLLIST();
7622             if (PL_lex_stuff) {
7623                 SvREFCNT_dec(PL_lex_stuff);
7624                 PL_lex_stuff = NULL;
7625             }
7626             PL_expect = XOPERATOR;
7627             pl_yylval.opval = sawparens(words);
7628             TOKEN(QWLIST);
7629         }
7630
7631         case KEY_qq:
7632             s = scan_str(s,FALSE,FALSE,FALSE,NULL);
7633             if (!s)
7634                 missingterm(NULL);
7635             pl_yylval.ival = OP_STRINGIFY;
7636             if (SvIVX(PL_lex_stuff) == '\'')
7637                 SvIV_set(PL_lex_stuff, 0);      /* qq'$foo' should interpolate */
7638             TERM(sublex_start());
7639
7640         case KEY_qr:
7641             s = scan_pat(s,OP_QR);
7642             TERM(sublex_start());
7643
7644         case KEY_qx:
7645             s = scan_str(s,FALSE,FALSE,FALSE,NULL);
7646             if (!s)
7647                 missingterm(NULL);
7648             pl_yylval.ival = OP_BACKTICK;
7649             TERM(sublex_start());
7650
7651         case KEY_return:
7652             OLDLOP(OP_RETURN);
7653
7654         case KEY_require:
7655             s = skipspace(s);
7656             if (isDIGIT(*s)) {
7657                 s = force_version(s, FALSE);
7658             }
7659             else if (*s != 'v' || !isDIGIT(s[1])
7660                     || (s = force_version(s, TRUE), *s == 'v'))
7661             {
7662                 *PL_tokenbuf = '\0';
7663                 s = force_word(s,WORD,TRUE,TRUE);
7664                 if (isIDFIRST_lazy_if(PL_tokenbuf,UTF))
7665                     gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf),
7666                                 GV_ADD | (UTF ? SVf_UTF8 : 0));
7667                 else if (*s == '<')
7668                     yyerror("<> at require-statement should be quotes");
7669             }
7670             if (orig_keyword == KEY_require) {
7671                 orig_keyword = 0;
7672                 pl_yylval.ival = 1;
7673             }
7674             else 
7675                 pl_yylval.ival = 0;
7676             PL_expect = PL_nexttoke ? XOPERATOR : XTERM;
7677             PL_bufptr = s;
7678             PL_last_uni = PL_oldbufptr;
7679             PL_last_lop_op = OP_REQUIRE;
7680             s = skipspace(s);
7681             return REPORT( (int)REQUIRE );
7682
7683         case KEY_reset:
7684             UNI(OP_RESET);
7685
7686         case KEY_redo:
7687             LOOPX(OP_REDO);
7688
7689         case KEY_rename:
7690             LOP(OP_RENAME,XTERM);
7691
7692         case KEY_rand:
7693             UNI(OP_RAND);
7694
7695         case KEY_rmdir:
7696             UNI(OP_RMDIR);
7697
7698         case KEY_rindex:
7699             LOP(OP_RINDEX,XTERM);
7700
7701         case KEY_read:
7702             LOP(OP_READ,XTERM);
7703
7704         case KEY_readdir:
7705             UNI(OP_READDIR);
7706
7707         case KEY_readline:
7708             UNIDOR(OP_READLINE);
7709
7710         case KEY_readpipe:
7711             UNIDOR(OP_BACKTICK);
7712
7713         case KEY_rewinddir:
7714             UNI(OP_REWINDDIR);
7715
7716         case KEY_recv:
7717             LOP(OP_RECV,XTERM);
7718
7719         case KEY_reverse:
7720             LOP(OP_REVERSE,XTERM);
7721
7722         case KEY_readlink:
7723             UNIDOR(OP_READLINK);
7724
7725         case KEY_ref:
7726             UNI(OP_REF);
7727
7728         case KEY_s:
7729             s = scan_subst(s);
7730             if (pl_yylval.opval)
7731                 TERM(sublex_start());
7732             else
7733                 TOKEN(1);       /* force error */
7734
7735         case KEY_say:
7736             checkcomma(s,PL_tokenbuf,"filehandle");
7737             LOP(OP_SAY,XREF);
7738
7739         case KEY_chomp:
7740             UNI(OP_CHOMP);
7741         
7742         case KEY_scalar:
7743             UNI(OP_SCALAR);
7744
7745         case KEY_select:
7746             LOP(OP_SELECT,XTERM);
7747
7748         case KEY_seek:
7749             LOP(OP_SEEK,XTERM);
7750
7751         case KEY_semctl:
7752             LOP(OP_SEMCTL,XTERM);
7753
7754         case KEY_semget:
7755             LOP(OP_SEMGET,XTERM);
7756
7757         case KEY_semop:
7758             LOP(OP_SEMOP,XTERM);
7759
7760         case KEY_send:
7761             LOP(OP_SEND,XTERM);
7762
7763         case KEY_setpgrp:
7764             LOP(OP_SETPGRP,XTERM);
7765
7766         case KEY_setpriority:
7767             LOP(OP_SETPRIORITY,XTERM);
7768
7769         case KEY_sethostent:
7770             UNI(OP_SHOSTENT);
7771
7772         case KEY_setnetent:
7773             UNI(OP_SNETENT);
7774
7775         case KEY_setservent:
7776             UNI(OP_SSERVENT);
7777
7778         case KEY_setprotoent:
7779             UNI(OP_SPROTOENT);
7780
7781         case KEY_setpwent:
7782             FUN0(OP_SPWENT);
7783
7784         case KEY_setgrent:
7785             FUN0(OP_SGRENT);
7786
7787         case KEY_seekdir:
7788             LOP(OP_SEEKDIR,XTERM);
7789
7790         case KEY_setsockopt:
7791             LOP(OP_SSOCKOPT,XTERM);
7792
7793         case KEY_shift:
7794             UNIDOR(OP_SHIFT);
7795
7796         case KEY_shmctl:
7797             LOP(OP_SHMCTL,XTERM);
7798
7799         case KEY_shmget:
7800             LOP(OP_SHMGET,XTERM);
7801
7802         case KEY_shmread:
7803             LOP(OP_SHMREAD,XTERM);
7804
7805         case KEY_shmwrite:
7806             LOP(OP_SHMWRITE,XTERM);
7807
7808         case KEY_shutdown:
7809             LOP(OP_SHUTDOWN,XTERM);
7810
7811         case KEY_sin:
7812             UNI(OP_SIN);
7813
7814         case KEY_sleep:
7815             UNI(OP_SLEEP);
7816
7817         case KEY_socket:
7818             LOP(OP_SOCKET,XTERM);
7819
7820         case KEY_socketpair:
7821             LOP(OP_SOCKPAIR,XTERM);
7822
7823         case KEY_sort:
7824             checkcomma(s,PL_tokenbuf,"subroutine name");
7825             s = skipspace(s);
7826             PL_expect = XTERM;
7827             s = force_word(s,WORD,TRUE,TRUE);
7828             LOP(OP_SORT,XREF);
7829
7830         case KEY_split:
7831             LOP(OP_SPLIT,XTERM);
7832
7833         case KEY_sprintf:
7834             LOP(OP_SPRINTF,XTERM);
7835
7836         case KEY_splice:
7837             LOP(OP_SPLICE,XTERM);
7838
7839         case KEY_sqrt:
7840             UNI(OP_SQRT);
7841
7842         case KEY_srand:
7843             UNI(OP_SRAND);
7844
7845         case KEY_stat:
7846             UNI(OP_STAT);
7847
7848         case KEY_study:
7849             UNI(OP_STUDY);
7850
7851         case KEY_substr:
7852             LOP(OP_SUBSTR,XTERM);
7853
7854         case KEY_format:
7855         case KEY_sub:
7856           really_sub:
7857             {
7858                 char * const tmpbuf = PL_tokenbuf + 1;
7859                 expectation attrful;
7860                 bool have_name, have_proto;
7861                 const int key = tmp;
7862                 SV *format_name = NULL;
7863
7864                 d = s;
7865                 s = skipspace(s);
7866
7867                 if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' ||
7868                     (*s == ':' && s[1] == ':'))
7869                 {
7870
7871                     PL_expect = XBLOCK;
7872                     attrful = XATTRBLOCK;
7873                     d = scan_word(s, tmpbuf, sizeof PL_tokenbuf - 1, TRUE,
7874                                   &len);
7875                     if (key == KEY_format)
7876                         format_name = S_newSV_maybe_utf8(aTHX_ s, d - s);
7877                     *PL_tokenbuf = '&';
7878                     if (memchr(tmpbuf, ':', len) || key != KEY_sub
7879                      || pad_findmy_pvn(
7880                             PL_tokenbuf, len + 1, UTF ? SVf_UTF8 : 0
7881                         ) != NOT_IN_PAD)
7882                         sv_setpvn(PL_subname, tmpbuf, len);
7883                     else {
7884                         sv_setsv(PL_subname,PL_curstname);
7885                         sv_catpvs(PL_subname,"::");
7886                         sv_catpvn(PL_subname,tmpbuf,len);
7887                     }
7888                     if (SvUTF8(PL_linestr))
7889                         SvUTF8_on(PL_subname);
7890                     have_name = TRUE;
7891
7892
7893                     s = skipspace(d);
7894                 }
7895                 else {
7896                     if (key == KEY_my || key == KEY_our || key==KEY_state)
7897                     {
7898                         *d = '\0';
7899                         /* diag_listed_as: Missing name in "%s sub" */
7900                         Perl_croak(aTHX_
7901                                   "Missing name in \"%s\"", PL_bufptr);
7902                     }
7903                     PL_expect = XTERMBLOCK;
7904                     attrful = XATTRTERM;
7905                     sv_setpvs(PL_subname,"?");
7906                     have_name = FALSE;
7907                 }
7908
7909                 if (key == KEY_format) {
7910                     if (format_name) {
7911                         NEXTVAL_NEXTTOKE.opval
7912                             = (OP*)newSVOP(OP_CONST,0, format_name);
7913                         NEXTVAL_NEXTTOKE.opval->op_private |= OPpCONST_BARE;
7914                         force_next(WORD);
7915                     }
7916                     PREBLOCK(FORMAT);
7917                 }
7918
7919                 /* Look for a prototype */
7920                 if (*s == '(' && !FEATURE_SIGNATURES_IS_ENABLED) {
7921                     s = scan_str(s,FALSE,FALSE,FALSE,NULL);
7922                     COPLINE_SET_FROM_MULTI_END;
7923                     if (!s)
7924                         Perl_croak(aTHX_ "Prototype not terminated");
7925                     (void)validate_proto(PL_subname, PL_lex_stuff, ckWARN(WARN_ILLEGALPROTO));
7926                     have_proto = TRUE;
7927
7928                     s = skipspace(s);
7929                 }
7930                 else
7931                     have_proto = FALSE;
7932
7933                 if (*s == ':' && s[1] != ':')
7934                     PL_expect = attrful;
7935                 else if ((*s != '{' && *s != '(') && key == KEY_sub) {
7936                     if (!have_name)
7937                         Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine");
7938                     else if (*s != ';' && *s != '}')
7939                         Perl_croak(aTHX_ "Illegal declaration of subroutine %"SVf, SVfARG(PL_subname));
7940                 }
7941
7942                 if (have_proto) {
7943                     NEXTVAL_NEXTTOKE.opval =
7944                         (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
7945                     PL_lex_stuff = NULL;
7946                     force_next(THING);
7947                 }
7948                 if (!have_name) {
7949                     if (PL_curstash)
7950                         sv_setpvs(PL_subname, "__ANON__");
7951                     else
7952                         sv_setpvs(PL_subname, "__ANON__::__ANON__");
7953                     TOKEN(ANONSUB);
7954                 }
7955                 force_ident_maybe_lex('&');
7956                 TOKEN(SUB);
7957             }
7958
7959         case KEY_system:
7960             LOP(OP_SYSTEM,XREF);
7961
7962         case KEY_symlink:
7963             LOP(OP_SYMLINK,XTERM);
7964
7965         case KEY_syscall:
7966             LOP(OP_SYSCALL,XTERM);
7967
7968         case KEY_sysopen:
7969             LOP(OP_SYSOPEN,XTERM);
7970
7971         case KEY_sysseek:
7972             LOP(OP_SYSSEEK,XTERM);
7973
7974         case KEY_sysread:
7975             LOP(OP_SYSREAD,XTERM);
7976
7977         case KEY_syswrite:
7978             LOP(OP_SYSWRITE,XTERM);
7979
7980         case KEY_tr:
7981         case KEY_y:
7982             s = scan_trans(s);
7983             TERM(sublex_start());
7984
7985         case KEY_tell:
7986             UNI(OP_TELL);
7987
7988         case KEY_telldir:
7989             UNI(OP_TELLDIR);
7990
7991         case KEY_tie:
7992             LOP(OP_TIE,XTERM);
7993
7994         case KEY_tied:
7995             UNI(OP_TIED);
7996
7997         case KEY_time:
7998             FUN0(OP_TIME);
7999
8000         case KEY_times:
8001             FUN0(OP_TMS);
8002
8003         case KEY_truncate:
8004             LOP(OP_TRUNCATE,XTERM);
8005
8006         case KEY_uc:
8007             UNI(OP_UC);
8008
8009         case KEY_ucfirst:
8010             UNI(OP_UCFIRST);
8011
8012         case KEY_untie:
8013             UNI(OP_UNTIE);
8014
8015         case KEY_until:
8016             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR)
8017                 return REPORT(0);
8018             pl_yylval.ival = CopLINE(PL_curcop);
8019             OPERATOR(UNTIL);
8020
8021         case KEY_unless:
8022             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR)
8023                 return REPORT(0);
8024             pl_yylval.ival = CopLINE(PL_curcop);
8025             OPERATOR(UNLESS);
8026
8027         case KEY_unlink:
8028             LOP(OP_UNLINK,XTERM);
8029
8030         case KEY_undef:
8031             UNIDOR(OP_UNDEF);
8032
8033         case KEY_unpack:
8034             LOP(OP_UNPACK,XTERM);
8035
8036         case KEY_utime:
8037             LOP(OP_UTIME,XTERM);
8038
8039         case KEY_umask:
8040             UNIDOR(OP_UMASK);
8041
8042         case KEY_unshift:
8043             LOP(OP_UNSHIFT,XTERM);
8044
8045         case KEY_use:
8046             s = tokenize_use(1, s);
8047             TOKEN(USE);
8048
8049         case KEY_values:
8050             UNI(OP_VALUES);
8051
8052         case KEY_vec:
8053             LOP(OP_VEC,XTERM);
8054
8055         case KEY_when:
8056             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR)
8057                 return REPORT(0);
8058             pl_yylval.ival = CopLINE(PL_curcop);
8059             Perl_ck_warner_d(aTHX_
8060                 packWARN(WARN_EXPERIMENTAL__SMARTMATCH),
8061                 "when is experimental");
8062             OPERATOR(WHEN);
8063
8064         case KEY_while:
8065             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR)
8066                 return REPORT(0);
8067             pl_yylval.ival = CopLINE(PL_curcop);
8068             OPERATOR(WHILE);
8069
8070         case KEY_warn:
8071             PL_hints |= HINT_BLOCK_SCOPE;
8072             LOP(OP_WARN,XTERM);
8073
8074         case KEY_wait:
8075             FUN0(OP_WAIT);
8076
8077         case KEY_waitpid:
8078             LOP(OP_WAITPID,XTERM);
8079
8080         case KEY_wantarray:
8081             FUN0(OP_WANTARRAY);
8082
8083         case KEY_write:
8084             /* Make sure $^L is defined. 0x0C is CTRL-L on ASCII platforms, and
8085              * we use the same number on EBCDIC */
8086             gv_fetchpvs("\x0C", GV_ADD|GV_NOTQUAL, SVt_PV);
8087             UNI(OP_ENTERWRITE);
8088
8089         case KEY_x:
8090             if (PL_expect == XOPERATOR) {
8091                 if (*s == '=' && !PL_lex_allbrackets &&
8092                         PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN)
8093                     return REPORT(0);
8094                 Mop(OP_REPEAT);
8095             }
8096             check_uni();
8097             goto just_a_word;
8098
8099         case KEY_xor:
8100             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_LOWLOGIC)
8101                 return REPORT(0);
8102             pl_yylval.ival = OP_XOR;
8103             OPERATOR(OROP);
8104         }
8105     }}
8106 }
8107
8108 /*
8109   S_pending_ident
8110
8111   Looks up an identifier in the pad or in a package
8112
8113   Returns:
8114     PRIVATEREF if this is a lexical name.
8115     WORD       if this belongs to a package.
8116
8117   Structure:
8118       if we're in a my declaration
8119           croak if they tried to say my($foo::bar)
8120           build the ops for a my() declaration
8121       if it's an access to a my() variable
8122           build ops for access to a my() variable
8123       if in a dq string, and they've said @foo and we can't find @foo
8124           warn
8125       build ops for a bareword
8126 */
8127
8128 static int
8129 S_pending_ident(pTHX)
8130 {
8131     PADOFFSET tmp = 0;
8132     const char pit = (char)pl_yylval.ival;
8133     const STRLEN tokenbuf_len = strlen(PL_tokenbuf);
8134     /* All routes through this function want to know if there is a colon.  */
8135     const char *const has_colon = (const char*) memchr (PL_tokenbuf, ':', tokenbuf_len);
8136
8137     DEBUG_T({ PerlIO_printf(Perl_debug_log,
8138           "### Pending identifier '%s'\n", PL_tokenbuf); });
8139
8140     /* if we're in a my(), we can't allow dynamics here.
8141        $foo'bar has already been turned into $foo::bar, so
8142        just check for colons.
8143
8144        if it's a legal name, the OP is a PADANY.
8145     */
8146     if (PL_in_my) {
8147         if (PL_in_my == KEY_our) {      /* "our" is merely analogous to "my" */
8148             if (has_colon)
8149                 yyerror_pv(Perl_form(aTHX_ "No package name allowed for "
8150                                   "variable %s in \"our\"",
8151                                   PL_tokenbuf), UTF ? SVf_UTF8 : 0);
8152             tmp = allocmy(PL_tokenbuf, tokenbuf_len, UTF ? SVf_UTF8 : 0);
8153         }
8154         else {
8155             if (has_colon) {
8156                 /* "my" variable %s can't be in a package */
8157                 /* PL_no_myglob is constant */
8158                 GCC_DIAG_IGNORE(-Wformat-nonliteral);
8159                 yyerror_pv(Perl_form(aTHX_ PL_no_myglob,
8160                             PL_in_my == KEY_my ? "my" : "state",
8161                             *PL_tokenbuf == '&' ? "subroutin" : "variabl",
8162                             PL_tokenbuf),
8163                             UTF ? SVf_UTF8 : 0);
8164                 GCC_DIAG_RESTORE;
8165             }
8166
8167             pl_yylval.opval = newOP(OP_PADANY, 0);
8168             pl_yylval.opval->op_targ = allocmy(PL_tokenbuf, tokenbuf_len,
8169                                                         UTF ? SVf_UTF8 : 0);
8170             return PRIVATEREF;
8171         }
8172     }
8173
8174     /*
8175        build the ops for accesses to a my() variable.
8176     */
8177
8178     if (!has_colon) {
8179         if (!PL_in_my)
8180             tmp = pad_findmy_pvn(PL_tokenbuf, tokenbuf_len,
8181                                     UTF ? SVf_UTF8 : 0);
8182         if (tmp != NOT_IN_PAD) {
8183             /* might be an "our" variable" */
8184             if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
8185                 /* build ops for a bareword */
8186                 HV *  const stash = PAD_COMPNAME_OURSTASH(tmp);
8187                 HEK * const stashname = HvNAME_HEK(stash);
8188                 SV *  const sym = newSVhek(stashname);
8189                 sv_catpvs(sym, "::");
8190                 sv_catpvn_flags(sym, PL_tokenbuf+1, tokenbuf_len - 1, (UTF ? SV_CATUTF8 : SV_CATBYTES ));
8191                 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
8192                 pl_yylval.opval->op_private = OPpCONST_ENTERED;
8193                 if (pit != '&')
8194                   gv_fetchsv(sym,
8195                     GV_ADDMULTI,
8196                     ((PL_tokenbuf[0] == '$') ? SVt_PV
8197                      : (PL_tokenbuf[0] == '@') ? SVt_PVAV
8198                      : SVt_PVHV));
8199                 return WORD;
8200             }
8201
8202             pl_yylval.opval = newOP(OP_PADANY, 0);
8203             pl_yylval.opval->op_targ = tmp;
8204             return PRIVATEREF;
8205         }
8206     }
8207
8208     /*
8209        Whine if they've said @foo in a doublequoted string,
8210        and @foo isn't a variable we can find in the symbol
8211        table.
8212     */
8213     if (ckWARN(WARN_AMBIGUOUS) &&
8214         pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
8215         GV *const gv = gv_fetchpvn_flags(PL_tokenbuf + 1, tokenbuf_len - 1,
8216                                         ( UTF ? SVf_UTF8 : 0 ), SVt_PVAV);
8217         if ((!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
8218                 /* DO NOT warn for @- and @+ */
8219                 && !( PL_tokenbuf[2] == '\0' &&
8220                     ( PL_tokenbuf[1] == '-' || PL_tokenbuf[1] == '+' ))
8221            )
8222         {
8223             /* Downgraded from fatal to warning 20000522 mjd */
8224             Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
8225                         "Possible unintended interpolation of %"UTF8f
8226                         " in string",
8227                         UTF8fARG(UTF, tokenbuf_len, PL_tokenbuf));
8228         }
8229     }
8230
8231     /* build ops for a bareword */
8232     pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0,
8233                                    newSVpvn_flags(PL_tokenbuf + 1,
8234                                                       tokenbuf_len - 1,
8235                                                       UTF ? SVf_UTF8 : 0 ));
8236     pl_yylval.opval->op_private = OPpCONST_ENTERED;
8237     if (pit != '&')
8238         gv_fetchpvn_flags(PL_tokenbuf+1, tokenbuf_len - 1,
8239                      (PL_in_eval ? GV_ADDMULTI : GV_ADD)
8240                      | ( UTF ? SVf_UTF8 : 0 ),
8241                      ((PL_tokenbuf[0] == '$') ? SVt_PV
8242                       : (PL_tokenbuf[0] == '@') ? SVt_PVAV
8243                       : SVt_PVHV));
8244     return WORD;
8245 }
8246
8247 STATIC void
8248 S_checkcomma(pTHX_ const char *s, const char *name, const char *what)
8249 {
8250     PERL_ARGS_ASSERT_CHECKCOMMA;
8251
8252     if (*s == ' ' && s[1] == '(') {     /* XXX gotta be a better way */
8253         if (ckWARN(WARN_SYNTAX)) {
8254             int level = 1;
8255             const char *w;
8256             for (w = s+2; *w && level; w++) {
8257                 if (*w == '(')
8258                     ++level;
8259                 else if (*w == ')')
8260                     --level;
8261             }
8262             while (isSPACE(*w))
8263                 ++w;
8264             /* the list of chars below is for end of statements or
8265              * block / parens, boolean operators (&&, ||, //) and branch
8266              * constructs (or, and, if, until, unless, while, err, for).
8267              * Not a very solid hack... */
8268             if (!*w || !strchr(";&/|})]oaiuwef!=", *w))
8269                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
8270                             "%s (...) interpreted as function",name);
8271         }
8272     }
8273     while (s < PL_bufend && isSPACE(*s))
8274         s++;
8275     if (*s == '(')
8276         s++;
8277     while (s < PL_bufend && isSPACE(*s))
8278         s++;
8279     if (isIDFIRST_lazy_if(s,UTF)) {
8280         const char * const w = s;
8281         s += UTF ? UTF8SKIP(s) : 1;
8282         while (isWORDCHAR_lazy_if(s,UTF))
8283             s += UTF ? UTF8SKIP(s) : 1;
8284         while (s < PL_bufend && isSPACE(*s))
8285             s++;
8286         if (*s == ',') {
8287             GV* gv;
8288             PADOFFSET off;
8289             if (keyword(w, s - w, 0))
8290                 return;
8291
8292             gv = gv_fetchpvn_flags(w, s - w, ( UTF ? SVf_UTF8 : 0 ), SVt_PVCV);
8293             if (gv && GvCVu(gv))
8294                 return;
8295             if (s - w <= 254) {
8296                 char tmpbuf[256];
8297                 Copy(w, tmpbuf+1, s - w, char);
8298                 *tmpbuf = '&';
8299                 off = pad_findmy_pvn(tmpbuf, s-w+1, UTF ? SVf_UTF8 : 0);
8300                 if (off != NOT_IN_PAD) return;
8301             }
8302             Perl_croak(aTHX_ "No comma allowed after %s", what);
8303         }
8304     }
8305 }
8306
8307 /* S_new_constant(): do any overload::constant lookup.
8308
8309    Either returns sv, or mortalizes/frees sv and returns a new SV*.
8310    Best used as sv=new_constant(..., sv, ...).
8311    If s, pv are NULL, calls subroutine with one argument,
8312    and <type> is used with error messages only.
8313    <type> is assumed to be well formed UTF-8 */
8314
8315 STATIC SV *
8316 S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, STRLEN keylen,
8317                SV *sv, SV *pv, const char *type, STRLEN typelen)
8318 {
8319     dSP;
8320     HV * table = GvHV(PL_hintgv);                /* ^H */
8321     SV *res;
8322     SV *errsv = NULL;
8323     SV **cvp;
8324     SV *cv, *typesv;
8325     const char *why1 = "", *why2 = "", *why3 = "";
8326
8327     PERL_ARGS_ASSERT_NEW_CONSTANT;
8328     /* We assume that this is true: */
8329     if (*key == 'c') { assert (strEQ(key, "charnames")); }
8330     assert(type || s);
8331
8332     /* charnames doesn't work well if there have been errors found */
8333     if (PL_error_count > 0 && *key == 'c')
8334     {
8335         SvREFCNT_dec_NN(sv);
8336         return &PL_sv_undef;
8337     }
8338
8339     sv_2mortal(sv);                     /* Parent created it permanently */
8340     if (!table
8341         || ! (PL_hints & HINT_LOCALIZE_HH)
8342         || ! (cvp = hv_fetch(table, key, keylen, FALSE))
8343         || ! SvOK(*cvp))
8344     {
8345         char *msg;
8346         
8347         /* Here haven't found what we're looking for.  If it is charnames,
8348          * perhaps it needs to be loaded.  Try doing that before giving up */
8349         if (*key == 'c') {
8350             Perl_load_module(aTHX_
8351                             0,
8352                             newSVpvs("_charnames"),
8353                              /* version parameter; no need to specify it, as if
8354                               * we get too early a version, will fail anyway,
8355                               * not being able to find '_charnames' */
8356                             NULL,
8357                             newSVpvs(":full"),
8358                             newSVpvs(":short"),
8359                             NULL);
8360             assert(sp == PL_stack_sp);
8361             table = GvHV(PL_hintgv);
8362             if (table
8363                 && (PL_hints & HINT_LOCALIZE_HH)
8364                 && (cvp = hv_fetch(table, key, keylen, FALSE))
8365                 && SvOK(*cvp))
8366             {
8367                 goto now_ok;
8368             }
8369         }
8370         if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
8371             msg = Perl_form(aTHX_
8372                                "Constant(%.*s) unknown",
8373                                 (int)(type ? typelen : len),
8374                                 (type ? type: s));
8375         }
8376         else {
8377             why1 = "$^H{";
8378             why2 = key;
8379             why3 = "} is not defined";
8380         report:
8381             if (*key == 'c') {
8382                 msg = Perl_form(aTHX_
8383                             /* The +3 is for '\N{'; -4 for that, plus '}' */
8384                             "Unknown charname '%.*s'", (int)typelen - 4, type + 3
8385                       );
8386             }
8387             else {
8388                 msg = Perl_form(aTHX_ "Constant(%.*s): %s%s%s",
8389                                     (int)(type ? typelen : len),
8390                                     (type ? type: s), why1, why2, why3);
8391             }
8392         }
8393         yyerror_pv(msg, UTF ? SVf_UTF8 : 0);
8394         return SvREFCNT_inc_simple_NN(sv);
8395     }
8396 now_ok:
8397     cv = *cvp;
8398     if (!pv && s)
8399         pv = newSVpvn_flags(s, len, SVs_TEMP);
8400     if (type && pv)
8401         typesv = newSVpvn_flags(type, typelen, SVs_TEMP);
8402     else
8403         typesv = &PL_sv_undef;
8404
8405     PUSHSTACKi(PERLSI_OVERLOAD);
8406     ENTER ;
8407     SAVETMPS;
8408
8409     PUSHMARK(SP) ;
8410     EXTEND(sp, 3);
8411     if (pv)
8412         PUSHs(pv);
8413     PUSHs(sv);
8414     if (pv)
8415         PUSHs(typesv);
8416     PUTBACK;
8417     call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
8418
8419     SPAGAIN ;
8420
8421     /* Check the eval first */
8422     if (!PL_in_eval && ((errsv = ERRSV), SvTRUE_NN(errsv))) {
8423         STRLEN errlen;
8424         const char * errstr;
8425         sv_catpvs(errsv, "Propagated");
8426         errstr = SvPV_const(errsv, errlen);
8427         yyerror_pvn(errstr, errlen, 0); /* Duplicates the message inside eval */
8428         (void)POPs;
8429         res = SvREFCNT_inc_simple_NN(sv);
8430     }
8431     else {
8432         res = POPs;
8433         SvREFCNT_inc_simple_void_NN(res);
8434     }
8435
8436     PUTBACK ;
8437     FREETMPS ;
8438     LEAVE ;
8439     POPSTACK;
8440
8441     if (!SvOK(res)) {
8442         why1 = "Call to &{$^H{";
8443         why2 = key;
8444         why3 = "}} did not return a defined value";
8445         sv = res;
8446         (void)sv_2mortal(sv);
8447         goto report;
8448     }
8449
8450     return res;
8451 }
8452
8453 PERL_STATIC_INLINE void
8454 S_parse_ident(pTHX_ char **s, char **d, char * const e, int allow_package, bool is_utf8) {
8455     PERL_ARGS_ASSERT_PARSE_IDENT;
8456
8457     for (;;) {
8458         if (*d >= e)
8459             Perl_croak(aTHX_ "%s", ident_too_long);
8460         if (is_utf8 && isIDFIRST_utf8((U8*)*s)) {
8461              /* The UTF-8 case must come first, otherwise things
8462              * like c\N{COMBINING TILDE} would start failing, as the
8463              * isWORDCHAR_A case below would gobble the 'c' up.
8464              */
8465
8466             char *t = *s + UTF8SKIP(*s);
8467             while (isIDCONT_utf8((U8*)t))
8468                 t += UTF8SKIP(t);
8469             if (*d + (t - *s) > e)
8470                 Perl_croak(aTHX_ "%s", ident_too_long);
8471             Copy(*s, *d, t - *s, char);
8472             *d += t - *s;
8473             *s = t;
8474         }
8475         else if ( isWORDCHAR_A(**s) ) {
8476             do {
8477                 *(*d)++ = *(*s)++;
8478             } while (isWORDCHAR_A(**s) && *d < e);
8479         }
8480         else if (allow_package && **s == '\'' && isIDFIRST_lazy_if(*s+1,is_utf8)) {
8481             *(*d)++ = ':';
8482             *(*d)++ = ':';
8483             (*s)++;
8484         }
8485         else if (allow_package && **s == ':' && (*s)[1] == ':'
8486            /* Disallow things like Foo::$bar. For the curious, this is
8487             * the code path that triggers the "Bad name after" warning
8488             * when looking for barewords.
8489             */
8490            && (*s)[2] != '$') {
8491             *(*d)++ = *(*s)++;
8492             *(*d)++ = *(*s)++;
8493         }
8494         else
8495             break;
8496     }
8497     return;
8498 }
8499
8500 /* Returns a NUL terminated string, with the length of the string written to
8501    *slp
8502    */
8503 STATIC char *
8504 S_scan_word(pTHX_ char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
8505 {
8506     char *d = dest;
8507     char * const e = d + destlen - 3;  /* two-character token, ending NUL */
8508     bool is_utf8 = cBOOL(UTF);
8509
8510     PERL_ARGS_ASSERT_SCAN_WORD;
8511
8512     parse_ident(&s, &d, e, allow_package, is_utf8);
8513     *d = '\0';
8514     *slp = d - dest;
8515     return s;
8516 }
8517
8518 STATIC char *
8519 S_scan_ident(pTHX_ char *s, char *dest, STRLEN destlen, I32 ck_uni)
8520 {
8521     I32 herelines = PL_parser->herelines;
8522     SSize_t bracket = -1;
8523     char funny = *s++;
8524     char *d = dest;
8525     char * const e = d + destlen - 3;    /* two-character token, ending NUL */
8526     bool is_utf8 = cBOOL(UTF);
8527     I32 orig_copline = 0, tmp_copline = 0;
8528
8529     PERL_ARGS_ASSERT_SCAN_IDENT;
8530
8531     if (isSPACE(*s))
8532         s = skipspace(s);
8533     if (isDIGIT(*s)) {
8534         while (isDIGIT(*s)) {
8535             if (d >= e)
8536                 Perl_croak(aTHX_ "%s", ident_too_long);
8537             *d++ = *s++;
8538         }
8539     }
8540     else {
8541         parse_ident(&s, &d, e, 1, is_utf8);
8542     }
8543     *d = '\0';
8544     d = dest;
8545     if (*d) {
8546         /* Either a digit variable, or parse_ident() found an identifier
8547            (anything valid as a bareword), so job done and return.  */
8548         if (PL_lex_state != LEX_NORMAL)
8549             PL_lex_state = LEX_INTERPENDMAYBE;
8550         return s;
8551     }
8552     if (*s == '$' && s[1] &&
8553       (isIDFIRST_lazy_if(s+1,is_utf8)
8554          || isDIGIT_A((U8)s[1])
8555          || s[1] == '$'
8556          || s[1] == '{'
8557          || strnEQ(s+1,"::",2)) )
8558     {
8559         /* Dereferencing a value in a scalar variable.
8560            The alternatives are different syntaxes for a scalar variable.
8561            Using ' as a leading package separator isn't allowed. :: is.   */
8562         return s;
8563     }
8564     /* Handle the opening { of @{...}, &{...}, *{...}, %{...}, ${...}  */
8565     if (*s == '{') {
8566         bracket = s - SvPVX(PL_linestr);
8567         s++;
8568         orig_copline = CopLINE(PL_curcop);
8569         if (s < PL_bufend && isSPACE(*s)) {
8570             s = skipspace(s);
8571         }
8572     }
8573
8574 /* Is the byte 'd' a legal single character identifier name?  'u' is true
8575  * iff Unicode semantics are to be used.  The legal ones are any of:
8576  *  a) all ASCII characters except:
8577  *          1) space-type ones, like \t and SPACE;
8578             2) NUL;
8579  *          3) '{'
8580  *     The final case currently doesn't get this far in the program, so we
8581  *     don't test for it.  If that were to change, it would be ok to allow it.
8582  *  c) When not under Unicode rules, any upper Latin1 character
8583  *  d) Otherwise, when unicode rules are used, all XIDS characters.
8584  *
8585  *      Because all ASCII characters have the same representation whether
8586  *      encoded in UTF-8 or not, we can use the foo_A macros below and '\0' and
8587  *      '{' without knowing if is UTF-8 or not */
8588 #ifdef EBCDIC
8589 #   define VALID_LEN_ONE_IDENT(s, is_utf8)                                    \
8590     (isGRAPH_A(*(s)) || ((is_utf8)                                            \
8591                          ? isIDFIRST_utf8((U8*) (s))                          \
8592                          : (isGRAPH_L1(*s)                                    \
8593                             && LIKELY((U8) *(s) != LATIN1_TO_NATIVE(0xAD)))))
8594 #else
8595 #   define VALID_LEN_ONE_IDENT(s, is_utf8) (! isSPACE_A(*(s))                 \
8596                                             && LIKELY(*(s) != '\0')           \
8597                                             && (! is_utf8                     \
8598                                                 || isASCII_utf8((U8*) (s))    \
8599                                                 || isIDFIRST_utf8((U8*) (s))))
8600 #endif
8601     if ((s <= PL_bufend - (is_utf8)
8602                           ? UTF8SKIP(s)
8603                           : 1)
8604         && VALID_LEN_ONE_IDENT(s, is_utf8))
8605     {
8606         /* Deprecate all non-graphic characters.  Include SHY as a non-graphic,
8607          * because often it has no graphic representation.  (We can't get to
8608          * here with SHY when 'is_utf8' is true, so no need to include a UTF-8
8609          * test for it.) */
8610         if ((is_utf8)
8611             ? ! isGRAPH_utf8( (U8*) s)
8612             : (! isGRAPH_L1( (U8) *s)
8613                || UNLIKELY((U8) *(s) == LATIN1_TO_NATIVE(0xAD))))
8614         {
8615             /* Split messages for back compat */
8616             if (isCNTRL_A( (U8) *s)) {
8617                 deprecate("literal control characters in variable names");
8618             }
8619             else {
8620                 deprecate("literal non-graphic characters in variable names");
8621             }
8622         }
8623         
8624         if (is_utf8) {
8625             const STRLEN skip = UTF8SKIP(s);
8626             STRLEN i;
8627             d[skip] = '\0';
8628             for ( i = 0; i < skip; i++ )
8629                 d[i] = *s++;
8630         }
8631         else {
8632             *d = *s++;
8633             d[1] = '\0';
8634         }
8635     }
8636     /* Convert $^F, ${^F} and the ^F of ${^FOO} to control characters */
8637     if (*d == '^' && *s && isCONTROLVAR(*s)) {
8638         *d = toCTRL(*s);
8639         s++;
8640     }
8641     /* Warn about ambiguous code after unary operators if {...} notation isn't
8642        used.  There's no difference in ambiguity; it's merely a heuristic
8643        about when not to warn.  */
8644     else if (ck_uni && bracket == -1)
8645         check_uni();
8646     if (bracket != -1) {
8647         /* If we were processing {...} notation then...  */
8648         if (isIDFIRST_lazy_if(d,is_utf8)) {
8649             /* if it starts as a valid identifier, assume that it is one.
8650                (the later check for } being at the expected point will trap
8651                cases where this doesn't pan out.)  */
8652         d += is_utf8 ? UTF8SKIP(d) : 1;
8653         parse_ident(&s, &d, e, 1, is_utf8);
8654             *d = '\0';
8655             tmp_copline = CopLINE(PL_curcop);
8656             if (s < PL_bufend && isSPACE(*s)) {
8657                 s = skipspace(s);
8658             }
8659             if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
8660                 /* ${foo[0]} and ${foo{bar}} notation.  */
8661                 if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest, 0)) {
8662                     const char * const brack =
8663                         (const char *)
8664                         ((*s == '[') ? "[...]" : "{...}");
8665                     orig_copline = CopLINE(PL_curcop);
8666                     CopLINE_set(PL_curcop, tmp_copline);
8667    /* diag_listed_as: Ambiguous use of %c{%s[...]} resolved to %c%s[...] */
8668                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
8669                         "Ambiguous use of %c{%s%s} resolved to %c%s%s",
8670                         funny, dest, brack, funny, dest, brack);
8671                     CopLINE_set(PL_curcop, orig_copline);
8672                 }
8673                 bracket++;
8674                 PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
8675                 PL_lex_allbrackets++;
8676                 return s;
8677             }
8678         }
8679         /* Handle extended ${^Foo} variables
8680          * 1999-02-27 mjd-perl-patch@plover.com */
8681         else if (! isPRINT(*d) /* isCNTRL(d), plus all non-ASCII */
8682                  && isWORDCHAR(*s))
8683         {
8684             d++;
8685             while (isWORDCHAR(*s) && d < e) {
8686                 *d++ = *s++;
8687             }
8688             if (d >= e)
8689                 Perl_croak(aTHX_ "%s", ident_too_long);
8690             *d = '\0';
8691         }
8692
8693         if ( !tmp_copline )
8694             tmp_copline = CopLINE(PL_curcop);
8695         if (s < PL_bufend && isSPACE(*s)) {
8696             s = skipspace(s);
8697         }
8698             
8699         /* Expect to find a closing } after consuming any trailing whitespace.
8700          */
8701         if (*s == '}') {
8702             s++;
8703             if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) {
8704                 PL_lex_state = LEX_INTERPEND;
8705                 PL_expect = XREF;
8706             }
8707             if (PL_lex_state == LEX_NORMAL) {
8708                 if (ckWARN(WARN_AMBIGUOUS) &&
8709                     (keyword(dest, d - dest, 0)
8710                      || get_cvn_flags(dest, d - dest, is_utf8 ? SVf_UTF8 : 0)))
8711                 {
8712                     SV *tmp = newSVpvn_flags( dest, d - dest,
8713                                             SVs_TEMP | (is_utf8 ? SVf_UTF8 : 0) );
8714                     if (funny == '#')
8715                         funny = '@';
8716                     orig_copline = CopLINE(PL_curcop);
8717                     CopLINE_set(PL_curcop, tmp_copline);
8718                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
8719                         "Ambiguous use of %c{%"SVf"} resolved to %c%"SVf,
8720                         funny, SVfARG(tmp), funny, SVfARG(tmp));
8721                     CopLINE_set(PL_curcop, orig_copline);
8722                 }
8723             }
8724         }
8725         else {
8726             /* Didn't find the closing } at the point we expected, so restore
8727                state such that the next thing to process is the opening { and */
8728             s = SvPVX(PL_linestr) + bracket; /* let the parser handle it */
8729             CopLINE_set(PL_curcop, orig_copline);
8730             PL_parser->herelines = herelines;
8731             *dest = '\0';
8732         }
8733     }
8734     else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
8735         PL_lex_state = LEX_INTERPEND;
8736     return s;
8737 }
8738
8739 static bool
8740 S_pmflag(pTHX_ const char* const valid_flags, U32 * pmfl, char** s, char* charset, unsigned int * x_mod_count) {
8741
8742     /* Adds, subtracts to/from 'pmfl' based on the next regex modifier flag
8743      * found in the parse starting at 's', based on the subset that are valid
8744      * in this context input to this routine in 'valid_flags'. Advances s.
8745      * Returns TRUE if the input should be treated as a valid flag, so the next
8746      * char may be as well; otherwise FALSE. 'charset' should point to a NUL
8747      * upon first call on the current regex.  This routine will set it to any
8748      * charset modifier found.  The caller shouldn't change it.  This way,
8749      * another charset modifier encountered in the parse can be detected as an
8750      * error, as we have decided to allow only one */
8751
8752     const char c = **s;
8753     STRLEN charlen = UTF ? UTF8SKIP(*s) : 1;
8754
8755     if ( charlen != 1 || ! strchr(valid_flags, c) ) {
8756         if (isWORDCHAR_lazy_if(*s, UTF)) {
8757             yyerror_pv(Perl_form(aTHX_ "Unknown regexp modifier \"/%.*s\"", (int)charlen, *s),
8758                        UTF ? SVf_UTF8 : 0);
8759             (*s) += charlen;
8760             /* Pretend that it worked, so will continue processing before
8761              * dieing */
8762             return TRUE;
8763         }
8764         return FALSE;
8765     }
8766
8767     switch (c) {
8768
8769         CASE_STD_PMMOD_FLAGS_PARSE_SET(pmfl, *x_mod_count);
8770         case GLOBAL_PAT_MOD:      *pmfl |= PMf_GLOBAL; break;
8771         case CONTINUE_PAT_MOD:    *pmfl |= PMf_CONTINUE; break;
8772         case ONCE_PAT_MOD:        *pmfl |= PMf_KEEP; break;
8773         case KEEPCOPY_PAT_MOD:    *pmfl |= RXf_PMf_KEEPCOPY; break;
8774         case NONDESTRUCT_PAT_MOD: *pmfl |= PMf_NONDESTRUCT; break;
8775         case LOCALE_PAT_MOD:
8776             if (*charset) {
8777                 goto multiple_charsets;
8778             }
8779             set_regex_charset(pmfl, REGEX_LOCALE_CHARSET);
8780             *charset = c;
8781             break;
8782         case UNICODE_PAT_MOD:
8783             if (*charset) {
8784                 goto multiple_charsets;
8785             }
8786             set_regex_charset(pmfl, REGEX_UNICODE_CHARSET);
8787             *charset = c;
8788             break;
8789         case ASCII_RESTRICT_PAT_MOD:
8790             if (! *charset) {
8791                 set_regex_charset(pmfl, REGEX_ASCII_RESTRICTED_CHARSET);
8792             }
8793             else {
8794
8795                 /* Error if previous modifier wasn't an 'a', but if it was, see
8796                  * if, and accept, a second occurrence (only) */
8797                 if (*charset != 'a'
8798                     || get_regex_charset(*pmfl)
8799                         != REGEX_ASCII_RESTRICTED_CHARSET)
8800                 {
8801                         goto multiple_charsets;
8802                 }
8803                 set_regex_charset(pmfl, REGEX_ASCII_MORE_RESTRICTED_CHARSET);
8804             }
8805             *charset = c;
8806             break;
8807         case DEPENDS_PAT_MOD:
8808             if (*charset) {
8809                 goto multiple_charsets;
8810             }
8811             set_regex_charset(pmfl, REGEX_DEPENDS_CHARSET);
8812             *charset = c;
8813             break;
8814     }
8815
8816     (*s)++;
8817     return TRUE;
8818
8819     multiple_charsets:
8820         if (*charset != c) {
8821             yyerror(Perl_form(aTHX_ "Regexp modifiers \"/%c\" and \"/%c\" are mutually exclusive", *charset, c));
8822         }
8823         else if (c == 'a') {
8824   /* diag_listed_as: Regexp modifier "/%c" may appear a maximum of twice */
8825             yyerror("Regexp modifier \"/a\" may appear a maximum of twice");
8826         }
8827         else {
8828             yyerror(Perl_form(aTHX_ "Regexp modifier \"/%c\" may not appear twice", c));
8829         }
8830
8831         /* Pretend that it worked, so will continue processing before dieing */
8832         (*s)++;
8833         return TRUE;
8834 }
8835
8836 STATIC char *
8837 S_scan_pat(pTHX_ char *start, I32 type)
8838 {
8839     PMOP *pm;
8840     char *s;
8841     const char * const valid_flags =
8842         (const char *)((type == OP_QR) ? QR_PAT_MODS : M_PAT_MODS);
8843     char charset = '\0';    /* character set modifier */
8844     unsigned int x_mod_count = 0;
8845
8846     PERL_ARGS_ASSERT_SCAN_PAT;
8847
8848     s = scan_str(start,TRUE,FALSE, (PL_in_eval & EVAL_RE_REPARSING), NULL);
8849     if (!s)
8850         Perl_croak(aTHX_ "Search pattern not terminated");
8851
8852     pm = (PMOP*)newPMOP(type, 0);
8853     if (PL_multi_open == '?') {
8854         /* This is the only point in the code that sets PMf_ONCE:  */
8855         pm->op_pmflags |= PMf_ONCE;
8856
8857         /* Hence it's safe to do this bit of PMOP book-keeping here, which
8858            allows us to restrict the list needed by reset to just the ??
8859            matches.  */
8860         assert(type != OP_TRANS);
8861         if (PL_curstash) {
8862             MAGIC *mg = mg_find((const SV *)PL_curstash, PERL_MAGIC_symtab);
8863             U32 elements;
8864             if (!mg) {
8865                 mg = sv_magicext(MUTABLE_SV(PL_curstash), 0, PERL_MAGIC_symtab, 0, 0,
8866                                  0);
8867             }
8868             elements = mg->mg_len / sizeof(PMOP**);
8869             Renewc(mg->mg_ptr, elements + 1, PMOP*, char);
8870             ((PMOP**)mg->mg_ptr) [elements++] = pm;
8871             mg->mg_len = elements * sizeof(PMOP**);
8872             PmopSTASH_set(pm,PL_curstash);
8873         }
8874     }
8875
8876     /* if qr/...(?{..}).../, then need to parse the pattern within a new
8877      * anon CV. False positives like qr/[(?{]/ are harmless */
8878
8879     if (type == OP_QR) {
8880         STRLEN len;
8881         char *e, *p = SvPV(PL_lex_stuff, len);
8882         e = p + len;
8883         for (; p < e; p++) {
8884             if (p[0] == '(' && p[1] == '?'
8885                 && (p[2] == '{' || (p[2] == '?' && p[3] == '{')))
8886             {
8887                 pm->op_pmflags |= PMf_HAS_CV;
8888                 break;
8889             }
8890         }
8891         pm->op_pmflags |= PMf_IS_QR;
8892     }
8893
8894     while (*s && S_pmflag(aTHX_ valid_flags, &(pm->op_pmflags),
8895                                 &s, &charset, &x_mod_count))
8896     {};
8897     /* issue a warning if /c is specified,but /g is not */
8898     if ((pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL))
8899     {
8900         Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), 
8901                        "Use of /c modifier is meaningless without /g" );
8902     }
8903
8904     STD_PMMOD_FLAGS_PARSE_X_WARN(x_mod_count);
8905
8906     PL_lex_op = (OP*)pm;
8907     pl_yylval.ival = OP_MATCH;
8908     return s;
8909 }
8910
8911 STATIC char *
8912 S_scan_subst(pTHX_ char *start)
8913 {
8914     char *s;
8915     PMOP *pm;
8916     I32 first_start;
8917     line_t first_line;
8918     I32 es = 0;
8919     char charset = '\0';    /* character set modifier */
8920     unsigned int x_mod_count = 0;
8921     char *t;
8922
8923     PERL_ARGS_ASSERT_SCAN_SUBST;
8924
8925     pl_yylval.ival = OP_NULL;
8926
8927     s = scan_str(start, TRUE, FALSE, FALSE, &t);
8928
8929     if (!s)
8930         Perl_croak(aTHX_ "Substitution pattern not terminated");
8931
8932     s = t;
8933
8934     first_start = PL_multi_start;
8935     first_line = CopLINE(PL_curcop);
8936     s = scan_str(s,FALSE,FALSE,FALSE,NULL);
8937     if (!s) {
8938         if (PL_lex_stuff) {
8939             SvREFCNT_dec(PL_lex_stuff);
8940             PL_lex_stuff = NULL;
8941         }
8942         Perl_croak(aTHX_ "Substitution replacement not terminated");
8943     }
8944     PL_multi_start = first_start;       /* so whole substitution is taken together */
8945
8946     pm = (PMOP*)newPMOP(OP_SUBST, 0);
8947
8948
8949     while (*s) {
8950         if (*s == EXEC_PAT_MOD) {
8951             s++;
8952             es++;
8953         }
8954         else if (! S_pmflag(aTHX_ S_PAT_MODS, &(pm->op_pmflags),
8955                                   &s, &charset, &x_mod_count))
8956         {
8957             break;
8958         }
8959     }
8960
8961     STD_PMMOD_FLAGS_PARSE_X_WARN(x_mod_count);
8962
8963     if ((pm->op_pmflags & PMf_CONTINUE)) {
8964         Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), "Use of /c modifier is meaningless in s///" );
8965     }
8966
8967     if (es) {
8968         SV * const repl = newSVpvs("");
8969
8970         PL_multi_end = 0;
8971         pm->op_pmflags |= PMf_EVAL;
8972         while (es-- > 0) {
8973             if (es)
8974                 sv_catpvs(repl, "eval ");
8975             else
8976                 sv_catpvs(repl, "do ");
8977         }
8978         sv_catpvs(repl, "{");
8979         sv_catsv(repl, PL_sublex_info.repl);
8980         sv_catpvs(repl, "}");
8981         SvEVALED_on(repl);
8982         SvREFCNT_dec(PL_sublex_info.repl);
8983         PL_sublex_info.repl = repl;
8984     }
8985     if (CopLINE(PL_curcop) != first_line) {
8986         sv_upgrade(PL_sublex_info.repl, SVt_PVNV);
8987         ((XPVNV*)SvANY(PL_sublex_info.repl))->xnv_u.xpad_cop_seq.xlow =
8988             CopLINE(PL_curcop) - first_line;
8989         CopLINE_set(PL_curcop, first_line);
8990     }
8991
8992     PL_lex_op = (OP*)pm;
8993     pl_yylval.ival = OP_SUBST;
8994     return s;
8995 }
8996
8997 STATIC char *
8998 S_scan_trans(pTHX_ char *start)
8999 {
9000     char* s;
9001     OP *o;
9002     U8 squash;
9003     U8 del;
9004     U8 complement;
9005     bool nondestruct = 0;
9006     char *t;
9007
9008     PERL_ARGS_ASSERT_SCAN_TRANS;
9009
9010     pl_yylval.ival = OP_NULL;
9011
9012     s = scan_str(start,FALSE,FALSE,FALSE,&t);
9013     if (!s)
9014         Perl_croak(aTHX_ "Transliteration pattern not terminated");
9015
9016     s = t;
9017
9018     s = scan_str(s,FALSE,FALSE,FALSE,NULL);
9019     if (!s) {
9020         if (PL_lex_stuff) {
9021             SvREFCNT_dec(PL_lex_stuff);
9022             PL_lex_stuff = NULL;
9023         }
9024         Perl_croak(aTHX_ "Transliteration replacement not terminated");
9025     }
9026
9027     complement = del = squash = 0;
9028     while (1) {
9029         switch (*s) {
9030         case 'c':
9031             complement = OPpTRANS_COMPLEMENT;
9032             break;
9033         case 'd':
9034             del = OPpTRANS_DELETE;
9035             break;
9036         case 's':
9037             squash = OPpTRANS_SQUASH;
9038             break;
9039         case 'r':
9040             nondestruct = 1;
9041             break;
9042         default:
9043             goto no_more;
9044         }
9045         s++;
9046     }
9047   no_more:
9048
9049     o = newPVOP(nondestruct ? OP_TRANSR : OP_TRANS, 0, (char*)NULL);
9050     o->op_private &= ~OPpTRANS_ALL;
9051     o->op_private |= del|squash|complement|
9052       (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
9053       (DO_UTF8(PL_sublex_info.repl) ? OPpTRANS_TO_UTF   : 0);
9054
9055     PL_lex_op = o;
9056     pl_yylval.ival = nondestruct ? OP_TRANSR : OP_TRANS;
9057
9058
9059     return s;
9060 }
9061
9062 /* scan_heredoc
9063    Takes a pointer to the first < in <<FOO.
9064    Returns a pointer to the byte following <<FOO.
9065
9066    This function scans a heredoc, which involves different methods
9067    depending on whether we are in a string eval, quoted construct, etc.
9068    This is because PL_linestr could containing a single line of input, or
9069    a whole string being evalled, or the contents of the current quote-
9070    like operator.
9071
9072    The two basic methods are:
9073     - Steal lines from the input stream
9074     - Scan the heredoc in PL_linestr and remove it therefrom
9075
9076    In a file scope or filtered eval, the first method is used; in a
9077    string eval, the second.
9078
9079    In a quote-like operator, we have to choose between the two,
9080    depending on where we can find a newline.  We peek into outer lex-
9081    ing scopes until we find one with a newline in it.  If we reach the
9082    outermost lexing scope and it is a file, we use the stream method.
9083    Otherwise it is treated as an eval.
9084 */
9085
9086 STATIC char *
9087 S_scan_heredoc(pTHX_ char *s)
9088 {
9089     I32 op_type = OP_SCALAR;
9090     I32 len;
9091     SV *tmpstr;
9092     char term;
9093     char *d;
9094     char *e;
9095     char *peek;
9096     const bool infile = PL_rsfp || PL_parser->filtered;
9097     const line_t origline = CopLINE(PL_curcop);
9098     LEXSHARED *shared = PL_parser->lex_shared;
9099
9100     PERL_ARGS_ASSERT_SCAN_HEREDOC;
9101
9102     s += 2;
9103     d = PL_tokenbuf + 1;
9104     e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
9105     *PL_tokenbuf = '\n';
9106     peek = s;
9107     while (SPACE_OR_TAB(*peek))
9108         peek++;
9109     if (*peek == '`' || *peek == '\'' || *peek =='"') {
9110         s = peek;
9111         term = *s++;
9112         s = delimcpy(d, e, s, PL_bufend, term, &len);
9113         if (s == PL_bufend)
9114             Perl_croak(aTHX_ "Unterminated delimiter for here document");
9115         d += len;
9116         s++;
9117     }
9118     else {
9119         if (*s == '\\')
9120             /* <<\FOO is equivalent to <<'FOO' */
9121             s++, term = '\'';
9122         else
9123             term = '"';
9124         if (!isWORDCHAR_lazy_if(s,UTF))
9125             deprecate("bare << to mean <<\"\"");
9126         for (; isWORDCHAR_lazy_if(s,UTF); s++) {
9127             if (d < e)
9128                 *d++ = *s;
9129         }
9130     }
9131     if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
9132         Perl_croak(aTHX_ "Delimiter for here document is too long");
9133     *d++ = '\n';
9134     *d = '\0';
9135     len = d - PL_tokenbuf;
9136
9137 #ifndef PERL_STRICT_CR
9138     d = strchr(s, '\r');
9139     if (d) {
9140         char * const olds = s;
9141         s = d;
9142         while (s < PL_bufend) {
9143             if (*s == '\r') {
9144                 *d++ = '\n';
9145                 if (*++s == '\n')
9146                     s++;
9147             }
9148             else if (*s == '\n' && s[1] == '\r') {      /* \015\013 on a mac? */
9149                 *d++ = *s++;
9150                 s++;
9151             }
9152             else
9153                 *d++ = *s++;
9154         }
9155         *d = '\0';
9156         PL_bufend = d;
9157         SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
9158         s = olds;
9159     }
9160 #endif
9161
9162     tmpstr = newSV_type(SVt_PVIV);
9163     SvGROW(tmpstr, 80);
9164     if (term == '\'') {
9165         op_type = OP_CONST;
9166         SvIV_set(tmpstr, -1);
9167     }
9168     else if (term == '`') {
9169         op_type = OP_BACKTICK;
9170         SvIV_set(tmpstr, '\\');
9171     }
9172
9173     PL_multi_start = origline + 1 + PL_parser->herelines;
9174     PL_multi_open = PL_multi_close = '<';
9175     /* inside a string eval or quote-like operator */
9176     if (!infile || PL_lex_inwhat) {
9177         SV *linestr;
9178         char *bufend;
9179         char * const olds = s;
9180         PERL_CONTEXT * const cx = &cxstack[cxstack_ix];
9181         /* These two fields are not set until an inner lexing scope is
9182            entered.  But we need them set here. */
9183         shared->ls_bufptr  = s;
9184         shared->ls_linestr = PL_linestr;
9185         if (PL_lex_inwhat)
9186           /* Look for a newline.  If the current buffer does not have one,
9187              peek into the line buffer of the parent lexing scope, going
9188              up as many levels as necessary to find one with a newline
9189              after bufptr.
9190            */
9191           while (!(s = (char *)memchr(
9192                     (void *)shared->ls_bufptr, '\n',
9193                     SvEND(shared->ls_linestr)-shared->ls_bufptr
9194                 ))) {
9195             shared = shared->ls_prev;
9196             /* shared is only null if we have gone beyond the outermost
9197                lexing scope.  In a file, we will have broken out of the
9198                loop in the previous iteration.  In an eval, the string buf-
9199                fer ends with "\n;", so the while condition above will have
9200                evaluated to false.  So shared can never be null. */
9201             assert(shared);
9202             /* A LEXSHARED struct with a null ls_prev pointer is the outer-
9203                most lexing scope.  In a file, shared->ls_linestr at that
9204                level is just one line, so there is no body to steal. */
9205             if (infile && !shared->ls_prev) {
9206                 s = olds;
9207                 goto streaming;
9208             }
9209           }
9210         else {  /* eval */
9211             s = (char*)memchr((void*)s, '\n', PL_bufend - s);
9212             assert(s);
9213         }
9214         linestr = shared->ls_linestr;
9215         bufend = SvEND(linestr);
9216         d = s;
9217         while (s < bufend - len + 1 &&
9218           memNE(s,PL_tokenbuf,len) ) {
9219             if (*s++ == '\n')
9220                 ++PL_parser->herelines;
9221         }
9222         if (s >= bufend - len + 1) {
9223             goto interminable;
9224         }
9225         sv_setpvn(tmpstr,d+1,s-d);
9226         s += len - 1;
9227         /* the preceding stmt passes a newline */
9228         PL_parser->herelines++;
9229
9230         /* s now points to the newline after the heredoc terminator.
9231            d points to the newline before the body of the heredoc.
9232          */
9233
9234         /* We are going to modify linestr in place here, so set
9235            aside copies of the string if necessary for re-evals or
9236            (caller $n)[6]. */
9237         /* See the Paranoia note in case LEX_INTERPEND in yylex, for why we
9238            check shared->re_eval_str. */
9239         if (shared->re_eval_start || shared->re_eval_str) {
9240             /* Set aside the rest of the regexp */
9241             if (!shared->re_eval_str)
9242                 shared->re_eval_str =
9243                        newSVpvn(shared->re_eval_start,
9244                                 bufend - shared->re_eval_start);
9245             shared->re_eval_start -= s-d;
9246         }
9247         if (cxstack_ix >= 0 && CxTYPE(cx) == CXt_EVAL &&
9248             CxOLD_OP_TYPE(cx) == OP_ENTEREVAL &&
9249             cx->blk_eval.cur_text == linestr)
9250         {
9251             cx->blk_eval.cur_text = newSVsv(linestr);
9252             SvSCREAM_on(cx->blk_eval.cur_text);
9253         }
9254         /* Copy everything from s onwards back to d. */
9255         Move(s,d,bufend-s + 1,char);
9256         SvCUR_set(linestr, SvCUR(linestr) - (s-d));
9257         /* Setting PL_bufend only applies when we have not dug deeper
9258            into other scopes, because sublex_done sets PL_bufend to
9259            SvEND(PL_linestr). */
9260         if (shared == PL_parser->lex_shared) PL_bufend = SvEND(linestr);
9261         s = olds;
9262     }
9263     else
9264     {
9265       SV *linestr_save;
9266      streaming:
9267       sv_setpvs(tmpstr,"");   /* avoid "uninitialized" warning */
9268       term = PL_tokenbuf[1];
9269       len--;
9270       linestr_save = PL_linestr; /* must restore this afterwards */
9271       d = s;                     /* and this */
9272       PL_linestr = newSVpvs("");
9273       PL_bufend = SvPVX(PL_linestr);
9274       while (1) {
9275         PL_bufptr = PL_bufend;
9276         CopLINE_set(PL_curcop,
9277                     origline + 1 + PL_parser->herelines);
9278         if (!lex_next_chunk(LEX_NO_TERM)
9279          && (!SvCUR(tmpstr) || SvEND(tmpstr)[-1] != '\n')) {
9280             /* Simply freeing linestr_save might seem simpler here, as it
9281                does not matter what PL_linestr points to, since we are
9282                about to croak; but in a quote-like op, linestr_save
9283                will have been prospectively freed already, via
9284                SAVEFREESV(PL_linestr) in sublex_push, so it’s easier to
9285                restore PL_linestr. */
9286             SvREFCNT_dec_NN(PL_linestr);
9287             PL_linestr = linestr_save;
9288             goto interminable;
9289         }
9290         CopLINE_set(PL_curcop, origline);
9291         if (!SvCUR(PL_linestr) || PL_bufend[-1] != '\n') {
9292             s = lex_grow_linestr(SvLEN(PL_linestr) + 3);
9293             /* ^That should be enough to avoid this needing to grow:  */
9294             sv_catpvs(PL_linestr, "\n\0");
9295             assert(s == SvPVX(PL_linestr));
9296             PL_bufend = SvEND(PL_linestr);
9297         }
9298         s = PL_bufptr;
9299         PL_parser->herelines++;
9300         PL_last_lop = PL_last_uni = NULL;
9301 #ifndef PERL_STRICT_CR
9302         if (PL_bufend - PL_linestart >= 2) {
9303             if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
9304                 (PL_bufend[-2] == '\n' && PL_bufend[-1] == '\r'))
9305             {
9306                 PL_bufend[-2] = '\n';
9307                 PL_bufend--;
9308                 SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
9309             }
9310             else if (PL_bufend[-1] == '\r')
9311                 PL_bufend[-1] = '\n';
9312         }
9313         else if (PL_bufend - PL_linestart == 1 && PL_bufend[-1] == '\r')
9314             PL_bufend[-1] = '\n';
9315 #endif
9316         if (*s == term && PL_bufend-s >= len
9317          && memEQ(s,PL_tokenbuf + 1,len)) {
9318             SvREFCNT_dec(PL_linestr);
9319             PL_linestr = linestr_save;
9320             PL_linestart = SvPVX(linestr_save);
9321             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
9322             s = d;
9323             break;
9324         }
9325         else {
9326             sv_catsv(tmpstr,PL_linestr);
9327         }
9328       }
9329     }
9330     PL_multi_end = origline + PL_parser->herelines;
9331     if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
9332         SvPV_shrink_to_cur(tmpstr);
9333     }
9334     if (!IN_BYTES) {
9335         if (UTF && is_utf8_string((U8*)SvPVX_const(tmpstr), SvCUR(tmpstr)))
9336             SvUTF8_on(tmpstr);
9337         else if (PL_encoding)
9338             sv_recode_to_utf8(tmpstr, PL_encoding);
9339     }
9340     PL_lex_stuff = tmpstr;
9341     pl_yylval.ival = op_type;
9342     return s;
9343
9344   interminable:
9345     SvREFCNT_dec(tmpstr);
9346     CopLINE_set(PL_curcop, origline);
9347     missingterm(PL_tokenbuf + 1);
9348 }
9349
9350 /* scan_inputsymbol
9351    takes: current position in input buffer
9352    returns: new position in input buffer
9353    side-effects: pl_yylval and lex_op are set.
9354
9355    This code handles:
9356
9357    <>           read from ARGV
9358    <<>>         read from ARGV without magic open
9359    <FH>         read from filehandle
9360    <pkg::FH>    read from package qualified filehandle
9361    <pkg'FH>     read from package qualified filehandle
9362    <$fh>        read from filehandle in $fh
9363    <*.h>        filename glob
9364
9365 */
9366
9367 STATIC char *
9368 S_scan_inputsymbol(pTHX_ char *start)
9369 {
9370     char *s = start;            /* current position in buffer */
9371     char *end;
9372     I32 len;
9373     bool nomagicopen = FALSE;
9374     char *d = PL_tokenbuf;                                      /* start of temp holding space */
9375     const char * const e = PL_tokenbuf + sizeof PL_tokenbuf;    /* end of temp holding space */
9376
9377     PERL_ARGS_ASSERT_SCAN_INPUTSYMBOL;
9378
9379     end = strchr(s, '\n');
9380     if (!end)
9381         end = PL_bufend;
9382     if (s[1] == '<' && s[2] == '>' && s[3] == '>') {
9383         nomagicopen = TRUE;
9384         *d = '\0';
9385         len = 0;
9386         s += 3;
9387     }
9388     else
9389         s = delimcpy(d, e, s + 1, end, '>', &len);      /* extract until > */
9390
9391     /* die if we didn't have space for the contents of the <>,
9392        or if it didn't end, or if we see a newline
9393     */
9394
9395     if (len >= (I32)sizeof PL_tokenbuf)
9396         Perl_croak(aTHX_ "Excessively long <> operator");
9397     if (s >= end)
9398         Perl_croak(aTHX_ "Unterminated <> operator");
9399
9400     s++;
9401
9402     /* check for <$fh>
9403        Remember, only scalar variables are interpreted as filehandles by
9404        this code.  Anything more complex (e.g., <$fh{$num}>) will be
9405        treated as a glob() call.
9406        This code makes use of the fact that except for the $ at the front,
9407        a scalar variable and a filehandle look the same.
9408     */
9409     if (*d == '$' && d[1]) d++;
9410
9411     /* allow <Pkg'VALUE> or <Pkg::VALUE> */
9412     while (*d && (isWORDCHAR_lazy_if(d,UTF) || *d == '\'' || *d == ':'))
9413         d += UTF ? UTF8SKIP(d) : 1;
9414
9415     /* If we've tried to read what we allow filehandles to look like, and
9416        there's still text left, then it must be a glob() and not a getline.
9417        Use scan_str to pull out the stuff between the <> and treat it
9418        as nothing more than a string.
9419     */
9420
9421     if (d - PL_tokenbuf != len) {
9422         pl_yylval.ival = OP_GLOB;
9423         s = scan_str(start,FALSE,FALSE,FALSE,NULL);
9424         if (!s)
9425            Perl_croak(aTHX_ "Glob not terminated");
9426         return s;
9427     }
9428     else {
9429         bool readline_overriden = FALSE;
9430         GV *gv_readline;
9431         /* we're in a filehandle read situation */
9432         d = PL_tokenbuf;
9433
9434         /* turn <> into <ARGV> */
9435         if (!len)
9436             Copy("ARGV",d,5,char);
9437
9438         /* Check whether readline() is overriden */
9439         if ((gv_readline = gv_override("readline",8)))
9440             readline_overriden = TRUE;
9441
9442         /* if <$fh>, create the ops to turn the variable into a
9443            filehandle
9444         */
9445         if (*d == '$') {
9446             /* try to find it in the pad for this block, otherwise find
9447                add symbol table ops
9448             */
9449             const PADOFFSET tmp = pad_findmy_pvn(d, len, UTF ? SVf_UTF8 : 0);
9450             if (tmp != NOT_IN_PAD) {
9451                 if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
9452                     HV * const stash = PAD_COMPNAME_OURSTASH(tmp);
9453                     HEK * const stashname = HvNAME_HEK(stash);
9454                     SV * const sym = sv_2mortal(newSVhek(stashname));
9455                     sv_catpvs(sym, "::");
9456                     sv_catpv(sym, d+1);
9457                     d = SvPVX(sym);
9458                     goto intro_sym;
9459                 }
9460                 else {
9461                     OP * const o = newOP(OP_PADSV, 0);
9462                     o->op_targ = tmp;
9463                     PL_lex_op = readline_overriden
9464                         ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
9465                                 op_append_elem(OP_LIST, o,
9466                                     newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
9467                         : (OP*)newUNOP(OP_READLINE, 0, o);
9468                 }
9469             }
9470             else {
9471                 GV *gv;
9472                 ++d;
9473 intro_sym:
9474                 gv = gv_fetchpv(d,
9475                                 GV_ADDMULTI | ( UTF ? SVf_UTF8 : 0 ),
9476                                 SVt_PV);
9477                 PL_lex_op = readline_overriden
9478                     ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
9479                             op_append_elem(OP_LIST,
9480                                 newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
9481                                 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
9482                     : (OP*)newUNOP(OP_READLINE, 0,
9483                             newUNOP(OP_RV2SV, 0,
9484                                 newGVOP(OP_GV, 0, gv)));
9485             }
9486             /* we created the ops in PL_lex_op, so make pl_yylval.ival a null op */
9487             pl_yylval.ival = OP_NULL;
9488         }
9489
9490         /* If it's none of the above, it must be a literal filehandle
9491            (<Foo::BAR> or <FOO>) so build a simple readline OP */
9492         else {
9493             GV * const gv = gv_fetchpv(d, GV_ADD | ( UTF ? SVf_UTF8 : 0 ), SVt_PVIO);
9494             PL_lex_op = readline_overriden
9495                 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
9496                         op_append_elem(OP_LIST,
9497                             newGVOP(OP_GV, 0, gv),
9498                             newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
9499                 : (OP*)newUNOP(OP_READLINE, nomagicopen ? OPf_SPECIAL : 0, newGVOP(OP_GV, 0, gv));
9500             pl_yylval.ival = OP_NULL;
9501         }
9502     }
9503
9504     return s;
9505 }
9506
9507
9508 /* scan_str
9509    takes:
9510         start                   position in buffer
9511         keep_bracketed_quoted   preserve \ quoting of embedded delimiters, but
9512                                 only if they are of the open/close form
9513         keep_delims             preserve the delimiters around the string
9514         re_reparse              compiling a run-time /(?{})/:
9515                                    collapse // to /,  and skip encoding src
9516         delimp                  if non-null, this is set to the position of
9517                                 the closing delimiter, or just after it if
9518                                 the closing and opening delimiters differ
9519                                 (i.e., the opening delimiter of a substitu-
9520                                 tion replacement)
9521    returns: position to continue reading from buffer
9522    side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
9523         updates the read buffer.
9524
9525    This subroutine pulls a string out of the input.  It is called for:
9526         q               single quotes           q(literal text)
9527         '               single quotes           'literal text'
9528         qq              double quotes           qq(interpolate $here please)
9529         "               double quotes           "interpolate $here please"
9530         qx              backticks               qx(/bin/ls -l)
9531         `               backticks               `/bin/ls -l`
9532         qw              quote words             @EXPORT_OK = qw( func() $spam )
9533         m//             regexp match            m/this/
9534         s///            regexp substitute       s/this/that/
9535         tr///           string transliterate    tr/this/that/
9536         y///            string transliterate    y/this/that/
9537         ($*@)           sub prototypes          sub foo ($)
9538         (stuff)         sub attr parameters     sub foo : attr(stuff)
9539         <>              readline or globs       <FOO>, <>, <$fh>, or <*.c>
9540         
9541    In most of these cases (all but <>, patterns and transliterate)
9542    yylex() calls scan_str().  m// makes yylex() call scan_pat() which
9543    calls scan_str().  s/// makes yylex() call scan_subst() which calls
9544    scan_str().  tr/// and y/// make yylex() call scan_trans() which
9545    calls scan_str().
9546
9547    It skips whitespace before the string starts, and treats the first
9548    character as the delimiter.  If the delimiter is one of ([{< then
9549    the corresponding "close" character )]}> is used as the closing
9550    delimiter.  It allows quoting of delimiters, and if the string has
9551    balanced delimiters ([{<>}]) it allows nesting.
9552
9553    On success, the SV with the resulting string is put into lex_stuff or,
9554    if that is already non-NULL, into lex_repl. The second case occurs only
9555    when parsing the RHS of the special constructs s/// and tr/// (y///).
9556    For convenience, the terminating delimiter character is stuffed into
9557    SvIVX of the SV.
9558 */
9559
9560 STATIC char *
9561 S_scan_str(pTHX_ char *start, int keep_bracketed_quoted, int keep_delims, int re_reparse,
9562                  char **delimp
9563     )
9564 {
9565     SV *sv;                     /* scalar value: string */
9566     const char *tmps;           /* temp string, used for delimiter matching */
9567     char *s = start;            /* current position in the buffer */
9568     char term;                  /* terminating character */
9569     char *to;                   /* current position in the sv's data */
9570     I32 brackets = 1;           /* bracket nesting level */
9571     bool has_utf8 = FALSE;      /* is there any utf8 content? */
9572     I32 termcode;               /* terminating char. code */
9573     U8 termstr[UTF8_MAXBYTES];  /* terminating string */
9574     STRLEN termlen;             /* length of terminating string */
9575     int last_off = 0;           /* last position for nesting bracket */
9576     line_t herelines;
9577
9578     PERL_ARGS_ASSERT_SCAN_STR;
9579
9580     /* skip space before the delimiter */
9581     if (isSPACE(*s)) {
9582         s = skipspace(s);
9583     }
9584
9585     /* mark where we are, in case we need to report errors */
9586     CLINE;
9587
9588     /* after skipping whitespace, the next character is the terminator */
9589     term = *s;
9590     if (!UTF) {
9591         termcode = termstr[0] = term;
9592         termlen = 1;
9593     }
9594     else {
9595         termcode = utf8_to_uvchr_buf((U8*)s, (U8*)PL_bufend, &termlen);
9596         Copy(s, termstr, termlen, U8);
9597         if (!UTF8_IS_INVARIANT(term))
9598             has_utf8 = TRUE;
9599     }
9600
9601     /* mark where we are */
9602     PL_multi_start = CopLINE(PL_curcop);
9603     PL_multi_open = term;
9604     herelines = PL_parser->herelines;
9605
9606     /* find corresponding closing delimiter */
9607     if (term && (tmps = strchr("([{< )]}> )]}>",term)))
9608         termcode = termstr[0] = term = tmps[5];
9609
9610     PL_multi_close = term;
9611
9612     if (PL_multi_open == PL_multi_close) {
9613         keep_bracketed_quoted = FALSE;
9614     }
9615
9616     /* create a new SV to hold the contents.  79 is the SV's initial length.
9617        What a random number. */
9618     sv = newSV_type(SVt_PVIV);
9619     SvGROW(sv, 80);
9620     SvIV_set(sv, termcode);
9621     (void)SvPOK_only(sv);               /* validate pointer */
9622
9623     /* move past delimiter and try to read a complete string */
9624     if (keep_delims)
9625         sv_catpvn(sv, s, termlen);
9626     s += termlen;
9627     for (;;) {
9628         if (PL_encoding && !UTF && !re_reparse) {
9629             bool cont = TRUE;
9630
9631             while (cont) {
9632                 int offset = s - SvPVX_const(PL_linestr);
9633                 const bool found = sv_cat_decode(sv, PL_encoding, PL_linestr,
9634                                            &offset, (char*)termstr, termlen);
9635                 const char *ns;
9636                 char *svlast;
9637
9638                 if (SvIsCOW(PL_linestr)) {
9639                     STRLEN bufend_pos, bufptr_pos, oldbufptr_pos;
9640                     STRLEN oldoldbufptr_pos, linestart_pos, last_uni_pos;
9641                     STRLEN last_lop_pos, re_eval_start_pos, s_pos;
9642                     char *buf = SvPVX(PL_linestr);
9643                     bufend_pos = PL_parser->bufend - buf;
9644                     bufptr_pos = PL_parser->bufptr - buf;
9645                     oldbufptr_pos = PL_parser->oldbufptr - buf;
9646                     oldoldbufptr_pos = PL_parser->oldoldbufptr - buf;
9647                     linestart_pos = PL_parser->linestart - buf;
9648                     last_uni_pos = PL_parser->last_uni
9649                         ? PL_parser->last_uni - buf
9650                         : 0;
9651                     last_lop_pos = PL_parser->last_lop
9652                         ? PL_parser->last_lop - buf
9653                         : 0;
9654                     re_eval_start_pos =
9655                         PL_parser->lex_shared->re_eval_start ?
9656                             PL_parser->lex_shared->re_eval_start - buf : 0;
9657                     s_pos = s - buf;
9658
9659                     sv_force_normal(PL_linestr);
9660
9661                     buf = SvPVX(PL_linestr);
9662                     PL_parser->bufend = buf + bufend_pos;
9663                     PL_parser->bufptr = buf + bufptr_pos;
9664                     PL_parser->oldbufptr = buf + oldbufptr_pos;
9665                     PL_parser->oldoldbufptr = buf + oldoldbufptr_pos;
9666                     PL_parser->linestart = buf + linestart_pos;
9667                     if (PL_parser->last_uni)
9668                         PL_parser->last_uni = buf + last_uni_pos;
9669                     if (PL_parser->last_lop)
9670                         PL_parser->last_lop = buf + last_lop_pos;
9671                     if (PL_parser->lex_shared->re_eval_start)
9672                         PL_parser->lex_shared->re_eval_start  =
9673                             buf + re_eval_start_pos;
9674                     s = buf + s_pos;
9675                 }
9676                 ns = SvPVX_const(PL_linestr) + offset;
9677                 svlast = SvEND(sv) - 1;
9678
9679                 for (; s < ns; s++) {
9680                     if (*s == '\n' && !PL_rsfp && !PL_parser->filtered)
9681                         COPLINE_INC_WITH_HERELINES;
9682                 }
9683                 if (!found)
9684                     goto read_more_line;
9685                 else {
9686                     /* handle quoted delimiters */
9687                     if (SvCUR(sv) > 1 && *(svlast-1) == '\\') {
9688                         const char *t;
9689                         for (t = svlast-2; t >= SvPVX_const(sv) && *t == '\\';)
9690                             t--;
9691                         if ((svlast-1 - t) % 2) {
9692                             if (!keep_bracketed_quoted) {
9693                                 *(svlast-1) = term;
9694                                 *svlast = '\0';
9695                                 SvCUR_set(sv, SvCUR(sv) - 1);
9696                             }
9697                             continue;
9698                         }
9699                     }
9700                     if (PL_multi_open == PL_multi_close) {
9701                         cont = FALSE;
9702                     }
9703                     else {
9704                         const char *t;
9705                         char *w;
9706                         for (t = w = SvPVX(sv)+last_off; t < svlast; w++, t++) {
9707                             /* At here, all closes are "was quoted" one,
9708                                so we don't check PL_multi_close. */
9709                             if (*t == '\\') {
9710                                 if (!keep_bracketed_quoted && *(t+1) == PL_multi_open)
9711                                     t++;
9712                                 else
9713                                     *w++ = *t++;
9714                             }
9715                             else if (*t == PL_multi_open)
9716                                 brackets++;
9717
9718                             *w = *t;
9719                         }
9720                         if (w < t) {
9721                             *w++ = term;
9722                             *w = '\0';
9723                             SvCUR_set(sv, w - SvPVX_const(sv));
9724                         }
9725                         last_off = w - SvPVX(sv);
9726                         if (--brackets <= 0)
9727                             cont = FALSE;
9728                     }
9729                 }
9730             }
9731             if (!keep_delims) {
9732                 SvCUR_set(sv, SvCUR(sv) - 1);
9733                 *SvEND(sv) = '\0';
9734             }
9735             break;
9736         }
9737
9738         /* extend sv if need be */
9739         SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
9740         /* set 'to' to the next character in the sv's string */
9741         to = SvPVX(sv)+SvCUR(sv);
9742
9743         /* if open delimiter is the close delimiter read unbridle */
9744         if (PL_multi_open == PL_multi_close) {
9745             for (; s < PL_bufend; s++,to++) {
9746                 /* embedded newlines increment the current line number */
9747                 if (*s == '\n' && !PL_rsfp && !PL_parser->filtered)
9748                     COPLINE_INC_WITH_HERELINES;
9749                 /* handle quoted delimiters */
9750                 if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
9751                     if (!keep_bracketed_quoted
9752                         && (s[1] == term
9753                             || (re_reparse && s[1] == '\\'))
9754                     )
9755                         s++;
9756                     else /* any other quotes are simply copied straight through */
9757                         *to++ = *s++;
9758                 }
9759                 /* terminate when run out of buffer (the for() condition), or
9760                    have found the terminator */
9761                 else if (*s == term) {
9762                     if (termlen == 1)
9763                         break;
9764                     if (s+termlen <= PL_bufend && memEQ(s, (char*)termstr, termlen))
9765                         break;
9766                 }
9767                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
9768                     has_utf8 = TRUE;
9769                 *to = *s;
9770             }
9771         }
9772         
9773         /* if the terminator isn't the same as the start character (e.g.,
9774            matched brackets), we have to allow more in the quoting, and
9775            be prepared for nested brackets.
9776         */
9777         else {
9778             /* read until we run out of string, or we find the terminator */
9779             for (; s < PL_bufend; s++,to++) {
9780                 /* embedded newlines increment the line count */
9781                 if (*s == '\n' && !PL_rsfp && !PL_parser->filtered)
9782                     COPLINE_INC_WITH_HERELINES;
9783                 /* backslashes can escape the open or closing characters */
9784                 if (*s == '\\' && s+1 < PL_bufend) {
9785                     if (!keep_bracketed_quoted &&
9786                         ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
9787                     {
9788                         s++;
9789                     }
9790                     else
9791                         *to++ = *s++;
9792                 }
9793                 /* allow nested opens and closes */
9794                 else if (*s == PL_multi_close && --brackets <= 0)
9795                     break;
9796                 else if (*s == PL_multi_open)
9797                     brackets++;
9798                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
9799                     has_utf8 = TRUE;
9800                 *to = *s;
9801             }
9802         }
9803         /* terminate the copied string and update the sv's end-of-string */
9804         *to = '\0';
9805         SvCUR_set(sv, to - SvPVX_const(sv));
9806
9807         /*
9808          * this next chunk reads more into the buffer if we're not done yet
9809          */
9810
9811         if (s < PL_bufend)
9812             break;              /* handle case where we are done yet :-) */
9813
9814 #ifndef PERL_STRICT_CR
9815         if (to - SvPVX_const(sv) >= 2) {
9816             if ((to[-2] == '\r' && to[-1] == '\n') ||
9817                 (to[-2] == '\n' && to[-1] == '\r'))
9818             {
9819                 to[-2] = '\n';
9820                 to--;
9821                 SvCUR_set(sv, to - SvPVX_const(sv));
9822             }
9823             else if (to[-1] == '\r')
9824                 to[-1] = '\n';
9825         }
9826         else if (to - SvPVX_const(sv) == 1 && to[-1] == '\r')
9827             to[-1] = '\n';
9828 #endif
9829         
9830      read_more_line:
9831         /* if we're out of file, or a read fails, bail and reset the current
9832            line marker so we can report where the unterminated string began
9833         */
9834         COPLINE_INC_WITH_HERELINES;
9835         PL_bufptr = PL_bufend;
9836         if (!lex_next_chunk(0)) {
9837             sv_free(sv);
9838             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
9839             return NULL;
9840         }
9841         s = PL_bufptr;
9842     }
9843
9844     /* at this point, we have successfully read the delimited string */
9845
9846     if (!PL_encoding || UTF || re_reparse) {
9847
9848         if (keep_delims)
9849             sv_catpvn(sv, s, termlen);
9850         s += termlen;
9851     }
9852     if (has_utf8 || (PL_encoding && !re_reparse))
9853         SvUTF8_on(sv);
9854
9855     PL_multi_end = CopLINE(PL_curcop);
9856     CopLINE_set(PL_curcop, PL_multi_start);
9857     PL_parser->herelines = herelines;
9858
9859     /* if we allocated too much space, give some back */
9860     if (SvCUR(sv) + 5 < SvLEN(sv)) {
9861         SvLEN_set(sv, SvCUR(sv) + 1);
9862         SvPV_renew(sv, SvLEN(sv));
9863     }
9864
9865     /* decide whether this is the first or second quoted string we've read
9866        for this op
9867     */
9868
9869     if (PL_lex_stuff)
9870         PL_sublex_info.repl = sv;
9871     else
9872         PL_lex_stuff = sv;
9873     if (delimp) *delimp = PL_multi_open == PL_multi_close ? s-termlen : s;
9874     return s;
9875 }
9876
9877 /*
9878   scan_num
9879   takes: pointer to position in buffer
9880   returns: pointer to new position in buffer
9881   side-effects: builds ops for the constant in pl_yylval.op
9882
9883   Read a number in any of the formats that Perl accepts:
9884
9885   \d(_?\d)*(\.(\d(_?\d)*)?)?[Ee][\+\-]?(\d(_?\d)*)      12 12.34 12.
9886   \.\d(_?\d)*[Ee][\+\-]?(\d(_?\d)*)                     .34
9887   0b[01](_?[01])*                                       binary integers
9888   0[0-7](_?[0-7])*                                      octal integers
9889   0x[0-9A-Fa-f](_?[0-9A-Fa-f])*                         hexadecimal integers
9890   0x[0-9A-Fa-f](_?[0-9A-Fa-f])*(?:\.\d*)?p[+-]?[0-9]+   hexadecimal floats
9891
9892   Like most scan_ routines, it uses the PL_tokenbuf buffer to hold the
9893   thing it reads.
9894
9895   If it reads a number without a decimal point or an exponent, it will
9896   try converting the number to an integer and see if it can do so
9897   without loss of precision.
9898 */
9899
9900 char *
9901 Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
9902 {
9903     const char *s = start;      /* current position in buffer */
9904     char *d;                    /* destination in temp buffer */
9905     char *e;                    /* end of temp buffer */
9906     NV nv;                              /* number read, as a double */
9907     SV *sv = NULL;                      /* place to put the converted number */
9908     bool floatit;                       /* boolean: int or float? */
9909     const char *lastub = NULL;          /* position of last underbar */
9910     static const char* const number_too_long = "Number too long";
9911     /* Hexadecimal floating point.
9912      *
9913      * In many places (where we have quads and NV is IEEE 754 double)
9914      * we can fit the mantissa bits of a NV into an unsigned quad.
9915      * (Note that UVs might not be quads even when we have quads.)
9916      * This will not work everywhere, though (either no quads, or
9917      * using long doubles), in which case we have to resort to NV,
9918      * which will probably mean horrible loss of precision due to
9919      * multiple fp operations. */
9920     bool hexfp = FALSE;
9921     int total_bits = 0;
9922 #if NVSIZE == 8 && defined(HAS_QUAD) && defined(Uquad_t)
9923 #  define HEXFP_UQUAD
9924     Uquad_t hexfp_uquad = 0;
9925     int hexfp_frac_bits = 0;
9926 #else
9927 #  define HEXFP_NV
9928     NV hexfp_nv = 0.0;
9929 #endif
9930     NV hexfp_mult = 1.0;
9931     UV high_non_zero = 0; /* highest digit */
9932
9933     PERL_ARGS_ASSERT_SCAN_NUM;
9934
9935     /* We use the first character to decide what type of number this is */
9936
9937     switch (*s) {
9938     default:
9939         Perl_croak(aTHX_ "panic: scan_num, *s=%d", *s);
9940
9941     /* if it starts with a 0, it could be an octal number, a decimal in
9942        0.13 disguise, or a hexadecimal number, or a binary number. */
9943     case '0':
9944         {
9945           /* variables:
9946              u          holds the "number so far"
9947              shift      the power of 2 of the base
9948                         (hex == 4, octal == 3, binary == 1)
9949              overflowed was the number more than we can hold?
9950
9951              Shift is used when we add a digit.  It also serves as an "are
9952              we in octal/hex/binary?" indicator to disallow hex characters
9953              when in octal mode.
9954            */
9955             NV n = 0.0;
9956             UV u = 0;
9957             I32 shift;
9958             bool overflowed = FALSE;
9959             bool just_zero  = TRUE;     /* just plain 0 or binary number? */
9960             static const NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
9961             static const char* const bases[5] =
9962               { "", "binary", "", "octal", "hexadecimal" };
9963             static const char* const Bases[5] =
9964               { "", "Binary", "", "Octal", "Hexadecimal" };
9965             static const char* const maxima[5] =
9966               { "",
9967                 "0b11111111111111111111111111111111",
9968                 "",
9969                 "037777777777",
9970                 "0xffffffff" };
9971             const char *base, *Base, *max;
9972
9973             /* check for hex */
9974             if (isALPHA_FOLD_EQ(s[1], 'x')) {
9975                 shift = 4;
9976                 s += 2;
9977                 just_zero = FALSE;
9978             } else if (isALPHA_FOLD_EQ(s[1], 'b')) {
9979                 shift = 1;
9980                 s += 2;
9981                 just_zero = FALSE;
9982             }
9983             /* check for a decimal in disguise */
9984             else if (s[1] == '.' || isALPHA_FOLD_EQ(s[1], 'e'))
9985                 goto decimal;
9986             /* so it must be octal */
9987             else {
9988                 shift = 3;
9989                 s++;
9990             }
9991
9992             if (*s == '_') {
9993                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
9994                                "Misplaced _ in number");
9995                lastub = s++;
9996             }
9997
9998             base = bases[shift];
9999             Base = Bases[shift];
10000             max  = maxima[shift];
10001
10002             /* read the rest of the number */
10003             for (;;) {
10004                 /* x is used in the overflow test,
10005                    b is the digit we're adding on. */
10006                 UV x, b;
10007
10008                 switch (*s) {
10009
10010                 /* if we don't mention it, we're done */
10011                 default:
10012                     goto out;
10013
10014                 /* _ are ignored -- but warned about if consecutive */
10015                 case '_':
10016                     if (lastub && s == lastub + 1)
10017                         Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10018                                        "Misplaced _ in number");
10019                     lastub = s++;
10020                     break;
10021
10022                 /* 8 and 9 are not octal */
10023                 case '8': case '9':
10024                     if (shift == 3)
10025                         yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
10026                     /* FALLTHROUGH */
10027
10028                 /* octal digits */
10029                 case '2': case '3': case '4':
10030                 case '5': case '6': case '7':
10031                     if (shift == 1)
10032                         yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
10033                     /* FALLTHROUGH */
10034
10035                 case '0': case '1':
10036                     b = *s++ & 15;              /* ASCII digit -> value of digit */
10037                     goto digit;
10038
10039                 /* hex digits */
10040                 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
10041                 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
10042                     /* make sure they said 0x */
10043                     if (shift != 4)
10044                         goto out;
10045                     b = (*s++ & 7) + 9;
10046
10047                     /* Prepare to put the digit we have onto the end
10048                        of the number so far.  We check for overflows.
10049                     */
10050
10051                   digit:
10052                     just_zero = FALSE;
10053                     if (!overflowed) {
10054                         x = u << shift; /* make room for the digit */
10055
10056                         total_bits += shift;
10057
10058                         if ((x >> shift) != u
10059                             && !(PL_hints & HINT_NEW_BINARY)) {
10060                             overflowed = TRUE;
10061                             n = (NV) u;
10062                             Perl_ck_warner_d(aTHX_ packWARN(WARN_OVERFLOW),
10063                                              "Integer overflow in %s number",
10064                                              base);
10065                         } else
10066                             u = x | b;          /* add the digit to the end */
10067                     }
10068                     if (overflowed) {
10069                         n *= nvshift[shift];
10070                         /* If an NV has not enough bits in its
10071                          * mantissa to represent an UV this summing of
10072                          * small low-order numbers is a waste of time
10073                          * (because the NV cannot preserve the
10074                          * low-order bits anyway): we could just
10075                          * remember when did we overflow and in the
10076                          * end just multiply n by the right
10077                          * amount. */
10078                         n += (NV) b;
10079                     }
10080
10081                     if (high_non_zero == 0 && b > 0)
10082                         high_non_zero = b;
10083
10084                     /* this could be hexfp, but peek ahead
10085                      * to avoid matching ".." */
10086                     if (UNLIKELY(HEXFP_PEEK(s))) {
10087                         goto out;
10088                     }
10089
10090                     break;
10091                 }
10092             }
10093
10094           /* if we get here, we had success: make a scalar value from
10095              the number.
10096           */
10097           out:
10098
10099             /* final misplaced underbar check */
10100             if (s[-1] == '_') {
10101                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
10102             }
10103
10104             if (UNLIKELY(HEXFP_PEEK(s))) {
10105                 /* Do sloppy (on the underbars) but quick detection
10106                  * (and value construction) for hexfp, the decimal
10107                  * detection will shortly be more thorough with the
10108                  * underbar checks. */
10109                 const char* h = s;
10110 #ifdef HEXFP_UQUAD
10111                 hexfp_uquad = u;
10112 #else /* HEXFP_NV */
10113                 hexfp_nv = u;
10114 #endif
10115                 if (*h == '.') {
10116 #ifdef HEXFP_NV
10117                     NV mult = 1 / 16.0;
10118 #endif
10119                     h++;
10120                     while (isXDIGIT(*h) || *h == '_') {
10121                         if (isXDIGIT(*h)) {
10122                             U8 b = XDIGIT_VALUE(*h);
10123                             total_bits += shift;
10124 #ifdef HEXFP_UQUAD
10125                             hexfp_uquad <<= shift;
10126                             hexfp_uquad |= b;
10127                             hexfp_frac_bits += shift;
10128 #else /* HEXFP_NV */
10129                             hexfp_nv += b * mult;
10130                             mult /= 16.0;
10131 #endif
10132                         }
10133                         h++;
10134                     }
10135                 }
10136
10137                 if (total_bits >= 4) {
10138                     if (high_non_zero < 0x8)
10139                         total_bits--;
10140                     if (high_non_zero < 0x4)
10141                         total_bits--;
10142                     if (high_non_zero < 0x2)
10143                         total_bits--;
10144                 }
10145
10146                 if (total_bits > 0 && (isALPHA_FOLD_EQ(*h, 'p'))) {
10147                     bool negexp = FALSE;
10148                     h++;
10149                     if (*h == '+')
10150                         h++;
10151                     else if (*h == '-') {
10152                         negexp = TRUE;
10153                         h++;
10154                     }
10155                     if (isDIGIT(*h)) {
10156                         I32 hexfp_exp = 0;
10157                         while (isDIGIT(*h) || *h == '_') {
10158                             if (isDIGIT(*h)) {
10159                                 hexfp_exp *= 10;
10160                                 hexfp_exp += *h - '0';
10161 #ifdef NV_MIN_EXP
10162                                 if (negexp &&
10163                                     -hexfp_exp < NV_MIN_EXP - 1) {
10164                                     Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
10165                                                    "Hexadecimal float: exponent underflow");
10166 #endif
10167                                     break;
10168                                 }
10169                                 else {
10170 #ifdef NV_MAX_EXP
10171                                     if (!negexp &&
10172                                         hexfp_exp > NV_MAX_EXP - 1) {
10173                                         Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
10174                                                    "Hexadecimal float: exponent overflow");
10175                                         break;
10176                                     }
10177 #endif
10178                                 }
10179                             }
10180                             h++;
10181                         }
10182                         if (negexp)
10183                             hexfp_exp = -hexfp_exp;
10184 #ifdef HEXFP_UQUAD
10185                         hexfp_exp -= hexfp_frac_bits;
10186 #endif
10187                         hexfp_mult = pow(2.0, hexfp_exp);
10188                         hexfp = TRUE;
10189                         goto decimal;
10190                     }
10191                 }
10192             }
10193
10194             if (overflowed) {
10195                 if (n > 4294967295.0)
10196                     Perl_ck_warner(aTHX_ packWARN(WARN_PORTABLE),
10197                                    "%s number > %s non-portable",
10198                                    Base, max);
10199                 sv = newSVnv(n);
10200             }
10201             else {
10202 #if UVSIZE > 4
10203                 if (u > 0xffffffff)
10204                     Perl_ck_warner(aTHX_ packWARN(WARN_PORTABLE),
10205                                    "%s number > %s non-portable",
10206                                    Base, max);
10207 #endif
10208                 sv = newSVuv(u);
10209             }
10210             if (just_zero && (PL_hints & HINT_NEW_INTEGER))
10211                 sv = new_constant(start, s - start, "integer",
10212                                   sv, NULL, NULL, 0);
10213             else if (PL_hints & HINT_NEW_BINARY)
10214                 sv = new_constant(start, s - start, "binary", sv, NULL, NULL, 0);
10215         }
10216         break;
10217
10218     /*
10219       handle decimal numbers.
10220       we're also sent here when we read a 0 as the first digit
10221     */
10222     case '1': case '2': case '3': case '4': case '5':
10223     case '6': case '7': case '8': case '9': case '.':
10224       decimal:
10225         d = PL_tokenbuf;
10226         e = PL_tokenbuf + sizeof PL_tokenbuf - 6; /* room for various punctuation */
10227         floatit = FALSE;
10228         if (hexfp) {
10229             floatit = TRUE;
10230             *d++ = '0';
10231             *d++ = 'x';
10232             s = start + 2;
10233         }
10234
10235         /* read next group of digits and _ and copy into d */
10236         while (isDIGIT(*s) || *s == '_' ||
10237                UNLIKELY(hexfp && isXDIGIT(*s))) {
10238             /* skip underscores, checking for misplaced ones
10239                if -w is on
10240             */
10241             if (*s == '_') {
10242                 if (lastub && s == lastub + 1)
10243                     Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10244                                    "Misplaced _ in number");
10245                 lastub = s++;
10246             }
10247             else {
10248                 /* check for end of fixed-length buffer */
10249                 if (d >= e)
10250                     Perl_croak(aTHX_ "%s", number_too_long);
10251                 /* if we're ok, copy the character */
10252                 *d++ = *s++;
10253             }
10254         }
10255
10256         /* final misplaced underbar check */
10257         if (lastub && s == lastub + 1) {
10258             Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
10259         }
10260
10261         /* read a decimal portion if there is one.  avoid
10262            3..5 being interpreted as the number 3. followed
10263            by .5
10264         */
10265         if (*s == '.' && s[1] != '.') {
10266             floatit = TRUE;
10267             *d++ = *s++;
10268
10269             if (*s == '_') {
10270                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10271                                "Misplaced _ in number");
10272                 lastub = s;
10273             }
10274
10275             /* copy, ignoring underbars, until we run out of digits.
10276             */
10277             for (; isDIGIT(*s) || *s == '_' ||
10278                      UNLIKELY(hexfp && isXDIGIT(*s));
10279                  s++) {
10280                 /* fixed length buffer check */
10281                 if (d >= e)
10282                     Perl_croak(aTHX_ "%s", number_too_long);
10283                 if (*s == '_') {
10284                    if (lastub && s == lastub + 1)
10285                        Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10286                                       "Misplaced _ in number");
10287                    lastub = s;
10288                 }
10289                 else
10290                     *d++ = *s;
10291             }
10292             /* fractional part ending in underbar? */
10293             if (s[-1] == '_') {
10294                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10295                                "Misplaced _ in number");
10296             }
10297             if (*s == '.' && isDIGIT(s[1])) {
10298                 /* oops, it's really a v-string, but without the "v" */
10299                 s = start;
10300                 goto vstring;
10301             }
10302         }
10303
10304         /* read exponent part, if present */
10305         if ((isALPHA_FOLD_EQ(*s, 'e')
10306               || UNLIKELY(hexfp && isALPHA_FOLD_EQ(*s, 'p')))
10307             && strchr("+-0123456789_", s[1]))
10308         {
10309             floatit = TRUE;
10310
10311             /* regardless of whether user said 3E5 or 3e5, use lower 'e',
10312                ditto for p (hexfloats) */
10313             if ((isALPHA_FOLD_EQ(*s, 'e'))) {
10314                 /* At least some Mach atof()s don't grok 'E' */
10315                 *d++ = 'e';
10316             }
10317             else if (UNLIKELY(hexfp && (isALPHA_FOLD_EQ(*s, 'p')))) {
10318                 *d++ = 'p';
10319             }
10320
10321             s++;
10322
10323
10324             /* stray preinitial _ */
10325             if (*s == '_') {
10326                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10327                                "Misplaced _ in number");
10328                 lastub = s++;
10329             }
10330
10331             /* allow positive or negative exponent */
10332             if (*s == '+' || *s == '-')
10333                 *d++ = *s++;
10334
10335             /* stray initial _ */
10336             if (*s == '_') {
10337                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10338                                "Misplaced _ in number");
10339                 lastub = s++;
10340             }
10341
10342             /* read digits of exponent */
10343             while (isDIGIT(*s) || *s == '_') {
10344                 if (isDIGIT(*s)) {
10345                     if (d >= e)
10346                         Perl_croak(aTHX_ "%s", number_too_long);
10347                     *d++ = *s++;
10348                 }
10349                 else {
10350                    if (((lastub && s == lastub + 1) ||
10351                         (!isDIGIT(s[1]) && s[1] != '_')))
10352                        Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10353                                       "Misplaced _ in number");
10354                    lastub = s++;
10355                 }
10356             }
10357         }
10358
10359
10360         /*
10361            We try to do an integer conversion first if no characters
10362            indicating "float" have been found.
10363          */
10364
10365         if (!floatit) {
10366             UV uv;
10367             const int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
10368
10369             if (flags == IS_NUMBER_IN_UV) {
10370               if (uv <= IV_MAX)
10371                 sv = newSViv(uv); /* Prefer IVs over UVs. */
10372               else
10373                 sv = newSVuv(uv);
10374             } else if (flags == (IS_NUMBER_IN_UV | IS_NUMBER_NEG)) {
10375               if (uv <= (UV) IV_MIN)
10376                 sv = newSViv(-(IV)uv);
10377               else
10378                 floatit = TRUE;
10379             } else
10380               floatit = TRUE;
10381         }
10382         if (floatit) {
10383             STORE_NUMERIC_LOCAL_SET_STANDARD();
10384             /* terminate the string */
10385             *d = '\0';
10386             if (UNLIKELY(hexfp)) {
10387 #  ifdef NV_MANT_DIG
10388                 if (total_bits > NV_MANT_DIG)
10389                     Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
10390                                    "Hexadecimal float: mantissa overflow");
10391 #  endif
10392 #ifdef HEXFP_UQUAD
10393                 nv = hexfp_uquad * hexfp_mult;
10394 #else /* HEXFP_NV */
10395                 nv = hexfp_nv * hexfp_mult;
10396 #endif
10397             } else {
10398                 nv = Atof(PL_tokenbuf);
10399             }
10400             RESTORE_NUMERIC_LOCAL();
10401             sv = newSVnv(nv);
10402         }
10403
10404         if ( floatit
10405              ? (PL_hints & HINT_NEW_FLOAT) : (PL_hints & HINT_NEW_INTEGER) ) {
10406             const char *const key = floatit ? "float" : "integer";
10407             const STRLEN keylen = floatit ? 5 : 7;
10408             sv = S_new_constant(aTHX_ PL_tokenbuf, d - PL_tokenbuf,
10409                                 key, keylen, sv, NULL, NULL, 0);
10410         }
10411         break;
10412
10413     /* if it starts with a v, it could be a v-string */
10414     case 'v':
10415 vstring:
10416                 sv = newSV(5); /* preallocate storage space */
10417                 ENTER_with_name("scan_vstring");
10418                 SAVEFREESV(sv);
10419                 s = scan_vstring(s, PL_bufend, sv);
10420                 SvREFCNT_inc_simple_void_NN(sv);
10421                 LEAVE_with_name("scan_vstring");
10422         break;
10423     }
10424
10425     /* make the op for the constant and return */
10426
10427     if (sv)
10428         lvalp->opval = newSVOP(OP_CONST, 0, sv);
10429     else
10430         lvalp->opval = NULL;
10431
10432     return (char *)s;
10433 }
10434
10435 STATIC char *
10436 S_scan_formline(pTHX_ char *s)
10437 {
10438     char *eol;
10439     char *t;
10440     SV * const stuff = newSVpvs("");
10441     bool needargs = FALSE;
10442     bool eofmt = FALSE;
10443
10444     PERL_ARGS_ASSERT_SCAN_FORMLINE;
10445
10446     while (!needargs) {
10447         if (*s == '.') {
10448             t = s+1;
10449 #ifdef PERL_STRICT_CR
10450             while (SPACE_OR_TAB(*t))
10451                 t++;
10452 #else
10453             while (SPACE_OR_TAB(*t) || *t == '\r')
10454                 t++;
10455 #endif
10456             if (*t == '\n' || t == PL_bufend) {
10457                 eofmt = TRUE;
10458                 break;
10459             }
10460         }
10461         eol = (char *) memchr(s,'\n',PL_bufend-s);
10462         if (!eol++)
10463                 eol = PL_bufend;
10464         if (*s != '#') {
10465             for (t = s; t < eol; t++) {
10466                 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
10467                     needargs = FALSE;
10468                     goto enough;        /* ~~ must be first line in formline */
10469                 }
10470                 if (*t == '@' || *t == '^')
10471                     needargs = TRUE;
10472             }
10473             if (eol > s) {
10474                 sv_catpvn(stuff, s, eol-s);
10475 #ifndef PERL_STRICT_CR
10476                 if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
10477                     char *end = SvPVX(stuff) + SvCUR(stuff);
10478                     end[-2] = '\n';
10479                     end[-1] = '\0';
10480                     SvCUR_set(stuff, SvCUR(stuff) - 1);
10481                 }
10482 #endif
10483             }
10484             else
10485               break;
10486         }
10487         s = (char*)eol;
10488         if ((PL_rsfp || PL_parser->filtered)
10489          && PL_parser->form_lex_state == LEX_NORMAL) {
10490             bool got_some;
10491             PL_bufptr = PL_bufend;
10492             COPLINE_INC_WITH_HERELINES;
10493             got_some = lex_next_chunk(0);
10494             CopLINE_dec(PL_curcop);
10495             s = PL_bufptr;
10496             if (!got_some)
10497                 break;
10498         }
10499         incline(s);
10500     }
10501   enough:
10502     if (!SvCUR(stuff) || needargs)
10503         PL_lex_state = PL_parser->form_lex_state;
10504     if (SvCUR(stuff)) {
10505         PL_expect = XSTATE;
10506         if (needargs) {
10507             const char *s2 = s;
10508             while (*s2 == '\r' || *s2 == ' ' || *s2 == '\t' || *s2 == '\f'
10509                 || *s2 == 013)
10510                 s2++;
10511             if (*s2 == '{') {
10512                 PL_expect = XTERMBLOCK;
10513                 NEXTVAL_NEXTTOKE.ival = 0;
10514                 force_next(DO);
10515             }
10516             NEXTVAL_NEXTTOKE.ival = 0;
10517             force_next(FORMLBRACK);
10518         }
10519         if (!IN_BYTES) {
10520             if (UTF && is_utf8_string((U8*)SvPVX_const(stuff), SvCUR(stuff)))
10521                 SvUTF8_on(stuff);
10522             else if (PL_encoding)
10523                 sv_recode_to_utf8(stuff, PL_encoding);
10524         }
10525         NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0, stuff);
10526         force_next(THING);
10527     }
10528     else {
10529         SvREFCNT_dec(stuff);
10530         if (eofmt)
10531             PL_lex_formbrack = 0;
10532     }
10533     return s;
10534 }
10535
10536 I32
10537 Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
10538 {
10539     const I32 oldsavestack_ix = PL_savestack_ix;
10540     CV* const outsidecv = PL_compcv;
10541
10542     SAVEI32(PL_subline);
10543     save_item(PL_subname);
10544     SAVESPTR(PL_compcv);
10545
10546     PL_compcv = MUTABLE_CV(newSV_type(is_format ? SVt_PVFM : SVt_PVCV));
10547     CvFLAGS(PL_compcv) |= flags;
10548
10549     PL_subline = CopLINE(PL_curcop);
10550     CvPADLIST_set(PL_compcv, pad_new(padnew_SAVE|padnew_SAVESUB));
10551     CvOUTSIDE(PL_compcv) = MUTABLE_CV(SvREFCNT_inc_simple(outsidecv));
10552     CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
10553     if (outsidecv && CvPADLIST(outsidecv))
10554         CvPADLIST(PL_compcv)->xpadl_outid =
10555             PadlistNAMES(CvPADLIST(outsidecv));
10556
10557     return oldsavestack_ix;
10558 }
10559
10560 static int
10561 S_yywarn(pTHX_ const char *const s, U32 flags)
10562 {
10563     PERL_ARGS_ASSERT_YYWARN;
10564
10565     PL_in_eval |= EVAL_WARNONLY;
10566     yyerror_pv(s, flags);
10567     return 0;
10568 }
10569
10570 int
10571 Perl_yyerror(pTHX_ const char *const s)
10572 {
10573     PERL_ARGS_ASSERT_YYERROR;
10574     return yyerror_pvn(s, strlen(s), 0);
10575 }
10576
10577 int
10578 Perl_yyerror_pv(pTHX_ const char *const s, U32 flags)
10579 {
10580     PERL_ARGS_ASSERT_YYERROR_PV;
10581     return yyerror_pvn(s, strlen(s), flags);
10582 }
10583
10584 int
10585 Perl_yyerror_pvn(pTHX_ const char *const s, STRLEN len, U32 flags)
10586 {
10587     const char *context = NULL;
10588     int contlen = -1;
10589     SV *msg;
10590     SV * const where_sv = newSVpvs_flags("", SVs_TEMP);
10591     int yychar  = PL_parser->yychar;
10592
10593     PERL_ARGS_ASSERT_YYERROR_PVN;
10594
10595     if (!yychar || (yychar == ';' && !PL_rsfp))
10596         sv_catpvs(where_sv, "at EOF");
10597     else if (PL_oldoldbufptr && PL_bufptr > PL_oldoldbufptr &&
10598       PL_bufptr - PL_oldoldbufptr < 200 && PL_oldoldbufptr != PL_oldbufptr &&
10599       PL_oldbufptr != PL_bufptr) {
10600         /*
10601                 Only for NetWare:
10602                 The code below is removed for NetWare because it abends/crashes on NetWare
10603                 when the script has error such as not having the closing quotes like:
10604                     if ($var eq "value)
10605                 Checking of white spaces is anyway done in NetWare code.
10606         */
10607 #ifndef NETWARE
10608         while (isSPACE(*PL_oldoldbufptr))
10609             PL_oldoldbufptr++;
10610 #endif
10611         context = PL_oldoldbufptr;
10612         contlen = PL_bufptr - PL_oldoldbufptr;
10613     }
10614     else if (PL_oldbufptr && PL_bufptr > PL_oldbufptr &&
10615       PL_bufptr - PL_oldbufptr < 200 && PL_oldbufptr != PL_bufptr) {
10616         /*
10617                 Only for NetWare:
10618                 The code below is removed for NetWare because it abends/crashes on NetWare
10619                 when the script has error such as not having the closing quotes like:
10620                     if ($var eq "value)
10621                 Checking of white spaces is anyway done in NetWare code.
10622         */
10623 #ifndef NETWARE
10624         while (isSPACE(*PL_oldbufptr))
10625             PL_oldbufptr++;
10626 #endif
10627         context = PL_oldbufptr;
10628         contlen = PL_bufptr - PL_oldbufptr;
10629     }
10630     else if (yychar > 255)
10631         sv_catpvs(where_sv, "next token ???");
10632     else if (yychar == -2) { /* YYEMPTY */
10633         if (PL_lex_state == LEX_NORMAL ||
10634            (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
10635             sv_catpvs(where_sv, "at end of line");
10636         else if (PL_lex_inpat)
10637             sv_catpvs(where_sv, "within pattern");
10638         else
10639             sv_catpvs(where_sv, "within string");
10640     }
10641     else {
10642         sv_catpvs(where_sv, "next char ");
10643         if (yychar < 32)
10644             Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
10645         else if (isPRINT_LC(yychar)) {
10646             const char string = yychar;
10647             sv_catpvn(where_sv, &string, 1);
10648         }
10649         else
10650             Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
10651     }
10652     msg = newSVpvn_flags(s, len, (flags & SVf_UTF8) | SVs_TEMP);
10653     Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
10654         OutCopFILE(PL_curcop),
10655         (IV)(PL_parser->preambling == NOLINE
10656                ? CopLINE(PL_curcop)
10657                : PL_parser->preambling));
10658     if (context)
10659         Perl_sv_catpvf(aTHX_ msg, "near \"%"UTF8f"\"\n",
10660                              UTF8fARG(UTF, contlen, context));
10661     else
10662         Perl_sv_catpvf(aTHX_ msg, "%"SVf"\n", SVfARG(where_sv));
10663     if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
10664         Perl_sv_catpvf(aTHX_ msg,
10665         "  (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
10666                 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
10667         PL_multi_end = 0;
10668     }
10669     if (PL_in_eval & EVAL_WARNONLY) {
10670         PL_in_eval &= ~EVAL_WARNONLY;
10671         Perl_ck_warner_d(aTHX_ packWARN(WARN_SYNTAX), "%"SVf, SVfARG(msg));
10672     }
10673     else
10674         qerror(msg);
10675     if (PL_error_count >= 10) {
10676         SV * errsv;
10677         if (PL_in_eval && ((errsv = ERRSV), SvCUR(errsv)))
10678             Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
10679                        SVfARG(errsv), OutCopFILE(PL_curcop));
10680         else
10681             Perl_croak(aTHX_ "%s has too many errors.\n",
10682             OutCopFILE(PL_curcop));
10683     }
10684     PL_in_my = 0;
10685     PL_in_my_stash = NULL;
10686     return 0;
10687 }
10688
10689 STATIC char*
10690 S_swallow_bom(pTHX_ U8 *s)
10691 {
10692     const STRLEN slen = SvCUR(PL_linestr);
10693
10694     PERL_ARGS_ASSERT_SWALLOW_BOM;
10695
10696     switch (s[0]) {
10697     case 0xFF:
10698         if (s[1] == 0xFE) {
10699             /* UTF-16 little-endian? (or UTF-32LE?) */
10700             if (s[2] == 0 && s[3] == 0)  /* UTF-32 little-endian */
10701                 /* diag_listed_as: Unsupported script encoding %s */
10702                 Perl_croak(aTHX_ "Unsupported script encoding UTF-32LE");
10703 #ifndef PERL_NO_UTF16_FILTER
10704             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (BOM)\n");
10705             s += 2;
10706             if (PL_bufend > (char*)s) {
10707                 s = add_utf16_textfilter(s, TRUE);
10708             }
10709 #else
10710             /* diag_listed_as: Unsupported script encoding %s */
10711             Perl_croak(aTHX_ "Unsupported script encoding UTF-16LE");
10712 #endif
10713         }
10714         break;
10715     case 0xFE:
10716         if (s[1] == 0xFF) {   /* UTF-16 big-endian? */
10717 #ifndef PERL_NO_UTF16_FILTER
10718             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (BOM)\n");
10719             s += 2;
10720             if (PL_bufend > (char *)s) {
10721                 s = add_utf16_textfilter(s, FALSE);
10722             }
10723 #else
10724             /* diag_listed_as: Unsupported script encoding %s */
10725             Perl_croak(aTHX_ "Unsupported script encoding UTF-16BE");
10726 #endif
10727         }
10728         break;
10729     case BOM_UTF8_FIRST_BYTE: {
10730         const STRLEN len = sizeof(BOM_UTF8_TAIL) - 1; /* Exclude trailing NUL */
10731         if (slen > len && memEQ(s+1, BOM_UTF8_TAIL, len)) {
10732             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
10733             s += len + 1;                      /* UTF-8 */
10734         }
10735         break;
10736     }
10737     case 0:
10738         if (slen > 3) {
10739              if (s[1] == 0) {
10740                   if (s[2] == 0xFE && s[3] == 0xFF) {
10741                        /* UTF-32 big-endian */
10742                        /* diag_listed_as: Unsupported script encoding %s */
10743                        Perl_croak(aTHX_ "Unsupported script encoding UTF-32BE");
10744                   }
10745              }
10746              else if (s[2] == 0 && s[3] != 0) {
10747                   /* Leading bytes
10748                    * 00 xx 00 xx
10749                    * are a good indicator of UTF-16BE. */
10750 #ifndef PERL_NO_UTF16_FILTER
10751                   if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (no BOM)\n");
10752                   s = add_utf16_textfilter(s, FALSE);
10753 #else
10754                   /* diag_listed_as: Unsupported script encoding %s */
10755                   Perl_croak(aTHX_ "Unsupported script encoding UTF-16BE");
10756 #endif
10757              }
10758         }
10759         break;
10760
10761     default:
10762          if (slen > 3 && s[1] == 0 && s[2] != 0 && s[3] == 0) {
10763                   /* Leading bytes
10764                    * xx 00 xx 00
10765                    * are a good indicator of UTF-16LE. */
10766 #ifndef PERL_NO_UTF16_FILTER
10767               if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (no BOM)\n");
10768               s = add_utf16_textfilter(s, TRUE);
10769 #else
10770               /* diag_listed_as: Unsupported script encoding %s */
10771               Perl_croak(aTHX_ "Unsupported script encoding UTF-16LE");
10772 #endif
10773          }
10774     }
10775     return (char*)s;
10776 }
10777
10778
10779 #ifndef PERL_NO_UTF16_FILTER
10780 static I32
10781 S_utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
10782 {
10783     SV *const filter = FILTER_DATA(idx);
10784     /* We re-use this each time round, throwing the contents away before we
10785        return.  */
10786     SV *const utf16_buffer = MUTABLE_SV(IoTOP_GV(filter));
10787     SV *const utf8_buffer = filter;
10788     IV status = IoPAGE(filter);
10789     const bool reverse = cBOOL(IoLINES(filter));
10790     I32 retval;
10791
10792     PERL_ARGS_ASSERT_UTF16_TEXTFILTER;
10793
10794     /* As we're automatically added, at the lowest level, and hence only called
10795        from this file, we can be sure that we're not called in block mode. Hence
10796        don't bother writing code to deal with block mode.  */
10797     if (maxlen) {
10798         Perl_croak(aTHX_ "panic: utf16_textfilter called in block mode (for %d characters)", maxlen);
10799     }
10800     if (status < 0) {
10801         Perl_croak(aTHX_ "panic: utf16_textfilter called after error (status=%"IVdf")", status);
10802     }
10803     DEBUG_P(PerlIO_printf(Perl_debug_log,
10804                           "utf16_textfilter(%p,%ce): idx=%d maxlen=%d status=%"IVdf" utf16=%"UVuf" utf8=%"UVuf"\n",
10805                           FPTR2DPTR(void *, S_utf16_textfilter),
10806                           reverse ? 'l' : 'b', idx, maxlen, status,
10807                           (UV)SvCUR(utf16_buffer), (UV)SvCUR(utf8_buffer)));
10808
10809     while (1) {
10810         STRLEN chars;
10811         STRLEN have;
10812         I32 newlen;
10813         U8 *end;
10814         /* First, look in our buffer of existing UTF-8 data:  */
10815         char *nl = (char *)memchr(SvPVX(utf8_buffer), '\n', SvCUR(utf8_buffer));
10816
10817         if (nl) {
10818             ++nl;
10819         } else if (status == 0) {
10820             /* EOF */
10821             IoPAGE(filter) = 0;
10822             nl = SvEND(utf8_buffer);
10823         }
10824         if (nl) {
10825             STRLEN got = nl - SvPVX(utf8_buffer);
10826             /* Did we have anything to append?  */
10827             retval = got != 0;
10828             sv_catpvn(sv, SvPVX(utf8_buffer), got);
10829             /* Everything else in this code works just fine if SVp_POK isn't
10830                set.  This, however, needs it, and we need it to work, else
10831                we loop infinitely because the buffer is never consumed.  */
10832             sv_chop(utf8_buffer, nl);
10833             break;
10834         }
10835
10836         /* OK, not a complete line there, so need to read some more UTF-16.
10837            Read an extra octect if the buffer currently has an odd number. */
10838         while (1) {
10839             if (status <= 0)
10840                 break;
10841             if (SvCUR(utf16_buffer) >= 2) {
10842                 /* Location of the high octet of the last complete code point.
10843                    Gosh, UTF-16 is a pain. All the benefits of variable length,
10844                    *coupled* with all the benefits of partial reads and
10845                    endianness.  */
10846                 const U8 *const last_hi = (U8*)SvPVX(utf16_buffer)
10847                     + ((SvCUR(utf16_buffer) & ~1) - (reverse ? 1 : 2));
10848
10849                 if (*last_hi < 0xd8 || *last_hi > 0xdb) {
10850                     break;
10851                 }
10852
10853                 /* We have the first half of a surrogate. Read more.  */
10854                 DEBUG_P(PerlIO_printf(Perl_debug_log, "utf16_textfilter partial surrogate detected at %p\n", last_hi));
10855             }
10856
10857             status = FILTER_READ(idx + 1, utf16_buffer,
10858                                  160 + (SvCUR(utf16_buffer) & 1));
10859             DEBUG_P(PerlIO_printf(Perl_debug_log, "utf16_textfilter status=%"IVdf" SvCUR(sv)=%"UVuf"\n", status, (UV)SvCUR(utf16_buffer)));
10860             DEBUG_P({ sv_dump(utf16_buffer); sv_dump(utf8_buffer);});
10861             if (status < 0) {
10862                 /* Error */
10863                 IoPAGE(filter) = status;
10864                 return status;
10865             }
10866         }
10867
10868         chars = SvCUR(utf16_buffer) >> 1;
10869         have = SvCUR(utf8_buffer);
10870         SvGROW(utf8_buffer, have + chars * 3 + 1);
10871
10872         if (reverse) {
10873             end = utf16_to_utf8_reversed((U8*)SvPVX(utf16_buffer),
10874                                          (U8*)SvPVX_const(utf8_buffer) + have,
10875                                          chars * 2, &newlen);
10876         } else {
10877             end = utf16_to_utf8((U8*)SvPVX(utf16_buffer),
10878                                 (U8*)SvPVX_const(utf8_buffer) + have,
10879                                 chars * 2, &newlen);
10880         }
10881         SvCUR_set(utf8_buffer, have + newlen);
10882         *end = '\0';
10883
10884         /* No need to keep this SV "well-formed" with a '\0' after the end, as
10885            it's private to us, and utf16_to_utf8{,reversed} take a
10886            (pointer,length) pair, rather than a NUL-terminated string.  */
10887         if(SvCUR(utf16_buffer) & 1) {
10888             *SvPVX(utf16_buffer) = SvEND(utf16_buffer)[-1];
10889             SvCUR_set(utf16_buffer, 1);
10890         } else {
10891             SvCUR_set(utf16_buffer, 0);
10892         }
10893     }
10894     DEBUG_P(PerlIO_printf(Perl_debug_log,
10895                           "utf16_textfilter: returns, status=%"IVdf" utf16=%"UVuf" utf8=%"UVuf"\n",
10896                           status,
10897                           (UV)SvCUR(utf16_buffer), (UV)SvCUR(utf8_buffer)));
10898     DEBUG_P({ sv_dump(utf8_buffer); sv_dump(sv);});
10899     return retval;
10900 }
10901
10902 static U8 *
10903 S_add_utf16_textfilter(pTHX_ U8 *const s, bool reversed)
10904 {
10905     SV *filter = filter_add(S_utf16_textfilter, NULL);
10906
10907     PERL_ARGS_ASSERT_ADD_UTF16_TEXTFILTER;
10908
10909     IoTOP_GV(filter) = MUTABLE_GV(newSVpvn((char *)s, PL_bufend - (char*)s));
10910     sv_setpvs(filter, "");
10911     IoLINES(filter) = reversed;
10912     IoPAGE(filter) = 1; /* Not EOF */
10913
10914     /* Sadly, we have to return a valid pointer, come what may, so we have to
10915        ignore any error return from this.  */
10916     SvCUR_set(PL_linestr, 0);
10917     if (FILTER_READ(0, PL_linestr, 0)) {
10918         SvUTF8_on(PL_linestr);
10919     } else {
10920         SvUTF8_on(PL_linestr);
10921     }
10922     PL_bufend = SvEND(PL_linestr);
10923     return (U8*)SvPVX(PL_linestr);
10924 }
10925 #endif
10926
10927 /*
10928 Returns a pointer to the next character after the parsed
10929 vstring, as well as updating the passed in sv.
10930
10931 Function must be called like
10932
10933         sv = sv_2mortal(newSV(5));
10934         s = scan_vstring(s,e,sv);
10935
10936 where s and e are the start and end of the string.
10937 The sv should already be large enough to store the vstring
10938 passed in, for performance reasons.
10939
10940 This function may croak if fatal warnings are enabled in the
10941 calling scope, hence the sv_2mortal in the example (to prevent
10942 a leak).  Make sure to do SvREFCNT_inc afterwards if you use
10943 sv_2mortal.
10944
10945 */
10946
10947 char *
10948 Perl_scan_vstring(pTHX_ const char *s, const char *const e, SV *sv)
10949 {
10950     const char *pos = s;
10951     const char *start = s;
10952
10953     PERL_ARGS_ASSERT_SCAN_VSTRING;
10954
10955     if (*pos == 'v') pos++;  /* get past 'v' */
10956     while (pos < e && (isDIGIT(*pos) || *pos == '_'))
10957         pos++;
10958     if ( *pos != '.') {
10959         /* this may not be a v-string if followed by => */
10960         const char *next = pos;
10961         while (next < e && isSPACE(*next))
10962             ++next;
10963         if ((e - next) >= 2 && *next == '=' && next[1] == '>' ) {
10964             /* return string not v-string */
10965             sv_setpvn(sv,(char *)s,pos-s);
10966             return (char *)pos;
10967         }
10968     }
10969
10970     if (!isALPHA(*pos)) {
10971         U8 tmpbuf[UTF8_MAXBYTES+1];
10972
10973         if (*s == 'v')
10974             s++;  /* get past 'v' */
10975
10976         sv_setpvs(sv, "");
10977
10978         for (;;) {
10979             /* this is atoi() that tolerates underscores */
10980             U8 *tmpend;
10981             UV rev = 0;
10982             const char *end = pos;
10983             UV mult = 1;
10984             while (--end >= s) {
10985                 if (*end != '_') {
10986                     const UV orev = rev;
10987                     rev += (*end - '0') * mult;
10988                     mult *= 10;
10989                     if (orev > rev)
10990                         /* diag_listed_as: Integer overflow in %s number */
10991                         Perl_ck_warner_d(aTHX_ packWARN(WARN_OVERFLOW),
10992                                          "Integer overflow in decimal number");
10993                 }
10994             }
10995 #ifdef EBCDIC
10996             if (rev > 0x7FFFFFFF)
10997                  Perl_croak(aTHX_ "In EBCDIC the v-string components cannot exceed 2147483647");
10998 #endif
10999             /* Append native character for the rev point */
11000             tmpend = uvchr_to_utf8(tmpbuf, rev);
11001             sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
11002             if (!UVCHR_IS_INVARIANT(rev))
11003                  SvUTF8_on(sv);
11004             if (pos + 1 < e && *pos == '.' && isDIGIT(pos[1]))
11005                  s = ++pos;
11006             else {
11007                  s = pos;
11008                  break;
11009             }
11010             while (pos < e && (isDIGIT(*pos) || *pos == '_'))
11011                  pos++;
11012         }
11013         SvPOK_on(sv);
11014         sv_magic(sv,NULL,PERL_MAGIC_vstring,(const char*)start, pos-start);
11015         SvRMAGICAL_on(sv);
11016     }
11017     return (char *)s;
11018 }
11019
11020 int
11021 Perl_keyword_plugin_standard(pTHX_
11022         char *keyword_ptr, STRLEN keyword_len, OP **op_ptr)
11023 {
11024     PERL_ARGS_ASSERT_KEYWORD_PLUGIN_STANDARD;
11025     PERL_UNUSED_CONTEXT;
11026     PERL_UNUSED_ARG(keyword_ptr);
11027     PERL_UNUSED_ARG(keyword_len);
11028     PERL_UNUSED_ARG(op_ptr);
11029     return KEYWORD_PLUGIN_DECLINE;
11030 }
11031
11032 #define parse_recdescent(g,p) S_parse_recdescent(aTHX_ g,p)
11033 static void
11034 S_parse_recdescent(pTHX_ int gramtype, I32 fakeeof)
11035 {
11036     SAVEI32(PL_lex_brackets);
11037     if (PL_lex_brackets > 100)
11038         Renew(PL_lex_brackstack, PL_lex_brackets + 10, char);
11039     PL_lex_brackstack[PL_lex_brackets++] = XFAKEEOF;
11040     SAVEI32(PL_lex_allbrackets);
11041     PL_lex_allbrackets = 0;
11042     SAVEI8(PL_lex_fakeeof);
11043     PL_lex_fakeeof = (U8)fakeeof;
11044     if(yyparse(gramtype) && !PL_parser->error_count)
11045         qerror(Perl_mess(aTHX_ "Parse error"));
11046 }
11047
11048 #define parse_recdescent_for_op(g,p) S_parse_recdescent_for_op(aTHX_ g,p)
11049 static OP *
11050 S_parse_recdescent_for_op(pTHX_ int gramtype, I32 fakeeof)
11051 {
11052     OP *o;
11053     ENTER;
11054     SAVEVPTR(PL_eval_root);
11055     PL_eval_root = NULL;
11056     parse_recdescent(gramtype, fakeeof);
11057     o = PL_eval_root;
11058     LEAVE;
11059     return o;
11060 }
11061
11062 #define parse_expr(p,f) S_parse_expr(aTHX_ p,f)
11063 static OP *
11064 S_parse_expr(pTHX_ I32 fakeeof, U32 flags)
11065 {
11066     OP *exprop;
11067     if (flags & ~PARSE_OPTIONAL)
11068         Perl_croak(aTHX_ "Parsing code internal error (%s)", "parse_expr");
11069     exprop = parse_recdescent_for_op(GRAMEXPR, fakeeof);
11070     if (!exprop && !(flags & PARSE_OPTIONAL)) {
11071         if (!PL_parser->error_count)
11072             qerror(Perl_mess(aTHX_ "Parse error"));
11073         exprop = newOP(OP_NULL, 0);
11074     }
11075     return exprop;
11076 }
11077
11078 /*
11079 =for apidoc Amx|OP *|parse_arithexpr|U32 flags
11080
11081 Parse a Perl arithmetic expression.  This may contain operators of precedence
11082 down to the bit shift operators.  The expression must be followed (and thus
11083 terminated) either by a comparison or lower-precedence operator or by
11084 something that would normally terminate an expression such as semicolon.
11085 If I<flags> includes C<PARSE_OPTIONAL> then the expression is optional,
11086 otherwise it is mandatory.  It is up to the caller to ensure that the
11087 dynamic parser state (L</PL_parser> et al) is correctly set to reflect
11088 the source of the code to be parsed and the lexical context for the
11089 expression.
11090
11091 The op tree representing the expression is returned.  If an optional
11092 expression is absent, a null pointer is returned, otherwise the pointer
11093 will be non-null.
11094
11095 If an error occurs in parsing or compilation, in most cases a valid op
11096 tree is returned anyway.  The error is reflected in the parser state,
11097 normally resulting in a single exception at the top level of parsing
11098 which covers all the compilation errors that occurred.  Some compilation
11099 errors, however, will throw an exception immediately.
11100
11101 =cut
11102 */
11103
11104 OP *
11105 Perl_parse_arithexpr(pTHX_ U32 flags)
11106 {
11107     return parse_expr(LEX_FAKEEOF_COMPARE, flags);
11108 }
11109
11110 /*
11111 =for apidoc Amx|OP *|parse_termexpr|U32 flags
11112
11113 Parse a Perl term expression.  This may contain operators of precedence
11114 down to the assignment operators.  The expression must be followed (and thus
11115 terminated) either by a comma or lower-precedence operator or by
11116 something that would normally terminate an expression such as semicolon.
11117 If I<flags> includes C<PARSE_OPTIONAL> then the expression is optional,
11118 otherwise it is mandatory.  It is up to the caller to ensure that the
11119 dynamic parser state (L</PL_parser> et al) is correctly set to reflect
11120 the source of the code to be parsed and the lexical context for the
11121 expression.
11122
11123 The op tree representing the expression is returned.  If an optional
11124 expression is absent, a null pointer is returned, otherwise the pointer
11125 will be non-null.
11126
11127 If an error occurs in parsing or compilation, in most cases a valid op
11128 tree is returned anyway.  The error is reflected in the parser state,
11129 normally resulting in a single exception at the top level of parsing
11130 which covers all the compilation errors that occurred.  Some compilation
11131 errors, however, will throw an exception immediately.
11132
11133 =cut
11134 */
11135
11136 OP *
11137 Perl_parse_termexpr(pTHX_ U32 flags)
11138 {
11139     return parse_expr(LEX_FAKEEOF_COMMA, flags);
11140 }
11141
11142 /*
11143 =for apidoc Amx|OP *|parse_listexpr|U32 flags
11144
11145 Parse a Perl list expression.  This may contain operators of precedence
11146 down to the comma operator.  The expression must be followed (and thus
11147 terminated) either by a low-precedence logic operator such as C<or> or by
11148 something that would normally terminate an expression such as semicolon.
11149 If I<flags> includes C<PARSE_OPTIONAL> then the expression is optional,
11150 otherwise it is mandatory.  It is up to the caller to ensure that the
11151 dynamic parser state (L</PL_parser> et al) is correctly set to reflect
11152 the source of the code to be parsed and the lexical context for the
11153 expression.
11154
11155 The op tree representing the expression is returned.  If an optional
11156 expression is absent, a null pointer is returned, otherwise the pointer
11157 will be non-null.
11158
11159 If an error occurs in parsing or compilation, in most cases a valid op
11160 tree is returned anyway.  The error is reflected in the parser state,
11161 normally resulting in a single exception at the top level of parsing
11162 which covers all the compilation errors that occurred.  Some compilation
11163 errors, however, will throw an exception immediately.
11164
11165 =cut
11166 */
11167
11168 OP *
11169 Perl_parse_listexpr(pTHX_ U32 flags)
11170 {
11171     return parse_expr(LEX_FAKEEOF_LOWLOGIC, flags);
11172 }
11173
11174 /*
11175 =for apidoc Amx|OP *|parse_fullexpr|U32 flags
11176
11177 Parse a single complete Perl expression.  This allows the full
11178 expression grammar, including the lowest-precedence operators such
11179 as C<or>.  The expression must be followed (and thus terminated) by a
11180 token that an expression would normally be terminated by: end-of-file,
11181 closing bracketing punctuation, semicolon, or one of the keywords that
11182 signals a postfix expression-statement modifier.  If I<flags> includes
11183 C<PARSE_OPTIONAL> then the expression is optional, otherwise it is
11184 mandatory.  It is up to the caller to ensure that the dynamic parser
11185 state (L</PL_parser> et al) is correctly set to reflect the source of
11186 the code to be parsed and the lexical context for the expression.
11187
11188 The op tree representing the expression is returned.  If an optional
11189 expression is absent, a null pointer is returned, otherwise the pointer
11190 will be non-null.
11191
11192 If an error occurs in parsing or compilation, in most cases a valid op
11193 tree is returned anyway.  The error is reflected in the parser state,
11194 normally resulting in a single exception at the top level of parsing
11195 which covers all the compilation errors that occurred.  Some compilation
11196 errors, however, will throw an exception immediately.
11197
11198 =cut
11199 */
11200
11201 OP *
11202 Perl_parse_fullexpr(pTHX_ U32 flags)
11203 {
11204     return parse_expr(LEX_FAKEEOF_NONEXPR, flags);
11205 }
11206
11207 /*
11208 =for apidoc Amx|OP *|parse_block|U32 flags
11209
11210 Parse a single complete Perl code block.  This consists of an opening
11211 brace, a sequence of statements, and a closing brace.  The block
11212 constitutes a lexical scope, so C<my> variables and various compile-time
11213 effects can be contained within it.  It is up to the caller to ensure
11214 that the dynamic parser state (L</PL_parser> et al) is correctly set to
11215 reflect the source of the code to be parsed and the lexical context for
11216 the statement.
11217
11218 The op tree representing the code block is returned.  This is always a
11219 real op, never a null pointer.  It will normally be a C<lineseq> list,
11220 including C<nextstate> or equivalent ops.  No ops to construct any kind
11221 of runtime scope are included by virtue of it being a block.
11222
11223 If an error occurs in parsing or compilation, in most cases a valid op
11224 tree (most likely null) is returned anyway.  The error is reflected in
11225 the parser state, normally resulting in a single exception at the top
11226 level of parsing which covers all the compilation errors that occurred.
11227 Some compilation errors, however, will throw an exception immediately.
11228
11229 The I<flags> parameter is reserved for future use, and must always
11230 be zero.
11231
11232 =cut
11233 */
11234
11235 OP *
11236 Perl_parse_block(pTHX_ U32 flags)
11237 {
11238     if (flags)
11239         Perl_croak(aTHX_ "Parsing code internal error (%s)", "parse_block");
11240     return parse_recdescent_for_op(GRAMBLOCK, LEX_FAKEEOF_NEVER);
11241 }
11242
11243 /*
11244 =for apidoc Amx|OP *|parse_barestmt|U32 flags
11245
11246 Parse a single unadorned Perl statement.  This may be a normal imperative
11247 statement or a declaration that has compile-time effect.  It does not
11248 include any label or other affixture.  It is up to the caller to ensure
11249 that the dynamic parser state (L</PL_parser> et al) is correctly set to
11250 reflect the source of the code to be parsed and the lexical context for
11251 the statement.
11252
11253 The op tree representing the statement is returned.  This may be a
11254 null pointer if the statement is null, for example if it was actually
11255 a subroutine definition (which has compile-time side effects).  If not
11256 null, it will be ops directly implementing the statement, suitable to
11257 pass to L</newSTATEOP>.  It will not normally include a C<nextstate> or
11258 equivalent op (except for those embedded in a scope contained entirely
11259 within the statement).
11260
11261 If an error occurs in parsing or compilation, in most cases a valid op
11262 tree (most likely null) is returned anyway.  The error is reflected in
11263 the parser state, normally resulting in a single exception at the top
11264 level of parsing which covers all the compilation errors that occurred.
11265 Some compilation errors, however, will throw an exception immediately.
11266
11267 The I<flags> parameter is reserved for future use, and must always
11268 be zero.
11269
11270 =cut
11271 */
11272
11273 OP *
11274 Perl_parse_barestmt(pTHX_ U32 flags)
11275 {
11276     if (flags)
11277         Perl_croak(aTHX_ "Parsing code internal error (%s)", "parse_barestmt");
11278     return parse_recdescent_for_op(GRAMBARESTMT, LEX_FAKEEOF_NEVER);
11279 }
11280
11281 /*
11282 =for apidoc Amx|SV *|parse_label|U32 flags
11283
11284 Parse a single label, possibly optional, of the type that may prefix a
11285 Perl statement.  It is up to the caller to ensure that the dynamic parser
11286 state (L</PL_parser> et al) is correctly set to reflect the source of
11287 the code to be parsed.  If I<flags> includes C<PARSE_OPTIONAL> then the
11288 label is optional, otherwise it is mandatory.
11289
11290 The name of the label is returned in the form of a fresh scalar.  If an
11291 optional label is absent, a null pointer is returned.
11292
11293 If an error occurs in parsing, which can only occur if the label is
11294 mandatory, a valid label is returned anyway.  The error is reflected in
11295 the parser state, normally resulting in a single exception at the top
11296 level of parsing which covers all the compilation errors that occurred.
11297
11298 =cut
11299 */
11300
11301 SV *
11302 Perl_parse_label(pTHX_ U32 flags)
11303 {
11304     if (flags & ~PARSE_OPTIONAL)
11305         Perl_croak(aTHX_ "Parsing code internal error (%s)", "parse_label");
11306     if (PL_lex_state == LEX_KNOWNEXT) {
11307         PL_parser->yychar = yylex();
11308         if (PL_parser->yychar == LABEL) {
11309             char * const lpv = pl_yylval.pval;
11310             STRLEN llen = strlen(lpv);
11311             PL_parser->yychar = YYEMPTY;
11312             return newSVpvn_flags(lpv, llen, lpv[llen+1] ? SVf_UTF8 : 0);
11313         } else {
11314             yyunlex();
11315             goto no_label;
11316         }
11317     } else {
11318         char *s, *t;
11319         STRLEN wlen, bufptr_pos;
11320         lex_read_space(0);
11321         t = s = PL_bufptr;
11322         if (!isIDFIRST_lazy_if(s, UTF))
11323             goto no_label;
11324         t = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &wlen);
11325         if (word_takes_any_delimeter(s, wlen))
11326             goto no_label;
11327         bufptr_pos = s - SvPVX(PL_linestr);
11328         PL_bufptr = t;
11329         lex_read_space(LEX_KEEP_PREVIOUS);
11330         t = PL_bufptr;
11331         s = SvPVX(PL_linestr) + bufptr_pos;
11332         if (t[0] == ':' && t[1] != ':') {
11333             PL_oldoldbufptr = PL_oldbufptr;
11334             PL_oldbufptr = s;
11335             PL_bufptr = t+1;
11336             return newSVpvn_flags(s, wlen, UTF ? SVf_UTF8 : 0);
11337         } else {
11338             PL_bufptr = s;
11339             no_label:
11340             if (flags & PARSE_OPTIONAL) {
11341                 return NULL;
11342             } else {
11343                 qerror(Perl_mess(aTHX_ "Parse error"));
11344                 return newSVpvs("x");
11345             }
11346         }
11347     }
11348 }
11349
11350 /*
11351 =for apidoc Amx|OP *|parse_fullstmt|U32 flags
11352
11353 Parse a single complete Perl statement.  This may be a normal imperative
11354 statement or a declaration that has compile-time effect, and may include
11355 optional labels.  It is up to the caller to ensure that the dynamic
11356 parser state (L</PL_parser> et al) is correctly set to reflect the source
11357 of the code to be parsed and the lexical context for the statement.
11358
11359 The op tree representing the statement is returned.  This may be a
11360 null pointer if the statement is null, for example if it was actually
11361 a subroutine definition (which has compile-time side effects).  If not
11362 null, it will be the result of a L</newSTATEOP> call, normally including
11363 a C<nextstate> or equivalent op.
11364
11365 If an error occurs in parsing or compilation, in most cases a valid op
11366 tree (most likely null) is returned anyway.  The error is reflected in
11367 the parser state, normally resulting in a single exception at the top
11368 level of parsing which covers all the compilation errors that occurred.
11369 Some compilation errors, however, will throw an exception immediately.
11370
11371 The I<flags> parameter is reserved for future use, and must always
11372 be zero.
11373
11374 =cut
11375 */
11376
11377 OP *
11378 Perl_parse_fullstmt(pTHX_ U32 flags)
11379 {
11380     if (flags)
11381         Perl_croak(aTHX_ "Parsing code internal error (%s)", "parse_fullstmt");
11382     return parse_recdescent_for_op(GRAMFULLSTMT, LEX_FAKEEOF_NEVER);
11383 }
11384
11385 /*
11386 =for apidoc Amx|OP *|parse_stmtseq|U32 flags
11387
11388 Parse a sequence of zero or more Perl statements.  These may be normal
11389 imperative statements, including optional labels, or declarations
11390 that have compile-time effect, or any mixture thereof.  The statement
11391 sequence ends when a closing brace or end-of-file is encountered in a
11392 place where a new statement could have validly started.  It is up to
11393 the caller to ensure that the dynamic parser state (L</PL_parser> et al)
11394 is correctly set to reflect the source of the code to be parsed and the
11395 lexical context for the statements.
11396
11397 The op tree representing the statement sequence is returned.  This may
11398 be a null pointer if the statements were all null, for example if there
11399 were no statements or if there were only subroutine definitions (which
11400 have compile-time side effects).  If not null, it will be a C<lineseq>
11401 list, normally including C<nextstate> or equivalent ops.
11402
11403 If an error occurs in parsing or compilation, in most cases a valid op
11404 tree is returned anyway.  The error is reflected in the parser state,
11405 normally resulting in a single exception at the top level of parsing
11406 which covers all the compilation errors that occurred.  Some compilation
11407 errors, however, will throw an exception immediately.
11408
11409 The I<flags> parameter is reserved for future use, and must always
11410 be zero.
11411
11412 =cut
11413 */
11414
11415 OP *
11416 Perl_parse_stmtseq(pTHX_ U32 flags)
11417 {
11418     OP *stmtseqop;
11419     I32 c;
11420     if (flags)
11421         Perl_croak(aTHX_ "Parsing code internal error (%s)", "parse_stmtseq");
11422     stmtseqop = parse_recdescent_for_op(GRAMSTMTSEQ, LEX_FAKEEOF_CLOSING);
11423     c = lex_peek_unichar(0);
11424     if (c != -1 && c != /*{*/'}')
11425         qerror(Perl_mess(aTHX_ "Parse error"));
11426     return stmtseqop;
11427 }
11428
11429 #define lex_token_boundary() S_lex_token_boundary(aTHX)
11430 static void
11431 S_lex_token_boundary(pTHX)
11432 {
11433     PL_oldoldbufptr = PL_oldbufptr;
11434     PL_oldbufptr = PL_bufptr;
11435 }
11436
11437 #define parse_opt_lexvar() S_parse_opt_lexvar(aTHX)
11438 static OP *
11439 S_parse_opt_lexvar(pTHX)
11440 {
11441     I32 sigil, c;
11442     char *s, *d;
11443     OP *var;
11444     lex_token_boundary();
11445     sigil = lex_read_unichar(0);
11446     if (lex_peek_unichar(0) == '#') {
11447         qerror(Perl_mess(aTHX_ "Parse error"));
11448         return NULL;
11449     }
11450     lex_read_space(0);
11451     c = lex_peek_unichar(0);
11452     if (c == -1 || !(UTF ? isIDFIRST_uni(c) : isIDFIRST_A(c)))
11453         return NULL;
11454     s = PL_bufptr;
11455     d = PL_tokenbuf + 1;
11456     PL_tokenbuf[0] = (char)sigil;
11457     parse_ident(&s, &d, PL_tokenbuf + sizeof(PL_tokenbuf) - 1, 0, cBOOL(UTF));
11458     PL_bufptr = s;
11459     if (d == PL_tokenbuf+1)
11460         return NULL;
11461     var = newOP(sigil == '$' ? OP_PADSV : sigil == '@' ? OP_PADAV : OP_PADHV,
11462                 OPf_MOD | (OPpLVAL_INTRO<<8));
11463     var->op_targ = allocmy(PL_tokenbuf, d - PL_tokenbuf, UTF ? SVf_UTF8 : 0);
11464     return var;
11465 }
11466
11467 OP *
11468 Perl_parse_subsignature(pTHX)
11469 {
11470     I32 c;
11471     int prev_type = 0, pos = 0, min_arity = 0, max_arity = 0;
11472     OP *initops = NULL;
11473     lex_read_space(0);
11474     c = lex_peek_unichar(0);
11475     while (c != /*(*/')') {
11476         switch (c) {
11477             case '$': {
11478                 OP *var, *expr;
11479                 if (prev_type == 2)
11480                     qerror(Perl_mess(aTHX_ "Slurpy parameter not last"));
11481                 var = parse_opt_lexvar();
11482                 expr = var ?
11483                     newBINOP(OP_AELEM, 0,
11484                         ref(newUNOP(OP_RV2AV, 0, newGVOP(OP_GV, 0, PL_defgv)),
11485                             OP_RV2AV),
11486                         newSVOP(OP_CONST, 0, newSViv(pos))) :
11487                     NULL;
11488                 lex_read_space(0);
11489                 c = lex_peek_unichar(0);
11490                 if (c == '=') {
11491                     lex_token_boundary();
11492                     lex_read_unichar(0);
11493                     lex_read_space(0);
11494                     c = lex_peek_unichar(0);
11495                     if (c == ',' || c == /*(*/')') {
11496                         if (var)
11497                             qerror(Perl_mess(aTHX_ "Optional parameter "
11498                                     "lacks default expression"));
11499                     } else {
11500                         OP *defexpr = parse_termexpr(0);
11501                         if (defexpr->op_type == OP_UNDEF &&
11502                                 !(defexpr->op_flags & OPf_KIDS)) {
11503                             op_free(defexpr);
11504                         } else {
11505                             OP *ifop = 
11506                                 newBINOP(OP_GE, 0,
11507                                     scalar(newUNOP(OP_RV2AV, 0,
11508                                             newGVOP(OP_GV, 0, PL_defgv))),
11509                                     newSVOP(OP_CONST, 0, newSViv(pos+1)));
11510                             expr = var ?
11511                                 newCONDOP(0, ifop, expr, defexpr) :
11512                                 newLOGOP(OP_OR, 0, ifop, defexpr);
11513                         }
11514                     }
11515                     prev_type = 1;
11516                 } else {
11517                     if (prev_type == 1)
11518                         qerror(Perl_mess(aTHX_ "Mandatory parameter "
11519                                 "follows optional parameter"));
11520                     prev_type = 0;
11521                     min_arity = pos + 1;
11522                 }
11523                 if (var) expr = newASSIGNOP(OPf_STACKED, var, 0, expr);
11524                 if (expr)
11525                     initops = op_append_list(OP_LINESEQ, initops,
11526                                 newSTATEOP(0, NULL, expr));
11527                 max_arity = ++pos;
11528             } break;
11529             case '@':
11530             case '%': {
11531                 OP *var;
11532                 if (prev_type == 2)
11533                     qerror(Perl_mess(aTHX_ "Slurpy parameter not last"));
11534                 var = parse_opt_lexvar();
11535                 if (c == '%') {
11536                     OP *chkop = newLOGOP((pos & 1) ? OP_OR : OP_AND, 0,
11537                             newBINOP(OP_BIT_AND, 0,
11538                                 scalar(newUNOP(OP_RV2AV, 0,
11539                                     newGVOP(OP_GV, 0, PL_defgv))),
11540                                 newSVOP(OP_CONST, 0, newSViv(1))),
11541                             op_convert_list(OP_DIE, 0,
11542                                 op_convert_list(OP_SPRINTF, 0,
11543                                     op_append_list(OP_LIST,
11544                                         newSVOP(OP_CONST, 0,
11545                                             newSVpvs("Odd name/value argument for subroutine at %s line %d.\n")),
11546                                         newSLICEOP(0,
11547                                             op_append_list(OP_LIST,
11548                                                 newSVOP(OP_CONST, 0, newSViv(1)),
11549                                                 newSVOP(OP_CONST, 0, newSViv(2))),
11550                                             newOP(OP_CALLER, 0))))));
11551                     if (pos != min_arity)
11552                         chkop = newLOGOP(OP_AND, 0,
11553                                     newBINOP(OP_GT, 0,
11554                                         scalar(newUNOP(OP_RV2AV, 0,
11555                                             newGVOP(OP_GV, 0, PL_defgv))),
11556                                         newSVOP(OP_CONST, 0, newSViv(pos))),
11557                                     chkop);
11558                     initops = op_append_list(OP_LINESEQ,
11559                                 newSTATEOP(0, NULL, chkop),
11560                                 initops);
11561                 }
11562                 if (var) {
11563                     OP *slice = pos ?
11564                         op_prepend_elem(OP_ASLICE,
11565                             newOP(OP_PUSHMARK, 0),
11566                             newLISTOP(OP_ASLICE, 0,
11567                                 list(newRANGE(0,
11568                                     newSVOP(OP_CONST, 0, newSViv(pos)),
11569                                     newUNOP(OP_AV2ARYLEN, 0,
11570                                         ref(newUNOP(OP_RV2AV, 0,
11571                                                 newGVOP(OP_GV, 0, PL_defgv)),
11572                                             OP_AV2ARYLEN)))),
11573                                 ref(newUNOP(OP_RV2AV, 0,
11574                                         newGVOP(OP_GV, 0, PL_defgv)),
11575                                     OP_ASLICE))) :
11576                         newUNOP(OP_RV2AV, 0, newGVOP(OP_GV, 0, PL_defgv));
11577                     initops = op_append_list(OP_LINESEQ, initops,
11578                         newSTATEOP(0, NULL,
11579                             newASSIGNOP(OPf_STACKED, var, 0, slice)));
11580                 }
11581                 prev_type = 2;
11582                 max_arity = -1;
11583             } break;
11584             default:
11585                 parse_error:
11586                 qerror(Perl_mess(aTHX_ "Parse error"));
11587                 return NULL;
11588         }
11589         lex_read_space(0);
11590         c = lex_peek_unichar(0);
11591         switch (c) {
11592             case /*(*/')': break;
11593             case ',':
11594                 do {
11595                     lex_token_boundary();
11596                     lex_read_unichar(0);
11597                     lex_read_space(0);
11598                     c = lex_peek_unichar(0);
11599                 } while (c == ',');
11600                 break;
11601             default:
11602                 goto parse_error;
11603         }
11604     }
11605     if (min_arity != 0) {
11606         initops = op_append_list(OP_LINESEQ,
11607             newSTATEOP(0, NULL,
11608                 newLOGOP(OP_OR, 0,
11609                     newBINOP(OP_GE, 0,
11610                         scalar(newUNOP(OP_RV2AV, 0,
11611                             newGVOP(OP_GV, 0, PL_defgv))),
11612                         newSVOP(OP_CONST, 0, newSViv(min_arity))),
11613                     op_convert_list(OP_DIE, 0,
11614                         op_convert_list(OP_SPRINTF, 0,
11615                             op_append_list(OP_LIST,
11616                                 newSVOP(OP_CONST, 0,
11617                                     newSVpvs("Too few arguments for subroutine at %s line %d.\n")),
11618                                 newSLICEOP(0,
11619                                     op_append_list(OP_LIST,
11620                                         newSVOP(OP_CONST, 0, newSViv(1)),
11621                                         newSVOP(OP_CONST, 0, newSViv(2))),
11622                                     newOP(OP_CALLER, 0))))))),
11623             initops);
11624     }
11625     if (max_arity != -1) {
11626         initops = op_append_list(OP_LINESEQ,
11627             newSTATEOP(0, NULL,
11628                 newLOGOP(OP_OR, 0,
11629                     newBINOP(OP_LE, 0,
11630                         scalar(newUNOP(OP_RV2AV, 0,
11631                             newGVOP(OP_GV, 0, PL_defgv))),
11632                         newSVOP(OP_CONST, 0, newSViv(max_arity))),
11633                     op_convert_list(OP_DIE, 0,
11634                         op_convert_list(OP_SPRINTF, 0,
11635                             op_append_list(OP_LIST,
11636                                 newSVOP(OP_CONST, 0,
11637                                     newSVpvs("Too many arguments for subroutine at %s line %d.\n")),
11638                                 newSLICEOP(0,
11639                                     op_append_list(OP_LIST,
11640                                         newSVOP(OP_CONST, 0, newSViv(1)),
11641                                         newSVOP(OP_CONST, 0, newSViv(2))),
11642                                     newOP(OP_CALLER, 0))))))),
11643             initops);
11644     }
11645     return initops;
11646 }
11647
11648 /*
11649  * Local variables:
11650  * c-indentation-style: bsd
11651  * c-basic-offset: 4
11652  * indent-tabs-mode: nil
11653  * End:
11654  *
11655  * ex: set ts=8 sts=4 sw=4 et:
11656  */