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