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