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