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