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