This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Sync Maintainers.pl with CPAN for Module-CoreList
[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 * 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     /* charnames doesn't work well if there have been errors found */
8622     if (PL_error_count > 0 && strEQ(key,"charnames"))
8623         return &PL_sv_undef;
8624
8625     if (!table
8626         || ! (PL_hints & HINT_LOCALIZE_HH)
8627         || ! (cvp = hv_fetch(table, key, keylen, FALSE))
8628         || ! SvOK(*cvp))
8629     {
8630         SV *msg;
8631         
8632         /* Here haven't found what we're looking for.  If it is charnames,
8633          * perhaps it needs to be loaded.  Try doing that before giving up */
8634         if (strEQ(key,"charnames")) {
8635             Perl_load_module(aTHX_
8636                             0,
8637                             newSVpvs("_charnames"),
8638                              /* version parameter; no need to specify it, as if
8639                               * we get too early a version, will fail anyway,
8640                               * not being able to find '_charnames' */
8641                             NULL,
8642                             newSVpvs(":full"),
8643                             newSVpvs(":short"),
8644                             NULL);
8645             SPAGAIN;
8646             table = GvHV(PL_hintgv);
8647             if (table
8648                 && (PL_hints & HINT_LOCALIZE_HH)
8649                 && (cvp = hv_fetch(table, key, keylen, FALSE))
8650                 && SvOK(*cvp))
8651             {
8652                 goto now_ok;
8653             }
8654         }
8655         if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
8656             msg = Perl_newSVpvf(aTHX_
8657                             "Constant(%s) unknown", (type ? type: "undef"));
8658         }
8659         else {
8660         why1 = "$^H{";
8661         why2 = key;
8662         why3 = "} is not defined";
8663     report:
8664         msg = Perl_newSVpvf(aTHX_ "Constant(%s): %s%s%s",
8665                             (type ? type: "undef"), why1, why2, why3);
8666         }
8667         yyerror(SvPVX_const(msg));
8668         SvREFCNT_dec(msg);
8669         return sv;
8670     }
8671 now_ok:
8672     sv_2mortal(sv);                     /* Parent created it permanently */
8673     cv = *cvp;
8674     if (!pv && s)
8675         pv = newSVpvn_flags(s, len, SVs_TEMP);
8676     if (type && pv)
8677         typesv = newSVpvn_flags(type, typelen, SVs_TEMP);
8678     else
8679         typesv = &PL_sv_undef;
8680
8681     PUSHSTACKi(PERLSI_OVERLOAD);
8682     ENTER ;
8683     SAVETMPS;
8684
8685     PUSHMARK(SP) ;
8686     EXTEND(sp, 3);
8687     if (pv)
8688         PUSHs(pv);
8689     PUSHs(sv);
8690     if (pv)
8691         PUSHs(typesv);
8692     PUTBACK;
8693     call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
8694
8695     SPAGAIN ;
8696
8697     /* Check the eval first */
8698     if (!PL_in_eval && SvTRUE(ERRSV)) {
8699         sv_catpvs(ERRSV, "Propagated");
8700         yyerror(SvPV_nolen_const(ERRSV)); /* Duplicates the message inside eval */
8701         (void)POPs;
8702         res = SvREFCNT_inc_simple(sv);
8703     }
8704     else {
8705         res = POPs;
8706         SvREFCNT_inc_simple_void(res);
8707     }
8708
8709     PUTBACK ;
8710     FREETMPS ;
8711     LEAVE ;
8712     POPSTACK;
8713
8714     if (!SvOK(res)) {
8715         why1 = "Call to &{$^H{";
8716         why2 = key;
8717         why3 = "}} did not return a defined value";
8718         sv = res;
8719         goto report;
8720     }
8721
8722     return res;
8723 }
8724
8725 /* Returns a NUL terminated string, with the length of the string written to
8726    *slp
8727    */
8728 STATIC char *
8729 S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
8730 {
8731     dVAR;
8732     register char *d = dest;
8733     register char * const e = d + destlen - 3;  /* two-character token, ending NUL */
8734
8735     PERL_ARGS_ASSERT_SCAN_WORD;
8736
8737     for (;;) {
8738         if (d >= e)
8739             Perl_croak(aTHX_ ident_too_long);
8740         if (isALNUM(*s))        /* UTF handled below */
8741             *d++ = *s++;
8742         else if (allow_package && (*s == '\'') && isIDFIRST_lazy_if(s+1,UTF)) {
8743             *d++ = ':';
8744             *d++ = ':';
8745             s++;
8746         }
8747         else if (allow_package && (s[0] == ':') && (s[1] == ':') && (s[2] != '$')) {
8748             *d++ = *s++;
8749             *d++ = *s++;
8750         }
8751         else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
8752             char *t = s + UTF8SKIP(s);
8753             size_t len;
8754             while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
8755                 t += UTF8SKIP(t);
8756             len = t - s;
8757             if (d + len > e)
8758                 Perl_croak(aTHX_ ident_too_long);
8759             Copy(s, d, len, char);
8760             d += len;
8761             s = t;
8762         }
8763         else {
8764             *d = '\0';
8765             *slp = d - dest;
8766             return s;
8767         }
8768     }
8769 }
8770
8771 STATIC char *
8772 S_scan_ident(pTHX_ register char *s, register const char *send, char *dest, STRLEN destlen, I32 ck_uni)
8773 {
8774     dVAR;
8775     char *bracket = NULL;
8776     char funny = *s++;
8777     register char *d = dest;
8778     register char * const e = d + destlen - 3;    /* two-character token, ending NUL */
8779
8780     PERL_ARGS_ASSERT_SCAN_IDENT;
8781
8782     if (isSPACE(*s))
8783         s = PEEKSPACE(s);
8784     if (isDIGIT(*s)) {
8785         while (isDIGIT(*s)) {
8786             if (d >= e)
8787                 Perl_croak(aTHX_ ident_too_long);
8788             *d++ = *s++;
8789         }
8790     }
8791     else {
8792         for (;;) {
8793             if (d >= e)
8794                 Perl_croak(aTHX_ ident_too_long);
8795             if (isALNUM(*s))    /* UTF handled below */
8796                 *d++ = *s++;
8797             else if (*s == '\'' && isIDFIRST_lazy_if(s+1,UTF)) {
8798                 *d++ = ':';
8799                 *d++ = ':';
8800                 s++;
8801             }
8802             else if (*s == ':' && s[1] == ':') {
8803                 *d++ = *s++;
8804                 *d++ = *s++;
8805             }
8806             else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
8807                 char *t = s + UTF8SKIP(s);
8808                 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
8809                     t += UTF8SKIP(t);
8810                 if (d + (t - s) > e)
8811                     Perl_croak(aTHX_ ident_too_long);
8812                 Copy(s, d, t - s, char);
8813                 d += t - s;
8814                 s = t;
8815             }
8816             else
8817                 break;
8818         }
8819     }
8820     *d = '\0';
8821     d = dest;
8822     if (*d) {
8823         if (PL_lex_state != LEX_NORMAL)
8824             PL_lex_state = LEX_INTERPENDMAYBE;
8825         return s;
8826     }
8827     if (*s == '$' && s[1] &&
8828         (isALNUM_lazy_if(s+1,UTF) || s[1] == '$' || s[1] == '{' || strnEQ(s+1,"::",2)) )
8829     {
8830         return s;
8831     }
8832     if (*s == '{') {
8833         bracket = s;
8834         s++;
8835     }
8836     else if (ck_uni)
8837         check_uni();
8838     if (s < send) {
8839         if (UTF) {
8840             const STRLEN skip = UTF8SKIP(s);
8841             STRLEN i;
8842             d[skip] = '\0';
8843             for ( i = 0; i < skip; i++ )
8844                 d[i] = *s++;
8845         }
8846         else {
8847             *d = *s++;
8848             d[1] = '\0';
8849         }
8850     }
8851     if (*d == '^' && *s && isCONTROLVAR(*s)) {
8852         *d = toCTRL(*s);
8853         s++;
8854     }
8855     if (bracket) {
8856         if (isSPACE(s[-1])) {
8857             while (s < send) {
8858                 const char ch = *s++;
8859                 if (!SPACE_OR_TAB(ch)) {
8860                     *d = ch;
8861                     break;
8862                 }
8863             }
8864         }
8865         if (isIDFIRST_lazy_if(d,UTF)) {
8866             d += UTF8SKIP(d);
8867             if (UTF) {
8868                 char *end = s;
8869                 while ((end < send && isALNUM_lazy_if(end,UTF)) || *end == ':') {
8870                     end += UTF8SKIP(end);
8871                     while (end < send && UTF8_IS_CONTINUED(*end) && is_utf8_mark((U8*)end))
8872                         end += UTF8SKIP(end);
8873                 }
8874                 Copy(s, d, end - s, char);
8875                 d += end - s;
8876                 s = end;
8877             }
8878             else {
8879                 while ((isALNUM(*s) || *s == ':') && d < e)
8880                     *d++ = *s++;
8881                 if (d >= e)
8882                     Perl_croak(aTHX_ ident_too_long);
8883             }
8884             *d = '\0';
8885             while (s < send && SPACE_OR_TAB(*s))
8886                 s++;
8887             if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
8888                 if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest, 0)) {
8889                     const char * const brack =
8890                         (const char *)
8891                         ((*s == '[') ? "[...]" : "{...}");
8892    /* diag_listed_as: Ambiguous use of %c{%s[...]} resolved to %c%s[...] */
8893                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
8894                         "Ambiguous use of %c{%s%s} resolved to %c%s%s",
8895                         funny, dest, brack, funny, dest, brack);
8896                 }
8897                 bracket++;
8898                 PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
8899                 PL_lex_allbrackets++;
8900                 return s;
8901             }
8902         }
8903         /* Handle extended ${^Foo} variables
8904          * 1999-02-27 mjd-perl-patch@plover.com */
8905         else if (!isALNUM(*d) && !isPRINT(*d) /* isCTRL(d) */
8906                  && isALNUM(*s))
8907         {
8908             d++;
8909             while (isALNUM(*s) && d < e) {
8910                 *d++ = *s++;
8911             }
8912             if (d >= e)
8913                 Perl_croak(aTHX_ ident_too_long);
8914             *d = '\0';
8915         }
8916         if (*s == '}') {
8917             s++;
8918             if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) {
8919                 PL_lex_state = LEX_INTERPEND;
8920                 PL_expect = XREF;
8921             }
8922             if (PL_lex_state == LEX_NORMAL) {
8923                 if (ckWARN(WARN_AMBIGUOUS) &&
8924                     (keyword(dest, d - dest, 0)
8925                      || get_cvn_flags(dest, d - dest, 0)))
8926                 {
8927                     if (funny == '#')
8928                         funny = '@';
8929                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
8930                         "Ambiguous use of %c{%s} resolved to %c%s",
8931                         funny, dest, funny, dest);
8932                 }
8933             }
8934         }
8935         else {
8936             s = bracket;                /* let the parser handle it */
8937             *dest = '\0';
8938         }
8939     }
8940     else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
8941         PL_lex_state = LEX_INTERPEND;
8942     return s;
8943 }
8944
8945 static bool
8946 S_pmflag(pTHX_ const char* const valid_flags, U32 * pmfl, char** s, char* charset) {
8947
8948     /* Adds, subtracts to/from 'pmfl' based on regex modifier flags found in
8949      * the parse starting at 's', based on the subset that are valid in this
8950      * context input to this routine in 'valid_flags'. Advances s.  Returns
8951      * TRUE if the input was a valid flag, so the next char may be as well;
8952      * otherwise FALSE. 'charset' should point to a NUL upon first call on the
8953      * current regex.  This routine will set it to any charset modifier found.
8954      * The caller shouldn't change it.  This way, another charset modifier
8955      * encountered in the parse can be detected as an error, as we have decided
8956      * allow only one */
8957
8958     const char c = **s;
8959
8960     if (! strchr(valid_flags, c)) {
8961         if (isALNUM(c)) {
8962             goto deprecate;
8963         }
8964         return FALSE;
8965     }
8966
8967     switch (c) {
8968
8969         CASE_STD_PMMOD_FLAGS_PARSE_SET(pmfl);
8970         case GLOBAL_PAT_MOD:      *pmfl |= PMf_GLOBAL; break;
8971         case CONTINUE_PAT_MOD:    *pmfl |= PMf_CONTINUE; break;
8972         case ONCE_PAT_MOD:        *pmfl |= PMf_KEEP; break;
8973         case KEEPCOPY_PAT_MOD:    *pmfl |= RXf_PMf_KEEPCOPY; break;
8974         case NONDESTRUCT_PAT_MOD: *pmfl |= PMf_NONDESTRUCT; break;
8975         case LOCALE_PAT_MOD:
8976
8977             /* In 5.14, qr//lt is legal but deprecated; the 't' means they
8978              * can't be regex modifiers.
8979              * In 5.14, s///le is legal and ambiguous.  Try to disambiguate as
8980              * much as easily done.  s///lei, for example, has to mean regex
8981              * modifiers if it's not an error (as does any word character
8982              * following the 'e').  Otherwise, we resolve to the backwards-
8983              * compatible, but less likely 's/// le ...', i.e. as meaning
8984              * less-than-or-equal.  The reason it's not likely is that s//
8985              * returns a number for code in the field (/r returns a string, but
8986              * that wasn't added until the 5.13 series), and so '<=' should be
8987              * used for comparing, not 'le'. */
8988             if (*((*s) + 1) == 't') {
8989                 goto deprecate;
8990             }
8991             else if (*((*s) + 1) == 'e' && ! isALNUM(*((*s) + 2))) {
8992
8993                 /* 'e' is valid only for substitutes, s///e.  If it is not
8994                  * valid in the current context, then 'm//le' must mean the
8995                  * comparison operator, so use the regular deprecation message.
8996                  */
8997                 if (! strchr(valid_flags, 'e')) {
8998                     goto deprecate;
8999                 }
9000                 Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
9001                     "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");
9002                 return FALSE;
9003             }
9004             if (*charset) {
9005                 goto multiple_charsets;
9006             }
9007             set_regex_charset(pmfl, REGEX_LOCALE_CHARSET);
9008             *charset = c;
9009             break;
9010         case UNICODE_PAT_MOD:
9011             /* In 5.14, qr//unless and qr//until are legal but deprecated; the
9012              * 'n' means they can't be regex modifiers */
9013             if (*((*s) + 1) == 'n') {
9014                 goto deprecate;
9015             }
9016             if (*charset) {
9017                 goto multiple_charsets;
9018             }
9019             set_regex_charset(pmfl, REGEX_UNICODE_CHARSET);
9020             *charset = c;
9021             break;
9022         case ASCII_RESTRICT_PAT_MOD:
9023             /* In 5.14, qr//and is legal but deprecated; the 'n' means they
9024              * can't be regex modifiers */
9025             if (*((*s) + 1) == 'n') {
9026                 goto deprecate;
9027             }
9028
9029             if (! *charset) {
9030                 set_regex_charset(pmfl, REGEX_ASCII_RESTRICTED_CHARSET);
9031             }
9032             else {
9033
9034                 /* Error if previous modifier wasn't an 'a', but if it was, see
9035                  * if, and accept, a second occurrence (only) */
9036                 if (*charset != 'a'
9037                     || get_regex_charset(*pmfl)
9038                         != REGEX_ASCII_RESTRICTED_CHARSET)
9039                 {
9040                         goto multiple_charsets;
9041                 }
9042                 set_regex_charset(pmfl, REGEX_ASCII_MORE_RESTRICTED_CHARSET);
9043             }
9044             *charset = c;
9045             break;
9046         case DEPENDS_PAT_MOD:
9047             if (*charset) {
9048                 goto multiple_charsets;
9049             }
9050             set_regex_charset(pmfl, REGEX_DEPENDS_CHARSET);
9051             *charset = c;
9052             break;
9053     }
9054
9055     (*s)++;
9056     return TRUE;
9057
9058     deprecate:
9059         Perl_ck_warner_d(aTHX_ packWARN(WARN_SYNTAX),
9060             "Having no space between pattern and following word is deprecated");
9061         return FALSE;
9062
9063     multiple_charsets:
9064         if (*charset != c) {
9065             yyerror(Perl_form(aTHX_ "Regexp modifiers \"/%c\" and \"/%c\" are mutually exclusive", *charset, c));
9066         }
9067         else if (c == 'a') {
9068             yyerror("Regexp modifier \"/a\" may appear a maximum of twice");
9069         }
9070         else {
9071             yyerror(Perl_form(aTHX_ "Regexp modifier \"/%c\" may not appear twice", c));
9072         }
9073
9074         /* Pretend that it worked, so will continue processing before dieing */
9075         (*s)++;
9076         return TRUE;
9077 }
9078
9079 STATIC char *
9080 S_scan_pat(pTHX_ char *start, I32 type)
9081 {
9082     dVAR;
9083     PMOP *pm;
9084     char *s = scan_str(start,!!PL_madskills,FALSE);
9085     const char * const valid_flags =
9086         (const char *)((type == OP_QR) ? QR_PAT_MODS : M_PAT_MODS);
9087     char charset = '\0';    /* character set modifier */
9088 #ifdef PERL_MAD
9089     char *modstart;
9090 #endif
9091
9092     PERL_ARGS_ASSERT_SCAN_PAT;
9093
9094     if (!s) {
9095         const char * const delimiter = skipspace(start);
9096         Perl_croak(aTHX_
9097                    (const char *)
9098                    (*delimiter == '?'
9099                     ? "Search pattern not terminated or ternary operator parsed as search pattern"
9100                     : "Search pattern not terminated" ));
9101     }
9102
9103     pm = (PMOP*)newPMOP(type, 0);
9104     if (PL_multi_open == '?') {
9105         /* This is the only point in the code that sets PMf_ONCE:  */
9106         pm->op_pmflags |= PMf_ONCE;
9107
9108         /* Hence it's safe to do this bit of PMOP book-keeping here, which
9109            allows us to restrict the list needed by reset to just the ??
9110            matches.  */
9111         assert(type != OP_TRANS);
9112         if (PL_curstash) {
9113             MAGIC *mg = mg_find((const SV *)PL_curstash, PERL_MAGIC_symtab);
9114             U32 elements;
9115             if (!mg) {
9116                 mg = sv_magicext(MUTABLE_SV(PL_curstash), 0, PERL_MAGIC_symtab, 0, 0,
9117                                  0);
9118             }
9119             elements = mg->mg_len / sizeof(PMOP**);
9120             Renewc(mg->mg_ptr, elements + 1, PMOP*, char);
9121             ((PMOP**)mg->mg_ptr) [elements++] = pm;
9122             mg->mg_len = elements * sizeof(PMOP**);
9123             PmopSTASH_set(pm,PL_curstash);
9124         }
9125     }
9126 #ifdef PERL_MAD
9127     modstart = s;
9128 #endif
9129     while (*s && S_pmflag(aTHX_ valid_flags, &(pm->op_pmflags), &s, &charset)) {};
9130 #ifdef PERL_MAD
9131     if (PL_madskills && modstart != s) {
9132         SV* tmptoken = newSVpvn(modstart, s - modstart);
9133         append_madprops(newMADPROP('m', MAD_SV, tmptoken, 0), (OP*)pm, 0);
9134     }
9135 #endif
9136     /* issue a warning if /c is specified,but /g is not */
9137     if ((pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL))
9138     {
9139         Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), 
9140                        "Use of /c modifier is meaningless without /g" );
9141     }
9142
9143     PL_lex_op = (OP*)pm;
9144     pl_yylval.ival = OP_MATCH;
9145     return s;
9146 }
9147
9148 STATIC char *
9149 S_scan_subst(pTHX_ char *start)
9150 {
9151     dVAR;
9152     char *s;
9153     register PMOP *pm;
9154     I32 first_start;
9155     I32 es = 0;
9156     char charset = '\0';    /* character set modifier */
9157 #ifdef PERL_MAD
9158     char *modstart;
9159 #endif
9160
9161     PERL_ARGS_ASSERT_SCAN_SUBST;
9162
9163     pl_yylval.ival = OP_NULL;
9164
9165     s = scan_str(start,!!PL_madskills,FALSE);
9166
9167     if (!s)
9168         Perl_croak(aTHX_ "Substitution pattern not terminated");
9169
9170     if (s[-1] == PL_multi_open)
9171         s--;
9172 #ifdef PERL_MAD
9173     if (PL_madskills) {
9174         CURMAD('q', PL_thisopen);
9175         CURMAD('_', PL_thiswhite);
9176         CURMAD('E', PL_thisstuff);
9177         CURMAD('Q', PL_thisclose);
9178         PL_realtokenstart = s - SvPVX(PL_linestr);
9179     }
9180 #endif
9181
9182     first_start = PL_multi_start;
9183     s = scan_str(s,!!PL_madskills,FALSE);
9184     if (!s) {
9185         if (PL_lex_stuff) {
9186             SvREFCNT_dec(PL_lex_stuff);
9187             PL_lex_stuff = NULL;
9188         }
9189         Perl_croak(aTHX_ "Substitution replacement not terminated");
9190     }
9191     PL_multi_start = first_start;       /* so whole substitution is taken together */
9192
9193     pm = (PMOP*)newPMOP(OP_SUBST, 0);
9194
9195 #ifdef PERL_MAD
9196     if (PL_madskills) {
9197         CURMAD('z', PL_thisopen);
9198         CURMAD('R', PL_thisstuff);
9199         CURMAD('Z', PL_thisclose);
9200     }
9201     modstart = s;
9202 #endif
9203
9204     while (*s) {
9205         if (*s == EXEC_PAT_MOD) {
9206             s++;
9207             es++;
9208         }
9209         else if (! S_pmflag(aTHX_ S_PAT_MODS, &(pm->op_pmflags), &s, &charset))
9210         {
9211             break;
9212         }
9213     }
9214
9215 #ifdef PERL_MAD
9216     if (PL_madskills) {
9217         if (modstart != s)
9218             curmad('m', newSVpvn(modstart, s - modstart));
9219         append_madprops(PL_thismad, (OP*)pm, 0);
9220         PL_thismad = 0;
9221     }
9222 #endif
9223     if ((pm->op_pmflags & PMf_CONTINUE)) {
9224         Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), "Use of /c modifier is meaningless in s///" );
9225     }
9226
9227     if (es) {
9228         SV * const repl = newSVpvs("");
9229
9230         PL_sublex_info.super_bufptr = s;
9231         PL_sublex_info.super_bufend = PL_bufend;
9232         PL_multi_end = 0;
9233         pm->op_pmflags |= PMf_EVAL;
9234         while (es-- > 0) {
9235             if (es)
9236                 sv_catpvs(repl, "eval ");
9237             else
9238                 sv_catpvs(repl, "do ");
9239         }
9240         sv_catpvs(repl, "{");
9241         sv_catsv(repl, PL_lex_repl);
9242         if (strchr(SvPVX(PL_lex_repl), '#'))
9243             sv_catpvs(repl, "\n");
9244         sv_catpvs(repl, "}");
9245         SvEVALED_on(repl);
9246         SvREFCNT_dec(PL_lex_repl);
9247         PL_lex_repl = repl;
9248     }
9249
9250     PL_lex_op = (OP*)pm;
9251     pl_yylval.ival = OP_SUBST;
9252     return s;
9253 }
9254
9255 STATIC char *
9256 S_scan_trans(pTHX_ char *start)
9257 {
9258     dVAR;
9259     register char* s;
9260     OP *o;
9261     short *tbl;
9262     U8 squash;
9263     U8 del;
9264     U8 complement;
9265     bool nondestruct = 0;
9266 #ifdef PERL_MAD
9267     char *modstart;
9268 #endif
9269
9270     PERL_ARGS_ASSERT_SCAN_TRANS;
9271
9272     pl_yylval.ival = OP_NULL;
9273
9274     s = scan_str(start,!!PL_madskills,FALSE);
9275     if (!s)
9276         Perl_croak(aTHX_ "Transliteration pattern not terminated");
9277
9278     if (s[-1] == PL_multi_open)
9279         s--;
9280 #ifdef PERL_MAD
9281     if (PL_madskills) {
9282         CURMAD('q', PL_thisopen);
9283         CURMAD('_', PL_thiswhite);
9284         CURMAD('E', PL_thisstuff);
9285         CURMAD('Q', PL_thisclose);
9286         PL_realtokenstart = s - SvPVX(PL_linestr);
9287     }
9288 #endif
9289
9290     s = scan_str(s,!!PL_madskills,FALSE);
9291     if (!s) {
9292         if (PL_lex_stuff) {
9293             SvREFCNT_dec(PL_lex_stuff);
9294             PL_lex_stuff = NULL;
9295         }
9296         Perl_croak(aTHX_ "Transliteration replacement not terminated");
9297     }
9298     if (PL_madskills) {
9299         CURMAD('z', PL_thisopen);
9300         CURMAD('R', PL_thisstuff);
9301         CURMAD('Z', PL_thisclose);
9302     }
9303
9304     complement = del = squash = 0;
9305 #ifdef PERL_MAD
9306     modstart = s;
9307 #endif
9308     while (1) {
9309         switch (*s) {
9310         case 'c':
9311             complement = OPpTRANS_COMPLEMENT;
9312             break;
9313         case 'd':
9314             del = OPpTRANS_DELETE;
9315             break;
9316         case 's':
9317             squash = OPpTRANS_SQUASH;
9318             break;
9319         case 'r':
9320             nondestruct = 1;
9321             break;
9322         default:
9323             goto no_more;
9324         }
9325         s++;
9326     }
9327   no_more:
9328
9329     tbl = (short *)PerlMemShared_calloc(complement&&!del?258:256, sizeof(short));
9330     o = newPVOP(nondestruct ? OP_TRANSR : OP_TRANS, 0, (char*)tbl);
9331     o->op_private &= ~OPpTRANS_ALL;
9332     o->op_private |= del|squash|complement|
9333       (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
9334       (DO_UTF8(PL_lex_repl) ? OPpTRANS_TO_UTF   : 0);
9335
9336     PL_lex_op = o;
9337     pl_yylval.ival = nondestruct ? OP_TRANSR : OP_TRANS;
9338
9339 #ifdef PERL_MAD
9340     if (PL_madskills) {
9341         if (modstart != s)
9342             curmad('m', newSVpvn(modstart, s - modstart));
9343         append_madprops(PL_thismad, o, 0);
9344         PL_thismad = 0;
9345     }
9346 #endif
9347
9348     return s;
9349 }
9350
9351 STATIC char *
9352 S_scan_heredoc(pTHX_ register char *s)
9353 {
9354     dVAR;
9355     SV *herewas;
9356     I32 op_type = OP_SCALAR;
9357     I32 len;
9358     SV *tmpstr;
9359     char term;
9360     const char *found_newline;
9361     register char *d;
9362     register char *e;
9363     char *peek;
9364     const int outer = (PL_rsfp || PL_parser->filtered)
9365                    && !(PL_lex_inwhat == OP_SCALAR);
9366 #ifdef PERL_MAD
9367     I32 stuffstart = s - SvPVX(PL_linestr);
9368     char *tstart;
9369  
9370     PL_realtokenstart = -1;
9371 #endif
9372
9373     PERL_ARGS_ASSERT_SCAN_HEREDOC;
9374
9375     s += 2;
9376     d = PL_tokenbuf;
9377     e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
9378     if (!outer)
9379         *d++ = '\n';
9380     peek = s;
9381     while (SPACE_OR_TAB(*peek))
9382         peek++;
9383     if (*peek == '`' || *peek == '\'' || *peek =='"') {
9384         s = peek;
9385         term = *s++;
9386         s = delimcpy(d, e, s, PL_bufend, term, &len);
9387         d += len;
9388         if (s < PL_bufend)
9389             s++;
9390     }
9391     else {
9392         if (*s == '\\')
9393             s++, term = '\'';
9394         else
9395             term = '"';
9396         if (!isALNUM_lazy_if(s,UTF))
9397             deprecate("bare << to mean <<\"\"");
9398         for (; isALNUM_lazy_if(s,UTF); s++) {
9399             if (d < e)
9400                 *d++ = *s;
9401         }
9402     }
9403     if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
9404         Perl_croak(aTHX_ "Delimiter for here document is too long");
9405     *d++ = '\n';
9406     *d = '\0';
9407     len = d - PL_tokenbuf;
9408
9409 #ifdef PERL_MAD
9410     if (PL_madskills) {
9411         tstart = PL_tokenbuf + !outer;
9412         PL_thisclose = newSVpvn(tstart, len - !outer);
9413         tstart = SvPVX(PL_linestr) + stuffstart;
9414         PL_thisopen = newSVpvn(tstart, s - tstart);
9415         stuffstart = s - SvPVX(PL_linestr);
9416     }
9417 #endif
9418 #ifndef PERL_STRICT_CR
9419     d = strchr(s, '\r');
9420     if (d) {
9421         char * const olds = s;
9422         s = d;
9423         while (s < PL_bufend) {
9424             if (*s == '\r') {
9425                 *d++ = '\n';
9426                 if (*++s == '\n')
9427                     s++;
9428             }
9429             else if (*s == '\n' && s[1] == '\r') {      /* \015\013 on a mac? */
9430                 *d++ = *s++;
9431                 s++;
9432             }
9433             else
9434                 *d++ = *s++;
9435         }
9436         *d = '\0';
9437         PL_bufend = d;
9438         SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
9439         s = olds;
9440     }
9441 #endif
9442 #ifdef PERL_MAD
9443     found_newline = 0;
9444 #endif
9445     if ( outer || !(found_newline = (char*)memchr((void*)s, '\n', PL_bufend - s)) ) {
9446         herewas = newSVpvn(s,PL_bufend-s);
9447     }
9448     else {
9449 #ifdef PERL_MAD
9450         herewas = newSVpvn(s-1,found_newline-s+1);
9451 #else
9452         s--;
9453         herewas = newSVpvn(s,found_newline-s);
9454 #endif
9455     }
9456 #ifdef PERL_MAD
9457     if (PL_madskills) {
9458         tstart = SvPVX(PL_linestr) + stuffstart;
9459         if (PL_thisstuff)
9460             sv_catpvn(PL_thisstuff, tstart, s - tstart);
9461         else
9462             PL_thisstuff = newSVpvn(tstart, s - tstart);
9463     }
9464 #endif
9465     s += SvCUR(herewas);
9466
9467 #ifdef PERL_MAD
9468     stuffstart = s - SvPVX(PL_linestr);
9469
9470     if (found_newline)
9471         s--;
9472 #endif
9473
9474     tmpstr = newSV_type(SVt_PVIV);
9475     SvGROW(tmpstr, 80);
9476     if (term == '\'') {
9477         op_type = OP_CONST;
9478         SvIV_set(tmpstr, -1);
9479     }
9480     else if (term == '`') {
9481         op_type = OP_BACKTICK;
9482         SvIV_set(tmpstr, '\\');
9483     }
9484
9485     CLINE;
9486     PL_multi_start = CopLINE(PL_curcop);
9487     PL_multi_open = PL_multi_close = '<';
9488     term = *PL_tokenbuf;
9489     if (PL_lex_inwhat == OP_SUBST && PL_in_eval && !PL_rsfp
9490      && !PL_parser->filtered) {
9491         char * const bufptr = PL_sublex_info.super_bufptr;
9492         char * const bufend = PL_sublex_info.super_bufend;
9493         char * const olds = s - SvCUR(herewas);
9494         s = strchr(bufptr, '\n');
9495         if (!s)
9496             s = bufend;
9497         d = s;
9498         while (s < bufend &&
9499           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
9500             if (*s++ == '\n')
9501                 CopLINE_inc(PL_curcop);
9502         }
9503         if (s >= bufend) {
9504             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
9505             missingterm(PL_tokenbuf);
9506         }
9507         sv_setpvn(herewas,bufptr,d-bufptr+1);
9508         sv_setpvn(tmpstr,d+1,s-d);
9509         s += len - 1;
9510         sv_catpvn(herewas,s,bufend-s);
9511         Copy(SvPVX_const(herewas),bufptr,SvCUR(herewas) + 1,char);
9512
9513         s = olds;
9514         goto retval;
9515     }
9516     else if (!outer) {
9517         d = s;
9518         while (s < PL_bufend &&
9519           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
9520             if (*s++ == '\n')
9521                 CopLINE_inc(PL_curcop);
9522         }
9523         if (s >= PL_bufend) {
9524             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
9525             missingterm(PL_tokenbuf);
9526         }
9527         sv_setpvn(tmpstr,d+1,s-d);
9528 #ifdef PERL_MAD
9529         if (PL_madskills) {
9530             if (PL_thisstuff)
9531                 sv_catpvn(PL_thisstuff, d + 1, s - d);
9532             else
9533                 PL_thisstuff = newSVpvn(d + 1, s - d);
9534             stuffstart = s - SvPVX(PL_linestr);
9535         }
9536 #endif
9537         s += len - 1;
9538         CopLINE_inc(PL_curcop); /* the preceding stmt passes a newline */
9539
9540         sv_catpvn(herewas,s,PL_bufend-s);
9541         sv_setsv(PL_linestr,herewas);
9542         PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
9543         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
9544         PL_last_lop = PL_last_uni = NULL;
9545     }
9546     else
9547         sv_setpvs(tmpstr,"");   /* avoid "uninitialized" warning */
9548     while (s >= PL_bufend) {    /* multiple line string? */
9549 #ifdef PERL_MAD
9550         if (PL_madskills) {
9551             tstart = SvPVX(PL_linestr) + stuffstart;
9552             if (PL_thisstuff)
9553                 sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
9554             else
9555                 PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
9556         }
9557 #endif
9558         PL_bufptr = s;
9559         CopLINE_inc(PL_curcop);
9560         if (!outer || !lex_next_chunk(0)) {
9561             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
9562             missingterm(PL_tokenbuf);
9563         }
9564         CopLINE_dec(PL_curcop);
9565         s = PL_bufptr;
9566 #ifdef PERL_MAD
9567         stuffstart = s - SvPVX(PL_linestr);
9568 #endif
9569         CopLINE_inc(PL_curcop);
9570         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
9571         PL_last_lop = PL_last_uni = NULL;
9572 #ifndef PERL_STRICT_CR
9573         if (PL_bufend - PL_linestart >= 2) {
9574             if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
9575                 (PL_bufend[-2] == '\n' && PL_bufend[-1] == '\r'))
9576             {
9577                 PL_bufend[-2] = '\n';
9578                 PL_bufend--;
9579                 SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
9580             }
9581             else if (PL_bufend[-1] == '\r')
9582                 PL_bufend[-1] = '\n';
9583         }
9584         else if (PL_bufend - PL_linestart == 1 && PL_bufend[-1] == '\r')
9585             PL_bufend[-1] = '\n';
9586 #endif
9587         if (*s == term && memEQ(s,PL_tokenbuf,len)) {
9588             STRLEN off = PL_bufend - 1 - SvPVX_const(PL_linestr);
9589             *(SvPVX(PL_linestr) + off ) = ' ';
9590             lex_grow_linestr(SvCUR(PL_linestr) + SvCUR(herewas) + 1);
9591             sv_catsv(PL_linestr,herewas);
9592             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
9593             s = SvPVX(PL_linestr) + off; /* In case PV of PL_linestr moved. */
9594         }
9595         else {
9596             s = PL_bufend;
9597             sv_catsv(tmpstr,PL_linestr);
9598         }
9599     }
9600     s++;
9601 retval:
9602     PL_multi_end = CopLINE(PL_curcop);
9603     if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
9604         SvPV_shrink_to_cur(tmpstr);
9605     }
9606     SvREFCNT_dec(herewas);
9607     if (!IN_BYTES) {
9608         if (UTF && is_utf8_string((U8*)SvPVX_const(tmpstr), SvCUR(tmpstr)))
9609             SvUTF8_on(tmpstr);
9610         else if (PL_encoding)
9611             sv_recode_to_utf8(tmpstr, PL_encoding);
9612     }
9613     PL_lex_stuff = tmpstr;
9614     pl_yylval.ival = op_type;
9615     return s;
9616 }
9617
9618 /* scan_inputsymbol
9619    takes: current position in input buffer
9620    returns: new position in input buffer
9621    side-effects: pl_yylval and lex_op are set.
9622
9623    This code handles:
9624
9625    <>           read from ARGV
9626    <FH>         read from filehandle
9627    <pkg::FH>    read from package qualified filehandle
9628    <pkg'FH>     read from package qualified filehandle
9629    <$fh>        read from filehandle in $fh
9630    <*.h>        filename glob
9631
9632 */
9633
9634 STATIC char *
9635 S_scan_inputsymbol(pTHX_ char *start)
9636 {
9637     dVAR;
9638     register char *s = start;           /* current position in buffer */
9639     char *end;
9640     I32 len;
9641     char *d = PL_tokenbuf;                                      /* start of temp holding space */
9642     const char * const e = PL_tokenbuf + sizeof PL_tokenbuf;    /* end of temp holding space */
9643
9644     PERL_ARGS_ASSERT_SCAN_INPUTSYMBOL;
9645
9646     end = strchr(s, '\n');
9647     if (!end)
9648         end = PL_bufend;
9649     s = delimcpy(d, e, s + 1, end, '>', &len);  /* extract until > */
9650
9651     /* die if we didn't have space for the contents of the <>,
9652        or if it didn't end, or if we see a newline
9653     */
9654
9655     if (len >= (I32)sizeof PL_tokenbuf)
9656         Perl_croak(aTHX_ "Excessively long <> operator");
9657     if (s >= end)
9658         Perl_croak(aTHX_ "Unterminated <> operator");
9659
9660     s++;
9661
9662     /* check for <$fh>
9663        Remember, only scalar variables are interpreted as filehandles by
9664        this code.  Anything more complex (e.g., <$fh{$num}>) will be
9665        treated as a glob() call.
9666        This code makes use of the fact that except for the $ at the front,
9667        a scalar variable and a filehandle look the same.
9668     */
9669     if (*d == '$' && d[1]) d++;
9670
9671     /* allow <Pkg'VALUE> or <Pkg::VALUE> */
9672     while (*d && (isALNUM_lazy_if(d,UTF) || *d == '\'' || *d == ':'))
9673         d += UTF ? UTF8SKIP(d) : 1;
9674
9675     /* If we've tried to read what we allow filehandles to look like, and
9676        there's still text left, then it must be a glob() and not a getline.
9677        Use scan_str to pull out the stuff between the <> and treat it
9678        as nothing more than a string.
9679     */
9680
9681     if (d - PL_tokenbuf != len) {
9682         pl_yylval.ival = OP_GLOB;
9683         s = scan_str(start,!!PL_madskills,FALSE);
9684         if (!s)
9685            Perl_croak(aTHX_ "Glob not terminated");
9686         return s;
9687     }
9688     else {
9689         bool readline_overriden = FALSE;
9690         GV *gv_readline;
9691         GV **gvp;
9692         /* we're in a filehandle read situation */
9693         d = PL_tokenbuf;
9694
9695         /* turn <> into <ARGV> */
9696         if (!len)
9697             Copy("ARGV",d,5,char);
9698
9699         /* Check whether readline() is overriden */
9700         gv_readline = gv_fetchpvs("readline", GV_NOTQUAL, SVt_PVCV);
9701         if ((gv_readline
9702                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline))
9703                 ||
9704                 ((gvp = (GV**)hv_fetchs(PL_globalstash, "readline", FALSE))
9705                  && (gv_readline = *gvp) && isGV_with_GP(gv_readline)
9706                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline)))
9707             readline_overriden = TRUE;
9708
9709         /* if <$fh>, create the ops to turn the variable into a
9710            filehandle
9711         */
9712         if (*d == '$') {
9713             /* try to find it in the pad for this block, otherwise find
9714                add symbol table ops
9715             */
9716             const PADOFFSET tmp = pad_findmy_pvn(d, len, UTF ? SVf_UTF8 : 0);
9717             if (tmp != NOT_IN_PAD) {
9718                 if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
9719                     HV * const stash = PAD_COMPNAME_OURSTASH(tmp);
9720                     HEK * const stashname = HvNAME_HEK(stash);
9721                     SV * const sym = sv_2mortal(newSVhek(stashname));
9722                     sv_catpvs(sym, "::");
9723                     sv_catpv(sym, d+1);
9724                     d = SvPVX(sym);
9725                     goto intro_sym;
9726                 }
9727                 else {
9728                     OP * const o = newOP(OP_PADSV, 0);
9729                     o->op_targ = tmp;
9730                     PL_lex_op = readline_overriden
9731                         ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
9732                                 op_append_elem(OP_LIST, o,
9733                                     newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
9734                         : (OP*)newUNOP(OP_READLINE, 0, o);
9735                 }
9736             }
9737             else {
9738                 GV *gv;
9739                 ++d;
9740 intro_sym:
9741                 gv = gv_fetchpv(d,
9742                                 (PL_in_eval
9743                                  ? (GV_ADDMULTI | GV_ADDINEVAL)
9744                                  : GV_ADDMULTI) | ( UTF ? SVf_UTF8 : 0 ),
9745                                 SVt_PV);
9746                 PL_lex_op = readline_overriden
9747                     ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
9748                             op_append_elem(OP_LIST,
9749                                 newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
9750                                 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
9751                     : (OP*)newUNOP(OP_READLINE, 0,
9752                             newUNOP(OP_RV2SV, 0,
9753                                 newGVOP(OP_GV, 0, gv)));
9754             }
9755             if (!readline_overriden)
9756                 PL_lex_op->op_flags |= OPf_SPECIAL;
9757             /* we created the ops in PL_lex_op, so make pl_yylval.ival a null op */
9758             pl_yylval.ival = OP_NULL;
9759         }
9760
9761         /* If it's none of the above, it must be a literal filehandle
9762            (<Foo::BAR> or <FOO>) so build a simple readline OP */
9763         else {
9764             GV * const gv = gv_fetchpv(d, GV_ADD | ( UTF ? SVf_UTF8 : 0 ), SVt_PVIO);
9765             PL_lex_op = readline_overriden
9766                 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
9767                         op_append_elem(OP_LIST,
9768                             newGVOP(OP_GV, 0, gv),
9769                             newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
9770                 : (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
9771             pl_yylval.ival = OP_NULL;
9772         }
9773     }
9774
9775     return s;
9776 }
9777
9778
9779 /* scan_str
9780    takes: start position in buffer
9781           keep_quoted preserve \ on the embedded delimiter(s)
9782           keep_delims preserve the delimiters around the string
9783    returns: position to continue reading from buffer
9784    side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
9785         updates the read buffer.
9786
9787    This subroutine pulls a string out of the input.  It is called for:
9788         q               single quotes           q(literal text)
9789         '               single quotes           'literal text'
9790         qq              double quotes           qq(interpolate $here please)
9791         "               double quotes           "interpolate $here please"
9792         qx              backticks               qx(/bin/ls -l)
9793         `               backticks               `/bin/ls -l`
9794         qw              quote words             @EXPORT_OK = qw( func() $spam )
9795         m//             regexp match            m/this/
9796         s///            regexp substitute       s/this/that/
9797         tr///           string transliterate    tr/this/that/
9798         y///            string transliterate    y/this/that/
9799         ($*@)           sub prototypes          sub foo ($)
9800         (stuff)         sub attr parameters     sub foo : attr(stuff)
9801         <>              readline or globs       <FOO>, <>, <$fh>, or <*.c>
9802         
9803    In most of these cases (all but <>, patterns and transliterate)
9804    yylex() calls scan_str().  m// makes yylex() call scan_pat() which
9805    calls scan_str().  s/// makes yylex() call scan_subst() which calls
9806    scan_str().  tr/// and y/// make yylex() call scan_trans() which
9807    calls scan_str().
9808
9809    It skips whitespace before the string starts, and treats the first
9810    character as the delimiter.  If the delimiter is one of ([{< then
9811    the corresponding "close" character )]}> is used as the closing
9812    delimiter.  It allows quoting of delimiters, and if the string has
9813    balanced delimiters ([{<>}]) it allows nesting.
9814
9815    On success, the SV with the resulting string is put into lex_stuff or,
9816    if that is already non-NULL, into lex_repl. The second case occurs only
9817    when parsing the RHS of the special constructs s/// and tr/// (y///).
9818    For convenience, the terminating delimiter character is stuffed into
9819    SvIVX of the SV.
9820 */
9821
9822 STATIC char *
9823 S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
9824 {
9825     dVAR;
9826     SV *sv;                             /* scalar value: string */
9827     const char *tmps;                   /* temp string, used for delimiter matching */
9828     register char *s = start;           /* current position in the buffer */
9829     register char term;                 /* terminating character */
9830     register char *to;                  /* current position in the sv's data */
9831     I32 brackets = 1;                   /* bracket nesting level */
9832     bool has_utf8 = FALSE;              /* is there any utf8 content? */
9833     I32 termcode;                       /* terminating char. code */
9834     U8 termstr[UTF8_MAXBYTES];          /* terminating string */
9835     STRLEN termlen;                     /* length of terminating string */
9836     int last_off = 0;                   /* last position for nesting bracket */
9837 #ifdef PERL_MAD
9838     int stuffstart;
9839     char *tstart;
9840 #endif
9841
9842     PERL_ARGS_ASSERT_SCAN_STR;
9843
9844     /* skip space before the delimiter */
9845     if (isSPACE(*s)) {
9846         s = PEEKSPACE(s);
9847     }
9848
9849 #ifdef PERL_MAD
9850     if (PL_realtokenstart >= 0) {
9851         stuffstart = PL_realtokenstart;
9852         PL_realtokenstart = -1;
9853     }
9854     else
9855         stuffstart = start - SvPVX(PL_linestr);
9856 #endif
9857     /* mark where we are, in case we need to report errors */
9858     CLINE;
9859
9860     /* after skipping whitespace, the next character is the terminator */
9861     term = *s;
9862     if (!UTF) {
9863         termcode = termstr[0] = term;
9864         termlen = 1;
9865     }
9866     else {
9867         termcode = utf8_to_uvchr((U8*)s, &termlen);
9868         Copy(s, termstr, termlen, U8);
9869         if (!UTF8_IS_INVARIANT(term))
9870             has_utf8 = TRUE;
9871     }
9872
9873     /* mark where we are */
9874     PL_multi_start = CopLINE(PL_curcop);
9875     PL_multi_open = term;
9876
9877     /* find corresponding closing delimiter */
9878     if (term && (tmps = strchr("([{< )]}> )]}>",term)))
9879         termcode = termstr[0] = term = tmps[5];
9880
9881     PL_multi_close = term;
9882
9883     /* create a new SV to hold the contents.  79 is the SV's initial length.
9884        What a random number. */
9885     sv = newSV_type(SVt_PVIV);
9886     SvGROW(sv, 80);
9887     SvIV_set(sv, termcode);
9888     (void)SvPOK_only(sv);               /* validate pointer */
9889
9890     /* move past delimiter and try to read a complete string */
9891     if (keep_delims)
9892         sv_catpvn(sv, s, termlen);
9893     s += termlen;
9894 #ifdef PERL_MAD
9895     tstart = SvPVX(PL_linestr) + stuffstart;
9896     if (!PL_thisopen && !keep_delims) {
9897         PL_thisopen = newSVpvn(tstart, s - tstart);
9898         stuffstart = s - SvPVX(PL_linestr);
9899     }
9900 #endif
9901     for (;;) {
9902         if (PL_encoding && !UTF) {
9903             bool cont = TRUE;
9904
9905             while (cont) {
9906                 int offset = s - SvPVX_const(PL_linestr);
9907                 const bool found = sv_cat_decode(sv, PL_encoding, PL_linestr,
9908                                            &offset, (char*)termstr, termlen);
9909                 const char * const ns = SvPVX_const(PL_linestr) + offset;
9910                 char * const svlast = SvEND(sv) - 1;
9911
9912                 for (; s < ns; s++) {
9913                     if (*s == '\n' && !PL_rsfp && !PL_parser->filtered)
9914                         CopLINE_inc(PL_curcop);
9915                 }
9916                 if (!found)
9917                     goto read_more_line;
9918                 else {
9919                     /* handle quoted delimiters */
9920                     if (SvCUR(sv) > 1 && *(svlast-1) == '\\') {
9921                         const char *t;
9922                         for (t = svlast-2; t >= SvPVX_const(sv) && *t == '\\';)
9923                             t--;
9924                         if ((svlast-1 - t) % 2) {
9925                             if (!keep_quoted) {
9926                                 *(svlast-1) = term;
9927                                 *svlast = '\0';
9928                                 SvCUR_set(sv, SvCUR(sv) - 1);
9929                             }
9930                             continue;
9931                         }
9932                     }
9933                     if (PL_multi_open == PL_multi_close) {
9934                         cont = FALSE;
9935                     }
9936                     else {
9937                         const char *t;
9938                         char *w;
9939                         for (t = w = SvPVX(sv)+last_off; t < svlast; w++, t++) {
9940                             /* At here, all closes are "was quoted" one,
9941                                so we don't check PL_multi_close. */
9942                             if (*t == '\\') {
9943                                 if (!keep_quoted && *(t+1) == PL_multi_open)
9944                                     t++;
9945                                 else
9946                                     *w++ = *t++;
9947                             }
9948                             else if (*t == PL_multi_open)
9949                                 brackets++;
9950
9951                             *w = *t;
9952                         }
9953                         if (w < t) {
9954                             *w++ = term;
9955                             *w = '\0';
9956                             SvCUR_set(sv, w - SvPVX_const(sv));
9957                         }
9958                         last_off = w - SvPVX(sv);
9959                         if (--brackets <= 0)
9960                             cont = FALSE;
9961                     }
9962                 }
9963             }
9964             if (!keep_delims) {
9965                 SvCUR_set(sv, SvCUR(sv) - 1);
9966                 *SvEND(sv) = '\0';
9967             }
9968             break;
9969         }
9970
9971         /* extend sv if need be */
9972         SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
9973         /* set 'to' to the next character in the sv's string */
9974         to = SvPVX(sv)+SvCUR(sv);
9975
9976         /* if open delimiter is the close delimiter read unbridle */
9977         if (PL_multi_open == PL_multi_close) {
9978             for (; s < PL_bufend; s++,to++) {
9979                 /* embedded newlines increment the current line number */
9980                 if (*s == '\n' && !PL_rsfp && !PL_parser->filtered)
9981                     CopLINE_inc(PL_curcop);
9982                 /* handle quoted delimiters */
9983                 if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
9984                     if (!keep_quoted && s[1] == term)
9985                         s++;
9986                 /* any other quotes are simply copied straight through */
9987                     else
9988                         *to++ = *s++;
9989                 }
9990                 /* terminate when run out of buffer (the for() condition), or
9991                    have found the terminator */
9992                 else if (*s == term) {
9993                     if (termlen == 1)
9994                         break;
9995                     if (s+termlen <= PL_bufend && memEQ(s, (char*)termstr, termlen))
9996                         break;
9997                 }
9998                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
9999                     has_utf8 = TRUE;
10000                 *to = *s;
10001             }
10002         }
10003         
10004         /* if the terminator isn't the same as the start character (e.g.,
10005            matched brackets), we have to allow more in the quoting, and
10006            be prepared for nested brackets.
10007         */
10008         else {
10009             /* read until we run out of string, or we find the terminator */
10010             for (; s < PL_bufend; s++,to++) {
10011                 /* embedded newlines increment the line count */
10012                 if (*s == '\n' && !PL_rsfp && !PL_parser->filtered)
10013                     CopLINE_inc(PL_curcop);
10014                 /* backslashes can escape the open or closing characters */
10015                 if (*s == '\\' && s+1 < PL_bufend) {
10016                     if (!keep_quoted &&
10017                         ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
10018                         s++;
10019                     else
10020                         *to++ = *s++;
10021                 }
10022                 /* allow nested opens and closes */
10023                 else if (*s == PL_multi_close && --brackets <= 0)
10024                     break;
10025                 else if (*s == PL_multi_open)
10026                     brackets++;
10027                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
10028                     has_utf8 = TRUE;
10029                 *to = *s;
10030             }
10031         }
10032         /* terminate the copied string and update the sv's end-of-string */
10033         *to = '\0';
10034         SvCUR_set(sv, to - SvPVX_const(sv));
10035
10036         /*
10037          * this next chunk reads more into the buffer if we're not done yet
10038          */
10039
10040         if (s < PL_bufend)
10041             break;              /* handle case where we are done yet :-) */
10042
10043 #ifndef PERL_STRICT_CR
10044         if (to - SvPVX_const(sv) >= 2) {
10045             if ((to[-2] == '\r' && to[-1] == '\n') ||
10046                 (to[-2] == '\n' && to[-1] == '\r'))
10047             {
10048                 to[-2] = '\n';
10049                 to--;
10050                 SvCUR_set(sv, to - SvPVX_const(sv));
10051             }
10052             else if (to[-1] == '\r')
10053                 to[-1] = '\n';
10054         }
10055         else if (to - SvPVX_const(sv) == 1 && to[-1] == '\r')
10056             to[-1] = '\n';
10057 #endif
10058         
10059      read_more_line:
10060         /* if we're out of file, or a read fails, bail and reset the current
10061            line marker so we can report where the unterminated string began
10062         */
10063 #ifdef PERL_MAD
10064         if (PL_madskills) {
10065             char * const tstart = SvPVX(PL_linestr) + stuffstart;
10066             if (PL_thisstuff)
10067                 sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
10068             else
10069                 PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
10070         }
10071 #endif
10072         CopLINE_inc(PL_curcop);
10073         PL_bufptr = PL_bufend;
10074         if (!lex_next_chunk(0)) {
10075             sv_free(sv);
10076             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
10077             return NULL;
10078         }
10079         s = PL_bufptr;
10080 #ifdef PERL_MAD
10081         stuffstart = 0;
10082 #endif
10083     }
10084
10085     /* at this point, we have successfully read the delimited string */
10086
10087     if (!PL_encoding || UTF) {
10088 #ifdef PERL_MAD
10089         if (PL_madskills) {
10090             char * const tstart = SvPVX(PL_linestr) + stuffstart;
10091             const int len = s - tstart;
10092             if (PL_thisstuff)
10093                 sv_catpvn(PL_thisstuff, tstart, len);
10094             else
10095                 PL_thisstuff = newSVpvn(tstart, len);
10096             if (!PL_thisclose && !keep_delims)
10097                 PL_thisclose = newSVpvn(s,termlen);
10098         }
10099 #endif
10100
10101         if (keep_delims)
10102             sv_catpvn(sv, s, termlen);
10103         s += termlen;
10104     }
10105 #ifdef PERL_MAD
10106     else {
10107         if (PL_madskills) {
10108             char * const tstart = SvPVX(PL_linestr) + stuffstart;
10109             const int len = s - tstart - termlen;
10110             if (PL_thisstuff)
10111                 sv_catpvn(PL_thisstuff, tstart, len);
10112             else
10113                 PL_thisstuff = newSVpvn(tstart, len);
10114             if (!PL_thisclose && !keep_delims)
10115                 PL_thisclose = newSVpvn(s - termlen,termlen);
10116         }
10117     }
10118 #endif
10119     if (has_utf8 || PL_encoding)
10120         SvUTF8_on(sv);
10121
10122     PL_multi_end = CopLINE(PL_curcop);
10123
10124     /* if we allocated too much space, give some back */
10125     if (SvCUR(sv) + 5 < SvLEN(sv)) {
10126         SvLEN_set(sv, SvCUR(sv) + 1);
10127         SvPV_renew(sv, SvLEN(sv));
10128     }
10129
10130     /* decide whether this is the first or second quoted string we've read
10131        for this op
10132     */
10133
10134     if (PL_lex_stuff)
10135         PL_lex_repl = sv;
10136     else
10137         PL_lex_stuff = sv;
10138     return s;
10139 }
10140
10141 /*
10142   scan_num
10143   takes: pointer to position in buffer
10144   returns: pointer to new position in buffer
10145   side-effects: builds ops for the constant in pl_yylval.op
10146
10147   Read a number in any of the formats that Perl accepts:
10148
10149   \d(_?\d)*(\.(\d(_?\d)*)?)?[Ee][\+\-]?(\d(_?\d)*)      12 12.34 12.
10150   \.\d(_?\d)*[Ee][\+\-]?(\d(_?\d)*)                     .34
10151   0b[01](_?[01])*
10152   0[0-7](_?[0-7])*
10153   0x[0-9A-Fa-f](_?[0-9A-Fa-f])*
10154
10155   Like most scan_ routines, it uses the PL_tokenbuf buffer to hold the
10156   thing it reads.
10157
10158   If it reads a number without a decimal point or an exponent, it will
10159   try converting the number to an integer and see if it can do so
10160   without loss of precision.
10161 */
10162
10163 char *
10164 Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
10165 {
10166     dVAR;
10167     register const char *s = start;     /* current position in buffer */
10168     register char *d;                   /* destination in temp buffer */
10169     register char *e;                   /* end of temp buffer */
10170     NV nv;                              /* number read, as a double */
10171     SV *sv = NULL;                      /* place to put the converted number */
10172     bool floatit;                       /* boolean: int or float? */
10173     const char *lastub = NULL;          /* position of last underbar */
10174     static char const number_too_long[] = "Number too long";
10175
10176     PERL_ARGS_ASSERT_SCAN_NUM;
10177
10178     /* We use the first character to decide what type of number this is */
10179
10180     switch (*s) {
10181     default:
10182       Perl_croak(aTHX_ "panic: scan_num");
10183
10184     /* if it starts with a 0, it could be an octal number, a decimal in
10185        0.13 disguise, or a hexadecimal number, or a binary number. */
10186     case '0':
10187         {
10188           /* variables:
10189              u          holds the "number so far"
10190              shift      the power of 2 of the base
10191                         (hex == 4, octal == 3, binary == 1)
10192              overflowed was the number more than we can hold?
10193
10194              Shift is used when we add a digit.  It also serves as an "are
10195              we in octal/hex/binary?" indicator to disallow hex characters
10196              when in octal mode.
10197            */
10198             NV n = 0.0;
10199             UV u = 0;
10200             I32 shift;
10201             bool overflowed = FALSE;
10202             bool just_zero  = TRUE;     /* just plain 0 or binary number? */
10203             static const NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
10204             static const char* const bases[5] =
10205               { "", "binary", "", "octal", "hexadecimal" };
10206             static const char* const Bases[5] =
10207               { "", "Binary", "", "Octal", "Hexadecimal" };
10208             static const char* const maxima[5] =
10209               { "",
10210                 "0b11111111111111111111111111111111",
10211                 "",
10212                 "037777777777",
10213                 "0xffffffff" };
10214             const char *base, *Base, *max;
10215
10216             /* check for hex */
10217             if (s[1] == 'x' || s[1] == 'X') {
10218                 shift = 4;
10219                 s += 2;
10220                 just_zero = FALSE;
10221             } else if (s[1] == 'b' || s[1] == 'B') {
10222                 shift = 1;
10223                 s += 2;
10224                 just_zero = FALSE;
10225             }
10226             /* check for a decimal in disguise */
10227             else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
10228                 goto decimal;
10229             /* so it must be octal */
10230             else {
10231                 shift = 3;
10232                 s++;
10233             }
10234
10235             if (*s == '_') {
10236                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10237                                "Misplaced _ in number");
10238                lastub = s++;
10239             }
10240
10241             base = bases[shift];
10242             Base = Bases[shift];
10243             max  = maxima[shift];
10244
10245             /* read the rest of the number */
10246             for (;;) {
10247                 /* x is used in the overflow test,
10248                    b is the digit we're adding on. */
10249                 UV x, b;
10250
10251                 switch (*s) {
10252
10253                 /* if we don't mention it, we're done */
10254                 default:
10255                     goto out;
10256
10257                 /* _ are ignored -- but warned about if consecutive */
10258                 case '_':
10259                     if (lastub && s == lastub + 1)
10260                         Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10261                                        "Misplaced _ in number");
10262                     lastub = s++;
10263                     break;
10264
10265                 /* 8 and 9 are not octal */
10266                 case '8': case '9':
10267                     if (shift == 3)
10268                         yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
10269                     /* FALL THROUGH */
10270
10271                 /* octal digits */
10272                 case '2': case '3': case '4':
10273                 case '5': case '6': case '7':
10274                     if (shift == 1)
10275                         yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
10276                     /* FALL THROUGH */
10277
10278                 case '0': case '1':
10279                     b = *s++ & 15;              /* ASCII digit -> value of digit */
10280                     goto digit;
10281
10282                 /* hex digits */
10283                 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
10284                 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
10285                     /* make sure they said 0x */
10286                     if (shift != 4)
10287                         goto out;
10288                     b = (*s++ & 7) + 9;
10289
10290                     /* Prepare to put the digit we have onto the end
10291                        of the number so far.  We check for overflows.
10292                     */
10293
10294                   digit:
10295                     just_zero = FALSE;
10296                     if (!overflowed) {
10297                         x = u << shift; /* make room for the digit */
10298
10299                         if ((x >> shift) != u
10300                             && !(PL_hints & HINT_NEW_BINARY)) {
10301                             overflowed = TRUE;
10302                             n = (NV) u;
10303                             Perl_ck_warner_d(aTHX_ packWARN(WARN_OVERFLOW),
10304                                              "Integer overflow in %s number",
10305                                              base);
10306                         } else
10307                             u = x | b;          /* add the digit to the end */
10308                     }
10309                     if (overflowed) {
10310                         n *= nvshift[shift];
10311                         /* If an NV has not enough bits in its
10312                          * mantissa to represent an UV this summing of
10313                          * small low-order numbers is a waste of time
10314                          * (because the NV cannot preserve the
10315                          * low-order bits anyway): we could just
10316                          * remember when did we overflow and in the
10317                          * end just multiply n by the right
10318                          * amount. */
10319                         n += (NV) b;
10320                     }
10321                     break;
10322                 }
10323             }
10324
10325           /* if we get here, we had success: make a scalar value from
10326              the number.
10327           */
10328           out:
10329
10330             /* final misplaced underbar check */
10331             if (s[-1] == '_') {
10332                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
10333             }
10334
10335             if (overflowed) {
10336                 if (n > 4294967295.0)
10337                     Perl_ck_warner(aTHX_ packWARN(WARN_PORTABLE),
10338                                    "%s number > %s non-portable",
10339                                    Base, max);
10340                 sv = newSVnv(n);
10341             }
10342             else {
10343 #if UVSIZE > 4
10344                 if (u > 0xffffffff)
10345                     Perl_ck_warner(aTHX_ packWARN(WARN_PORTABLE),
10346                                    "%s number > %s non-portable",
10347                                    Base, max);
10348 #endif
10349                 sv = newSVuv(u);
10350             }
10351             if (just_zero && (PL_hints & HINT_NEW_INTEGER))
10352                 sv = new_constant(start, s - start, "integer",
10353                                   sv, NULL, NULL, 0);
10354             else if (PL_hints & HINT_NEW_BINARY)
10355                 sv = new_constant(start, s - start, "binary", sv, NULL, NULL, 0);
10356         }
10357         break;
10358
10359     /*
10360       handle decimal numbers.
10361       we're also sent here when we read a 0 as the first digit
10362     */
10363     case '1': case '2': case '3': case '4': case '5':
10364     case '6': case '7': case '8': case '9': case '.':
10365       decimal:
10366         d = PL_tokenbuf;
10367         e = PL_tokenbuf + sizeof PL_tokenbuf - 6; /* room for various punctuation */
10368         floatit = FALSE;
10369
10370         /* read next group of digits and _ and copy into d */
10371         while (isDIGIT(*s) || *s == '_') {
10372             /* skip underscores, checking for misplaced ones
10373                if -w is on
10374             */
10375             if (*s == '_') {
10376                 if (lastub && s == lastub + 1)
10377                     Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10378                                    "Misplaced _ in number");
10379                 lastub = s++;
10380             }
10381             else {
10382                 /* check for end of fixed-length buffer */
10383                 if (d >= e)
10384                     Perl_croak(aTHX_ number_too_long);
10385                 /* if we're ok, copy the character */
10386                 *d++ = *s++;
10387             }
10388         }
10389
10390         /* final misplaced underbar check */
10391         if (lastub && s == lastub + 1) {
10392             Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
10393         }
10394
10395         /* read a decimal portion if there is one.  avoid
10396            3..5 being interpreted as the number 3. followed
10397            by .5
10398         */
10399         if (*s == '.' && s[1] != '.') {
10400             floatit = TRUE;
10401             *d++ = *s++;
10402
10403             if (*s == '_') {
10404                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10405                                "Misplaced _ in number");
10406                 lastub = s;
10407             }
10408
10409             /* copy, ignoring underbars, until we run out of digits.
10410             */
10411             for (; isDIGIT(*s) || *s == '_'; s++) {
10412                 /* fixed length buffer check */
10413                 if (d >= e)
10414                     Perl_croak(aTHX_ number_too_long);
10415                 if (*s == '_') {
10416                    if (lastub && s == lastub + 1)
10417                        Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10418                                       "Misplaced _ in number");
10419                    lastub = s;
10420                 }
10421                 else
10422                     *d++ = *s;
10423             }
10424             /* fractional part ending in underbar? */
10425             if (s[-1] == '_') {
10426                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10427                                "Misplaced _ in number");
10428             }
10429             if (*s == '.' && isDIGIT(s[1])) {
10430                 /* oops, it's really a v-string, but without the "v" */
10431                 s = start;
10432                 goto vstring;
10433             }
10434         }
10435
10436         /* read exponent part, if present */
10437         if ((*s == 'e' || *s == 'E') && strchr("+-0123456789_", s[1])) {
10438             floatit = TRUE;
10439             s++;
10440
10441             /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
10442             *d++ = 'e';         /* At least some Mach atof()s don't grok 'E' */
10443
10444             /* stray preinitial _ */
10445             if (*s == '_') {
10446                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10447                                "Misplaced _ in number");
10448                 lastub = s++;
10449             }
10450
10451             /* allow positive or negative exponent */
10452             if (*s == '+' || *s == '-')
10453                 *d++ = *s++;
10454
10455             /* stray initial _ */
10456             if (*s == '_') {
10457                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10458                                "Misplaced _ in number");
10459                 lastub = s++;
10460             }
10461
10462             /* read digits of exponent */
10463             while (isDIGIT(*s) || *s == '_') {
10464                 if (isDIGIT(*s)) {
10465                     if (d >= e)
10466                         Perl_croak(aTHX_ number_too_long);
10467                     *d++ = *s++;
10468                 }
10469                 else {
10470                    if (((lastub && s == lastub + 1) ||
10471                         (!isDIGIT(s[1]) && s[1] != '_')))
10472                        Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
10473                                       "Misplaced _ in number");
10474                    lastub = s++;
10475                 }
10476             }
10477         }
10478
10479
10480         /*
10481            We try to do an integer conversion first if no characters
10482            indicating "float" have been found.
10483          */
10484
10485         if (!floatit) {
10486             UV uv;
10487             const int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
10488
10489             if (flags == IS_NUMBER_IN_UV) {
10490               if (uv <= IV_MAX)
10491                 sv = newSViv(uv); /* Prefer IVs over UVs. */
10492               else
10493                 sv = newSVuv(uv);
10494             } else if (flags == (IS_NUMBER_IN_UV | IS_NUMBER_NEG)) {
10495               if (uv <= (UV) IV_MIN)
10496                 sv = newSViv(-(IV)uv);
10497               else
10498                 floatit = TRUE;
10499             } else
10500               floatit = TRUE;
10501         }
10502         if (floatit) {
10503             /* terminate the string */
10504             *d = '\0';
10505             nv = Atof(PL_tokenbuf);
10506             sv = newSVnv(nv);
10507         }
10508
10509         if ( floatit
10510              ? (PL_hints & HINT_NEW_FLOAT) : (PL_hints & HINT_NEW_INTEGER) ) {
10511             const char *const key = floatit ? "float" : "integer";
10512             const STRLEN keylen = floatit ? 5 : 7;
10513             sv = S_new_constant(aTHX_ PL_tokenbuf, d - PL_tokenbuf,
10514                                 key, keylen, sv, NULL, NULL, 0);
10515         }
10516         break;
10517
10518     /* if it starts with a v, it could be a v-string */
10519     case 'v':
10520 vstring:
10521                 sv = newSV(5); /* preallocate storage space */
10522                 s = scan_vstring(s, PL_bufend, sv);
10523         break;
10524     }
10525
10526     /* make the op for the constant and return */
10527
10528     if (sv)
10529         lvalp->opval = newSVOP(OP_CONST, 0, sv);
10530     else
10531         lvalp->opval = NULL;
10532
10533     return (char *)s;
10534 }
10535
10536 STATIC char *
10537 S_scan_formline(pTHX_ register char *s)
10538 {
10539     dVAR;
10540     register char *eol;
10541     register char *t;
10542     SV * const stuff = newSVpvs("");
10543     bool needargs = FALSE;
10544     bool eofmt = FALSE;
10545 #ifdef PERL_MAD
10546     char *tokenstart = s;
10547     SV* savewhite = NULL;
10548
10549     if (PL_madskills) {
10550         savewhite = PL_thiswhite;
10551         PL_thiswhite = 0;
10552     }
10553 #endif
10554
10555     PERL_ARGS_ASSERT_SCAN_FORMLINE;
10556
10557     while (!needargs) {
10558         if (*s == '.') {
10559             t = s+1;
10560 #ifdef PERL_STRICT_CR
10561             while (SPACE_OR_TAB(*t))
10562                 t++;
10563 #else
10564             while (SPACE_OR_TAB(*t) || *t == '\r')
10565                 t++;
10566 #endif
10567             if (*t == '\n' || t == PL_bufend) {
10568                 eofmt = TRUE;
10569                 break;
10570             }
10571         }
10572         if (PL_in_eval && !PL_rsfp && !PL_parser->filtered) {
10573             eol = (char *) memchr(s,'\n',PL_bufend-s);
10574             if (!eol++)
10575                 eol = PL_bufend;
10576         }
10577         else
10578             eol = PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
10579         if (*s != '#') {
10580             for (t = s; t < eol; t++) {
10581                 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
10582                     needargs = FALSE;
10583                     goto enough;        /* ~~ must be first line in formline */
10584                 }
10585                 if (*t == '@' || *t == '^')
10586                     needargs = TRUE;
10587             }
10588             if (eol > s) {
10589                 sv_catpvn(stuff, s, eol-s);
10590 #ifndef PERL_STRICT_CR
10591                 if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
10592                     char *end = SvPVX(stuff) + SvCUR(stuff);
10593                     end[-2] = '\n';
10594                     end[-1] = '\0';
10595                     SvCUR_set(stuff, SvCUR(stuff) - 1);
10596                 }
10597 #endif
10598             }
10599             else
10600               break;
10601         }
10602         s = (char*)eol;
10603         if (PL_rsfp || PL_parser->filtered) {
10604             bool got_some;
10605 #ifdef PERL_MAD
10606             if (PL_madskills) {
10607                 if (PL_thistoken)
10608                     sv_catpvn(PL_thistoken, tokenstart, PL_bufend - tokenstart);
10609                 else
10610                     PL_thistoken = newSVpvn(tokenstart, PL_bufend - tokenstart);
10611             }
10612 #endif
10613             PL_bufptr = PL_bufend;
10614             CopLINE_inc(PL_curcop);
10615             got_some = lex_next_chunk(0);
10616             CopLINE_dec(PL_curcop);
10617             s = PL_bufptr;
10618 #ifdef PERL_MAD
10619             tokenstart = PL_bufptr;
10620 #endif
10621             if (!got_some)
10622                 break;
10623         }
10624         incline(s);
10625     }
10626   enough:
10627     if (SvCUR(stuff)) {
10628         PL_expect = XTERM;
10629         if (needargs) {
10630             PL_lex_state = LEX_NORMAL;
10631             start_force(PL_curforce);
10632             NEXTVAL_NEXTTOKE.ival = 0;
10633             force_next(',');
10634         }
10635         else
10636             PL_lex_state = LEX_FORMLINE;
10637         if (!IN_BYTES) {
10638             if (UTF && is_utf8_string((U8*)SvPVX_const(stuff), SvCUR(stuff)))
10639                 SvUTF8_on(stuff);
10640             else if (PL_encoding)
10641                 sv_recode_to_utf8(stuff, PL_encoding);
10642         }
10643         start_force(PL_curforce);
10644         NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0, stuff);
10645         force_next(THING);
10646         start_force(PL_curforce);
10647         NEXTVAL_NEXTTOKE.ival = OP_FORMLINE;
10648         force_next(LSTOP);
10649     }
10650     else {
10651         SvREFCNT_dec(stuff);
10652         if (eofmt)
10653             PL_lex_formbrack = 0;
10654         PL_bufptr = s;
10655     }
10656 #ifdef PERL_MAD
10657     if (PL_madskills) {
10658         if (PL_thistoken)
10659             sv_catpvn(PL_thistoken, tokenstart, s - tokenstart);
10660         else
10661             PL_thistoken = newSVpvn(tokenstart, s - tokenstart);
10662         PL_thiswhite = savewhite;
10663     }
10664 #endif
10665     return s;
10666 }
10667
10668 I32
10669 Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
10670 {
10671     dVAR;
10672     const I32 oldsavestack_ix = PL_savestack_ix;
10673     CV* const outsidecv = PL_compcv;
10674
10675     if (PL_compcv) {
10676         assert(SvTYPE(PL_compcv) == SVt_PVCV);
10677     }
10678     SAVEI32(PL_subline);
10679     save_item(PL_subname);
10680     SAVESPTR(PL_compcv);
10681
10682     PL_compcv = MUTABLE_CV(newSV_type(is_format ? SVt_PVFM : SVt_PVCV));
10683     CvFLAGS(PL_compcv) |= flags;
10684
10685     PL_subline = CopLINE(PL_curcop);
10686     CvPADLIST(PL_compcv) = pad_new(padnew_SAVE|padnew_SAVESUB);
10687     CvOUTSIDE(PL_compcv) = MUTABLE_CV(SvREFCNT_inc_simple(outsidecv));
10688     CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
10689
10690     return oldsavestack_ix;
10691 }
10692
10693 #ifdef __SC__
10694 #pragma segment Perl_yylex
10695 #endif
10696 static int
10697 S_yywarn(pTHX_ const char *const s)
10698 {
10699     dVAR;
10700
10701     PERL_ARGS_ASSERT_YYWARN;
10702
10703     PL_in_eval |= EVAL_WARNONLY;
10704     yyerror(s);
10705     PL_in_eval &= ~EVAL_WARNONLY;
10706     return 0;
10707 }
10708
10709 int
10710 Perl_yyerror(pTHX_ const char *const s)
10711 {
10712     dVAR;
10713     const char *where = NULL;
10714     const char *context = NULL;
10715     int contlen = -1;
10716     SV *msg;
10717     int yychar  = PL_parser->yychar;
10718
10719     PERL_ARGS_ASSERT_YYERROR;
10720
10721     if (!yychar || (yychar == ';' && !PL_rsfp))
10722         where = "at EOF";
10723     else if (PL_oldoldbufptr && PL_bufptr > PL_oldoldbufptr &&
10724       PL_bufptr - PL_oldoldbufptr < 200 && PL_oldoldbufptr != PL_oldbufptr &&
10725       PL_oldbufptr != PL_bufptr) {
10726         /*
10727                 Only for NetWare:
10728                 The code below is removed for NetWare because it abends/crashes on NetWare
10729                 when the script has error such as not having the closing quotes like:
10730                     if ($var eq "value)
10731                 Checking of white spaces is anyway done in NetWare code.
10732         */
10733 #ifndef NETWARE
10734         while (isSPACE(*PL_oldoldbufptr))
10735             PL_oldoldbufptr++;
10736 #endif
10737         context = PL_oldoldbufptr;
10738         contlen = PL_bufptr - PL_oldoldbufptr;
10739     }
10740     else if (PL_oldbufptr && PL_bufptr > PL_oldbufptr &&
10741       PL_bufptr - PL_oldbufptr < 200 && PL_oldbufptr != PL_bufptr) {
10742         /*
10743                 Only for NetWare:
10744                 The code below is removed for NetWare because it abends/crashes on NetWare
10745                 when the script has error such as not having the closing quotes like:
10746                     if ($var eq "value)
10747                 Checking of white spaces is anyway done in NetWare code.
10748         */
10749 #ifndef NETWARE
10750         while (isSPACE(*PL_oldbufptr))
10751             PL_oldbufptr++;
10752 #endif
10753         context = PL_oldbufptr;
10754         contlen = PL_bufptr - PL_oldbufptr;
10755     }
10756     else if (yychar > 255)
10757         where = "next token ???";
10758     else if (yychar == -2) { /* YYEMPTY */
10759         if (PL_lex_state == LEX_NORMAL ||
10760            (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
10761             where = "at end of line";
10762         else if (PL_lex_inpat)
10763             where = "within pattern";
10764         else
10765             where = "within string";
10766     }
10767     else {
10768         SV * const where_sv = newSVpvs_flags("next char ", SVs_TEMP);
10769         if (yychar < 32)
10770             Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
10771         else if (isPRINT_LC(yychar)) {
10772             const char string = yychar;
10773             sv_catpvn(where_sv, &string, 1);
10774         }
10775         else
10776             Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
10777         where = SvPVX_const(where_sv);
10778     }
10779     msg = sv_2mortal(newSVpv(s, 0));
10780     Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
10781         OutCopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
10782     if (context)
10783         Perl_sv_catpvf(aTHX_ msg, "near \"%.*s\"\n", contlen, context);
10784     else
10785         Perl_sv_catpvf(aTHX_ msg, "%s\n", where);
10786     if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
10787         Perl_sv_catpvf(aTHX_ msg,
10788         "  (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
10789                 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
10790         PL_multi_end = 0;
10791     }
10792     if (PL_in_eval & EVAL_WARNONLY) {
10793         Perl_ck_warner_d(aTHX_ packWARN(WARN_SYNTAX), "%"SVf, SVfARG(msg));
10794     }
10795     else
10796         qerror(msg);
10797     if (PL_error_count >= 10) {
10798         if (PL_in_eval && SvCUR(ERRSV))
10799             Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
10800                        SVfARG(ERRSV), OutCopFILE(PL_curcop));
10801         else
10802             Perl_croak(aTHX_ "%s has too many errors.\n",
10803             OutCopFILE(PL_curcop));
10804     }
10805     PL_in_my = 0;
10806     PL_in_my_stash = NULL;
10807     return 0;
10808 }
10809 #ifdef __SC__
10810 #pragma segment Main
10811 #endif
10812
10813 STATIC char*
10814 S_swallow_bom(pTHX_ U8 *s)
10815 {
10816     dVAR;
10817     const STRLEN slen = SvCUR(PL_linestr);
10818
10819     PERL_ARGS_ASSERT_SWALLOW_BOM;
10820
10821     switch (s[0]) {
10822     case 0xFF:
10823         if (s[1] == 0xFE) {
10824             /* UTF-16 little-endian? (or UTF-32LE?) */
10825             if (s[2] == 0 && s[3] == 0)  /* UTF-32 little-endian */
10826                 Perl_croak(aTHX_ "Unsupported script encoding UTF-32LE");
10827 #ifndef PERL_NO_UTF16_FILTER
10828             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (BOM)\n");
10829             s += 2;
10830             if (PL_bufend > (char*)s) {
10831                 s = add_utf16_textfilter(s, TRUE);
10832             }
10833 #else
10834             Perl_croak(aTHX_ "Unsupported script encoding UTF-16LE");
10835 #endif
10836         }
10837         break;
10838     case 0xFE:
10839         if (s[1] == 0xFF) {   /* UTF-16 big-endian? */
10840 #ifndef PERL_NO_UTF16_FILTER
10841             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (BOM)\n");
10842             s += 2;
10843             if (PL_bufend > (char *)s) {
10844                 s = add_utf16_textfilter(s, FALSE);
10845             }
10846 #else
10847             Perl_croak(aTHX_ "Unsupported script encoding UTF-16BE");
10848 #endif
10849         }
10850         break;
10851     case 0xEF:
10852         if (slen > 2 && s[1] == 0xBB && s[2] == 0xBF) {
10853             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
10854             s += 3;                      /* UTF-8 */
10855         }
10856         break;
10857     case 0:
10858         if (slen > 3) {
10859              if (s[1] == 0) {
10860                   if (s[2] == 0xFE && s[3] == 0xFF) {
10861                        /* UTF-32 big-endian */
10862                        Perl_croak(aTHX_ "Unsupported script encoding UTF-32BE");
10863                   }
10864              }
10865              else if (s[2] == 0 && s[3] != 0) {
10866                   /* Leading bytes
10867                    * 00 xx 00 xx
10868                    * are a good indicator of UTF-16BE. */
10869 #ifndef PERL_NO_UTF16_FILTER
10870                   if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (no BOM)\n");
10871                   s = add_utf16_textfilter(s, FALSE);
10872 #else
10873                   Perl_croak(aTHX_ "Unsupported script encoding UTF-16BE");
10874 #endif
10875              }
10876         }
10877 #ifdef EBCDIC
10878     case 0xDD:
10879         if (slen > 3 && s[1] == 0x73 && s[2] == 0x66 && s[3] == 0x73) {
10880             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
10881             s += 4;                      /* UTF-8 */
10882         }
10883         break;
10884 #endif
10885
10886     default:
10887          if (slen > 3 && s[1] == 0 && s[2] != 0 && s[3] == 0) {
10888                   /* Leading bytes
10889                    * xx 00 xx 00
10890                    * are a good indicator of UTF-16LE. */
10891 #ifndef PERL_NO_UTF16_FILTER
10892               if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (no BOM)\n");
10893               s = add_utf16_textfilter(s, TRUE);
10894 #else
10895               Perl_croak(aTHX_ "Unsupported script encoding UTF-16LE");
10896 #endif
10897          }
10898     }
10899     return (char*)s;
10900 }
10901
10902
10903 #ifndef PERL_NO_UTF16_FILTER
10904 static I32
10905 S_utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
10906 {
10907     dVAR;
10908     SV *const filter = FILTER_DATA(idx);
10909     /* We re-use this each time round, throwing the contents away before we
10910        return.  */
10911     SV *const utf16_buffer = MUTABLE_SV(IoTOP_GV(filter));
10912     SV *const utf8_buffer = filter;
10913     IV status = IoPAGE(filter);
10914     const bool reverse = cBOOL(IoLINES(filter));
10915     I32 retval;
10916
10917     PERL_ARGS_ASSERT_UTF16_TEXTFILTER;
10918
10919     /* As we're automatically added, at the lowest level, and hence only called
10920        from this file, we can be sure that we're not called in block mode. Hence
10921        don't bother writing code to deal with block mode.  */
10922     if (maxlen) {
10923         Perl_croak(aTHX_ "panic: utf16_textfilter called in block mode (for %d characters)", maxlen);
10924     }
10925     if (status < 0) {
10926         Perl_croak(aTHX_ "panic: utf16_textfilter called after error (status=%"IVdf")", status);
10927     }
10928     DEBUG_P(PerlIO_printf(Perl_debug_log,
10929                           "utf16_textfilter(%p,%ce): idx=%d maxlen=%d status=%"IVdf" utf16=%"UVuf" utf8=%"UVuf"\n",
10930                           FPTR2DPTR(void *, S_utf16_textfilter),
10931                           reverse ? 'l' : 'b', idx, maxlen, status,
10932                           (UV)SvCUR(utf16_buffer), (UV)SvCUR(utf8_buffer)));
10933
10934     while (1) {
10935         STRLEN chars;
10936         STRLEN have;
10937         I32 newlen;
10938         U8 *end;
10939         /* First, look in our buffer of existing UTF-8 data:  */
10940         char *nl = (char *)memchr(SvPVX(utf8_buffer), '\n', SvCUR(utf8_buffer));
10941
10942         if (nl) {
10943             ++nl;
10944         } else if (status == 0) {
10945             /* EOF */
10946             IoPAGE(filter) = 0;
10947             nl = SvEND(utf8_buffer);
10948         }
10949         if (nl) {
10950             STRLEN got = nl - SvPVX(utf8_buffer);
10951             /* Did we have anything to append?  */
10952             retval = got != 0;
10953             sv_catpvn(sv, SvPVX(utf8_buffer), got);
10954             /* Everything else in this code works just fine if SVp_POK isn't
10955                set.  This, however, needs it, and we need it to work, else
10956                we loop infinitely because the buffer is never consumed.  */
10957             sv_chop(utf8_buffer, nl);
10958             break;
10959         }
10960
10961         /* OK, not a complete line there, so need to read some more UTF-16.
10962            Read an extra octect if the buffer currently has an odd number. */
10963         while (1) {
10964             if (status <= 0)
10965                 break;
10966             if (SvCUR(utf16_buffer) >= 2) {
10967                 /* Location of the high octet of the last complete code point.
10968                    Gosh, UTF-16 is a pain. All the benefits of variable length,
10969                    *coupled* with all the benefits of partial reads and
10970                    endianness.  */
10971                 const U8 *const last_hi = (U8*)SvPVX(utf16_buffer)
10972                     + ((SvCUR(utf16_buffer) & ~1) - (reverse ? 1 : 2));
10973
10974                 if (*last_hi < 0xd8 || *last_hi > 0xdb) {
10975                     break;
10976                 }
10977
10978                 /* We have the first half of a surrogate. Read more.  */
10979                 DEBUG_P(PerlIO_printf(Perl_debug_log, "utf16_textfilter partial surrogate detected at %p\n", last_hi));
10980             }
10981
10982             status = FILTER_READ(idx + 1, utf16_buffer,
10983                                  160 + (SvCUR(utf16_buffer) & 1));
10984             DEBUG_P(PerlIO_printf(Perl_debug_log, "utf16_textfilter status=%"IVdf" SvCUR(sv)=%"UVuf"\n", status, (UV)SvCUR(utf16_buffer)));
10985             DEBUG_P({ sv_dump(utf16_buffer); sv_dump(utf8_buffer);});
10986             if (status < 0) {
10987                 /* Error */
10988                 IoPAGE(filter) = status;
10989                 return status;
10990             }
10991         }
10992
10993         chars = SvCUR(utf16_buffer) >> 1;
10994         have = SvCUR(utf8_buffer);
10995         SvGROW(utf8_buffer, have + chars * 3 + 1);
10996
10997         if (reverse) {
10998             end = utf16_to_utf8_reversed((U8*)SvPVX(utf16_buffer),
10999                                          (U8*)SvPVX_const(utf8_buffer) + have,
11000                                          chars * 2, &newlen);
11001         } else {
11002             end = utf16_to_utf8((U8*)SvPVX(utf16_buffer),
11003                                 (U8*)SvPVX_const(utf8_buffer) + have,
11004                                 chars * 2, &newlen);
11005         }
11006         SvCUR_set(utf8_buffer, have + newlen);
11007         *end = '\0';
11008
11009         /* No need to keep this SV "well-formed" with a '\0' after the end, as
11010            it's private to us, and utf16_to_utf8{,reversed} take a
11011            (pointer,length) pair, rather than a NUL-terminated string.  */
11012         if(SvCUR(utf16_buffer) & 1) {
11013             *SvPVX(utf16_buffer) = SvEND(utf16_buffer)[-1];
11014             SvCUR_set(utf16_buffer, 1);
11015         } else {
11016             SvCUR_set(utf16_buffer, 0);
11017         }
11018     }
11019     DEBUG_P(PerlIO_printf(Perl_debug_log,
11020                           "utf16_textfilter: returns, status=%"IVdf" utf16=%"UVuf" utf8=%"UVuf"\n",
11021                           status,
11022                           (UV)SvCUR(utf16_buffer), (UV)SvCUR(utf8_buffer)));
11023     DEBUG_P({ sv_dump(utf8_buffer); sv_dump(sv);});
11024     return retval;
11025 }
11026
11027 static U8 *
11028 S_add_utf16_textfilter(pTHX_ U8 *const s, bool reversed)
11029 {
11030     SV *filter = filter_add(S_utf16_textfilter, NULL);
11031
11032     PERL_ARGS_ASSERT_ADD_UTF16_TEXTFILTER;
11033
11034     IoTOP_GV(filter) = MUTABLE_GV(newSVpvn((char *)s, PL_bufend - (char*)s));
11035     sv_setpvs(filter, "");
11036     IoLINES(filter) = reversed;
11037     IoPAGE(filter) = 1; /* Not EOF */
11038
11039     /* Sadly, we have to return a valid pointer, come what may, so we have to
11040        ignore any error return from this.  */
11041     SvCUR_set(PL_linestr, 0);
11042     if (FILTER_READ(0, PL_linestr, 0)) {
11043         SvUTF8_on(PL_linestr);
11044     } else {
11045         SvUTF8_on(PL_linestr);
11046     }
11047     PL_bufend = SvEND(PL_linestr);
11048     return (U8*)SvPVX(PL_linestr);
11049 }
11050 #endif
11051
11052 /*
11053 Returns a pointer to the next character after the parsed
11054 vstring, as well as updating the passed in sv.
11055
11056 Function must be called like
11057
11058         sv = newSV(5);
11059         s = scan_vstring(s,e,sv);
11060
11061 where s and e are the start and end of the string.
11062 The sv should already be large enough to store the vstring
11063 passed in, for performance reasons.
11064
11065 */
11066
11067 char *
11068 Perl_scan_vstring(pTHX_ const char *s, const char *const e, SV *sv)
11069 {
11070     dVAR;
11071     const char *pos = s;
11072     const char *start = s;
11073
11074     PERL_ARGS_ASSERT_SCAN_VSTRING;
11075
11076     if (*pos == 'v') pos++;  /* get past 'v' */
11077     while (pos < e && (isDIGIT(*pos) || *pos == '_'))
11078         pos++;
11079     if ( *pos != '.') {
11080         /* this may not be a v-string if followed by => */
11081         const char *next = pos;
11082         while (next < e && isSPACE(*next))
11083             ++next;
11084         if ((e - next) >= 2 && *next == '=' && next[1] == '>' ) {
11085             /* return string not v-string */
11086             sv_setpvn(sv,(char *)s,pos-s);
11087             return (char *)pos;
11088         }
11089     }
11090
11091     if (!isALPHA(*pos)) {
11092         U8 tmpbuf[UTF8_MAXBYTES+1];
11093
11094         if (*s == 'v')
11095             s++;  /* get past 'v' */
11096
11097         sv_setpvs(sv, "");
11098
11099         for (;;) {
11100             /* this is atoi() that tolerates underscores */
11101             U8 *tmpend;
11102             UV rev = 0;
11103             const char *end = pos;
11104             UV mult = 1;
11105             while (--end >= s) {
11106                 if (*end != '_') {
11107                     const UV orev = rev;
11108                     rev += (*end - '0') * mult;
11109                     mult *= 10;
11110                     if (orev > rev)
11111                         Perl_ck_warner_d(aTHX_ packWARN(WARN_OVERFLOW),
11112                                          "Integer overflow in decimal number");
11113                 }
11114             }
11115 #ifdef EBCDIC
11116             if (rev > 0x7FFFFFFF)
11117                  Perl_croak(aTHX_ "In EBCDIC the v-string components cannot exceed 2147483647");
11118 #endif
11119             /* Append native character for the rev point */
11120             tmpend = uvchr_to_utf8(tmpbuf, rev);
11121             sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
11122             if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(rev)))
11123                  SvUTF8_on(sv);
11124             if (pos + 1 < e && *pos == '.' && isDIGIT(pos[1]))
11125                  s = ++pos;
11126             else {
11127                  s = pos;
11128                  break;
11129             }
11130             while (pos < e && (isDIGIT(*pos) || *pos == '_'))
11131                  pos++;
11132         }
11133         SvPOK_on(sv);
11134         sv_magic(sv,NULL,PERL_MAGIC_vstring,(const char*)start, pos-start);
11135         SvRMAGICAL_on(sv);
11136     }
11137     return (char *)s;
11138 }
11139
11140 int
11141 Perl_keyword_plugin_standard(pTHX_
11142         char *keyword_ptr, STRLEN keyword_len, OP **op_ptr)
11143 {
11144     PERL_ARGS_ASSERT_KEYWORD_PLUGIN_STANDARD;
11145     PERL_UNUSED_CONTEXT;
11146     PERL_UNUSED_ARG(keyword_ptr);
11147     PERL_UNUSED_ARG(keyword_len);
11148     PERL_UNUSED_ARG(op_ptr);
11149     return KEYWORD_PLUGIN_DECLINE;
11150 }
11151
11152 #define parse_recdescent(g,p) S_parse_recdescent(aTHX_ g,p)
11153 static void
11154 S_parse_recdescent(pTHX_ int gramtype, I32 fakeeof)
11155 {
11156     SAVEI32(PL_lex_brackets);
11157     if (PL_lex_brackets > 100)
11158         Renew(PL_lex_brackstack, PL_lex_brackets + 10, char);
11159     PL_lex_brackstack[PL_lex_brackets++] = XFAKEEOF;
11160     SAVEI32(PL_lex_allbrackets);
11161     PL_lex_allbrackets = 0;
11162     SAVEI8(PL_lex_fakeeof);
11163     PL_lex_fakeeof = (U8)fakeeof;
11164     if(yyparse(gramtype) && !PL_parser->error_count)
11165         qerror(Perl_mess(aTHX_ "Parse error"));
11166 }
11167
11168 #define parse_recdescent_for_op(g,p) S_parse_recdescent_for_op(aTHX_ g,p)
11169 static OP *
11170 S_parse_recdescent_for_op(pTHX_ int gramtype, I32 fakeeof)
11171 {
11172     OP *o;
11173     ENTER;
11174     SAVEVPTR(PL_eval_root);
11175     PL_eval_root = NULL;
11176     parse_recdescent(gramtype, fakeeof);
11177     o = PL_eval_root;
11178     LEAVE;
11179     return o;
11180 }
11181
11182 #define parse_expr(p,f) S_parse_expr(aTHX_ p,f)
11183 static OP *
11184 S_parse_expr(pTHX_ I32 fakeeof, U32 flags)
11185 {
11186     OP *exprop;
11187     if (flags & ~PARSE_OPTIONAL)
11188         Perl_croak(aTHX_ "Parsing code internal error (%s)", "parse_expr");
11189     exprop = parse_recdescent_for_op(GRAMEXPR, fakeeof);
11190     if (!exprop && !(flags & PARSE_OPTIONAL)) {
11191         if (!PL_parser->error_count)
11192             qerror(Perl_mess(aTHX_ "Parse error"));
11193         exprop = newOP(OP_NULL, 0);
11194     }
11195     return exprop;
11196 }
11197
11198 /*
11199 =for apidoc Amx|OP *|parse_arithexpr|U32 flags
11200
11201 Parse a Perl arithmetic expression.  This may contain operators of precedence
11202 down to the bit shift operators.  The expression must be followed (and thus
11203 terminated) either by a comparison or lower-precedence operator or by
11204 something that would normally terminate an expression such as semicolon.
11205 If I<flags> includes C<PARSE_OPTIONAL> then the expression is optional,
11206 otherwise it is mandatory.  It is up to the caller to ensure that the
11207 dynamic parser state (L</PL_parser> et al) is correctly set to reflect
11208 the source of the code to be parsed and the lexical context for the
11209 expression.
11210
11211 The op tree representing the expression is returned.  If an optional
11212 expression is absent, a null pointer is returned, otherwise the pointer
11213 will be non-null.
11214
11215 If an error occurs in parsing or compilation, in most cases a valid op
11216 tree is returned anyway.  The error is reflected in the parser state,
11217 normally resulting in a single exception at the top level of parsing
11218 which covers all the compilation errors that occurred.  Some compilation
11219 errors, however, will throw an exception immediately.
11220
11221 =cut
11222 */
11223
11224 OP *
11225 Perl_parse_arithexpr(pTHX_ U32 flags)
11226 {
11227     return parse_expr(LEX_FAKEEOF_COMPARE, flags);
11228 }
11229
11230 /*
11231 =for apidoc Amx|OP *|parse_termexpr|U32 flags
11232
11233 Parse a Perl term expression.  This may contain operators of precedence
11234 down to the assignment operators.  The expression must be followed (and thus
11235 terminated) either by a comma or lower-precedence operator or by
11236 something that would normally terminate an expression such as semicolon.
11237 If I<flags> includes C<PARSE_OPTIONAL> then the expression is optional,
11238 otherwise it is mandatory.  It is up to the caller to ensure that the
11239 dynamic parser state (L</PL_parser> et al) is correctly set to reflect
11240 the source of the code to be parsed and the lexical context for the
11241 expression.
11242
11243 The op tree representing the expression is returned.  If an optional
11244 expression is absent, a null pointer is returned, otherwise the pointer
11245 will be non-null.
11246
11247 If an error occurs in parsing or compilation, in most cases a valid op
11248 tree is returned anyway.  The error is reflected in the parser state,
11249 normally resulting in a single exception at the top level of parsing
11250 which covers all the compilation errors that occurred.  Some compilation
11251 errors, however, will throw an exception immediately.
11252
11253 =cut
11254 */
11255
11256 OP *
11257 Perl_parse_termexpr(pTHX_ U32 flags)
11258 {
11259     return parse_expr(LEX_FAKEEOF_COMMA, flags);
11260 }
11261
11262 /*
11263 =for apidoc Amx|OP *|parse_listexpr|U32 flags
11264
11265 Parse a Perl list expression.  This may contain operators of precedence
11266 down to the comma operator.  The expression must be followed (and thus
11267 terminated) either by a low-precedence logic operator such as C<or> or by
11268 something that would normally terminate an expression such as semicolon.
11269 If I<flags> includes C<PARSE_OPTIONAL> then the expression is optional,
11270 otherwise it is mandatory.  It is up to the caller to ensure that the
11271 dynamic parser state (L</PL_parser> et al) is correctly set to reflect
11272 the source of the code to be parsed and the lexical context for the
11273 expression.
11274
11275 The op tree representing the expression is returned.  If an optional
11276 expression is absent, a null pointer is returned, otherwise the pointer
11277 will be non-null.
11278
11279 If an error occurs in parsing or compilation, in most cases a valid op
11280 tree is returned anyway.  The error is reflected in the parser state,
11281 normally resulting in a single exception at the top level of parsing
11282 which covers all the compilation errors that occurred.  Some compilation
11283 errors, however, will throw an exception immediately.
11284
11285 =cut
11286 */
11287
11288 OP *
11289 Perl_parse_listexpr(pTHX_ U32 flags)
11290 {
11291     return parse_expr(LEX_FAKEEOF_LOWLOGIC, flags);
11292 }
11293
11294 /*
11295 =for apidoc Amx|OP *|parse_fullexpr|U32 flags
11296
11297 Parse a single complete Perl expression.  This allows the full
11298 expression grammar, including the lowest-precedence operators such
11299 as C<or>.  The expression must be followed (and thus terminated) by a
11300 token that an expression would normally be terminated by: end-of-file,
11301 closing bracketing punctuation, semicolon, or one of the keywords that
11302 signals a postfix expression-statement modifier.  If I<flags> includes
11303 C<PARSE_OPTIONAL> then the expression is optional, otherwise it is
11304 mandatory.  It is up to the caller to ensure that the dynamic parser
11305 state (L</PL_parser> et al) is correctly set to reflect the source of
11306 the code to be parsed and the lexical context for the expression.
11307
11308 The op tree representing the expression is returned.  If an optional
11309 expression is absent, a null pointer is returned, otherwise the pointer
11310 will be non-null.
11311
11312 If an error occurs in parsing or compilation, in most cases a valid op
11313 tree is returned anyway.  The error is reflected in the parser state,
11314 normally resulting in a single exception at the top level of parsing
11315 which covers all the compilation errors that occurred.  Some compilation
11316 errors, however, will throw an exception immediately.
11317
11318 =cut
11319 */
11320
11321 OP *
11322 Perl_parse_fullexpr(pTHX_ U32 flags)
11323 {
11324     return parse_expr(LEX_FAKEEOF_NONEXPR, flags);
11325 }
11326
11327 /*
11328 =for apidoc Amx|OP *|parse_block|U32 flags
11329
11330 Parse a single complete Perl code block.  This consists of an opening
11331 brace, a sequence of statements, and a closing brace.  The block
11332 constitutes a lexical scope, so C<my> variables and various compile-time
11333 effects can be contained within it.  It is up to the caller to ensure
11334 that the dynamic parser state (L</PL_parser> et al) is correctly set to
11335 reflect the source of the code to be parsed and the lexical context for
11336 the statement.
11337
11338 The op tree representing the code block is returned.  This is always a
11339 real op, never a null pointer.  It will normally be a C<lineseq> list,
11340 including C<nextstate> or equivalent ops.  No ops to construct any kind
11341 of runtime scope are included by virtue of it being a block.
11342
11343 If an error occurs in parsing or compilation, in most cases a valid op
11344 tree (most likely null) is returned anyway.  The error is reflected in
11345 the parser state, normally resulting in a single exception at the top
11346 level of parsing which covers all the compilation errors that occurred.
11347 Some compilation errors, however, will throw an exception immediately.
11348
11349 The I<flags> parameter is reserved for future use, and must always
11350 be zero.
11351
11352 =cut
11353 */
11354
11355 OP *
11356 Perl_parse_block(pTHX_ U32 flags)
11357 {
11358     if (flags)
11359         Perl_croak(aTHX_ "Parsing code internal error (%s)", "parse_block");
11360     return parse_recdescent_for_op(GRAMBLOCK, LEX_FAKEEOF_NEVER);
11361 }
11362
11363 /*
11364 =for apidoc Amx|OP *|parse_barestmt|U32 flags
11365
11366 Parse a single unadorned Perl statement.  This may be a normal imperative
11367 statement or a declaration that has compile-time effect.  It does not
11368 include any label or other affixture.  It is up to the caller to ensure
11369 that the dynamic parser state (L</PL_parser> et al) is correctly set to
11370 reflect the source of the code to be parsed and the lexical context for
11371 the statement.
11372
11373 The op tree representing the statement is returned.  This may be a
11374 null pointer if the statement is null, for example if it was actually
11375 a subroutine definition (which has compile-time side effects).  If not
11376 null, it will be ops directly implementing the statement, suitable to
11377 pass to L</newSTATEOP>.  It will not normally include a C<nextstate> or
11378 equivalent op (except for those embedded in a scope contained entirely
11379 within the statement).
11380
11381 If an error occurs in parsing or compilation, in most cases a valid op
11382 tree (most likely null) is returned anyway.  The error is reflected in
11383 the parser state, normally resulting in a single exception at the top
11384 level of parsing which covers all the compilation errors that occurred.
11385 Some compilation errors, however, will throw an exception immediately.
11386
11387 The I<flags> parameter is reserved for future use, and must always
11388 be zero.
11389
11390 =cut
11391 */
11392
11393 OP *
11394 Perl_parse_barestmt(pTHX_ U32 flags)
11395 {
11396     if (flags)
11397         Perl_croak(aTHX_ "Parsing code internal error (%s)", "parse_barestmt");
11398     return parse_recdescent_for_op(GRAMBARESTMT, LEX_FAKEEOF_NEVER);
11399 }
11400
11401 /*
11402 =for apidoc Amx|SV *|parse_label|U32 flags
11403
11404 Parse a single label, possibly optional, of the type that may prefix a
11405 Perl statement.  It is up to the caller to ensure that the dynamic parser
11406 state (L</PL_parser> et al) is correctly set to reflect the source of
11407 the code to be parsed.  If I<flags> includes C<PARSE_OPTIONAL> then the
11408 label is optional, otherwise it is mandatory.
11409
11410 The name of the label is returned in the form of a fresh scalar.  If an
11411 optional label is absent, a null pointer is returned.
11412
11413 If an error occurs in parsing, which can only occur if the label is
11414 mandatory, a valid label is returned anyway.  The error is reflected in
11415 the parser state, normally resulting in a single exception at the top
11416 level of parsing which covers all the compilation errors that occurred.
11417
11418 =cut
11419 */
11420
11421 SV *
11422 Perl_parse_label(pTHX_ U32 flags)
11423 {
11424     if (flags & ~PARSE_OPTIONAL)
11425         Perl_croak(aTHX_ "Parsing code internal error (%s)", "parse_label");
11426     if (PL_lex_state == LEX_KNOWNEXT) {
11427         PL_parser->yychar = yylex();
11428         if (PL_parser->yychar == LABEL) {
11429             char *lpv = pl_yylval.pval;
11430             STRLEN llen = strlen(lpv);
11431             SV *lsv;
11432             PL_parser->yychar = YYEMPTY;
11433             lsv = newSV_type(SVt_PV);
11434             SvPV_set(lsv, lpv);
11435             SvCUR_set(lsv, llen);
11436             SvLEN_set(lsv, llen+1);
11437             SvPOK_on(lsv);
11438             return lsv;
11439         } else {
11440             yyunlex();
11441             goto no_label;
11442         }
11443     } else {
11444         char *s, *t;
11445         U8 c;
11446         STRLEN wlen, bufptr_pos;
11447         lex_read_space(0);
11448         t = s = PL_bufptr;
11449         c = (U8)*s;
11450         if (!isIDFIRST_A(c))
11451             goto no_label;
11452         do {
11453             c = (U8)*++t;
11454         } while(isWORDCHAR_A(c));
11455         wlen = t - s;
11456         if (word_takes_any_delimeter(s, wlen))
11457             goto no_label;
11458         bufptr_pos = s - SvPVX(PL_linestr);
11459         PL_bufptr = t;
11460         lex_read_space(LEX_KEEP_PREVIOUS);
11461         t = PL_bufptr;
11462         s = SvPVX(PL_linestr) + bufptr_pos;
11463         if (t[0] == ':' && t[1] != ':') {
11464             PL_oldoldbufptr = PL_oldbufptr;
11465             PL_oldbufptr = s;
11466             PL_bufptr = t+1;
11467             return newSVpvn(s, wlen);
11468         } else {
11469             PL_bufptr = s;
11470             no_label:
11471             if (flags & PARSE_OPTIONAL) {
11472                 return NULL;
11473             } else {
11474                 qerror(Perl_mess(aTHX_ "Parse error"));
11475                 return newSVpvs("x");
11476             }
11477         }
11478     }
11479 }
11480
11481 /*
11482 =for apidoc Amx|OP *|parse_fullstmt|U32 flags
11483
11484 Parse a single complete Perl statement.  This may be a normal imperative
11485 statement or a declaration that has compile-time effect, and may include
11486 optional labels.  It is up to the caller to ensure that the dynamic
11487 parser state (L</PL_parser> et al) is correctly set to reflect the source
11488 of the code to be parsed and the lexical context for the statement.
11489
11490 The op tree representing the statement is returned.  This may be a
11491 null pointer if the statement is null, for example if it was actually
11492 a subroutine definition (which has compile-time side effects).  If not
11493 null, it will be the result of a L</newSTATEOP> call, normally including
11494 a C<nextstate> or equivalent op.
11495
11496 If an error occurs in parsing or compilation, in most cases a valid op
11497 tree (most likely null) is returned anyway.  The error is reflected in
11498 the parser state, normally resulting in a single exception at the top
11499 level of parsing which covers all the compilation errors that occurred.
11500 Some compilation errors, however, will throw an exception immediately.
11501
11502 The I<flags> parameter is reserved for future use, and must always
11503 be zero.
11504
11505 =cut
11506 */
11507
11508 OP *
11509 Perl_parse_fullstmt(pTHX_ U32 flags)
11510 {
11511     if (flags)
11512         Perl_croak(aTHX_ "Parsing code internal error (%s)", "parse_fullstmt");
11513     return parse_recdescent_for_op(GRAMFULLSTMT, LEX_FAKEEOF_NEVER);
11514 }
11515
11516 /*
11517 =for apidoc Amx|OP *|parse_stmtseq|U32 flags
11518
11519 Parse a sequence of zero or more Perl statements.  These may be normal
11520 imperative statements, including optional labels, or declarations
11521 that have compile-time effect, or any mixture thereof.  The statement
11522 sequence ends when a closing brace or end-of-file is encountered in a
11523 place where a new statement could have validly started.  It is up to
11524 the caller to ensure that the dynamic parser state (L</PL_parser> et al)
11525 is correctly set to reflect the source of the code to be parsed and the
11526 lexical context for the statements.
11527
11528 The op tree representing the statement sequence is returned.  This may
11529 be a null pointer if the statements were all null, for example if there
11530 were no statements or if there were only subroutine definitions (which
11531 have compile-time side effects).  If not null, it will be a C<lineseq>
11532 list, normally including C<nextstate> or equivalent ops.
11533
11534 If an error occurs in parsing or compilation, in most cases a valid op
11535 tree is returned anyway.  The error is reflected in the parser state,
11536 normally resulting in a single exception at the top level of parsing
11537 which covers all the compilation errors that occurred.  Some compilation
11538 errors, however, will throw an exception immediately.
11539
11540 The I<flags> parameter is reserved for future use, and must always
11541 be zero.
11542
11543 =cut
11544 */
11545
11546 OP *
11547 Perl_parse_stmtseq(pTHX_ U32 flags)
11548 {
11549     OP *stmtseqop;
11550     I32 c;
11551     if (flags)
11552         Perl_croak(aTHX_ "Parsing code internal error (%s)", "parse_stmtseq");
11553     stmtseqop = parse_recdescent_for_op(GRAMSTMTSEQ, LEX_FAKEEOF_CLOSING);
11554     c = lex_peek_unichar(0);
11555     if (c != -1 && c != /*{*/'}')
11556         qerror(Perl_mess(aTHX_ "Parse error"));
11557     return stmtseqop;
11558 }
11559
11560 void
11561 Perl_munge_qwlist_to_paren_list(pTHX_ OP *qwlist)
11562 {
11563     PERL_ARGS_ASSERT_MUNGE_QWLIST_TO_PAREN_LIST;
11564     deprecate("qw(...) as parentheses");
11565     force_next((4<<24)|')');
11566     if (qwlist->op_type == OP_STUB) {
11567         op_free(qwlist);
11568     }
11569     else {
11570         start_force(PL_curforce);
11571         NEXTVAL_NEXTTOKE.opval = qwlist;
11572         force_next(THING);
11573     }
11574     force_next((2<<24)|'(');
11575 }
11576
11577 /*
11578  * Local variables:
11579  * c-indentation-style: bsd
11580  * c-basic-offset: 4
11581  * indent-tabs-mode: t
11582  * End:
11583  *
11584  * ex: set ts=8 sts=4 sw=4 noet:
11585  */