This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
If no strtoul, the args are unused.
[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 (isGRAPH(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     STATIC_ASSERT_STMT(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_invariant_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(
3193                                          sv,
3194                                          SV_GMAGIC|SV_FORCE_UTF8_UPGRADE
3195                                                   /* Above-latin1 in string
3196                                                    * implies no encoding */
3197                                                   |SV_UTF8_NO_ENCODING,
3198                                          UNISKIP(uv) + (STRLEN)(send - s) + 1);
3199                         d = SvPVX(sv) + SvCUR(sv);
3200                         has_utf8 = TRUE;
3201                     }
3202
3203                     if (has_utf8) {
3204                         d = (char*)uvchr_to_utf8((U8*)d, uv);
3205                         if (PL_lex_inwhat == OP_TRANS &&
3206                             PL_sublex_info.sub_op) {
3207                             PL_sublex_info.sub_op->op_private |=
3208                                 (PL_lex_repl ? OPpTRANS_FROM_UTF
3209                                              : OPpTRANS_TO_UTF);
3210                         }
3211 #ifdef EBCDIC
3212                         if (uv > 255 && !dorange)
3213                             native_range = FALSE;
3214 #endif
3215                     }
3216                     else {
3217                         *d++ = (char)uv;
3218                     }
3219                 }
3220                 else {
3221                     *d++ = (char) uv;
3222                 }
3223                 continue;
3224
3225             case 'N':
3226                 /* In a non-pattern \N must be like \N{U+0041}, or it can be a
3227                  * named character, like \N{LATIN SMALL LETTER A}, or a named
3228                  * sequence, like \N{LATIN CAPITAL LETTER A WITH MACRON AND
3229                  * GRAVE}.  For convenience all three forms are referred to as
3230                  * "named characters" below.
3231                  *
3232                  * For patterns, \N also can mean to match a non-newline.  Code
3233                  * before this 'switch' statement should already have handled
3234                  * this situation, and hence this code only has to deal with
3235                  * the named character cases.
3236                  *
3237                  * For non-patterns, the named characters are converted to
3238                  * their string equivalents.  In patterns, named characters are
3239                  * not converted to their ultimate forms for the same reasons
3240                  * that other escapes aren't.  Instead, they are converted to
3241                  * the \N{U+...} form to get the value from the charnames that
3242                  * is in effect right now, while preserving the fact that it
3243                  * was a named character, so that the regex compiler knows
3244                  * this.
3245                  *
3246                  * The structure of this section of code (besides checking for
3247                  * errors and upgrading to utf8) is:
3248                  *  If the named character is of the form \N{U+...}, pass it
3249                  *      through if a pattern; otherwise convert the code point
3250                  *      to utf8
3251                  *  Otherwise must be some \N{NAME}: convert to \N{U+c1.c2...}
3252                  *      if a pattern; otherwise convert to utf8
3253                  *
3254                  * If the regex compiler should ever need to differentiate
3255                  * between the \N{U+...} and \N{name} forms, that could easily
3256                  * be done here by stripping any leading zeros from the
3257                  * \N{U+...} case, and adding them to the other one. */
3258
3259                 /* Here, 's' points to the 'N'; the test below is guaranteed to
3260                  * succeed if we are being called on a pattern, as we already
3261                  * know from a test above that the next character is a '{'.  A
3262                  * non-pattern \N must mean 'named character', which requires
3263                  * braces */
3264                 s++;
3265                 if (*s != '{') {
3266                     yyerror("Missing braces on \\N{}"); 
3267                     continue;
3268                 }
3269                 s++;
3270
3271                 /* If there is no matching '}', it is an error. */
3272                 if (! (e = strchr(s, '}'))) {
3273                     if (! PL_lex_inpat) {
3274                         yyerror("Missing right brace on \\N{}");
3275                     } else {
3276                         yyerror("Missing right brace on \\N{} or unescaped left brace after \\N");
3277                     }
3278                     continue;
3279                 }
3280
3281                 /* Here it looks like a named character */
3282
3283                 if (*s == 'U' && s[1] == '+') { /* \N{U+...} */
3284                     I32 flags = PERL_SCAN_ALLOW_UNDERSCORES
3285                                 | PERL_SCAN_DISALLOW_PREFIX;
3286                     STRLEN len;
3287
3288                     s += 2;         /* Skip to next char after the 'U+' */
3289                     len = e - s;
3290                     uv = grok_hex(s, &len, &flags, NULL);
3291                     if (len == 0 || len != (STRLEN)(e - s)) {
3292                         yyerror("Invalid hexadecimal number in \\N{U+...}");
3293                         s = e + 1;
3294                         continue;
3295                     }
3296
3297                     if (PL_lex_inpat) {
3298                         s -= 5;     /* Include the '\N{U+' */
3299 #ifdef EBCDIC
3300                         /* On EBCDIC platforms, in \N{U+...}, the '...' is a
3301                          * Unicode value, so convert to native so downstream
3302                          * code can continue to assume it's native */
3303                         d += my_snprintf(d, e - s + 1 + 1,  /* includes the '}'
3304                                                                and the \0 */
3305                                          "\\N{U+%X}",
3306                                          (unsigned int) UNI_TO_NATIVE(uv));
3307 #else
3308                         /* On non-EBCDIC platforms, pass it through unchanged.
3309                          * The reason we evaluated the number above is to make
3310                          * sure there wasn't a syntax error. */
3311                         Copy(s, d, e - s + 1, char);    /* +1 is for the '}' */
3312                         d += e - s + 1;
3313 #endif
3314                     }
3315                     else {  /* Not a pattern: convert the hex to string */
3316
3317                          /* If the destination is not in utf8, unconditionally
3318                           * recode it to be so.  This is because \N{} implies
3319                           * Unicode semantics, and scalars have to be in utf8
3320                           * to guarantee those semantics */
3321                         if (! has_utf8) {
3322                             SvCUR_set(sv, d - SvPVX_const(sv));
3323                             SvPOK_on(sv);
3324                             *d = '\0';
3325                             /* See Note on sizing above.  */
3326                             sv_utf8_upgrade_flags_grow(
3327                                         sv,
3328                                         SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
3329                                         UNISKIP(uv) + (STRLEN)(send - e) + 1);
3330                             d = SvPVX(sv) + SvCUR(sv);
3331                             has_utf8 = TRUE;
3332                         }
3333
3334                         /* Add the (Unicode) code point to the output. */
3335                         if (UNI_IS_INVARIANT(uv)) {
3336                             *d++ = (char) LATIN1_TO_NATIVE(uv);
3337                         }
3338                         else {
3339                             d = (char*) uvoffuni_to_utf8_flags((U8*)d, uv, 0);
3340                         }
3341                     }
3342                 }
3343                 else /* Here is \N{NAME} but not \N{U+...}. */
3344                      if ((res = get_and_check_backslash_N_name(s, e)))
3345                 {
3346                     STRLEN len;
3347                     const char *str = SvPV_const(res, len);
3348                     if (PL_lex_inpat) {
3349
3350                         if (! len) { /* The name resolved to an empty string */
3351                             Copy("\\N{}", d, 4, char);
3352                             d += 4;
3353                         }
3354                         else {
3355                             /* In order to not lose information for the regex
3356                             * compiler, pass the result in the specially made
3357                             * syntax: \N{U+c1.c2.c3...}, where c1 etc. are
3358                             * the code points in hex of each character
3359                             * returned by charnames */
3360
3361                             const char *str_end = str + len;
3362                             const STRLEN off = d - SvPVX_const(sv);
3363
3364                             if (! SvUTF8(res)) {
3365                                 /* For the non-UTF-8 case, we can determine the
3366                                  * exact length needed without having to parse
3367                                  * through the string.  Each character takes up
3368                                  * 2 hex digits plus either a trailing dot or
3369                                  * the "}" */
3370                                 const char initial_text[] = "\\N{U+";
3371                                 const STRLEN initial_len = sizeof(initial_text)
3372                                                            - 1;
3373                                 d = off + SvGROW(sv, off
3374                                                     + 3 * len
3375
3376                                                     /* +1 for trailing NUL */
3377                                                     + initial_len + 1
3378
3379                                                     + (STRLEN)(send - e));
3380                                 Copy(initial_text, d, initial_len, char);
3381                                 d += initial_len;
3382                                 while (str < str_end) {
3383                                     char hex_string[4];
3384                                     int len =
3385                                         my_snprintf(hex_string,
3386                                                     sizeof(hex_string),
3387                                                     "%02X.", (U8) *str);
3388                                     PERL_MY_SNPRINTF_POST_GUARD(len, sizeof(hex_string));
3389                                     Copy(hex_string, d, 3, char);
3390                                     d += 3;
3391                                     str++;
3392                                 }
3393                                 d--;    /* Below, we will overwrite the final
3394                                            dot with a right brace */
3395                             }
3396                             else {
3397                                 STRLEN char_length; /* cur char's byte length */
3398
3399                                 /* and the number of bytes after this is
3400                                  * translated into hex digits */
3401                                 STRLEN output_length;
3402
3403                                 /* 2 hex per byte; 2 chars for '\N'; 2 chars
3404                                  * for max('U+', '.'); and 1 for NUL */
3405                                 char hex_string[2 * UTF8_MAXBYTES + 5];
3406
3407                                 /* Get the first character of the result. */
3408                                 U32 uv = utf8n_to_uvchr((U8 *) str,
3409                                                         len,
3410                                                         &char_length,
3411                                                         UTF8_ALLOW_ANYUV);
3412                                 /* Convert first code point to hex, including
3413                                  * the boiler plate before it. */
3414                                 output_length =
3415                                     my_snprintf(hex_string, sizeof(hex_string),
3416                                                 "\\N{U+%X",
3417                                                 (unsigned int) uv);
3418
3419                                 /* Make sure there is enough space to hold it */
3420                                 d = off + SvGROW(sv, off
3421                                                     + output_length
3422                                                     + (STRLEN)(send - e)
3423                                                     + 2);       /* '}' + NUL */
3424                                 /* And output it */
3425                                 Copy(hex_string, d, output_length, char);
3426                                 d += output_length;
3427
3428                                 /* For each subsequent character, append dot and
3429                                 * its ordinal in hex */
3430                                 while ((str += char_length) < str_end) {
3431                                     const STRLEN off = d - SvPVX_const(sv);
3432                                     U32 uv = utf8n_to_uvchr((U8 *) str,
3433                                                             str_end - str,
3434                                                             &char_length,
3435                                                             UTF8_ALLOW_ANYUV);
3436                                     output_length =
3437                                         my_snprintf(hex_string,
3438                                                     sizeof(hex_string),
3439                                                     ".%X",
3440                                                     (unsigned int) uv);
3441
3442                                     d = off + SvGROW(sv, off
3443                                                         + output_length
3444                                                         + (STRLEN)(send - e)
3445                                                         + 2);   /* '}' +  NUL */
3446                                     Copy(hex_string, d, output_length, char);
3447                                     d += output_length;
3448                                 }
3449                             }
3450
3451                             *d++ = '}'; /* Done.  Add the trailing brace */
3452                         }
3453                     }
3454                     else { /* Here, not in a pattern.  Convert the name to a
3455                             * string. */
3456
3457                          /* If destination is not in utf8, unconditionally
3458                           * recode it to be so.  This is because \N{} implies
3459                           * Unicode semantics, and scalars have to be in utf8
3460                           * to guarantee those semantics */
3461                         if (! has_utf8) {
3462                             SvCUR_set(sv, d - SvPVX_const(sv));
3463                             SvPOK_on(sv);
3464                             *d = '\0';
3465                             /* See Note on sizing above.  */
3466                             sv_utf8_upgrade_flags_grow(sv,
3467                                                 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
3468                                                 len + (STRLEN)(send - s) + 1);
3469                             d = SvPVX(sv) + SvCUR(sv);
3470                             has_utf8 = TRUE;
3471                         } else if (len > (STRLEN)(e - s + 4)) { /* I _guess_ 4 is \N{} --jhi */
3472
3473                             /* See Note on sizing above.  (NOTE: SvCUR() is not
3474                              * set correctly here). */
3475                             const STRLEN off = d - SvPVX_const(sv);
3476                             d = off + SvGROW(sv, off + len + (STRLEN)(send - s) + 1);
3477                         }
3478                         if (! SvUTF8(res)) {    /* Make sure \N{} return is UTF-8 */
3479                             sv_utf8_upgrade_flags(res, SV_UTF8_NO_ENCODING);
3480                             str = SvPV_const(res, len);
3481                         }
3482                         Copy(str, d, len, char);
3483                         d += len;
3484                     }
3485
3486                     SvREFCNT_dec(res);
3487
3488                 } /* End \N{NAME} */
3489 #ifdef EBCDIC
3490                 if (!dorange) 
3491                     native_range = FALSE; /* \N{} is defined to be Unicode */
3492 #endif
3493                 s = e + 1;  /* Point to just after the '}' */
3494                 continue;
3495
3496             /* \c is a control character */
3497             case 'c':
3498                 s++;
3499                 if (s < send) {
3500                     *d++ = grok_bslash_c(*s++, 1);
3501                 }
3502                 else {
3503                     yyerror("Missing control char name in \\c");
3504                 }
3505                 continue;
3506
3507             /* printf-style backslashes, formfeeds, newlines, etc */
3508             case 'b':
3509                 *d++ = '\b';
3510                 break;
3511             case 'n':
3512                 *d++ = '\n';
3513                 break;
3514             case 'r':
3515                 *d++ = '\r';
3516                 break;
3517             case 'f':
3518                 *d++ = '\f';
3519                 break;
3520             case 't':
3521                 *d++ = '\t';
3522                 break;
3523             case 'e':
3524                 *d++ = ESC_NATIVE;
3525                 break;
3526             case 'a':
3527                 *d++ = '\a';
3528                 break;
3529             } /* end switch */
3530
3531             s++;
3532             continue;
3533         } /* end if (backslash) */
3534 #ifdef EBCDIC
3535         else
3536             literal_endpoint++;
3537 #endif
3538
3539     default_action:
3540         /* If we started with encoded form, or already know we want it,
3541            then encode the next character */
3542         if (! NATIVE_BYTE_IS_INVARIANT((U8)(*s)) && (this_utf8 || has_utf8)) {
3543             STRLEN len  = 1;
3544
3545
3546             /* One might think that it is wasted effort in the case of the
3547              * source being utf8 (this_utf8 == TRUE) to take the next character
3548              * in the source, convert it to an unsigned value, and then convert
3549              * it back again.  But the source has not been validated here.  The
3550              * routine that does the conversion checks for errors like
3551              * malformed utf8 */
3552
3553             const UV nextuv   = (this_utf8)
3554                                 ? utf8n_to_uvchr((U8*)s, send - s, &len, 0)
3555                                 : (UV) ((U8) *s);
3556             const STRLEN need = UNISKIP(nextuv);
3557             if (!has_utf8) {
3558                 SvCUR_set(sv, d - SvPVX_const(sv));
3559                 SvPOK_on(sv);
3560                 *d = '\0';
3561                 /* See Note on sizing above.  */
3562                 sv_utf8_upgrade_flags_grow(sv,
3563                                         SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
3564                                         need + (STRLEN)(send - s) + 1);
3565                 d = SvPVX(sv) + SvCUR(sv);
3566                 has_utf8 = TRUE;
3567             } else if (need > len) {
3568                 /* encoded value larger than old, may need extra space (NOTE:
3569                  * SvCUR() is not set correctly here).   See Note on sizing
3570                  * above.  */
3571                 const STRLEN off = d - SvPVX_const(sv);
3572                 d = SvGROW(sv, off + need + (STRLEN)(send - s) + 1) + off;
3573             }
3574             s += len;
3575
3576             d = (char*)uvchr_to_utf8((U8*)d, nextuv);
3577 #ifdef EBCDIC
3578             if (uv > 255 && !dorange)
3579                 native_range = FALSE;
3580 #endif
3581         }
3582         else {
3583             *d++ = *s++;
3584         }
3585     } /* while loop to process each character */
3586
3587     /* terminate the string and set up the sv */
3588     *d = '\0';
3589     SvCUR_set(sv, d - SvPVX_const(sv));
3590     if (SvCUR(sv) >= SvLEN(sv))
3591         Perl_croak(aTHX_ "panic: constant overflowed allocated space, %"UVuf
3592                    " >= %"UVuf, (UV)SvCUR(sv), (UV)SvLEN(sv));
3593
3594     SvPOK_on(sv);
3595     if (IN_ENCODING && !has_utf8) {
3596         sv_recode_to_utf8(sv, _get_encoding());
3597         if (SvUTF8(sv))
3598             has_utf8 = TRUE;
3599     }
3600     if (has_utf8) {
3601         SvUTF8_on(sv);
3602         if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
3603             PL_sublex_info.sub_op->op_private |=
3604                     (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
3605         }
3606     }
3607
3608     /* shrink the sv if we allocated more than we used */
3609     if (SvCUR(sv) + 5 < SvLEN(sv)) {
3610         SvPV_shrink_to_cur(sv);
3611     }
3612
3613     /* return the substring (via pl_yylval) only if we parsed anything */
3614     if (s > start) {
3615         char *s2 = start;
3616         for (; s2 < s; s2++) {
3617             if (*s2 == '\n')
3618                 COPLINE_INC_WITH_HERELINES;
3619         }
3620         SvREFCNT_inc_simple_void_NN(sv);
3621         if (   (PL_hints & ( PL_lex_inpat ? HINT_NEW_RE : HINT_NEW_STRING ))
3622             && ! PL_parser->lex_re_reparsing)
3623         {
3624             const char *const key = PL_lex_inpat ? "qr" : "q";
3625             const STRLEN keylen = PL_lex_inpat ? 2 : 1;
3626             const char *type;
3627             STRLEN typelen;
3628
3629             if (PL_lex_inwhat == OP_TRANS) {
3630                 type = "tr";
3631                 typelen = 2;
3632             } else if (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat) {
3633                 type = "s";
3634                 typelen = 1;
3635             } else if (PL_lex_inpat && SvIVX(PL_linestr) == '\'') {
3636                 type = "q";
3637                 typelen = 1;
3638             } else  {
3639                 type = "qq";
3640                 typelen = 2;
3641             }
3642
3643             sv = S_new_constant(aTHX_ start, s - start, key, keylen, sv, NULL,
3644                                 type, typelen);
3645         }
3646         pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
3647     }
3648     LEAVE_with_name("scan_const");
3649     return s;
3650 }
3651
3652 /* S_intuit_more
3653  * Returns TRUE if there's more to the expression (e.g., a subscript),
3654  * FALSE otherwise.
3655  *
3656  * It deals with "$foo[3]" and /$foo[3]/ and /$foo[0123456789$]+/
3657  *
3658  * ->[ and ->{ return TRUE
3659  * ->$* ->$#* ->@* ->@[ ->@{ return TRUE if postderef_qq is enabled
3660  * { and [ outside a pattern are always subscripts, so return TRUE
3661  * if we're outside a pattern and it's not { or [, then return FALSE
3662  * if we're in a pattern and the first char is a {
3663  *   {4,5} (any digits around the comma) returns FALSE
3664  * if we're in a pattern and the first char is a [
3665  *   [] returns FALSE
3666  *   [SOMETHING] has a funky algorithm to decide whether it's a
3667  *      character class or not.  It has to deal with things like
3668  *      /$foo[-3]/ and /$foo[$bar]/ as well as /$foo[$\d]+/
3669  * anything else returns TRUE
3670  */
3671
3672 /* This is the one truly awful dwimmer necessary to conflate C and sed. */
3673
3674 STATIC int
3675 S_intuit_more(pTHX_ char *s)
3676 {
3677     PERL_ARGS_ASSERT_INTUIT_MORE;
3678
3679     if (PL_lex_brackets)
3680         return TRUE;
3681     if (*s == '-' && s[1] == '>' && (s[2] == '[' || s[2] == '{'))
3682         return TRUE;
3683     if (*s == '-' && s[1] == '>'
3684      && FEATURE_POSTDEREF_QQ_IS_ENABLED
3685      && ( (s[2] == '$' && (s[3] == '*' || (s[3] == '#' && s[4] == '*')))
3686         ||(s[2] == '@' && strchr("*[{",s[3])) ))
3687         return TRUE;
3688     if (*s != '{' && *s != '[')
3689         return FALSE;
3690     if (!PL_lex_inpat)
3691         return TRUE;
3692
3693     /* In a pattern, so maybe we have {n,m}. */
3694     if (*s == '{') {
3695         if (regcurly(s)) {
3696             return FALSE;
3697         }
3698         return TRUE;
3699     }
3700
3701     /* On the other hand, maybe we have a character class */
3702
3703     s++;
3704     if (*s == ']' || *s == '^')
3705         return FALSE;
3706     else {
3707         /* this is terrifying, and it works */
3708         int weight;
3709         char seen[256];
3710         const char * const send = strchr(s,']');
3711         unsigned char un_char, last_un_char;
3712         char tmpbuf[sizeof PL_tokenbuf * 4];
3713
3714         if (!send)              /* has to be an expression */
3715             return TRUE;
3716         weight = 2;             /* let's weigh the evidence */
3717
3718         if (*s == '$')
3719             weight -= 3;
3720         else if (isDIGIT(*s)) {
3721             if (s[1] != ']') {
3722                 if (isDIGIT(s[1]) && s[2] == ']')
3723                     weight -= 10;
3724             }
3725             else
3726                 weight -= 100;
3727         }
3728         Zero(seen,256,char);
3729         un_char = 255;
3730         for (; s < send; s++) {
3731             last_un_char = un_char;
3732             un_char = (unsigned char)*s;
3733             switch (*s) {
3734             case '@':
3735             case '&':
3736             case '$':
3737                 weight -= seen[un_char] * 10;
3738                 if (isWORDCHAR_lazy_if(s+1,UTF)) {
3739                     int len;
3740                     char *tmp = PL_bufend;
3741                     PL_bufend = (char*)send;
3742                     scan_ident(s, tmpbuf, sizeof tmpbuf, FALSE);
3743                     PL_bufend = tmp;
3744                     len = (int)strlen(tmpbuf);
3745                     if (len > 1 && gv_fetchpvn_flags(tmpbuf, len,
3746                                                     UTF ? SVf_UTF8 : 0, SVt_PV))
3747                         weight -= 100;
3748                     else
3749                         weight -= 10;
3750                 }
3751                 else if (*s == '$' && s[1] &&
3752                   strchr("[#!%*<>()-=",s[1])) {
3753                     if (/*{*/ strchr("])} =",s[2]))
3754                         weight -= 10;
3755                     else
3756                         weight -= 1;
3757                 }
3758                 break;
3759             case '\\':
3760                 un_char = 254;
3761                 if (s[1]) {
3762                     if (strchr("wds]",s[1]))
3763                         weight += 100;
3764                     else if (seen[(U8)'\''] || seen[(U8)'"'])
3765                         weight += 1;
3766                     else if (strchr("rnftbxcav",s[1]))
3767                         weight += 40;
3768                     else if (isDIGIT(s[1])) {
3769                         weight += 40;
3770                         while (s[1] && isDIGIT(s[1]))
3771                             s++;
3772                     }
3773                 }
3774                 else
3775                     weight += 100;
3776                 break;
3777             case '-':
3778                 if (s[1] == '\\')
3779                     weight += 50;
3780                 if (strchr("aA01! ",last_un_char))
3781                     weight += 30;
3782                 if (strchr("zZ79~",s[1]))
3783                     weight += 30;
3784                 if (last_un_char == 255 && (isDIGIT(s[1]) || s[1] == '$'))
3785                     weight -= 5;        /* cope with negative subscript */
3786                 break;
3787             default:
3788                 if (!isWORDCHAR(last_un_char)
3789                     && !(last_un_char == '$' || last_un_char == '@'
3790                          || last_un_char == '&')
3791                     && isALPHA(*s) && s[1] && isALPHA(s[1])) {
3792                     char *d = tmpbuf;
3793                     while (isALPHA(*s))
3794                         *d++ = *s++;
3795                     *d = '\0';
3796                     if (keyword(tmpbuf, d - tmpbuf, 0))
3797                         weight -= 150;
3798                 }
3799                 if (un_char == last_un_char + 1)
3800                     weight += 5;
3801                 weight -= seen[un_char];
3802                 break;
3803             }
3804             seen[un_char]++;
3805         }
3806         if (weight >= 0)        /* probably a character class */
3807             return FALSE;
3808     }
3809
3810     return TRUE;
3811 }
3812
3813 /*
3814  * S_intuit_method
3815  *
3816  * Does all the checking to disambiguate
3817  *   foo bar
3818  * between foo(bar) and bar->foo.  Returns 0 if not a method, otherwise
3819  * FUNCMETH (bar->foo(args)) or METHOD (bar->foo args).
3820  *
3821  * First argument is the stuff after the first token, e.g. "bar".
3822  *
3823  * Not a method if foo is a filehandle.
3824  * Not a method if foo is a subroutine prototyped to take a filehandle.
3825  * Not a method if it's really "Foo $bar"
3826  * Method if it's "foo $bar"
3827  * Not a method if it's really "print foo $bar"
3828  * Method if it's really "foo package::" (interpreted as package->foo)
3829  * Not a method if bar is known to be a subroutine ("sub bar; foo bar")
3830  * Not a method if bar is a filehandle or package, but is quoted with
3831  *   =>
3832  */
3833
3834 STATIC int
3835 S_intuit_method(pTHX_ char *start, SV *ioname, CV *cv)
3836 {
3837     char *s = start + (*start == '$');
3838     char tmpbuf[sizeof PL_tokenbuf];
3839     STRLEN len;
3840     GV* indirgv;
3841         /* Mustn't actually add anything to a symbol table.
3842            But also don't want to "initialise" any placeholder
3843            constants that might already be there into full
3844            blown PVGVs with attached PVCV.  */
3845     GV * const gv =
3846         ioname ? gv_fetchsv(ioname, GV_NOADD_NOINIT, SVt_PVCV) : NULL;
3847
3848     PERL_ARGS_ASSERT_INTUIT_METHOD;
3849
3850     if (gv && SvTYPE(gv) == SVt_PVGV && GvIO(gv))
3851             return 0;
3852     if (cv && SvPOK(cv)) {
3853         const char *proto = CvPROTO(cv);
3854         if (proto) {
3855             while (*proto && (isSPACE(*proto) || *proto == ';'))
3856                 proto++;
3857             if (*proto == '*')
3858                 return 0;
3859         }
3860     }
3861
3862     if (*start == '$') {
3863         if (cv || PL_last_lop_op == OP_PRINT || PL_last_lop_op == OP_SAY ||
3864                 isUPPER(*PL_tokenbuf))
3865             return 0;
3866         s = skipspace(s);
3867         PL_bufptr = start;
3868         PL_expect = XREF;
3869         return *s == '(' ? FUNCMETH : METHOD;
3870     }
3871
3872     s = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
3873     /* start is the beginning of the possible filehandle/object,
3874      * and s is the end of it
3875      * tmpbuf is a copy of it (but with single quotes as double colons)
3876      */
3877
3878     if (!keyword(tmpbuf, len, 0)) {
3879         if (len > 2 && tmpbuf[len - 2] == ':' && tmpbuf[len - 1] == ':') {
3880             len -= 2;
3881             tmpbuf[len] = '\0';
3882             goto bare_package;
3883         }
3884         indirgv = gv_fetchpvn_flags(tmpbuf, len, ( UTF ? SVf_UTF8 : 0 ), SVt_PVCV);
3885         if (indirgv && GvCVu(indirgv))
3886             return 0;
3887         /* filehandle or package name makes it a method */
3888         if (!cv || GvIO(indirgv) || gv_stashpvn(tmpbuf, len, UTF ? SVf_UTF8 : 0)) {
3889             s = skipspace(s);
3890             if ((PL_bufend - s) >= 2 && *s == '=' && *(s+1) == '>')
3891                 return 0;       /* no assumptions -- "=>" quotes bareword */
3892       bare_package:
3893             NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0,
3894                                                   S_newSV_maybe_utf8(aTHX_ tmpbuf, len));
3895             NEXTVAL_NEXTTOKE.opval->op_private = OPpCONST_BARE;
3896             PL_expect = XTERM;
3897             force_next(WORD);
3898             PL_bufptr = s;
3899             return *s == '(' ? FUNCMETH : METHOD;
3900         }
3901     }
3902     return 0;
3903 }
3904
3905 /* Encoded script support. filter_add() effectively inserts a
3906  * 'pre-processing' function into the current source input stream.
3907  * Note that the filter function only applies to the current source file
3908  * (e.g., it will not affect files 'require'd or 'use'd by this one).
3909  *
3910  * The datasv parameter (which may be NULL) can be used to pass
3911  * private data to this instance of the filter. The filter function
3912  * can recover the SV using the FILTER_DATA macro and use it to
3913  * store private buffers and state information.
3914  *
3915  * The supplied datasv parameter is upgraded to a PVIO type
3916  * and the IoDIRP/IoANY field is used to store the function pointer,
3917  * and IOf_FAKE_DIRP is enabled on datasv to mark this as such.
3918  * Note that IoTOP_NAME, IoFMT_NAME, IoBOTTOM_NAME, if set for
3919  * private use must be set using malloc'd pointers.
3920  */
3921
3922 SV *
3923 Perl_filter_add(pTHX_ filter_t funcp, SV *datasv)
3924 {
3925     if (!funcp)
3926         return NULL;
3927
3928     if (!PL_parser)
3929         return NULL;
3930
3931     if (PL_parser->lex_flags & LEX_IGNORE_UTF8_HINTS)
3932         Perl_croak(aTHX_ "Source filters apply only to byte streams");
3933
3934     if (!PL_rsfp_filters)
3935         PL_rsfp_filters = newAV();
3936     if (!datasv)
3937         datasv = newSV(0);
3938     SvUPGRADE(datasv, SVt_PVIO);
3939     IoANY(datasv) = FPTR2DPTR(void *, funcp); /* stash funcp into spare field */
3940     IoFLAGS(datasv) |= IOf_FAKE_DIRP;
3941     DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_add func %p (%s)\n",
3942                           FPTR2DPTR(void *, IoANY(datasv)),
3943                           SvPV_nolen(datasv)));
3944     av_unshift(PL_rsfp_filters, 1);
3945     av_store(PL_rsfp_filters, 0, datasv) ;
3946     if (
3947         !PL_parser->filtered
3948      && PL_parser->lex_flags & LEX_EVALBYTES
3949      && PL_bufptr < PL_bufend
3950     ) {
3951         const char *s = PL_bufptr;
3952         while (s < PL_bufend) {
3953             if (*s == '\n') {
3954                 SV *linestr = PL_parser->linestr;
3955                 char *buf = SvPVX(linestr);
3956                 STRLEN const bufptr_pos = PL_parser->bufptr - buf;
3957                 STRLEN const oldbufptr_pos = PL_parser->oldbufptr - buf;
3958                 STRLEN const oldoldbufptr_pos=PL_parser->oldoldbufptr-buf;
3959                 STRLEN const linestart_pos = PL_parser->linestart - buf;
3960                 STRLEN const last_uni_pos =
3961                     PL_parser->last_uni ? PL_parser->last_uni - buf : 0;
3962                 STRLEN const last_lop_pos =
3963                     PL_parser->last_lop ? PL_parser->last_lop - buf : 0;
3964                 av_push(PL_rsfp_filters, linestr);
3965                 PL_parser->linestr = 
3966                     newSVpvn(SvPVX(linestr), ++s-SvPVX(linestr));
3967                 buf = SvPVX(PL_parser->linestr);
3968                 PL_parser->bufend = buf + SvCUR(PL_parser->linestr);
3969                 PL_parser->bufptr = buf + bufptr_pos;
3970                 PL_parser->oldbufptr = buf + oldbufptr_pos;
3971                 PL_parser->oldoldbufptr = buf + oldoldbufptr_pos;
3972                 PL_parser->linestart = buf + linestart_pos;
3973                 if (PL_parser->last_uni)
3974                     PL_parser->last_uni = buf + last_uni_pos;
3975                 if (PL_parser->last_lop)
3976                     PL_parser->last_lop = buf + last_lop_pos;
3977                 SvLEN(linestr) = SvCUR(linestr);
3978                 SvCUR(linestr) = s-SvPVX(linestr);
3979                 PL_parser->filtered = 1;
3980                 break;
3981             }
3982             s++;
3983         }
3984     }
3985     return(datasv);
3986 }
3987
3988
3989 /* Delete most recently added instance of this filter function. */
3990 void
3991 Perl_filter_del(pTHX_ filter_t funcp)
3992 {
3993     SV *datasv;
3994
3995     PERL_ARGS_ASSERT_FILTER_DEL;
3996
3997 #ifdef DEBUGGING
3998     DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_del func %p",
3999                           FPTR2DPTR(void*, funcp)));
4000 #endif
4001     if (!PL_parser || !PL_rsfp_filters || AvFILLp(PL_rsfp_filters)<0)
4002         return;
4003     /* if filter is on top of stack (usual case) just pop it off */
4004     datasv = FILTER_DATA(AvFILLp(PL_rsfp_filters));
4005     if (IoANY(datasv) == FPTR2DPTR(void *, funcp)) {
4006         sv_free(av_pop(PL_rsfp_filters));
4007
4008         return;
4009     }
4010     /* we need to search for the correct entry and clear it     */
4011     Perl_die(aTHX_ "filter_del can only delete in reverse order (currently)");
4012 }
4013
4014
4015 /* Invoke the idxth filter function for the current rsfp.        */
4016 /* maxlen 0 = read one text line */
4017 I32
4018 Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
4019 {
4020     filter_t funcp;
4021     SV *datasv = NULL;
4022     /* This API is bad. It should have been using unsigned int for maxlen.
4023        Not sure if we want to change the API, but if not we should sanity
4024        check the value here.  */
4025     unsigned int correct_length = maxlen < 0 ?  PERL_INT_MAX : maxlen;
4026
4027     PERL_ARGS_ASSERT_FILTER_READ;
4028
4029     if (!PL_parser || !PL_rsfp_filters)
4030         return -1;
4031     if (idx > AvFILLp(PL_rsfp_filters)) {       /* Any more filters?    */
4032         /* Provide a default input filter to make life easy.    */
4033         /* Note that we append to the line. This is handy.      */
4034         DEBUG_P(PerlIO_printf(Perl_debug_log,
4035                               "filter_read %d: from rsfp\n", idx));
4036         if (correct_length) {
4037             /* Want a block */
4038             int len ;
4039             const int old_len = SvCUR(buf_sv);
4040
4041             /* ensure buf_sv is large enough */
4042             SvGROW(buf_sv, (STRLEN)(old_len + correct_length + 1)) ;
4043             if ((len = PerlIO_read(PL_rsfp, SvPVX(buf_sv) + old_len,
4044                                    correct_length)) <= 0) {
4045                 if (PerlIO_error(PL_rsfp))
4046                     return -1;          /* error */
4047                 else
4048                     return 0 ;          /* end of file */
4049             }
4050             SvCUR_set(buf_sv, old_len + len) ;
4051             SvPVX(buf_sv)[old_len + len] = '\0';
4052         } else {
4053             /* Want a line */
4054             if (sv_gets(buf_sv, PL_rsfp, SvCUR(buf_sv)) == NULL) {
4055                 if (PerlIO_error(PL_rsfp))
4056                     return -1;          /* error */
4057                 else
4058                     return 0 ;          /* end of file */
4059             }
4060         }
4061         return SvCUR(buf_sv);
4062     }
4063     /* Skip this filter slot if filter has been deleted */
4064     if ( (datasv = FILTER_DATA(idx)) == &PL_sv_undef) {
4065         DEBUG_P(PerlIO_printf(Perl_debug_log,
4066                               "filter_read %d: skipped (filter deleted)\n",
4067                               idx));
4068         return FILTER_READ(idx+1, buf_sv, correct_length); /* recurse */
4069     }
4070     if (SvTYPE(datasv) != SVt_PVIO) {
4071         if (correct_length) {
4072             /* Want a block */
4073             const STRLEN remainder = SvLEN(datasv) - SvCUR(datasv);
4074             if (!remainder) return 0; /* eof */
4075             if (correct_length > remainder) correct_length = remainder;
4076             sv_catpvn(buf_sv, SvEND(datasv), correct_length);
4077             SvCUR_set(datasv, SvCUR(datasv) + correct_length);
4078         } else {
4079             /* Want a line */
4080             const char *s = SvEND(datasv);
4081             const char *send = SvPVX(datasv) + SvLEN(datasv);
4082             while (s < send) {
4083                 if (*s == '\n') {
4084                     s++;
4085                     break;
4086                 }
4087                 s++;
4088             }
4089             if (s == send) return 0; /* eof */
4090             sv_catpvn(buf_sv, SvEND(datasv), s-SvEND(datasv));
4091             SvCUR_set(datasv, s-SvPVX(datasv));
4092         }
4093         return SvCUR(buf_sv);
4094     }
4095     /* Get function pointer hidden within datasv        */
4096     funcp = DPTR2FPTR(filter_t, IoANY(datasv));
4097     DEBUG_P(PerlIO_printf(Perl_debug_log,
4098                           "filter_read %d: via function %p (%s)\n",
4099                           idx, (void*)datasv, SvPV_nolen_const(datasv)));
4100     /* Call function. The function is expected to       */
4101     /* call "FILTER_READ(idx+1, buf_sv)" first.         */
4102     /* Return: <0:error, =0:eof, >0:not eof             */
4103     return (*funcp)(aTHX_ idx, buf_sv, correct_length);
4104 }
4105
4106 STATIC char *
4107 S_filter_gets(pTHX_ SV *sv, STRLEN append)
4108 {
4109     PERL_ARGS_ASSERT_FILTER_GETS;
4110
4111 #ifdef PERL_CR_FILTER
4112     if (!PL_rsfp_filters) {
4113         filter_add(S_cr_textfilter,NULL);
4114     }
4115 #endif
4116     if (PL_rsfp_filters) {
4117         if (!append)
4118             SvCUR_set(sv, 0);   /* start with empty line        */
4119         if (FILTER_READ(0, sv, 0) > 0)
4120             return ( SvPVX(sv) ) ;
4121         else
4122             return NULL ;
4123     }
4124     else
4125         return (sv_gets(sv, PL_rsfp, append));
4126 }
4127
4128 STATIC HV *
4129 S_find_in_my_stash(pTHX_ const char *pkgname, STRLEN len)
4130 {
4131     GV *gv;
4132
4133     PERL_ARGS_ASSERT_FIND_IN_MY_STASH;
4134
4135     if (len == 11 && *pkgname == '_' && strEQ(pkgname, "__PACKAGE__"))
4136         return PL_curstash;
4137
4138     if (len > 2 &&
4139         (pkgname[len - 2] == ':' && pkgname[len - 1] == ':') &&
4140         (gv = gv_fetchpvn_flags(pkgname, len, ( UTF ? SVf_UTF8 : 0 ), SVt_PVHV)))
4141     {
4142         return GvHV(gv);                        /* Foo:: */
4143     }
4144
4145     /* use constant CLASS => 'MyClass' */
4146     gv = gv_fetchpvn_flags(pkgname, len, UTF ? SVf_UTF8 : 0, SVt_PVCV);
4147     if (gv && GvCV(gv)) {
4148         SV * const sv = cv_const_sv(GvCV(gv));
4149         if (sv)
4150             return gv_stashsv(sv, 0);
4151     }
4152
4153     return gv_stashpvn(pkgname, len, UTF ? SVf_UTF8 : 0);
4154 }
4155
4156
4157 STATIC char *
4158 S_tokenize_use(pTHX_ int is_use, char *s) {
4159     PERL_ARGS_ASSERT_TOKENIZE_USE;
4160
4161     if (PL_expect != XSTATE)
4162         yyerror(Perl_form(aTHX_ "\"%s\" not allowed in expression",
4163                     is_use ? "use" : "no"));
4164     PL_expect = XTERM;
4165     s = skipspace(s);
4166     if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
4167         s = force_version(s, TRUE);
4168         if (*s == ';' || *s == '}'
4169                 || (s = skipspace(s), (*s == ';' || *s == '}'))) {
4170             NEXTVAL_NEXTTOKE.opval = NULL;
4171             force_next(WORD);
4172         }
4173         else if (*s == 'v') {
4174             s = force_word(s,WORD,FALSE,TRUE);
4175             s = force_version(s, FALSE);
4176         }
4177     }
4178     else {
4179         s = force_word(s,WORD,FALSE,TRUE);
4180         s = force_version(s, FALSE);
4181     }
4182     pl_yylval.ival = is_use;
4183     return s;
4184 }
4185 #ifdef DEBUGGING
4186     static const char* const exp_name[] =
4187         { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "ATTRBLOCK",
4188           "ATTRTERM", "TERMBLOCK", "XBLOCKTERM", "POSTDEREF",
4189           "TERMORDORDOR"
4190         };
4191 #endif
4192
4193 #define word_takes_any_delimeter(p,l) S_word_takes_any_delimeter(p,l)
4194 STATIC bool
4195 S_word_takes_any_delimeter(char *p, STRLEN len)
4196 {
4197     return (len == 1 && strchr("msyq", p[0])) ||
4198            (len == 2 && (
4199             (p[0] == 't' && p[1] == 'r') ||
4200             (p[0] == 'q' && strchr("qwxr", p[1]))));
4201 }
4202
4203 static void
4204 S_check_scalar_slice(pTHX_ char *s)
4205 {
4206     s++;
4207     while (*s == ' ' || *s == '\t') s++;
4208     if (*s == 'q' && s[1] == 'w'
4209      && !isWORDCHAR_lazy_if(s+2,UTF))
4210         return;
4211     while (*s && (isWORDCHAR_lazy_if(s,UTF) || strchr(" \t$#+-'\"", *s)))
4212         s += UTF ? UTF8SKIP(s) : 1;
4213     if (*s == '}' || *s == ']')
4214         pl_yylval.ival = OPpSLICEWARNING;
4215 }
4216
4217 /*
4218   yylex
4219
4220   Works out what to call the token just pulled out of the input
4221   stream.  The yacc parser takes care of taking the ops we return and
4222   stitching them into a tree.
4223
4224   Returns:
4225     The type of the next token
4226
4227   Structure:
4228       Switch based on the current state:
4229           - if we already built the token before, use it
4230           - if we have a case modifier in a string, deal with that
4231           - handle other cases of interpolation inside a string
4232           - scan the next line if we are inside a format
4233       In the normal state switch on the next character:
4234           - default:
4235             if alphabetic, go to key lookup
4236             unrecoginized character - croak
4237           - 0/4/26: handle end-of-line or EOF
4238           - cases for whitespace
4239           - \n and #: handle comments and line numbers
4240           - various operators, brackets and sigils
4241           - numbers
4242           - quotes
4243           - 'v': vstrings (or go to key lookup)
4244           - 'x' repetition operator (or go to key lookup)
4245           - other ASCII alphanumerics (key lookup begins here):
4246               word before => ?
4247               keyword plugin
4248               scan built-in keyword (but do nothing with it yet)
4249               check for statement label
4250               check for lexical subs
4251                   goto just_a_word if there is one
4252               see whether built-in keyword is overridden
4253               switch on keyword number:
4254                   - default: just_a_word:
4255                       not a built-in keyword; handle bareword lookup
4256                       disambiguate between method and sub call
4257                       fall back to bareword
4258                   - cases for built-in keywords
4259 */
4260
4261
4262 int
4263 Perl_yylex(pTHX)
4264 {
4265     dVAR;
4266     char *s = PL_bufptr;
4267     char *d;
4268     STRLEN len;
4269     bool bof = FALSE;
4270     const bool saw_infix_sigil = cBOOL(PL_parser->saw_infix_sigil);
4271     U8 formbrack = 0;
4272     U32 fake_eof = 0;
4273
4274     /* orig_keyword, gvp, and gv are initialized here because
4275      * jump to the label just_a_word_zero can bypass their
4276      * initialization later. */
4277     I32 orig_keyword = 0;
4278     GV *gv = NULL;
4279     GV **gvp = NULL;
4280
4281     DEBUG_T( {
4282         SV* tmp = newSVpvs("");
4283         PerlIO_printf(Perl_debug_log, "### %"IVdf":LEX_%s/X%s %s\n",
4284             (IV)CopLINE(PL_curcop),
4285             lex_state_names[PL_lex_state],
4286             exp_name[PL_expect],
4287             pv_display(tmp, s, strlen(s), 0, 60));
4288         SvREFCNT_dec(tmp);
4289     } );
4290
4291     switch (PL_lex_state) {
4292     case LEX_NORMAL:
4293     case LEX_INTERPNORMAL:
4294         break;
4295
4296     /* when we've already built the next token, just pull it out of the queue */
4297     case LEX_KNOWNEXT:
4298         PL_nexttoke--;
4299         pl_yylval = PL_nextval[PL_nexttoke];
4300         if (!PL_nexttoke) {
4301             PL_lex_state = PL_lex_defer;
4302             PL_lex_defer = LEX_NORMAL;
4303         }
4304         {
4305             I32 next_type;
4306             next_type = PL_nexttype[PL_nexttoke];
4307             if (next_type & (7<<24)) {
4308                 if (next_type & (1<<24)) {
4309                     if (PL_lex_brackets > 100)
4310                         Renew(PL_lex_brackstack, PL_lex_brackets + 10, char);
4311                     PL_lex_brackstack[PL_lex_brackets++] =
4312                         (char) ((next_type >> 16) & 0xff);
4313                 }
4314                 if (next_type & (2<<24))
4315                     PL_lex_allbrackets++;
4316                 if (next_type & (4<<24))
4317                     PL_lex_allbrackets--;
4318                 next_type &= 0xffff;
4319             }
4320             return REPORT(next_type == 'p' ? pending_ident() : next_type);
4321         }
4322
4323     /* interpolated case modifiers like \L \U, including \Q and \E.
4324        when we get here, PL_bufptr is at the \
4325     */
4326     case LEX_INTERPCASEMOD:
4327 #ifdef DEBUGGING
4328         if (PL_bufptr != PL_bufend && *PL_bufptr != '\\')
4329             Perl_croak(aTHX_
4330                        "panic: INTERPCASEMOD bufptr=%p, bufend=%p, *bufptr=%u",
4331                        PL_bufptr, PL_bufend, *PL_bufptr);
4332 #endif
4333         /* handle \E or end of string */
4334         if (PL_bufptr == PL_bufend || PL_bufptr[1] == 'E') {
4335             /* if at a \E */
4336             if (PL_lex_casemods) {
4337                 const char oldmod = PL_lex_casestack[--PL_lex_casemods];
4338                 PL_lex_casestack[PL_lex_casemods] = '\0';
4339
4340                 if (PL_bufptr != PL_bufend
4341                     && (oldmod == 'L' || oldmod == 'U' || oldmod == 'Q'
4342                         || oldmod == 'F')) {
4343                     PL_bufptr += 2;
4344                     PL_lex_state = LEX_INTERPCONCAT;
4345                 }
4346                 PL_lex_allbrackets--;
4347                 return REPORT(')');
4348             }
4349             else if ( PL_bufptr != PL_bufend && PL_bufptr[1] == 'E' ) {
4350                /* Got an unpaired \E */
4351                Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
4352                         "Useless use of \\E");
4353             }
4354             if (PL_bufptr != PL_bufend)
4355                 PL_bufptr += 2;
4356             PL_lex_state = LEX_INTERPCONCAT;
4357             return yylex();
4358         }
4359         else {
4360             DEBUG_T({ PerlIO_printf(Perl_debug_log,
4361               "### Saw case modifier\n"); });
4362             s = PL_bufptr + 1;
4363             if (s[1] == '\\' && s[2] == 'E') {
4364                 PL_bufptr = s + 3;
4365                 PL_lex_state = LEX_INTERPCONCAT;
4366                 return yylex();
4367             }
4368             else {
4369                 I32 tmp;
4370                 if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
4371                     tmp = *s, *s = s[2], s[2] = (char)tmp;      /* misordered... */
4372                 if ((*s == 'L' || *s == 'U' || *s == 'F') &&
4373                     (strchr(PL_lex_casestack, 'L')
4374                         || strchr(PL_lex_casestack, 'U')
4375                         || strchr(PL_lex_casestack, 'F'))) {
4376                     PL_lex_casestack[--PL_lex_casemods] = '\0';
4377                     PL_lex_allbrackets--;
4378                     return REPORT(')');
4379                 }
4380                 if (PL_lex_casemods > 10)
4381                     Renew(PL_lex_casestack, PL_lex_casemods + 2, char);
4382                 PL_lex_casestack[PL_lex_casemods++] = *s;
4383                 PL_lex_casestack[PL_lex_casemods] = '\0';
4384                 PL_lex_state = LEX_INTERPCONCAT;
4385                 NEXTVAL_NEXTTOKE.ival = 0;
4386                 force_next((2<<24)|'(');
4387                 if (*s == 'l')
4388                     NEXTVAL_NEXTTOKE.ival = OP_LCFIRST;
4389                 else if (*s == 'u')
4390                     NEXTVAL_NEXTTOKE.ival = OP_UCFIRST;
4391                 else if (*s == 'L')
4392                     NEXTVAL_NEXTTOKE.ival = OP_LC;
4393                 else if (*s == 'U')
4394                     NEXTVAL_NEXTTOKE.ival = OP_UC;
4395                 else if (*s == 'Q')
4396                     NEXTVAL_NEXTTOKE.ival = OP_QUOTEMETA;
4397                 else if (*s == 'F')
4398                     NEXTVAL_NEXTTOKE.ival = OP_FC;
4399                 else
4400                     Perl_croak(aTHX_ "panic: yylex, *s=%u", *s);
4401                 PL_bufptr = s + 1;
4402             }
4403             force_next(FUNC);
4404             if (PL_lex_starts) {
4405                 s = PL_bufptr;
4406                 PL_lex_starts = 0;
4407                 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
4408                 if (PL_lex_casemods == 1 && PL_lex_inpat)
4409                     TOKEN(',');
4410                 else
4411                     AopNOASSIGN(OP_CONCAT);
4412             }
4413             else
4414                 return yylex();
4415         }
4416
4417     case LEX_INTERPPUSH:
4418         return REPORT(sublex_push());
4419
4420     case LEX_INTERPSTART:
4421         if (PL_bufptr == PL_bufend)
4422             return REPORT(sublex_done());
4423         DEBUG_T({ if(*PL_bufptr != '(') PerlIO_printf(Perl_debug_log,
4424               "### Interpolated variable\n"); });
4425         PL_expect = XTERM;
4426         /* for /@a/, we leave the joining for the regex engine to do
4427          * (unless we're within \Q etc) */
4428         PL_lex_dojoin = (*PL_bufptr == '@'
4429                             && (!PL_lex_inpat || PL_lex_casemods));
4430         PL_lex_state = LEX_INTERPNORMAL;
4431         if (PL_lex_dojoin) {
4432             NEXTVAL_NEXTTOKE.ival = 0;
4433             force_next(',');
4434             force_ident("\"", '$');
4435             NEXTVAL_NEXTTOKE.ival = 0;
4436             force_next('$');
4437             NEXTVAL_NEXTTOKE.ival = 0;
4438             force_next((2<<24)|'(');
4439             NEXTVAL_NEXTTOKE.ival = OP_JOIN;    /* emulate join($", ...) */
4440             force_next(FUNC);
4441         }
4442         /* Convert (?{...}) and friends to 'do {...}' */
4443         if (PL_lex_inpat && *PL_bufptr == '(') {
4444             PL_parser->lex_shared->re_eval_start = PL_bufptr;
4445             PL_bufptr += 2;
4446             if (*PL_bufptr != '{')
4447                 PL_bufptr++;
4448             PL_expect = XTERMBLOCK;
4449             force_next(DO);
4450         }
4451
4452         if (PL_lex_starts++) {
4453             s = PL_bufptr;
4454             /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
4455             if (!PL_lex_casemods && PL_lex_inpat)
4456                 TOKEN(',');
4457             else
4458                 AopNOASSIGN(OP_CONCAT);
4459         }
4460         return yylex();
4461
4462     case LEX_INTERPENDMAYBE:
4463         if (intuit_more(PL_bufptr)) {
4464             PL_lex_state = LEX_INTERPNORMAL;    /* false alarm, more expr */
4465             break;
4466         }
4467         /* FALLTHROUGH */
4468
4469     case LEX_INTERPEND:
4470         if (PL_lex_dojoin) {
4471             const U8 dojoin_was = PL_lex_dojoin;
4472             PL_lex_dojoin = FALSE;
4473             PL_lex_state = LEX_INTERPCONCAT;
4474             PL_lex_allbrackets--;
4475             return REPORT(dojoin_was == 1 ? ')' : POSTJOIN);
4476         }
4477         if (PL_lex_inwhat == OP_SUBST && PL_linestr == PL_lex_repl
4478             && SvEVALED(PL_lex_repl))
4479         {
4480             if (PL_bufptr != PL_bufend)
4481                 Perl_croak(aTHX_ "Bad evalled substitution pattern");
4482             PL_lex_repl = NULL;
4483         }
4484         /* Paranoia.  re_eval_start is adjusted when S_scan_heredoc sets
4485            re_eval_str.  If the here-doc body’s length equals the previous
4486            value of re_eval_start, re_eval_start will now be null.  So
4487            check re_eval_str as well. */
4488         if (PL_parser->lex_shared->re_eval_start
4489          || PL_parser->lex_shared->re_eval_str) {
4490             SV *sv;
4491             if (*PL_bufptr != ')')
4492                 Perl_croak(aTHX_ "Sequence (?{...}) not terminated with ')'");
4493             PL_bufptr++;
4494             /* having compiled a (?{..}) expression, return the original
4495              * text too, as a const */
4496             if (PL_parser->lex_shared->re_eval_str) {
4497                 sv = PL_parser->lex_shared->re_eval_str;
4498                 PL_parser->lex_shared->re_eval_str = NULL;
4499                 SvCUR_set(sv,
4500                          PL_bufptr - PL_parser->lex_shared->re_eval_start);
4501                 SvPV_shrink_to_cur(sv);
4502             }
4503             else sv = newSVpvn(PL_parser->lex_shared->re_eval_start,
4504                          PL_bufptr - PL_parser->lex_shared->re_eval_start);
4505             NEXTVAL_NEXTTOKE.opval =
4506                     (OP*)newSVOP(OP_CONST, 0,
4507                                  sv);
4508             force_next(THING);
4509             PL_parser->lex_shared->re_eval_start = NULL;
4510             PL_expect = XTERM;
4511             return REPORT(',');
4512         }
4513
4514         /* FALLTHROUGH */
4515     case LEX_INTERPCONCAT:
4516 #ifdef DEBUGGING
4517         if (PL_lex_brackets)
4518             Perl_croak(aTHX_ "panic: INTERPCONCAT, lex_brackets=%ld",
4519                        (long) PL_lex_brackets);
4520 #endif
4521         if (PL_bufptr == PL_bufend)
4522             return REPORT(sublex_done());
4523
4524         /* m'foo' still needs to be parsed for possible (?{...}) */
4525         if (SvIVX(PL_linestr) == '\'' && !PL_lex_inpat) {
4526             SV *sv = newSVsv(PL_linestr);
4527             sv = tokeq(sv);
4528             pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
4529             s = PL_bufend;
4530         }
4531         else {
4532             s = scan_const(PL_bufptr);
4533             if (*s == '\\')
4534                 PL_lex_state = LEX_INTERPCASEMOD;
4535             else
4536                 PL_lex_state = LEX_INTERPSTART;
4537         }
4538
4539         if (s != PL_bufptr) {
4540             NEXTVAL_NEXTTOKE = pl_yylval;
4541             PL_expect = XTERM;
4542             force_next(THING);
4543             if (PL_lex_starts++) {
4544                 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
4545                 if (!PL_lex_casemods && PL_lex_inpat)
4546                     TOKEN(',');
4547                 else
4548                     AopNOASSIGN(OP_CONCAT);
4549             }
4550             else {
4551                 PL_bufptr = s;
4552                 return yylex();
4553             }
4554         }
4555
4556         return yylex();
4557     case LEX_FORMLINE:
4558         s = scan_formline(PL_bufptr);
4559         if (!PL_lex_formbrack)
4560         {
4561             formbrack = 1;
4562             goto rightbracket;
4563         }
4564         PL_bufptr = s;
4565         return yylex();
4566     }
4567
4568     /* We really do *not* want PL_linestr ever becoming a COW. */
4569     assert (!SvIsCOW(PL_linestr));
4570     s = PL_bufptr;
4571     PL_oldoldbufptr = PL_oldbufptr;
4572     PL_oldbufptr = s;
4573     PL_parser->saw_infix_sigil = 0;
4574
4575   retry:
4576     switch (*s) {
4577     default:
4578         if (UTF ? isIDFIRST_utf8((U8*)s) : isALNUMC(*s))
4579             goto keylookup;
4580         {
4581         SV *dsv = newSVpvs_flags("", SVs_TEMP);
4582         const char *c = UTF ? sv_uni_display(dsv, newSVpvn_flags(s,
4583                                                     UTF8SKIP(s),
4584                                                     SVs_TEMP | SVf_UTF8),
4585                                             10, UNI_DISPLAY_ISPRINT)
4586                             : Perl_form(aTHX_ "\\x%02X", (unsigned char)*s);
4587         len = UTF ? Perl_utf8_length(aTHX_ (U8 *) PL_linestart, (U8 *) s) : (STRLEN) (s - PL_linestart);
4588         if (len > UNRECOGNIZED_PRECEDE_COUNT) {
4589             d = UTF ? (char *) utf8_hop((U8 *) s, -UNRECOGNIZED_PRECEDE_COUNT) : s - UNRECOGNIZED_PRECEDE_COUNT;
4590         } else {
4591             d = PL_linestart;
4592         }
4593         Perl_croak(aTHX_  "Unrecognized character %s; marked by <-- HERE after %"UTF8f"<-- HERE near column %d", c,
4594                           UTF8fARG(UTF, (s - d), d),
4595                          (int) len + 1);
4596     }
4597     case 4:
4598     case 26:
4599         goto fake_eof;                  /* emulate EOF on ^D or ^Z */
4600     case 0:
4601         if (!PL_rsfp && (!PL_parser->filtered || s+1 < PL_bufend)) {
4602             PL_last_uni = 0;
4603             PL_last_lop = 0;
4604             if (PL_lex_brackets &&
4605                     PL_lex_brackstack[PL_lex_brackets-1] != XFAKEEOF) {
4606                 yyerror((const char *)
4607                         (PL_lex_formbrack
4608                          ? "Format not terminated"
4609                          : "Missing right curly or square bracket"));
4610             }
4611             DEBUG_T( { PerlIO_printf(Perl_debug_log,
4612                         "### Tokener got EOF\n");
4613             } );
4614             TOKEN(0);
4615         }
4616         if (s++ < PL_bufend)
4617             goto retry;                 /* ignore stray nulls */
4618         PL_last_uni = 0;
4619         PL_last_lop = 0;
4620         if (!PL_in_eval && !PL_preambled) {
4621             PL_preambled = TRUE;
4622             if (PL_perldb) {
4623                 /* Generate a string of Perl code to load the debugger.
4624                  * If PERL5DB is set, it will return the contents of that,
4625                  * otherwise a compile-time require of perl5db.pl.  */
4626
4627                 const char * const pdb = PerlEnv_getenv("PERL5DB");
4628
4629                 if (pdb) {
4630                     sv_setpv(PL_linestr, pdb);
4631                     sv_catpvs(PL_linestr,";");
4632                 } else {
4633                     SETERRNO(0,SS_NORMAL);
4634                     sv_setpvs(PL_linestr, "BEGIN { require 'perl5db.pl' };");
4635                 }
4636                 PL_parser->preambling = CopLINE(PL_curcop);
4637             } else
4638                 sv_setpvs(PL_linestr,"");
4639             if (PL_preambleav) {
4640                 SV **svp = AvARRAY(PL_preambleav);
4641                 SV **const end = svp + AvFILLp(PL_preambleav);
4642                 while(svp <= end) {
4643                     sv_catsv(PL_linestr, *svp);
4644                     ++svp;
4645                     sv_catpvs(PL_linestr, ";");
4646                 }
4647                 sv_free(MUTABLE_SV(PL_preambleav));
4648                 PL_preambleav = NULL;
4649             }
4650             if (PL_minus_E)
4651                 sv_catpvs(PL_linestr,
4652                           "use feature ':5." STRINGIFY(PERL_VERSION) "';");
4653             if (PL_minus_n || PL_minus_p) {
4654                 sv_catpvs(PL_linestr, "LINE: while (<>) {"/*}*/);
4655                 if (PL_minus_l)
4656                     sv_catpvs(PL_linestr,"chomp;");
4657                 if (PL_minus_a) {
4658                     if (PL_minus_F) {
4659                         if ((*PL_splitstr == '/' || *PL_splitstr == '\''
4660                              || *PL_splitstr == '"')
4661                               && strchr(PL_splitstr + 1, *PL_splitstr))
4662                             Perl_sv_catpvf(aTHX_ PL_linestr, "our @F=split(%s);", PL_splitstr);
4663                         else {
4664                             /* "q\0${splitstr}\0" is legal perl. Yes, even NUL
4665                                bytes can be used as quoting characters.  :-) */
4666                             const char *splits = PL_splitstr;
4667                             sv_catpvs(PL_linestr, "our @F=split(q\0");
4668                             do {
4669                                 /* Need to \ \s  */
4670                                 if (*splits == '\\')
4671                                     sv_catpvn(PL_linestr, splits, 1);
4672                                 sv_catpvn(PL_linestr, splits, 1);
4673                             } while (*splits++);
4674                             /* This loop will embed the trailing NUL of
4675                                PL_linestr as the last thing it does before
4676                                terminating.  */
4677                             sv_catpvs(PL_linestr, ");");
4678                         }
4679                     }
4680                     else
4681                         sv_catpvs(PL_linestr,"our @F=split(' ');");
4682                 }
4683             }
4684             sv_catpvs(PL_linestr, "\n");
4685             PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
4686             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4687             PL_last_lop = PL_last_uni = NULL;
4688             if ((PERLDB_LINE || PERLDB_SAVESRC) && PL_curstash != PL_debstash)
4689                 update_debugger_info(PL_linestr, NULL, 0);
4690             goto retry;
4691         }
4692         do {
4693             fake_eof = 0;
4694             bof = PL_rsfp ? TRUE : FALSE;
4695             if (0) {
4696               fake_eof:
4697                 fake_eof = LEX_FAKE_EOF;
4698             }
4699             PL_bufptr = PL_bufend;
4700             COPLINE_INC_WITH_HERELINES;
4701             if (!lex_next_chunk(fake_eof)) {
4702                 CopLINE_dec(PL_curcop);
4703                 s = PL_bufptr;
4704                 TOKEN(';');     /* not infinite loop because rsfp is NULL now */
4705             }
4706             CopLINE_dec(PL_curcop);
4707             s = PL_bufptr;
4708             /* If it looks like the start of a BOM or raw UTF-16,
4709              * check if it in fact is. */
4710             if (bof && PL_rsfp &&
4711                      (*s == 0 ||
4712                       *(U8*)s == BOM_UTF8_FIRST_BYTE ||
4713                       *(U8*)s >= 0xFE ||
4714                       s[1] == 0)) {
4715                 Off_t offset = (IV)PerlIO_tell(PL_rsfp);
4716                 bof = (offset == (Off_t)SvCUR(PL_linestr));
4717 #if defined(PERLIO_USING_CRLF) && defined(PERL_TEXTMODE_SCRIPTS)
4718                 /* offset may include swallowed CR */
4719                 if (!bof)
4720                     bof = (offset == (Off_t)SvCUR(PL_linestr)+1);
4721 #endif
4722                 if (bof) {
4723                     PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4724                     s = swallow_bom((U8*)s);
4725                 }
4726             }
4727             if (PL_parser->in_pod) {
4728                 /* Incest with pod. */
4729                 if (*s == '=' && strnEQ(s, "=cut", 4) && !isALPHA(s[4])) {
4730                     sv_setpvs(PL_linestr, "");
4731                     PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
4732                     PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4733                     PL_last_lop = PL_last_uni = NULL;
4734                     PL_parser->in_pod = 0;
4735                 }
4736             }
4737             if (PL_rsfp || PL_parser->filtered)
4738                 incline(s);
4739         } while (PL_parser->in_pod);
4740         PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = s;
4741         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4742         PL_last_lop = PL_last_uni = NULL;
4743         if (CopLINE(PL_curcop) == 1) {
4744             while (s < PL_bufend && isSPACE(*s))
4745                 s++;
4746             if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
4747                 s++;
4748             d = NULL;
4749             if (!PL_in_eval) {
4750                 if (*s == '#' && *(s+1) == '!')
4751                     d = s + 2;
4752 #ifdef ALTERNATE_SHEBANG
4753                 else {
4754                     static char const as[] = ALTERNATE_SHEBANG;
4755                     if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
4756                         d = s + (sizeof(as) - 1);
4757                 }
4758 #endif /* ALTERNATE_SHEBANG */
4759             }
4760             if (d) {
4761                 char *ipath;
4762                 char *ipathend;
4763
4764                 while (isSPACE(*d))
4765                     d++;
4766                 ipath = d;
4767                 while (*d && !isSPACE(*d))
4768                     d++;
4769                 ipathend = d;
4770
4771 #ifdef ARG_ZERO_IS_SCRIPT
4772                 if (ipathend > ipath) {
4773                     /*
4774                      * HP-UX (at least) sets argv[0] to the script name,
4775                      * which makes $^X incorrect.  And Digital UNIX and Linux,
4776                      * at least, set argv[0] to the basename of the Perl
4777                      * interpreter. So, having found "#!", we'll set it right.
4778                      */
4779                     SV* copfilesv = CopFILESV(PL_curcop);
4780                     if (copfilesv) {
4781                         SV * const x =
4782                             GvSV(gv_fetchpvs("\030", GV_ADD|GV_NOTQUAL,
4783                                              SVt_PV)); /* $^X */
4784                         assert(SvPOK(x) || SvGMAGICAL(x));
4785                         if (sv_eq(x, copfilesv)) {
4786                             sv_setpvn(x, ipath, ipathend - ipath);
4787                             SvSETMAGIC(x);
4788                         }
4789                         else {
4790                             STRLEN blen;
4791                             STRLEN llen;
4792                             const char *bstart = SvPV_const(copfilesv, blen);
4793                             const char * const lstart = SvPV_const(x, llen);
4794                             if (llen < blen) {
4795                                 bstart += blen - llen;
4796                                 if (strnEQ(bstart, lstart, llen) &&     bstart[-1] == '/') {
4797                                     sv_setpvn(x, ipath, ipathend - ipath);
4798                                     SvSETMAGIC(x);
4799                                 }
4800                             }
4801                         }
4802                     }
4803                     else {
4804                         /* Anything to do if no copfilesv? */
4805                     }
4806                     TAINT_NOT;  /* $^X is always tainted, but that's OK */
4807                 }
4808 #endif /* ARG_ZERO_IS_SCRIPT */
4809
4810                 /*
4811                  * Look for options.
4812                  */
4813                 d = instr(s,"perl -");
4814                 if (!d) {
4815                     d = instr(s,"perl");
4816 #if defined(DOSISH)
4817                     /* avoid getting into infinite loops when shebang
4818                      * line contains "Perl" rather than "perl" */
4819                     if (!d) {
4820                         for (d = ipathend-4; d >= ipath; --d) {
4821                             if (isALPHA_FOLD_EQ(*d, 'p')
4822                                 && !ibcmp(d, "perl", 4))
4823                             {
4824                                 break;
4825                             }
4826                         }
4827                         if (d < ipath)
4828                             d = NULL;
4829                     }
4830 #endif
4831                 }
4832 #ifdef ALTERNATE_SHEBANG
4833                 /*
4834                  * If the ALTERNATE_SHEBANG on this system starts with a
4835                  * character that can be part of a Perl expression, then if
4836                  * we see it but not "perl", we're probably looking at the
4837                  * start of Perl code, not a request to hand off to some
4838                  * other interpreter.  Similarly, if "perl" is there, but
4839                  * not in the first 'word' of the line, we assume the line
4840                  * contains the start of the Perl program.
4841                  */
4842                 if (d && *s != '#') {
4843                     const char *c = ipath;
4844                     while (*c && !strchr("; \t\r\n\f\v#", *c))
4845                         c++;
4846                     if (c < d)
4847                         d = NULL;       /* "perl" not in first word; ignore */
4848                     else
4849                         *s = '#';       /* Don't try to parse shebang line */
4850                 }
4851 #endif /* ALTERNATE_SHEBANG */
4852                 if (!d &&
4853                     *s == '#' &&
4854                     ipathend > ipath &&
4855                     !PL_minus_c &&
4856                     !instr(s,"indir") &&
4857                     instr(PL_origargv[0],"perl"))
4858                 {
4859                     dVAR;
4860                     char **newargv;
4861
4862                     *ipathend = '\0';
4863                     s = ipathend + 1;
4864                     while (s < PL_bufend && isSPACE(*s))
4865                         s++;
4866                     if (s < PL_bufend) {
4867                         Newx(newargv,PL_origargc+3,char*);
4868                         newargv[1] = s;
4869                         while (s < PL_bufend && !isSPACE(*s))
4870                             s++;
4871                         *s = '\0';
4872                         Copy(PL_origargv+1, newargv+2, PL_origargc+1, char*);
4873                     }
4874                     else
4875                         newargv = PL_origargv;
4876                     newargv[0] = ipath;
4877                     PERL_FPU_PRE_EXEC
4878                     PerlProc_execv(ipath, EXEC_ARGV_CAST(newargv));
4879                     PERL_FPU_POST_EXEC
4880                     Perl_croak(aTHX_ "Can't exec %s", ipath);
4881                 }
4882                 if (d) {
4883                     while (*d && !isSPACE(*d))
4884                         d++;
4885                     while (SPACE_OR_TAB(*d))
4886                         d++;
4887
4888                     if (*d++ == '-') {
4889                         const bool switches_done = PL_doswitches;
4890                         const U32 oldpdb = PL_perldb;
4891                         const bool oldn = PL_minus_n;
4892                         const bool oldp = PL_minus_p;
4893                         const char *d1 = d;
4894
4895                         do {
4896                             bool baduni = FALSE;
4897                             if (*d1 == 'C') {
4898                                 const char *d2 = d1 + 1;
4899                                 if (parse_unicode_opts((const char **)&d2)
4900                                     != PL_unicode)
4901                                     baduni = TRUE;
4902                             }
4903                             if (baduni || isALPHA_FOLD_EQ(*d1, 'M')) {
4904                                 const char * const m = d1;
4905                                 while (*d1 && !isSPACE(*d1))
4906                                     d1++;
4907                                 Perl_croak(aTHX_ "Too late for \"-%.*s\" option",
4908                                       (int)(d1 - m), m);
4909                             }
4910                             d1 = moreswitches(d1);
4911                         } while (d1);
4912                         if (PL_doswitches && !switches_done) {
4913                             int argc = PL_origargc;
4914                             char **argv = PL_origargv;
4915                             do {
4916                                 argc--,argv++;
4917                             } while (argc && argv[0][0] == '-' && argv[0][1]);
4918                             init_argv_symbols(argc,argv);
4919                         }
4920                         if (((PERLDB_LINE || PERLDB_SAVESRC) && !oldpdb) ||
4921                             ((PL_minus_n || PL_minus_p) && !(oldn || oldp)))
4922                               /* if we have already added "LINE: while (<>) {",
4923                                  we must not do it again */
4924                         {
4925                             sv_setpvs(PL_linestr, "");
4926                             PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
4927                             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4928                             PL_last_lop = PL_last_uni = NULL;
4929                             PL_preambled = FALSE;
4930                             if (PERLDB_LINE || PERLDB_SAVESRC)
4931                                 (void)gv_fetchfile(PL_origfilename);
4932                             goto retry;
4933                         }
4934                     }
4935                 }
4936             }
4937         }
4938         if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
4939             PL_lex_state = LEX_FORMLINE;
4940             NEXTVAL_NEXTTOKE.ival = 0;
4941             force_next(FORMRBRACK);
4942             TOKEN(';');
4943         }
4944         goto retry;
4945     case '\r':
4946 #ifdef PERL_STRICT_CR
4947         Perl_warn(aTHX_ "Illegal character \\%03o (carriage return)", '\r');
4948         Perl_croak(aTHX_
4949       "\t(Maybe you didn't strip carriage returns after a network transfer?)\n");
4950 #endif
4951     case ' ': case '\t': case '\f': case 013:
4952         s++;
4953         goto retry;
4954     case '#':
4955     case '\n':
4956         if (PL_lex_state != LEX_NORMAL ||
4957              (PL_in_eval && !PL_rsfp && !PL_parser->filtered)) {
4958             const bool in_comment = *s == '#';
4959             if (*s == '#' && s == PL_linestart && PL_in_eval
4960              && !PL_rsfp && !PL_parser->filtered) {
4961                 /* handle eval qq[#line 1 "foo"\n ...] */
4962                 CopLINE_dec(PL_curcop);
4963                 incline(s);
4964             }
4965             d = s;
4966             while (d < PL_bufend && *d != '\n')
4967                 d++;
4968             if (d < PL_bufend)
4969                 d++;
4970             else if (d > PL_bufend)
4971                 /* Found by Ilya: feed random input to Perl. */
4972                 Perl_croak(aTHX_ "panic: input overflow, %p > %p",
4973                            d, PL_bufend);
4974             s = d;
4975             if (in_comment && d == PL_bufend
4976                 && PL_lex_state == LEX_INTERPNORMAL
4977                 && PL_lex_inwhat == OP_SUBST && PL_lex_repl == PL_linestr
4978                 && SvEVALED(PL_lex_repl) && d[-1] == '}') s--;
4979             else
4980                 incline(s);
4981             if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
4982                 PL_lex_state = LEX_FORMLINE;
4983                 NEXTVAL_NEXTTOKE.ival = 0;
4984                 force_next(FORMRBRACK);
4985                 TOKEN(';');
4986             }
4987         }
4988         else {
4989             while (s < PL_bufend && *s != '\n')
4990                 s++;
4991             if (s < PL_bufend)
4992                 {
4993                     s++;
4994                     if (s < PL_bufend)
4995                         incline(s);
4996                 }
4997             else if (s > PL_bufend)
4998                 /* Found by Ilya: feed random input to Perl. */
4999                 Perl_croak(aTHX_ "panic: input overflow");
5000         }
5001         goto retry;
5002     case '-':
5003         if (s[1] && isALPHA(s[1]) && !isWORDCHAR(s[2])) {
5004             I32 ftst = 0;
5005             char tmp;
5006
5007             s++;
5008             PL_bufptr = s;
5009             tmp = *s++;
5010
5011             while (s < PL_bufend && SPACE_OR_TAB(*s))
5012                 s++;
5013
5014             if (strnEQ(s,"=>",2)) {
5015                 s = force_word(PL_bufptr,WORD,FALSE,FALSE);
5016                 DEBUG_T( { printbuf("### Saw unary minus before =>, forcing word %s\n", s); } );
5017                 OPERATOR('-');          /* unary minus */
5018             }
5019             switch (tmp) {
5020             case 'r': ftst = OP_FTEREAD;        break;
5021             case 'w': ftst = OP_FTEWRITE;       break;
5022             case 'x': ftst = OP_FTEEXEC;        break;
5023             case 'o': ftst = OP_FTEOWNED;       break;
5024             case 'R': ftst = OP_FTRREAD;        break;
5025             case 'W': ftst = OP_FTRWRITE;       break;
5026             case 'X': ftst = OP_FTREXEC;        break;
5027             case 'O': ftst = OP_FTROWNED;       break;
5028             case 'e': ftst = OP_FTIS;           break;
5029             case 'z': ftst = OP_FTZERO;         break;
5030             case 's': ftst = OP_FTSIZE;         break;
5031             case 'f': ftst = OP_FTFILE;         break;
5032             case 'd': ftst = OP_FTDIR;          break;
5033             case 'l': ftst = OP_FTLINK;         break;
5034             case 'p': ftst = OP_FTPIPE;         break;
5035             case 'S': ftst = OP_FTSOCK;         break;
5036             case 'u': ftst = OP_FTSUID;         break;
5037             case 'g': ftst = OP_FTSGID;         break;
5038             case 'k': ftst = OP_FTSVTX;         break;
5039             case 'b': ftst = OP_FTBLK;          break;
5040             case 'c': ftst = OP_FTCHR;          break;
5041             case 't': ftst = OP_FTTTY;          break;
5042             case 'T': ftst = OP_FTTEXT;         break;
5043             case 'B': ftst = OP_FTBINARY;       break;
5044             case 'M': case 'A': case 'C':
5045                 gv_fetchpvs("\024", GV_ADD|GV_NOTQUAL, SVt_PV);
5046                 switch (tmp) {
5047                 case 'M': ftst = OP_FTMTIME;    break;
5048                 case 'A': ftst = OP_FTATIME;    break;
5049                 case 'C': ftst = OP_FTCTIME;    break;
5050                 default:                        break;
5051                 }
5052                 break;
5053             default:
5054                 break;
5055             }
5056             if (ftst) {
5057                 PL_last_uni = PL_oldbufptr;
5058                 PL_last_lop_op = (OPCODE)ftst;
5059                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
5060                         "### Saw file test %c\n", (int)tmp);
5061                 } );
5062                 FTST(ftst);
5063             }
5064             else {
5065                 /* Assume it was a minus followed by a one-letter named
5066                  * subroutine call (or a -bareword), then. */
5067                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
5068                         "### '-%c' looked like a file test but was not\n",
5069                         (int) tmp);
5070                 } );
5071                 s = --PL_bufptr;
5072             }
5073         }
5074         {
5075             const char tmp = *s++;
5076             if (*s == tmp) {
5077                 s++;
5078                 if (PL_expect == XOPERATOR)
5079                     TERM(POSTDEC);
5080                 else
5081                     OPERATOR(PREDEC);
5082             }
5083             else if (*s == '>') {
5084                 s++;
5085                 s = skipspace(s);
5086                 if (FEATURE_POSTDEREF_IS_ENABLED && (
5087                     ((*s == '$' || *s == '&') && s[1] == '*')
5088                   ||(*s == '$' && s[1] == '#' && s[2] == '*')
5089                   ||((*s == '@' || *s == '%') && strchr("*[{", s[1]))
5090                   ||(*s == '*' && (s[1] == '*' || s[1] == '{'))
5091                  ))
5092                 {
5093                     Perl_ck_warner_d(aTHX_
5094                         packWARN(WARN_EXPERIMENTAL__POSTDEREF),
5095                         "Postfix dereference is experimental"
5096                     );
5097                     PL_expect = XPOSTDEREF;
5098                     TOKEN(ARROW);
5099                 }
5100                 if (isIDFIRST_lazy_if(s,UTF)) {
5101                     s = force_word(s,METHOD,FALSE,TRUE);
5102                     TOKEN(ARROW);
5103                 }
5104                 else if (*s == '$')
5105                     OPERATOR(ARROW);
5106                 else
5107                     TERM(ARROW);
5108             }
5109             if (PL_expect == XOPERATOR) {
5110                 if (*s == '=' && !PL_lex_allbrackets &&
5111                         PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) {
5112                     s--;
5113                     TOKEN(0);
5114                 }
5115                 Aop(OP_SUBTRACT);
5116             }
5117             else {
5118                 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
5119                     check_uni();
5120                 OPERATOR('-');          /* unary minus */
5121             }
5122         }
5123
5124     case '+':
5125         {
5126             const char tmp = *s++;
5127             if (*s == tmp) {
5128                 s++;
5129                 if (PL_expect == XOPERATOR)
5130                     TERM(POSTINC);
5131                 else
5132                     OPERATOR(PREINC);
5133             }
5134             if (PL_expect == XOPERATOR) {
5135                 if (*s == '=' && !PL_lex_allbrackets &&
5136                         PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) {
5137                     s--;
5138                     TOKEN(0);
5139                 }
5140                 Aop(OP_ADD);
5141             }
5142             else {
5143                 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
5144                     check_uni();
5145                 OPERATOR('+');
5146             }
5147         }
5148
5149     case '*':
5150         if (PL_expect == XPOSTDEREF) POSTDEREF('*');
5151         if (PL_expect != XOPERATOR) {
5152             s = scan_ident(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
5153             PL_expect = XOPERATOR;
5154             force_ident(PL_tokenbuf, '*');
5155             if (!*PL_tokenbuf)
5156                 PREREF('*');
5157             TERM('*');
5158         }
5159         s++;
5160         if (*s == '*') {
5161             s++;
5162             if (*s == '=' && !PL_lex_allbrackets &&
5163                     PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) {
5164                 s -= 2;
5165                 TOKEN(0);
5166             }
5167             PWop(OP_POW);
5168         }
5169         if (*s == '=' && !PL_lex_allbrackets &&
5170                 PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) {
5171             s--;
5172             TOKEN(0);
5173         }
5174         PL_parser->saw_infix_sigil = 1;
5175         Mop(OP_MULTIPLY);
5176
5177     case '%':
5178     {
5179         if (PL_expect == XOPERATOR) {
5180             if (s[1] == '=' && !PL_lex_allbrackets &&
5181                     PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN)
5182                 TOKEN(0);
5183             ++s;
5184             PL_parser->saw_infix_sigil = 1;
5185             Mop(OP_MODULO);
5186         }
5187         else if (PL_expect == XPOSTDEREF) POSTDEREF('%');
5188         PL_tokenbuf[0] = '%';
5189         s = scan_ident(s, PL_tokenbuf + 1,
5190                 sizeof PL_tokenbuf - 1, FALSE);
5191         pl_yylval.ival = 0;
5192         if (!PL_tokenbuf[1]) {
5193             PREREF('%');
5194         }
5195         if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
5196             if (*s == '[')
5197                 PL_tokenbuf[0] = '@';
5198         }
5199         PL_expect = XOPERATOR;
5200         force_ident_maybe_lex('%');
5201         TERM('%');
5202     }
5203     case '^':
5204         if (!PL_lex_allbrackets && PL_lex_fakeeof >=
5205                 (s[1] == '=' ? LEX_FAKEEOF_ASSIGN : LEX_FAKEEOF_BITWISE))
5206             TOKEN(0);
5207         s++;
5208         BOop(OP_BIT_XOR);
5209     case '[':
5210         if (PL_lex_brackets > 100)
5211             Renew(PL_lex_brackstack, PL_lex_brackets + 10, char);
5212         PL_lex_brackstack[PL_lex_brackets++] = 0;
5213         PL_lex_allbrackets++;
5214         {
5215             const char tmp = *s++;
5216             OPERATOR(tmp);
5217         }
5218     case '~':
5219         if (s[1] == '~'
5220             && (PL_expect == XOPERATOR || PL_expect == XTERMORDORDOR))
5221         {
5222             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE)
5223                 TOKEN(0);
5224             s += 2;
5225             Perl_ck_warner_d(aTHX_
5226                 packWARN(WARN_EXPERIMENTAL__SMARTMATCH),
5227                 "Smartmatch is experimental");
5228             Eop(OP_SMARTMATCH);
5229         }
5230         s++;
5231         OPERATOR('~');
5232     case ',':
5233         if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMMA)
5234             TOKEN(0);
5235         s++;
5236         OPERATOR(',');
5237     case ':':
5238         if (s[1] == ':') {
5239             len = 0;
5240             goto just_a_word_zero_gv;
5241         }
5242         s++;
5243         {
5244         OP *attrs;
5245
5246         switch (PL_expect) {
5247         case XOPERATOR:
5248             if (!PL_in_my || PL_lex_state != LEX_NORMAL)
5249                 break;
5250             PL_bufptr = s;      /* update in case we back off */
5251             if (*s == '=') {
5252                 Perl_croak(aTHX_
5253                            "Use of := for an empty attribute list is not allowed");
5254             }
5255             goto grabattrs;
5256         case XATTRBLOCK:
5257             PL_expect = XBLOCK;
5258             goto grabattrs;
5259         case XATTRTERM:
5260             PL_expect = XTERMBLOCK;
5261          grabattrs:
5262             s = skipspace(s);
5263             attrs = NULL;
5264             while (isIDFIRST_lazy_if(s,UTF)) {
5265                 I32 tmp;
5266                 SV *sv;
5267                 d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
5268                 if (isLOWER(*s) && (tmp = keyword(PL_tokenbuf, len, 0))) {
5269                     if (tmp < 0) tmp = -tmp;
5270                     switch (tmp) {
5271                     case KEY_or:
5272                     case KEY_and:
5273                     case KEY_for:
5274                     case KEY_foreach:
5275                     case KEY_unless:
5276                     case KEY_if:
5277                     case KEY_while:
5278                     case KEY_until:
5279                         goto got_attrs;
5280                     default:
5281                         break;
5282                     }
5283                 }
5284                 sv = newSVpvn_flags(s, len, UTF ? SVf_UTF8 : 0);
5285                 if (*d == '(') {
5286                     d = scan_str(d,TRUE,TRUE,FALSE,NULL);
5287                     COPLINE_SET_FROM_MULTI_END;
5288                     if (!d) {
5289                         /* MUST advance bufptr here to avoid bogus
5290                            "at end of line" context messages from yyerror().
5291                          */
5292                         PL_bufptr = s + len;
5293                         yyerror("Unterminated attribute parameter in attribute list");
5294                         if (attrs)
5295                             op_free(attrs);
5296                         sv_free(sv);
5297                         return REPORT(0);       /* EOF indicator */
5298                     }
5299                 }
5300                 if (PL_lex_stuff) {
5301                     sv_catsv(sv, PL_lex_stuff);
5302                     attrs = op_append_elem(OP_LIST, attrs,
5303                                         newSVOP(OP_CONST, 0, sv));
5304                     SvREFCNT_dec(PL_lex_stuff);
5305                     PL_lex_stuff = NULL;
5306                 }
5307                 else {
5308                     if (len == 6 && strnEQ(SvPVX(sv), "unique", len)) {
5309                         sv_free(sv);
5310                         if (PL_in_my == KEY_our) {
5311                             deprecate(":unique");
5312                         }
5313                         else
5314                             Perl_croak(aTHX_ "The 'unique' attribute may only be applied to 'our' variables");
5315                     }
5316
5317                     /* NOTE: any CV attrs applied here need to be part of
5318                        the CVf_BUILTIN_ATTRS define in cv.h! */
5319                     else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "lvalue", len)) {
5320                         sv_free(sv);
5321                         CvLVALUE_on(PL_compcv);
5322                     }
5323                     else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "locked", len)) {
5324                         sv_free(sv);
5325                         deprecate(":locked");
5326                     }
5327                     else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "method", len)) {
5328                         sv_free(sv);
5329                         CvMETHOD_on(PL_compcv);
5330                     }
5331                     /* After we've set the flags, it could be argued that
5332                        we don't need to do the attributes.pm-based setting
5333                        process, and shouldn't bother appending recognized
5334                        flags.  To experiment with that, uncomment the
5335                        following "else".  (Note that's already been
5336                        uncommented.  That keeps the above-applied built-in
5337                        attributes from being intercepted (and possibly
5338                        rejected) by a package's attribute routines, but is
5339                        justified by the performance win for the common case
5340                        of applying only built-in attributes.) */
5341                     else
5342                         attrs = op_append_elem(OP_LIST, attrs,
5343                                             newSVOP(OP_CONST, 0,
5344                                                     sv));
5345                 }
5346                 s = skipspace(d);
5347                 if (*s == ':' && s[1] != ':')
5348                     s = skipspace(s+1);
5349                 else if (s == d)
5350                     break;      /* require real whitespace or :'s */
5351                 /* XXX losing whitespace on sequential attributes here */
5352             }
5353             {
5354                 if (*s != ';' && *s != '}' &&
5355                     !(PL_expect == XOPERATOR
5356                         ? (*s == '=' ||  *s == ')')
5357                         : (*s == '{' ||  *s == '('))) {
5358                     const char q = ((*s == '\'') ? '"' : '\'');
5359                     /* If here for an expression, and parsed no attrs, back
5360                        off. */
5361                     if (PL_expect == XOPERATOR && !attrs) {
5362                         s = PL_bufptr;
5363                         break;
5364                     }
5365                     /* MUST advance bufptr here to avoid bogus "at end of line"
5366                        context messages from yyerror().
5367                     */
5368                     PL_bufptr = s;
5369                     yyerror( (const char *)
5370                              (*s
5371                               ? Perl_form(aTHX_ "Invalid separator character "
5372                                           "%c%c%c in attribute list", q, *s, q)
5373                               : "Unterminated attribute list" ) );
5374                     if (attrs)
5375                         op_free(attrs);
5376                     OPERATOR(':');
5377                 }
5378             }
5379         got_attrs:
5380             if (attrs) {
5381                 NEXTVAL_NEXTTOKE.opval = attrs;
5382                 force_next(THING);
5383             }
5384             TOKEN(COLONATTR);
5385         }
5386         }
5387         if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_CLOSING) {
5388             s--;
5389             TOKEN(0);
5390         }
5391         PL_lex_allbrackets--;
5392         OPERATOR(':');
5393     case '(':
5394         s++;
5395         if (PL_last_lop == PL_oldoldbufptr || PL_last_uni == PL_oldoldbufptr)
5396             PL_oldbufptr = PL_oldoldbufptr;             /* allow print(STDOUT 123) */
5397         else
5398             PL_expect = XTERM;
5399         s = skipspace(s);
5400         PL_lex_allbrackets++;
5401         TOKEN('(');
5402     case ';':
5403         if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR)
5404             TOKEN(0);
5405         CLINE;
5406         s++;
5407         PL_expect = XSTATE;
5408         TOKEN(';');
5409     case ')':
5410         if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_CLOSING)
5411             TOKEN(0);
5412         s++;
5413         PL_lex_allbrackets--;
5414         s = skipspace(s);
5415         if (*s == '{')
5416             PREBLOCK(')');
5417         TERM(')');
5418     case ']':
5419         if (PL_lex_brackets && PL_lex_brackstack[PL_lex_brackets-1] == XFAKEEOF)
5420             TOKEN(0);
5421         s++;
5422         if (PL_lex_brackets <= 0)
5423             /* diag_listed_as: Unmatched right %s bracket */
5424             yyerror("Unmatched right square bracket");
5425         else
5426             --PL_lex_brackets;
5427         PL_lex_allbrackets--;
5428         if (PL_lex_state == LEX_INTERPNORMAL) {
5429             if (PL_lex_brackets == 0) {
5430                 if (*s == '-' && s[1] == '>')
5431                     PL_lex_state = LEX_INTERPENDMAYBE;
5432                 else if (*s != '[' && *s != '{')
5433                     PL_lex_state = LEX_INTERPEND;
5434             }
5435         }
5436         TERM(']');
5437     case '{':
5438         s++;
5439       leftbracket:
5440         if (PL_lex_brackets > 100) {
5441             Renew(PL_lex_brackstack, PL_lex_brackets + 10, char);
5442         }
5443         switch (PL_expect) {
5444         case XTERM:
5445             PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
5446             PL_lex_allbrackets++;
5447             OPERATOR(HASHBRACK);
5448         case XOPERATOR:
5449             while (s < PL_bufend && SPACE_OR_TAB(*s))
5450                 s++;
5451             d = s;
5452             PL_tokenbuf[0] = '\0';
5453             if (d < PL_bufend && *d == '-') {
5454                 PL_tokenbuf[0] = '-';
5455                 d++;
5456                 while (d < PL_bufend && SPACE_OR_TAB(*d))
5457                     d++;
5458             }
5459             if (d < PL_bufend && isIDFIRST_lazy_if(d,UTF)) {
5460                 d = scan_word(d, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
5461                               FALSE, &len);
5462                 while (d < PL_bufend && SPACE_OR_TAB(*d))
5463                     d++;
5464                 if (*d == '}') {
5465                     const char minus = (PL_tokenbuf[0] == '-');
5466                     s = force_word(s + minus, WORD, FALSE, TRUE);
5467                     if (minus)
5468                         force_next('-');
5469                 }
5470             }
5471             /* FALLTHROUGH */
5472         case XATTRTERM:
5473         case XTERMBLOCK:
5474             PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
5475             PL_lex_allbrackets++;
5476             PL_expect = XSTATE;
5477             break;
5478         case XATTRBLOCK:
5479         case XBLOCK:
5480             PL_lex_brackstack[PL_lex_brackets++] = XSTATE;
5481             PL_lex_allbrackets++;
5482             PL_expect = XSTATE;
5483             break;
5484         case XBLOCKTERM:
5485             PL_lex_brackstack[PL_lex_brackets++] = XTERM;
5486             PL_lex_allbrackets++;
5487             PL_expect = XSTATE;
5488             break;
5489         default: {
5490                 const char *t;
5491                 if (PL_oldoldbufptr == PL_last_lop)
5492                     PL_lex_brackstack[PL_lex_brackets++] = XTERM;
5493                 else
5494                     PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
5495                 PL_lex_allbrackets++;
5496                 s = skipspace(s);
5497                 if (*s == '}') {
5498                     if (PL_expect == XREF && PL_lex_state == LEX_INTERPNORMAL) {
5499                         PL_expect = XTERM;
5500                         /* This hack is to get the ${} in the message. */
5501                         PL_bufptr = s+1;
5502                         yyerror("syntax error");
5503                         break;
5504                     }
5505                     OPERATOR(HASHBRACK);
5506                 }
5507                 if (PL_expect == XREF && PL_oldoldbufptr != PL_last_lop) {
5508                     /* ${...} or @{...} etc., but not print {...}
5509                      * Skip the disambiguation and treat this as a block.
5510                      */
5511                     goto block_expectation;
5512                 }
5513                 /* This hack serves to disambiguate a pair of curlies
5514                  * as being a block or an anon hash.  Normally, expectation
5515                  * determines that, but in cases where we're not in a
5516                  * position to expect anything in particular (like inside
5517                  * eval"") we have to resolve the ambiguity.  This code
5518                  * covers the case where the first term in the curlies is a
5519                  * quoted string.  Most other cases need to be explicitly
5520                  * disambiguated by prepending a "+" before the opening
5521                  * curly in order to force resolution as an anon hash.
5522                  *
5523                  * XXX should probably propagate the outer expectation
5524                  * into eval"" to rely less on this hack, but that could
5525                  * potentially break current behavior of eval"".
5526                  * GSAR 97-07-21
5527                  */
5528                 t = s;
5529                 if (*s == '\'' || *s == '"' || *s == '`') {
5530                     /* common case: get past first string, handling escapes */
5531                     for (t++; t < PL_bufend && *t != *s;)
5532                         if (*t++ == '\\')
5533                             t++;
5534                     t++;
5535                 }
5536                 else if (*s == 'q') {
5537                     if (++t < PL_bufend
5538                         && (!isWORDCHAR(*t)
5539                             || ((*t == 'q' || *t == 'x') && ++t < PL_bufend
5540                                 && !isWORDCHAR(*t))))
5541                     {
5542                         /* skip q//-like construct */
5543                         const char *tmps;
5544                         char open, close, term;
5545                         I32 brackets = 1;
5546
5547                         while (t < PL_bufend && isSPACE(*t))
5548                             t++;
5549                         /* check for q => */
5550                         if (t+1 < PL_bufend && t[0] == '=' && t[1] == '>') {
5551                             OPERATOR(HASHBRACK);
5552                         }
5553                         term = *t;
5554                         open = term;
5555                         if (term && (tmps = strchr("([{< )]}> )]}>",term)))
5556                             term = tmps[5];
5557                         close = term;
5558                         if (open == close)
5559                             for (t++; t < PL_bufend; t++) {
5560                                 if (*t == '\\' && t+1 < PL_bufend && open != '\\')
5561                                     t++;
5562                                 else if (*t == open)
5563                                     break;
5564                             }
5565                         else {
5566                             for (t++; t < PL_bufend; t++) {
5567                                 if (*t == '\\' && t+1 < PL_bufend)
5568                                     t++;
5569                                 else if (*t == close && --brackets <= 0)
5570                                     break;
5571                                 else if (*t == open)
5572                                     brackets++;
5573                             }
5574                         }
5575                         t++;
5576                     }
5577                     else
5578                         /* skip plain q word */
5579                         while (t < PL_bufend && isWORDCHAR_lazy_if(t,UTF))
5580                              t += UTF8SKIP(t);
5581                 }
5582                 else if (isWORDCHAR_lazy_if(t,UTF)) {
5583                     t += UTF8SKIP(t);
5584                     while (t < PL_bufend && isWORDCHAR_lazy_if(t,UTF))
5585                          t += UTF8SKIP(t);
5586                 }
5587                 while (t < PL_bufend && isSPACE(*t))
5588                     t++;
5589                 /* if comma follows first term, call it an anon hash */
5590                 /* XXX it could be a comma expression with loop modifiers */
5591                 if (t < PL_bufend && ((*t == ',' && (*s == 'q' || !isLOWER(*s)))
5592                                    || (*t == '=' && t[1] == '>')))
5593                     OPERATOR(HASHBRACK);
5594                 if (PL_expect == XREF)
5595                 {
5596                   block_expectation:
5597                     /* If there is an opening brace or 'sub:', treat it
5598                        as a term to make ${{...}}{k} and &{sub:attr...}
5599                        dwim.  Otherwise, treat it as a statement, so
5600                        map {no strict; ...} works.
5601                      */
5602                     s = skipspace(s);
5603                     if (*s == '{') {
5604                         PL_expect = XTERM;
5605                         break;
5606                     }
5607                     if (strnEQ(s, "sub", 3)) {
5608                         d = s + 3;
5609                         d = skipspace(d);
5610                         if (*d == ':') {
5611                             PL_expect = XTERM;
5612                             break;
5613                         }
5614                     }
5615                     PL_expect = XSTATE;
5616                 }
5617                 else {
5618                     PL_lex_brackstack[PL_lex_brackets-1] = XSTATE;
5619                     PL_expect = XSTATE;
5620                 }
5621             }
5622             break;
5623         }
5624         pl_yylval.ival = CopLINE(PL_curcop);
5625         PL_copline = NOLINE;   /* invalidate current command line number */
5626         TOKEN(formbrack ? '=' : '{');
5627     case '}':
5628         if (PL_lex_brackets && PL_lex_brackstack[PL_lex_brackets-1] == XFAKEEOF)
5629             TOKEN(0);
5630       rightbracket:
5631         s++;
5632         if (PL_lex_brackets <= 0)
5633             /* diag_listed_as: Unmatched right %s bracket */
5634             yyerror("Unmatched right curly bracket");
5635         else
5636             PL_expect = (expectation)PL_lex_brackstack[--PL_lex_brackets];
5637         PL_lex_allbrackets--;
5638         if (PL_lex_state == LEX_INTERPNORMAL) {
5639             if (PL_lex_brackets == 0) {
5640                 if (PL_expect & XFAKEBRACK) {
5641                     PL_expect &= XENUMMASK;
5642                     PL_lex_state = LEX_INTERPEND;
5643                     PL_bufptr = s;
5644                     return yylex();     /* ignore fake brackets */
5645                 }
5646                 if (PL_lex_inwhat == OP_SUBST && PL_lex_repl == PL_linestr
5647                  && SvEVALED(PL_lex_repl))
5648                     PL_lex_state = LEX_INTERPEND;
5649                 else if (*s == '-' && s[1] == '>')
5650                     PL_lex_state = LEX_INTERPENDMAYBE;
5651                 else if (*s != '[' && *s != '{')
5652                     PL_lex_state = LEX_INTERPEND;
5653             }
5654         }
5655         if (PL_expect & XFAKEBRACK) {
5656             PL_expect &= XENUMMASK;
5657             PL_bufptr = s;
5658             return yylex();             /* ignore fake brackets */
5659         }
5660         force_next(formbrack ? '.' : '}');
5661         if (formbrack) LEAVE;
5662         if (formbrack == 2) { /* means . where arguments were expected */
5663             force_next(';');
5664             TOKEN(FORMRBRACK);
5665         }
5666         TOKEN(';');
5667     case '&':
5668         if (PL_expect == XPOSTDEREF) POSTDEREF('&');
5669         s++;
5670         if (*s++ == '&') {
5671             if (!PL_lex_allbrackets && PL_lex_fakeeof >=
5672                     (*s == '=' ? LEX_FAKEEOF_ASSIGN : LEX_FAKEEOF_LOGIC)) {
5673                 s -= 2;
5674                 TOKEN(0);
5675             }
5676             AOPERATOR(ANDAND);
5677         }
5678         s--;
5679         if (PL_expect == XOPERATOR) {
5680             if (PL_bufptr == PL_linestart && ckWARN(WARN_SEMICOLON)
5681                 && isIDFIRST_lazy_if(s,UTF))
5682             {
5683                 CopLINE_dec(PL_curcop);
5684                 Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), "%s", PL_warn_nosemi);
5685                 CopLINE_inc(PL_curcop);
5686             }
5687             if (!PL_lex_allbrackets && PL_lex_fakeeof >=
5688                     (*s == '=' ? LEX_FAKEEOF_ASSIGN : LEX_FAKEEOF_BITWISE)) {
5689                 s--;
5690                 TOKEN(0);
5691             }
5692             PL_parser->saw_infix_sigil = 1;
5693             BAop(OP_BIT_AND);
5694         }
5695
5696         PL_tokenbuf[0] = '&';
5697         s = scan_ident(s - 1, PL_tokenbuf + 1,
5698                        sizeof PL_tokenbuf - 1, TRUE);
5699         if (PL_tokenbuf[1]) {
5700             PL_expect = XOPERATOR;
5701             force_ident_maybe_lex('&');
5702         }
5703         else
5704             PREREF('&');
5705         pl_yylval.ival = (OPpENTERSUB_AMPER<<8);
5706         TERM('&');
5707
5708     case '|':
5709         s++;
5710         if (*s++ == '|') {
5711             if (!PL_lex_allbrackets && PL_lex_fakeeof >=
5712                     (*s == '=' ? LEX_FAKEEOF_ASSIGN : LEX_FAKEEOF_LOGIC)) {
5713                 s -= 2;
5714                 TOKEN(0);
5715             }
5716             AOPERATOR(OROR);
5717         }
5718         s--;
5719         if (!PL_lex_allbrackets && PL_lex_fakeeof >=
5720                 (*s == '=' ? LEX_FAKEEOF_ASSIGN : LEX_FAKEEOF_BITWISE)) {
5721             s--;
5722             TOKEN(0);
5723         }
5724         BOop(OP_BIT_OR);
5725     case '=':
5726         s++;
5727         {
5728             const char tmp = *s++;
5729             if (tmp == '=') {
5730                 if (!PL_lex_allbrackets &&
5731                         PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) {
5732                     s -= 2;
5733                     TOKEN(0);
5734                 }
5735                 Eop(OP_EQ);
5736             }
5737             if (tmp == '>') {
5738                 if (!PL_lex_allbrackets &&
5739                         PL_lex_fakeeof >= LEX_FAKEEOF_COMMA) {
5740                     s -= 2;
5741                     TOKEN(0);
5742                 }
5743                 OPERATOR(',');
5744             }
5745             if (tmp == '~')
5746                 PMop(OP_MATCH);
5747             if (tmp && isSPACE(*s) && ckWARN(WARN_SYNTAX)
5748                 && strchr("+-*/%.^&|<",tmp))
5749                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5750                             "Reversed %c= operator",(int)tmp);
5751             s--;
5752             if (PL_expect == XSTATE && isALPHA(tmp) &&
5753                 (s == PL_linestart+1 || s[-2] == '\n') )
5754                 {
5755                     if ((PL_in_eval && !PL_rsfp && !PL_parser->filtered)
5756                         || PL_lex_state != LEX_NORMAL) {
5757                         d = PL_bufend;
5758                         while (s < d) {
5759                             if (*s++ == '\n') {
5760                                 incline(s);
5761                                 if (strnEQ(s,"=cut",4)) {
5762                                     s = strchr(s,'\n');
5763                                     if (s)
5764                                         s++;
5765                                     else
5766                                         s = d;
5767                                     incline(s);
5768                                     goto retry;
5769                                 }
5770                             }
5771                         }
5772                         goto retry;
5773                     }
5774                     s = PL_bufend;
5775                     PL_parser->in_pod = 1;
5776                     goto retry;
5777                 }
5778         }
5779         if (PL_expect == XBLOCK) {
5780             const char *t = s;
5781 #ifdef PERL_STRICT_CR
5782             while (SPACE_OR_TAB(*t))
5783 #else
5784             while (SPACE_OR_TAB(*t) || *t == '\r')
5785 #endif
5786                 t++;
5787             if (*t == '\n' || *t == '#') {
5788                 formbrack = 1;
5789                 ENTER;
5790                 SAVEI8(PL_parser->form_lex_state);
5791                 SAVEI32(PL_lex_formbrack);
5792                 PL_parser->form_lex_state = PL_lex_state;
5793                 PL_lex_formbrack = PL_lex_brackets + 1;
5794                 goto leftbracket;
5795             }
5796         }
5797         if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) {
5798             s--;
5799             TOKEN(0);
5800         }
5801         pl_yylval.ival = 0;
5802         OPERATOR(ASSIGNOP);
5803     case '!':
5804         s++;
5805         {
5806             const char tmp = *s++;
5807             if (tmp == '=') {
5808                 /* was this !=~ where !~ was meant?
5809                  * warn on m:!=~\s+([/?]|[msy]\W|tr\W): */
5810
5811                 if (*s == '~' && ckWARN(WARN_SYNTAX)) {
5812                     const char *t = s+1;
5813
5814                     while (t < PL_bufend && isSPACE(*t))
5815                         ++t;
5816
5817                     if (*t == '/' || *t == '?' ||
5818                         ((*t == 'm' || *t == 's' || *t == 'y')
5819                          && !isWORDCHAR(t[1])) ||
5820                         (*t == 't' && t[1] == 'r' && !isWORDCHAR(t[2])))
5821                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5822                                     "!=~ should be !~");
5823                 }
5824                 if (!PL_lex_allbrackets &&
5825                         PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) {
5826                     s -= 2;
5827                     TOKEN(0);
5828                 }
5829                 Eop(OP_NE);
5830             }
5831             if (tmp == '~')
5832                 PMop(OP_NOT);
5833         }
5834         s--;
5835         OPERATOR('!');
5836     case '<':
5837         if (PL_expect != XOPERATOR) {
5838             if (s[1] != '<' && !strchr(s,'>'))
5839                 check_uni();
5840             if (s[1] == '<' && s[2] != '>')
5841                 s = scan_heredoc(s);
5842             else
5843                 s = scan_inputsymbol(s);
5844             PL_expect = XOPERATOR;
5845             TOKEN(sublex_start());
5846         }
5847         s++;
5848         {
5849             char tmp = *s++;
5850             if (tmp == '<') {
5851                 if (*s == '=' && !PL_lex_allbrackets &&
5852                         PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) {
5853                     s -= 2;
5854                     TOKEN(0);
5855                 }
5856                 SHop(OP_LEFT_SHIFT);
5857             }
5858             if (tmp == '=') {
5859                 tmp = *s++;
5860                 if (tmp == '>') {
5861                     if (!PL_lex_allbrackets &&
5862                             PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) {
5863                         s -= 3;
5864                         TOKEN(0);
5865                     }
5866                     Eop(OP_NCMP);
5867                 }
5868                 s--;
5869                 if (!PL_lex_allbrackets &&
5870                         PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) {
5871                     s -= 2;
5872                     TOKEN(0);
5873                 }
5874                 Rop(OP_LE);
5875             }
5876         }
5877         s--;
5878         if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) {
5879             s--;
5880             TOKEN(0);
5881         }
5882         Rop(OP_LT);
5883     case '>':
5884         s++;
5885         {
5886             const char tmp = *s++;
5887             if (tmp == '>') {
5888                 if (*s == '=' && !PL_lex_allbrackets &&
5889                         PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) {
5890                     s -= 2;
5891                     TOKEN(0);
5892                 }
5893                 SHop(OP_RIGHT_SHIFT);
5894             }
5895             else if (tmp == '=') {
5896                 if (!PL_lex_allbrackets &&
5897                         PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) {
5898                     s -= 2;
5899                     TOKEN(0);
5900                 }
5901                 Rop(OP_GE);
5902             }
5903         }
5904         s--;
5905         if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) {
5906             s--;
5907             TOKEN(0);
5908         }
5909         Rop(OP_GT);
5910
5911     case '$':
5912         CLINE;
5913
5914         if (PL_expect == XOPERATOR) {
5915             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
5916                 return deprecate_commaless_var_list();
5917             }
5918         }
5919         else if (PL_expect == XPOSTDEREF) {
5920             if (s[1] == '#') {
5921                 s++;
5922                 POSTDEREF(DOLSHARP);
5923             }
5924             POSTDEREF('$');
5925         }
5926
5927         if (s[1] == '#' && (isIDFIRST_lazy_if(s+2,UTF) || strchr("{$:+-@", s[2]))) {
5928             PL_tokenbuf[0] = '@';
5929             s = scan_ident(s + 1, PL_tokenbuf + 1,
5930                            sizeof PL_tokenbuf - 1, FALSE);
5931             if (PL_expect == XOPERATOR)
5932                 no_op("Array length", s);
5933             if (!PL_tokenbuf[1])
5934                 PREREF(DOLSHARP);
5935             PL_expect = XOPERATOR;
5936             force_ident_maybe_lex('#');
5937             TOKEN(DOLSHARP);
5938         }
5939
5940         PL_tokenbuf[0] = '$';
5941         s = scan_ident(s, PL_tokenbuf + 1,
5942                        sizeof PL_tokenbuf - 1, FALSE);
5943         if (PL_expect == XOPERATOR)
5944             no_op("Scalar", s);
5945         if (!PL_tokenbuf[1]) {
5946             if (s == PL_bufend)
5947                 yyerror("Final $ should be \\$ or $name");
5948             PREREF('$');
5949         }
5950
5951         d = s;
5952         {
5953             const char tmp = *s;
5954             if (PL_lex_state == LEX_NORMAL || PL_lex_brackets)
5955                 s = skipspace(s);
5956
5957             if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop)
5958                 && intuit_more(s)) {
5959                 if (*s == '[') {
5960                     PL_tokenbuf[0] = '@';
5961                     if (ckWARN(WARN_SYNTAX)) {
5962                         char *t = s+1;
5963
5964                         while (isSPACE(*t) || isWORDCHAR_lazy_if(t,UTF) || *t == '$')
5965                             t++;
5966                         if (*t++ == ',') {
5967                             PL_bufptr = skipspace(PL_bufptr); /* XXX can realloc */
5968                             while (t < PL_bufend && *t != ']')
5969                                 t++;
5970                             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5971                                         "Multidimensional syntax %.*s not supported",
5972                                     (int)((t - PL_bufptr) + 1), PL_bufptr);
5973                         }
5974                     }
5975                 }
5976                 else if (*s == '{') {
5977                     char *t;
5978                     PL_tokenbuf[0] = '%';
5979                     if (strEQ(PL_tokenbuf+1, "SIG")  && ckWARN(WARN_SYNTAX)
5980                         && (t = strchr(s, '}')) && (t = strchr(t, '=')))
5981                         {
5982                             char tmpbuf[sizeof PL_tokenbuf];
5983                             do {
5984                                 t++;
5985                             } while (isSPACE(*t));
5986                             if (isIDFIRST_lazy_if(t,UTF)) {
5987                                 STRLEN len;
5988                                 t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE,
5989                                               &len);
5990                                 while (isSPACE(*t))
5991                                     t++;
5992                                 if (*t == ';'
5993                                        && get_cvn_flags(tmpbuf, len, UTF ? SVf_UTF8 : 0))
5994                                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5995                                         "You need to quote \"%"UTF8f"\"",
5996                                          UTF8fARG(UTF, len, tmpbuf));
5997                             }
5998                         }
5999                 }
6000             }
6001
6002             PL_expect = XOPERATOR;
6003             if (PL_lex_state == LEX_NORMAL && isSPACE((char)tmp)) {
6004                 const bool islop = (PL_last_lop == PL_oldoldbufptr);
6005                 if (!islop || PL_last_lop_op == OP_GREPSTART)
6006                     PL_expect = XOPERATOR;
6007                 else if (strchr("$@\"'`q", *s))
6008                     PL_expect = XTERM;          /* e.g. print $fh "foo" */
6009                 else if (strchr("&*<%", *s) && isIDFIRST_lazy_if(s+1,UTF))
6010                     PL_expect = XTERM;          /* e.g. print $fh &sub */
6011                 else if (isIDFIRST_lazy_if(s,UTF)) {
6012                     char tmpbuf[sizeof PL_tokenbuf];
6013                     int t2;
6014                     scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
6015                     if ((t2 = keyword(tmpbuf, len, 0))) {
6016                         /* binary operators exclude handle interpretations */
6017                         switch (t2) {
6018                         case -KEY_x:
6019                         case -KEY_eq:
6020                         case -KEY_ne:
6021                         case -KEY_gt:
6022                         case -KEY_lt:
6023                         case -KEY_ge:
6024                         case -KEY_le:
6025                         case -KEY_cmp:
6026                             break;
6027                         default:
6028                             PL_expect = XTERM;  /* e.g. print $fh length() */
6029                             break;
6030                         }
6031                     }
6032                     else {
6033                         PL_expect = XTERM;      /* e.g. print $fh subr() */
6034                     }
6035                 }
6036                 else if (isDIGIT(*s))
6037                     PL_expect = XTERM;          /* e.g. print $fh 3 */
6038                 else if (*s == '.' && isDIGIT(s[1]))
6039                     PL_expect = XTERM;          /* e.g. print $fh .3 */
6040                 else if ((*s == '?' || *s == '-' || *s == '+')
6041                          && !isSPACE(s[1]) && s[1] != '=')
6042                     PL_expect = XTERM;          /* e.g. print $fh -1 */
6043                 else if (*s == '/' && !isSPACE(s[1]) && s[1] != '='
6044                          && s[1] != '/')
6045                     PL_expect = XTERM;          /* e.g. print $fh /.../
6046                                                    XXX except DORDOR operator
6047                                                 */
6048                 else if (*s == '<' && s[1] == '<' && !isSPACE(s[2])
6049                          && s[2] != '=')
6050                     PL_expect = XTERM;          /* print $fh <<"EOF" */
6051             }
6052         }
6053         force_ident_maybe_lex('$');
6054         TOKEN('$');
6055
6056     case '@':
6057         if (PL_expect == XOPERATOR)
6058             no_op("Array", s);
6059         else if (PL_expect == XPOSTDEREF) POSTDEREF('@');
6060         PL_tokenbuf[0] = '@';
6061         s = scan_ident(s, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, FALSE);
6062         pl_yylval.ival = 0;
6063         if (!PL_tokenbuf[1]) {
6064             PREREF('@');
6065         }
6066         if (PL_lex_state == LEX_NORMAL)
6067             s = skipspace(s);
6068         if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
6069             if (*s == '{')
6070                 PL_tokenbuf[0] = '%';
6071
6072             /* Warn about @ where they meant $. */
6073             if (*s == '[' || *s == '{') {
6074                 if (ckWARN(WARN_SYNTAX)) {
6075                     S_check_scalar_slice(aTHX_ s);
6076                 }
6077             }
6078         }
6079         PL_expect = XOPERATOR;
6080         force_ident_maybe_lex('@');
6081         TERM('@');
6082
6083      case '/':                  /* may be division, defined-or, or pattern */
6084         if ((PL_expect == XOPERATOR || PL_expect == XTERMORDORDOR) && s[1] == '/') {
6085             if (!PL_lex_allbrackets && PL_lex_fakeeof >=
6086                     (s[2] == '=' ? LEX_FAKEEOF_ASSIGN : LEX_FAKEEOF_LOGIC))
6087                 TOKEN(0);
6088             s += 2;
6089             AOPERATOR(DORDOR);
6090         }
6091         else if (PL_expect == XOPERATOR) {
6092             s++;
6093             if (*s == '=' && !PL_lex_allbrackets &&
6094                 PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) {
6095                 s--;
6096                 TOKEN(0);
6097             }
6098             Mop(OP_DIVIDE);
6099         }
6100         else {
6101             /* Disable warning on "study /blah/" */
6102             if (PL_oldoldbufptr == PL_last_uni
6103              && (*PL_last_uni != 's' || s - PL_last_uni < 5
6104                  || memNE(PL_last_uni, "study", 5)
6105                  || isWORDCHAR_lazy_if(PL_last_uni+5,UTF)
6106              ))
6107                 check_uni();
6108             s = scan_pat(s,OP_MATCH);
6109             TERM(sublex_start());
6110         }
6111
6112      case '?':                  /* conditional */
6113         s++;
6114         if (!PL_lex_allbrackets &&
6115             PL_lex_fakeeof >= LEX_FAKEEOF_IFELSE) {
6116             s--;
6117             TOKEN(0);
6118         }
6119         PL_lex_allbrackets++;
6120         OPERATOR('?');
6121
6122     case '.':
6123         if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack
6124 #ifdef PERL_STRICT_CR
6125             && s[1] == '\n'
6126 #else
6127             && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n'))
6128 #endif
6129             && (s == PL_linestart || s[-1] == '\n') )
6130         {
6131             PL_expect = XSTATE;
6132             formbrack = 2; /* dot seen where arguments expected */
6133             goto rightbracket;
6134         }
6135         if (PL_expect == XSTATE && s[1] == '.' && s[2] == '.') {
6136             s += 3;
6137             OPERATOR(YADAYADA);
6138         }
6139         if (PL_expect == XOPERATOR || !isDIGIT(s[1])) {
6140             char tmp = *s++;
6141             if (*s == tmp) {
6142                 if (!PL_lex_allbrackets &&
6143                         PL_lex_fakeeof >= LEX_FAKEEOF_RANGE) {
6144                     s--;
6145                     TOKEN(0);
6146                 }
6147                 s++;
6148                 if (*s == tmp) {
6149                     s++;
6150                     pl_yylval.ival = OPf_SPECIAL;
6151                 }
6152                 else
6153                     pl_yylval.ival = 0;
6154                 OPERATOR(DOTDOT);
6155             }
6156             if (*s == '=' && !PL_lex_allbrackets &&
6157                     PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) {
6158                 s--;
6159                 TOKEN(0);
6160             }
6161             Aop(OP_CONCAT);
6162         }
6163         /* FALLTHROUGH */
6164     case '0': case '1': case '2': case '3': case '4':
6165     case '5': case '6': case '7': case '8': case '9':
6166         s = scan_num(s, &pl_yylval);
6167         DEBUG_T( { printbuf("### Saw number in %s\n", s); } );
6168         if (PL_expect == XOPERATOR)
6169             no_op("Number",s);
6170         TERM(THING);
6171
6172     case '\'':
6173         s = scan_str(s,FALSE,FALSE,FALSE,NULL);
6174         if (!s)
6175             missingterm(NULL);
6176         COPLINE_SET_FROM_MULTI_END;
6177         DEBUG_T( { printbuf("### Saw string before %s\n", s); } );
6178         if (PL_expect == XOPERATOR) {
6179             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
6180                 return deprecate_commaless_var_list();
6181             }
6182             else
6183                 no_op("String",s);
6184         }
6185         pl_yylval.ival = OP_CONST;
6186         TERM(sublex_start());
6187
6188     case '"':
6189         s = scan_str(s,FALSE,FALSE,FALSE,NULL);
6190         DEBUG_T( {
6191             if (s)
6192                 printbuf("### Saw string before %s\n", s);
6193             else
6194                 PerlIO_printf(Perl_debug_log,
6195                              "### Saw unterminated string\n");
6196         } );
6197         if (PL_expect == XOPERATOR) {
6198             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
6199                 return deprecate_commaless_var_list();
6200             }
6201             else
6202                 no_op("String",s);
6203         }
6204         if (!s)
6205             missingterm(NULL);
6206         pl_yylval.ival = OP_CONST;
6207         /* FIXME. I think that this can be const if char *d is replaced by
6208            more localised variables.  */
6209         for (d = SvPV(PL_lex_stuff, len); len; len--, d++) {
6210             if (*d == '$' || *d == '@' || *d == '\\' || !UTF8_IS_INVARIANT((U8)*d)) {
6211                 pl_yylval.ival = OP_STRINGIFY;
6212                 break;
6213             }
6214         }
6215         if (pl_yylval.ival == OP_CONST)
6216             COPLINE_SET_FROM_MULTI_END;
6217         TERM(sublex_start());
6218
6219     case '`':
6220         s = scan_str(s,FALSE,FALSE,FALSE,NULL);
6221         DEBUG_T( { printbuf("### Saw backtick string before %s\n", s); } );
6222         if (PL_expect == XOPERATOR)
6223             no_op("Backticks",s);
6224         if (!s)
6225             missingterm(NULL);
6226         pl_yylval.ival = OP_BACKTICK;
6227         TERM(sublex_start());
6228
6229     case '\\':
6230         s++;
6231         if (PL_lex_inwhat == OP_SUBST && PL_lex_repl == PL_linestr
6232          && isDIGIT(*s))
6233             Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),"Can't use \\%c to mean $%c in expression",
6234                            *s, *s);
6235         if (PL_expect == XOPERATOR)
6236             no_op("Backslash",s);
6237         OPERATOR(REFGEN);
6238
6239     case 'v':
6240         if (isDIGIT(s[1]) && PL_expect != XOPERATOR) {
6241             char *start = s + 2;
6242             while (isDIGIT(*start) || *start == '_')
6243                 start++;
6244             if (*start == '.' && isDIGIT(start[1])) {
6245                 s = scan_num(s, &pl_yylval);
6246                 TERM(THING);
6247             }
6248             else if ((*start == ':' && start[1] == ':')
6249                   || (PL_expect == XSTATE && *start == ':'))
6250                 goto keylookup;
6251             else if (PL_expect == XSTATE) {
6252                 d = start;
6253                 while (d < PL_bufend && isSPACE(*d)) d++;
6254                 if (*d == ':') goto keylookup;
6255             }
6256             /* avoid v123abc() or $h{v1}, allow C<print v10;> */
6257             if (!isALPHA(*start) && (PL_expect == XTERM
6258                         || PL_expect == XREF || PL_expect == XSTATE
6259                         || PL_expect == XTERMORDORDOR)) {
6260                 GV *const gv = gv_fetchpvn_flags(s, start - s,
6261                                                     UTF ? SVf_UTF8 : 0, SVt_PVCV);
6262                 if (!gv) {
6263                     s = scan_num(s, &pl_yylval);
6264                     TERM(THING);
6265                 }
6266             }
6267         }
6268         goto keylookup;
6269     case 'x':
6270         if (isDIGIT(s[1]) && PL_expect == XOPERATOR) {
6271             s++;
6272             Mop(OP_REPEAT);
6273         }
6274         goto keylookup;
6275
6276     case '_':
6277     case 'a': case 'A':
6278     case 'b': case 'B':
6279     case 'c': case 'C':
6280     case 'd': case 'D':
6281     case 'e': case 'E':
6282     case 'f': case 'F':
6283     case 'g': case 'G':
6284     case 'h': case 'H':
6285     case 'i': case 'I':
6286     case 'j': case 'J':
6287     case 'k': case 'K':
6288     case 'l': case 'L':
6289     case 'm': case 'M':
6290     case 'n': case 'N':
6291     case 'o': case 'O':
6292     case 'p': case 'P':
6293     case 'q': case 'Q':
6294     case 'r': case 'R':
6295     case 's': case 'S':
6296     case 't': case 'T':
6297     case 'u': case 'U':
6298               case 'V':
6299     case 'w': case 'W':
6300               case 'X':
6301     case 'y': case 'Y':
6302     case 'z': case 'Z':
6303
6304       keylookup: {
6305         bool anydelim;
6306         bool lex;
6307         I32 tmp;
6308         SV *sv;
6309         CV *cv;
6310         PADOFFSET off;
6311         OP *rv2cv_op;
6312
6313         lex = FALSE;
6314         orig_keyword = 0;
6315         off = 0;
6316         sv = NULL;
6317         cv = NULL;
6318         gv = NULL;
6319         gvp = NULL;
6320         rv2cv_op = NULL;
6321
6322         PL_bufptr = s;
6323         s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
6324
6325         /* Some keywords can be followed by any delimiter, including ':' */
6326         anydelim = word_takes_any_delimeter(PL_tokenbuf, len);
6327
6328         /* x::* is just a word, unless x is "CORE" */
6329         if (!anydelim && *s == ':' && s[1] == ':') {
6330             if (strEQ(PL_tokenbuf, "CORE")) goto case_KEY_CORE;
6331             goto just_a_word;
6332         }
6333
6334         d = s;
6335         while (d < PL_bufend && isSPACE(*d))
6336                 d++;    /* no comments skipped here, or s### is misparsed */
6337
6338         /* Is this a word before a => operator? */
6339         if (*d == '=' && d[1] == '>') {
6340           fat_arrow:
6341             CLINE;
6342             pl_yylval.opval
6343                 = (OP*)newSVOP(OP_CONST, 0,
6344                                S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
6345             pl_yylval.opval->op_private = OPpCONST_BARE;
6346             TERM(WORD);
6347         }
6348
6349         /* Check for plugged-in keyword */
6350         {
6351             OP *o;
6352             int result;
6353             char *saved_bufptr = PL_bufptr;
6354             PL_bufptr = s;
6355             result = PL_keyword_plugin(aTHX_ PL_tokenbuf, len, &o);
6356             s = PL_bufptr;
6357             if (result == KEYWORD_PLUGIN_DECLINE) {
6358                 /* not a plugged-in keyword */
6359                 PL_bufptr = saved_bufptr;
6360             } else if (result == KEYWORD_PLUGIN_STMT) {
6361                 pl_yylval.opval = o;
6362                 CLINE;
6363                 if (!PL_nexttoke) PL_expect = XSTATE;
6364                 return REPORT(PLUGSTMT);
6365             } else if (result == KEYWORD_PLUGIN_EXPR) {
6366                 pl_yylval.opval = o;
6367                 CLINE;
6368                 if (!PL_nexttoke) PL_expect = XOPERATOR;
6369                 return REPORT(PLUGEXPR);
6370             } else {
6371                 Perl_croak(aTHX_ "Bad plugin affecting keyword '%s'",
6372                                         PL_tokenbuf);
6373             }
6374         }
6375
6376         /* Check for built-in keyword */
6377         tmp = keyword(PL_tokenbuf, len, 0);
6378
6379         /* Is this a label? */
6380         if (!anydelim && PL_expect == XSTATE
6381               && d < PL_bufend && *d == ':' && *(d + 1) != ':') {
6382             s = d + 1;
6383             pl_yylval.pval = savepvn(PL_tokenbuf, len+1);
6384             pl_yylval.pval[len] = '\0';
6385             pl_yylval.pval[len+1] = UTF ? 1 : 0;
6386             CLINE;
6387             TOKEN(LABEL);
6388         }
6389
6390         /* Check for lexical sub */
6391         if (PL_expect != XOPERATOR) {
6392             char tmpbuf[sizeof PL_tokenbuf + 1];
6393             *tmpbuf = '&';
6394             Copy(PL_tokenbuf, tmpbuf+1, len, char);
6395             off = pad_findmy_pvn(tmpbuf, len+1, 0);
6396             if (off != NOT_IN_PAD) {
6397                 assert(off); /* we assume this is boolean-true below */
6398                 if (PAD_COMPNAME_FLAGS_isOUR(off)) {
6399                     HV *  const stash = PAD_COMPNAME_OURSTASH(off);
6400                     HEK * const stashname = HvNAME_HEK(stash);
6401                     sv = newSVhek(stashname);
6402                     sv_catpvs(sv, "::");
6403                     sv_catpvn_flags(sv, PL_tokenbuf, len,
6404                                     (UTF ? SV_CATUTF8 : SV_CATBYTES));
6405                     gv = gv_fetchsv(sv, GV_NOADD_NOINIT | SvUTF8(sv),
6406                                     SVt_PVCV);
6407                     off = 0;
6408                     if (!gv) {
6409                         sv_free(sv);
6410                         sv = NULL;
6411                         goto just_a_word;
6412                     }
6413                 }
6414                 else {
6415                     rv2cv_op = newOP(OP_PADANY, 0);
6416                     rv2cv_op->op_targ = off;
6417                     cv = find_lexical_cv(off);
6418                 }
6419                 lex = TRUE;
6420                 goto just_a_word;
6421             }
6422             off = 0;
6423         }
6424
6425         if (tmp < 0) {                  /* second-class keyword? */
6426             GV *ogv = NULL;     /* override (winner) */
6427             GV *hgv = NULL;     /* hidden (loser) */
6428             if (PL_expect != XOPERATOR && (*s != ':' || s[1] != ':')) {
6429                 CV *cv;
6430                 if ((gv = gv_fetchpvn_flags(PL_tokenbuf, len,
6431                                             (UTF ? SVf_UTF8 : 0)|GV_NOTQUAL,
6432                                             SVt_PVCV)) &&
6433                     (cv = GvCVu(gv)))
6434                 {
6435                     if (GvIMPORTED_CV(gv))
6436                         ogv = gv;
6437                     else if (! CvMETHOD(cv))
6438                         hgv = gv;
6439                 }
6440                 if (!ogv &&
6441                     (gvp = (GV**)hv_fetch(PL_globalstash, PL_tokenbuf,
6442                                           len, FALSE)) &&
6443                     (gv = *gvp) && (
6444                         isGV_with_GP(gv)
6445                             ? GvCVu(gv) && GvIMPORTED_CV(gv)
6446                             :   SvPCS_IMPORTED(gv)
6447                              && (gv_init(gv, PL_globalstash, PL_tokenbuf,
6448                                          len, 0), 1)
6449                    ))
6450                 {
6451                     ogv = gv;
6452                 }
6453             }
6454             if (ogv) {
6455                 orig_keyword = tmp;
6456                 tmp = 0;                /* overridden by import or by GLOBAL */
6457             }
6458             else if (gv && !gvp
6459                      && -tmp==KEY_lock  /* XXX generalizable kludge */
6460                      && GvCVu(gv))
6461             {
6462                 tmp = 0;                /* any sub overrides "weak" keyword */
6463             }
6464             else {                      /* no override */
6465                 tmp = -tmp;
6466                 if (tmp == KEY_dump) {
6467                     Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
6468                                    "dump() better written as CORE::dump()");
6469                 }
6470                 gv = NULL;
6471                 gvp = 0;
6472                 if (hgv && tmp != KEY_x)        /* never ambiguous */
6473                     Perl_ck_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
6474                                    "Ambiguous call resolved as CORE::%s(), "
6475                                    "qualify as such or use &",
6476                                    GvENAME(hgv));
6477             }
6478         }
6479
6480         if (tmp && tmp != KEY___DATA__ && tmp != KEY___END__
6481          && (!anydelim || *s != '#')) {
6482             /* no override, and not s### either; skipspace is safe here
6483              * check for => on following line */
6484             bool arrow;
6485             STRLEN bufoff = PL_bufptr - SvPVX(PL_linestr);
6486             STRLEN   soff = s         - SvPVX(PL_linestr);
6487             s = skipspace_flags(s, LEX_NO_INCLINE);
6488             arrow = *s == '=' && s[1] == '>';
6489             PL_bufptr = SvPVX(PL_linestr) + bufoff;
6490             s         = SvPVX(PL_linestr) +   soff;
6491             if (arrow)
6492                 goto fat_arrow;
6493         }
6494
6495       reserved_word:
6496         switch (tmp) {
6497
6498         default:                        /* not a keyword */
6499             /* Trade off - by using this evil construction we can pull the
6500                variable gv into the block labelled keylookup. If not, then
6501                we have to give it function scope so that the goto from the
6502                earlier ':' case doesn't bypass the initialisation.  */
6503             if (0) {
6504             just_a_word_zero_gv:
6505                 sv = NULL;
6506                 cv = NULL;
6507                 gv = NULL;
6508                 gvp = NULL;
6509                 rv2cv_op = NULL;
6510                 orig_keyword = 0;
6511                 lex = 0;
6512                 off = 0;
6513             }
6514           just_a_word: {
6515                 int pkgname = 0;
6516                 const char lastchar = (PL_bufptr == PL_oldoldbufptr ? 0 : PL_bufptr[-1]);
6517                 bool safebw;
6518
6519
6520                 /* Get the rest if it looks like a package qualifier */
6521
6522                 if (*s == '\'' || (*s == ':' && s[1] == ':')) {
6523                     STRLEN morelen;
6524                     s = scan_word(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len,
6525                                   TRUE, &morelen);
6526                     if (!morelen)
6527                         Perl_croak(aTHX_ "Bad name after %"UTF8f"%s",
6528                                 UTF8fARG(UTF, len, PL_tokenbuf),
6529                                 *s == '\'' ? "'" : "::");
6530                     len += morelen;
6531                     pkgname = 1;
6532                 }
6533
6534                 if (PL_expect == XOPERATOR) {
6535                     if (PL_bufptr == PL_linestart) {
6536                         CopLINE_dec(PL_curcop);
6537                         Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), "%s", PL_warn_nosemi);
6538                         CopLINE_inc(PL_curcop);
6539                     }
6540                     else
6541                         no_op("Bareword",s);
6542                 }
6543
6544                 /* See if the name is "Foo::",
6545                    in which case Foo is a bareword
6546                    (and a package name). */
6547
6548                 if (len > 2 &&
6549                     PL_tokenbuf[len - 2] == ':' && PL_tokenbuf[len - 1] == ':')
6550                 {
6551                     if (ckWARN(WARN_BAREWORD)
6552                         && ! gv_fetchpvn_flags(PL_tokenbuf, len, UTF ? SVf_UTF8 : 0, SVt_PVHV))
6553                         Perl_warner(aTHX_ packWARN(WARN_BAREWORD),
6554                           "Bareword \"%"UTF8f"\" refers to nonexistent package",
6555                            UTF8fARG(UTF, len, PL_tokenbuf));
6556                     len -= 2;
6557                     PL_tokenbuf[len] = '\0';
6558                     gv = NULL;
6559                     gvp = 0;
6560                     safebw = TRUE;
6561                 }
6562                 else {
6563                     safebw = FALSE;
6564                 }
6565
6566                 /* if we saw a global override before, get the right name */
6567
6568                 if (!sv)
6569                   sv = S_newSV_maybe_utf8(aTHX_ PL_tokenbuf,
6570                                                 len);
6571                 if (gvp) {
6572                     SV * const tmp_sv = sv;
6573                     sv = newSVpvs("CORE::GLOBAL::");
6574                     sv_catsv(sv, tmp_sv);
6575                     SvREFCNT_dec(tmp_sv);
6576                 }
6577
6578
6579                 /* Presume this is going to be a bareword of some sort. */
6580                 CLINE;
6581                 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
6582                 pl_yylval.opval->op_private = OPpCONST_BARE;
6583
6584                 /* And if "Foo::", then that's what it certainly is. */
6585                 if (safebw)
6586                     goto safe_bareword;
6587
6588                 if (!off)
6589                 {
6590                     OP *const_op = newSVOP(OP_CONST, 0, SvREFCNT_inc_NN(sv));
6591                     const_op->op_private = OPpCONST_BARE;
6592                     rv2cv_op =
6593                         newCVREF(OPpMAY_RETURN_CONSTANT<<8, const_op);
6594                     cv = lex
6595                         ? isGV(gv)
6596                             ? GvCV(gv)
6597                             : SvROK(gv) && SvTYPE(SvRV(gv)) == SVt_PVCV
6598                                 ? (CV *)SvRV(gv)
6599                                 : ((CV *)gv)
6600                         : rv2cv_op_cv(rv2cv_op, RV2CVOPCV_RETURN_STUB);
6601                 }
6602
6603                 /* Use this var to track whether intuit_method has been
6604                    called.  intuit_method returns 0 or > 255.  */
6605                 tmp = 1;
6606
6607                 /* See if it's the indirect object for a list operator. */
6608
6609                 if (PL_oldoldbufptr &&
6610                     PL_oldoldbufptr < PL_bufptr &&
6611                     (PL_oldoldbufptr == PL_last_lop
6612                      || PL_oldoldbufptr == PL_last_uni) &&
6613                     /* NO SKIPSPACE BEFORE HERE! */
6614                     (PL_expect == XREF ||
6615                      ((PL_opargs[PL_last_lop_op] >> OASHIFT)& 7) == OA_FILEREF))
6616                 {
6617                     bool immediate_paren = *s == '(';
6618
6619                     /* (Now we can afford to cross potential line boundary.) */
6620                     s = skipspace(s);
6621
6622                     /* Two barewords in a row may indicate method call. */
6623
6624                     if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') &&
6625                         (tmp = intuit_method(s, lex ? NULL : sv, cv))) {
6626                         goto method;
6627                     }
6628
6629                     /* If not a declared subroutine, it's an indirect object. */
6630                     /* (But it's an indir obj regardless for sort.) */
6631                     /* Also, if "_" follows a filetest operator, it's a bareword */
6632
6633                     if (
6634                         ( !immediate_paren && (PL_last_lop_op == OP_SORT ||
6635                          (!cv &&
6636                         (PL_last_lop_op != OP_MAPSTART &&
6637                          PL_last_lop_op != OP_GREPSTART))))
6638                        || (PL_tokenbuf[0] == '_' && PL_tokenbuf[1] == '\0'
6639                             && ((PL_opargs[PL_last_lop_op] & OA_CLASS_MASK) == OA_FILESTATOP))
6640                        )
6641                     {
6642                         PL_expect = (PL_last_lop == PL_oldoldbufptr) ? XTERM : XOPERATOR;
6643                         goto bareword;
6644                     }
6645                 }
6646
6647                 PL_expect = XOPERATOR;
6648                 s = skipspace(s);
6649
6650                 /* Is this a word before a => operator? */
6651                 if (*s == '=' && s[1] == '>' && !pkgname) {
6652                     op_free(rv2cv_op);
6653                     CLINE;
6654                     if (gvp || (lex && !off)) {
6655                         assert (cSVOPx(pl_yylval.opval)->op_sv == sv);
6656                         /* This is our own scalar, created a few lines
6657                            above, so this is safe. */
6658                         SvREADONLY_off(sv);
6659                         sv_setpv(sv, PL_tokenbuf);
6660                         if (UTF && !IN_BYTES
6661                          && is_utf8_string((U8*)PL_tokenbuf, len))
6662                               SvUTF8_on(sv);
6663                         SvREADONLY_on(sv);
6664                     }
6665                     TERM(WORD);
6666                 }
6667
6668                 /* If followed by a paren, it's certainly a subroutine. */
6669                 if (*s == '(') {
6670                     CLINE;
6671                     if (cv) {
6672                         d = s + 1;
6673                         while (SPACE_OR_TAB(*d))
6674                             d++;
6675                         if (*d == ')' && (sv = cv_const_sv_or_av(cv))) {
6676                             s = d + 1;
6677                             goto its_constant;
6678                         }
6679                     }
6680                     NEXTVAL_NEXTTOKE.opval =
6681                         off ? rv2cv_op : pl_yylval.opval;
6682                     if (off)
6683                          op_free(pl_yylval.opval), force_next(PRIVATEREF);
6684                     else op_free(rv2cv_op),        force_next(WORD);
6685                     pl_yylval.ival = 0;
6686                     TOKEN('&');
6687                 }
6688
6689                 /* If followed by var or block, call it a method (unless sub) */
6690
6691                 if ((*s == '$' || *s == '{') && !cv) {
6692                     op_free(rv2cv_op);
6693                     PL_last_lop = PL_oldbufptr;
6694                     PL_last_lop_op = OP_METHOD;
6695                     if (!PL_lex_allbrackets &&
6696                             PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC)
6697                         PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC;
6698                     PL_expect = XBLOCKTERM;
6699                     PL_bufptr = s;
6700                     return REPORT(METHOD);
6701                 }
6702
6703                 /* If followed by a bareword, see if it looks like indir obj. */
6704
6705                 if (tmp == 1 && !orig_keyword
6706                         && (isIDFIRST_lazy_if(s,UTF) || *s == '$')
6707                         && (tmp = intuit_method(s, lex ? NULL : sv, cv))) {
6708                   method:
6709                     if (lex && !off) {
6710                         assert(cSVOPx(pl_yylval.opval)->op_sv == sv);
6711                         SvREADONLY_off(sv);
6712                         sv_setpvn(sv, PL_tokenbuf, len);
6713                         if (UTF && !IN_BYTES
6714                          && is_utf8_string((U8*)PL_tokenbuf, len))
6715                             SvUTF8_on (sv);
6716                         else SvUTF8_off(sv);
6717                     }
6718                     op_free(rv2cv_op);
6719                     if (tmp == METHOD && !PL_lex_allbrackets &&
6720                             PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC)
6721                         PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC;
6722                     return REPORT(tmp);
6723                 }
6724
6725                 /* Not a method, so call it a subroutine (if defined) */
6726
6727                 if (cv) {
6728                     /* Check for a constant sub */
6729                     if ((sv = cv_const_sv_or_av(cv))) {
6730                   its_constant:
6731                         op_free(rv2cv_op);
6732                         SvREFCNT_dec(((SVOP*)pl_yylval.opval)->op_sv);
6733                         ((SVOP*)pl_yylval.opval)->op_sv = SvREFCNT_inc_simple(sv);
6734                         if (SvTYPE(sv) == SVt_PVAV)
6735                             pl_yylval.opval = newUNOP(OP_RV2AV, OPf_PARENS,
6736                                                       pl_yylval.opval);
6737                         else {
6738                             pl_yylval.opval->op_private = 0;
6739                             pl_yylval.opval->op_folded = 1;
6740                             pl_yylval.opval->op_flags |= OPf_SPECIAL;
6741                         }
6742                         TOKEN(WORD);
6743                     }
6744
6745                     op_free(pl_yylval.opval);
6746                     pl_yylval.opval =
6747                         off ? (OP *)newCVREF(0, rv2cv_op) : rv2cv_op;
6748                     pl_yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
6749                     PL_last_lop = PL_oldbufptr;
6750                     PL_last_lop_op = OP_ENTERSUB;
6751                     /* Is there a prototype? */
6752                     if (
6753                         SvPOK(cv))
6754                     {
6755                         STRLEN protolen = CvPROTOLEN(cv);
6756                         const char *proto = CvPROTO(cv);
6757                         bool optional;
6758                         proto = S_strip_spaces(aTHX_ proto, &protolen);
6759                         if (!protolen)
6760                             TERM(FUNC0SUB);
6761                         if ((optional = *proto == ';'))
6762                           do
6763                             proto++;
6764                           while (*proto == ';');
6765                         if (
6766                             (
6767                                 (
6768                                     *proto == '$' || *proto == '_'
6769                                  || *proto == '*' || *proto == '+'
6770                                 )
6771                              && proto[1] == '\0'
6772                             )
6773                          || (
6774                              *proto == '\\' && proto[1] && proto[2] == '\0'
6775                             )
6776                         )
6777                             UNIPROTO(UNIOPSUB,optional);
6778                         if (*proto == '\\' && proto[1] == '[') {
6779                             const char *p = proto + 2;
6780                             while(*p && *p != ']')
6781                                 ++p;
6782                             if(*p == ']' && !p[1])
6783                                 UNIPROTO(UNIOPSUB,optional);
6784                         }
6785                         if (*proto == '&' && *s == '{') {
6786                             if (PL_curstash)
6787                                 sv_setpvs(PL_subname, "__ANON__");
6788                             else
6789                                 sv_setpvs(PL_subname, "__ANON__::__ANON__");
6790                             if (!PL_lex_allbrackets &&
6791                                     PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC)
6792                                 PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC;
6793                             PREBLOCK(LSTOPSUB);
6794                         }
6795                     }
6796                     NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
6797                     PL_expect = XTERM;
6798                     force_next(off ? PRIVATEREF : WORD);
6799                     if (!PL_lex_allbrackets &&
6800                             PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC)
6801                         PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC;
6802                     TOKEN(NOAMP);
6803                 }
6804
6805                 /* Call it a bare word */
6806
6807                 if (PL_hints & HINT_STRICT_SUBS)
6808                     pl_yylval.opval->op_private |= OPpCONST_STRICT;
6809                 else {
6810                 bareword:
6811                     /* after "print" and similar functions (corresponding to
6812                      * "F? L" in opcode.pl), whatever wasn't already parsed as
6813                      * a filehandle should be subject to "strict subs".
6814                      * Likewise for the optional indirect-object argument to system
6815                      * or exec, which can't be a bareword */
6816                     if ((PL_last_lop_op == OP_PRINT
6817                             || PL_last_lop_op == OP_PRTF
6818                             || PL_last_lop_op == OP_SAY
6819                             || PL_last_lop_op == OP_SYSTEM
6820                             || PL_last_lop_op == OP_EXEC)
6821                             && (PL_hints & HINT_STRICT_SUBS))
6822                         pl_yylval.opval->op_private |= OPpCONST_STRICT;
6823                     if (lastchar != '-') {
6824                         if (ckWARN(WARN_RESERVED)) {
6825                             d = PL_tokenbuf;
6826                             while (isLOWER(*d))
6827                                 d++;
6828                             if (!*d && !gv_stashpv(PL_tokenbuf, UTF ? SVf_UTF8 : 0))
6829                             {
6830                                 /* PL_warn_reserved is constant */
6831                                 GCC_DIAG_IGNORE(-Wformat-nonliteral);
6832                                 Perl_warner(aTHX_ packWARN(WARN_RESERVED), PL_warn_reserved,
6833                                        PL_tokenbuf);
6834                                 GCC_DIAG_RESTORE;
6835                             }
6836                         }
6837                     }
6838                 }
6839                 op_free(rv2cv_op);
6840
6841             safe_bareword:
6842                 if ((lastchar == '*' || lastchar == '%' || lastchar == '&')
6843                  && saw_infix_sigil) {
6844                     Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
6845                                      "Operator or semicolon missing before %c%"UTF8f,
6846                                      lastchar,
6847                                      UTF8fARG(UTF, strlen(PL_tokenbuf),
6848                                               PL_tokenbuf));
6849                     Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
6850                                      "Ambiguous use of %c resolved as operator %c",
6851                                      lastchar, lastchar);
6852                 }
6853                 TOKEN(WORD);
6854             }
6855
6856         case KEY___FILE__:
6857             FUN0OP(
6858                 (OP*)newSVOP(OP_CONST, 0, newSVpv(CopFILE(PL_curcop),0))
6859             );
6860
6861         case KEY___LINE__:
6862             FUN0OP(
6863                 (OP*)newSVOP(OP_CONST, 0,
6864                     Perl_newSVpvf(aTHX_ "%"IVdf, (IV)CopLINE(PL_curcop)))
6865             );
6866
6867         case KEY___PACKAGE__:
6868             FUN0OP(
6869                 (OP*)newSVOP(OP_CONST, 0,
6870                                         (PL_curstash
6871                                          ? newSVhek(HvNAME_HEK(PL_curstash))
6872                                          : &PL_sv_undef))
6873             );
6874
6875         case KEY___DATA__:
6876         case KEY___END__: {
6877             GV *gv;
6878             if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
6879                 HV * const stash = PL_tokenbuf[2] == 'D' && PL_curstash
6880                                         ? PL_curstash
6881                                         : PL_defstash;
6882                 gv = (GV *)*hv_fetchs(stash, "DATA", 1);
6883                 if (!isGV(gv))
6884                     gv_init(gv,stash,"DATA",4,0);
6885                 GvMULTI_on(gv);
6886                 if (!GvIO(gv))
6887                     GvIOp(gv) = newIO();
6888                 IoIFP(GvIOp(gv)) = PL_rsfp;
6889 #if defined(HAS_FCNTL) && defined(F_SETFD)
6890                 {
6891                     const int fd = PerlIO_fileno(PL_rsfp);
6892                     fcntl(fd,F_SETFD,fd >= 3);
6893                 }
6894 #endif
6895                 /* Mark this internal pseudo-handle as clean */
6896                 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
6897                 if ((PerlIO*)PL_rsfp == PerlIO_stdin())
6898                     IoTYPE(GvIOp(gv)) = IoTYPE_STD;
6899                 else
6900                     IoTYPE(GvIOp(gv)) = IoTYPE_RDONLY;
6901 #if defined(WIN32) && !defined(PERL_TEXTMODE_SCRIPTS)
6902                 /* if the script was opened in binmode, we need to revert
6903                  * it to text mode for compatibility; but only iff it has CRs
6904                  * XXX this is a questionable hack at best. */
6905                 if (PL_bufend-PL_bufptr > 2
6906                     && PL_bufend[-1] == '\n' && PL_bufend[-2] == '\r')
6907                 {
6908                     Off_t loc = 0;
6909                     if (IoTYPE(GvIOp(gv)) == IoTYPE_RDONLY) {
6910                         loc = PerlIO_tell(PL_rsfp);
6911                         (void)PerlIO_seek(PL_rsfp, 0L, 0);
6912                     }
6913 #ifdef NETWARE
6914                         if (PerlLIO_setmode(PL_rsfp, O_TEXT) != -1) {
6915 #else
6916                     if (PerlLIO_setmode(PerlIO_fileno(PL_rsfp), O_TEXT) != -1) {
6917 #endif  /* NETWARE */
6918                         if (loc > 0)
6919                             PerlIO_seek(PL_rsfp, loc, 0);
6920                     }
6921                 }
6922 #endif
6923 #ifdef PERLIO_LAYERS
6924                 if (!IN_BYTES) {
6925                     if (UTF)
6926                         PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, ":utf8");
6927                     else if (IN_ENCODING) {
6928                         SV *name;
6929                         dSP;
6930                         ENTER;
6931                         SAVETMPS;
6932                         PUSHMARK(sp);
6933                         XPUSHs(_get_encoding());
6934                         PUTBACK;
6935                         call_method("name", G_SCALAR);
6936                         SPAGAIN;
6937                         name = POPs;
6938                         PUTBACK;
6939                         PerlIO_apply_layers(aTHX_ PL_rsfp, NULL,
6940                                             Perl_form(aTHX_ ":encoding(%"SVf")",
6941                                                       SVfARG(name)));
6942                         FREETMPS;
6943                         LEAVE;
6944                     }
6945                 }
6946 #endif
6947                 PL_rsfp = NULL;
6948             }
6949             goto fake_eof;
6950         }
6951
6952         case KEY___SUB__:
6953             FUN0OP(CvCLONE(PL_compcv)
6954                         ? newOP(OP_RUNCV, 0)
6955                         : newPVOP(OP_RUNCV,0,NULL));
6956
6957         case KEY_AUTOLOAD:
6958         case KEY_DESTROY:
6959         case KEY_BEGIN:
6960         case KEY_UNITCHECK:
6961         case KEY_CHECK:
6962         case KEY_INIT:
6963         case KEY_END:
6964             if (PL_expect == XSTATE) {
6965                 s = PL_bufptr;
6966                 goto really_sub;
6967             }
6968             goto just_a_word;
6969
6970         case_KEY_CORE:
6971             {
6972                 STRLEN olen = len;
6973                 d = s;
6974                 s += 2;
6975                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
6976                 if ((*s == ':' && s[1] == ':')
6977                  || (!(tmp = keyword(PL_tokenbuf, len, 1)) && *s == '\''))
6978                 {
6979                     s = d;
6980                     len = olen;
6981                     Copy(PL_bufptr, PL_tokenbuf, olen, char);
6982                     goto just_a_word;
6983                 }
6984                 if (!tmp)
6985                     Perl_croak(aTHX_ "CORE::%"UTF8f" is not a keyword",
6986                                       UTF8fARG(UTF, len, PL_tokenbuf));
6987                 if (tmp < 0)
6988                     tmp = -tmp;
6989                 else if (tmp == KEY_require || tmp == KEY_do
6990                       || tmp == KEY_glob)
6991                     /* that's a way to remember we saw "CORE::" */
6992                     orig_keyword = tmp;
6993                 goto reserved_word;
6994             }
6995
6996         case KEY_abs:
6997             UNI(OP_ABS);
6998
6999         case KEY_alarm:
7000             UNI(OP_ALARM);
7001
7002         case KEY_accept:
7003             LOP(OP_ACCEPT,XTERM);
7004
7005         case KEY_and:
7006             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_LOWLOGIC)
7007                 return REPORT(0);
7008             OPERATOR(ANDOP);
7009
7010         case KEY_atan2:
7011             LOP(OP_ATAN2,XTERM);
7012
7013         case KEY_bind:
7014             LOP(OP_BIND,XTERM);
7015
7016         case KEY_binmode:
7017             LOP(OP_BINMODE,XTERM);
7018
7019         case KEY_bless:
7020             LOP(OP_BLESS,XTERM);
7021
7022         case KEY_break:
7023             FUN0(OP_BREAK);
7024
7025         case KEY_chop:
7026             UNI(OP_CHOP);
7027
7028         case KEY_continue:
7029                     /* We have to disambiguate the two senses of
7030                       "continue". If the next token is a '{' then
7031                       treat it as the start of a continue block;
7032                       otherwise treat it as a control operator.
7033                      */
7034                     s = skipspace(s);
7035                     if (*s == '{')
7036             PREBLOCK(CONTINUE);
7037                     else
7038                         FUN0(OP_CONTINUE);
7039
7040         case KEY_chdir:
7041             /* may use HOME */
7042             (void)gv_fetchpvs("ENV", GV_ADD|GV_NOTQUAL, SVt_PVHV);
7043             UNI(OP_CHDIR);
7044
7045         case KEY_close:
7046             UNI(OP_CLOSE);
7047
7048         case KEY_closedir:
7049             UNI(OP_CLOSEDIR);
7050
7051         case KEY_cmp:
7052             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE)
7053                 return REPORT(0);
7054             Eop(OP_SCMP);
7055
7056         case KEY_caller:
7057             UNI(OP_CALLER);
7058
7059         case KEY_crypt:
7060 #ifdef FCRYPT
7061             if (!PL_cryptseen) {
7062                 PL_cryptseen = TRUE;
7063                 init_des();
7064             }
7065 #endif
7066             LOP(OP_CRYPT,XTERM);
7067
7068         case KEY_chmod:
7069             LOP(OP_CHMOD,XTERM);
7070
7071         case KEY_chown:
7072             LOP(OP_CHOWN,XTERM);
7073
7074         case KEY_connect:
7075             LOP(OP_CONNECT,XTERM);
7076
7077         case KEY_chr:
7078             UNI(OP_CHR);
7079
7080         case KEY_cos:
7081             UNI(OP_COS);
7082
7083         case KEY_chroot:
7084             UNI(OP_CHROOT);
7085
7086         case KEY_default:
7087             PREBLOCK(DEFAULT);
7088
7089         case KEY_do:
7090             s = skipspace(s);
7091             if (*s == '{')
7092                 PRETERMBLOCK(DO);
7093             if (*s != '\'') {
7094                 *PL_tokenbuf = '&';
7095                 d = scan_word(s, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
7096                               1, &len);
7097                 if (len && (len != 4 || strNE(PL_tokenbuf+1, "CORE"))
7098                  && !keyword(PL_tokenbuf + 1, len, 0)) {
7099                     d = skipspace(d);
7100                     if (*d == '(') {
7101                         force_ident_maybe_lex('&');
7102                         s = d;
7103                     }
7104                 }
7105             }
7106             if (orig_keyword == KEY_do) {
7107                 orig_keyword = 0;
7108                 pl_yylval.ival = 1;
7109             }
7110             else
7111                 pl_yylval.ival = 0;
7112             OPERATOR(DO);
7113
7114         case KEY_die:
7115             PL_hints |= HINT_BLOCK_SCOPE;
7116             LOP(OP_DIE,XTERM);
7117
7118         case KEY_defined:
7119             UNI(OP_DEFINED);
7120
7121         case KEY_delete:
7122             UNI(OP_DELETE);
7123
7124         case KEY_dbmopen:
7125             Perl_populate_isa(aTHX_ STR_WITH_LEN("AnyDBM_File::ISA"),
7126                               STR_WITH_LEN("NDBM_File::"),
7127                               STR_WITH_LEN("DB_File::"),
7128                               STR_WITH_LEN("GDBM_File::"),
7129                               STR_WITH_LEN("SDBM_File::"),
7130                               STR_WITH_LEN("ODBM_File::"),
7131                               NULL);
7132             LOP(OP_DBMOPEN,XTERM);
7133
7134         case KEY_dbmclose:
7135             UNI(OP_DBMCLOSE);
7136
7137         case KEY_dump:
7138             LOOPX(OP_DUMP);
7139
7140         case KEY_else:
7141             PREBLOCK(ELSE);
7142
7143         case KEY_elsif:
7144             pl_yylval.ival = CopLINE(PL_curcop);
7145             OPERATOR(ELSIF);
7146
7147         case KEY_eq:
7148             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE)
7149                 return REPORT(0);
7150             Eop(OP_SEQ);
7151
7152         case KEY_exists:
7153             UNI(OP_EXISTS);
7154         
7155         case KEY_exit:
7156             UNI(OP_EXIT);
7157
7158         case KEY_eval:
7159             s = skipspace(s);
7160             if (*s == '{') { /* block eval */
7161                 PL_expect = XTERMBLOCK;
7162                 UNIBRACK(OP_ENTERTRY);
7163             }
7164             else { /* string eval */
7165                 PL_expect = XTERM;
7166                 UNIBRACK(OP_ENTEREVAL);
7167             }
7168
7169         case KEY_evalbytes:
7170             PL_expect = XTERM;
7171             UNIBRACK(-OP_ENTEREVAL);
7172
7173         case KEY_eof:
7174             UNI(OP_EOF);
7175
7176         case KEY_exp:
7177             UNI(OP_EXP);
7178
7179         case KEY_each:
7180             UNI(OP_EACH);
7181
7182         case KEY_exec:
7183             LOP(OP_EXEC,XREF);
7184
7185         case KEY_endhostent:
7186             FUN0(OP_EHOSTENT);
7187
7188         case KEY_endnetent:
7189             FUN0(OP_ENETENT);
7190
7191         case KEY_endservent:
7192             FUN0(OP_ESERVENT);
7193
7194         case KEY_endprotoent:
7195             FUN0(OP_EPROTOENT);
7196
7197         case KEY_endpwent:
7198             FUN0(OP_EPWENT);
7199
7200         case KEY_endgrent:
7201             FUN0(OP_EGRENT);
7202
7203         case KEY_for:
7204         case KEY_foreach:
7205             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR)
7206                 return REPORT(0);
7207             pl_yylval.ival = CopLINE(PL_curcop);
7208             s = skipspace(s);
7209             if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) {
7210                 char *p = s;
7211
7212                 if ((PL_bufend - p) >= 3 &&
7213                     strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
7214                     p += 2;
7215                 else if ((PL_bufend - p) >= 4 &&
7216                     strnEQ(p, "our", 3) && isSPACE(*(p + 3)))
7217                     p += 3;
7218                 p = skipspace(p);
7219                 /* skip optional package name, as in "for my abc $x (..)" */
7220                 if (isIDFIRST_lazy_if(p,UTF)) {
7221                     p = scan_word(p, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
7222                     p = skipspace(p);
7223                 }
7224                 if (*p != '$')
7225                     Perl_croak(aTHX_ "Missing $ on loop variable");
7226             }
7227             OPERATOR(FOR);
7228
7229         case KEY_formline:
7230             LOP(OP_FORMLINE,XTERM);
7231
7232         case KEY_fork:
7233             FUN0(OP_FORK);
7234
7235         case KEY_fc:
7236             UNI(OP_FC);
7237
7238         case KEY_fcntl:
7239             LOP(OP_FCNTL,XTERM);
7240
7241         case KEY_fileno:
7242             UNI(OP_FILENO);
7243
7244         case KEY_flock:
7245             LOP(OP_FLOCK,XTERM);
7246
7247         case KEY_gt:
7248             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE)
7249                 return REPORT(0);
7250             Rop(OP_SGT);
7251
7252         case KEY_ge:
7253             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE)
7254                 return REPORT(0);
7255             Rop(OP_SGE);
7256
7257         case KEY_grep:
7258             LOP(OP_GREPSTART, XREF);
7259
7260         case KEY_goto:
7261             LOOPX(OP_GOTO);
7262
7263         case KEY_gmtime:
7264             UNI(OP_GMTIME);
7265
7266         case KEY_getc:
7267             UNIDOR(OP_GETC);
7268
7269         case KEY_getppid:
7270             FUN0(OP_GETPPID);
7271
7272         case KEY_getpgrp:
7273             UNI(OP_GETPGRP);
7274
7275         case KEY_getpriority:
7276             LOP(OP_GETPRIORITY,XTERM);
7277
7278         case KEY_getprotobyname:
7279             UNI(OP_GPBYNAME);
7280
7281         case KEY_getprotobynumber:
7282             LOP(OP_GPBYNUMBER,XTERM);
7283
7284         case KEY_getprotoent:
7285             FUN0(OP_GPROTOENT);
7286
7287         case KEY_getpwent:
7288             FUN0(OP_GPWENT);
7289
7290         case KEY_getpwnam:
7291             UNI(OP_GPWNAM);
7292
7293         case KEY_getpwuid:
7294             UNI(OP_GPWUID);
7295
7296         case KEY_getpeername:
7297             UNI(OP_GETPEERNAME);
7298
7299         case KEY_gethostbyname:
7300             UNI(OP_GHBYNAME);
7301
7302         case KEY_gethostbyaddr:
7303             LOP(OP_GHBYADDR,XTERM);
7304
7305         case KEY_gethostent:
7306             FUN0(OP_GHOSTENT);
7307
7308         case KEY_getnetbyname:
7309             UNI(OP_GNBYNAME);
7310
7311         case KEY_getnetbyaddr:
7312             LOP(OP_GNBYADDR,XTERM);
7313
7314         case KEY_getnetent:
7315             FUN0(OP_GNETENT);
7316
7317         case KEY_getservbyname:
7318             LOP(OP_GSBYNAME,XTERM);
7319
7320         case KEY_getservbyport:
7321             LOP(OP_GSBYPORT,XTERM);
7322
7323         case KEY_getservent:
7324             FUN0(OP_GSERVENT);
7325
7326         case KEY_getsockname:
7327             UNI(OP_GETSOCKNAME);
7328
7329         case KEY_getsockopt:
7330             LOP(OP_GSOCKOPT,XTERM);
7331
7332         case KEY_getgrent:
7333             FUN0(OP_GGRENT);
7334
7335         case KEY_getgrnam:
7336             UNI(OP_GGRNAM);
7337
7338         case KEY_getgrgid:
7339             UNI(OP_GGRGID);
7340
7341         case KEY_getlogin:
7342             FUN0(OP_GETLOGIN);
7343
7344         case KEY_given:
7345             pl_yylval.ival = CopLINE(PL_curcop);
7346             Perl_ck_warner_d(aTHX_
7347                 packWARN(WARN_EXPERIMENTAL__SMARTMATCH),
7348                 "given is experimental");
7349             OPERATOR(GIVEN);
7350
7351         case KEY_glob:
7352             LOP(
7353              orig_keyword==KEY_glob ? -OP_GLOB : OP_GLOB,
7354              XTERM
7355             );
7356
7357         case KEY_hex:
7358             UNI(OP_HEX);
7359
7360         case KEY_if:
7361             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR)
7362                 return REPORT(0);
7363             pl_yylval.ival = CopLINE(PL_curcop);
7364             OPERATOR(IF);
7365
7366         case KEY_index:
7367             LOP(OP_INDEX,XTERM);
7368
7369         case KEY_int:
7370             UNI(OP_INT);
7371
7372         case KEY_ioctl:
7373             LOP(OP_IOCTL,XTERM);
7374
7375         case KEY_join:
7376             LOP(OP_JOIN,XTERM);
7377
7378         case KEY_keys:
7379             UNI(OP_KEYS);
7380
7381         case KEY_kill:
7382             LOP(OP_KILL,XTERM);
7383
7384         case KEY_last:
7385             LOOPX(OP_LAST);
7386         
7387         case KEY_lc:
7388             UNI(OP_LC);
7389
7390         case KEY_lcfirst:
7391             UNI(OP_LCFIRST);
7392
7393         case KEY_local:
7394             pl_yylval.ival = 0;
7395             OPERATOR(LOCAL);
7396
7397         case KEY_length:
7398             UNI(OP_LENGTH);
7399
7400         case KEY_lt:
7401             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE)
7402                 return REPORT(0);
7403             Rop(OP_SLT);
7404
7405         case KEY_le:
7406             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE)
7407                 return REPORT(0);
7408             Rop(OP_SLE);
7409
7410         case KEY_localtime:
7411             UNI(OP_LOCALTIME);
7412
7413         case KEY_log:
7414             UNI(OP_LOG);
7415
7416         case KEY_link:
7417             LOP(OP_LINK,XTERM);
7418
7419         case KEY_listen:
7420             LOP(OP_LISTEN,XTERM);
7421
7422         case KEY_lock:
7423             UNI(OP_LOCK);
7424
7425         case KEY_lstat:
7426             UNI(OP_LSTAT);
7427
7428         case KEY_m:
7429             s = scan_pat(s,OP_MATCH);
7430             TERM(sublex_start());
7431
7432         case KEY_map:
7433             LOP(OP_MAPSTART, XREF);
7434
7435         case KEY_mkdir:
7436             LOP(OP_MKDIR,XTERM);
7437
7438         case KEY_msgctl:
7439             LOP(OP_MSGCTL,XTERM);
7440
7441         case KEY_msgget:
7442             LOP(OP_MSGGET,XTERM);
7443
7444         case KEY_msgrcv:
7445             LOP(OP_MSGRCV,XTERM);
7446
7447         case KEY_msgsnd:
7448             LOP(OP_MSGSND,XTERM);
7449
7450         case KEY_our:
7451         case KEY_my:
7452         case KEY_state:
7453             PL_in_my = (U16)tmp;
7454             s = skipspace(s);
7455             if (isIDFIRST_lazy_if(s,UTF)) {
7456                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
7457                 if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
7458                 {
7459                     if (!FEATURE_LEXSUBS_IS_ENABLED)
7460                         Perl_croak(aTHX_
7461                                   "Experimental \"%s\" subs not enabled",
7462                                    tmp == KEY_my    ? "my"    :
7463                                    tmp == KEY_state ? "state" : "our");
7464                     Perl_ck_warner_d(aTHX_
7465                         packWARN(WARN_EXPERIMENTAL__LEXICAL_SUBS),
7466                         "The lexical_subs feature is experimental");
7467                     goto really_sub;
7468                 }
7469                 PL_in_my_stash = find_in_my_stash(PL_tokenbuf, len);
7470                 if (!PL_in_my_stash) {
7471                     char tmpbuf[1024];
7472                     int len;
7473                     PL_bufptr = s;
7474                     len = my_snprintf(tmpbuf, sizeof(tmpbuf), "No such class %.1000s", PL_tokenbuf);
7475                     PERL_MY_SNPRINTF_POST_GUARD(len, sizeof(tmpbuf));
7476                     yyerror_pv(tmpbuf, UTF ? SVf_UTF8 : 0);
7477                 }
7478             }
7479             pl_yylval.ival = 1;
7480             OPERATOR(MY);
7481
7482         case KEY_next:
7483             LOOPX(OP_NEXT);
7484
7485         case KEY_ne:
7486             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE)
7487                 return REPORT(0);
7488             Eop(OP_SNE);
7489
7490         case KEY_no:
7491             s = tokenize_use(0, s);
7492             TOKEN(USE);
7493
7494         case KEY_not:
7495             if (*s == '(' || (s = skipspace(s), *s == '('))
7496                 FUN1(OP_NOT);
7497             else {
7498                 if (!PL_lex_allbrackets &&
7499                         PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC)
7500                     PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC;
7501                 OPERATOR(NOTOP);
7502             }
7503
7504         case KEY_open:
7505             s = skipspace(s);
7506             if (isIDFIRST_lazy_if(s,UTF)) {
7507           const char *t;
7508           d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE,
7509               &len);
7510                 for (t=d; isSPACE(*t);)
7511                     t++;
7512                 if ( *t && strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
7513                     /* [perl #16184] */
7514                     && !(t[0] == '=' && t[1] == '>')
7515                     && !(t[0] == ':' && t[1] == ':')
7516                     && !keyword(s, d-s, 0)
7517                 ) {
7518                     Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE),
7519                        "Precedence problem: open %"UTF8f" should be open(%"UTF8f")",
7520                         UTF8fARG(UTF, d-s, s), UTF8fARG(UTF, d-s, s));
7521                 }
7522             }
7523             LOP(OP_OPEN,XTERM);
7524
7525         case KEY_or:
7526             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_LOWLOGIC)
7527                 return REPORT(0);
7528             pl_yylval.ival = OP_OR;
7529             OPERATOR(OROP);
7530
7531         case KEY_ord:
7532             UNI(OP_ORD);
7533
7534         case KEY_oct:
7535             UNI(OP_OCT);
7536
7537         case KEY_opendir:
7538             LOP(OP_OPEN_DIR,XTERM);
7539
7540         case KEY_print:
7541             checkcomma(s,PL_tokenbuf,"filehandle");
7542             LOP(OP_PRINT,XREF);
7543
7544         case KEY_printf:
7545             checkcomma(s,PL_tokenbuf,"filehandle");
7546             LOP(OP_PRTF,XREF);
7547
7548         case KEY_prototype:
7549             UNI(OP_PROTOTYPE);
7550
7551         case KEY_push:
7552             LOP(OP_PUSH,XTERM);
7553
7554         case KEY_pop:
7555             UNIDOR(OP_POP);
7556
7557         case KEY_pos:
7558             UNIDOR(OP_POS);
7559         
7560         case KEY_pack:
7561             LOP(OP_PACK,XTERM);
7562
7563         case KEY_package:
7564             s = force_word(s,WORD,FALSE,TRUE);
7565             s = skipspace(s);
7566             s = force_strict_version(s);
7567             PREBLOCK(PACKAGE);
7568
7569         case KEY_pipe:
7570             LOP(OP_PIPE_OP,XTERM);
7571
7572         case KEY_q:
7573             s = scan_str(s,FALSE,FALSE,FALSE,NULL);
7574             if (!s)
7575                 missingterm(NULL);
7576             COPLINE_SET_FROM_MULTI_END;
7577             pl_yylval.ival = OP_CONST;
7578             TERM(sublex_start());
7579
7580         case KEY_quotemeta:
7581             UNI(OP_QUOTEMETA);
7582
7583         case KEY_qw: {
7584             OP *words = NULL;
7585             s = scan_str(s,FALSE,FALSE,FALSE,NULL);
7586             if (!s)
7587                 missingterm(NULL);
7588             COPLINE_SET_FROM_MULTI_END;
7589             PL_expect = XOPERATOR;
7590             if (SvCUR(PL_lex_stuff)) {
7591                 int warned_comma = !ckWARN(WARN_QW);
7592                 int warned_comment = warned_comma;
7593                 d = SvPV_force(PL_lex_stuff, len);
7594                 while (len) {
7595                     for (; isSPACE(*d) && len; --len, ++d)
7596                         /**/;
7597                     if (len) {
7598                         SV *sv;
7599                         const char *b = d;
7600                         if (!warned_comma || !warned_comment) {
7601                             for (; !isSPACE(*d) && len; --len, ++d) {
7602                                 if (!warned_comma && *d == ',') {
7603                                     Perl_warner(aTHX_ packWARN(WARN_QW),
7604                                         "Possible attempt to separate words with commas");
7605                                     ++warned_comma;
7606                                 }
7607                                 else if (!warned_comment && *d == '#') {
7608                                     Perl_warner(aTHX_ packWARN(WARN_QW),
7609                                         "Possible attempt to put comments in qw() list");
7610                                     ++warned_comment;
7611                                 }
7612                             }
7613                         }
7614                         else {
7615                             for (; !isSPACE(*d) && len; --len, ++d)
7616                                 /**/;
7617                         }
7618                         sv = newSVpvn_utf8(b, d-b, DO_UTF8(PL_lex_stuff));
7619                         words = op_append_elem(OP_LIST, words,
7620                                             newSVOP(OP_CONST, 0, tokeq(sv)));
7621                     }
7622                 }
7623             }
7624             if (!words)
7625                 words = newNULLLIST();
7626             if (PL_lex_stuff) {
7627                 SvREFCNT_dec(PL_lex_stuff);
7628                 PL_lex_stuff = NULL;
7629             }
7630             PL_expect = XOPERATOR;
7631             pl_yylval.opval = sawparens(words);
7632             TOKEN(QWLIST);
7633         }
7634
7635         case KEY_qq:
7636             s = scan_str(s,FALSE,FALSE,FALSE,NULL);
7637             if (!s)
7638                 missingterm(NULL);
7639             pl_yylval.ival = OP_STRINGIFY;
7640             if (SvIVX(PL_lex_stuff) == '\'')
7641                 SvIV_set(PL_lex_stuff, 0);      /* qq'$foo' should interpolate */
7642             TERM(sublex_start());
7643
7644         case KEY_qr:
7645             s = scan_pat(s,OP_QR);
7646             TERM(sublex_start());
7647
7648         case KEY_qx:
7649             s = scan_str(s,FALSE,FALSE,FALSE,NULL);
7650             if (!s)
7651                 missingterm(NULL);
7652             pl_yylval.ival = OP_BACKTICK;
7653             TERM(sublex_start());
7654
7655         case KEY_return:
7656             OLDLOP(OP_RETURN);
7657
7658         case KEY_require:
7659             s = skipspace(s);
7660             if (isDIGIT(*s)) {
7661                 s = force_version(s, FALSE);
7662             }
7663             else if (*s != 'v' || !isDIGIT(s[1])
7664                     || (s = force_version(s, TRUE), *s == 'v'))
7665             {
7666                 *PL_tokenbuf = '\0';
7667                 s = force_word(s,WORD,TRUE,TRUE);
7668                 if (isIDFIRST_lazy_if(PL_tokenbuf,UTF))
7669                     gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf),
7670                                 GV_ADD | (UTF ? SVf_UTF8 : 0));
7671                 else if (*s == '<')
7672                     yyerror("<> at require-statement should be quotes");
7673             }
7674             if (orig_keyword == KEY_require) {
7675                 orig_keyword = 0;
7676                 pl_yylval.ival = 1;
7677             }
7678             else 
7679                 pl_yylval.ival = 0;
7680             PL_expect = PL_nexttoke ? XOPERATOR : XTERM;
7681             PL_bufptr = s;
7682             PL_last_uni = PL_oldbufptr;
7683             PL_last_lop_op = OP_REQUIRE;
7684             s = skipspace(s);
7685             return REPORT( (int)REQUIRE );
7686
7687         case KEY_reset:
7688             UNI(OP_RESET);
7689
7690         case KEY_redo:
7691             LOOPX(OP_REDO);
7692
7693         case KEY_rename:
7694             LOP(OP_RENAME,XTERM);
7695
7696         case KEY_rand:
7697             UNI(OP_RAND);
7698
7699         case KEY_rmdir:
7700             UNI(OP_RMDIR);
7701
7702         case KEY_rindex:
7703             LOP(OP_RINDEX,XTERM);
7704
7705         case KEY_read:
7706             LOP(OP_READ,XTERM);
7707
7708         case KEY_readdir:
7709             UNI(OP_READDIR);
7710
7711         case KEY_readline:
7712             UNIDOR(OP_READLINE);
7713
7714         case KEY_readpipe:
7715             UNIDOR(OP_BACKTICK);
7716
7717         case KEY_rewinddir:
7718             UNI(OP_REWINDDIR);
7719
7720         case KEY_recv:
7721             LOP(OP_RECV,XTERM);
7722
7723         case KEY_reverse:
7724             LOP(OP_REVERSE,XTERM);
7725
7726         case KEY_readlink:
7727             UNIDOR(OP_READLINK);
7728
7729         case KEY_ref:
7730             UNI(OP_REF);
7731
7732         case KEY_s:
7733             s = scan_subst(s);
7734             if (pl_yylval.opval)
7735                 TERM(sublex_start());
7736             else
7737                 TOKEN(1);       /* force error */
7738
7739         case KEY_say:
7740             checkcomma(s,PL_tokenbuf,"filehandle");
7741             LOP(OP_SAY,XREF);
7742
7743         case KEY_chomp:
7744             UNI(OP_CHOMP);
7745         
7746         case KEY_scalar:
7747             UNI(OP_SCALAR);
7748
7749         case KEY_select:
7750             LOP(OP_SELECT,XTERM);
7751
7752         case KEY_seek:
7753             LOP(OP_SEEK,XTERM);
7754
7755         case KEY_semctl:
7756             LOP(OP_SEMCTL,XTERM);
7757
7758         case KEY_semget:
7759             LOP(OP_SEMGET,XTERM);
7760
7761         case KEY_semop:
7762             LOP(OP_SEMOP,XTERM);
7763
7764         case KEY_send:
7765             LOP(OP_SEND,XTERM);
7766
7767         case KEY_setpgrp:
7768             LOP(OP_SETPGRP,XTERM);
7769
7770         case KEY_setpriority:
7771             LOP(OP_SETPRIORITY,XTERM);
7772
7773         case KEY_sethostent:
7774             UNI(OP_SHOSTENT);
7775
7776         case KEY_setnetent:
7777             UNI(OP_SNETENT);
7778
7779         case KEY_setservent:
7780             UNI(OP_SSERVENT);
7781
7782         case KEY_setprotoent:
7783             UNI(OP_SPROTOENT);
7784
7785         case KEY_setpwent:
7786             FUN0(OP_SPWENT);
7787
7788         case KEY_setgrent:
7789             FUN0(OP_SGRENT);
7790
7791         case KEY_seekdir:
7792             LOP(OP_SEEKDIR,XTERM);
7793
7794         case KEY_setsockopt:
7795             LOP(OP_SSOCKOPT,XTERM);
7796
7797         case KEY_shift:
7798             UNIDOR(OP_SHIFT);
7799
7800         case KEY_shmctl:
7801             LOP(OP_SHMCTL,XTERM);
7802
7803         case KEY_shmget:
7804             LOP(OP_SHMGET,XTERM);
7805
7806         case KEY_shmread:
7807             LOP(OP_SHMREAD,XTERM);
7808
7809         case KEY_shmwrite:
7810             LOP(OP_SHMWRITE,XTERM);
7811
7812         case KEY_shutdown:
7813             LOP(OP_SHUTDOWN,XTERM);
7814
7815         case KEY_sin:
7816             UNI(OP_SIN);
7817
7818         case KEY_sleep:
7819             UNI(OP_SLEEP);
7820
7821         case KEY_socket:
7822             LOP(OP_SOCKET,XTERM);
7823
7824         case KEY_socketpair:
7825             LOP(OP_SOCKPAIR,XTERM);
7826
7827         case KEY_sort:
7828             checkcomma(s,PL_tokenbuf,"subroutine name");
7829             s = skipspace(s);
7830             PL_expect = XTERM;
7831             s = force_word(s,WORD,TRUE,TRUE);
7832             LOP(OP_SORT,XREF);
7833
7834         case KEY_split:
7835             LOP(OP_SPLIT,XTERM);
7836
7837         case KEY_sprintf:
7838             LOP(OP_SPRINTF,XTERM);
7839
7840         case KEY_splice:
7841             LOP(OP_SPLICE,XTERM);
7842
7843         case KEY_sqrt:
7844             UNI(OP_SQRT);
7845
7846         case KEY_srand:
7847             UNI(OP_SRAND);
7848
7849         case KEY_stat:
7850             UNI(OP_STAT);
7851
7852         case KEY_study:
7853             UNI(OP_STUDY);
7854
7855         case KEY_substr:
7856             LOP(OP_SUBSTR,XTERM);
7857
7858         case KEY_format:
7859         case KEY_sub:
7860           really_sub:
7861             {
7862                 char * const tmpbuf = PL_tokenbuf + 1;
7863                 expectation attrful;
7864                 bool have_name, have_proto;
7865                 const int key = tmp;
7866                 SV *format_name = NULL;
7867
7868                 d = s;
7869                 s = skipspace(s);
7870
7871                 if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' ||
7872                     (*s == ':' && s[1] == ':'))
7873                 {
7874
7875                     PL_expect = XBLOCK;
7876                     attrful = XATTRBLOCK;
7877                     d = scan_word(s, tmpbuf, sizeof PL_tokenbuf - 1, TRUE,
7878                                   &len);
7879                     if (key == KEY_format)
7880                         format_name = S_newSV_maybe_utf8(aTHX_ s, d - s);
7881                     *PL_tokenbuf = '&';
7882                     if (memchr(tmpbuf, ':', len) || key != KEY_sub
7883                      || pad_findmy_pvn(
7884                             PL_tokenbuf, len + 1, 0
7885                         ) != NOT_IN_PAD)
7886                         sv_setpvn(PL_subname, tmpbuf, len);
7887                     else {
7888                         sv_setsv(PL_subname,PL_curstname);
7889                         sv_catpvs(PL_subname,"::");
7890                         sv_catpvn(PL_subname,tmpbuf,len);
7891                     }
7892                     if (SvUTF8(PL_linestr))
7893                         SvUTF8_on(PL_subname);
7894                     have_name = TRUE;
7895
7896
7897                     s = skipspace(d);
7898                 }
7899                 else {
7900                     if (key == KEY_my || key == KEY_our || key==KEY_state)
7901                     {
7902                         *d = '\0';
7903                         /* diag_listed_as: Missing name in "%s sub" */
7904                         Perl_croak(aTHX_
7905                                   "Missing name in \"%s\"", PL_bufptr);
7906                     }
7907                     PL_expect = XTERMBLOCK;
7908                     attrful = XATTRTERM;
7909                     sv_setpvs(PL_subname,"?");
7910                     have_name = FALSE;
7911                 }
7912
7913                 if (key == KEY_format) {
7914                     if (format_name) {
7915                         NEXTVAL_NEXTTOKE.opval
7916                             = (OP*)newSVOP(OP_CONST,0, format_name);
7917                         NEXTVAL_NEXTTOKE.opval->op_private |= OPpCONST_BARE;
7918                         force_next(WORD);
7919                     }
7920                     PREBLOCK(FORMAT);
7921                 }
7922
7923                 /* Look for a prototype */
7924                 if (*s == '(' && !FEATURE_SIGNATURES_IS_ENABLED) {
7925                     s = scan_str(s,FALSE,FALSE,FALSE,NULL);
7926                     COPLINE_SET_FROM_MULTI_END;
7927                     if (!s)
7928                         Perl_croak(aTHX_ "Prototype not terminated");
7929                     (void)validate_proto(PL_subname, PL_lex_stuff, ckWARN(WARN_ILLEGALPROTO));
7930                     have_proto = TRUE;
7931
7932                     s = skipspace(s);
7933                 }
7934                 else
7935                     have_proto = FALSE;
7936
7937                 if (*s == ':' && s[1] != ':')
7938                     PL_expect = attrful;
7939                 else if ((*s != '{' && *s != '(') && key == KEY_sub) {
7940                     if (!have_name)
7941                         Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine");
7942                     else if (*s != ';' && *s != '}')
7943                         Perl_croak(aTHX_ "Illegal declaration of subroutine %"SVf, SVfARG(PL_subname));
7944                 }
7945
7946                 if (have_proto) {
7947                     NEXTVAL_NEXTTOKE.opval =
7948                         (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
7949                     PL_lex_stuff = NULL;
7950                     force_next(THING);
7951                 }
7952                 if (!have_name) {
7953                     if (PL_curstash)
7954                         sv_setpvs(PL_subname, "__ANON__");
7955                     else
7956                         sv_setpvs(PL_subname, "__ANON__::__ANON__");
7957                     TOKEN(ANONSUB);
7958                 }
7959                 force_ident_maybe_lex('&');
7960                 TOKEN(SUB);
7961             }
7962
7963         case KEY_system:
7964             LOP(OP_SYSTEM,XREF);
7965
7966         case KEY_symlink:
7967             LOP(OP_SYMLINK,XTERM);
7968
7969         case KEY_syscall:
7970             LOP(OP_SYSCALL,XTERM);
7971
7972         case KEY_sysopen:
7973             LOP(OP_SYSOPEN,XTERM);
7974
7975         case KEY_sysseek:
7976             LOP(OP_SYSSEEK,XTERM);
7977
7978         case KEY_sysread:
7979             LOP(OP_SYSREAD,XTERM);
7980
7981         case KEY_syswrite:
7982             LOP(OP_SYSWRITE,XTERM);
7983
7984         case KEY_tr:
7985         case KEY_y:
7986             s = scan_trans(s);
7987             TERM(sublex_start());
7988
7989         case KEY_tell:
7990             UNI(OP_TELL);
7991
7992         case KEY_telldir:
7993             UNI(OP_TELLDIR);
7994
7995         case KEY_tie:
7996             LOP(OP_TIE,XTERM);
7997
7998         case KEY_tied:
7999             UNI(OP_TIED);
8000
8001         case KEY_time:
8002             FUN0(OP_TIME);
8003
8004         case KEY_times:
8005             FUN0(OP_TMS);
8006
8007         case KEY_truncate:
8008             LOP(OP_TRUNCATE,XTERM);
8009
8010         case KEY_uc:
8011             UNI(OP_UC);
8012
8013         case KEY_ucfirst:
8014             UNI(OP_UCFIRST);
8015
8016         case KEY_untie:
8017             UNI(OP_UNTIE);
8018
8019         case KEY_until:
8020             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR)
8021                 return REPORT(0);
8022             pl_yylval.ival = CopLINE(PL_curcop);
8023             OPERATOR(UNTIL);
8024
8025         case KEY_unless:
8026             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR)
8027                 return REPORT(0);
8028             pl_yylval.ival = CopLINE(PL_curcop);
8029             OPERATOR(UNLESS);
8030
8031         case KEY_unlink:
8032             LOP(OP_UNLINK,XTERM);
8033
8034         case KEY_undef:
8035             UNIDOR(OP_UNDEF);
8036
8037         case KEY_unpack:
8038             LOP(OP_UNPACK,XTERM);
8039
8040         case KEY_utime:
8041             LOP(OP_UTIME,XTERM);
8042
8043         case KEY_umask:
8044             UNIDOR(OP_UMASK);
8045
8046         case KEY_unshift:
8047             LOP(OP_UNSHIFT,XTERM);
8048
8049         case KEY_use:
8050             s = tokenize_use(1, s);
8051             TOKEN(USE);
8052
8053         case KEY_values:
8054             UNI(OP_VALUES);
8055
8056         case KEY_vec:
8057             LOP(OP_VEC,XTERM);
8058
8059         case KEY_when:
8060             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR)
8061                 return REPORT(0);
8062             pl_yylval.ival = CopLINE(PL_curcop);
8063             Perl_ck_warner_d(aTHX_
8064                 packWARN(WARN_EXPERIMENTAL__SMARTMATCH),
8065                 "when is experimental");
8066             OPERATOR(WHEN);
8067
8068         case KEY_while:
8069             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR)
8070                 return REPORT(0);
8071             pl_yylval.ival = CopLINE(PL_curcop);
8072             OPERATOR(WHILE);
8073
8074         case KEY_warn:
8075             PL_hints |= HINT_BLOCK_SCOPE;
8076             LOP(OP_WARN,XTERM);
8077
8078         case KEY_wait:
8079             FUN0(OP_WAIT);
8080
8081         case KEY_waitpid:
8082             LOP(OP_WAITPID,XTERM);
8083
8084         case KEY_wantarray:
8085             FUN0(OP_WANTARRAY);
8086
8087         case KEY_write:
8088             /* Make sure $^L is defined. 0x0C is CTRL-L on ASCII platforms, and
8089              * we use the same number on EBCDIC */
8090             gv_fetchpvs("\x0C", GV_ADD|GV_NOTQUAL, SVt_PV);
8091             UNI(OP_ENTERWRITE);
8092
8093         case KEY_x:
8094             if (PL_expect == XOPERATOR) {
8095                 if (*s == '=' && !PL_lex_allbrackets &&
8096                         PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN)
8097                     return REPORT(0);
8098                 Mop(OP_REPEAT);
8099             }
8100             check_uni();
8101             goto just_a_word;
8102
8103         case KEY_xor:
8104             if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_LOWLOGIC)
8105                 return REPORT(0);
8106             pl_yylval.ival = OP_XOR;
8107             OPERATOR(OROP);
8108         }
8109     }}
8110 }
8111
8112 /*
8113   S_pending_ident
8114
8115   Looks up an identifier in the pad or in a package
8116
8117   Returns:
8118     PRIVATEREF if this is a lexical name.
8119     WORD       if this belongs to a package.
8120
8121   Structure:
8122       if we're in a my declaration
8123           croak if they tried to say my($foo::bar)
8124           build the ops for a my() declaration
8125       if it's an access to a my() variable
8126           build ops for access to a my() variable
8127       if in a dq string, and they've said @foo and we can't find @foo
8128           warn
8129       build ops for a bareword
8130 */
8131
8132 static int
8133 S_pending_ident(pTHX)
8134 {
8135     PADOFFSET tmp = 0;
8136     const char pit = (char)pl_yylval.ival;
8137     const STRLEN tokenbuf_len = strlen(PL_tokenbuf);
8138     /* All routes through this function want to know if there is a colon.  */
8139     const char *const has_colon = (const char*) memchr (PL_tokenbuf, ':', tokenbuf_len);
8140
8141     DEBUG_T({ PerlIO_printf(Perl_debug_log,
8142           "### Pending identifier '%s'\n", PL_tokenbuf); });
8143
8144     /* if we're in a my(), we can't allow dynamics here.
8145        $foo'bar has already been turned into $foo::bar, so
8146        just check for colons.
8147
8148        if it's a legal name, the OP is a PADANY.
8149     */
8150     if (PL_in_my) {
8151         if (PL_in_my == KEY_our) {      /* "our" is merely analogous to "my" */
8152             if (has_colon)
8153                 yyerror_pv(Perl_form(aTHX_ "No package name allowed for "
8154                                   "variable %s in \"our\"",
8155                                   PL_tokenbuf), UTF ? SVf_UTF8 : 0);
8156             tmp = allocmy(PL_tokenbuf, tokenbuf_len, UTF ? SVf_UTF8 : 0);
8157         }
8158         else {
8159             if (has_colon) {
8160                 /* "my" variable %s can't be in a package */
8161                 /* PL_no_myglob is constant */
8162                 GCC_DIAG_IGNORE(-Wformat-nonliteral);
8163                 yyerror_pv(Perl_form(aTHX_ PL_no_myglob,
8164                             PL_in_my == KEY_my ? "my" : "state",
8165                             *PL_tokenbuf == '&' ? "subroutin" : "variabl",
8166                             PL_tokenbuf),
8167                             UTF ? SVf_UTF8 : 0);
8168                 GCC_DIAG_RESTORE;
8169             }
8170
8171             pl_yylval.opval = newOP(OP_PADANY, 0);
8172             pl_yylval.opval->op_targ = allocmy(PL_tokenbuf, tokenbuf_len,
8173                                                         UTF ? SVf_UTF8 : 0);
8174             return PRIVATEREF;
8175         }
8176     }
8177
8178     /*
8179        build the ops for accesses to a my() variable.
8180     */
8181
8182     if (!has_colon) {
8183         if (!PL_in_my)
8184             tmp = pad_findmy_pvn(PL_tokenbuf, tokenbuf_len,
8185                                  0);
8186         if (tmp != NOT_IN_PAD) {
8187             /* might be an "our" variable" */
8188             if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
8189                 /* build ops for a bareword */
8190                 HV *  const stash = PAD_COMPNAME_OURSTASH(tmp);
8191                 HEK * const stashname = HvNAME_HEK(stash);
8192                 SV *  const sym = newSVhek(stashname);
8193                 sv_catpvs(sym, "::");
8194                 sv_catpvn_flags(sym, PL_tokenbuf+1, tokenbuf_len - 1, (UTF ? SV_CATUTF8 : SV_CATBYTES ));
8195                 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
8196                 pl_yylval.opval->op_private = OPpCONST_ENTERED;
8197                 if (pit != '&')
8198                   gv_fetchsv(sym,
8199                     GV_ADDMULTI,
8200                     ((PL_tokenbuf[0] == '$') ? SVt_PV
8201                      : (PL_tokenbuf[0] == '@') ? SVt_PVAV
8202                      : SVt_PVHV));
8203                 return WORD;
8204             }
8205
8206             pl_yylval.opval = newOP(OP_PADANY, 0);
8207             pl_yylval.opval->op_targ = tmp;
8208             return PRIVATEREF;
8209         }
8210     }
8211
8212     /*
8213        Whine if they've said @foo in a doublequoted string,
8214        and @foo isn't a variable we can find in the symbol
8215        table.
8216     */
8217     if (ckWARN(WARN_AMBIGUOUS) &&
8218         pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
8219         GV *const gv = gv_fetchpvn_flags(PL_tokenbuf + 1, tokenbuf_len - 1,
8220                                         ( UTF ? SVf_UTF8 : 0 ), SVt_PVAV);
8221         if ((!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
8222                 /* DO NOT warn for @- and @+ */
8223                 && !( PL_tokenbuf[2] == '\0' &&
8224                     ( PL_tokenbuf[1] == '-' || PL_tokenbuf[1] == '+' ))
8225            )
8226         {
8227             /* Downgraded from fatal to warning 20000522 mjd */
8228             Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
8229                         "Possible unintended interpolation of %"UTF8f
8230                         " in string",
8231                         UTF8fARG(UTF, tokenbuf_len, PL_tokenbuf));
8232         }
8233     }
8234
8235     /* build ops for a bareword */
8236     pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0,
8237                                    newSVpvn_flags(PL_tokenbuf + 1,
8238                                                       tokenbuf_len - 1,
8239                                                       UTF ? SVf_UTF8 : 0 ));
8240     pl_yylval.opval->op_private = OPpCONST_ENTERED;
8241     if (pit != '&')
8242         gv_fetchpvn_flags(PL_tokenbuf+1, tokenbuf_len - 1,
8243                      (PL_in_eval ? GV_ADDMULTI : GV_ADD)
8244                      | ( UTF ? SVf_UTF8 : 0 ),
8245                      ((PL_tokenbuf[0] == '$') ? SVt_PV
8246                       : (PL_tokenbuf[0] == '@') ? SVt_PVAV
8247                       : SVt_PVHV));
8248     return WORD;
8249 }
8250
8251 STATIC void
8252 S_checkcomma(pTHX_ const char *s, const char *name, const char *what)
8253 {
8254     PERL_ARGS_ASSERT_CHECKCOMMA;
8255
8256     if (*s == ' ' && s[1] == '(') {     /* XXX gotta be a better way */
8257         if (ckWARN(WARN_SYNTAX)) {
8258             int level = 1;
8259             const char *w;
8260             for (w = s+2; *w && level; w++) {
8261                 if (*w == '(')
8262                     ++level;
8263                 else if (*w == ')')
8264                     --level;
8265             }
8266             while (isSPACE(*w))
8267                 ++w;
8268             /* the list of chars below is for end of statements or
8269              * block / parens, boolean operators (&&, ||, //) and branch
8270              * constructs (or, and, if, until, unless, while, err, for).
8271              * Not a very solid hack... */
8272             if (!*w || !strchr(";&/|})]oaiuwef!=", *w))
8273                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
8274                             "%s (...) interpreted as function",name);
8275         }
8276     }
8277     while (s < PL_bufend && isSPACE(*s))
8278         s++;
8279     if (*s == '(')
8280         s++;
8281     while (s < PL_bufend && isSPACE(*s))
8282         s++;
8283     if (isIDFIRST_lazy_if(s,UTF)) {
8284         const char * const w = s;
8285         s += UTF ? UTF8SKIP(s) : 1;
8286         while (isWORDCHAR_lazy_if(s,UTF))
8287             s += UTF ? UTF8SKIP(s) : 1;
8288         while (s < PL_bufend && isSPACE(*s))
8289             s++;
8290         if (*s == ',') {
8291             GV* gv;
8292             PADOFFSET off;
8293             if (keyword(w, s - w, 0))
8294                 return;
8295
8296             gv = gv_fetchpvn_flags(w, s - w, ( UTF ? SVf_UTF8 : 0 ), SVt_PVCV);
8297             if (gv && GvCVu(gv))
8298                 return;
8299             if (s - w <= 254) {
8300                 char tmpbuf[256];
8301                 Copy(w, tmpbuf+1, s - w, char);
8302                 *tmpbuf = '&';
8303                 off = pad_findmy_pvn(tmpbuf, s-w+1, 0);
8304                 if (off != NOT_IN_PAD) return;
8305             }
8306             Perl_croak(aTHX_ "No comma allowed after %s", what);
8307         }
8308     }
8309 }
8310
8311 /* S_new_constant(): do any overload::constant lookup.
8312
8313    Either returns sv, or mortalizes/frees sv and returns a new SV*.
8314    Best used as sv=new_constant(..., sv, ...).
8315    If s, pv are NULL, calls subroutine with one argument,
8316    and <type> is used with error messages only.
8317    <type> is assumed to be well formed UTF-8 */
8318
8319 STATIC SV *
8320 S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, STRLEN keylen,
8321                SV *sv, SV *pv, const char *type, STRLEN typelen)
8322 {
8323     dSP;
8324     HV * table = GvHV(PL_hintgv);                /* ^H */
8325     SV *res;
8326     SV *errsv = NULL;
8327     SV **cvp;
8328     SV *cv, *typesv;
8329     const char *why1 = "", *why2 = "", *why3 = "";
8330
8331     PERL_ARGS_ASSERT_NEW_CONSTANT;
8332     /* We assume that this is true: */
8333     if (*key == 'c') { assert (strEQ(key, "charnames")); }
8334     assert(type || s);
8335
8336     /* charnames doesn't work well if there have been errors found */
8337     if (PL_error_count > 0 && *key == 'c')
8338     {
8339         SvREFCNT_dec_NN(sv);
8340         return &PL_sv_undef;
8341     }
8342
8343     sv_2mortal(sv);                     /* Parent created it permanently */
8344     if (!table
8345         || ! (PL_hints & HINT_LOCALIZE_HH)
8346         || ! (cvp = hv_fetch(table, key, keylen, FALSE))
8347         || ! SvOK(*cvp))
8348     {
8349         char *msg;
8350         
8351         /* Here haven't found what we're looking for.  If it is charnames,
8352          * perhaps it needs to be loaded.  Try doing that before giving up */
8353         if (*key == 'c') {
8354             Perl_load_module(aTHX_
8355                             0,
8356                             newSVpvs("_charnames"),
8357                              /* version parameter; no need to specify it, as if
8358                               * we get too early a version, will fail anyway,
8359                               * not being able to find '_charnames' */
8360                             NULL,
8361                             newSVpvs(":full"),
8362                             newSVpvs(":short"),
8363                             NULL);
8364             assert(sp == PL_stack_sp);
8365             table = GvHV(PL_hintgv);
8366             if (table
8367                 && (PL_hints & HINT_LOCALIZE_HH)
8368                 && (cvp = hv_fetch(table, key, keylen, FALSE))
8369                 && SvOK(*cvp))
8370             {
8371                 goto now_ok;
8372             }
8373         }
8374         if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
8375             msg = Perl_form(aTHX_
8376                                "Constant(%.*s) unknown",
8377                                 (int)(type ? typelen : len),
8378                                 (type ? type: s));
8379         }
8380         else {
8381             why1 = "$^H{";
8382             why2 = key;
8383             why3 = "} is not defined";
8384         report:
8385             if (*key == 'c') {
8386                 msg = Perl_form(aTHX_
8387                             /* The +3 is for '\N{'; -4 for that, plus '}' */
8388                             "Unknown charname '%.*s'", (int)typelen - 4, type + 3
8389                       );
8390             }
8391             else {
8392                 msg = Perl_form(aTHX_ "Constant(%.*s): %s%s%s",
8393                                     (int)(type ? typelen : len),
8394                                     (type ? type: s), why1, why2, why3);
8395             }
8396         }
8397         yyerror_pv(msg, UTF ? SVf_UTF8 : 0);
8398         return SvREFCNT_inc_simple_NN(sv);
8399     }
8400 now_ok:
8401     cv = *cvp;
8402     if (!pv && s)
8403         pv = newSVpvn_flags(s, len, SVs_TEMP);
8404     if (type && pv)
8405         typesv = newSVpvn_flags(type, typelen, SVs_TEMP);
8406     else
8407         typesv = &PL_sv_undef;
8408
8409     PUSHSTACKi(PERLSI_OVERLOAD);
8410     ENTER ;
8411     SAVETMPS;
8412
8413     PUSHMARK(SP) ;
8414     EXTEND(sp, 3);
8415     if (pv)
8416         PUSHs(pv);
8417     PUSHs(sv);
8418     if (pv)
8419         PUSHs(typesv);
8420     PUTBACK;
8421     call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
8422
8423     SPAGAIN ;
8424
8425     /* Check the eval first */
8426     if (!PL_in_eval && ((errsv = ERRSV), SvTRUE_NN(errsv))) {
8427         STRLEN errlen;
8428         const char * errstr;
8429         sv_catpvs(errsv, "Propagated");
8430         errstr = SvPV_const(errsv, errlen);
8431         yyerror_pvn(errstr, errlen, 0); /* Duplicates the message inside eval */
8432         (void)POPs;
8433         res = SvREFCNT_inc_simple_NN(sv);
8434     }
8435     else {
8436         res = POPs;
8437         SvREFCNT_inc_simple_void_NN(res);
8438     }
8439
8440     PUTBACK ;
8441     FREETMPS ;
8442     LEAVE ;
8443     POPSTACK;
8444
8445     if (!SvOK(res)) {
8446         why1 = "Call to &{$^H{";
8447         why2 = key;
8448         why3 = "}} did not return a defined value";
8449         sv = res;
8450         (void)sv_2mortal(sv);
8451         goto report;
8452     }
8453
8454     return res;
8455 }
8456
8457 PERL_STATIC_INLINE void
8458 S_parse_ident(pTHX_ char **s, char **d, char * const e, int allow_package, bool is_utf8) {
8459     PERL_ARGS_ASSERT_PARSE_IDENT;
8460
8461     for (;;) {
8462         if (*d >= e)
8463             Perl_croak(aTHX_ "%s", ident_too_long);
8464         if (is_utf8 && isIDFIRST_utf8((U8*)*s)) {
8465              /* The UTF-8 case must come first, otherwise things
8466              * like c\N{COMBINING TILDE} would start failing, as the
8467              * isWORDCHAR_A case below would gobble the 'c' up.
8468              */
8469
8470             char *t = *s + UTF8SKIP(*s);
8471             while (isIDCONT_utf8((U8*)t))
8472                 t += UTF8SKIP(t);
8473             if (*d + (t - *s) > e)
8474                 Perl_croak(aTHX_ "%s", ident_too_long);
8475             Copy(*s, *d, t - *s, char);
8476             *d += t - *s;
8477             *s = t;
8478         }
8479         else if ( isWORDCHAR_A(**s) ) {
8480             do {
8481                 *(*d)++ = *(*s)++;
8482             } while (isWORDCHAR_A(**s) && *d < e);
8483         }
8484         else if (allow_package && **s == '\'' && isIDFIRST_lazy_if(*s+1,is_utf8)) {
8485             *(*d)++ = ':';
8486             *(*d)++ = ':';
8487             (*s)++;
8488         }
8489         else if (allow_package && **s == ':' && (*s)[1] == ':'
8490            /* Disallow things like Foo::$bar. For the curious, this is
8491             * the code path that triggers the "Bad name after" warning
8492             * when looking for barewords.
8493             */
8494            && (*s)[2] != '$') {
8495             *(*d)++ = *(*s)++;
8496             *(*d)++ = *(*s)++;
8497         }
8498         else
8499             break;
8500     }
8501     return;
8502 }
8503
8504 /* Returns a NUL terminated string, with the length of the string written to
8505    *slp
8506    */
8507 STATIC char *
8508 S_scan_word(pTHX_ char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
8509 {
8510     char *d = dest;
8511     char * const e = d + destlen - 3;  /* two-character token, ending NUL */
8512     bool is_utf8 = cBOOL(UTF);
8513
8514     PERL_ARGS_ASSERT_SCAN_WORD;
8515
8516     parse_ident(&s, &d, e, allow_package, is_utf8);
8517     *d = '\0';
8518     *slp = d - dest;
8519     return s;
8520 }
8521
8522 STATIC char *
8523 S_scan_ident(pTHX_ char *s, char *dest, STRLEN destlen, I32 ck_uni)
8524 {
8525     I32 herelines = PL_parser->herelines;
8526     SSize_t bracket = -1;
8527     char funny = *s++;
8528     char *d = dest;
8529     char * const e = d + destlen - 3;    /* two-character token, ending NUL */
8530     bool is_utf8 = cBOOL(UTF);
8531     I32 orig_copline = 0, tmp_copline = 0;
8532
8533     PERL_ARGS_ASSERT_SCAN_IDENT;
8534
8535     if (isSPACE(*s))
8536         s = skipspace(s);
8537     if (isDIGIT(*s)) {
8538         while (isDIGIT(*s)) {
8539             if (d >= e)
8540                 Perl_croak(aTHX_ "%s", ident_too_long);
8541             *d++ = *s++;
8542         }
8543     }
8544     else {
8545         parse_ident(&s, &d, e, 1, is_utf8);
8546     }
8547     *d = '\0';
8548     d = dest;
8549     if (*d) {
8550         /* Either a digit variable, or parse_ident() found an identifier
8551            (anything valid as a bareword), so job done and return.  */
8552         if (PL_lex_state != LEX_NORMAL)
8553             PL_lex_state = LEX_INTERPENDMAYBE;
8554         return s;
8555     }
8556     if (*s == '$' && s[1] &&
8557       (isIDFIRST_lazy_if(s+1,is_utf8)
8558          || isDIGIT_A((U8)s[1])
8559          || s[1] == '$'
8560          || s[1] == '{'
8561          || strnEQ(s+1,"::",2)) )
8562     {
8563         /* Dereferencing a value in a scalar variable.
8564            The alternatives are different syntaxes for a scalar variable.
8565            Using ' as a leading package separator isn't allowed. :: is.   */
8566         return s;
8567     }
8568     /* Handle the opening { of @{...}, &{...}, *{...}, %{...}, ${...}  */
8569     if (*s == '{') {
8570         bracket = s - SvPVX(PL_linestr);
8571         s++;
8572         orig_copline = CopLINE(PL_curcop);
8573         if (s < PL_bufend && isSPACE(*s)) {
8574             s = skipspace(s);
8575         }
8576     }
8577
8578 /* Is the byte 'd' a legal single character identifier name?  'u' is true
8579  * iff Unicode semantics are to be used.  The legal ones are any of:
8580  *  a) all ASCII characters except:
8581  *          1) space-type ones, like \t and SPACE;
8582             2) NUL;
8583  *          3) '{'
8584  *     The final case currently doesn't get this far in the program, so we
8585  *     don't test for it.  If that were to change, it would be ok to allow it.
8586  *  c) When not under Unicode rules, any upper Latin1 character
8587  *  d) Otherwise, when unicode rules are used, all XIDS characters.
8588  *
8589  *      Because all ASCII characters have the same representation whether
8590  *      encoded in UTF-8 or not, we can use the foo_A macros below and '\0' and
8591  *      '{' without knowing if is UTF-8 or not.
8592  * EBCDIC already uses the rules that ASCII platforms will use after the
8593  * deprecation cycle; see comment below about the deprecation. */
8594 #ifdef EBCDIC
8595 #   define VALID_LEN_ONE_IDENT(s, is_utf8)                                    \
8596     (isGRAPH_A(*(s)) || ((is_utf8)                                            \
8597                          ? isIDFIRST_utf8((U8*) (s))                          \
8598                          : (isGRAPH_L1(*s)                                    \
8599                             && LIKELY((U8) *(s) != LATIN1_TO_NATIVE(0xAD)))))
8600 #else
8601 #   define VALID_LEN_ONE_IDENT(s, is_utf8) (! isSPACE_A(*(s))                 \
8602                                             && LIKELY(*(s) != '\0')           \
8603                                             && (! is_utf8                     \
8604                                                 || isASCII_utf8((U8*) (s))    \
8605                                                 || isIDFIRST_utf8((U8*) (s))))
8606 #endif
8607     if ((s <= PL_bufend - (is_utf8)
8608                           ? UTF8SKIP(s)
8609                           : 1)
8610         && VALID_LEN_ONE_IDENT(s, is_utf8))
8611     {
8612         /* Deprecate all non-graphic characters.  Include SHY as a non-graphic,
8613          * because often it has no graphic representation.  (We can't get to
8614          * here with SHY when 'is_utf8' is true, so no need to include a UTF-8
8615          * test for it.) */
8616         if ((is_utf8)
8617             ? ! isGRAPH_utf8( (U8*) s)
8618             : (! isGRAPH_L1( (U8) *s)
8619                || UNLIKELY((U8) *(s) == LATIN1_TO_NATIVE(0xAD))))
8620         {
8621             /* Split messages for back compat */
8622             if (isCNTRL_A( (U8) *s)) {
8623                 deprecate("literal control characters in variable names");
8624             }
8625             else {
8626                 deprecate("literal non-graphic characters in variable names");
8627             }
8628         }
8629         
8630         if (is_utf8) {
8631             const STRLEN skip = UTF8SKIP(s);
8632             STRLEN i;
8633             d[skip] = '\0';
8634             for ( i = 0; i < skip; i++ )
8635                 d[i] = *s++;
8636         }
8637         else {
8638             *d = *s++;
8639             d[1] = '\0';
8640         }
8641     }
8642     /* Convert $^F, ${^F} and the ^F of ${^FOO} to control characters */
8643     if (*d == '^' && *s && isCONTROLVAR(*s)) {
8644         *d = toCTRL(*s);
8645         s++;
8646     }
8647     /* Warn about ambiguous code after unary operators if {...} notation isn't
8648        used.  There's no difference in ambiguity; it's merely a heuristic
8649        about when not to warn.  */
8650     else if (ck_uni && bracket == -1)
8651         check_uni();
8652     if (bracket != -1) {
8653         /* If we were processing {...} notation then...  */
8654         if (isIDFIRST_lazy_if(d,is_utf8)) {
8655             /* if it starts as a valid identifier, assume that it is one.
8656                (the later check for } being at the expected point will trap
8657                cases where this doesn't pan out.)  */
8658         d += is_utf8 ? UTF8SKIP(d) : 1;
8659         parse_ident(&s, &d, e, 1, is_utf8);
8660             *d = '\0';
8661             tmp_copline = CopLINE(PL_curcop);
8662             if (s < PL_bufend && isSPACE(*s)) {
8663                 s = skipspace(s);
8664             }
8665             if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
8666                 /* ${foo[0]} and ${foo{bar}} notation.  */
8667                 if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest, 0)) {
8668                     const char * const brack =
8669                         (const char *)
8670                         ((*s == '[') ? "[...]" : "{...}");
8671                     orig_copline = CopLINE(PL_curcop);
8672                     CopLINE_set(PL_curcop, tmp_copline);
8673    /* diag_listed_as: Ambiguous use of %c{%s[...]} resolved to %c%s[...] */
8674                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
8675                         "Ambiguous use of %c{%s%s} resolved to %c%s%s",
8676                         funny, dest, brack, funny, dest, brack);
8677                     CopLINE_set(PL_curcop, orig_copline);
8678                 }
8679                 bracket++;
8680                 PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
8681                 PL_lex_allbrackets++;
8682                 return s;
8683             }
8684         }
8685         /* Handle extended ${^Foo} variables
8686          * 1999-02-27 mjd-perl-patch@plover.com */
8687         else if (! isPRINT(*d) /* isCNTRL(d), plus all non-ASCII */
8688                  && isWORDCHAR(*s))
8689         {
8690             d++;
8691             while (isWORDCHAR(*s) && d < e) {
8692                 *d++ = *s++;
8693             }
8694             if (d >= e)
8695                 Perl_croak(aTHX_ "%s", ident_too_long);
8696             *d = '\0';
8697         }
8698
8699         if ( !tmp_copline )
8700             tmp_copline = CopLINE(PL_curcop);
8701         if (s < PL_bufend && isSPACE(*s)) {
8702             s = skipspace(s);
8703         }
8704             
8705         /* Expect to find a closing } after consuming any trailing whitespace.
8706          */
8707         if (*s == '}') {
8708             s++;
8709             if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) {
8710                 PL_lex_state = LEX_INTERPEND;
8711                 PL_expect = XREF;
8712             }
8713             if (PL_lex_state == LEX_NORMAL) {
8714                 if (ckWARN(WARN_AMBIGUOUS) &&
8715                     (keyword(dest, d - dest, 0)
8716                      || get_cvn_flags(dest, d - dest, is_utf8 ? SVf_UTF8 : 0)))
8717                 {
8718                     SV *tmp = newSVpvn_flags( dest, d - dest,
8719                                             SVs_TEMP | (is_utf8 ? SVf_UTF8 : 0) );
8720                     if (funny == '#')
8721                         funny = '@';
8722                     orig_copline = CopLINE(PL_curcop);
8723                     CopLINE_set(PL_curcop, tmp_copline);
8724                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
8725                         "Ambiguous use of %c{%"SVf"} resolved to %c%"SVf,
8726                         funny, SVfARG(tmp), funny, SVfARG(tmp));
8727                     CopLINE_set(PL_curcop, orig_copline);
8728                 }
8729             }
8730         }
8731         else {
8732             /* Didn't find the closing } at the point we expected, so restore
8733                state such that the next thing to process is the opening { and */
8734             s = SvPVX(PL_linestr) + bracket; /* let the parser handle it */
8735             CopLINE_set(PL_curcop, orig_copline);
8736             PL_parser->herelines = herelines;
8737             *dest = '\0';
8738         }
8739     }
8740     else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
8741         PL_lex_state = LEX_INTERPEND;
8742     return s;
8743 }
8744
8745 static bool
8746 S_pmflag(pTHX_ const char* const valid_flags, U32 * pmfl, char** s, char* charset, unsigned int * x_mod_count) {
8747
8748     /* Adds, subtracts to/from 'pmfl' based on the next regex modifier flag
8749      * found in the parse starting at 's', based on the subset that are valid
8750      * in this context input to this routine in 'valid_flags'. Advances s.
8751      * Returns TRUE if the input should be treated as a valid flag, so the next
8752      * char may be as well; otherwise FALSE. 'charset' should point to a NUL
8753      * upon first call on the current regex.  This routine will set it to any
8754      * charset modifier found.  The caller shouldn't change it.  This way,
8755      * another charset modifier encountered in the parse can be detected as an
8756      * error, as we have decided to allow only one */
8757
8758     const char c = **s;
8759     STRLEN charlen = UTF ? UTF8SKIP(*s) : 1;
8760
8761     if ( charlen != 1 || ! strchr(valid_flags, c) ) {
8762         if (isWORDCHAR_lazy_if(*s, UTF)) {
8763             yyerror_pv(Perl_form(aTHX_ "Unknown regexp modifier \"/%.*s\"", (int)charlen, *s),
8764                        UTF ? SVf_UTF8 : 0);
8765             (*s) += charlen;
8766             /* Pretend that it worked, so will continue processing before
8767              * dieing */
8768             return TRUE;
8769         }
8770         return FALSE;
8771     }
8772
8773     switch (c) {
8774
8775         CASE_STD_PMMOD_FLAGS_PARSE_SET(pmfl, *x_mod_count);
8776         case GLOBAL_PAT_MOD:      *pmfl |= PMf_GLOBAL; break;
8777         case CONTINUE_PAT_MOD:    *pmfl |= PMf_CONTINUE; break;
8778         case ONCE_PAT_MOD:        *pmfl |= PMf_KEEP; break;
8779         case KEEPCOPY_PAT_MOD:    *pmfl |= RXf_PMf_KEEPCOPY; break;
8780         case NONDESTRUCT_PAT_MOD: *pmfl |= PMf_NONDESTRUCT; break;
8781         case LOCALE_PAT_MOD:
8782             if (*charset) {
8783                 goto multiple_charsets;
8784             }
8785             set_regex_charset(pmfl, REGEX_LOCALE_CHARSET);
8786             *charset = c;
8787             break;
8788         case UNICODE_PAT_MOD:
8789             if (*charset) {
8790                 goto multiple_charsets;
8791             }
8792             set_regex_charset(pmfl, REGEX_UNICODE_CHARSET);
8793             *charset = c;
8794             break;
8795         case ASCII_RESTRICT_PAT_MOD:
8796             if (! *charset) {
8797                 set_regex_charset(pmfl, REGEX_ASCII_RESTRICTED_CHARSET);
8798             }
8799             else {
8800
8801                 /* Error if previous modifier wasn't an 'a', but if it was, see
8802                  * if, and accept, a second occurrence (only) */
8803                 if (*charset != 'a'
8804                     || get_regex_charset(*pmfl)
8805                         != REGEX_ASCII_RESTRICTED_CHARSET)
8806                 {
8807                         goto multiple_charsets;
8808                 }
8809                 set_regex_charset(pmfl, REGEX_ASCII_MORE_RESTRICTED_CHARSET);
8810             }
8811             *charset = c;
8812             break;
8813         case DEPENDS_PAT_MOD:
8814             if (*charset) {
8815                 goto multiple_charsets;
8816             }
8817             set_regex_charset(pmfl, REGEX_DEPENDS_CHARSET);
8818             *charset = c;
8819             break;
8820     }
8821
8822     (*s)++;
8823     return TRUE;
8824
8825     multiple_charsets:
8826         if (*charset != c) {
8827             yyerror(Perl_form(aTHX_ "Regexp modifiers \"/%c\" and \"/%c\" are mutually exclusive", *charset, c));
8828         }
8829         else if (c == 'a') {
8830   /* diag_listed_as: Regexp modifier "/%c" may appear a maximum of twice */
8831             yyerror("Regexp modifier \"/a\" may appear a maximum of twice");
8832         }
8833         else {
8834             yyerror(Perl_form(aTHX_ "Regexp modifier \"/%c\" may not appear twice", c));
8835         }
8836
8837         /* Pretend that it worked, so will continue processing before dieing */
8838         (*s)++;
8839         return TRUE;
8840 }
8841
8842 STATIC char *
8843 S_scan_pat(pTHX_ char *start, I32 type)
8844 {
8845     PMOP *pm;
8846     char *s;
8847     const char * const valid_flags =
8848         (const char *)((type == OP_QR) ? QR_PAT_MODS : M_PAT_MODS);
8849     char charset = '\0';    /* character set modifier */
8850     unsigned int x_mod_count = 0;
8851
8852     PERL_ARGS_ASSERT_SCAN_PAT;
8853
8854     s = scan_str(start,TRUE,FALSE, (PL_in_eval & EVAL_RE_REPARSING), NULL);
8855     if (!s)
8856         Perl_croak(aTHX_ "Search pattern not terminated");
8857
8858     pm = (PMOP*)newPMOP(type, 0);
8859     if (PL_multi_open == '?') {
8860         /* This is the only point in the code that sets PMf_ONCE:  */
8861         pm->op_pmflags |= PMf_ONCE;
8862
8863         /* Hence it's safe to do this bit of PMOP book-keeping here, which
8864            allows us to restrict the list needed by reset to just the ??
8865            matches.  */
8866         assert(type != OP_TRANS);
8867         if (PL_curstash) {
8868             MAGIC *mg = mg_find((const SV *)PL_curstash, PERL_MAGIC_symtab);
8869             U32 elements;
8870             if (!mg) {
8871                 mg = sv_magicext(MUTABLE_SV(PL_curstash), 0, PERL_MAGIC_symtab, 0, 0,
8872                                  0);
8873             }
8874             elements = mg->mg_len / sizeof(PMOP**);
8875             Renewc(mg->mg_ptr, elements + 1, PMOP*, char);
8876             ((PMOP**)mg->mg_ptr) [elements++] = pm;
8877             mg->mg_len = elements * sizeof(PMOP**);
8878             PmopSTASH_set(pm,PL_curstash);
8879         }
8880     }
8881
8882     /* if qr/...(?{..}).../, then need to parse the pattern within a new
8883      * anon CV. False positives like qr/[(?{]/ are harmless */
8884
8885     if (type == OP_QR) {
8886         STRLEN len;
8887         char *e, *p = SvPV(PL_lex_stuff, len);
8888         e = p + len;
8889         for (; p < e; p++) {
8890             if (p[0] == '(' && p[1] == '?'
8891                 && (p[2] == '{' || (p[2] == '?' && p[3] == '{')))
8892             {
8893                 pm->op_pmflags |= PMf_HAS_CV;
8894                 break;
8895             }
8896         }
8897         pm->op_pmflags |= PMf_IS_QR;
8898     }
8899
8900     while (*s && S_pmflag(aTHX_ valid_flags, &(pm->op_pmflags),
8901                                 &s, &charset, &x_mod_count))
8902     {};
8903     /* issue a warning if /c is specified,but /g is not */
8904     if ((pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL))
8905     {
8906         Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), 
8907                        "Use of /c modifier is meaningless without /g" );
8908     }
8909
8910     STD_PMMOD_FLAGS_PARSE_X_WARN(x_mod_count);
8911
8912     PL_lex_op = (OP*)pm;
8913     pl_yylval.ival = OP_MATCH;
8914     return s;
8915 }
8916
8917 STATIC char *
8918 S_scan_subst(pTHX_ char *start)
8919 {
8920     char *s;
8921     PMOP *pm;
8922     I32 first_start;
8923     line_t first_line;
8924     I32 es = 0;
8925     char charset = '\0';    /* character set modifier */
8926     unsigned int x_mod_count = 0;
8927     char *t;
8928
8929     PERL_ARGS_ASSERT_SCAN_SUBST;
8930
8931     pl_yylval.ival = OP_NULL;
8932
8933     s = scan_str(start, TRUE, FALSE, FALSE, &t);
8934
8935     if (!s)
8936         Perl_croak(aTHX_ "Substitution pattern not terminated");
8937
8938     s = t;
8939
8940     first_start = PL_multi_start;
8941     first_line = CopLINE(PL_curcop);
8942     s = scan_str(s,FALSE,FALSE,FALSE,NULL);
8943     if (!s) {
8944         if (PL_lex_stuff) {
8945             SvREFCNT_dec(PL_lex_stuff);
8946             PL_lex_stuff = NULL;
8947         }
8948         Perl_croak(aTHX_ "Substitution replacement not terminated");
8949     }
8950     PL_multi_start = first_start;       /* so whole substitution is taken together */
8951
8952     pm = (PMOP*)newPMOP(OP_SUBST, 0);
8953
8954
8955     while (*s) {
8956         if (*s == EXEC_PAT_MOD) {
8957             s++;
8958             es++;
8959         }
8960         else if (! S_pmflag(aTHX_ S_PAT_MODS, &(pm->op_pmflags),
8961                                   &s, &charset, &x_mod_count))
8962         {
8963             break;
8964         }
8965     }
8966
8967     STD_PMMOD_FLAGS_PARSE_X_WARN(x_mod_count);
8968
8969     if ((pm->op_pmflags & PMf_CONTINUE)) {
8970         Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), "Use of /c modifier is meaningless in s///" );
8971     }
8972
8973     if (es) {
8974         SV * const repl = newSVpvs("");
8975
8976         PL_multi_end = 0;
8977         pm->op_pmflags |= PMf_EVAL;
8978         while (es-- > 0) {
8979             if (es)
8980                 sv_catpvs(repl, "eval ");
8981             else
8982                 sv_catpvs(repl, "do ");
8983         }
8984         sv_catpvs(repl, "{");
8985         sv_catsv(repl, PL_sublex_info.repl);
8986         sv_catpvs(repl, "}");
8987         SvEVALED_on(repl);
8988         SvREFCNT_dec(PL_sublex_info.repl);
8989         PL_sublex_info.repl = repl;
8990     }
8991     if (CopLINE(PL_curcop) != first_line) {
8992         sv_upgrade(PL_sublex_info.repl, SVt_PVNV);
8993         ((XPVNV*)SvANY(PL_sublex_info.repl))->xnv_u.xpad_cop_seq.xlow =
8994             CopLINE(PL_curcop) - first_line;
8995         CopLINE_set(PL_curcop, first_line);
8996     }
8997
8998     PL_lex_op = (OP*)pm;
8999     pl_yylval.ival = OP_SUBST;
9000     return s;
9001 }
9002
9003 STATIC char *
9004 S_scan_trans(pTHX_ char *start)
9005 {
9006     char* s;
9007     OP *o;
9008     U8 squash;
9009     U8 del;
9010     U8 complement;
9011     bool nondestruct = 0;
9012     char *t;
9013
9014     PERL_ARGS_ASSERT_SCAN_TRANS;
9015
9016     pl_yylval.ival = OP_NULL;
9017
9018     s = scan_str(start,FALSE,FALSE,FALSE,&t);
9019     if (!s)
9020         Perl_croak(aTHX_ "Transliteration pattern not terminated");
9021
9022     s = t;
9023
9024     s = scan_str(s,FALSE,FALSE,FALSE,NULL);
9025     if (!s) {
9026         if (PL_lex_stuff) {
9027             SvREFCNT_dec(PL_lex_stuff);
9028             PL_lex_stuff = NULL;
9029         }
9030         Perl_croak(aTHX_ "Transliteration replacement not terminated");
9031     }
9032
9033     complement = del = squash = 0;
9034     while (1) {
9035         switch (*s) {
9036         case 'c':
9037             complement = OPpTRANS_COMPLEMENT;
9038             break;
9039         case 'd':
9040             del = OPpTRANS_DELETE;
9041             break;
9042         case 's':
9043             squash = OPpTRANS_SQUASH;
9044             break;
9045         case 'r':
9046             nondestruct = 1;
9047             break;
9048         default:
9049             goto no_more;
9050         }
9051         s++;
9052     }
9053   no_more:
9054
9055     o = newPVOP(nondestruct ? OP_TRANSR : OP_TRANS, 0, (char*)NULL);
9056     o->op_private &= ~OPpTRANS_ALL;
9057     o->op_private |= del|squash|complement|
9058       (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
9059       (DO_UTF8(PL_sublex_info.repl) ? OPpTRANS_TO_UTF   : 0);
9060
9061     PL_lex_op = o;
9062     pl_yylval.ival = nondestruct ? OP_TRANSR : OP_TRANS;
9063
9064
9065     return s;
9066 }
9067
9068 /* scan_heredoc
9069    Takes a pointer to the first < in <<FOO.
9070    Returns a pointer to the byte following <<FOO.
9071
9072    This function scans a heredoc, which involves different methods
9073    depending on whether we are in a string eval, quoted construct, etc.
9074    This is because PL_linestr could containing a single line of input, or
9075    a whole string being evalled, or the contents of the current quote-
9076    like operator.
9077
9078    The two basic methods are:
9079     - Steal lines from the input stream
9080     - Scan the heredoc in PL_linestr and remove it therefrom
9081
9082    In a file scope or filtered eval, the first method is used; in a
9083    string eval, the second.
9084
9085    In a quote-like operator, we have to choose between the two,
9086    depending on where we can find a newline.  We peek into outer lex-
9087    ing scopes until we find one with a newline in it.  If we reach the
9088    outermost lexing scope and it is a file, we use the stream method.
9089    Otherwise it is treated as an eval.
9090 */
9091
9092 STATIC char *
9093 S_scan_heredoc(pTHX_ char *s)
9094 {
9095     I32 op_type = OP_SCALAR;
9096     I32 len;
9097     SV *tmpstr;
9098     char term;
9099     char *d;
9100     char *e;
9101     char *peek;
9102     const bool infile = PL_rsfp || PL_parser->filtered;
9103     const line_t origline = CopLINE(PL_curcop);
9104     LEXSHARED *shared = PL_parser->lex_shared;
9105
9106     PERL_ARGS_ASSERT_SCAN_HEREDOC;
9107
9108     s += 2;
9109     d = PL_tokenbuf + 1;
9110     e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
9111     *PL_tokenbuf = '\n';
9112     peek = s;
9113     while (SPACE_OR_TAB(*peek))
9114         peek++;
9115     if (*peek == '`' || *peek == '\'' || *peek =='"') {
9116         s = peek;
9117         term = *s++;
9118         s = delimcpy(d, e, s, PL_bufend, term, &len);
9119         if (s == PL_bufend)
9120             Perl_croak(aTHX_ "Unterminated delimiter for here document");
9121         d += len;
9122         s++;
9123     }
9124     else {
9125         if (*s == '\\')
9126             /* <<\FOO is equivalent to <<'FOO' */
9127             s++, term = '\'';
9128         else
9129             term = '"';
9130         if (!isWORDCHAR_lazy_if(s,UTF))
9131             deprecate("bare << to mean <<\"\"");
9132         for (; isWORDCHAR_lazy_if(s,UTF); s++) {
9133             if (d < e)
9134                 *d++ = *s;
9135         }
9136     }
9137     if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
9138         Perl_croak(aTHX_ "Delimiter for here document is too long");
9139     *d++ = '\n';
9140     *d = '\0';
9141     len = d - PL_tokenbuf;
9142
9143 #ifndef PERL_STRICT_CR
9144     d = strchr(s, '\r');
9145     if (d) {
9146         char * const olds = s;
9147         s = d;
9148         while (s < PL_bufend) {
9149             if (*s == '\r') {
9150                 *d++ = '\n';
9151                 if (*++s == '\n')
9152                     s++;
9153             }
9154             else if (*s == '\n' && s[1] == '\r') {      /* \015\013 on a mac? */
9155                 *d++ = *s++;
9156                 s++;
9157             }
9158             else
9159                 *d++ = *s++;
9160         }
9161         *d = '\0';
9162         PL_bufend = d;
9163         SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
9164         s = olds;
9165     }
9166 #endif
9167
9168     tmpstr = newSV_type(SVt_PVIV);
9169     SvGROW(tmpstr, 80);
9170     if (term == '\'') {
9171         op_type = OP_CONST;
9172         SvIV_set(tmpstr, -1);
9173     }
9174     else if (term == '`') {
9175         op_type = OP_BACKTICK;
9176         SvIV_set(tmpstr, '\\');
9177     }
9178
9179     PL_multi_start = origline + 1 + PL_parser->herelines;
9180     PL_multi_open = PL_multi_close = '<';
9181     /* inside a string eval or quote-like operator */
9182     if (!infile || PL_lex_inwhat) {
9183         SV *linestr;
9184         char *bufend;
9185         char * const olds = s;
9186         PERL_CONTEXT * const cx = &cxstack[cxstack_ix];
9187         /* These two fields are not set until an inner lexing scope is
9188            entered.  But we need them set here. */
9189         shared->ls_bufptr  = s;
9190         shared->ls_linestr = PL_linestr;
9191         if (PL_lex_inwhat)
9192           /* Look for a newline.  If the current buffer does not have one,
9193              peek into the line buffer of the parent lexing scope, going
9194              up as many levels as necessary to find one with a newline
9195              after bufptr.
9196            */
9197           while (!(s = (char *)memchr(
9198                     (void *)shared->ls_bufptr, '\n',
9199                     SvEND(shared->ls_linestr)-shared->ls_bufptr
9200                 ))) {
9201             shared = shared->ls_prev;
9202             /* shared is only null if we have gone beyond the outermost
9203                lexing scope.  In a file, we will have broken out of the
9204                loop in the previous iteration.  In an eval, the string buf-
9205                fer ends with "\n;", so the while condition above will have
9206                evaluated to false.  So shared can never be null. */
9207             assert(shared);
9208             /* A LEXSHARED struct with a null ls_prev pointer is the outer-
9209                most lexing scope.  In a file, shared->ls_linestr at that
9210                level is just one line, so there is no body to steal. */
9211             if (infile && !shared->ls_prev) {
9212                 s = olds;
9213                 goto streaming;
9214             }
9215           }
9216         else {  /* eval */
9217             s = (char*)memchr((void*)s, '\n', PL_bufend - s);
9218             assert(s);
9219         }
9220         linestr = shared->ls_linestr;
9221         bufend = SvEND(linestr);
9222         d = s;
9223         while (s < bufend - len + 1 &&
9224           memNE(s,PL_tokenbuf,len) ) {
9225             if (*s++ == '\n')
9226                 ++PL_parser->herelines;
9227         }
9228         if (s >= bufend - len + 1) {
9229             goto interminable;
9230         }
9231         sv_setpvn(tmpstr,d+1,s-d);
9232         s += len - 1;
9233         /* the preceding stmt passes a newline */
9234         PL_parser->herelines++;
9235
9236         /* s now points to the newline after the heredoc terminator.
9237            d points to the newline before the body of the heredoc.
9238          */
9239
9240         /* We are going to modify linestr in place here, so set
9241            aside copies of the string if necessary for re-evals or
9242            (caller $n)[6]. */
9243         /* See the Paranoia note in case LEX_INTERPEND in yylex, for why we
9244            check shared->re_eval_str. */
9245         if (shared->re_eval_start || shared->re_eval_str) {
9246             /* Set aside the rest of the regexp */
9247             if (!shared->re_eval_str)
9248                 shared->re_eval_str =
9249                        newSVpvn(shared->re_eval_start,
9250                                 bufend - shared->re_eval_start);
9251             shared->re_eval_start -= s-d;
9252         }
9253         if (cxstack_ix >= 0 && CxTYPE(cx) == CXt_EVAL &&
9254             CxOLD_OP_TYPE(cx) == OP_ENTEREVAL &&
9255             cx->blk_eval.cur_text == linestr)
9256         {
9257             cx->blk_eval.cur_text = newSVsv(linestr);
9258             SvSCREAM_on(cx->blk_eval.cur_text);
9259         }
9260         /* Copy everything from s onwards back to d. */
9261         Move(s,d,bufend-s + 1,char);
9262         SvCUR_set(linestr, SvCUR(linestr) - (s-d));
9263         /* Setting PL_bufend only applies when we have not dug deeper
9264            into other scopes, because sublex_done sets PL_bufend to
9265            SvEND(PL_linestr). */
9266         if (shared == PL_parser->lex_shared) PL_bufend = SvEND(linestr);
9267         s = olds;
9268     }
9269     else
9270     {
9271       SV *linestr_save;
9272      streaming:
9273       sv_setpvs(tmpstr,"");   /* avoid "uninitialized" warning */
9274       term = PL_tokenbuf[1];
9275       len--;
9276       linestr_save = PL_linestr; /* must restore this afterwards */
9277       d = s;                     /* and this */
9278       PL_linestr = newSVpvs("");
9279       PL_bufend = SvPVX(PL_linestr);
9280       while (1) {
9281         PL_bufptr = PL_bufend;
9282         CopLINE_set(PL_curcop,
9283                     origline + 1 + PL_parser->herelines);
9284         if (!lex_next_chunk(LEX_NO_TERM)
9285          && (!SvCUR(tmpstr) || SvEND(tmpstr)[-1] != '\n')) {
9286             /* Simply freeing linestr_save might seem simpler here, as it
9287                does not matter what PL_linestr points to, since we are
9288                about to croak; but in a quote-like op, linestr_save
9289                will have been prospectively freed already, via
9290                SAVEFREESV(PL_linestr) in sublex_push, so it’s easier to
9291                restore PL_linestr. */
9292             SvREFCNT_dec_NN(PL_linestr);
9293             PL_linestr = linestr_save;
9294             goto interminable;
9295         }
9296         CopLINE_set(PL_curcop, origline);
9297         if (!SvCUR(PL_linestr) || PL_bufend[-1] != '\n') {
9298             s = lex_grow_linestr(SvLEN(PL_linestr) + 3);
9299             /* ^That should be enough to avoid this needing to grow:  */
9300             sv_catpvs(PL_linestr, "\n\0");
9301             assert(s == SvPVX(PL_linestr));
9302             PL_bufend = SvEND(PL_linestr);
9303         }
9304         s = PL_bufptr;
9305         PL_parser->herelines++;
9306         PL_last_lop = PL_last_uni = NULL;
9307 #ifndef PERL_STRICT_CR
9308         if (PL_bufend - PL_linestart >= 2) {
9309             if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
9310                 (PL_bufend[-2] == '\n' && PL_bufend[-1] == '\r'))
9311             {
9312                 PL_bufend[-2] = '\n';
9313                 PL_bufend--;
9314                 SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
9315             }
9316             else if (PL_bufend[-1] == '\r')
9317                 PL_bufend[-1] = '\n';
9318         }
9319         else if (PL_bufend - PL_linestart == 1 && PL_bufend[-1] == '\r')
9320             PL_bufend[-1] = '\n';
9321 #endif
9322         if (*s == term && PL_bufend-s >= len
9323          && memEQ(s,PL_tokenbuf + 1,len)) {
9324             SvREFCNT_dec(PL_linestr);
9325             PL_linestr = linestr_save;
9326             PL_linestart = SvPVX(linestr_save);
9327             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
9328             s = d;
9329             break;
9330         }
9331         else {
9332             sv_catsv(tmpstr,PL_linestr);
9333         }
9334       }
9335     }
9336     PL_multi_end = origline + PL_parser->herelines;
9337     if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
9338         SvPV_shrink_to_cur(tmpstr);
9339     }
9340     if (!IN_BYTES) {
9341         if (UTF && is_utf8_string((U8*)SvPVX_const(tmpstr), SvCUR(tmpstr)))
9342             SvUTF8_on(tmpstr);
9343         else if (IN_ENCODING)
9344             sv_recode_to_utf8(tmpstr, _get_encoding());
9345     }
9346     PL_lex_stuff = tmpstr;
9347     pl_yylval.ival = op_type;
9348     return s;
9349
9350   interminable:
9351     SvREFCNT_dec(tmpstr);
9352     CopLINE_set(PL_curcop, origline);
9353     missingterm(PL_tokenbuf + 1);
9354 }
9355
9356 /* scan_inputsymbol
9357    takes: current position in input buffer
9358    returns: new position in input buffer
9359    side-effects: pl_yylval and lex_op are set.
9360
9361    This code handles:
9362
9363    <>           read from ARGV
9364    <<>>         read from ARGV without magic open
9365    <FH>         read from filehandle
9366    <pkg::FH>    read from package qualified filehandle
9367    <pkg'FH>     read from package qualified filehandle
9368    <$fh>        read from filehandle in $fh
9369    <*.h>        filename glob
9370
9371 */
9372
9373 STATIC char *
9374 S_scan_inputsymbol(pTHX_ char *start)
9375 {
9376     char *s = start;            /* current position in buffer */
9377     char *end;
9378     I32 len;
9379     bool nomagicopen = FALSE;
9380     char *d = PL_tokenbuf;                                      /* start of temp holding space */
9381     const char * const e = PL_tokenbuf + sizeof PL_tokenbuf;    /* end of temp holding space */
9382
9383     PERL_ARGS_ASSERT_SCAN_INPUTSYMBOL;
9384
9385     end = strchr(s, '\n');
9386     if (!end)
9387         end = PL_bufend;
9388     if (s[1] == '<' && s[2] == '>' && s[3] == '>') {
9389         nomagicopen = TRUE;
9390         *d = '\0';
9391         len = 0;
9392         s += 3;
9393     }
9394     else
9395         s = delimcpy(d, e, s + 1, end, '>', &len);      /* extract until > */
9396
9397     /* die if we didn't have space for the contents of the <>,
9398        or if it didn't end, or if we see a newline
9399     */
9400
9401     if (len >= (I32)sizeof PL_tokenbuf)
9402         Perl_croak(aTHX_ "Excessively long <> operator");
9403     if (s >= end)
9404         Perl_croak(aTHX_ "Unterminated <> operator");
9405
9406     s++;
9407
9408     /* check for <$fh>
9409        Remember, only scalar variables are interpreted as filehandles by
9410        this code.  Anything more complex (e.g., <$fh{$num}>) will be
9411        treated as a glob() call.
9412        This code makes use of the fact that except for the $ at the front,
9413        a scalar variable and a filehandle look the same.
9414     */
9415     if (*d == '$' && d[1]) d++;
9416
9417     /* allow <Pkg'VALUE> or <Pkg::VALUE> */
9418     while (*d && (isWORDCHAR_lazy_if(d,UTF) || *d == '\'' || *d == ':'))
9419         d += UTF ? UTF8SKIP(d) : 1;
9420
9421     /* If we've tried to read what we allow filehandles to look like, and
9422        there's still text left, then it must be a glob() and not a getline.
9423        Use scan_str to pull out the stuff between the <> and treat it
9424        as nothing more than a string.
9425     */
9426
9427     if (d - PL_tokenbuf != len) {
9428         pl_yylval.ival = OP_GLOB;
9429         s = scan_str(start,FALSE,FALSE,FALSE,NULL);
9430         if (!s)
9431            Perl_croak(aTHX_ "Glob not terminated");
9432         return s;
9433     }
9434     else {
9435         bool readline_overriden = FALSE;
9436         GV *gv_readline;
9437         /* we're in a filehandle read situation */
9438         d = PL_tokenbuf;
9439
9440         /* turn <> into <ARGV> */
9441         if (!len)
9442             Copy("ARGV",d,5,char);
9443
9444         /* Check whether readline() is overriden */
9445         if ((gv_readline = gv_override("readline",8)))
9446             readline_overriden = TRUE;
9447
9448         /* if <$fh>, create the ops to turn the variable into a
9449            filehandle
9450         */
9451         if (*d == '$') {
9452             /* try to find it in the pad for this block, otherwise find
9453                add symbol table ops
9454             */
9455             const PADOFFSET tmp = pad_findmy_pvn(d, len, 0);
9456             if (tmp != NOT_IN_PAD) {
9457                 if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
9458                     HV * const stash = PAD_COMPNAME_OURSTASH(tmp);
9459                     HEK * const stashname = HvNAME_HEK(stash);
9460                     SV * const sym = sv_2mortal(newSVhek(stashname));
9461                     sv_catpvs(sym, "::");
9462                     sv_catpv(sym, d+1);
9463                     d = SvPVX(sym);
9464                     goto intro_sym;
9465                 }
9466                 else {
9467                     OP * const o = newOP(OP_PADSV, 0);
9468                     o->op_targ = tmp;
9469                     PL_lex_op = readline_overriden
9470                         ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
9471                                 op_append_elem(OP_LIST, o,
9472                                     newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
9473                         : (OP*)newUNOP(OP_READLINE, 0, o);
9474                 }
9475             }
9476             else {
9477                 GV *gv;
9478                 ++d;
9479 intro_sym:
9480                 gv = gv_fetchpv(d,
9481                                 GV_ADDMULTI | ( UTF ? SVf_UTF8 : 0 ),
9482                                 SVt_PV);
9483                 PL_lex_op = readline_overriden
9484                     ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
9485                             op_append_elem(OP_LIST,
9486                                 newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
9487                                 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
9488                     : (OP*)newUNOP(OP_READLINE, 0,
9489                             newUNOP(OP_RV2SV, 0,
9490                                 newGVOP(OP_GV, 0, gv)));
9491             }
9492             /* we created the ops in PL_lex_op, so make pl_yylval.ival a null op */
9493             pl_yylval.ival = OP_NULL;
9494         }
9495
9496         /* If it's none of the above, it must be a literal filehandle
9497            (<Foo::BAR> or <FOO>) so build a simple readline OP */
9498         else {
9499             GV * const gv = gv_fetchpv(d, GV_ADD | ( UTF ? SVf_UTF8 : 0 ), SVt_PVIO);
9500             PL_lex_op = readline_overriden
9501                 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
9502                         op_append_elem(OP_LIST,
9503                             newGVOP(OP_GV, 0, gv),
9504                             newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
9505                 : (OP*)newUNOP(OP_READLINE, nomagicopen ? OPf_SPECIAL : 0, newGVOP(OP_GV, 0, gv));
9506             pl_yylval.ival = OP_NULL;
9507         }
9508     }
9509
9510     return s;
9511 }
9512
9513
9514 /* scan_str
9515    takes:
9516         start                   position in buffer
9517         keep_bracketed_quoted   preserve \ quoting of embedded delimiters, but
9518                                 only if they are of the open/close form
9519         keep_delims             preserve the delimiters around the string
9520         re_reparse              compiling a run-time /(?{})/:
9521                                    collapse // to /,  and skip encoding src
9522         delimp                  if non-null, this is set to the position of
9523                                 the closing delimiter, or just after it if
9524                                 the closing and opening delimiters differ
9525                                 (i.e., the opening delimiter of a substitu-
9526                                 tion replacement)
9527    returns: position to continue reading from buffer
9528    side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
9529         updates the read buffer.
9530
9531    This subroutine pulls a string out of the input.  It is called for:
9532         q               single quotes           q(literal text)
9533         '               single quotes           'literal text'
9534         qq              double quotes           qq(interpolate $here please)
9535         "               double quotes           "interpolate $here please"
9536         qx              backticks               qx(/bin/ls -l)
9537         `               backticks               `/bin/ls -l`
9538         qw              quote words             @EXPORT_OK = qw( func() $spam )
9539         m//             regexp match            m/this/
9540         s///            regexp substitute       s/this/that/
9541         tr///           string transliterate    tr/this/that/
9542         y///            string transliterate    y/this/that/
9543         ($*@)           sub prototypes          sub foo ($)
9544         (stuff)         sub attr parameters     sub foo : attr(stuff)
9545         <>              readline or globs       <FOO>, <>, <$fh>, or <*.c>
9546         
9547    In most of these cases (all but <>, patterns and transliterate)
9548    yylex() calls scan_str().  m// makes yylex() call scan_pat() which
9549    calls scan_str().  s/// makes yylex() call scan_subst() which calls
9550    scan_str().  tr/// and y/// make yylex() call scan_trans() which
9551    calls scan_str().
9552
9553    It skips whitespace before the string starts, and treats the first
9554    character as the delimiter.  If the delimiter is one of ([{< then
9555    the corresponding "close" character )]}> is used as the closing
9556    delimiter.  It allows quoting of delimiters, and if the string has
9557    balanced delimiters ([{<>}]) it allows nesting.
9558
9559    On success, the SV with the resulting string is put into lex_stuff or,
9560    if that is already non-NULL, into lex_repl. The second case occurs only
9561    when parsing the RHS of the special constructs s/// and tr/// (y///).
9562    For convenience, the terminating delimiter character is stuffed into
9563    SvIVX of the SV.
9564 */
9565
9566 STATIC char *
9567 S_scan_str(pTHX_ char *start, int keep_bracketed_quoted, int keep_delims, int re_reparse,
9568                  char **delimp
9569     )
9570 {
9571     SV *sv;                     /* scalar value: string */
9572     const char *tmps;           /* temp string, used for delimiter matching */
9573     char *s = start;            /* current position in the buffer */
9574     char term;                  /* terminating character */
9575     char *to;                   /* current position in the sv's data */
9576     I32 brackets = 1;           /* bracket nesting level */
9577     bool has_utf8 = FALSE;      /* is there any utf8 content? */
9578     I32 termcode;               /* terminating char. code */
9579     U8 termstr[UTF8_MAXBYTES];  /* terminating string */
9580     STRLEN termlen;             /* length of terminating string */
9581     int last_off = 0;           /* last position for nesting bracket */
9582     line_t herelines;
9583
9584     PERL_ARGS_ASSERT_SCAN_STR;
9585
9586     /* skip space before the delimiter */
9587     if (isSPACE(*s)) {
9588         s = skipspace(s);
9589     }
9590
9591     /* mark where we are, in case we need to report errors */
9592     CLINE;
9593
9594     /* after skipping whitespace, the next character is the terminator */
9595     term = *s;
9596     if (!UTF) {
9597         termcode = termstr[0] = term;
9598         termlen = 1;
9599     }
9600     else {
9601         termcode = utf8_to_uvchr_buf((U8*)s, (U8*)PL_bufend, &termlen);
9602         Copy(s, termstr, termlen, U8);
9603         if (!UTF8_IS_INVARIANT(term))
9604             has_utf8 = TRUE;
9605     }
9606
9607     /* mark where we are */
9608     PL_multi_start = CopLINE(PL_curcop);
9609     PL_multi_open = term;
9610     herelines = PL_parser->herelines;
9611
9612     /* find corresponding closing delimiter */
9613     if (term && (tmps = strchr("([{< )]}> )]}>",term)))
9614         termcode = termstr[0] = term = tmps[5];
9615
9616     PL_multi_close = term;
9617
9618     if (PL_multi_open == PL_multi_close) {
9619         keep_bracketed_quoted = FALSE;
9620     }
9621
9622     /* create a new SV to hold the contents.  79 is the SV's initial length.
9623        What a random number. */
9624     sv = newSV_type(SVt_PVIV);
9625     SvGROW(sv, 80);
9626     SvIV_set(sv, termcode);
9627     (void)SvPOK_only(sv);               /* validate pointer */
9628
9629     /* move past delimiter and try to read a complete string */
9630     if (keep_delims)
9631         sv_catpvn(sv, s, termlen);
9632     s += termlen;
9633     for (;;) {
9634         if (IN_ENCODING && !UTF && !re_reparse) {
9635             bool cont = TRUE;
9636
9637             while (cont) {
9638                 int offset = s - SvPVX_const(PL_linestr);
9639                 const bool found = sv_cat_decode(sv, _get_encoding(), PL_linestr,
9640                                            &offset, (char*)termstr, termlen);
9641                 const char *ns;
9642                 char *svlast;
9643
9644                 if (SvIsCOW(PL_linestr)) {
9645                     STRLEN bufend_pos, bufptr_pos, oldbufptr_pos;
9646                     STRLEN oldoldbufptr_pos, linestart_pos, last_uni_pos;
9647                     STRLEN last_lop_pos, re_eval_start_pos, s_pos;
9648                     char *buf = SvPVX(PL_linestr);
9649                     bufend_pos = PL_parser->bufend - buf;
9650                     bufptr_pos = PL_parser->bufptr - buf;
9651                     oldbufptr_pos = PL_parser->oldbufptr - buf;
9652                     oldoldbufptr_pos = PL_parser->oldoldbufptr - buf;
9653                     linestart_pos = PL_parser->linestart - buf;
9654                     last_uni_pos = PL_parser->last_uni
9655                         ? PL_parser->last_uni - buf
9656                         : 0;
9657                     last_lop_pos = PL_parser->last_lop
9658                         ? PL_parser->last_lop - buf
9659                         : 0;
9660                     re_eval_start_pos =
9661                         PL_parser->lex_shared->re_eval_start ?
9662                             PL_parser->lex_shared->re_eval_start - buf : 0;
9663                     s_pos = s - buf;
9664
9665                     sv_force_normal(PL_linestr);
9666
9667                     buf = SvPVX(PL_linestr);
9668                     PL_parser->bufend = buf + bufend_pos;
9669                     PL_parser->bufptr = buf + bufptr_pos;
9670                     PL_parser->oldbufptr = buf + oldbufptr_pos;
9671                     PL_parser->oldoldbufptr = buf + oldoldbufptr_pos;
9672                     PL_parser->linestart = buf + linestart_pos;
9673                     if (PL_parser->last_uni)
9674                         PL_parser->last_uni = buf + last_uni_pos;
9675                     if (PL_parser->last_lop)
9676                         PL_parser->last_lop = buf + last_lop_pos;
9677                     if (PL_parser->lex_shared->re_eval_start)
9678                         PL_parser->lex_shared->re_eval_start  =
9679                             buf + re_eval_start_pos;
9680                     s = buf + s_pos;
9681                 }
9682                 ns = SvPVX_const(PL_linestr) + offset;
9683                 svlast = SvEND(sv) - 1;
9684
9685                 for (; s < ns; s++) {
9686                     if (*s == '\n' && !PL_rsfp && !PL_parser->filtered)
9687                         COPLINE_INC_WITH_HERELINES;
9688                 }
9689                 if (!found)
9690                     goto read_more_line;
9691                 else {
9692                     /* handle quoted delimiters */
9693                     if (SvCUR(sv) > 1 && *(svlast-1) == '\\') {
9694                         const char *t;
9695                         for (t = svlast-2; t >= SvPVX_const(sv) && *t == '\\';)
9696                             t--;
9697                         if ((svlast-1 - t) % 2) {
9698                             if (!keep_bracketed_quoted) {
9699                                 *(svlast-1) = term;
9700                                 *svlast = '\0';
9701                                 SvCUR_set(sv, SvCUR(sv) - 1);
9702                             }
9703                             continue;
9704                         }
9705                     }
9706                     if (PL_multi_open == PL_multi_close) {
9707                         cont = FALSE;
9708                     }
9709                     else {
9710                         const char *t;
9711                         char *w;
9712                         for (t = w = SvPVX(sv)+last_off; t < svlast; w++, t++) {
9713                             /* At here, all closes are "was quoted" one,
9714                                so we don't check PL_multi_close. */
9715                             if (*t == '\\') {
9716                                 if (!keep_bracketed_quoted && *(t+1) == PL_multi_open)
9717                                     t++;
9718                                 else
9719                                     *w++ = *t++;
9720                             }
9721                             else if (*t == PL_multi_open)
9722                                 brackets++;
9723
9724                             *w = *t;
9725                         }
9726                         if (w < t) {
9727                             *w++ = term;
9728                             *w = '\0';
9729                             SvCUR_set(sv, w - SvPVX_const(sv));
9730                         }
9731                         last_off = w - SvPVX(sv);
9732                         if (--brackets <= 0)
9733                             cont = FALSE;
9734                     }
9735                 }
9736             }
9737             if (!keep_delims) {
9738                 SvCUR_set(sv, SvCUR(sv) - 1);
9739                 *SvEND(sv) = '\0';
9740             }
9741             break;
9742         }
9743
9744         /* extend sv if need be */
9745         SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
9746         /* set 'to' to the next character in the sv's string */
9747         to = SvPVX(sv)+SvCUR(sv);
9748
9749         /* if open delimiter is the close delimiter read unbridle */
9750         if (PL_multi_open == PL_multi_close) {
9751             for (; s < PL_bufend; s++,to++) {
9752                 /* embedded newlines increment the current line number */
9753                 if (*s == '\n' && !PL_rsfp && !PL_parser->filtered)
9754                     COPLINE_INC_WITH_HERELINES;
9755                 /* handle quoted delimiters */
9756                 if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
9757                     if (!keep_bracketed_quoted
9758                         && (s[1] == term
9759                             || (re_reparse && s[1] == '\\'))
9760                     )
9761                         s++;
9762                     else /* any other quotes are simply copied straight through */
9763                         *to++ = *s++;
9764                 }
9765                 /* terminate when run out of buffer (the for() condition), or
9766                    have found the terminator */
9767                 else if (*s == term) {
9768                     if (termlen == 1)
9769                         break;
9770                     if (s+termlen <= PL_bufend && memEQ(s, (char*)termstr, termlen))
9771                         break;
9772                 }
9773                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
9774                     has_utf8 = TRUE;
9775                 *to = *s;
9776             }
9777         }
9778         
9779         /* if the terminator isn't the same as the start character (e.g.,
9780            matched brackets), we have to allow more in the quoting, and
9781            be prepared for nested brackets.
9782         */
9783         else {
9784             /* read until we run out of string, or we find the terminator */
9785             for (; s < PL_bufend; s++,to++) {
9786                 /* embedded newlines increment the line count */
9787                 if (*s == '\n' && !PL_rsfp && !PL_parser->filtered)
9788                     COPLINE_INC_WITH_HERELINES;
9789                 /* backslashes can escape the open or closing characters */
9790                 if (*s == '\\' && s+1 < PL_bufend) {
9791                     if (!keep_bracketed_quoted &&
9792                         ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
9793                     {
9794                         s++;
9795                     }
9796                     else
9797                         *to++ = *s++;
9798                 }
9799                 /* allow nested opens and closes */
9800                 else if (*s == PL_multi_close && --brackets <= 0)
9801                     break;
9802                 else if (*s == PL_multi_open)
9803                     brackets++;
9804                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
9805                     has_utf8 = TRUE;
9806                 *to = *s;
9807             }
9808         }
9809         /* terminate the copied string and update the sv's end-of-string */
9810         *to = '\0';
9811         SvCUR_set(sv, to - SvPVX_const(sv));
9812
9813         /*
9814          * this next chunk reads more into the buffer if we're not done yet
9815          */
9816
9817         if (s < PL_bufend)
9818             break;              /* handle case where we are done yet :-) */
9819
9820 #ifndef PERL_STRICT_CR
9821         if (to - SvPVX_const(sv) >= 2) {
9822             if ((to[-2] == '\r' && to[-1] == '\n') ||
9823                 (to[-2] == '\n' && to[-1] == '\r'))
9824             {
9825                 to[-2] = '\n';
9826                 to--;
9827                 SvCUR_set(sv, to - SvPVX_const(sv));
9828             }
9829             else if (to[-1] == '\r')
9830                 to[-1] = '\n';
9831         }
9832         else if (to - SvPVX_const(sv) == 1 && to[-1] == '\r')
9833             to[-1] = '\n';
9834 #endif
9835         
9836      read_more_line:
9837         /* if we're out of file, or a read fails, bail and reset the current
9838            line marker so we can report where the unterminated string began
9839         */
9840         COPLINE_INC_WITH_HERELINES;
9841         PL_bufptr = PL_bufend;
9842         if (!lex_next_chunk(0)) {
9843             sv_free(sv);
9844             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
9845             return NULL;
9846         }
9847         s = PL_bufptr;
9848     }
9849
9850     /* at this point, we have successfully read the delimited string */
9851
9852     if (!IN_ENCODING || UTF || re_reparse) {
9853
9854         if (keep_delims)
9855             sv_catpvn(sv, s, termlen);
9856         s += termlen;
9857     }
9858     if (has_utf8 || (IN_ENCODING && !re_reparse))
9859         SvUTF8_on(sv);
9860
9861     PL_multi_end = CopLINE(PL_curcop);
9862     CopLINE_set(PL_curcop, PL_multi_start);
9863     PL_parser->herelines = herelines;
9864
9865     /* if we allocated too much space, give some back */
9866     if (SvCUR(sv) + 5 < SvLEN(sv)) {
9867         SvLEN_set(sv, SvCUR(sv) + 1);
9868         SvPV_renew(sv, SvLEN(sv));
9869     }
9870
9871     /* decide whether this is the first or second quoted string we've read
9872        for this op
9873     */
9874
9875     if (PL_lex_stuff)
9876         PL_sublex_info.repl = sv;
9877     else
9878         PL_lex_stuff = sv;
9879     if (delimp) *delimp = PL_multi_open == PL_multi_close ? s-termlen : s;
9880     return s;
9881 }
9882
9883 /*
9884   scan_num
9885   takes: pointer to position in buffer
9886   returns: pointer to new position in buffer
9887   side-effects: builds ops for the constant in pl_yylval.op
9888
9889   Read a number in any of the formats that Perl accepts:
9890
9891   \d(_?\d)*(\.(\d(_?\d)*)?)?[Ee][\+\-]?(\d(_?\d)*)      12 12.34 12.
9892   \.\d(_?\d)*[Ee][\+\-]?(\d(_?\d)*)                     .34
9893   0b[01](_?[01])*                                       binary integers
9894   0[0-7](_?[0-7])*                                      octal integers
9895   0x[0-9A-Fa-f](_?[0-9A-Fa-f])*                         hexadecimal integers
9896   0x[0-9A-Fa-f](_?[0-9A-Fa-f])*(?:\.\d*)?p[+-]?[0-9]+   hexadecimal floats
9897
9898   Like most scan_ routines, it uses the PL_tokenbuf buffer to hold the
9899   thing it reads.
9900
9901   If it reads a number without a decimal point or an exponent, it will
9902   try converting the number to an integer and see if it can do so
9903   without loss of precision.
9904 */
9905
9906 char *
9907 Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
9908 {
9909     const char *s = start;      /* current position in buffer */
9910     char *d;                    /* destination in temp buffer */
9911     char *e;                    /* end of temp buffer */
9912     NV nv;                              /* number read, as a double */
9913     SV *sv = NULL;                      /* place to put the converted number */
9914     bool floatit;                       /* boolean: int or float? */
9915     const char *lastub = NULL;          /* position of last underbar */
9916     static const char* const number_too_long = "Number too long";
9917     /* Hexadecimal floating point.
9918      *
9919      * In many places (where we have quads and NV is IEEE 754 double)
9920      * we can fit the mantissa bits of a NV into an unsigned quad.
9921      * (Note that UVs might not be quads even when we have quads.)
9922      * This will not work everywhere, though (either no quads, or
9923      * using long doubles), in which case we have to resort to NV,
9924      * which will probably mean horrible loss of precision due to
9925      * multiple fp operations. */
9926     bool hexfp = FALSE;
9927     int total_bits = 0;
9928 #if NVSIZE == 8 && defined(HAS_QUAD) && defined(Uquad_t)
9929 #  define HEXFP_UQUAD
9930     Uquad_t hexfp_uquad = 0;
9931     int hexfp_frac_bits = 0;
9932 #else
9933 #  define HEXFP_NV
9934     NV hexfp_nv = 0.0;
9935 #endif
9936     NV hexfp_mult = 1.0;
9937     UV high_non_zero = 0; /* highest digit */
9938
9939     PERL_ARGS_ASSERT_SCAN_NUM;
9940
9941     /* We use the first character to decide what type of number this is */
9942
9943     switch (*s) {
9944     default:
9945         Perl_croak(aTHX_ "panic: scan_num, *s=%d", *s);
9946
9947     /* if it starts with a 0, it could be an octal number, a decimal in
9948        0.13 disguise, or a hexadecimal number, or a binary number. */
9949     case '0':
9950         {
9951           /* variables:
9952              u          holds the "number so far"
9953              shift      the power of 2 of the base
9954                         (hex == 4, octal == 3, binary == 1)
9955              overflowed was the number more than we can hold?
9956
9957              Shift is used when we add a digit.  It also serves as an "are
9958              we in octal/hex/binary?" indicator to disallow hex characters
9959              when in octal mode.
9960            */
9961             NV n = 0.0;
9962             UV u = 0;
9963             I32 shift;
9964             bool overflowed = FALSE;
9965             bool just_zero  = TRUE;     /* just plain 0 or binary number? */
9966             static const NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
9967             static const char* const bases[5] =
9968               { "", "binary", "", "octal", "hexadecimal" };
9969             static const char* const Bases[5] =
9970               { "", "Binary", "", "Octal", "Hexadecimal" };
9971             static const char* const maxima[5] =
9972               { "",
9973                 "0b11111111111111111111111111111111",
9974                 "",
9975                 "037777777777",
9976                 "0xffffffff" };
9977             const char *base, *Base, *max;
9978
9979             /* check for hex */
9980             if (isALPHA_FOLD_EQ(s[1], 'x')) {
9981                 shift = 4;
9982                 s += 2;
9983                 just_zero = FALSE;
9984             } else if (isALPHA_FOLD_EQ(s[1], 'b')) {
9985                 shift = 1;
9986                 s += 2;
9987                 just_zero = FALSE;
9988             }
9989             /* check for a decimal in disguise */
9990             else if (s[1] == '.' || isALPHA_FOLD_EQ(s[1], 'e'))
9991                 goto decimal;
9992             /* so it must be octal */
9993             else {
9994                 shift = 3;
9995                 s++;
9996             }
9997
9998             if (*s == '_') {
9999                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10000                                "Misplaced _ in number");
10001                lastub = s++;
10002             }
10003
10004             base = bases[shift];
10005             Base = Bases[shift];
10006             max  = maxima[shift];
10007
10008             /* read the rest of the number */
10009             for (;;) {
10010                 /* x is used in the overflow test,
10011                    b is the digit we're adding on. */
10012                 UV x, b;
10013
10014                 switch (*s) {
10015
10016                 /* if we don't mention it, we're done */
10017                 default:
10018                     goto out;
10019
10020                 /* _ are ignored -- but warned about if consecutive */
10021                 case '_':
10022                     if (lastub && s == lastub + 1)
10023                         Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10024                                        "Misplaced _ in number");
10025                     lastub = s++;
10026                     break;
10027
10028                 /* 8 and 9 are not octal */
10029                 case '8': case '9':
10030                     if (shift == 3)
10031                         yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
10032                     /* FALLTHROUGH */
10033
10034                 /* octal digits */
10035                 case '2': case '3': case '4':
10036                 case '5': case '6': case '7':
10037                     if (shift == 1)
10038                         yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
10039                     /* FALLTHROUGH */
10040
10041                 case '0': case '1':
10042                     b = *s++ & 15;              /* ASCII digit -> value of digit */
10043                     goto digit;
10044
10045                 /* hex digits */
10046                 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
10047                 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
10048                     /* make sure they said 0x */
10049                     if (shift != 4)
10050                         goto out;
10051                     b = (*s++ & 7) + 9;
10052
10053                     /* Prepare to put the digit we have onto the end
10054                        of the number so far.  We check for overflows.
10055                     */
10056
10057                   digit:
10058                     just_zero = FALSE;
10059                     if (!overflowed) {
10060                         x = u << shift; /* make room for the digit */
10061
10062                         total_bits += shift;
10063
10064                         if ((x >> shift) != u
10065                             && !(PL_hints & HINT_NEW_BINARY)) {
10066                             overflowed = TRUE;
10067                             n = (NV) u;
10068                             Perl_ck_warner_d(aTHX_ packWARN(WARN_OVERFLOW),
10069                                              "Integer overflow in %s number",
10070                                              base);
10071                         } else
10072                             u = x | b;          /* add the digit to the end */
10073                     }
10074                     if (overflowed) {
10075                         n *= nvshift[shift];
10076                         /* If an NV has not enough bits in its
10077                          * mantissa to represent an UV this summing of
10078                          * small low-order numbers is a waste of time
10079                          * (because the NV cannot preserve the
10080                          * low-order bits anyway): we could just
10081                          * remember when did we overflow and in the
10082                          * end just multiply n by the right
10083                          * amount. */
10084                         n += (NV) b;
10085                     }
10086
10087                     if (high_non_zero == 0 && b > 0)
10088                         high_non_zero = b;
10089
10090                     /* this could be hexfp, but peek ahead
10091                      * to avoid matching ".." */
10092                     if (UNLIKELY(HEXFP_PEEK(s))) {
10093                         goto out;
10094                     }
10095
10096                     break;
10097                 }
10098             }
10099
10100           /* if we get here, we had success: make a scalar value from
10101              the number.
10102           */
10103           out:
10104
10105             /* final misplaced underbar check */
10106             if (s[-1] == '_') {
10107                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
10108             }
10109
10110             if (UNLIKELY(HEXFP_PEEK(s))) {
10111                 /* Do sloppy (on the underbars) but quick detection
10112                  * (and value construction) for hexfp, the decimal
10113                  * detection will shortly be more thorough with the
10114                  * underbar checks. */
10115                 const char* h = s;
10116 #ifdef HEXFP_UQUAD
10117                 hexfp_uquad = u;
10118 #else /* HEXFP_NV */
10119                 hexfp_nv = u;
10120 #endif
10121                 if (*h == '.') {
10122 #ifdef HEXFP_NV
10123                     NV mult = 1 / 16.0;
10124 #endif
10125                     h++;
10126                     while (isXDIGIT(*h) || *h == '_') {
10127                         if (isXDIGIT(*h)) {
10128                             U8 b = XDIGIT_VALUE(*h);
10129                             total_bits += shift;
10130 #ifdef HEXFP_UQUAD
10131                             hexfp_uquad <<= shift;
10132                             hexfp_uquad |= b;
10133                             hexfp_frac_bits += shift;
10134 #else /* HEXFP_NV */
10135                             hexfp_nv += b * mult;
10136                             mult /= 16.0;
10137 #endif
10138                         }
10139                         h++;
10140                     }
10141                 }
10142
10143                 if (total_bits >= 4) {
10144                     if (high_non_zero < 0x8)
10145                         total_bits--;
10146                     if (high_non_zero < 0x4)
10147                         total_bits--;
10148                     if (high_non_zero < 0x2)
10149                         total_bits--;
10150                 }
10151
10152                 if (total_bits > 0 && (isALPHA_FOLD_EQ(*h, 'p'))) {
10153                     bool negexp = FALSE;
10154                     h++;
10155                     if (*h == '+')
10156                         h++;
10157                     else if (*h == '-') {
10158                         negexp = TRUE;
10159                         h++;
10160                     }
10161                     if (isDIGIT(*h)) {
10162                         I32 hexfp_exp = 0;
10163                         while (isDIGIT(*h) || *h == '_') {
10164                             if (isDIGIT(*h)) {
10165                                 hexfp_exp *= 10;
10166                                 hexfp_exp += *h - '0';
10167 #ifdef NV_MIN_EXP
10168                                 if (negexp &&
10169                                     -hexfp_exp < NV_MIN_EXP - 1) {
10170                                     Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
10171                                                    "Hexadecimal float: exponent underflow");
10172 #endif
10173                                     break;
10174                                 }
10175                                 else {
10176 #ifdef NV_MAX_EXP
10177                                     if (!negexp &&
10178                                         hexfp_exp > NV_MAX_EXP - 1) {
10179                                         Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
10180                                                    "Hexadecimal float: exponent overflow");
10181                                         break;
10182                                     }
10183 #endif
10184                                 }
10185                             }
10186                             h++;
10187                         }
10188                         if (negexp)
10189                             hexfp_exp = -hexfp_exp;
10190 #ifdef HEXFP_UQUAD
10191                         hexfp_exp -= hexfp_frac_bits;
10192 #endif
10193                         hexfp_mult = pow(2.0, hexfp_exp);
10194                         hexfp = TRUE;
10195                         goto decimal;
10196                     }
10197                 }
10198             }
10199
10200             if (overflowed) {
10201                 if (n > 4294967295.0)
10202                     Perl_ck_warner(aTHX_ packWARN(WARN_PORTABLE),
10203                                    "%s number > %s non-portable",
10204                                    Base, max);
10205                 sv = newSVnv(n);
10206             }
10207             else {
10208 #if UVSIZE > 4
10209                 if (u > 0xffffffff)
10210                     Perl_ck_warner(aTHX_ packWARN(WARN_PORTABLE),
10211                                    "%s number > %s non-portable",
10212                                    Base, max);
10213 #endif
10214                 sv = newSVuv(u);
10215             }
10216             if (just_zero && (PL_hints & HINT_NEW_INTEGER))
10217                 sv = new_constant(start, s - start, "integer",
10218                                   sv, NULL, NULL, 0);
10219             else if (PL_hints & HINT_NEW_BINARY)
10220                 sv = new_constant(start, s - start, "binary", sv, NULL, NULL, 0);
10221         }
10222         break;
10223
10224     /*
10225       handle decimal numbers.
10226       we're also sent here when we read a 0 as the first digit
10227     */
10228     case '1': case '2': case '3': case '4': case '5':
10229     case '6': case '7': case '8': case '9': case '.':
10230       decimal:
10231         d = PL_tokenbuf;
10232         e = PL_tokenbuf + sizeof PL_tokenbuf - 6; /* room for various punctuation */
10233         floatit = FALSE;
10234         if (hexfp) {
10235             floatit = TRUE;
10236             *d++ = '0';
10237             *d++ = 'x';
10238             s = start + 2;
10239         }
10240
10241         /* read next group of digits and _ and copy into d */
10242         while (isDIGIT(*s) || *s == '_' ||
10243                UNLIKELY(hexfp && isXDIGIT(*s))) {
10244             /* skip underscores, checking for misplaced ones
10245                if -w is on
10246             */
10247             if (*s == '_') {
10248                 if (lastub && s == lastub + 1)
10249                     Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10250                                    "Misplaced _ in number");
10251                 lastub = s++;
10252             }
10253             else {
10254                 /* check for end of fixed-length buffer */
10255                 if (d >= e)
10256                     Perl_croak(aTHX_ "%s", number_too_long);
10257                 /* if we're ok, copy the character */
10258                 *d++ = *s++;
10259             }
10260         }
10261
10262         /* final misplaced underbar check */
10263         if (lastub && s == lastub + 1) {
10264             Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
10265         }
10266
10267         /* read a decimal portion if there is one.  avoid
10268            3..5 being interpreted as the number 3. followed
10269            by .5
10270         */
10271         if (*s == '.' && s[1] != '.') {
10272             floatit = TRUE;
10273             *d++ = *s++;
10274
10275             if (*s == '_') {
10276                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10277                                "Misplaced _ in number");
10278                 lastub = s;
10279             }
10280
10281             /* copy, ignoring underbars, until we run out of digits.
10282             */
10283             for (; isDIGIT(*s) || *s == '_' ||
10284                      UNLIKELY(hexfp && isXDIGIT(*s));
10285                  s++) {
10286                 /* fixed length buffer check */
10287                 if (d >= e)
10288                     Perl_croak(aTHX_ "%s", number_too_long);
10289                 if (*s == '_') {
10290                    if (lastub && s == lastub + 1)
10291                        Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10292                                       "Misplaced _ in number");
10293                    lastub = s;
10294                 }
10295                 else
10296                     *d++ = *s;
10297             }
10298             /* fractional part ending in underbar? */
10299             if (s[-1] == '_') {
10300                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10301                                "Misplaced _ in number");
10302             }
10303             if (*s == '.' && isDIGIT(s[1])) {
10304                 /* oops, it's really a v-string, but without the "v" */
10305                 s = start;
10306                 goto vstring;
10307             }
10308         }
10309
10310         /* read exponent part, if present */
10311         if ((isALPHA_FOLD_EQ(*s, 'e')
10312               || UNLIKELY(hexfp && isALPHA_FOLD_EQ(*s, 'p')))
10313             && strchr("+-0123456789_", s[1]))
10314         {
10315             floatit = TRUE;
10316
10317             /* regardless of whether user said 3E5 or 3e5, use lower 'e',
10318                ditto for p (hexfloats) */
10319             if ((isALPHA_FOLD_EQ(*s, 'e'))) {
10320                 /* At least some Mach atof()s don't grok 'E' */
10321                 *d++ = 'e';
10322             }
10323             else if (UNLIKELY(hexfp && (isALPHA_FOLD_EQ(*s, 'p')))) {
10324                 *d++ = 'p';
10325             }
10326
10327             s++;
10328
10329
10330             /* stray preinitial _ */
10331             if (*s == '_') {
10332                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10333                                "Misplaced _ in number");
10334                 lastub = s++;
10335             }
10336
10337             /* allow positive or negative exponent */
10338             if (*s == '+' || *s == '-')
10339                 *d++ = *s++;
10340
10341             /* stray initial _ */
10342             if (*s == '_') {
10343                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10344                                "Misplaced _ in number");
10345                 lastub = s++;
10346             }
10347
10348             /* read digits of exponent */
10349             while (isDIGIT(*s) || *s == '_') {
10350                 if (isDIGIT(*s)) {
10351                     if (d >= e)
10352                         Perl_croak(aTHX_ "%s", number_too_long);
10353                     *d++ = *s++;
10354                 }
10355                 else {
10356                    if (((lastub && s == lastub + 1) ||
10357                         (!isDIGIT(s[1]) && s[1] != '_')))
10358                        Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10359                                       "Misplaced _ in number");
10360                    lastub = s++;
10361                 }
10362             }
10363         }
10364
10365
10366         /*
10367            We try to do an integer conversion first if no characters
10368            indicating "float" have been found.
10369          */
10370
10371         if (!floatit) {
10372             UV uv;
10373             const int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
10374
10375             if (flags == IS_NUMBER_IN_UV) {
10376               if (uv <= IV_MAX)
10377                 sv = newSViv(uv); /* Prefer IVs over UVs. */
10378               else
10379                 sv = newSVuv(uv);
10380             } else if (flags == (IS_NUMBER_IN_UV | IS_NUMBER_NEG)) {
10381               if (uv <= (UV) IV_MIN)
10382                 sv = newSViv(-(IV)uv);
10383               else
10384                 floatit = TRUE;
10385             } else
10386               floatit = TRUE;
10387         }
10388         if (floatit) {
10389             STORE_NUMERIC_LOCAL_SET_STANDARD();
10390             /* terminate the string */
10391             *d = '\0';
10392             if (UNLIKELY(hexfp)) {
10393 #  ifdef NV_MANT_DIG
10394                 if (total_bits > NV_MANT_DIG)
10395                     Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
10396                                    "Hexadecimal float: mantissa overflow");
10397 #  endif
10398 #ifdef HEXFP_UQUAD
10399                 nv = hexfp_uquad * hexfp_mult;
10400 #else /* HEXFP_NV */
10401                 nv = hexfp_nv * hexfp_mult;
10402 #endif
10403             } else {
10404                 nv = Atof(PL_tokenbuf);
10405             }
10406             RESTORE_NUMERIC_LOCAL();
10407             sv = newSVnv(nv);
10408         }
10409
10410         if ( floatit
10411              ? (PL_hints & HINT_NEW_FLOAT) : (PL_hints & HINT_NEW_INTEGER) ) {
10412             const char *const key = floatit ? "float" : "integer";
10413             const STRLEN keylen = floatit ? 5 : 7;
10414             sv = S_new_constant(aTHX_ PL_tokenbuf, d - PL_tokenbuf,
10415                                 key, keylen, sv, NULL, NULL, 0);
10416         }
10417         break;
10418
10419     /* if it starts with a v, it could be a v-string */
10420     case 'v':
10421 vstring:
10422                 sv = newSV(5); /* preallocate storage space */
10423                 ENTER_with_name("scan_vstring");
10424                 SAVEFREESV(sv);
10425                 s = scan_vstring(s, PL_bufend, sv);
10426                 SvREFCNT_inc_simple_void_NN(sv);
10427                 LEAVE_with_name("scan_vstring");
10428         break;
10429     }
10430
10431     /* make the op for the constant and return */
10432
10433     if (sv)
10434         lvalp->opval = newSVOP(OP_CONST, 0, sv);
10435     else
10436         lvalp->opval = NULL;
10437
10438     return (char *)s;
10439 }
10440
10441 STATIC char *
10442 S_scan_formline(pTHX_ char *s)
10443 {
10444     char *eol;
10445     char *t;
10446     SV * const stuff = newSVpvs("");
10447     bool needargs = FALSE;
10448     bool eofmt = FALSE;
10449
10450     PERL_ARGS_ASSERT_SCAN_FORMLINE;
10451
10452     while (!needargs) {
10453         if (*s == '.') {
10454             t = s+1;
10455 #ifdef PERL_STRICT_CR
10456             while (SPACE_OR_TAB(*t))
10457                 t++;
10458 #else
10459             while (SPACE_OR_TAB(*t) || *t == '\r')
10460                 t++;
10461 #endif
10462             if (*t == '\n' || t == PL_bufend) {
10463                 eofmt = TRUE;
10464                 break;
10465             }
10466         }
10467         eol = (char *) memchr(s,'\n',PL_bufend-s);
10468         if (!eol++)
10469                 eol = PL_bufend;
10470         if (*s != '#') {
10471             for (t = s; t < eol; t++) {
10472                 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
10473                     needargs = FALSE;
10474                     goto enough;        /* ~~ must be first line in formline */
10475                 }
10476                 if (*t == '@' || *t == '^')
10477                     needargs = TRUE;
10478             }
10479             if (eol > s) {
10480                 sv_catpvn(stuff, s, eol-s);
10481 #ifndef PERL_STRICT_CR
10482                 if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
10483                     char *end = SvPVX(stuff) + SvCUR(stuff);
10484                     end[-2] = '\n';
10485                     end[-1] = '\0';
10486                     SvCUR_set(stuff, SvCUR(stuff) - 1);
10487                 }
10488 #endif
10489             }
10490             else
10491               break;
10492         }
10493         s = (char*)eol;
10494         if ((PL_rsfp || PL_parser->filtered)
10495          && PL_parser->form_lex_state == LEX_NORMAL) {
10496             bool got_some;
10497             PL_bufptr = PL_bufend;
10498             COPLINE_INC_WITH_HERELINES;
10499             got_some = lex_next_chunk(0);
10500             CopLINE_dec(PL_curcop);
10501             s = PL_bufptr;
10502             if (!got_some)
10503                 break;
10504         }
10505         incline(s);
10506     }
10507   enough:
10508     if (!SvCUR(stuff) || needargs)
10509         PL_lex_state = PL_parser->form_lex_state;
10510     if (SvCUR(stuff)) {
10511         PL_expect = XSTATE;
10512         if (needargs) {
10513             const char *s2 = s;
10514             while (*s2 == '\r' || *s2 == ' ' || *s2 == '\t' || *s2 == '\f'
10515                 || *s2 == 013)
10516                 s2++;
10517             if (*s2 == '{') {
10518                 PL_expect = XTERMBLOCK;
10519                 NEXTVAL_NEXTTOKE.ival = 0;
10520                 force_next(DO);
10521             }
10522             NEXTVAL_NEXTTOKE.ival = 0;
10523             force_next(FORMLBRACK);
10524         }
10525         if (!IN_BYTES) {
10526             if (UTF && is_utf8_string((U8*)SvPVX_const(stuff), SvCUR(stuff)))
10527                 SvUTF8_on(stuff);
10528             else if (IN_ENCODING)
10529                 sv_recode_to_utf8(stuff, _get_encoding());
10530         }
10531         NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0, stuff);
10532         force_next(THING);
10533     }
10534     else {
10535         SvREFCNT_dec(stuff);
10536         if (eofmt)
10537             PL_lex_formbrack = 0;
10538     }
10539     return s;
10540 }
10541
10542 I32
10543 Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
10544 {
10545     const I32 oldsavestack_ix = PL_savestack_ix;
10546     CV* const outsidecv = PL_compcv;
10547
10548     SAVEI32(PL_subline);
10549     save_item(PL_subname);
10550     SAVESPTR(PL_compcv);
10551
10552     PL_compcv = MUTABLE_CV(newSV_type(is_format ? SVt_PVFM : SVt_PVCV));
10553     CvFLAGS(PL_compcv) |= flags;
10554
10555     PL_subline = CopLINE(PL_curcop);
10556     CvPADLIST_set(PL_compcv, pad_new(padnew_SAVE|padnew_SAVESUB));
10557     CvOUTSIDE(PL_compcv) = MUTABLE_CV(SvREFCNT_inc_simple(outsidecv));
10558     CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
10559     if (outsidecv && CvPADLIST(outsidecv))
10560         CvPADLIST(PL_compcv)->xpadl_outid = CvPADLIST(outsidecv)->xpadl_id;
10561
10562     return oldsavestack_ix;
10563 }
10564
10565 static int
10566 S_yywarn(pTHX_ const char *const s, U32 flags)
10567 {
10568     PERL_ARGS_ASSERT_YYWARN;
10569
10570     PL_in_eval |= EVAL_WARNONLY;
10571     yyerror_pv(s, flags);
10572     return 0;
10573 }
10574
10575 int
10576 Perl_yyerror(pTHX_ const char *const s)
10577 {
10578     PERL_ARGS_ASSERT_YYERROR;
10579     return yyerror_pvn(s, strlen(s), 0);
10580 }
10581
10582 int
10583 Perl_yyerror_pv(pTHX_ const char *const s, U32 flags)
10584 {
10585     PERL_ARGS_ASSERT_YYERROR_PV;
10586     return yyerror_pvn(s, strlen(s), flags);
10587 }
10588
10589 int
10590 Perl_yyerror_pvn(pTHX_ const char *const s, STRLEN len, U32 flags)
10591 {
10592     const char *context = NULL;
10593     int contlen = -1;
10594     SV *msg;
10595     SV * const where_sv = newSVpvs_flags("", SVs_TEMP);
10596     int yychar  = PL_parser->yychar;
10597
10598     PERL_ARGS_ASSERT_YYERROR_PVN;
10599
10600     if (!yychar || (yychar == ';' && !PL_rsfp))
10601         sv_catpvs(where_sv, "at EOF");
10602     else if (PL_oldoldbufptr && PL_bufptr > PL_oldoldbufptr &&
10603       PL_bufptr - PL_oldoldbufptr < 200 && PL_oldoldbufptr != PL_oldbufptr &&
10604       PL_oldbufptr != PL_bufptr) {
10605         /*
10606                 Only for NetWare:
10607                 The code below is removed for NetWare because it abends/crashes on NetWare
10608                 when the script has error such as not having the closing quotes like:
10609                     if ($var eq "value)
10610                 Checking of white spaces is anyway done in NetWare code.
10611         */
10612 #ifndef NETWARE
10613         while (isSPACE(*PL_oldoldbufptr))
10614             PL_oldoldbufptr++;
10615 #endif
10616         context = PL_oldoldbufptr;
10617         contlen = PL_bufptr - PL_oldoldbufptr;
10618     }
10619     else if (PL_oldbufptr && PL_bufptr > PL_oldbufptr &&
10620       PL_bufptr - PL_oldbufptr < 200 && PL_oldbufptr != PL_bufptr) {
10621         /*
10622                 Only for NetWare:
10623                 The code below is removed for NetWare because it abends/crashes on NetWare
10624                 when the script has error such as not having the closing quotes like:
10625                     if ($var eq "value)
10626                 Checking of white spaces is anyway done in NetWare code.
10627         */
10628 #ifndef NETWARE
10629         while (isSPACE(*PL_oldbufptr))
10630             PL_oldbufptr++;
10631 #endif
10632         context = PL_oldbufptr;
10633         contlen = PL_bufptr - PL_oldbufptr;
10634     }
10635     else if (yychar > 255)
10636         sv_catpvs(where_sv, "next token ???");
10637     else if (yychar == -2) { /* YYEMPTY */
10638         if (PL_lex_state == LEX_NORMAL ||
10639            (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
10640             sv_catpvs(where_sv, "at end of line");
10641         else if (PL_lex_inpat)
10642             sv_catpvs(where_sv, "within pattern");
10643         else
10644             sv_catpvs(where_sv, "within string");
10645     }
10646     else {
10647         sv_catpvs(where_sv, "next char ");
10648         if (yychar < 32)
10649             Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
10650         else if (isPRINT_LC(yychar)) {
10651             const char string = yychar;
10652             sv_catpvn(where_sv, &string, 1);
10653         }
10654         else
10655             Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
10656     }
10657     msg = newSVpvn_flags(s, len, (flags & SVf_UTF8) | SVs_TEMP);
10658     Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
10659         OutCopFILE(PL_curcop),
10660         (IV)(PL_parser->preambling == NOLINE
10661                ? CopLINE(PL_curcop)
10662                : PL_parser->preambling));
10663     if (context)
10664         Perl_sv_catpvf(aTHX_ msg, "near \"%"UTF8f"\"\n",
10665                              UTF8fARG(UTF, contlen, context));
10666     else
10667         Perl_sv_catpvf(aTHX_ msg, "%"SVf"\n", SVfARG(where_sv));
10668     if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
10669         Perl_sv_catpvf(aTHX_ msg,
10670         "  (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
10671                 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
10672         PL_multi_end = 0;
10673     }
10674     if (PL_in_eval & EVAL_WARNONLY) {
10675         PL_in_eval &= ~EVAL_WARNONLY;
10676         Perl_ck_warner_d(aTHX_ packWARN(WARN_SYNTAX), "%"SVf, SVfARG(msg));
10677     }
10678     else
10679         qerror(msg);
10680     if (PL_error_count >= 10) {
10681         SV * errsv;
10682         if (PL_in_eval && ((errsv = ERRSV), SvCUR(errsv)))
10683             Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
10684                        SVfARG(errsv), OutCopFILE(PL_curcop));
10685         else
10686             Perl_croak(aTHX_ "%s has too many errors.\n",
10687             OutCopFILE(PL_curcop));
10688     }
10689     PL_in_my = 0;
10690     PL_in_my_stash = NULL;
10691     return 0;
10692 }
10693
10694 STATIC char*
10695 S_swallow_bom(pTHX_ U8 *s)
10696 {
10697     const STRLEN slen = SvCUR(PL_linestr);
10698
10699     PERL_ARGS_ASSERT_SWALLOW_BOM;
10700
10701     switch (s[0]) {
10702     case 0xFF:
10703         if (s[1] == 0xFE) {
10704             /* UTF-16 little-endian? (or UTF-32LE?) */
10705             if (s[2] == 0 && s[3] == 0)  /* UTF-32 little-endian */
10706                 /* diag_listed_as: Unsupported script encoding %s */
10707                 Perl_croak(aTHX_ "Unsupported script encoding UTF-32LE");
10708 #ifndef PERL_NO_UTF16_FILTER
10709             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (BOM)\n");
10710             s += 2;
10711             if (PL_bufend > (char*)s) {
10712                 s = add_utf16_textfilter(s, TRUE);
10713             }
10714 #else
10715             /* diag_listed_as: Unsupported script encoding %s */
10716             Perl_croak(aTHX_ "Unsupported script encoding UTF-16LE");
10717 #endif
10718         }
10719         break;
10720     case 0xFE:
10721         if (s[1] == 0xFF) {   /* UTF-16 big-endian? */
10722 #ifndef PERL_NO_UTF16_FILTER
10723             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (BOM)\n");
10724             s += 2;
10725             if (PL_bufend > (char *)s) {
10726                 s = add_utf16_textfilter(s, FALSE);
10727             }
10728 #else
10729             /* diag_listed_as: Unsupported script encoding %s */
10730             Perl_croak(aTHX_ "Unsupported script encoding UTF-16BE");
10731 #endif
10732         }
10733         break;
10734     case BOM_UTF8_FIRST_BYTE: {
10735         const STRLEN len = sizeof(BOM_UTF8_TAIL) - 1; /* Exclude trailing NUL */
10736         if (slen > len && memEQ(s+1, BOM_UTF8_TAIL, len)) {
10737             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
10738             s += len + 1;                      /* UTF-8 */
10739         }
10740         break;
10741     }
10742     case 0:
10743         if (slen > 3) {
10744              if (s[1] == 0) {
10745                   if (s[2] == 0xFE && s[3] == 0xFF) {
10746                        /* UTF-32 big-endian */
10747                        /* diag_listed_as: Unsupported script encoding %s */
10748                        Perl_croak(aTHX_ "Unsupported script encoding UTF-32BE");
10749                   }
10750              }
10751              else if (s[2] == 0 && s[3] != 0) {
10752                   /* Leading bytes
10753                    * 00 xx 00 xx
10754                    * are a good indicator of UTF-16BE. */
10755 #ifndef PERL_NO_UTF16_FILTER
10756                   if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (no BOM)\n");
10757                   s = add_utf16_textfilter(s, FALSE);
10758 #else
10759                   /* diag_listed_as: Unsupported script encoding %s */
10760                   Perl_croak(aTHX_ "Unsupported script encoding UTF-16BE");
10761 #endif
10762              }
10763         }
10764         break;
10765
10766     default:
10767          if (slen > 3 && s[1] == 0 && s[2] != 0 && s[3] == 0) {
10768                   /* Leading bytes
10769                    * xx 00 xx 00
10770                    * are a good indicator of UTF-16LE. */
10771 #ifndef PERL_NO_UTF16_FILTER
10772               if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (no BOM)\n");
10773               s = add_utf16_textfilter(s, TRUE);
10774 #else
10775               /* diag_listed_as: Unsupported script encoding %s */
10776               Perl_croak(aTHX_ "Unsupported script encoding UTF-16LE");
10777 #endif
10778          }
10779     }
10780     return (char*)s;
10781 }
10782
10783
10784 #ifndef PERL_NO_UTF16_FILTER
10785 static I32
10786 S_utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
10787 {
10788     SV *const filter = FILTER_DATA(idx);
10789     /* We re-use this each time round, throwing the contents away before we
10790        return.  */
10791     SV *const utf16_buffer = MUTABLE_SV(IoTOP_GV(filter));
10792     SV *const utf8_buffer = filter;
10793     IV status = IoPAGE(filter);
10794     const bool reverse = cBOOL(IoLINES(filter));
10795     I32 retval;
10796
10797     PERL_ARGS_ASSERT_UTF16_TEXTFILTER;
10798
10799     /* As we're automatically added, at the lowest level, and hence only called
10800        from this file, we can be sure that we're not called in block mode. Hence
10801        don't bother writing code to deal with block mode.  */
10802     if (maxlen) {
10803         Perl_croak(aTHX_ "panic: utf16_textfilter called in block mode (for %d characters)", maxlen);
10804     }
10805     if (status < 0) {
10806         Perl_croak(aTHX_ "panic: utf16_textfilter called after error (status=%"IVdf")", status);
10807     }
10808     DEBUG_P(PerlIO_printf(Perl_debug_log,
10809                           "utf16_textfilter(%p,%ce): idx=%d maxlen=%d status=%"IVdf" utf16=%"UVuf" utf8=%"UVuf"\n",
10810                           FPTR2DPTR(void *, S_utf16_textfilter),
10811                           reverse ? 'l' : 'b', idx, maxlen, status,
10812                           (UV)SvCUR(utf16_buffer), (UV)SvCUR(utf8_buffer)));
10813
10814     while (1) {
10815         STRLEN chars;
10816         STRLEN have;
10817         I32 newlen;
10818         U8 *end;
10819         /* First, look in our buffer of existing UTF-8 data:  */
10820         char *nl = (char *)memchr(SvPVX(utf8_buffer), '\n', SvCUR(utf8_buffer));
10821
10822         if (nl) {
10823             ++nl;
10824         } else if (status == 0) {
10825             /* EOF */
10826             IoPAGE(filter) = 0;
10827             nl = SvEND(utf8_buffer);
10828         }
10829         if (nl) {
10830             STRLEN got = nl - SvPVX(utf8_buffer);
10831             /* Did we have anything to append?  */
10832             retval = got != 0;
10833             sv_catpvn(sv, SvPVX(utf8_buffer), got);
10834             /* Everything else in this code works just fine if SVp_POK isn't
10835                set.  This, however, needs it, and we need it to work, else
10836                we loop infinitely because the buffer is never consumed.  */
10837             sv_chop(utf8_buffer, nl);
10838             break;
10839         }
10840
10841         /* OK, not a complete line there, so need to read some more UTF-16.
10842            Read an extra octect if the buffer currently has an odd number. */
10843         while (1) {
10844             if (status <= 0)
10845                 break;
10846             if (SvCUR(utf16_buffer) >= 2) {
10847                 /* Location of the high octet of the last complete code point.
10848                    Gosh, UTF-16 is a pain. All the benefits of variable length,
10849                    *coupled* with all the benefits of partial reads and
10850                    endianness.  */
10851                 const U8 *const last_hi = (U8*)SvPVX(utf16_buffer)
10852                     + ((SvCUR(utf16_buffer) & ~1) - (reverse ? 1 : 2));
10853
10854                 if (*last_hi < 0xd8 || *last_hi > 0xdb) {
10855                     break;
10856                 }
10857
10858                 /* We have the first half of a surrogate. Read more.  */
10859                 DEBUG_P(PerlIO_printf(Perl_debug_log, "utf16_textfilter partial surrogate detected at %p\n", last_hi));
10860             }
10861
10862             status = FILTER_READ(idx + 1, utf16_buffer,
10863                                  160 + (SvCUR(utf16_buffer) & 1));
10864             DEBUG_P(PerlIO_printf(Perl_debug_log, "utf16_textfilter status=%"IVdf" SvCUR(sv)=%"UVuf"\n", status, (UV)SvCUR(utf16_buffer)));
10865             DEBUG_P({ sv_dump(utf16_buffer); sv_dump(utf8_buffer);});
10866             if (status < 0) {
10867                 /* Error */
10868                 IoPAGE(filter) = status;
10869                 return status;
10870             }
10871         }
10872
10873         chars = SvCUR(utf16_buffer) >> 1;
10874         have = SvCUR(utf8_buffer);
10875         SvGROW(utf8_buffer, have + chars * 3 + 1);
10876
10877         if (reverse) {
10878             end = utf16_to_utf8_reversed((U8*)SvPVX(utf16_buffer),
10879                                          (U8*)SvPVX_const(utf8_buffer) + have,
10880                                          chars * 2, &newlen);
10881         } else {
10882             end = utf16_to_utf8((U8*)SvPVX(utf16_buffer),
10883                                 (U8*)SvPVX_const(utf8_buffer) + have,
10884                                 chars * 2, &newlen);
10885         }
10886         SvCUR_set(utf8_buffer, have + newlen);
10887         *end = '\0';
10888
10889         /* No need to keep this SV "well-formed" with a '\0' after the end, as
10890            it's private to us, and utf16_to_utf8{,reversed} take a
10891            (pointer,length) pair, rather than a NUL-terminated string.  */
10892         if(SvCUR(utf16_buffer) & 1) {
10893             *SvPVX(utf16_buffer) = SvEND(utf16_buffer)[-1];
10894             SvCUR_set(utf16_buffer, 1);
10895         } else {
10896             SvCUR_set(utf16_buffer, 0);
10897         }
10898     }
10899     DEBUG_P(PerlIO_printf(Perl_debug_log,
10900                           "utf16_textfilter: returns, status=%"IVdf" utf16=%"UVuf" utf8=%"UVuf"\n",
10901                           status,
10902                           (UV)SvCUR(utf16_buffer), (UV)SvCUR(utf8_buffer)));
10903     DEBUG_P({ sv_dump(utf8_buffer); sv_dump(sv);});
10904     return retval;
10905 }
10906
10907 static U8 *
10908 S_add_utf16_textfilter(pTHX_ U8 *const s, bool reversed)
10909 {
10910     SV *filter = filter_add(S_utf16_textfilter, NULL);
10911
10912     PERL_ARGS_ASSERT_ADD_UTF16_TEXTFILTER;
10913
10914     IoTOP_GV(filter) = MUTABLE_GV(newSVpvn((char *)s, PL_bufend - (char*)s));
10915     sv_setpvs(filter, "");
10916     IoLINES(filter) = reversed;
10917     IoPAGE(filter) = 1; /* Not EOF */
10918
10919     /* Sadly, we have to return a valid pointer, come what may, so we have to
10920        ignore any error return from this.  */
10921     SvCUR_set(PL_linestr, 0);
10922     if (FILTER_READ(0, PL_linestr, 0)) {
10923         SvUTF8_on(PL_linestr);
10924     } else {
10925         SvUTF8_on(PL_linestr);
10926     }
10927     PL_bufend = SvEND(PL_linestr);
10928     return (U8*)SvPVX(PL_linestr);
10929 }
10930 #endif
10931
10932 /*
10933 Returns a pointer to the next character after the parsed
10934 vstring, as well as updating the passed in sv.
10935
10936 Function must be called like
10937
10938         sv = sv_2mortal(newSV(5));
10939         s = scan_vstring(s,e,sv);
10940
10941 where s and e are the start and end of the string.
10942 The sv should already be large enough to store the vstring
10943 passed in, for performance reasons.
10944
10945 This function may croak if fatal warnings are enabled in the
10946 calling scope, hence the sv_2mortal in the example (to prevent
10947 a leak).  Make sure to do SvREFCNT_inc afterwards if you use
10948 sv_2mortal.
10949
10950 */
10951
10952 char *
10953 Perl_scan_vstring(pTHX_ const char *s, const char *const e, SV *sv)
10954 {
10955     const char *pos = s;
10956     const char *start = s;
10957
10958     PERL_ARGS_ASSERT_SCAN_VSTRING;
10959
10960     if (*pos == 'v') pos++;  /* get past 'v' */
10961     while (pos < e && (isDIGIT(*pos) || *pos == '_'))
10962         pos++;
10963     if ( *pos != '.') {
10964         /* this may not be a v-string if followed by => */
10965         const char *next = pos;
10966         while (next < e && isSPACE(*next))
10967             ++next;
10968         if ((e - next) >= 2 && *next == '=' && next[1] == '>' ) {
10969             /* return string not v-string */
10970             sv_setpvn(sv,(char *)s,pos-s);
10971             return (char *)pos;
10972         }
10973     }
10974
10975     if (!isALPHA(*pos)) {
10976         U8 tmpbuf[UTF8_MAXBYTES+1];
10977
10978         if (*s == 'v')
10979             s++;  /* get past 'v' */
10980
10981         sv_setpvs(sv, "");
10982
10983         for (;;) {
10984             /* this is atoi() that tolerates underscores */
10985             U8 *tmpend;
10986             UV rev = 0;
10987             const char *end = pos;
10988             UV mult = 1;
10989             while (--end >= s) {
10990                 if (*end != '_') {
10991                     const UV orev = rev;
10992                     rev += (*end - '0') * mult;
10993                     mult *= 10;
10994                     if (orev > rev)
10995                         /* diag_listed_as: Integer overflow in %s number */
10996                         Perl_ck_warner_d(aTHX_ packWARN(WARN_OVERFLOW),
10997                                          "Integer overflow in decimal number");
10998                 }
10999             }
11000 #ifdef EBCDIC
11001             if (rev > 0x7FFFFFFF)
11002                  Perl_croak(aTHX_ "In EBCDIC the v-string components cannot exceed 2147483647");
11003 #endif
11004             /* Append native character for the rev point */
11005             tmpend = uvchr_to_utf8(tmpbuf, rev);
11006             sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
11007             if (!UVCHR_IS_INVARIANT(rev))
11008                  SvUTF8_on(sv);
11009             if (pos + 1 < e && *pos == '.' && isDIGIT(pos[1]))
11010                  s = ++pos;
11011             else {
11012                  s = pos;
11013                  break;
11014             }
11015             while (pos < e && (isDIGIT(*pos) || *pos == '_'))
11016                  pos++;
11017         }
11018         SvPOK_on(sv);
11019         sv_magic(sv,NULL,PERL_MAGIC_vstring,(const char*)start, pos-start);
11020         SvRMAGICAL_on(sv);
11021     }
11022     return (char *)s;
11023 }
11024
11025 int
11026 Perl_keyword_plugin_standard(pTHX_
11027         char *keyword_ptr, STRLEN keyword_len, OP **op_ptr)
11028 {
11029     PERL_ARGS_ASSERT_KEYWORD_PLUGIN_STANDARD;
11030     PERL_UNUSED_CONTEXT;
11031     PERL_UNUSED_ARG(keyword_ptr);
11032     PERL_UNUSED_ARG(keyword_len);
11033     PERL_UNUSED_ARG(op_ptr);
11034     return KEYWORD_PLUGIN_DECLINE;
11035 }
11036
11037 #define parse_recdescent(g,p) S_parse_recdescent(aTHX_ g,p)
11038 static void
11039 S_parse_recdescent(pTHX_ int gramtype, I32 fakeeof)
11040 {
11041     SAVEI32(PL_lex_brackets);
11042     if (PL_lex_brackets > 100)
11043         Renew(PL_lex_brackstack, PL_lex_brackets + 10, char);
11044     PL_lex_brackstack[PL_lex_brackets++] = XFAKEEOF;
11045     SAVEI32(PL_lex_allbrackets);
11046     PL_lex_allbrackets = 0;
11047     SAVEI8(PL_lex_fakeeof);
11048     PL_lex_fakeeof = (U8)fakeeof;
11049     if(yyparse(gramtype) && !PL_parser->error_count)
11050         qerror(Perl_mess(aTHX_ "Parse error"));
11051 }
11052
11053 #define parse_recdescent_for_op(g,p) S_parse_recdescent_for_op(aTHX_ g,p)
11054 static OP *
11055 S_parse_recdescent_for_op(pTHX_ int gramtype, I32 fakeeof)
11056 {
11057     OP *o;
11058     ENTER;
11059     SAVEVPTR(PL_eval_root);
11060     PL_eval_root = NULL;
11061     parse_recdescent(gramtype, fakeeof);
11062     o = PL_eval_root;
11063     LEAVE;
11064     return o;
11065 }
11066
11067 #define parse_expr(p,f) S_parse_expr(aTHX_ p,f)
11068 static OP *
11069 S_parse_expr(pTHX_ I32 fakeeof, U32 flags)
11070 {
11071     OP *exprop;
11072     if (flags & ~PARSE_OPTIONAL)
11073         Perl_croak(aTHX_ "Parsing code internal error (%s)", "parse_expr");
11074     exprop = parse_recdescent_for_op(GRAMEXPR, fakeeof);
11075     if (!exprop && !(flags & PARSE_OPTIONAL)) {
11076         if (!PL_parser->error_count)
11077             qerror(Perl_mess(aTHX_ "Parse error"));
11078         exprop = newOP(OP_NULL, 0);
11079     }
11080     return exprop;
11081 }
11082
11083 /*
11084 =for apidoc Amx|OP *|parse_arithexpr|U32 flags
11085
11086 Parse a Perl arithmetic expression.  This may contain operators of precedence
11087 down to the bit shift operators.  The expression must be followed (and thus
11088 terminated) either by a comparison or lower-precedence operator or by
11089 something that would normally terminate an expression such as semicolon.
11090 If I<flags> includes C<PARSE_OPTIONAL> then the expression is optional,
11091 otherwise it is mandatory.  It is up to the caller to ensure that the
11092 dynamic parser state (L</PL_parser> et al) is correctly set to reflect
11093 the source of the code to be parsed and the lexical context for the
11094 expression.
11095
11096 The op tree representing the expression is returned.  If an optional
11097 expression is absent, a null pointer is returned, otherwise the pointer
11098 will be non-null.
11099
11100 If an error occurs in parsing or compilation, in most cases a valid op
11101 tree is returned anyway.  The error is reflected in the parser state,
11102 normally resulting in a single exception at the top level of parsing
11103 which covers all the compilation errors that occurred.  Some compilation
11104 errors, however, will throw an exception immediately.
11105
11106 =cut
11107 */
11108
11109 OP *
11110 Perl_parse_arithexpr(pTHX_ U32 flags)
11111 {
11112     return parse_expr(LEX_FAKEEOF_COMPARE, flags);
11113 }
11114
11115 /*
11116 =for apidoc Amx|OP *|parse_termexpr|U32 flags
11117
11118 Parse a Perl term expression.  This may contain operators of precedence
11119 down to the assignment operators.  The expression must be followed (and thus
11120 terminated) either by a comma or lower-precedence operator or by
11121 something that would normally terminate an expression such as semicolon.
11122 If I<flags> includes C<PARSE_OPTIONAL> then the expression is optional,
11123 otherwise it is mandatory.  It is up to the caller to ensure that the
11124 dynamic parser state (L</PL_parser> et al) is correctly set to reflect
11125 the source of the code to be parsed and the lexical context for the
11126 expression.
11127
11128 The op tree representing the expression is returned.  If an optional
11129 expression is absent, a null pointer is returned, otherwise the pointer
11130 will be non-null.
11131
11132 If an error occurs in parsing or compilation, in most cases a valid op
11133 tree is returned anyway.  The error is reflected in the parser state,
11134 normally resulting in a single exception at the top level of parsing
11135 which covers all the compilation errors that occurred.  Some compilation
11136 errors, however, will throw an exception immediately.
11137
11138 =cut
11139 */
11140
11141 OP *
11142 Perl_parse_termexpr(pTHX_ U32 flags)
11143 {
11144     return parse_expr(LEX_FAKEEOF_COMMA, flags);
11145 }
11146
11147 /*
11148 =for apidoc Amx|OP *|parse_listexpr|U32 flags
11149
11150 Parse a Perl list expression.  This may contain operators of precedence
11151 down to the comma operator.  The expression must be followed (and thus
11152 terminated) either by a low-precedence logic operator such as C<or> or by
11153 something that would normally terminate an expression such as semicolon.
11154 If I<flags> includes C<PARSE_OPTIONAL> then the expression is optional,
11155 otherwise it is mandatory.  It is up to the caller to ensure that the
11156 dynamic parser state (L</PL_parser> et al) is correctly set to reflect
11157 the source of the code to be parsed and the lexical context for the
11158 expression.
11159
11160 The op tree representing the expression is returned.  If an optional
11161 expression is absent, a null pointer is returned, otherwise the pointer
11162 will be non-null.
11163
11164 If an error occurs in parsing or compilation, in most cases a valid op
11165 tree is returned anyway.  The error is reflected in the parser state,
11166 normally resulting in a single exception at the top level of parsing
11167 which covers all the compilation errors that occurred.  Some compilation
11168 errors, however, will throw an exception immediately.
11169
11170 =cut
11171 */
11172
11173 OP *
11174 Perl_parse_listexpr(pTHX_ U32 flags)
11175 {
11176     return parse_expr(LEX_FAKEEOF_LOWLOGIC, flags);
11177 }
11178
11179 /*
11180 =for apidoc Amx|OP *|parse_fullexpr|U32 flags
11181
11182 Parse a single complete Perl expression.  This allows the full
11183 expression grammar, including the lowest-precedence operators such
11184 as C<or>.  The expression must be followed (and thus terminated) by a
11185 token that an expression would normally be terminated by: end-of-file,
11186 closing bracketing punctuation, semicolon, or one of the keywords that
11187 signals a postfix expression-statement modifier.  If I<flags> includes
11188 C<PARSE_OPTIONAL> then the expression is optional, otherwise it is
11189 mandatory.  It is up to the caller to ensure that the dynamic parser
11190 state (L</PL_parser> et al) is correctly set to reflect the source of
11191 the code to be parsed and the lexical context for the expression.
11192
11193 The op tree representing the expression is returned.  If an optional
11194 expression is absent, a null pointer is returned, otherwise the pointer
11195 will be non-null.
11196
11197 If an error occurs in parsing or compilation, in most cases a valid op
11198 tree is returned anyway.  The error is reflected in the parser state,
11199 normally resulting in a single exception at the top level of parsing
11200 which covers all the compilation errors that occurred.  Some compilation
11201 errors, however, will throw an exception immediately.
11202
11203 =cut
11204 */
11205
11206 OP *
11207 Perl_parse_fullexpr(pTHX_ U32 flags)
11208 {
11209     return parse_expr(LEX_FAKEEOF_NONEXPR, flags);
11210 }
11211
11212 /*
11213 =for apidoc Amx|OP *|parse_block|U32 flags
11214
11215 Parse a single complete Perl code block.  This consists of an opening
11216 brace, a sequence of statements, and a closing brace.  The block
11217 constitutes a lexical scope, so C<my> variables and various compile-time
11218 effects can be contained within it.  It is up to the caller to ensure
11219 that the dynamic parser state (L</PL_parser> et al) is correctly set to
11220 reflect the source of the code to be parsed and the lexical context for
11221 the statement.
11222
11223 The op tree representing the code block is returned.  This is always a
11224 real op, never a null pointer.  It will normally be a C<lineseq> list,
11225 including C<nextstate> or equivalent ops.  No ops to construct any kind
11226 of runtime scope are included by virtue of it being a block.
11227
11228 If an error occurs in parsing or compilation, in most cases a valid op
11229 tree (most likely null) is returned anyway.  The error is reflected in
11230 the parser state, normally resulting in a single exception at the top
11231 level of parsing which covers all the compilation errors that occurred.
11232 Some compilation errors, however, will throw an exception immediately.
11233
11234 The I<flags> parameter is reserved for future use, and must always
11235 be zero.
11236
11237 =cut
11238 */
11239
11240 OP *
11241 Perl_parse_block(pTHX_ U32 flags)
11242 {
11243     if (flags)
11244         Perl_croak(aTHX_ "Parsing code internal error (%s)", "parse_block");
11245     return parse_recdescent_for_op(GRAMBLOCK, LEX_FAKEEOF_NEVER);
11246 }
11247
11248 /*
11249 =for apidoc Amx|OP *|parse_barestmt|U32 flags
11250
11251 Parse a single unadorned Perl statement.  This may be a normal imperative
11252 statement or a declaration that has compile-time effect.  It does not
11253 include any label or other affixture.  It is up to the caller to ensure
11254 that the dynamic parser state (L</PL_parser> et al) is correctly set to
11255 reflect the source of the code to be parsed and the lexical context for
11256 the statement.
11257
11258 The op tree representing the statement is returned.  This may be a
11259 null pointer if the statement is null, for example if it was actually
11260 a subroutine definition (which has compile-time side effects).  If not
11261 null, it will be ops directly implementing the statement, suitable to
11262 pass to L</newSTATEOP>.  It will not normally include a C<nextstate> or
11263 equivalent op (except for those embedded in a scope contained entirely
11264 within the statement).
11265
11266 If an error occurs in parsing or compilation, in most cases a valid op
11267 tree (most likely null) is returned anyway.  The error is reflected in
11268 the parser state, normally resulting in a single exception at the top
11269 level of parsing which covers all the compilation errors that occurred.
11270 Some compilation errors, however, will throw an exception immediately.
11271
11272 The I<flags> parameter is reserved for future use, and must always
11273 be zero.
11274
11275 =cut
11276 */
11277
11278 OP *
11279 Perl_parse_barestmt(pTHX_ U32 flags)
11280 {
11281     if (flags)
11282         Perl_croak(aTHX_ "Parsing code internal error (%s)", "parse_barestmt");
11283     return parse_recdescent_for_op(GRAMBARESTMT, LEX_FAKEEOF_NEVER);
11284 }
11285
11286 /*
11287 =for apidoc Amx|SV *|parse_label|U32 flags
11288
11289 Parse a single label, possibly optional, of the type that may prefix a
11290 Perl statement.  It is up to the caller to ensure that the dynamic parser
11291 state (L</PL_parser> et al) is correctly set to reflect the source of
11292 the code to be parsed.  If I<flags> includes C<PARSE_OPTIONAL> then the
11293 label is optional, otherwise it is mandatory.
11294
11295 The name of the label is returned in the form of a fresh scalar.  If an
11296 optional label is absent, a null pointer is returned.
11297
11298 If an error occurs in parsing, which can only occur if the label is
11299 mandatory, a valid label is returned anyway.  The error is reflected in
11300 the parser state, normally resulting in a single exception at the top
11301 level of parsing which covers all the compilation errors that occurred.
11302
11303 =cut
11304 */
11305
11306 SV *
11307 Perl_parse_label(pTHX_ U32 flags)
11308 {
11309     if (flags & ~PARSE_OPTIONAL)
11310         Perl_croak(aTHX_ "Parsing code internal error (%s)", "parse_label");
11311     if (PL_lex_state == LEX_KNOWNEXT) {
11312         PL_parser->yychar = yylex();
11313         if (PL_parser->yychar == LABEL) {
11314             char * const lpv = pl_yylval.pval;
11315             STRLEN llen = strlen(lpv);
11316             PL_parser->yychar = YYEMPTY;
11317             return newSVpvn_flags(lpv, llen, lpv[llen+1] ? SVf_UTF8 : 0);
11318         } else {
11319             yyunlex();
11320             goto no_label;
11321         }
11322     } else {
11323         char *s, *t;
11324         STRLEN wlen, bufptr_pos;
11325         lex_read_space(0);
11326         t = s = PL_bufptr;
11327         if (!isIDFIRST_lazy_if(s, UTF))
11328             goto no_label;
11329         t = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &wlen);
11330         if (word_takes_any_delimeter(s, wlen))
11331             goto no_label;
11332         bufptr_pos = s - SvPVX(PL_linestr);
11333         PL_bufptr = t;
11334         lex_read_space(LEX_KEEP_PREVIOUS);
11335         t = PL_bufptr;
11336         s = SvPVX(PL_linestr) + bufptr_pos;
11337         if (t[0] == ':' && t[1] != ':') {
11338             PL_oldoldbufptr = PL_oldbufptr;
11339             PL_oldbufptr = s;
11340             PL_bufptr = t+1;
11341             return newSVpvn_flags(s, wlen, UTF ? SVf_UTF8 : 0);
11342         } else {
11343             PL_bufptr = s;
11344             no_label:
11345             if (flags & PARSE_OPTIONAL) {
11346                 return NULL;
11347             } else {
11348                 qerror(Perl_mess(aTHX_ "Parse error"));
11349                 return newSVpvs("x");
11350             }
11351         }
11352     }
11353 }
11354
11355 /*
11356 =for apidoc Amx|OP *|parse_fullstmt|U32 flags
11357
11358 Parse a single complete Perl statement.  This may be a normal imperative
11359 statement or a declaration that has compile-time effect, and may include
11360 optional labels.  It is up to the caller to ensure that the dynamic
11361 parser state (L</PL_parser> et al) is correctly set to reflect the source
11362 of the code to be parsed and the lexical context for the statement.
11363
11364 The op tree representing the statement is returned.  This may be a
11365 null pointer if the statement is null, for example if it was actually
11366 a subroutine definition (which has compile-time side effects).  If not
11367 null, it will be the result of a L</newSTATEOP> call, normally including
11368 a C<nextstate> or equivalent op.
11369
11370 If an error occurs in parsing or compilation, in most cases a valid op
11371 tree (most likely null) is returned anyway.  The error is reflected in
11372 the parser state, normally resulting in a single exception at the top
11373 level of parsing which covers all the compilation errors that occurred.
11374 Some compilation errors, however, will throw an exception immediately.
11375
11376 The I<flags> parameter is reserved for future use, and must always
11377 be zero.
11378
11379 =cut
11380 */
11381
11382 OP *
11383 Perl_parse_fullstmt(pTHX_ U32 flags)
11384 {
11385     if (flags)
11386         Perl_croak(aTHX_ "Parsing code internal error (%s)", "parse_fullstmt");
11387     return parse_recdescent_for_op(GRAMFULLSTMT, LEX_FAKEEOF_NEVER);
11388 }
11389
11390 /*
11391 =for apidoc Amx|OP *|parse_stmtseq|U32 flags
11392
11393 Parse a sequence of zero or more Perl statements.  These may be normal
11394 imperative statements, including optional labels, or declarations
11395 that have compile-time effect, or any mixture thereof.  The statement
11396 sequence ends when a closing brace or end-of-file is encountered in a
11397 place where a new statement could have validly started.  It is up to
11398 the caller to ensure that the dynamic parser state (L</PL_parser> et al)
11399 is correctly set to reflect the source of the code to be parsed and the
11400 lexical context for the statements.
11401
11402 The op tree representing the statement sequence is returned.  This may
11403 be a null pointer if the statements were all null, for example if there
11404 were no statements or if there were only subroutine definitions (which
11405 have compile-time side effects).  If not null, it will be a C<lineseq>
11406 list, normally including C<nextstate> or equivalent ops.
11407
11408 If an error occurs in parsing or compilation, in most cases a valid op
11409 tree is returned anyway.  The error is reflected in the parser state,
11410 normally resulting in a single exception at the top level of parsing
11411 which covers all the compilation errors that occurred.  Some compilation
11412 errors, however, will throw an exception immediately.
11413
11414 The I<flags> parameter is reserved for future use, and must always
11415 be zero.
11416
11417 =cut
11418 */
11419
11420 OP *
11421 Perl_parse_stmtseq(pTHX_ U32 flags)
11422 {
11423     OP *stmtseqop;
11424     I32 c;
11425     if (flags)
11426         Perl_croak(aTHX_ "Parsing code internal error (%s)", "parse_stmtseq");
11427     stmtseqop = parse_recdescent_for_op(GRAMSTMTSEQ, LEX_FAKEEOF_CLOSING);
11428     c = lex_peek_unichar(0);
11429     if (c != -1 && c != /*{*/'}')
11430         qerror(Perl_mess(aTHX_ "Parse error"));
11431     return stmtseqop;
11432 }
11433
11434 #define lex_token_boundary() S_lex_token_boundary(aTHX)
11435 static void
11436 S_lex_token_boundary(pTHX)
11437 {
11438     PL_oldoldbufptr = PL_oldbufptr;
11439     PL_oldbufptr = PL_bufptr;
11440 }
11441
11442 #define parse_opt_lexvar() S_parse_opt_lexvar(aTHX)
11443 static OP *
11444 S_parse_opt_lexvar(pTHX)
11445 {
11446     I32 sigil, c;
11447     char *s, *d;
11448     OP *var;
11449     lex_token_boundary();
11450     sigil = lex_read_unichar(0);
11451     if (lex_peek_unichar(0) == '#') {
11452         qerror(Perl_mess(aTHX_ "Parse error"));
11453         return NULL;
11454     }
11455     lex_read_space(0);
11456     c = lex_peek_unichar(0);
11457     if (c == -1 || !(UTF ? isIDFIRST_uni(c) : isIDFIRST_A(c)))
11458         return NULL;
11459     s = PL_bufptr;
11460     d = PL_tokenbuf + 1;
11461     PL_tokenbuf[0] = (char)sigil;
11462     parse_ident(&s, &d, PL_tokenbuf + sizeof(PL_tokenbuf) - 1, 0, cBOOL(UTF));
11463     PL_bufptr = s;
11464     if (d == PL_tokenbuf+1)
11465         return NULL;
11466     var = newOP(sigil == '$' ? OP_PADSV : sigil == '@' ? OP_PADAV : OP_PADHV,
11467                 OPf_MOD | (OPpLVAL_INTRO<<8));
11468     var->op_targ = allocmy(PL_tokenbuf, d - PL_tokenbuf, UTF ? SVf_UTF8 : 0);
11469     return var;
11470 }
11471
11472 OP *
11473 Perl_parse_subsignature(pTHX)
11474 {
11475     I32 c;
11476     int prev_type = 0, pos = 0, min_arity = 0, max_arity = 0;
11477     OP *initops = NULL;
11478     lex_read_space(0);
11479     c = lex_peek_unichar(0);
11480     while (c != /*(*/')') {
11481         switch (c) {
11482             case '$': {
11483                 OP *var, *expr;
11484                 if (prev_type == 2)
11485                     qerror(Perl_mess(aTHX_ "Slurpy parameter not last"));
11486                 var = parse_opt_lexvar();
11487                 expr = var ?
11488                     newBINOP(OP_AELEM, 0,
11489                         ref(newUNOP(OP_RV2AV, 0, newGVOP(OP_GV, 0, PL_defgv)),
11490                             OP_RV2AV),
11491                         newSVOP(OP_CONST, 0, newSViv(pos))) :
11492                     NULL;
11493                 lex_read_space(0);
11494                 c = lex_peek_unichar(0);
11495                 if (c == '=') {
11496                     lex_token_boundary();
11497                     lex_read_unichar(0);
11498                     lex_read_space(0);
11499                     c = lex_peek_unichar(0);
11500                     if (c == ',' || c == /*(*/')') {
11501                         if (var)
11502                             qerror(Perl_mess(aTHX_ "Optional parameter "
11503                                     "lacks default expression"));
11504                     } else {
11505                         OP *defexpr = parse_termexpr(0);
11506                         if (defexpr->op_type == OP_UNDEF &&
11507                                 !(defexpr->op_flags & OPf_KIDS)) {
11508                             op_free(defexpr);
11509                         } else {
11510                             OP *ifop = 
11511                                 newBINOP(OP_GE, 0,
11512                                     scalar(newUNOP(OP_RV2AV, 0,
11513                                             newGVOP(OP_GV, 0, PL_defgv))),
11514                                     newSVOP(OP_CONST, 0, newSViv(pos+1)));
11515                             expr = var ?
11516                                 newCONDOP(0, ifop, expr, defexpr) :
11517                                 newLOGOP(OP_OR, 0, ifop, defexpr);
11518                         }
11519                     }
11520                     prev_type = 1;
11521                 } else {
11522                     if (prev_type == 1)
11523                         qerror(Perl_mess(aTHX_ "Mandatory parameter "
11524                                 "follows optional parameter"));
11525                     prev_type = 0;
11526                     min_arity = pos + 1;
11527                 }
11528                 if (var) expr = newASSIGNOP(OPf_STACKED, var, 0, expr);
11529                 if (expr)
11530                     initops = op_append_list(OP_LINESEQ, initops,
11531                                 newSTATEOP(0, NULL, expr));
11532                 max_arity = ++pos;
11533             } break;
11534             case '@':
11535             case '%': {
11536                 OP *var;
11537                 if (prev_type == 2)
11538                     qerror(Perl_mess(aTHX_ "Slurpy parameter not last"));
11539                 var = parse_opt_lexvar();
11540                 if (c == '%') {
11541                     OP *chkop = newLOGOP((pos & 1) ? OP_OR : OP_AND, 0,
11542                             newBINOP(OP_BIT_AND, 0,
11543                                 scalar(newUNOP(OP_RV2AV, 0,
11544                                     newGVOP(OP_GV, 0, PL_defgv))),
11545                                 newSVOP(OP_CONST, 0, newSViv(1))),
11546                             op_convert_list(OP_DIE, 0,
11547                                 op_convert_list(OP_SPRINTF, 0,
11548                                     op_append_list(OP_LIST,
11549                                         newSVOP(OP_CONST, 0,
11550                                             newSVpvs("Odd name/value argument for subroutine at %s line %d.\n")),
11551                                         newSLICEOP(0,
11552                                             op_append_list(OP_LIST,
11553                                                 newSVOP(OP_CONST, 0, newSViv(1)),
11554                                                 newSVOP(OP_CONST, 0, newSViv(2))),
11555                                             newOP(OP_CALLER, 0))))));
11556                     if (pos != min_arity)
11557                         chkop = newLOGOP(OP_AND, 0,
11558                                     newBINOP(OP_GT, 0,
11559                                         scalar(newUNOP(OP_RV2AV, 0,
11560                                             newGVOP(OP_GV, 0, PL_defgv))),
11561                                         newSVOP(OP_CONST, 0, newSViv(pos))),
11562                                     chkop);
11563                     initops = op_append_list(OP_LINESEQ,
11564                                 newSTATEOP(0, NULL, chkop),
11565                                 initops);
11566                 }
11567                 if (var) {
11568                     OP *slice = pos ?
11569                         op_prepend_elem(OP_ASLICE,
11570                             newOP(OP_PUSHMARK, 0),
11571                             newLISTOP(OP_ASLICE, 0,
11572                                 list(newRANGE(0,
11573                                     newSVOP(OP_CONST, 0, newSViv(pos)),
11574                                     newUNOP(OP_AV2ARYLEN, 0,
11575                                         ref(newUNOP(OP_RV2AV, 0,
11576                                                 newGVOP(OP_GV, 0, PL_defgv)),
11577                                             OP_AV2ARYLEN)))),
11578                                 ref(newUNOP(OP_RV2AV, 0,
11579                                         newGVOP(OP_GV, 0, PL_defgv)),
11580                                     OP_ASLICE))) :
11581                         newUNOP(OP_RV2AV, 0, newGVOP(OP_GV, 0, PL_defgv));
11582                     initops = op_append_list(OP_LINESEQ, initops,
11583                         newSTATEOP(0, NULL,
11584                             newASSIGNOP(OPf_STACKED, var, 0, slice)));
11585                 }
11586                 prev_type = 2;
11587                 max_arity = -1;
11588             } break;
11589             default:
11590                 parse_error:
11591                 qerror(Perl_mess(aTHX_ "Parse error"));
11592                 return NULL;
11593         }
11594         lex_read_space(0);
11595         c = lex_peek_unichar(0);
11596         switch (c) {
11597             case /*(*/')': break;
11598             case ',':
11599                 do {
11600                     lex_token_boundary();
11601                     lex_read_unichar(0);
11602                     lex_read_space(0);
11603                     c = lex_peek_unichar(0);
11604                 } while (c == ',');
11605                 break;
11606             default:
11607                 goto parse_error;
11608         }
11609     }
11610     if (min_arity != 0) {
11611         initops = op_append_list(OP_LINESEQ,
11612             newSTATEOP(0, NULL,
11613                 newLOGOP(OP_OR, 0,
11614                     newBINOP(OP_GE, 0,
11615                         scalar(newUNOP(OP_RV2AV, 0,
11616                             newGVOP(OP_GV, 0, PL_defgv))),
11617                         newSVOP(OP_CONST, 0, newSViv(min_arity))),
11618                     op_convert_list(OP_DIE, 0,
11619                         op_convert_list(OP_SPRINTF, 0,
11620                             op_append_list(OP_LIST,
11621                                 newSVOP(OP_CONST, 0,
11622                                     newSVpvs("Too few arguments for subroutine at %s line %d.\n")),
11623                                 newSLICEOP(0,
11624                                     op_append_list(OP_LIST,
11625                                         newSVOP(OP_CONST, 0, newSViv(1)),
11626                                         newSVOP(OP_CONST, 0, newSViv(2))),
11627                                     newOP(OP_CALLER, 0))))))),
11628             initops);
11629     }
11630     if (max_arity != -1) {
11631         initops = op_append_list(OP_LINESEQ,
11632             newSTATEOP(0, NULL,
11633                 newLOGOP(OP_OR, 0,
11634                     newBINOP(OP_LE, 0,
11635                         scalar(newUNOP(OP_RV2AV, 0,
11636                             newGVOP(OP_GV, 0, PL_defgv))),
11637                         newSVOP(OP_CONST, 0, newSViv(max_arity))),
11638                     op_convert_list(OP_DIE, 0,
11639                         op_convert_list(OP_SPRINTF, 0,
11640                             op_append_list(OP_LIST,
11641                                 newSVOP(OP_CONST, 0,
11642                                     newSVpvs("Too many arguments for subroutine at %s line %d.\n")),
11643                                 newSLICEOP(0,
11644                                     op_append_list(OP_LIST,
11645                                         newSVOP(OP_CONST, 0, newSViv(1)),
11646                                         newSVOP(OP_CONST, 0, newSViv(2))),
11647                                     newOP(OP_CALLER, 0))))))),
11648             initops);
11649     }
11650     return initops;
11651 }
11652
11653 /*
11654  * Local variables:
11655  * c-indentation-style: bsd
11656  * c-basic-offset: 4
11657  * indent-tabs-mode: nil
11658  * End:
11659  *
11660  * ex: set ts=8 sts=4 sw=4 et:
11661  */