This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
08796d6368a9338b4502edc8b6975912364d69ca
[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 #include "EXTERN.h"
25 #define PERL_IN_TOKE_C
26 #include "perl.h"
27
28 #define new_constant(a,b,c,d,e,f,g)     \
29         S_new_constant(aTHX_ a,b,STR_WITH_LEN(c),d,e,f, g)
30
31 #define pl_yylval       (PL_parser->yylval)
32
33 /* YYINITDEPTH -- initial size of the parser's stacks.  */
34 #define YYINITDEPTH 200
35
36 /* XXX temporary backwards compatibility */
37 #define PL_lex_brackets         (PL_parser->lex_brackets)
38 #define PL_lex_brackstack       (PL_parser->lex_brackstack)
39 #define PL_lex_casemods         (PL_parser->lex_casemods)
40 #define PL_lex_casestack        (PL_parser->lex_casestack)
41 #define PL_lex_defer            (PL_parser->lex_defer)
42 #define PL_lex_dojoin           (PL_parser->lex_dojoin)
43 #define PL_lex_expect           (PL_parser->lex_expect)
44 #define PL_lex_formbrack        (PL_parser->lex_formbrack)
45 #define PL_lex_inpat            (PL_parser->lex_inpat)
46 #define PL_lex_inwhat           (PL_parser->lex_inwhat)
47 #define PL_lex_op               (PL_parser->lex_op)
48 #define PL_lex_repl             (PL_parser->lex_repl)
49 #define PL_lex_starts           (PL_parser->lex_starts)
50 #define PL_lex_stuff            (PL_parser->lex_stuff)
51 #define PL_multi_start          (PL_parser->multi_start)
52 #define PL_multi_open           (PL_parser->multi_open)
53 #define PL_multi_close          (PL_parser->multi_close)
54 #define PL_pending_ident        (PL_parser->pending_ident)
55 #define PL_preambled            (PL_parser->preambled)
56 #define PL_sublex_info          (PL_parser->sublex_info)
57 #define PL_linestr              (PL_parser->linestr)
58 #define PL_expect               (PL_parser->expect)
59 #define PL_copline              (PL_parser->copline)
60 #define PL_bufptr               (PL_parser->bufptr)
61 #define PL_oldbufptr            (PL_parser->oldbufptr)
62 #define PL_oldoldbufptr         (PL_parser->oldoldbufptr)
63 #define PL_linestart            (PL_parser->linestart)
64 #define PL_bufend               (PL_parser->bufend)
65 #define PL_last_uni             (PL_parser->last_uni)
66 #define PL_last_lop             (PL_parser->last_lop)
67 #define PL_last_lop_op          (PL_parser->last_lop_op)
68 #define PL_lex_state            (PL_parser->lex_state)
69 #define PL_rsfp                 (PL_parser->rsfp)
70 #define PL_rsfp_filters         (PL_parser->rsfp_filters)
71 #define PL_in_my                (PL_parser->in_my)
72 #define PL_in_my_stash          (PL_parser->in_my_stash)
73 #define PL_tokenbuf             (PL_parser->tokenbuf)
74 #define PL_multi_end            (PL_parser->multi_end)
75 #define PL_error_count          (PL_parser->error_count)
76
77 #ifdef PERL_MAD
78 #  define PL_endwhite           (PL_parser->endwhite)
79 #  define PL_faketokens         (PL_parser->faketokens)
80 #  define PL_lasttoke           (PL_parser->lasttoke)
81 #  define PL_nextwhite          (PL_parser->nextwhite)
82 #  define PL_realtokenstart     (PL_parser->realtokenstart)
83 #  define PL_skipwhite          (PL_parser->skipwhite)
84 #  define PL_thisclose          (PL_parser->thisclose)
85 #  define PL_thismad            (PL_parser->thismad)
86 #  define PL_thisopen           (PL_parser->thisopen)
87 #  define PL_thisstuff          (PL_parser->thisstuff)
88 #  define PL_thistoken          (PL_parser->thistoken)
89 #  define PL_thiswhite          (PL_parser->thiswhite)
90 #  define PL_thiswhite          (PL_parser->thiswhite)
91 #  define PL_nexttoke           (PL_parser->nexttoke)
92 #  define PL_curforce           (PL_parser->curforce)
93 #else
94 #  define PL_nexttoke           (PL_parser->nexttoke)
95 #  define PL_nexttype           (PL_parser->nexttype)
96 #  define PL_nextval            (PL_parser->nextval)
97 #endif
98
99 static int
100 S_pending_ident(pTHX);
101
102 static const char ident_too_long[] = "Identifier too long";
103 static const char commaless_variable_list[] = "comma-less variable list";
104
105 #ifndef PERL_NO_UTF16_FILTER
106 static I32 utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen);
107 static I32 utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen);
108 #endif
109
110 #ifdef PERL_MAD
111 #  define CURMAD(slot,sv) if (PL_madskills) { curmad(slot,sv); sv = 0; }
112 #  define NEXTVAL_NEXTTOKE PL_nexttoke[PL_curforce].next_val
113 #else
114 #  define CURMAD(slot,sv)
115 #  define NEXTVAL_NEXTTOKE PL_nextval[PL_nexttoke]
116 #endif
117
118 #define XFAKEBRACK 128
119 #define XENUMMASK 127
120
121 #ifdef USE_UTF8_SCRIPTS
122 #   define UTF (!IN_BYTES)
123 #else
124 #   define UTF ((PL_linestr && DO_UTF8(PL_linestr)) || (PL_hints & HINT_UTF8))
125 #endif
126
127 /* In variables named $^X, these are the legal values for X.
128  * 1999-02-27 mjd-perl-patch@plover.com */
129 #define isCONTROLVAR(x) (isUPPER(x) || strchr("[\\]^_?", (x)))
130
131 /* On MacOS, respect nonbreaking spaces */
132 #ifdef MACOS_TRADITIONAL
133 #define SPACE_OR_TAB(c) ((c)==' '||(c)=='\312'||(c)=='\t')
134 #else
135 #define SPACE_OR_TAB(c) ((c)==' '||(c)=='\t')
136 #endif
137
138 /* LEX_* are values for PL_lex_state, the state of the lexer.
139  * They are arranged oddly so that the guard on the switch statement
140  * can get by with a single comparison (if the compiler is smart enough).
141  */
142
143 /* #define LEX_NOTPARSING               11 is done in perl.h. */
144
145 #define LEX_NORMAL              10 /* normal code (ie not within "...")     */
146 #define LEX_INTERPNORMAL         9 /* code within a string, eg "$foo[$x+1]" */
147 #define LEX_INTERPCASEMOD        8 /* expecting a \U, \Q or \E etc          */
148 #define LEX_INTERPPUSH           7 /* starting a new sublex parse level     */
149 #define LEX_INTERPSTART          6 /* expecting the start of a $var         */
150
151                                    /* at end of code, eg "$x" followed by:  */
152 #define LEX_INTERPEND            5 /* ... eg not one of [, { or ->          */
153 #define LEX_INTERPENDMAYBE       4 /* ... eg one of [, { or ->              */
154
155 #define LEX_INTERPCONCAT         3 /* expecting anything, eg at start of
156                                         string or after \E, $foo, etc       */
157 #define LEX_INTERPCONST          2 /* NOT USED */
158 #define LEX_FORMLINE             1 /* expecting a format line               */
159 #define LEX_KNOWNEXT             0 /* next token known; just return it      */
160
161
162 #ifdef DEBUGGING
163 static const char* const lex_state_names[] = {
164     "KNOWNEXT",
165     "FORMLINE",
166     "INTERPCONST",
167     "INTERPCONCAT",
168     "INTERPENDMAYBE",
169     "INTERPEND",
170     "INTERPSTART",
171     "INTERPPUSH",
172     "INTERPCASEMOD",
173     "INTERPNORMAL",
174     "NORMAL"
175 };
176 #endif
177
178 #ifdef ff_next
179 #undef ff_next
180 #endif
181
182 #include "keywords.h"
183
184 /* CLINE is a macro that ensures PL_copline has a sane value */
185
186 #ifdef CLINE
187 #undef CLINE
188 #endif
189 #define CLINE (PL_copline = (CopLINE(PL_curcop) < PL_copline ? CopLINE(PL_curcop) : PL_copline))
190
191 #ifdef PERL_MAD
192 #  define SKIPSPACE0(s) skipspace0(s)
193 #  define SKIPSPACE1(s) skipspace1(s)
194 #  define SKIPSPACE2(s,tsv) skipspace2(s,&tsv)
195 #  define PEEKSPACE(s) skipspace2(s,0)
196 #else
197 #  define SKIPSPACE0(s) skipspace(s)
198 #  define SKIPSPACE1(s) skipspace(s)
199 #  define SKIPSPACE2(s,tsv) skipspace(s)
200 #  define PEEKSPACE(s) skipspace(s)
201 #endif
202
203 /*
204  * Convenience functions to return different tokens and prime the
205  * lexer for the next token.  They all take an argument.
206  *
207  * TOKEN        : generic token (used for '(', DOLSHARP, etc)
208  * OPERATOR     : generic operator
209  * AOPERATOR    : assignment operator
210  * PREBLOCK     : beginning the block after an if, while, foreach, ...
211  * PRETERMBLOCK : beginning a non-code-defining {} block (eg, hash ref)
212  * PREREF       : *EXPR where EXPR is not a simple identifier
213  * TERM         : expression term
214  * LOOPX        : loop exiting command (goto, last, dump, etc)
215  * FTST         : file test operator
216  * FUN0         : zero-argument function
217  * FUN1         : not used, except for not, which isn't a UNIOP
218  * BOop         : bitwise or or xor
219  * BAop         : bitwise and
220  * SHop         : shift operator
221  * PWop         : power operator
222  * PMop         : pattern-matching operator
223  * Aop          : addition-level operator
224  * Mop          : multiplication-level operator
225  * Eop          : equality-testing operator
226  * Rop          : relational operator <= != gt
227  *
228  * Also see LOP and lop() below.
229  */
230
231 #ifdef DEBUGGING /* Serve -DT. */
232 #   define REPORT(retval) tokereport((I32)retval, &pl_yylval)
233 #else
234 #   define REPORT(retval) (retval)
235 #endif
236
237 #define TOKEN(retval) return ( PL_bufptr = s, REPORT(retval))
238 #define OPERATOR(retval) return (PL_expect = XTERM, PL_bufptr = s, REPORT(retval))
239 #define AOPERATOR(retval) return ao((PL_expect = XTERM, PL_bufptr = s, REPORT(retval)))
240 #define PREBLOCK(retval) return (PL_expect = XBLOCK,PL_bufptr = s, REPORT(retval))
241 #define PRETERMBLOCK(retval) return (PL_expect = XTERMBLOCK,PL_bufptr = s, REPORT(retval))
242 #define PREREF(retval) return (PL_expect = XREF,PL_bufptr = s, REPORT(retval))
243 #define TERM(retval) return (CLINE, PL_expect = XOPERATOR, PL_bufptr = s, REPORT(retval))
244 #define LOOPX(f) return (pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)LOOPEX))
245 #define FTST(f)  return (pl_yylval.ival=f, PL_expect=XTERMORDORDOR, PL_bufptr=s, REPORT((int)UNIOP))
246 #define FUN0(f)  return (pl_yylval.ival=f, PL_expect=XOPERATOR, PL_bufptr=s, REPORT((int)FUNC0))
247 #define FUN1(f)  return (pl_yylval.ival=f, PL_expect=XOPERATOR, PL_bufptr=s, REPORT((int)FUNC1))
248 #define BOop(f)  return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)BITOROP)))
249 #define BAop(f)  return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)BITANDOP)))
250 #define SHop(f)  return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)SHIFTOP)))
251 #define PWop(f)  return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)POWOP)))
252 #define PMop(f)  return(pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)MATCHOP))
253 #define Aop(f)   return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)ADDOP)))
254 #define Mop(f)   return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)MULOP)))
255 #define Eop(f)   return (pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)EQOP))
256 #define Rop(f)   return (pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)RELOP))
257
258 /* This bit of chicanery makes a unary function followed by
259  * a parenthesis into a function with one argument, highest precedence.
260  * The UNIDOR macro is for unary functions that can be followed by the //
261  * operator (such as C<shift // 0>).
262  */
263 #define UNI2(f,x) { \
264         pl_yylval.ival = f; \
265         PL_expect = x; \
266         PL_bufptr = s; \
267         PL_last_uni = PL_oldbufptr; \
268         PL_last_lop_op = f; \
269         if (*s == '(') \
270             return REPORT( (int)FUNC1 ); \
271         s = PEEKSPACE(s); \
272         return REPORT( *s=='(' ? (int)FUNC1 : (int)UNIOP ); \
273         }
274 #define UNI(f)    UNI2(f,XTERM)
275 #define UNIDOR(f) UNI2(f,XTERMORDORDOR)
276
277 #define UNIBRACK(f) { \
278         pl_yylval.ival = f; \
279         PL_bufptr = s; \
280         PL_last_uni = PL_oldbufptr; \
281         if (*s == '(') \
282             return REPORT( (int)FUNC1 ); \
283         s = PEEKSPACE(s); \
284         return REPORT( (*s == '(') ? (int)FUNC1 : (int)UNIOP ); \
285         }
286
287 /* grandfather return to old style */
288 #define OLDLOP(f) return(pl_yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)LSTOP)
289
290 #ifdef DEBUGGING
291
292 /* how to interpret the pl_yylval associated with the token */
293 enum token_type {
294     TOKENTYPE_NONE,
295     TOKENTYPE_IVAL,
296     TOKENTYPE_OPNUM, /* pl_yylval.ival contains an opcode number */
297     TOKENTYPE_PVAL,
298     TOKENTYPE_OPVAL,
299     TOKENTYPE_GVVAL
300 };
301
302 static struct debug_tokens {
303     const int token;
304     enum token_type type;
305     const char *name;
306 } const debug_tokens[] =
307 {
308     { ADDOP,            TOKENTYPE_OPNUM,        "ADDOP" },
309     { ANDAND,           TOKENTYPE_NONE,         "ANDAND" },
310     { ANDOP,            TOKENTYPE_NONE,         "ANDOP" },
311     { ANONSUB,          TOKENTYPE_IVAL,         "ANONSUB" },
312     { ARROW,            TOKENTYPE_NONE,         "ARROW" },
313     { ASSIGNOP,         TOKENTYPE_OPNUM,        "ASSIGNOP" },
314     { BITANDOP,         TOKENTYPE_OPNUM,        "BITANDOP" },
315     { BITOROP,          TOKENTYPE_OPNUM,        "BITOROP" },
316     { COLONATTR,        TOKENTYPE_NONE,         "COLONATTR" },
317     { CONTINUE,         TOKENTYPE_NONE,         "CONTINUE" },
318     { DEFAULT,          TOKENTYPE_NONE,         "DEFAULT" },
319     { DO,               TOKENTYPE_NONE,         "DO" },
320     { DOLSHARP,         TOKENTYPE_NONE,         "DOLSHARP" },
321     { DORDOR,           TOKENTYPE_NONE,         "DORDOR" },
322     { DOROP,            TOKENTYPE_OPNUM,        "DOROP" },
323     { DOTDOT,           TOKENTYPE_IVAL,         "DOTDOT" },
324     { ELSE,             TOKENTYPE_NONE,         "ELSE" },
325     { ELSIF,            TOKENTYPE_IVAL,         "ELSIF" },
326     { EQOP,             TOKENTYPE_OPNUM,        "EQOP" },
327     { FOR,              TOKENTYPE_IVAL,         "FOR" },
328     { FORMAT,           TOKENTYPE_NONE,         "FORMAT" },
329     { FUNC,             TOKENTYPE_OPNUM,        "FUNC" },
330     { FUNC0,            TOKENTYPE_OPNUM,        "FUNC0" },
331     { FUNC0SUB,         TOKENTYPE_OPVAL,        "FUNC0SUB" },
332     { FUNC1,            TOKENTYPE_OPNUM,        "FUNC1" },
333     { FUNCMETH,         TOKENTYPE_OPVAL,        "FUNCMETH" },
334     { GIVEN,            TOKENTYPE_IVAL,         "GIVEN" },
335     { HASHBRACK,        TOKENTYPE_NONE,         "HASHBRACK" },
336     { IF,               TOKENTYPE_IVAL,         "IF" },
337     { LABEL,            TOKENTYPE_PVAL,         "LABEL" },
338     { LOCAL,            TOKENTYPE_IVAL,         "LOCAL" },
339     { LOOPEX,           TOKENTYPE_OPNUM,        "LOOPEX" },
340     { LSTOP,            TOKENTYPE_OPNUM,        "LSTOP" },
341     { LSTOPSUB,         TOKENTYPE_OPVAL,        "LSTOPSUB" },
342     { MATCHOP,          TOKENTYPE_OPNUM,        "MATCHOP" },
343     { METHOD,           TOKENTYPE_OPVAL,        "METHOD" },
344     { MULOP,            TOKENTYPE_OPNUM,        "MULOP" },
345     { MY,               TOKENTYPE_IVAL,         "MY" },
346     { MYSUB,            TOKENTYPE_NONE,         "MYSUB" },
347     { NOAMP,            TOKENTYPE_NONE,         "NOAMP" },
348     { NOTOP,            TOKENTYPE_NONE,         "NOTOP" },
349     { OROP,             TOKENTYPE_IVAL,         "OROP" },
350     { OROR,             TOKENTYPE_NONE,         "OROR" },
351     { PACKAGE,          TOKENTYPE_NONE,         "PACKAGE" },
352     { PMFUNC,           TOKENTYPE_OPVAL,        "PMFUNC" },
353     { POSTDEC,          TOKENTYPE_NONE,         "POSTDEC" },
354     { POSTINC,          TOKENTYPE_NONE,         "POSTINC" },
355     { POWOP,            TOKENTYPE_OPNUM,        "POWOP" },
356     { PREDEC,           TOKENTYPE_NONE,         "PREDEC" },
357     { PREINC,           TOKENTYPE_NONE,         "PREINC" },
358     { PRIVATEREF,       TOKENTYPE_OPVAL,        "PRIVATEREF" },
359     { REFGEN,           TOKENTYPE_NONE,         "REFGEN" },
360     { RELOP,            TOKENTYPE_OPNUM,        "RELOP" },
361     { SHIFTOP,          TOKENTYPE_OPNUM,        "SHIFTOP" },
362     { SUB,              TOKENTYPE_NONE,         "SUB" },
363     { THING,            TOKENTYPE_OPVAL,        "THING" },
364     { UMINUS,           TOKENTYPE_NONE,         "UMINUS" },
365     { UNIOP,            TOKENTYPE_OPNUM,        "UNIOP" },
366     { UNIOPSUB,         TOKENTYPE_OPVAL,        "UNIOPSUB" },
367     { UNLESS,           TOKENTYPE_IVAL,         "UNLESS" },
368     { UNTIL,            TOKENTYPE_IVAL,         "UNTIL" },
369     { USE,              TOKENTYPE_IVAL,         "USE" },
370     { WHEN,             TOKENTYPE_IVAL,         "WHEN" },
371     { WHILE,            TOKENTYPE_IVAL,         "WHILE" },
372     { WORD,             TOKENTYPE_OPVAL,        "WORD" },
373     { YADAYADA,         TOKENTYPE_IVAL,         "YADAYADA" },
374     { 0,                TOKENTYPE_NONE,         NULL }
375 };
376
377 /* dump the returned token in rv, plus any optional arg in pl_yylval */
378
379 STATIC int
380 S_tokereport(pTHX_ I32 rv, const YYSTYPE* lvalp)
381 {
382     dVAR;
383
384     PERL_ARGS_ASSERT_TOKEREPORT;
385
386     if (DEBUG_T_TEST) {
387         const char *name = NULL;
388         enum token_type type = TOKENTYPE_NONE;
389         const struct debug_tokens *p;
390         SV* const report = newSVpvs("<== ");
391
392         for (p = debug_tokens; p->token; p++) {
393             if (p->token == (int)rv) {
394                 name = p->name;
395                 type = p->type;
396                 break;
397             }
398         }
399         if (name)
400             Perl_sv_catpv(aTHX_ report, name);
401         else if ((char)rv > ' ' && (char)rv < '~')
402             Perl_sv_catpvf(aTHX_ report, "'%c'", (char)rv);
403         else if (!rv)
404             sv_catpvs(report, "EOF");
405         else
406             Perl_sv_catpvf(aTHX_ report, "?? %"IVdf, (IV)rv);
407         switch (type) {
408         case TOKENTYPE_NONE:
409         case TOKENTYPE_GVVAL: /* doesn't appear to be used */
410             break;
411         case TOKENTYPE_IVAL:
412             Perl_sv_catpvf(aTHX_ report, "(ival=%"IVdf")", (IV)lvalp->ival);
413             break;
414         case TOKENTYPE_OPNUM:
415             Perl_sv_catpvf(aTHX_ report, "(ival=op_%s)",
416                                     PL_op_name[lvalp->ival]);
417             break;
418         case TOKENTYPE_PVAL:
419             Perl_sv_catpvf(aTHX_ report, "(pval=\"%s\")", lvalp->pval);
420             break;
421         case TOKENTYPE_OPVAL:
422             if (lvalp->opval) {
423                 Perl_sv_catpvf(aTHX_ report, "(opval=op_%s)",
424                                     PL_op_name[lvalp->opval->op_type]);
425                 if (lvalp->opval->op_type == OP_CONST) {
426                     Perl_sv_catpvf(aTHX_ report, " %s",
427                         SvPEEK(cSVOPx_sv(lvalp->opval)));
428                 }
429
430             }
431             else
432                 sv_catpvs(report, "(opval=null)");
433             break;
434         }
435         PerlIO_printf(Perl_debug_log, "### %s\n\n", SvPV_nolen_const(report));
436     };
437     return (int)rv;
438 }
439
440
441 /* print the buffer with suitable escapes */
442
443 STATIC void
444 S_printbuf(pTHX_ const char *const fmt, const char *const s)
445 {
446     SV* const tmp = newSVpvs("");
447
448     PERL_ARGS_ASSERT_PRINTBUF;
449
450     PerlIO_printf(Perl_debug_log, fmt, pv_display(tmp, s, strlen(s), 0, 60));
451     SvREFCNT_dec(tmp);
452 }
453
454 #endif
455
456 /*
457  * S_ao
458  *
459  * This subroutine detects &&=, ||=, and //= and turns an ANDAND, OROR or DORDOR
460  * into an OP_ANDASSIGN, OP_ORASSIGN, or OP_DORASSIGN
461  */
462
463 STATIC int
464 S_ao(pTHX_ int toketype)
465 {
466     dVAR;
467     if (*PL_bufptr == '=') {
468         PL_bufptr++;
469         if (toketype == ANDAND)
470             pl_yylval.ival = OP_ANDASSIGN;
471         else if (toketype == OROR)
472             pl_yylval.ival = OP_ORASSIGN;
473         else if (toketype == DORDOR)
474             pl_yylval.ival = OP_DORASSIGN;
475         toketype = ASSIGNOP;
476     }
477     return toketype;
478 }
479
480 /*
481  * S_no_op
482  * When Perl expects an operator and finds something else, no_op
483  * prints the warning.  It always prints "<something> found where
484  * operator expected.  It prints "Missing semicolon on previous line?"
485  * if the surprise occurs at the start of the line.  "do you need to
486  * predeclare ..." is printed out for code like "sub bar; foo bar $x"
487  * where the compiler doesn't know if foo is a method call or a function.
488  * It prints "Missing operator before end of line" if there's nothing
489  * after the missing operator, or "... before <...>" if there is something
490  * after the missing operator.
491  */
492
493 STATIC void
494 S_no_op(pTHX_ const char *const what, char *s)
495 {
496     dVAR;
497     char * const oldbp = PL_bufptr;
498     const bool is_first = (PL_oldbufptr == PL_linestart);
499
500     PERL_ARGS_ASSERT_NO_OP;
501
502     if (!s)
503         s = oldbp;
504     else
505         PL_bufptr = s;
506     yywarn(Perl_form(aTHX_ "%s found where operator expected", what));
507     if (ckWARN_d(WARN_SYNTAX)) {
508         if (is_first)
509             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
510                     "\t(Missing semicolon on previous line?)\n");
511         else if (PL_oldoldbufptr && isIDFIRST_lazy_if(PL_oldoldbufptr,UTF)) {
512             const char *t;
513             for (t = PL_oldoldbufptr; (isALNUM_lazy_if(t,UTF) || *t == ':'); t++)
514                 NOOP;
515             if (t < PL_bufptr && isSPACE(*t))
516                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
517                         "\t(Do you need to predeclare %.*s?)\n",
518                     (int)(t - PL_oldoldbufptr), PL_oldoldbufptr);
519         }
520         else {
521             assert(s >= oldbp);
522             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
523                     "\t(Missing operator before %.*s?)\n", (int)(s - oldbp), oldbp);
524         }
525     }
526     PL_bufptr = oldbp;
527 }
528
529 /*
530  * S_missingterm
531  * Complain about missing quote/regexp/heredoc terminator.
532  * If it's called with NULL then it cauterizes the line buffer.
533  * If we're in a delimited string and the delimiter is a control
534  * character, it's reformatted into a two-char sequence like ^C.
535  * This is fatal.
536  */
537
538 STATIC void
539 S_missingterm(pTHX_ char *s)
540 {
541     dVAR;
542     char tmpbuf[3];
543     char q;
544     if (s) {
545         char * const nl = strrchr(s,'\n');
546         if (nl)
547             *nl = '\0';
548     }
549     else if (isCNTRL(PL_multi_close)) {
550         *tmpbuf = '^';
551         tmpbuf[1] = (char)toCTRL(PL_multi_close);
552         tmpbuf[2] = '\0';
553         s = tmpbuf;
554     }
555     else {
556         *tmpbuf = (char)PL_multi_close;
557         tmpbuf[1] = '\0';
558         s = tmpbuf;
559     }
560     q = strchr(s,'"') ? '\'' : '"';
561     Perl_croak(aTHX_ "Can't find string terminator %c%s%c anywhere before EOF",q,s,q);
562 }
563
564 #define FEATURE_IS_ENABLED(name)                                        \
565         ((0 != (PL_hints & HINT_LOCALIZE_HH))                           \
566             && S_feature_is_enabled(aTHX_ STR_WITH_LEN(name)))
567 /* The longest string we pass in.  */
568 #define MAX_FEATURE_LEN (sizeof("switch")-1)
569
570 /*
571  * S_feature_is_enabled
572  * Check whether the named feature is enabled.
573  */
574 STATIC bool
575 S_feature_is_enabled(pTHX_ const char *const name, STRLEN namelen)
576 {
577     dVAR;
578     HV * const hinthv = GvHV(PL_hintgv);
579     char he_name[8 + MAX_FEATURE_LEN] = "feature_";
580
581     PERL_ARGS_ASSERT_FEATURE_IS_ENABLED;
582
583     assert(namelen <= MAX_FEATURE_LEN);
584     memcpy(&he_name[8], name, namelen);
585
586     return (hinthv && hv_exists(hinthv, he_name, 8 + namelen));
587 }
588
589 /*
590  * Perl_deprecate
591  */
592
593 void
594 Perl_deprecate(pTHX_ const char *const s)
595 {
596     PERL_ARGS_ASSERT_DEPRECATE;
597
598     if (ckWARN(WARN_DEPRECATED))
599         Perl_warner(aTHX_ packWARN(WARN_DEPRECATED), "Use of %s is deprecated", s);
600 }
601
602 void
603 Perl_deprecate_old(pTHX_ const char *const s)
604 {
605     /* This function should NOT be called for any new deprecated warnings */
606     /* Use Perl_deprecate instead                                         */
607     /*                                                                    */
608     /* It is here to maintain backward compatibility with the pre-5.8     */
609     /* warnings category hierarchy. The "deprecated" category used to     */
610     /* live under the "syntax" category. It is now a top-level category   */
611     /* in its own right.                                                  */
612
613     PERL_ARGS_ASSERT_DEPRECATE_OLD;
614
615     if (ckWARN2(WARN_DEPRECATED, WARN_SYNTAX))
616         Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
617                         "Use of %s is deprecated", s);
618 }
619
620 /*
621  * experimental text filters for win32 carriage-returns, utf16-to-utf8 and
622  * utf16-to-utf8-reversed.
623  */
624
625 #ifdef PERL_CR_FILTER
626 static void
627 strip_return(SV *sv)
628 {
629     register const char *s = SvPVX_const(sv);
630     register const char * const e = s + SvCUR(sv);
631
632     PERL_ARGS_ASSERT_STRIP_RETURN;
633
634     /* outer loop optimized to do nothing if there are no CR-LFs */
635     while (s < e) {
636         if (*s++ == '\r' && *s == '\n') {
637             /* hit a CR-LF, need to copy the rest */
638             register char *d = s - 1;
639             *d++ = *s++;
640             while (s < e) {
641                 if (*s == '\r' && s[1] == '\n')
642                     s++;
643                 *d++ = *s++;
644             }
645             SvCUR(sv) -= s - d;
646             return;
647         }
648     }
649 }
650
651 STATIC I32
652 S_cr_textfilter(pTHX_ int idx, SV *sv, int maxlen)
653 {
654     const I32 count = FILTER_READ(idx+1, sv, maxlen);
655     if (count > 0 && !maxlen)
656         strip_return(sv);
657     return count;
658 }
659 #endif
660
661
662
663 /*
664  * Perl_lex_start
665  *
666  * Create a parser object and initialise its parser and lexer fields
667  *
668  * rsfp       is the opened file handle to read from (if any),
669  *
670  * line       holds any initial content already read from the file (or in
671  *            the case of no file, such as an eval, the whole contents);
672  *
673  * new_filter indicates that this is a new file and it shouldn't inherit
674  *            the filters from the current parser (ie require).
675  */
676
677 void
678 Perl_lex_start(pTHX_ SV *line, PerlIO *rsfp, bool new_filter)
679 {
680     dVAR;
681     const char *s = NULL;
682     STRLEN len;
683     yy_parser *parser, *oparser;
684
685     /* create and initialise a parser */
686
687     Newxz(parser, 1, yy_parser);
688     parser->old_parser = oparser = PL_parser;
689     PL_parser = parser;
690
691     Newx(parser->stack, YYINITDEPTH, yy_stack_frame);
692     parser->ps = parser->stack;
693     parser->stack_size = YYINITDEPTH;
694
695     parser->stack->state = 0;
696     parser->yyerrstatus = 0;
697     parser->yychar = YYEMPTY;           /* Cause a token to be read.  */
698
699     /* on scope exit, free this parser and restore any outer one */
700     SAVEPARSER(parser);
701     parser->saved_curcop = PL_curcop;
702
703     /* initialise lexer state */
704
705 #ifdef PERL_MAD
706     parser->curforce = -1;
707 #else
708     parser->nexttoke = 0;
709 #endif
710     parser->error_count = oparser ? oparser->error_count : 0;
711     parser->copline = NOLINE;
712     parser->lex_state = LEX_NORMAL;
713     parser->expect = XSTATE;
714     parser->rsfp = rsfp;
715     parser->rsfp_filters = (new_filter || !oparser) ? newAV()
716                 : MUTABLE_AV(SvREFCNT_inc(oparser->rsfp_filters));
717
718     Newx(parser->lex_brackstack, 120, char);
719     Newx(parser->lex_casestack, 12, char);
720     *parser->lex_casestack = '\0';
721
722     if (line) {
723         s = SvPV_const(line, len);
724     } else {
725         len = 0;
726     }
727
728     if (!len) {
729         parser->linestr = newSVpvs("\n;");
730     } else if (SvREADONLY(line) || s[len-1] != ';') {
731         parser->linestr = newSVsv(line);
732         if (s[len-1] != ';')
733             sv_catpvs(parser->linestr, "\n;");
734     } else {
735         SvTEMP_off(line);
736         SvREFCNT_inc_simple_void_NN(line);
737         parser->linestr = line;
738     }
739     parser->oldoldbufptr =
740         parser->oldbufptr =
741         parser->bufptr =
742         parser->linestart = SvPVX(parser->linestr);
743     parser->bufend = parser->bufptr + SvCUR(parser->linestr);
744     parser->last_lop = parser->last_uni = NULL;
745 }
746
747
748 /* delete a parser object */
749
750 void
751 Perl_parser_free(pTHX_  const yy_parser *parser)
752 {
753     PERL_ARGS_ASSERT_PARSER_FREE;
754
755     PL_curcop = parser->saved_curcop;
756     SvREFCNT_dec(parser->linestr);
757
758     if (parser->rsfp == PerlIO_stdin())
759         PerlIO_clearerr(parser->rsfp);
760     else if (parser->rsfp && (!parser->old_parser ||
761                 (parser->old_parser && parser->rsfp != parser->old_parser->rsfp)))
762         PerlIO_close(parser->rsfp);
763     SvREFCNT_dec(parser->rsfp_filters);
764
765     Safefree(parser->stack);
766     Safefree(parser->lex_brackstack);
767     Safefree(parser->lex_casestack);
768     PL_parser = parser->old_parser;
769     Safefree(parser);
770 }
771
772
773 /*
774  * Perl_lex_end
775  * Finalizer for lexing operations.  Must be called when the parser is
776  * done with the lexer.
777  */
778
779 void
780 Perl_lex_end(pTHX)
781 {
782     dVAR;
783     PL_doextract = FALSE;
784 }
785
786 /*
787  * S_incline
788  * This subroutine has nothing to do with tilting, whether at windmills
789  * or pinball tables.  Its name is short for "increment line".  It
790  * increments the current line number in CopLINE(PL_curcop) and checks
791  * to see whether the line starts with a comment of the form
792  *    # line 500 "foo.pm"
793  * If so, it sets the current line number and file to the values in the comment.
794  */
795
796 STATIC void
797 S_incline(pTHX_ const char *s)
798 {
799     dVAR;
800     const char *t;
801     const char *n;
802     const char *e;
803
804     PERL_ARGS_ASSERT_INCLINE;
805
806     CopLINE_inc(PL_curcop);
807     if (*s++ != '#')
808         return;
809     while (SPACE_OR_TAB(*s))
810         s++;
811     if (strnEQ(s, "line", 4))
812         s += 4;
813     else
814         return;
815     if (SPACE_OR_TAB(*s))
816         s++;
817     else
818         return;
819     while (SPACE_OR_TAB(*s))
820         s++;
821     if (!isDIGIT(*s))
822         return;
823
824     n = s;
825     while (isDIGIT(*s))
826         s++;
827     if (!SPACE_OR_TAB(*s) && *s != '\r' && *s != '\n' && *s != '\0')
828         return;
829     while (SPACE_OR_TAB(*s))
830         s++;
831     if (*s == '"' && (t = strchr(s+1, '"'))) {
832         s++;
833         e = t + 1;
834     }
835     else {
836         t = s;
837         while (!isSPACE(*t))
838             t++;
839         e = t;
840     }
841     while (SPACE_OR_TAB(*e) || *e == '\r' || *e == '\f')
842         e++;
843     if (*e != '\n' && *e != '\0')
844         return;         /* false alarm */
845
846     if (t - s > 0) {
847         const STRLEN len = t - s;
848 #ifndef USE_ITHREADS
849         SV *const temp_sv = CopFILESV(PL_curcop);
850         const char *cf;
851         STRLEN tmplen;
852
853         if (temp_sv) {
854             cf = SvPVX(temp_sv);
855             tmplen = SvCUR(temp_sv);
856         } else {
857             cf = NULL;
858             tmplen = 0;
859         }
860
861         if (tmplen > 7 && strnEQ(cf, "(eval ", 6)) {
862             /* must copy *{"::_<(eval N)[oldfilename:L]"}
863              * to *{"::_<newfilename"} */
864             /* However, the long form of evals is only turned on by the
865                debugger - usually they're "(eval %lu)" */
866             char smallbuf[128];
867             char *tmpbuf;
868             GV **gvp;
869             STRLEN tmplen2 = len;
870             if (tmplen + 2 <= sizeof smallbuf)
871                 tmpbuf = smallbuf;
872             else
873                 Newx(tmpbuf, tmplen + 2, char);
874             tmpbuf[0] = '_';
875             tmpbuf[1] = '<';
876             memcpy(tmpbuf + 2, cf, tmplen);
877             tmplen += 2;
878             gvp = (GV**)hv_fetch(PL_defstash, tmpbuf, tmplen, FALSE);
879             if (gvp) {
880                 char *tmpbuf2;
881                 GV *gv2;
882
883                 if (tmplen2 + 2 <= sizeof smallbuf)
884                     tmpbuf2 = smallbuf;
885                 else
886                     Newx(tmpbuf2, tmplen2 + 2, char);
887
888                 if (tmpbuf2 != smallbuf || tmpbuf != smallbuf) {
889                     /* Either they malloc'd it, or we malloc'd it,
890                        so no prefix is present in ours.  */
891                     tmpbuf2[0] = '_';
892                     tmpbuf2[1] = '<';
893                 }
894
895                 memcpy(tmpbuf2 + 2, s, tmplen2);
896                 tmplen2 += 2;
897
898                 gv2 = *(GV**)hv_fetch(PL_defstash, tmpbuf2, tmplen2, TRUE);
899                 if (!isGV(gv2)) {
900                     gv_init(gv2, PL_defstash, tmpbuf2, tmplen2, FALSE);
901                     /* adjust ${"::_<newfilename"} to store the new file name */
902                     GvSV(gv2) = newSVpvn(tmpbuf2 + 2, tmplen2 - 2);
903                     GvHV(gv2) = MUTABLE_HV(SvREFCNT_inc(GvHV(*gvp)));
904                     GvAV(gv2) = MUTABLE_AV(SvREFCNT_inc(GvAV(*gvp)));
905                 }
906
907                 if (tmpbuf2 != smallbuf) Safefree(tmpbuf2);
908             }
909             if (tmpbuf != smallbuf) Safefree(tmpbuf);
910         }
911 #endif
912         CopFILE_free(PL_curcop);
913         CopFILE_setn(PL_curcop, s, len);
914     }
915     CopLINE_set(PL_curcop, atoi(n)-1);
916 }
917
918 #ifdef PERL_MAD
919 /* skip space before PL_thistoken */
920
921 STATIC char *
922 S_skipspace0(pTHX_ register char *s)
923 {
924     PERL_ARGS_ASSERT_SKIPSPACE0;
925
926     s = skipspace(s);
927     if (!PL_madskills)
928         return s;
929     if (PL_skipwhite) {
930         if (!PL_thiswhite)
931             PL_thiswhite = newSVpvs("");
932         sv_catsv(PL_thiswhite, PL_skipwhite);
933         sv_free(PL_skipwhite);
934         PL_skipwhite = 0;
935     }
936     PL_realtokenstart = s - SvPVX(PL_linestr);
937     return s;
938 }
939
940 /* skip space after PL_thistoken */
941
942 STATIC char *
943 S_skipspace1(pTHX_ register char *s)
944 {
945     const char *start = s;
946     I32 startoff = start - SvPVX(PL_linestr);
947
948     PERL_ARGS_ASSERT_SKIPSPACE1;
949
950     s = skipspace(s);
951     if (!PL_madskills)
952         return s;
953     start = SvPVX(PL_linestr) + startoff;
954     if (!PL_thistoken && PL_realtokenstart >= 0) {
955         const char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
956         PL_thistoken = newSVpvn(tstart, start - tstart);
957     }
958     PL_realtokenstart = -1;
959     if (PL_skipwhite) {
960         if (!PL_nextwhite)
961             PL_nextwhite = newSVpvs("");
962         sv_catsv(PL_nextwhite, PL_skipwhite);
963         sv_free(PL_skipwhite);
964         PL_skipwhite = 0;
965     }
966     return s;
967 }
968
969 STATIC char *
970 S_skipspace2(pTHX_ register char *s, SV **svp)
971 {
972     char *start;
973     const I32 bufptroff = PL_bufptr - SvPVX(PL_linestr);
974     const I32 startoff = s - SvPVX(PL_linestr);
975
976     PERL_ARGS_ASSERT_SKIPSPACE2;
977
978     s = skipspace(s);
979     PL_bufptr = SvPVX(PL_linestr) + bufptroff;
980     if (!PL_madskills || !svp)
981         return s;
982     start = SvPVX(PL_linestr) + startoff;
983     if (!PL_thistoken && PL_realtokenstart >= 0) {
984         char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
985         PL_thistoken = newSVpvn(tstart, start - tstart);
986         PL_realtokenstart = -1;
987     }
988     if (PL_skipwhite) {
989         if (!*svp)
990             *svp = newSVpvs("");
991         sv_setsv(*svp, PL_skipwhite);
992         sv_free(PL_skipwhite);
993         PL_skipwhite = 0;
994     }
995     
996     return s;
997 }
998 #endif
999
1000 STATIC void
1001 S_update_debugger_info(pTHX_ SV *orig_sv, const char *const buf, STRLEN len)
1002 {
1003     AV *av = CopFILEAVx(PL_curcop);
1004     if (av) {
1005         SV * const sv = newSV_type(SVt_PVMG);
1006         if (orig_sv)
1007             sv_setsv(sv, orig_sv);
1008         else
1009             sv_setpvn(sv, buf, len);
1010         (void)SvIOK_on(sv);
1011         SvIV_set(sv, 0);
1012         av_store(av, (I32)CopLINE(PL_curcop), sv);
1013     }
1014 }
1015
1016 /*
1017  * S_skipspace
1018  * Called to gobble the appropriate amount and type of whitespace.
1019  * Skips comments as well.
1020  */
1021
1022 STATIC char *
1023 S_skipspace(pTHX_ register char *s)
1024 {
1025     dVAR;
1026 #ifdef PERL_MAD
1027     int curoff;
1028     int startoff = s - SvPVX(PL_linestr);
1029
1030     PERL_ARGS_ASSERT_SKIPSPACE;
1031
1032     if (PL_skipwhite) {
1033         sv_free(PL_skipwhite);
1034         PL_skipwhite = 0;
1035     }
1036 #endif
1037     PERL_ARGS_ASSERT_SKIPSPACE;
1038
1039     if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
1040         while (s < PL_bufend && SPACE_OR_TAB(*s))
1041             s++;
1042 #ifdef PERL_MAD
1043         goto done;
1044 #else
1045         return s;
1046 #endif
1047     }
1048     for (;;) {
1049         STRLEN prevlen;
1050         SSize_t oldprevlen, oldoldprevlen;
1051         SSize_t oldloplen = 0, oldunilen = 0;
1052         while (s < PL_bufend && isSPACE(*s)) {
1053             if (*s++ == '\n' && PL_in_eval && !PL_rsfp)
1054                 incline(s);
1055         }
1056
1057         /* comment */
1058         if (s < PL_bufend && *s == '#') {
1059             while (s < PL_bufend && *s != '\n')
1060                 s++;
1061             if (s < PL_bufend) {
1062                 s++;
1063                 if (PL_in_eval && !PL_rsfp) {
1064                     incline(s);
1065                     continue;
1066                 }
1067             }
1068         }
1069
1070         /* only continue to recharge the buffer if we're at the end
1071          * of the buffer, we're not reading from a source filter, and
1072          * we're in normal lexing mode
1073          */
1074         if (s < PL_bufend || !PL_rsfp || PL_sublex_info.sub_inwhat ||
1075                 PL_lex_state == LEX_FORMLINE)
1076 #ifdef PERL_MAD
1077             goto done;
1078 #else
1079             return s;
1080 #endif
1081
1082         /* try to recharge the buffer */
1083 #ifdef PERL_MAD
1084         curoff = s - SvPVX(PL_linestr);
1085 #endif
1086
1087         if ((s = filter_gets(PL_linestr, PL_rsfp,
1088                              (prevlen = SvCUR(PL_linestr)))) == NULL)
1089         {
1090 #ifdef PERL_MAD
1091             if (PL_madskills && curoff != startoff) {
1092                 if (!PL_skipwhite)
1093                     PL_skipwhite = newSVpvs("");
1094                 sv_catpvn(PL_skipwhite, SvPVX(PL_linestr) + startoff,
1095                                         curoff - startoff);
1096             }
1097
1098             /* mustn't throw out old stuff yet if madpropping */
1099             SvCUR(PL_linestr) = curoff;
1100             s = SvPVX(PL_linestr) + curoff;
1101             *s = 0;
1102             if (curoff && s[-1] == '\n')
1103                 s[-1] = ' ';
1104 #endif
1105
1106             /* end of file.  Add on the -p or -n magic */
1107             /* XXX these shouldn't really be added here, can't set PL_faketokens */
1108             if (PL_minus_p) {
1109 #ifdef PERL_MAD
1110                 sv_catpvs(PL_linestr,
1111                          ";}continue{print or die qq(-p destination: $!\\n);}");
1112 #else
1113                 sv_setpvs(PL_linestr,
1114                          ";}continue{print or die qq(-p destination: $!\\n);}");
1115 #endif
1116                 PL_minus_n = PL_minus_p = 0;
1117             }
1118             else if (PL_minus_n) {
1119 #ifdef PERL_MAD
1120                 sv_catpvs(PL_linestr, ";}");
1121 #else
1122                 sv_setpvs(PL_linestr, ";}");
1123 #endif
1124                 PL_minus_n = 0;
1125             }
1126             else
1127 #ifdef PERL_MAD
1128                 sv_catpvs(PL_linestr,";");
1129 #else
1130                 sv_setpvs(PL_linestr,";");
1131 #endif
1132
1133             /* reset variables for next time we lex */
1134             PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart
1135                 = SvPVX(PL_linestr)
1136 #ifdef PERL_MAD
1137                 + curoff
1138 #endif
1139                 ;
1140             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
1141             PL_last_lop = PL_last_uni = NULL;
1142
1143             /* Close the filehandle.  Could be from
1144              * STDIN, or a regular file.  If we were reading code from
1145              * STDIN (because the commandline held no -e or filename)
1146              * then we don't close it, we reset it so the code can
1147              * read from STDIN too.
1148              */
1149
1150             if ((PerlIO*)PL_rsfp == PerlIO_stdin())
1151                 PerlIO_clearerr(PL_rsfp);
1152             else
1153                 (void)PerlIO_close(PL_rsfp);
1154             PL_rsfp = NULL;
1155             return s;
1156         }
1157
1158         /* not at end of file, so we only read another line */
1159         /* make corresponding updates to old pointers, for yyerror() */
1160         oldprevlen = PL_oldbufptr - PL_bufend;
1161         oldoldprevlen = PL_oldoldbufptr - PL_bufend;
1162         if (PL_last_uni)
1163             oldunilen = PL_last_uni - PL_bufend;
1164         if (PL_last_lop)
1165             oldloplen = PL_last_lop - PL_bufend;
1166         PL_linestart = PL_bufptr = s + prevlen;
1167         PL_bufend = s + SvCUR(PL_linestr);
1168         s = PL_bufptr;
1169         PL_oldbufptr = s + oldprevlen;
1170         PL_oldoldbufptr = s + oldoldprevlen;
1171         if (PL_last_uni)
1172             PL_last_uni = s + oldunilen;
1173         if (PL_last_lop)
1174             PL_last_lop = s + oldloplen;
1175         incline(s);
1176
1177         /* debugger active and we're not compiling the debugger code,
1178          * so store the line into the debugger's array of lines
1179          */
1180         if ((PERLDB_LINE || PERLDB_SAVESRC) && PL_curstash != PL_debstash)
1181             update_debugger_info(NULL, PL_bufptr, PL_bufend - PL_bufptr);
1182     }
1183
1184 #ifdef PERL_MAD
1185   done:
1186     if (PL_madskills) {
1187         if (!PL_skipwhite)
1188             PL_skipwhite = newSVpvs("");
1189         curoff = s - SvPVX(PL_linestr);
1190         if (curoff - startoff)
1191             sv_catpvn(PL_skipwhite, SvPVX(PL_linestr) + startoff,
1192                                 curoff - startoff);
1193     }
1194     return s;
1195 #endif
1196 }
1197
1198 /*
1199  * S_check_uni
1200  * Check the unary operators to ensure there's no ambiguity in how they're
1201  * used.  An ambiguous piece of code would be:
1202  *     rand + 5
1203  * This doesn't mean rand() + 5.  Because rand() is a unary operator,
1204  * the +5 is its argument.
1205  */
1206
1207 STATIC void
1208 S_check_uni(pTHX)
1209 {
1210     dVAR;
1211     const char *s;
1212     const char *t;
1213
1214     if (PL_oldoldbufptr != PL_last_uni)
1215         return;
1216     while (isSPACE(*PL_last_uni))
1217         PL_last_uni++;
1218     s = PL_last_uni;
1219     while (isALNUM_lazy_if(s,UTF) || *s == '-')
1220         s++;
1221     if ((t = strchr(s, '(')) && t < PL_bufptr)
1222         return;
1223
1224     if (ckWARN_d(WARN_AMBIGUOUS)){
1225         Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
1226                    "Warning: Use of \"%.*s\" without parentheses is ambiguous",
1227                    (int)(s - PL_last_uni), PL_last_uni);
1228     }
1229 }
1230
1231 /*
1232  * LOP : macro to build a list operator.  Its behaviour has been replaced
1233  * with a subroutine, S_lop() for which LOP is just another name.
1234  */
1235
1236 #define LOP(f,x) return lop(f,x,s)
1237
1238 /*
1239  * S_lop
1240  * Build a list operator (or something that might be one).  The rules:
1241  *  - if we have a next token, then it's a list operator [why?]
1242  *  - if the next thing is an opening paren, then it's a function
1243  *  - else it's a list operator
1244  */
1245
1246 STATIC I32
1247 S_lop(pTHX_ I32 f, int x, char *s)
1248 {
1249     dVAR;
1250
1251     PERL_ARGS_ASSERT_LOP;
1252
1253     pl_yylval.ival = f;
1254     CLINE;
1255     PL_expect = x;
1256     PL_bufptr = s;
1257     PL_last_lop = PL_oldbufptr;
1258     PL_last_lop_op = (OPCODE)f;
1259 #ifdef PERL_MAD
1260     if (PL_lasttoke)
1261         return REPORT(LSTOP);
1262 #else
1263     if (PL_nexttoke)
1264         return REPORT(LSTOP);
1265 #endif
1266     if (*s == '(')
1267         return REPORT(FUNC);
1268     s = PEEKSPACE(s);
1269     if (*s == '(')
1270         return REPORT(FUNC);
1271     else
1272         return REPORT(LSTOP);
1273 }
1274
1275 #ifdef PERL_MAD
1276  /*
1277  * S_start_force
1278  * Sets up for an eventual force_next().  start_force(0) basically does
1279  * an unshift, while start_force(-1) does a push.  yylex removes items
1280  * on the "pop" end.
1281  */
1282
1283 STATIC void
1284 S_start_force(pTHX_ int where)
1285 {
1286     int i;
1287
1288     if (where < 0)      /* so people can duplicate start_force(PL_curforce) */
1289         where = PL_lasttoke;
1290     assert(PL_curforce < 0 || PL_curforce == where);
1291     if (PL_curforce != where) {
1292         for (i = PL_lasttoke; i > where; --i) {
1293             PL_nexttoke[i] = PL_nexttoke[i-1];
1294         }
1295         PL_lasttoke++;
1296     }
1297     if (PL_curforce < 0)        /* in case of duplicate start_force() */
1298         Zero(&PL_nexttoke[where], 1, NEXTTOKE);
1299     PL_curforce = where;
1300     if (PL_nextwhite) {
1301         if (PL_madskills)
1302             curmad('^', newSVpvs(""));
1303         CURMAD('_', PL_nextwhite);
1304     }
1305 }
1306
1307 STATIC void
1308 S_curmad(pTHX_ char slot, SV *sv)
1309 {
1310     MADPROP **where;
1311
1312     if (!sv)
1313         return;
1314     if (PL_curforce < 0)
1315         where = &PL_thismad;
1316     else
1317         where = &PL_nexttoke[PL_curforce].next_mad;
1318
1319     if (PL_faketokens)
1320         sv_setpvs(sv, "");
1321     else {
1322         if (!IN_BYTES) {
1323             if (UTF && is_utf8_string((U8*)SvPVX(sv), SvCUR(sv)))
1324                 SvUTF8_on(sv);
1325             else if (PL_encoding) {
1326                 sv_recode_to_utf8(sv, PL_encoding);
1327             }
1328         }
1329     }
1330
1331     /* keep a slot open for the head of the list? */
1332     if (slot != '_' && *where && (*where)->mad_key == '^') {
1333         (*where)->mad_key = slot;
1334         sv_free(MUTABLE_SV(((*where)->mad_val)));
1335         (*where)->mad_val = (void*)sv;
1336     }
1337     else
1338         addmad(newMADsv(slot, sv), where, 0);
1339 }
1340 #else
1341 #  define start_force(where)    NOOP
1342 #  define curmad(slot, sv)      NOOP
1343 #endif
1344
1345 /*
1346  * S_force_next
1347  * When the lexer realizes it knows the next token (for instance,
1348  * it is reordering tokens for the parser) then it can call S_force_next
1349  * to know what token to return the next time the lexer is called.  Caller
1350  * will need to set PL_nextval[] (or PL_nexttoke[].next_val with PERL_MAD),
1351  * and possibly PL_expect to ensure the lexer handles the token correctly.
1352  */
1353
1354 STATIC void
1355 S_force_next(pTHX_ I32 type)
1356 {
1357     dVAR;
1358 #ifdef DEBUGGING
1359     if (DEBUG_T_TEST) {
1360         PerlIO_printf(Perl_debug_log, "### forced token:\n");
1361         tokereport(type, &NEXTVAL_NEXTTOKE);
1362     }
1363 #endif
1364 #ifdef PERL_MAD
1365     if (PL_curforce < 0)
1366         start_force(PL_lasttoke);
1367     PL_nexttoke[PL_curforce].next_type = type;
1368     if (PL_lex_state != LEX_KNOWNEXT)
1369         PL_lex_defer = PL_lex_state;
1370     PL_lex_state = LEX_KNOWNEXT;
1371     PL_lex_expect = PL_expect;
1372     PL_curforce = -1;
1373 #else
1374     PL_nexttype[PL_nexttoke] = type;
1375     PL_nexttoke++;
1376     if (PL_lex_state != LEX_KNOWNEXT) {
1377         PL_lex_defer = PL_lex_state;
1378         PL_lex_expect = PL_expect;
1379         PL_lex_state = LEX_KNOWNEXT;
1380     }
1381 #endif
1382 }
1383
1384 STATIC SV *
1385 S_newSV_maybe_utf8(pTHX_ const char *const start, STRLEN len)
1386 {
1387     dVAR;
1388     SV * const sv = newSVpvn_utf8(start, len,
1389                                   UTF && !IN_BYTES
1390                                   && is_utf8_string((const U8*)start, len));
1391     return sv;
1392 }
1393
1394 /*
1395  * S_force_word
1396  * When the lexer knows the next thing is a word (for instance, it has
1397  * just seen -> and it knows that the next char is a word char, then
1398  * it calls S_force_word to stick the next word into the PL_nexttoke/val
1399  * lookahead.
1400  *
1401  * Arguments:
1402  *   char *start : buffer position (must be within PL_linestr)
1403  *   int token   : PL_next* will be this type of bare word (e.g., METHOD,WORD)
1404  *   int check_keyword : if true, Perl checks to make sure the word isn't
1405  *       a keyword (do this if the word is a label, e.g. goto FOO)
1406  *   int allow_pack : if true, : characters will also be allowed (require,
1407  *       use, etc. do this)
1408  *   int allow_initial_tick : used by the "sub" lexer only.
1409  */
1410
1411 STATIC char *
1412 S_force_word(pTHX_ register char *start, int token, int check_keyword, int allow_pack, int allow_initial_tick)
1413 {
1414     dVAR;
1415     register char *s;
1416     STRLEN len;
1417
1418     PERL_ARGS_ASSERT_FORCE_WORD;
1419
1420     start = SKIPSPACE1(start);
1421     s = start;
1422     if (isIDFIRST_lazy_if(s,UTF) ||
1423         (allow_pack && *s == ':') ||
1424         (allow_initial_tick && *s == '\'') )
1425     {
1426         s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, allow_pack, &len);
1427         if (check_keyword && keyword(PL_tokenbuf, len, 0))
1428             return start;
1429         start_force(PL_curforce);
1430         if (PL_madskills)
1431             curmad('X', newSVpvn(start,s-start));
1432         if (token == METHOD) {
1433             s = SKIPSPACE1(s);
1434             if (*s == '(')
1435                 PL_expect = XTERM;
1436             else {
1437                 PL_expect = XOPERATOR;
1438             }
1439         }
1440         if (PL_madskills)
1441             curmad('g', newSVpvs( "forced" ));
1442         NEXTVAL_NEXTTOKE.opval
1443             = (OP*)newSVOP(OP_CONST,0,
1444                            S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
1445         NEXTVAL_NEXTTOKE.opval->op_private |= OPpCONST_BARE;
1446         force_next(token);
1447     }
1448     return s;
1449 }
1450
1451 /*
1452  * S_force_ident
1453  * Called when the lexer wants $foo *foo &foo etc, but the program
1454  * text only contains the "foo" portion.  The first argument is a pointer
1455  * to the "foo", and the second argument is the type symbol to prefix.
1456  * Forces the next token to be a "WORD".
1457  * Creates the symbol if it didn't already exist (via gv_fetchpv()).
1458  */
1459
1460 STATIC void
1461 S_force_ident(pTHX_ register const char *s, int kind)
1462 {
1463     dVAR;
1464
1465     PERL_ARGS_ASSERT_FORCE_IDENT;
1466
1467     if (*s) {
1468         const STRLEN len = strlen(s);
1469         OP* const o = (OP*)newSVOP(OP_CONST, 0, newSVpvn(s, len));
1470         start_force(PL_curforce);
1471         NEXTVAL_NEXTTOKE.opval = o;
1472         force_next(WORD);
1473         if (kind) {
1474             o->op_private = OPpCONST_ENTERED;
1475             /* XXX see note in pp_entereval() for why we forgo typo
1476                warnings if the symbol must be introduced in an eval.
1477                GSAR 96-10-12 */
1478             gv_fetchpvn_flags(s, len,
1479                               PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL)
1480                               : GV_ADD,
1481                               kind == '$' ? SVt_PV :
1482                               kind == '@' ? SVt_PVAV :
1483                               kind == '%' ? SVt_PVHV :
1484                               SVt_PVGV
1485                               );
1486         }
1487     }
1488 }
1489
1490 NV
1491 Perl_str_to_version(pTHX_ SV *sv)
1492 {
1493     NV retval = 0.0;
1494     NV nshift = 1.0;
1495     STRLEN len;
1496     const char *start = SvPV_const(sv,len);
1497     const char * const end = start + len;
1498     const bool utf = SvUTF8(sv) ? TRUE : FALSE;
1499
1500     PERL_ARGS_ASSERT_STR_TO_VERSION;
1501
1502     while (start < end) {
1503         STRLEN skip;
1504         UV n;
1505         if (utf)
1506             n = utf8n_to_uvchr((U8*)start, len, &skip, 0);
1507         else {
1508             n = *(U8*)start;
1509             skip = 1;
1510         }
1511         retval += ((NV)n)/nshift;
1512         start += skip;
1513         nshift *= 1000;
1514     }
1515     return retval;
1516 }
1517
1518 /*
1519  * S_force_version
1520  * Forces the next token to be a version number.
1521  * If the next token appears to be an invalid version number, (e.g. "v2b"),
1522  * and if "guessing" is TRUE, then no new token is created (and the caller
1523  * must use an alternative parsing method).
1524  */
1525
1526 STATIC char *
1527 S_force_version(pTHX_ char *s, int guessing)
1528 {
1529     dVAR;
1530     OP *version = NULL;
1531     char *d;
1532 #ifdef PERL_MAD
1533     I32 startoff = s - SvPVX(PL_linestr);
1534 #endif
1535
1536     PERL_ARGS_ASSERT_FORCE_VERSION;
1537
1538     s = SKIPSPACE1(s);
1539
1540     d = s;
1541     if (*d == 'v')
1542         d++;
1543     if (isDIGIT(*d)) {
1544         while (isDIGIT(*d) || *d == '_' || *d == '.')
1545             d++;
1546 #ifdef PERL_MAD
1547         if (PL_madskills) {
1548             start_force(PL_curforce);
1549             curmad('X', newSVpvn(s,d-s));
1550         }
1551 #endif
1552         if (*d == ';' || isSPACE(*d) || *d == '}' || !*d) {
1553             SV *ver;
1554             s = scan_num(s, &pl_yylval);
1555             version = pl_yylval.opval;
1556             ver = cSVOPx(version)->op_sv;
1557             if (SvPOK(ver) && !SvNIOK(ver)) {
1558                 SvUPGRADE(ver, SVt_PVNV);
1559                 SvNV_set(ver, str_to_version(ver));
1560                 SvNOK_on(ver);          /* hint that it is a version */
1561             }
1562         }
1563         else if (guessing) {
1564 #ifdef PERL_MAD
1565             if (PL_madskills) {
1566                 sv_free(PL_nextwhite);  /* let next token collect whitespace */
1567                 PL_nextwhite = 0;
1568                 s = SvPVX(PL_linestr) + startoff;
1569             }
1570 #endif
1571             return s;
1572         }
1573     }
1574
1575 #ifdef PERL_MAD
1576     if (PL_madskills && !version) {
1577         sv_free(PL_nextwhite);  /* let next token collect whitespace */
1578         PL_nextwhite = 0;
1579         s = SvPVX(PL_linestr) + startoff;
1580     }
1581 #endif
1582     /* NOTE: The parser sees the package name and the VERSION swapped */
1583     start_force(PL_curforce);
1584     NEXTVAL_NEXTTOKE.opval = version;
1585     force_next(WORD);
1586
1587     return s;
1588 }
1589
1590 /*
1591  * S_tokeq
1592  * Tokenize a quoted string passed in as an SV.  It finds the next
1593  * chunk, up to end of string or a backslash.  It may make a new
1594  * SV containing that chunk (if HINT_NEW_STRING is on).  It also
1595  * turns \\ into \.
1596  */
1597
1598 STATIC SV *
1599 S_tokeq(pTHX_ SV *sv)
1600 {
1601     dVAR;
1602     register char *s;
1603     register char *send;
1604     register char *d;
1605     STRLEN len = 0;
1606     SV *pv = sv;
1607
1608     PERL_ARGS_ASSERT_TOKEQ;
1609
1610     if (!SvLEN(sv))
1611         goto finish;
1612
1613     s = SvPV_force(sv, len);
1614     if (SvTYPE(sv) >= SVt_PVIV && SvIVX(sv) == -1)
1615         goto finish;
1616     send = s + len;
1617     while (s < send && *s != '\\')
1618         s++;
1619     if (s == send)
1620         goto finish;
1621     d = s;
1622     if ( PL_hints & HINT_NEW_STRING ) {
1623         pv = newSVpvn_flags(SvPVX_const(pv), len, SVs_TEMP | SvUTF8(sv));
1624     }
1625     while (s < send) {
1626         if (*s == '\\') {
1627             if (s + 1 < send && (s[1] == '\\'))
1628                 s++;            /* all that, just for this */
1629         }
1630         *d++ = *s++;
1631     }
1632     *d = '\0';
1633     SvCUR_set(sv, d - SvPVX_const(sv));
1634   finish:
1635     if ( PL_hints & HINT_NEW_STRING )
1636        return new_constant(NULL, 0, "q", sv, pv, "q", 1);
1637     return sv;
1638 }
1639
1640 /*
1641  * Now come three functions related to double-quote context,
1642  * S_sublex_start, S_sublex_push, and S_sublex_done.  They're used when
1643  * converting things like "\u\Lgnat" into ucfirst(lc("gnat")).  They
1644  * interact with PL_lex_state, and create fake ( ... ) argument lists
1645  * to handle functions and concatenation.
1646  * They assume that whoever calls them will be setting up a fake
1647  * join call, because each subthing puts a ',' after it.  This lets
1648  *   "lower \luPpEr"
1649  * become
1650  *  join($, , 'lower ', lcfirst( 'uPpEr', ) ,)
1651  *
1652  * (I'm not sure whether the spurious commas at the end of lcfirst's
1653  * arguments and join's arguments are created or not).
1654  */
1655
1656 /*
1657  * S_sublex_start
1658  * Assumes that pl_yylval.ival is the op we're creating (e.g. OP_LCFIRST).
1659  *
1660  * Pattern matching will set PL_lex_op to the pattern-matching op to
1661  * make (we return THING if pl_yylval.ival is OP_NULL, PMFUNC otherwise).
1662  *
1663  * OP_CONST and OP_READLINE are easy--just make the new op and return.
1664  *
1665  * Everything else becomes a FUNC.
1666  *
1667  * Sets PL_lex_state to LEX_INTERPPUSH unless (ival was OP_NULL or we
1668  * had an OP_CONST or OP_READLINE).  This just sets us up for a
1669  * call to S_sublex_push().
1670  */
1671
1672 STATIC I32
1673 S_sublex_start(pTHX)
1674 {
1675     dVAR;
1676     register const I32 op_type = pl_yylval.ival;
1677
1678     if (op_type == OP_NULL) {
1679         pl_yylval.opval = PL_lex_op;
1680         PL_lex_op = NULL;
1681         return THING;
1682     }
1683     if (op_type == OP_CONST || op_type == OP_READLINE) {
1684         SV *sv = tokeq(PL_lex_stuff);
1685
1686         if (SvTYPE(sv) == SVt_PVIV) {
1687             /* Overloaded constants, nothing fancy: Convert to SVt_PV: */
1688             STRLEN len;
1689             const char * const p = SvPV_const(sv, len);
1690             SV * const nsv = newSVpvn_flags(p, len, SvUTF8(sv));
1691             SvREFCNT_dec(sv);
1692             sv = nsv;
1693         }
1694         pl_yylval.opval = (OP*)newSVOP(op_type, 0, sv);
1695         PL_lex_stuff = NULL;
1696         /* Allow <FH> // "foo" */
1697         if (op_type == OP_READLINE)
1698             PL_expect = XTERMORDORDOR;
1699         return THING;
1700     }
1701     else if (op_type == OP_BACKTICK && PL_lex_op) {
1702         /* readpipe() vas overriden */
1703         cSVOPx(cLISTOPx(cUNOPx(PL_lex_op)->op_first)->op_first->op_sibling)->op_sv = tokeq(PL_lex_stuff);
1704         pl_yylval.opval = PL_lex_op;
1705         PL_lex_op = NULL;
1706         PL_lex_stuff = NULL;
1707         return THING;
1708     }
1709
1710     PL_sublex_info.super_state = PL_lex_state;
1711     PL_sublex_info.sub_inwhat = (U16)op_type;
1712     PL_sublex_info.sub_op = PL_lex_op;
1713     PL_lex_state = LEX_INTERPPUSH;
1714
1715     PL_expect = XTERM;
1716     if (PL_lex_op) {
1717         pl_yylval.opval = PL_lex_op;
1718         PL_lex_op = NULL;
1719         return PMFUNC;
1720     }
1721     else
1722         return FUNC;
1723 }
1724
1725 /*
1726  * S_sublex_push
1727  * Create a new scope to save the lexing state.  The scope will be
1728  * ended in S_sublex_done.  Returns a '(', starting the function arguments
1729  * to the uc, lc, etc. found before.
1730  * Sets PL_lex_state to LEX_INTERPCONCAT.
1731  */
1732
1733 STATIC I32
1734 S_sublex_push(pTHX)
1735 {
1736     dVAR;
1737     ENTER;
1738
1739     PL_lex_state = PL_sublex_info.super_state;
1740     SAVEBOOL(PL_lex_dojoin);
1741     SAVEI32(PL_lex_brackets);
1742     SAVEI32(PL_lex_casemods);
1743     SAVEI32(PL_lex_starts);
1744     SAVEI8(PL_lex_state);
1745     SAVEVPTR(PL_lex_inpat);
1746     SAVEI16(PL_lex_inwhat);
1747     SAVECOPLINE(PL_curcop);
1748     SAVEPPTR(PL_bufptr);
1749     SAVEPPTR(PL_bufend);
1750     SAVEPPTR(PL_oldbufptr);
1751     SAVEPPTR(PL_oldoldbufptr);
1752     SAVEPPTR(PL_last_lop);
1753     SAVEPPTR(PL_last_uni);
1754     SAVEPPTR(PL_linestart);
1755     SAVESPTR(PL_linestr);
1756     SAVEGENERICPV(PL_lex_brackstack);
1757     SAVEGENERICPV(PL_lex_casestack);
1758
1759     PL_linestr = PL_lex_stuff;
1760     PL_lex_stuff = NULL;
1761
1762     PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart
1763         = SvPVX(PL_linestr);
1764     PL_bufend += SvCUR(PL_linestr);
1765     PL_last_lop = PL_last_uni = NULL;
1766     SAVEFREESV(PL_linestr);
1767
1768     PL_lex_dojoin = FALSE;
1769     PL_lex_brackets = 0;
1770     Newx(PL_lex_brackstack, 120, char);
1771     Newx(PL_lex_casestack, 12, char);
1772     PL_lex_casemods = 0;
1773     *PL_lex_casestack = '\0';
1774     PL_lex_starts = 0;
1775     PL_lex_state = LEX_INTERPCONCAT;
1776     CopLINE_set(PL_curcop, (line_t)PL_multi_start);
1777
1778     PL_lex_inwhat = PL_sublex_info.sub_inwhat;
1779     if (PL_lex_inwhat == OP_MATCH || PL_lex_inwhat == OP_QR || PL_lex_inwhat == OP_SUBST)
1780         PL_lex_inpat = PL_sublex_info.sub_op;
1781     else
1782         PL_lex_inpat = NULL;
1783
1784     return '(';
1785 }
1786
1787 /*
1788  * S_sublex_done
1789  * Restores lexer state after a S_sublex_push.
1790  */
1791
1792 STATIC I32
1793 S_sublex_done(pTHX)
1794 {
1795     dVAR;
1796     if (!PL_lex_starts++) {
1797         SV * const sv = newSVpvs("");
1798         if (SvUTF8(PL_linestr))
1799             SvUTF8_on(sv);
1800         PL_expect = XOPERATOR;
1801         pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
1802         return THING;
1803     }
1804
1805     if (PL_lex_casemods) {              /* oops, we've got some unbalanced parens */
1806         PL_lex_state = LEX_INTERPCASEMOD;
1807         return yylex();
1808     }
1809
1810     /* Is there a right-hand side to take care of? (s//RHS/ or tr//RHS/) */
1811     if (PL_lex_repl && (PL_lex_inwhat == OP_SUBST || PL_lex_inwhat == OP_TRANS)) {
1812         PL_linestr = PL_lex_repl;
1813         PL_lex_inpat = 0;
1814         PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
1815         PL_bufend += SvCUR(PL_linestr);
1816         PL_last_lop = PL_last_uni = NULL;
1817         SAVEFREESV(PL_linestr);
1818         PL_lex_dojoin = FALSE;
1819         PL_lex_brackets = 0;
1820         PL_lex_casemods = 0;
1821         *PL_lex_casestack = '\0';
1822         PL_lex_starts = 0;
1823         if (SvEVALED(PL_lex_repl)) {
1824             PL_lex_state = LEX_INTERPNORMAL;
1825             PL_lex_starts++;
1826             /*  we don't clear PL_lex_repl here, so that we can check later
1827                 whether this is an evalled subst; that means we rely on the
1828                 logic to ensure sublex_done() is called again only via the
1829                 branch (in yylex()) that clears PL_lex_repl, else we'll loop */
1830         }
1831         else {
1832             PL_lex_state = LEX_INTERPCONCAT;
1833             PL_lex_repl = NULL;
1834         }
1835         return ',';
1836     }
1837     else {
1838 #ifdef PERL_MAD
1839         if (PL_madskills) {
1840             if (PL_thiswhite) {
1841                 if (!PL_endwhite)
1842                     PL_endwhite = newSVpvs("");
1843                 sv_catsv(PL_endwhite, PL_thiswhite);
1844                 PL_thiswhite = 0;
1845             }
1846             if (PL_thistoken)
1847                 sv_setpvs(PL_thistoken,"");
1848             else
1849                 PL_realtokenstart = -1;
1850         }
1851 #endif
1852         LEAVE;
1853         PL_bufend = SvPVX(PL_linestr);
1854         PL_bufend += SvCUR(PL_linestr);
1855         PL_expect = XOPERATOR;
1856         PL_sublex_info.sub_inwhat = 0;
1857         return ')';
1858     }
1859 }
1860
1861 /*
1862   scan_const
1863
1864   Extracts a pattern, double-quoted string, or transliteration.  This
1865   is terrifying code.
1866
1867   It looks at PL_lex_inwhat and PL_lex_inpat to find out whether it's
1868   processing a pattern (PL_lex_inpat is true), a transliteration
1869   (PL_lex_inwhat == OP_TRANS is true), or a double-quoted string.
1870
1871   Returns a pointer to the character scanned up to. If this is
1872   advanced from the start pointer supplied (i.e. if anything was
1873   successfully parsed), will leave an OP for the substring scanned
1874   in pl_yylval. Caller must intuit reason for not parsing further
1875   by looking at the next characters herself.
1876
1877   In patterns:
1878     backslashes:
1879       double-quoted style: \r and \n
1880       regexp special ones: \D \s
1881       constants: \x31
1882       backrefs: \1
1883       case and quoting: \U \Q \E
1884     stops on @ and $, but not for $ as tail anchor
1885
1886   In transliterations:
1887     characters are VERY literal, except for - not at the start or end
1888     of the string, which indicates a range. If the range is in bytes,
1889     scan_const expands the range to the full set of intermediate
1890     characters. If the range is in utf8, the hyphen is replaced with
1891     a certain range mark which will be handled by pmtrans() in op.c.
1892
1893   In double-quoted strings:
1894     backslashes:
1895       double-quoted style: \r and \n
1896       constants: \x31
1897       deprecated backrefs: \1 (in substitution replacements)
1898       case and quoting: \U \Q \E
1899     stops on @ and $
1900
1901   scan_const does *not* construct ops to handle interpolated strings.
1902   It stops processing as soon as it finds an embedded $ or @ variable
1903   and leaves it to the caller to work out what's going on.
1904
1905   embedded arrays (whether in pattern or not) could be:
1906       @foo, @::foo, @'foo, @{foo}, @$foo, @+, @-.
1907
1908   $ in double-quoted strings must be the symbol of an embedded scalar.
1909
1910   $ in pattern could be $foo or could be tail anchor.  Assumption:
1911   it's a tail anchor if $ is the last thing in the string, or if it's
1912   followed by one of "()| \r\n\t"
1913
1914   \1 (backreferences) are turned into $1
1915
1916   The structure of the code is
1917       while (there's a character to process) {
1918           handle transliteration ranges
1919           skip regexp comments /(?#comment)/ and codes /(?{code})/
1920           skip #-initiated comments in //x patterns
1921           check for embedded arrays
1922           check for embedded scalars
1923           if (backslash) {
1924               leave intact backslashes from leaveit (below)
1925               deprecate \1 in substitution replacements
1926               handle string-changing backslashes \l \U \Q \E, etc.
1927               switch (what was escaped) {
1928                   handle \- in a transliteration (becomes a literal -)
1929                   handle \132 (octal characters)
1930                   handle \x15 and \x{1234} (hex characters)
1931                   handle \N{name} (named characters)
1932                   handle \cV (control characters)
1933                   handle printf-style backslashes (\f, \r, \n, etc)
1934               } (end switch)
1935           } (end if backslash)
1936     } (end while character to read)
1937                 
1938 */
1939
1940 STATIC char *
1941 S_scan_const(pTHX_ char *start)
1942 {
1943     dVAR;
1944     register char *send = PL_bufend;            /* end of the constant */
1945     SV *sv = newSV(send - start);               /* sv for the constant */
1946     register char *s = start;                   /* start of the constant */
1947     register char *d = SvPVX(sv);               /* destination for copies */
1948     bool dorange = FALSE;                       /* are we in a translit range? */
1949     bool didrange = FALSE;                      /* did we just finish a range? */
1950     I32  has_utf8 = FALSE;                      /* Output constant is UTF8 */
1951     I32  this_utf8 = UTF;                       /* The source string is assumed to be UTF8 */
1952     UV uv;
1953 #ifdef EBCDIC
1954     UV literal_endpoint = 0;
1955     bool native_range = TRUE; /* turned to FALSE if the first endpoint is Unicode. */
1956 #endif
1957
1958     PERL_ARGS_ASSERT_SCAN_CONST;
1959
1960     if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
1961         /* If we are doing a trans and we know we want UTF8 set expectation */
1962         has_utf8   = PL_sublex_info.sub_op->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF);
1963         this_utf8  = PL_sublex_info.sub_op->op_private & (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
1964     }
1965
1966
1967     while (s < send || dorange) {
1968         /* get transliterations out of the way (they're most literal) */
1969         if (PL_lex_inwhat == OP_TRANS) {
1970             /* expand a range A-Z to the full set of characters.  AIE! */
1971             if (dorange) {
1972                 I32 i;                          /* current expanded character */
1973                 I32 min;                        /* first character in range */
1974                 I32 max;                        /* last character in range */
1975
1976 #ifdef EBCDIC
1977                 UV uvmax = 0;
1978 #endif
1979
1980                 if (has_utf8
1981 #ifdef EBCDIC
1982                     && !native_range
1983 #endif
1984                     ) {
1985                     char * const c = (char*)utf8_hop((U8*)d, -1);
1986                     char *e = d++;
1987                     while (e-- > c)
1988                         *(e + 1) = *e;
1989                     *c = (char)UTF_TO_NATIVE(0xff);
1990                     /* mark the range as done, and continue */
1991                     dorange = FALSE;
1992                     didrange = TRUE;
1993                     continue;
1994                 }
1995
1996                 i = d - SvPVX_const(sv);                /* remember current offset */
1997 #ifdef EBCDIC
1998                 SvGROW(sv,
1999                        SvLEN(sv) + (has_utf8 ?
2000                                     (512 - UTF_CONTINUATION_MARK +
2001                                      UNISKIP(0x100))
2002                                     : 256));
2003                 /* How many two-byte within 0..255: 128 in UTF-8,
2004                  * 96 in UTF-8-mod. */
2005 #else
2006                 SvGROW(sv, SvLEN(sv) + 256);    /* never more than 256 chars in a range */
2007 #endif
2008                 d = SvPVX(sv) + i;              /* refresh d after realloc */
2009 #ifdef EBCDIC
2010                 if (has_utf8) {
2011                     int j;
2012                     for (j = 0; j <= 1; j++) {
2013                         char * const c = (char*)utf8_hop((U8*)d, -1);
2014                         const UV uv    = utf8n_to_uvchr((U8*)c, d - c, NULL, 0);
2015                         if (j)
2016                             min = (U8)uv;
2017                         else if (uv < 256)
2018                             max = (U8)uv;
2019                         else {
2020                             max = (U8)0xff; /* only to \xff */
2021                             uvmax = uv; /* \x{100} to uvmax */
2022                         }
2023                         d = c; /* eat endpoint chars */
2024                      }
2025                 }
2026                else {
2027 #endif
2028                    d -= 2;              /* eat the first char and the - */
2029                    min = (U8)*d;        /* first char in range */
2030                    max = (U8)d[1];      /* last char in range  */
2031 #ifdef EBCDIC
2032                }
2033 #endif
2034
2035                 if (min > max) {
2036                     Perl_croak(aTHX_
2037                                "Invalid range \"%c-%c\" in transliteration operator",
2038                                (char)min, (char)max);
2039                 }
2040
2041 #ifdef EBCDIC
2042                 if (literal_endpoint == 2 &&
2043                     ((isLOWER(min) && isLOWER(max)) ||
2044                      (isUPPER(min) && isUPPER(max)))) {
2045                     if (isLOWER(min)) {
2046                         for (i = min; i <= max; i++)
2047                             if (isLOWER(i))
2048                                 *d++ = NATIVE_TO_NEED(has_utf8,i);
2049                     } else {
2050                         for (i = min; i <= max; i++)
2051                             if (isUPPER(i))
2052                                 *d++ = NATIVE_TO_NEED(has_utf8,i);
2053                     }
2054                 }
2055                 else
2056 #endif
2057                     for (i = min; i <= max; i++)
2058 #ifdef EBCDIC
2059                         if (has_utf8) {
2060                             const U8 ch = (U8)NATIVE_TO_UTF(i);
2061                             if (UNI_IS_INVARIANT(ch))
2062                                 *d++ = (U8)i;
2063                             else {
2064                                 *d++ = (U8)UTF8_EIGHT_BIT_HI(ch);
2065                                 *d++ = (U8)UTF8_EIGHT_BIT_LO(ch);
2066                             }
2067                         }
2068                         else
2069 #endif
2070                             *d++ = (char)i;
2071  
2072 #ifdef EBCDIC
2073                 if (uvmax) {
2074                     d = (char*)uvchr_to_utf8((U8*)d, 0x100);
2075                     if (uvmax > 0x101)
2076                         *d++ = (char)UTF_TO_NATIVE(0xff);
2077                     if (uvmax > 0x100)
2078                         d = (char*)uvchr_to_utf8((U8*)d, uvmax);
2079                 }
2080 #endif
2081
2082                 /* mark the range as done, and continue */
2083                 dorange = FALSE;
2084                 didrange = TRUE;
2085 #ifdef EBCDIC
2086                 literal_endpoint = 0;
2087 #endif
2088                 continue;
2089             }
2090
2091             /* range begins (ignore - as first or last char) */
2092             else if (*s == '-' && s+1 < send  && s != start) {
2093                 if (didrange) {
2094                     Perl_croak(aTHX_ "Ambiguous range in transliteration operator");
2095                 }
2096                 if (has_utf8
2097 #ifdef EBCDIC
2098                     && !native_range
2099 #endif
2100                     ) {
2101                     *d++ = (char)UTF_TO_NATIVE(0xff);   /* use illegal utf8 byte--see pmtrans */
2102                     s++;
2103                     continue;
2104                 }
2105                 dorange = TRUE;
2106                 s++;
2107             }
2108             else {
2109                 didrange = FALSE;
2110 #ifdef EBCDIC
2111                 literal_endpoint = 0;
2112                 native_range = TRUE;
2113 #endif
2114             }
2115         }
2116
2117         /* if we get here, we're not doing a transliteration */
2118
2119         /* skip for regexp comments /(?#comment)/ and code /(?{code})/,
2120            except for the last char, which will be done separately. */
2121         else if (*s == '(' && PL_lex_inpat && s[1] == '?') {
2122             if (s[2] == '#') {
2123                 while (s+1 < send && *s != ')')
2124                     *d++ = NATIVE_TO_NEED(has_utf8,*s++);
2125             }
2126             else if (s[2] == '{' /* This should match regcomp.c */
2127                     || (s[2] == '?' && s[3] == '{'))
2128             {
2129                 I32 count = 1;
2130                 char *regparse = s + (s[2] == '{' ? 3 : 4);
2131                 char c;
2132
2133                 while (count && (c = *regparse)) {
2134                     if (c == '\\' && regparse[1])
2135                         regparse++;
2136                     else if (c == '{')
2137                         count++;
2138                     else if (c == '}')
2139                         count--;
2140                     regparse++;
2141                 }
2142                 if (*regparse != ')')
2143                     regparse--;         /* Leave one char for continuation. */
2144                 while (s < regparse)
2145                     *d++ = NATIVE_TO_NEED(has_utf8,*s++);
2146             }
2147         }
2148
2149         /* likewise skip #-initiated comments in //x patterns */
2150         else if (*s == '#' && PL_lex_inpat &&
2151           ((PMOP*)PL_lex_inpat)->op_pmflags & PMf_EXTENDED) {
2152             while (s+1 < send && *s != '\n')
2153                 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
2154         }
2155
2156         /* check for embedded arrays
2157            (@foo, @::foo, @'foo, @{foo}, @$foo, @+, @-)
2158            */
2159         else if (*s == '@' && s[1]) {
2160             if (isALNUM_lazy_if(s+1,UTF))
2161                 break;
2162             if (strchr(":'{$", s[1]))
2163                 break;
2164             if (!PL_lex_inpat && (s[1] == '+' || s[1] == '-'))
2165                 break; /* in regexp, neither @+ nor @- are interpolated */
2166         }
2167
2168         /* check for embedded scalars.  only stop if we're sure it's a
2169            variable.
2170         */
2171         else if (*s == '$') {
2172             if (!PL_lex_inpat)  /* not a regexp, so $ must be var */
2173                 break;
2174             if (s + 1 < send && !strchr("()| \r\n\t", s[1])) {
2175                 if (s[1] == '\\' && ckWARN(WARN_AMBIGUOUS)) {
2176                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
2177                                 "Possible unintended interpolation of $\\ in regex");
2178                 }
2179                 break;          /* in regexp, $ might be tail anchor */
2180             }
2181         }
2182
2183         /* End of else if chain - OP_TRANS rejoin rest */
2184
2185         /* backslashes */
2186         if (*s == '\\' && s+1 < send) {
2187             s++;
2188
2189             /* deprecate \1 in strings and substitution replacements */
2190             if (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat &&
2191                 isDIGIT(*s) && *s != '0' && !isDIGIT(s[1]))
2192             {
2193                 if (ckWARN(WARN_SYNTAX))
2194                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "\\%c better written as $%c", *s, *s);
2195                 *--s = '$';
2196                 break;
2197             }
2198
2199             /* string-change backslash escapes */
2200             if (PL_lex_inwhat != OP_TRANS && *s && strchr("lLuUEQ", *s)) {
2201                 --s;
2202                 break;
2203             }
2204             /* skip any other backslash escapes in a pattern */
2205             else if (PL_lex_inpat) {
2206                 *d++ = NATIVE_TO_NEED(has_utf8,'\\');
2207                 goto default_action;
2208             }
2209
2210             /* if we get here, it's either a quoted -, or a digit */
2211             switch (*s) {
2212
2213             /* quoted - in transliterations */
2214             case '-':
2215                 if (PL_lex_inwhat == OP_TRANS) {
2216                     *d++ = *s++;
2217                     continue;
2218                 }
2219                 /* FALL THROUGH */
2220             default:
2221                 {
2222                     if ((isALPHA(*s) || isDIGIT(*s)) &&
2223                         ckWARN(WARN_MISC))
2224                         Perl_warner(aTHX_ packWARN(WARN_MISC),
2225                                     "Unrecognized escape \\%c passed through",
2226                                     *s);
2227                     /* default action is to copy the quoted character */
2228                     goto default_action;
2229                 }
2230
2231             /* \132 indicates an octal constant */
2232             case '0': case '1': case '2': case '3':
2233             case '4': case '5': case '6': case '7':
2234                 {
2235                     I32 flags = 0;
2236                     STRLEN len = 3;
2237                     uv = grok_oct(s, &len, &flags, NULL);
2238                     s += len;
2239                 }
2240                 goto NUM_ESCAPE_INSERT;
2241
2242             /* \x24 indicates a hex constant */
2243             case 'x':
2244                 ++s;
2245                 if (*s == '{') {
2246                     char* const e = strchr(s, '}');
2247                     I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
2248                       PERL_SCAN_DISALLOW_PREFIX;
2249                     STRLEN len;
2250
2251                     ++s;
2252                     if (!e) {
2253                         yyerror("Missing right brace on \\x{}");
2254                         continue;
2255                     }
2256                     len = e - s;
2257                     uv = grok_hex(s, &len, &flags, NULL);
2258                     s = e + 1;
2259                 }
2260                 else {
2261                     {
2262                         STRLEN len = 2;
2263                         I32 flags = PERL_SCAN_DISALLOW_PREFIX;
2264                         uv = grok_hex(s, &len, &flags, NULL);
2265                         s += len;
2266                     }
2267                 }
2268
2269               NUM_ESCAPE_INSERT:
2270                 /* Insert oct or hex escaped character.
2271                  * There will always enough room in sv since such
2272                  * escapes will be longer than any UTF-8 sequence
2273                  * they can end up as. */
2274                 
2275                 /* We need to map to chars to ASCII before doing the tests
2276                    to cover EBCDIC
2277                 */
2278                 if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(uv))) {
2279                     if (!has_utf8 && uv > 255) {
2280                         /* Might need to recode whatever we have
2281                          * accumulated so far if it contains any
2282                          * hibit chars.
2283                          *
2284                          * (Can't we keep track of that and avoid
2285                          *  this rescan? --jhi)
2286                          */
2287                         int hicount = 0;
2288                         U8 *c;
2289                         for (c = (U8 *) SvPVX(sv); c < (U8 *)d; c++) {
2290                             if (!NATIVE_IS_INVARIANT(*c)) {
2291                                 hicount++;
2292                             }
2293                         }
2294                         if (hicount) {
2295                             const STRLEN offset = d - SvPVX_const(sv);
2296                             U8 *src, *dst;
2297                             d = SvGROW(sv, SvLEN(sv) + hicount + 1) + offset;
2298                             src = (U8 *)d - 1;
2299                             dst = src+hicount;
2300                             d  += hicount;
2301                             while (src >= (const U8 *)SvPVX_const(sv)) {
2302                                 if (!NATIVE_IS_INVARIANT(*src)) {
2303                                     const U8 ch = NATIVE_TO_ASCII(*src);
2304                                     *dst-- = (U8)UTF8_EIGHT_BIT_LO(ch);
2305                                     *dst-- = (U8)UTF8_EIGHT_BIT_HI(ch);
2306                                 }
2307                                 else {
2308                                     *dst-- = *src;
2309                                 }
2310                                 src--;
2311                             }
2312                         }
2313                     }
2314
2315                     if (has_utf8 || uv > 255) {
2316                         d = (char*)uvchr_to_utf8((U8*)d, uv);
2317                         has_utf8 = TRUE;
2318                         if (PL_lex_inwhat == OP_TRANS &&
2319                             PL_sublex_info.sub_op) {
2320                             PL_sublex_info.sub_op->op_private |=
2321                                 (PL_lex_repl ? OPpTRANS_FROM_UTF
2322                                              : OPpTRANS_TO_UTF);
2323                         }
2324 #ifdef EBCDIC
2325                         if (uv > 255 && !dorange)
2326                             native_range = FALSE;
2327 #endif
2328                     }
2329                     else {
2330                         *d++ = (char)uv;
2331                     }
2332                 }
2333                 else {
2334                     *d++ = (char) uv;
2335                 }
2336                 continue;
2337
2338             /* \N{LATIN SMALL LETTER A} is a named character */
2339             case 'N':
2340                 ++s;
2341                 if (*s == '{') {
2342                     char* e = strchr(s, '}');
2343                     SV *res;
2344                     STRLEN len;
2345                     const char *str;
2346
2347                     if (!e) {
2348                         yyerror("Missing right brace on \\N{}");
2349                         e = s - 1;
2350                         goto cont_scan;
2351                     }
2352                     if (e > s + 2 && s[1] == 'U' && s[2] == '+') {
2353                         /* \N{U+...} */
2354                         I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
2355                           PERL_SCAN_DISALLOW_PREFIX;
2356                         s += 3;
2357                         len = e - s;
2358                         uv = grok_hex(s, &len, &flags, NULL);
2359                         if ( e > s && len != (STRLEN)(e - s) ) {
2360                             uv = 0xFFFD;
2361                         }
2362                         s = e + 1;
2363                         goto NUM_ESCAPE_INSERT;
2364                     }
2365                     res = newSVpvn(s + 1, e - s - 1);
2366                     res = new_constant( NULL, 0, "charnames",
2367                                         res, NULL, s - 2, e - s + 3 );
2368                     if (has_utf8)
2369                         sv_utf8_upgrade(res);
2370                     str = SvPV_const(res,len);
2371 #ifdef EBCDIC_NEVER_MIND
2372                     /* charnames uses pack U and that has been
2373                      * recently changed to do the below uni->native
2374                      * mapping, so this would be redundant (and wrong,
2375                      * the code point would be doubly converted).
2376                      * But leave this in just in case the pack U change
2377                      * gets revoked, but the semantics is still
2378                      * desireable for charnames. --jhi */
2379                     {
2380                          UV uv = utf8_to_uvchr((const U8*)str, 0);
2381
2382                          if (uv < 0x100) {
2383                               U8 tmpbuf[UTF8_MAXBYTES+1], *d;
2384
2385                               d = uvchr_to_utf8(tmpbuf, UNI_TO_NATIVE(uv));
2386                               sv_setpvn(res, (char *)tmpbuf, d - tmpbuf);
2387                               str = SvPV_const(res, len);
2388                          }
2389                     }
2390 #endif
2391                     if (!has_utf8 && SvUTF8(res)) {
2392                         const char * const ostart = SvPVX_const(sv);
2393                         SvCUR_set(sv, d - ostart);
2394                         SvPOK_on(sv);
2395                         *d = '\0';
2396                         sv_utf8_upgrade(sv);
2397                         /* this just broke our allocation above... */
2398                         SvGROW(sv, (STRLEN)(send - start));
2399                         d = SvPVX(sv) + SvCUR(sv);
2400                         has_utf8 = TRUE;
2401                     }
2402                     if (len > (STRLEN)(e - s + 4)) { /* I _guess_ 4 is \N{} --jhi */
2403                         const char * const odest = SvPVX_const(sv);
2404
2405                         SvGROW(sv, (SvLEN(sv) + len - (e - s + 4)));
2406                         d = SvPVX(sv) + (d - odest);
2407                     }
2408 #ifdef EBCDIC
2409                     if (!dorange)
2410                         native_range = FALSE; /* \N{} is guessed to be Unicode */
2411 #endif
2412                     Copy(str, d, len, char);
2413                     d += len;
2414                     SvREFCNT_dec(res);
2415                   cont_scan:
2416                     s = e + 1;
2417                 }
2418                 else
2419                     yyerror("Missing braces on \\N{}");
2420                 continue;
2421
2422             /* \c is a control character */
2423             case 'c':
2424                 s++;
2425                 if (s < send) {
2426                     U8 c = *s++;
2427 #ifdef EBCDIC
2428                     if (isLOWER(c))
2429                         c = toUPPER(c);
2430 #endif
2431                     *d++ = NATIVE_TO_NEED(has_utf8,toCTRL(c));
2432                 }
2433                 else {
2434                     yyerror("Missing control char name in \\c");
2435                 }
2436                 continue;
2437
2438             /* printf-style backslashes, formfeeds, newlines, etc */
2439             case 'b':
2440                 *d++ = NATIVE_TO_NEED(has_utf8,'\b');
2441                 break;
2442             case 'n':
2443                 *d++ = NATIVE_TO_NEED(has_utf8,'\n');
2444                 break;
2445             case 'r':
2446                 *d++ = NATIVE_TO_NEED(has_utf8,'\r');
2447                 break;
2448             case 'f':
2449                 *d++ = NATIVE_TO_NEED(has_utf8,'\f');
2450                 break;
2451             case 't':
2452                 *d++ = NATIVE_TO_NEED(has_utf8,'\t');
2453                 break;
2454             case 'e':
2455                 *d++ = ASCII_TO_NEED(has_utf8,'\033');
2456                 break;
2457             case 'a':
2458                 *d++ = ASCII_TO_NEED(has_utf8,'\007');
2459                 break;
2460             } /* end switch */
2461
2462             s++;
2463             continue;
2464         } /* end if (backslash) */
2465 #ifdef EBCDIC
2466         else
2467             literal_endpoint++;
2468 #endif
2469
2470     default_action:
2471         /* If we started with encoded form, or already know we want it
2472            and then encode the next character */
2473         if ((has_utf8 || this_utf8) && !NATIVE_IS_INVARIANT((U8)(*s))) {
2474             STRLEN len  = 1;
2475             const UV nextuv   = (this_utf8) ? utf8n_to_uvchr((U8*)s, send - s, &len, 0) : (UV) ((U8) *s);
2476             const STRLEN need = UNISKIP(NATIVE_TO_UNI(nextuv));
2477             s += len;
2478             if (need > len) {
2479                 /* encoded value larger than old, need extra space (NOTE: SvCUR() not set here) */
2480                 const STRLEN off = d - SvPVX_const(sv);
2481                 d = SvGROW(sv, SvLEN(sv) + (need-len)) + off;
2482             }
2483             d = (char*)uvchr_to_utf8((U8*)d, nextuv);
2484             has_utf8 = TRUE;
2485 #ifdef EBCDIC
2486             if (uv > 255 && !dorange)
2487                 native_range = FALSE;
2488 #endif
2489         }
2490         else {
2491             *d++ = NATIVE_TO_NEED(has_utf8,*s++);
2492         }
2493     } /* while loop to process each character */
2494
2495     /* terminate the string and set up the sv */
2496     *d = '\0';
2497     SvCUR_set(sv, d - SvPVX_const(sv));
2498     if (SvCUR(sv) >= SvLEN(sv))
2499         Perl_croak(aTHX_ "panic: constant overflowed allocated space");
2500
2501     SvPOK_on(sv);
2502     if (PL_encoding && !has_utf8) {
2503         sv_recode_to_utf8(sv, PL_encoding);
2504         if (SvUTF8(sv))
2505             has_utf8 = TRUE;
2506     }
2507     if (has_utf8) {
2508         SvUTF8_on(sv);
2509         if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
2510             PL_sublex_info.sub_op->op_private |=
2511                     (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
2512         }
2513     }
2514
2515     /* shrink the sv if we allocated more than we used */
2516     if (SvCUR(sv) + 5 < SvLEN(sv)) {
2517         SvPV_shrink_to_cur(sv);
2518     }
2519
2520     /* return the substring (via pl_yylval) only if we parsed anything */
2521     if (s > PL_bufptr) {
2522         if ( PL_hints & ( PL_lex_inpat ? HINT_NEW_RE : HINT_NEW_STRING ) ) {
2523             const char *const key = PL_lex_inpat ? "qr" : "q";
2524             const STRLEN keylen = PL_lex_inpat ? 2 : 1;
2525             const char *type;
2526             STRLEN typelen;
2527
2528             if (PL_lex_inwhat == OP_TRANS) {
2529                 type = "tr";
2530                 typelen = 2;
2531             } else if (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat) {
2532                 type = "s";
2533                 typelen = 1;
2534             } else  {
2535                 type = "qq";
2536                 typelen = 2;
2537             }
2538
2539             sv = S_new_constant(aTHX_ start, s - start, key, keylen, sv, NULL,
2540                                 type, typelen);
2541         }
2542         pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
2543     } else
2544         SvREFCNT_dec(sv);
2545     return s;
2546 }
2547
2548 /* S_intuit_more
2549  * Returns TRUE if there's more to the expression (e.g., a subscript),
2550  * FALSE otherwise.
2551  *
2552  * It deals with "$foo[3]" and /$foo[3]/ and /$foo[0123456789$]+/
2553  *
2554  * ->[ and ->{ return TRUE
2555  * { and [ outside a pattern are always subscripts, so return TRUE
2556  * if we're outside a pattern and it's not { or [, then return FALSE
2557  * if we're in a pattern and the first char is a {
2558  *   {4,5} (any digits around the comma) returns FALSE
2559  * if we're in a pattern and the first char is a [
2560  *   [] returns FALSE
2561  *   [SOMETHING] has a funky algorithm to decide whether it's a
2562  *      character class or not.  It has to deal with things like
2563  *      /$foo[-3]/ and /$foo[$bar]/ as well as /$foo[$\d]+/
2564  * anything else returns TRUE
2565  */
2566
2567 /* This is the one truly awful dwimmer necessary to conflate C and sed. */
2568
2569 STATIC int
2570 S_intuit_more(pTHX_ register char *s)
2571 {
2572     dVAR;
2573
2574     PERL_ARGS_ASSERT_INTUIT_MORE;
2575
2576     if (PL_lex_brackets)
2577         return TRUE;
2578     if (*s == '-' && s[1] == '>' && (s[2] == '[' || s[2] == '{'))
2579         return TRUE;
2580     if (*s != '{' && *s != '[')
2581         return FALSE;
2582     if (!PL_lex_inpat)
2583         return TRUE;
2584
2585     /* In a pattern, so maybe we have {n,m}. */
2586     if (*s == '{') {
2587         s++;
2588         if (!isDIGIT(*s))
2589             return TRUE;
2590         while (isDIGIT(*s))
2591             s++;
2592         if (*s == ',')
2593             s++;
2594         while (isDIGIT(*s))
2595             s++;
2596         if (*s == '}')
2597             return FALSE;
2598         return TRUE;
2599         
2600     }
2601
2602     /* On the other hand, maybe we have a character class */
2603
2604     s++;
2605     if (*s == ']' || *s == '^')
2606         return FALSE;
2607     else {
2608         /* this is terrifying, and it works */
2609         int weight = 2;         /* let's weigh the evidence */
2610         char seen[256];
2611         unsigned char un_char = 255, last_un_char;
2612         const char * const send = strchr(s,']');
2613         char tmpbuf[sizeof PL_tokenbuf * 4];
2614
2615         if (!send)              /* has to be an expression */
2616             return TRUE;
2617
2618         Zero(seen,256,char);
2619         if (*s == '$')
2620             weight -= 3;
2621         else if (isDIGIT(*s)) {
2622             if (s[1] != ']') {
2623                 if (isDIGIT(s[1]) && s[2] == ']')
2624                     weight -= 10;
2625             }
2626             else
2627                 weight -= 100;
2628         }
2629         for (; s < send; s++) {
2630             last_un_char = un_char;
2631             un_char = (unsigned char)*s;
2632             switch (*s) {
2633             case '@':
2634             case '&':
2635             case '$':
2636                 weight -= seen[un_char] * 10;
2637                 if (isALNUM_lazy_if(s+1,UTF)) {
2638                     int len;
2639                     scan_ident(s, send, tmpbuf, sizeof tmpbuf, FALSE);
2640                     len = (int)strlen(tmpbuf);
2641                     if (len > 1 && gv_fetchpvn_flags(tmpbuf, len, 0, SVt_PV))
2642                         weight -= 100;
2643                     else
2644                         weight -= 10;
2645                 }
2646                 else if (*s == '$' && s[1] &&
2647                   strchr("[#!%*<>()-=",s[1])) {
2648                     if (/*{*/ strchr("])} =",s[2]))
2649                         weight -= 10;
2650                     else
2651                         weight -= 1;
2652                 }
2653                 break;
2654             case '\\':
2655                 un_char = 254;
2656                 if (s[1]) {
2657                     if (strchr("wds]",s[1]))
2658                         weight += 100;
2659                     else if (seen[(U8)'\''] || seen[(U8)'"'])
2660                         weight += 1;
2661                     else if (strchr("rnftbxcav",s[1]))
2662                         weight += 40;
2663                     else if (isDIGIT(s[1])) {
2664                         weight += 40;
2665                         while (s[1] && isDIGIT(s[1]))
2666                             s++;
2667                     }
2668                 }
2669                 else
2670                     weight += 100;
2671                 break;
2672             case '-':
2673                 if (s[1] == '\\')
2674                     weight += 50;
2675                 if (strchr("aA01! ",last_un_char))
2676                     weight += 30;
2677                 if (strchr("zZ79~",s[1]))
2678                     weight += 30;
2679                 if (last_un_char == 255 && (isDIGIT(s[1]) || s[1] == '$'))
2680                     weight -= 5;        /* cope with negative subscript */
2681                 break;
2682             default:
2683                 if (!isALNUM(last_un_char)
2684                     && !(last_un_char == '$' || last_un_char == '@'
2685                          || last_un_char == '&')
2686                     && isALPHA(*s) && s[1] && isALPHA(s[1])) {
2687                     char *d = tmpbuf;
2688                     while (isALPHA(*s))
2689                         *d++ = *s++;
2690                     *d = '\0';
2691                     if (keyword(tmpbuf, d - tmpbuf, 0))
2692                         weight -= 150;
2693                 }
2694                 if (un_char == last_un_char + 1)
2695                     weight += 5;
2696                 weight -= seen[un_char];
2697                 break;
2698             }
2699             seen[un_char]++;
2700         }
2701         if (weight >= 0)        /* probably a character class */
2702             return FALSE;
2703     }
2704
2705     return TRUE;
2706 }
2707
2708 /*
2709  * S_intuit_method
2710  *
2711  * Does all the checking to disambiguate
2712  *   foo bar
2713  * between foo(bar) and bar->foo.  Returns 0 if not a method, otherwise
2714  * FUNCMETH (bar->foo(args)) or METHOD (bar->foo args).
2715  *
2716  * First argument is the stuff after the first token, e.g. "bar".
2717  *
2718  * Not a method if bar is a filehandle.
2719  * Not a method if foo is a subroutine prototyped to take a filehandle.
2720  * Not a method if it's really "Foo $bar"
2721  * Method if it's "foo $bar"
2722  * Not a method if it's really "print foo $bar"
2723  * Method if it's really "foo package::" (interpreted as package->foo)
2724  * Not a method if bar is known to be a subroutine ("sub bar; foo bar")
2725  * Not a method if bar is a filehandle or package, but is quoted with
2726  *   =>
2727  */
2728
2729 STATIC int
2730 S_intuit_method(pTHX_ char *start, GV *gv, CV *cv)
2731 {
2732     dVAR;
2733     char *s = start + (*start == '$');
2734     char tmpbuf[sizeof PL_tokenbuf];
2735     STRLEN len;
2736     GV* indirgv;
2737 #ifdef PERL_MAD
2738     int soff;
2739 #endif
2740
2741     PERL_ARGS_ASSERT_INTUIT_METHOD;
2742
2743     if (gv) {
2744         if (SvTYPE(gv) == SVt_PVGV && GvIO(gv))
2745             return 0;
2746         if (cv) {
2747             if (SvPOK(cv)) {
2748                 const char *proto = SvPVX_const(cv);
2749                 if (proto) {
2750                     if (*proto == ';')
2751                         proto++;
2752                     if (*proto == '*')
2753                         return 0;
2754                 }
2755             }
2756         } else
2757             gv = NULL;
2758     }
2759     s = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
2760     /* start is the beginning of the possible filehandle/object,
2761      * and s is the end of it
2762      * tmpbuf is a copy of it
2763      */
2764
2765     if (*start == '$') {
2766         if (gv || PL_last_lop_op == OP_PRINT || PL_last_lop_op == OP_SAY ||
2767                 isUPPER(*PL_tokenbuf))
2768             return 0;
2769 #ifdef PERL_MAD
2770         len = start - SvPVX(PL_linestr);
2771 #endif
2772         s = PEEKSPACE(s);
2773 #ifdef PERL_MAD
2774         start = SvPVX(PL_linestr) + len;
2775 #endif
2776         PL_bufptr = start;
2777         PL_expect = XREF;
2778         return *s == '(' ? FUNCMETH : METHOD;
2779     }
2780     if (!keyword(tmpbuf, len, 0)) {
2781         if (len > 2 && tmpbuf[len - 2] == ':' && tmpbuf[len - 1] == ':') {
2782             len -= 2;
2783             tmpbuf[len] = '\0';
2784 #ifdef PERL_MAD
2785             soff = s - SvPVX(PL_linestr);
2786 #endif
2787             goto bare_package;
2788         }
2789         indirgv = gv_fetchpvn_flags(tmpbuf, len, 0, SVt_PVCV);
2790         if (indirgv && GvCVu(indirgv))
2791             return 0;
2792         /* filehandle or package name makes it a method */
2793         if (!gv || GvIO(indirgv) || gv_stashpvn(tmpbuf, len, 0)) {
2794 #ifdef PERL_MAD
2795             soff = s - SvPVX(PL_linestr);
2796 #endif
2797             s = PEEKSPACE(s);
2798             if ((PL_bufend - s) >= 2 && *s == '=' && *(s+1) == '>')
2799                 return 0;       /* no assumptions -- "=>" quotes bearword */
2800       bare_package:
2801             start_force(PL_curforce);
2802             NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0,
2803                                                    newSVpvn(tmpbuf,len));
2804             NEXTVAL_NEXTTOKE.opval->op_private = OPpCONST_BARE;
2805             if (PL_madskills)
2806                 curmad('X', newSVpvn(start,SvPVX(PL_linestr) + soff - start));
2807             PL_expect = XTERM;
2808             force_next(WORD);
2809             PL_bufptr = s;
2810 #ifdef PERL_MAD
2811             PL_bufptr = SvPVX(PL_linestr) + soff; /* restart before space */
2812 #endif
2813             return *s == '(' ? FUNCMETH : METHOD;
2814         }
2815     }
2816     return 0;
2817 }
2818
2819 /* Encoded script support. filter_add() effectively inserts a
2820  * 'pre-processing' function into the current source input stream.
2821  * Note that the filter function only applies to the current source file
2822  * (e.g., it will not affect files 'require'd or 'use'd by this one).
2823  *
2824  * The datasv parameter (which may be NULL) can be used to pass
2825  * private data to this instance of the filter. The filter function
2826  * can recover the SV using the FILTER_DATA macro and use it to
2827  * store private buffers and state information.
2828  *
2829  * The supplied datasv parameter is upgraded to a PVIO type
2830  * and the IoDIRP/IoANY field is used to store the function pointer,
2831  * and IOf_FAKE_DIRP is enabled on datasv to mark this as such.
2832  * Note that IoTOP_NAME, IoFMT_NAME, IoBOTTOM_NAME, if set for
2833  * private use must be set using malloc'd pointers.
2834  */
2835
2836 SV *
2837 Perl_filter_add(pTHX_ filter_t funcp, SV *datasv)
2838 {
2839     dVAR;
2840     if (!funcp)
2841         return NULL;
2842
2843     if (!PL_parser)
2844         return NULL;
2845
2846     if (!PL_rsfp_filters)
2847         PL_rsfp_filters = newAV();
2848     if (!datasv)
2849         datasv = newSV(0);
2850     SvUPGRADE(datasv, SVt_PVIO);
2851     IoANY(datasv) = FPTR2DPTR(void *, funcp); /* stash funcp into spare field */
2852     IoFLAGS(datasv) |= IOf_FAKE_DIRP;
2853     DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_add func %p (%s)\n",
2854                           FPTR2DPTR(void *, IoANY(datasv)),
2855                           SvPV_nolen(datasv)));
2856     av_unshift(PL_rsfp_filters, 1);
2857     av_store(PL_rsfp_filters, 0, datasv) ;
2858     return(datasv);
2859 }
2860
2861
2862 /* Delete most recently added instance of this filter function. */
2863 void
2864 Perl_filter_del(pTHX_ filter_t funcp)
2865 {
2866     dVAR;
2867     SV *datasv;
2868
2869     PERL_ARGS_ASSERT_FILTER_DEL;
2870
2871 #ifdef DEBUGGING
2872     DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_del func %p",
2873                           FPTR2DPTR(void*, funcp)));
2874 #endif
2875     if (!PL_parser || !PL_rsfp_filters || AvFILLp(PL_rsfp_filters)<0)
2876         return;
2877     /* if filter is on top of stack (usual case) just pop it off */
2878     datasv = FILTER_DATA(AvFILLp(PL_rsfp_filters));
2879     if (IoANY(datasv) == FPTR2DPTR(void *, funcp)) {
2880         IoFLAGS(datasv) &= ~IOf_FAKE_DIRP;
2881         IoANY(datasv) = (void *)NULL;
2882         sv_free(av_pop(PL_rsfp_filters));
2883
2884         return;
2885     }
2886     /* we need to search for the correct entry and clear it     */
2887     Perl_die(aTHX_ "filter_del can only delete in reverse order (currently)");
2888 }
2889
2890
2891 /* Invoke the idxth filter function for the current rsfp.        */
2892 /* maxlen 0 = read one text line */
2893 I32
2894 Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
2895 {
2896     dVAR;
2897     filter_t funcp;
2898     SV *datasv = NULL;
2899     /* This API is bad. It should have been using unsigned int for maxlen.
2900        Not sure if we want to change the API, but if not we should sanity
2901        check the value here.  */
2902     const unsigned int correct_length
2903         = maxlen < 0 ?
2904 #ifdef PERL_MICRO
2905         0x7FFFFFFF
2906 #else
2907         INT_MAX
2908 #endif
2909         : maxlen;
2910
2911     PERL_ARGS_ASSERT_FILTER_READ;
2912
2913     if (!PL_parser || !PL_rsfp_filters)
2914         return -1;
2915     if (idx > AvFILLp(PL_rsfp_filters)) {       /* Any more filters?    */
2916         /* Provide a default input filter to make life easy.    */
2917         /* Note that we append to the line. This is handy.      */
2918         DEBUG_P(PerlIO_printf(Perl_debug_log,
2919                               "filter_read %d: from rsfp\n", idx));
2920         if (correct_length) {
2921             /* Want a block */
2922             int len ;
2923             const int old_len = SvCUR(buf_sv);
2924
2925             /* ensure buf_sv is large enough */
2926             SvGROW(buf_sv, (STRLEN)(old_len + correct_length)) ;
2927             if ((len = PerlIO_read(PL_rsfp, SvPVX(buf_sv) + old_len,
2928                                    correct_length)) <= 0) {
2929                 if (PerlIO_error(PL_rsfp))
2930                     return -1;          /* error */
2931                 else
2932                     return 0 ;          /* end of file */
2933             }
2934             SvCUR_set(buf_sv, old_len + len) ;
2935         } else {
2936             /* Want a line */
2937             if (sv_gets(buf_sv, PL_rsfp, SvCUR(buf_sv)) == NULL) {
2938                 if (PerlIO_error(PL_rsfp))
2939                     return -1;          /* error */
2940                 else
2941                     return 0 ;          /* end of file */
2942             }
2943         }
2944         return SvCUR(buf_sv);
2945     }
2946     /* Skip this filter slot if filter has been deleted */
2947     if ( (datasv = FILTER_DATA(idx)) == &PL_sv_undef) {
2948         DEBUG_P(PerlIO_printf(Perl_debug_log,
2949                               "filter_read %d: skipped (filter deleted)\n",
2950                               idx));
2951         return FILTER_READ(idx+1, buf_sv, correct_length); /* recurse */
2952     }
2953     /* Get function pointer hidden within datasv        */
2954     funcp = DPTR2FPTR(filter_t, IoANY(datasv));
2955     DEBUG_P(PerlIO_printf(Perl_debug_log,
2956                           "filter_read %d: via function %p (%s)\n",
2957                           idx, (void*)datasv, SvPV_nolen_const(datasv)));
2958     /* Call function. The function is expected to       */
2959     /* call "FILTER_READ(idx+1, buf_sv)" first.         */
2960     /* Return: <0:error, =0:eof, >0:not eof             */
2961     return (*funcp)(aTHX_ idx, buf_sv, correct_length);
2962 }
2963
2964 STATIC char *
2965 S_filter_gets(pTHX_ register SV *sv, register PerlIO *fp, STRLEN append)
2966 {
2967     dVAR;
2968
2969     PERL_ARGS_ASSERT_FILTER_GETS;
2970
2971 #ifdef PERL_CR_FILTER
2972     if (!PL_rsfp_filters) {
2973         filter_add(S_cr_textfilter,NULL);
2974     }
2975 #endif
2976     if (PL_rsfp_filters) {
2977         if (!append)
2978             SvCUR_set(sv, 0);   /* start with empty line        */
2979         if (FILTER_READ(0, sv, 0) > 0)
2980             return ( SvPVX(sv) ) ;
2981         else
2982             return NULL ;
2983     }
2984     else
2985         return (sv_gets(sv, fp, append));
2986 }
2987
2988 STATIC HV *
2989 S_find_in_my_stash(pTHX_ const char *pkgname, STRLEN len)
2990 {
2991     dVAR;
2992     GV *gv;
2993
2994     PERL_ARGS_ASSERT_FIND_IN_MY_STASH;
2995
2996     if (len == 11 && *pkgname == '_' && strEQ(pkgname, "__PACKAGE__"))
2997         return PL_curstash;
2998
2999     if (len > 2 &&
3000         (pkgname[len - 2] == ':' && pkgname[len - 1] == ':') &&
3001         (gv = gv_fetchpvn_flags(pkgname, len, 0, SVt_PVHV)))
3002     {
3003         return GvHV(gv);                        /* Foo:: */
3004     }
3005
3006     /* use constant CLASS => 'MyClass' */
3007     gv = gv_fetchpvn_flags(pkgname, len, 0, SVt_PVCV);
3008     if (gv && GvCV(gv)) {
3009         SV * const sv = cv_const_sv(GvCV(gv));
3010         if (sv)
3011             pkgname = SvPV_const(sv, len);
3012     }
3013
3014     return gv_stashpvn(pkgname, len, 0);
3015 }
3016
3017 /*
3018  * S_readpipe_override
3019  * Check whether readpipe() is overriden, and generates the appropriate
3020  * optree, provided sublex_start() is called afterwards.
3021  */
3022 STATIC void
3023 S_readpipe_override(pTHX)
3024 {
3025     GV **gvp;
3026     GV *gv_readpipe = gv_fetchpvs("readpipe", GV_NOTQUAL, SVt_PVCV);
3027     pl_yylval.ival = OP_BACKTICK;
3028     if ((gv_readpipe
3029                 && GvCVu(gv_readpipe) && GvIMPORTED_CV(gv_readpipe))
3030             ||
3031             ((gvp = (GV**)hv_fetchs(PL_globalstash, "readpipe", FALSE))
3032              && (gv_readpipe = *gvp) && isGV_with_GP(gv_readpipe)
3033              && GvCVu(gv_readpipe) && GvIMPORTED_CV(gv_readpipe)))
3034     {
3035         PL_lex_op = (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
3036             append_elem(OP_LIST,
3037                 newSVOP(OP_CONST, 0, &PL_sv_undef), /* value will be read later */
3038                 newCVREF(0, newGVOP(OP_GV, 0, gv_readpipe))));
3039     }
3040 }
3041
3042 #ifdef PERL_MAD 
3043  /*
3044  * Perl_madlex
3045  * The intent of this yylex wrapper is to minimize the changes to the
3046  * tokener when we aren't interested in collecting madprops.  It remains
3047  * to be seen how successful this strategy will be...
3048  */
3049
3050 int
3051 Perl_madlex(pTHX)
3052 {
3053     int optype;
3054     char *s = PL_bufptr;
3055
3056     /* make sure PL_thiswhite is initialized */
3057     PL_thiswhite = 0;
3058     PL_thismad = 0;
3059
3060     /* just do what yylex would do on pending identifier; leave PL_thiswhite alone */
3061     if (PL_pending_ident)
3062         return S_pending_ident(aTHX);
3063
3064     /* previous token ate up our whitespace? */
3065     if (!PL_lasttoke && PL_nextwhite) {
3066         PL_thiswhite = PL_nextwhite;
3067         PL_nextwhite = 0;
3068     }
3069
3070     /* isolate the token, and figure out where it is without whitespace */
3071     PL_realtokenstart = -1;
3072     PL_thistoken = 0;
3073     optype = yylex();
3074     s = PL_bufptr;
3075     assert(PL_curforce < 0);
3076
3077     if (!PL_thismad || PL_thismad->mad_key == '^') {    /* not forced already? */
3078         if (!PL_thistoken) {
3079             if (PL_realtokenstart < 0 || !CopLINE(PL_curcop))
3080                 PL_thistoken = newSVpvs("");
3081             else {
3082                 char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
3083                 PL_thistoken = newSVpvn(tstart, s - tstart);
3084             }
3085         }
3086         if (PL_thismad) /* install head */
3087             CURMAD('X', PL_thistoken);
3088     }
3089
3090     /* last whitespace of a sublex? */
3091     if (optype == ')' && PL_endwhite) {
3092         CURMAD('X', PL_endwhite);
3093     }
3094
3095     if (!PL_thismad) {
3096
3097         /* if no whitespace and we're at EOF, bail.  Otherwise fake EOF below. */
3098         if (!PL_thiswhite && !PL_endwhite && !optype) {
3099             sv_free(PL_thistoken);
3100             PL_thistoken = 0;
3101             return 0;
3102         }
3103
3104         /* put off final whitespace till peg */
3105         if (optype == ';' && !PL_rsfp) {
3106             PL_nextwhite = PL_thiswhite;
3107             PL_thiswhite = 0;
3108         }
3109         else if (PL_thisopen) {
3110             CURMAD('q', PL_thisopen);
3111             if (PL_thistoken)
3112                 sv_free(PL_thistoken);
3113             PL_thistoken = 0;
3114         }
3115         else {
3116             /* Store actual token text as madprop X */
3117             CURMAD('X', PL_thistoken);
3118         }
3119
3120         if (PL_thiswhite) {
3121             /* add preceding whitespace as madprop _ */
3122             CURMAD('_', PL_thiswhite);
3123         }
3124
3125         if (PL_thisstuff) {
3126             /* add quoted material as madprop = */
3127             CURMAD('=', PL_thisstuff);
3128         }
3129
3130         if (PL_thisclose) {
3131             /* add terminating quote as madprop Q */
3132             CURMAD('Q', PL_thisclose);
3133         }
3134     }
3135
3136     /* special processing based on optype */
3137
3138     switch (optype) {
3139
3140     /* opval doesn't need a TOKEN since it can already store mp */
3141     case WORD:
3142     case METHOD:
3143     case FUNCMETH:
3144     case THING:
3145     case PMFUNC:
3146     case PRIVATEREF:
3147     case FUNC0SUB:
3148     case UNIOPSUB:
3149     case LSTOPSUB:
3150         if (pl_yylval.opval)
3151             append_madprops(PL_thismad, pl_yylval.opval, 0);
3152         PL_thismad = 0;
3153         return optype;
3154
3155     /* fake EOF */
3156     case 0:
3157         optype = PEG;
3158         if (PL_endwhite) {
3159             addmad(newMADsv('p', PL_endwhite), &PL_thismad, 0);
3160             PL_endwhite = 0;
3161         }
3162         break;
3163
3164     case ']':
3165     case '}':
3166         if (PL_faketokens)
3167             break;
3168         /* remember any fake bracket that lexer is about to discard */ 
3169         if (PL_lex_brackets == 1 &&
3170             ((expectation)PL_lex_brackstack[0] & XFAKEBRACK))
3171         {
3172             s = PL_bufptr;
3173             while (s < PL_bufend && (*s == ' ' || *s == '\t'))
3174                 s++;
3175             if (*s == '}') {
3176                 PL_thiswhite = newSVpvn(PL_bufptr, ++s - PL_bufptr);
3177                 addmad(newMADsv('#', PL_thiswhite), &PL_thismad, 0);
3178                 PL_thiswhite = 0;
3179                 PL_bufptr = s - 1;
3180                 break;  /* don't bother looking for trailing comment */
3181             }
3182             else
3183                 s = PL_bufptr;
3184         }
3185         if (optype == ']')
3186             break;
3187         /* FALLTHROUGH */
3188
3189     /* attach a trailing comment to its statement instead of next token */
3190     case ';':
3191         if (PL_faketokens)
3192             break;
3193         if (PL_bufptr > PL_oldbufptr && PL_bufptr[-1] == optype) {
3194             s = PL_bufptr;
3195             while (s < PL_bufend && (*s == ' ' || *s == '\t'))
3196                 s++;
3197             if (*s == '\n' || *s == '#') {
3198                 while (s < PL_bufend && *s != '\n')
3199                     s++;
3200                 if (s < PL_bufend)
3201                     s++;
3202                 PL_thiswhite = newSVpvn(PL_bufptr, s - PL_bufptr);
3203                 addmad(newMADsv('#', PL_thiswhite), &PL_thismad, 0);
3204                 PL_thiswhite = 0;
3205                 PL_bufptr = s;
3206             }
3207         }
3208         break;
3209
3210     /* pval */
3211     case LABEL:
3212         break;
3213
3214     /* ival */
3215     default:
3216         break;
3217
3218     }
3219
3220     /* Create new token struct.  Note: opvals return early above. */
3221     pl_yylval.tkval = newTOKEN(optype, pl_yylval, PL_thismad);
3222     PL_thismad = 0;
3223     return optype;
3224 }
3225 #endif
3226
3227 STATIC char *
3228 S_tokenize_use(pTHX_ int is_use, char *s) {
3229     dVAR;
3230
3231     PERL_ARGS_ASSERT_TOKENIZE_USE;
3232
3233     if (PL_expect != XSTATE)
3234         yyerror(Perl_form(aTHX_ "\"%s\" not allowed in expression",
3235                     is_use ? "use" : "no"));
3236     s = SKIPSPACE1(s);
3237     if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
3238         s = force_version(s, TRUE);
3239         if (*s == ';' || (s = SKIPSPACE1(s), *s == ';')) {
3240             start_force(PL_curforce);
3241             NEXTVAL_NEXTTOKE.opval = NULL;
3242             force_next(WORD);
3243         }
3244         else if (*s == 'v') {
3245             s = force_word(s,WORD,FALSE,TRUE,FALSE);
3246             s = force_version(s, FALSE);
3247         }
3248     }
3249     else {
3250         s = force_word(s,WORD,FALSE,TRUE,FALSE);
3251         s = force_version(s, FALSE);
3252     }
3253     pl_yylval.ival = is_use;
3254     return s;
3255 }
3256 #ifdef DEBUGGING
3257     static const char* const exp_name[] =
3258         { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "ATTRBLOCK",
3259           "ATTRTERM", "TERMBLOCK", "TERMORDORDOR"
3260         };
3261 #endif
3262
3263 /*
3264   yylex
3265
3266   Works out what to call the token just pulled out of the input
3267   stream.  The yacc parser takes care of taking the ops we return and
3268   stitching them into a tree.
3269
3270   Returns:
3271     PRIVATEREF
3272
3273   Structure:
3274       if read an identifier
3275           if we're in a my declaration
3276               croak if they tried to say my($foo::bar)
3277               build the ops for a my() declaration
3278           if it's an access to a my() variable
3279               are we in a sort block?
3280                   croak if my($a); $a <=> $b
3281               build ops for access to a my() variable
3282           if in a dq string, and they've said @foo and we can't find @foo
3283               croak
3284           build ops for a bareword
3285       if we already built the token before, use it.
3286 */
3287
3288
3289 #ifdef __SC__
3290 #pragma segment Perl_yylex
3291 #endif
3292 int
3293 Perl_yylex(pTHX)
3294 {
3295     dVAR;
3296     register char *s = PL_bufptr;
3297     register char *d;
3298     STRLEN len;
3299     bool bof = FALSE;
3300
3301     /* orig_keyword, gvp, and gv are initialized here because
3302      * jump to the label just_a_word_zero can bypass their
3303      * initialization later. */
3304     I32 orig_keyword = 0;
3305     GV *gv = NULL;
3306     GV **gvp = NULL;
3307
3308     DEBUG_T( {
3309         SV* tmp = newSVpvs("");
3310         PerlIO_printf(Perl_debug_log, "### %"IVdf":LEX_%s/X%s %s\n",
3311             (IV)CopLINE(PL_curcop),
3312             lex_state_names[PL_lex_state],
3313             exp_name[PL_expect],
3314             pv_display(tmp, s, strlen(s), 0, 60));
3315         SvREFCNT_dec(tmp);
3316     } );
3317     /* check if there's an identifier for us to look at */
3318     if (PL_pending_ident)
3319         return REPORT(S_pending_ident(aTHX));
3320
3321     /* no identifier pending identification */
3322
3323     switch (PL_lex_state) {
3324 #ifdef COMMENTARY
3325     case LEX_NORMAL:            /* Some compilers will produce faster */
3326     case LEX_INTERPNORMAL:      /* code if we comment these out. */
3327         break;
3328 #endif
3329
3330     /* when we've already built the next token, just pull it out of the queue */
3331     case LEX_KNOWNEXT:
3332 #ifdef PERL_MAD
3333         PL_lasttoke--;
3334         pl_yylval = PL_nexttoke[PL_lasttoke].next_val;
3335         if (PL_madskills) {
3336             PL_thismad = PL_nexttoke[PL_lasttoke].next_mad;
3337             PL_nexttoke[PL_lasttoke].next_mad = 0;
3338             if (PL_thismad && PL_thismad->mad_key == '_') {
3339                 PL_thiswhite = MUTABLE_SV(PL_thismad->mad_val);
3340                 PL_thismad->mad_val = 0;
3341                 mad_free(PL_thismad);
3342                 PL_thismad = 0;
3343             }
3344         }
3345         if (!PL_lasttoke) {
3346             PL_lex_state = PL_lex_defer;
3347             PL_expect = PL_lex_expect;
3348             PL_lex_defer = LEX_NORMAL;
3349             if (!PL_nexttoke[PL_lasttoke].next_type)
3350                 return yylex();
3351         }
3352 #else
3353         PL_nexttoke--;
3354         pl_yylval = PL_nextval[PL_nexttoke];
3355         if (!PL_nexttoke) {
3356             PL_lex_state = PL_lex_defer;
3357             PL_expect = PL_lex_expect;
3358             PL_lex_defer = LEX_NORMAL;
3359         }
3360 #endif
3361 #ifdef PERL_MAD
3362         /* FIXME - can these be merged?  */
3363         return(PL_nexttoke[PL_lasttoke].next_type);
3364 #else
3365         return REPORT(PL_nexttype[PL_nexttoke]);
3366 #endif
3367
3368     /* interpolated case modifiers like \L \U, including \Q and \E.
3369        when we get here, PL_bufptr is at the \
3370     */
3371     case LEX_INTERPCASEMOD:
3372 #ifdef DEBUGGING
3373         if (PL_bufptr != PL_bufend && *PL_bufptr != '\\')
3374             Perl_croak(aTHX_ "panic: INTERPCASEMOD");
3375 #endif
3376         /* handle \E or end of string */
3377         if (PL_bufptr == PL_bufend || PL_bufptr[1] == 'E') {
3378             /* if at a \E */
3379             if (PL_lex_casemods) {
3380                 const char oldmod = PL_lex_casestack[--PL_lex_casemods];
3381                 PL_lex_casestack[PL_lex_casemods] = '\0';
3382
3383                 if (PL_bufptr != PL_bufend
3384                     && (oldmod == 'L' || oldmod == 'U' || oldmod == 'Q')) {
3385                     PL_bufptr += 2;
3386                     PL_lex_state = LEX_INTERPCONCAT;
3387 #ifdef PERL_MAD
3388                     if (PL_madskills)
3389                         PL_thistoken = newSVpvs("\\E");
3390 #endif
3391                 }
3392                 return REPORT(')');
3393             }
3394 #ifdef PERL_MAD
3395             while (PL_bufptr != PL_bufend &&
3396               PL_bufptr[0] == '\\' && PL_bufptr[1] == 'E') {
3397                 if (!PL_thiswhite)
3398                     PL_thiswhite = newSVpvs("");
3399                 sv_catpvn(PL_thiswhite, PL_bufptr, 2);
3400                 PL_bufptr += 2;
3401             }
3402 #else
3403             if (PL_bufptr != PL_bufend)
3404                 PL_bufptr += 2;
3405 #endif
3406             PL_lex_state = LEX_INTERPCONCAT;
3407             return yylex();
3408         }
3409         else {
3410             DEBUG_T({ PerlIO_printf(Perl_debug_log,
3411               "### Saw case modifier\n"); });
3412             s = PL_bufptr + 1;
3413             if (s[1] == '\\' && s[2] == 'E') {
3414 #ifdef PERL_MAD
3415                 if (!PL_thiswhite)
3416                     PL_thiswhite = newSVpvs("");
3417                 sv_catpvn(PL_thiswhite, PL_bufptr, 4);
3418 #endif
3419                 PL_bufptr = s + 3;
3420                 PL_lex_state = LEX_INTERPCONCAT;
3421                 return yylex();
3422             }
3423             else {
3424                 I32 tmp;
3425                 if (!PL_madskills) /* when just compiling don't need correct */
3426                     if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
3427                         tmp = *s, *s = s[2], s[2] = (char)tmp;  /* misordered... */
3428                 if ((*s == 'L' || *s == 'U') &&
3429                     (strchr(PL_lex_casestack, 'L') || strchr(PL_lex_casestack, 'U'))) {
3430                     PL_lex_casestack[--PL_lex_casemods] = '\0';
3431                     return REPORT(')');
3432                 }
3433                 if (PL_lex_casemods > 10)
3434                     Renew(PL_lex_casestack, PL_lex_casemods + 2, char);
3435                 PL_lex_casestack[PL_lex_casemods++] = *s;
3436                 PL_lex_casestack[PL_lex_casemods] = '\0';
3437                 PL_lex_state = LEX_INTERPCONCAT;
3438                 start_force(PL_curforce);
3439                 NEXTVAL_NEXTTOKE.ival = 0;
3440                 force_next('(');
3441                 start_force(PL_curforce);
3442                 if (*s == 'l')
3443                     NEXTVAL_NEXTTOKE.ival = OP_LCFIRST;
3444                 else if (*s == 'u')
3445                     NEXTVAL_NEXTTOKE.ival = OP_UCFIRST;
3446                 else if (*s == 'L')
3447                     NEXTVAL_NEXTTOKE.ival = OP_LC;
3448                 else if (*s == 'U')
3449                     NEXTVAL_NEXTTOKE.ival = OP_UC;
3450                 else if (*s == 'Q')
3451                     NEXTVAL_NEXTTOKE.ival = OP_QUOTEMETA;
3452                 else
3453                     Perl_croak(aTHX_ "panic: yylex");
3454                 if (PL_madskills) {
3455                     SV* const tmpsv = newSVpvs("\\ ");
3456                     /* replace the space with the character we want to escape
3457                      */
3458                     SvPVX(tmpsv)[1] = *s;
3459                     curmad('_', tmpsv);
3460                 }
3461                 PL_bufptr = s + 1;
3462             }
3463             force_next(FUNC);
3464             if (PL_lex_starts) {
3465                 s = PL_bufptr;
3466                 PL_lex_starts = 0;
3467 #ifdef PERL_MAD
3468                 if (PL_madskills) {
3469                     if (PL_thistoken)
3470                         sv_free(PL_thistoken);
3471                     PL_thistoken = newSVpvs("");
3472                 }
3473 #endif
3474                 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
3475                 if (PL_lex_casemods == 1 && PL_lex_inpat)
3476                     OPERATOR(',');
3477                 else
3478                     Aop(OP_CONCAT);
3479             }
3480             else
3481                 return yylex();
3482         }
3483
3484     case LEX_INTERPPUSH:
3485         return REPORT(sublex_push());
3486
3487     case LEX_INTERPSTART:
3488         if (PL_bufptr == PL_bufend)
3489             return REPORT(sublex_done());
3490         DEBUG_T({ PerlIO_printf(Perl_debug_log,
3491               "### Interpolated variable\n"); });
3492         PL_expect = XTERM;
3493         PL_lex_dojoin = (*PL_bufptr == '@');
3494         PL_lex_state = LEX_INTERPNORMAL;
3495         if (PL_lex_dojoin) {
3496             start_force(PL_curforce);
3497             NEXTVAL_NEXTTOKE.ival = 0;
3498             force_next(',');
3499             start_force(PL_curforce);
3500             force_ident("\"", '$');
3501             start_force(PL_curforce);
3502             NEXTVAL_NEXTTOKE.ival = 0;
3503             force_next('$');
3504             start_force(PL_curforce);
3505             NEXTVAL_NEXTTOKE.ival = 0;
3506             force_next('(');
3507             start_force(PL_curforce);
3508             NEXTVAL_NEXTTOKE.ival = OP_JOIN;    /* emulate join($", ...) */
3509             force_next(FUNC);
3510         }
3511         if (PL_lex_starts++) {
3512             s = PL_bufptr;
3513 #ifdef PERL_MAD
3514             if (PL_madskills) {
3515                 if (PL_thistoken)
3516                     sv_free(PL_thistoken);
3517                 PL_thistoken = newSVpvs("");
3518             }
3519 #endif
3520             /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
3521             if (!PL_lex_casemods && PL_lex_inpat)
3522                 OPERATOR(',');
3523             else
3524                 Aop(OP_CONCAT);
3525         }
3526         return yylex();
3527
3528     case LEX_INTERPENDMAYBE:
3529         if (intuit_more(PL_bufptr)) {
3530             PL_lex_state = LEX_INTERPNORMAL;    /* false alarm, more expr */
3531             break;
3532         }
3533         /* FALL THROUGH */
3534
3535     case LEX_INTERPEND:
3536         if (PL_lex_dojoin) {
3537             PL_lex_dojoin = FALSE;
3538             PL_lex_state = LEX_INTERPCONCAT;
3539 #ifdef PERL_MAD
3540             if (PL_madskills) {
3541                 if (PL_thistoken)
3542                     sv_free(PL_thistoken);
3543                 PL_thistoken = newSVpvs("");
3544             }
3545 #endif
3546             return REPORT(')');
3547         }
3548         if (PL_lex_inwhat == OP_SUBST && PL_linestr == PL_lex_repl
3549             && SvEVALED(PL_lex_repl))
3550         {
3551             if (PL_bufptr != PL_bufend)
3552                 Perl_croak(aTHX_ "Bad evalled substitution pattern");
3553             PL_lex_repl = NULL;
3554         }
3555         /* FALLTHROUGH */
3556     case LEX_INTERPCONCAT:
3557 #ifdef DEBUGGING
3558         if (PL_lex_brackets)
3559             Perl_croak(aTHX_ "panic: INTERPCONCAT");
3560 #endif
3561         if (PL_bufptr == PL_bufend)
3562             return REPORT(sublex_done());
3563
3564         if (SvIVX(PL_linestr) == '\'') {
3565             SV *sv = newSVsv(PL_linestr);
3566             if (!PL_lex_inpat)
3567                 sv = tokeq(sv);
3568             else if ( PL_hints & HINT_NEW_RE )
3569                 sv = new_constant(NULL, 0, "qr", sv, sv, "q", 1);
3570             pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
3571             s = PL_bufend;
3572         }
3573         else {
3574             s = scan_const(PL_bufptr);
3575             if (*s == '\\')
3576                 PL_lex_state = LEX_INTERPCASEMOD;
3577             else
3578                 PL_lex_state = LEX_INTERPSTART;
3579         }
3580
3581         if (s != PL_bufptr) {
3582             start_force(PL_curforce);
3583             if (PL_madskills) {
3584                 curmad('X', newSVpvn(PL_bufptr,s-PL_bufptr));
3585             }
3586             NEXTVAL_NEXTTOKE = pl_yylval;
3587             PL_expect = XTERM;
3588             force_next(THING);
3589             if (PL_lex_starts++) {
3590 #ifdef PERL_MAD
3591                 if (PL_madskills) {
3592                     if (PL_thistoken)
3593                         sv_free(PL_thistoken);
3594                     PL_thistoken = newSVpvs("");
3595                 }
3596 #endif
3597                 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
3598                 if (!PL_lex_casemods && PL_lex_inpat)
3599                     OPERATOR(',');
3600                 else
3601                     Aop(OP_CONCAT);
3602             }
3603             else {
3604                 PL_bufptr = s;
3605                 return yylex();
3606             }
3607         }
3608
3609         return yylex();
3610     case LEX_FORMLINE:
3611         PL_lex_state = LEX_NORMAL;
3612         s = scan_formline(PL_bufptr);
3613         if (!PL_lex_formbrack)
3614             goto rightbracket;
3615         OPERATOR(';');
3616     }
3617
3618     s = PL_bufptr;
3619     PL_oldoldbufptr = PL_oldbufptr;
3620     PL_oldbufptr = s;
3621
3622   retry:
3623 #ifdef PERL_MAD
3624     if (PL_thistoken) {
3625         sv_free(PL_thistoken);
3626         PL_thistoken = 0;
3627     }
3628     PL_realtokenstart = s - SvPVX(PL_linestr);  /* assume but undo on ws */
3629 #endif
3630     switch (*s) {
3631     default:
3632         if (isIDFIRST_lazy_if(s,UTF))
3633             goto keylookup;
3634         len = UTF ? Perl_utf8_length(aTHX_ (U8 *) PL_linestart, (U8 *) s) : (STRLEN) (s - PL_linestart);
3635         Perl_croak(aTHX_ "Unrecognized character \\x%02X in column %d", *s & 255, (int) len + 1);
3636     case 4:
3637     case 26:
3638         goto fake_eof;                  /* emulate EOF on ^D or ^Z */
3639     case 0:
3640 #ifdef PERL_MAD
3641         if (PL_madskills)
3642             PL_faketokens = 0;
3643 #endif
3644         if (!PL_rsfp) {
3645             PL_last_uni = 0;
3646             PL_last_lop = 0;
3647             if (PL_lex_brackets) {
3648                 yyerror((const char *)
3649                         (PL_lex_formbrack
3650                          ? "Format not terminated"
3651                          : "Missing right curly or square bracket"));
3652             }
3653             DEBUG_T( { PerlIO_printf(Perl_debug_log,
3654                         "### Tokener got EOF\n");
3655             } );
3656             TOKEN(0);
3657         }
3658         if (s++ < PL_bufend)
3659             goto retry;                 /* ignore stray nulls */
3660         PL_last_uni = 0;
3661         PL_last_lop = 0;
3662         if (!PL_in_eval && !PL_preambled) {
3663             PL_preambled = TRUE;
3664 #ifdef PERL_MAD
3665             if (PL_madskills)
3666                 PL_faketokens = 1;
3667 #endif
3668             if (PL_perldb) {
3669                 /* Generate a string of Perl code to load the debugger.
3670                  * If PERL5DB is set, it will return the contents of that,
3671                  * otherwise a compile-time require of perl5db.pl.  */
3672
3673                 const char * const pdb = PerlEnv_getenv("PERL5DB");
3674
3675                 if (pdb) {
3676                     sv_setpv(PL_linestr, pdb);
3677                     sv_catpvs(PL_linestr,";");
3678                 } else {
3679                     SETERRNO(0,SS_NORMAL);
3680                     sv_setpvs(PL_linestr, "BEGIN { require 'perl5db.pl' };");
3681                 }
3682             } else
3683                 sv_setpvs(PL_linestr,"");
3684             if (PL_preambleav) {
3685                 SV **svp = AvARRAY(PL_preambleav);
3686                 SV **const end = svp + AvFILLp(PL_preambleav);
3687                 while(svp <= end) {
3688                     sv_catsv(PL_linestr, *svp);
3689                     ++svp;
3690                     sv_catpvs(PL_linestr, ";");
3691                 }
3692                 sv_free(MUTABLE_SV(PL_preambleav));
3693                 PL_preambleav = NULL;
3694             }
3695             if (PL_minus_E)
3696                 sv_catpvs(PL_linestr,
3697                           "use feature ':5." STRINGIFY(PERL_VERSION) "';");
3698             if (PL_minus_n || PL_minus_p) {
3699                 sv_catpvs(PL_linestr, "LINE: while (<>) {");
3700                 if (PL_minus_l)
3701                     sv_catpvs(PL_linestr,"chomp;");
3702                 if (PL_minus_a) {
3703                     if (PL_minus_F) {
3704                         if ((*PL_splitstr == '/' || *PL_splitstr == '\''
3705                              || *PL_splitstr == '"')
3706                               && strchr(PL_splitstr + 1, *PL_splitstr))
3707                             Perl_sv_catpvf(aTHX_ PL_linestr, "our @F=split(%s);", PL_splitstr);
3708                         else {
3709                             /* "q\0${splitstr}\0" is legal perl. Yes, even NUL
3710                                bytes can be used as quoting characters.  :-) */
3711                             const char *splits = PL_splitstr;
3712                             sv_catpvs(PL_linestr, "our @F=split(q\0");
3713                             do {
3714                                 /* Need to \ \s  */
3715                                 if (*splits == '\\')
3716                                     sv_catpvn(PL_linestr, splits, 1);
3717                                 sv_catpvn(PL_linestr, splits, 1);
3718                             } while (*splits++);
3719                             /* This loop will embed the trailing NUL of
3720                                PL_linestr as the last thing it does before
3721                                terminating.  */
3722                             sv_catpvs(PL_linestr, ");");
3723                         }
3724                     }
3725                     else
3726                         sv_catpvs(PL_linestr,"our @F=split(' ');");
3727                 }
3728             }
3729             sv_catpvs(PL_linestr, "\n");
3730             PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
3731             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
3732             PL_last_lop = PL_last_uni = NULL;
3733             if ((PERLDB_LINE || PERLDB_SAVESRC) && PL_curstash != PL_debstash)
3734                 update_debugger_info(PL_linestr, NULL, 0);
3735             goto retry;
3736         }
3737         do {
3738             bof = PL_rsfp ? TRUE : FALSE;
3739             if ((s = filter_gets(PL_linestr, PL_rsfp, 0)) == NULL) {
3740               fake_eof:
3741 #ifdef PERL_MAD
3742                 PL_realtokenstart = -1;
3743 #endif
3744                 if (PL_rsfp) {
3745                     if ((PerlIO *)PL_rsfp == PerlIO_stdin())
3746                         PerlIO_clearerr(PL_rsfp);
3747                     else
3748                         (void)PerlIO_close(PL_rsfp);
3749                     PL_rsfp = NULL;
3750                     PL_doextract = FALSE;
3751                 }
3752                 if (!PL_in_eval && (PL_minus_n || PL_minus_p)) {
3753 #ifdef PERL_MAD
3754                     if (PL_madskills)
3755                         PL_faketokens = 1;
3756 #endif
3757                     if (PL_minus_p)
3758                         sv_setpvs(PL_linestr, ";}continue{print;}");
3759                     else
3760                         sv_setpvs(PL_linestr, ";}");
3761                     PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
3762                     PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
3763                     PL_last_lop = PL_last_uni = NULL;
3764                     PL_minus_n = PL_minus_p = 0;
3765                     goto retry;
3766                 }
3767                 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
3768                 PL_last_lop = PL_last_uni = NULL;
3769                 sv_setpvs(PL_linestr,"");
3770                 TOKEN(';');     /* not infinite loop because rsfp is NULL now */
3771             }
3772             /* If it looks like the start of a BOM or raw UTF-16,
3773              * check if it in fact is. */
3774             else if (bof &&
3775                      (*s == 0 ||
3776                       *(U8*)s == 0xEF ||
3777                       *(U8*)s >= 0xFE ||
3778                       s[1] == 0)) {
3779 #ifdef PERLIO_IS_STDIO
3780 #  ifdef __GNU_LIBRARY__
3781 #    if __GNU_LIBRARY__ == 1 /* Linux glibc5 */
3782 #      define FTELL_FOR_PIPE_IS_BROKEN
3783 #    endif
3784 #  else
3785 #    ifdef __GLIBC__
3786 #      if __GLIBC__ == 1 /* maybe some glibc5 release had it like this? */
3787 #        define FTELL_FOR_PIPE_IS_BROKEN
3788 #      endif
3789 #    endif
3790 #  endif
3791 #endif
3792                 bof = PerlIO_tell(PL_rsfp) == (Off_t)SvCUR(PL_linestr);
3793                 if (bof) {
3794                     PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
3795                     s = swallow_bom((U8*)s);
3796                 }
3797             }
3798             if (PL_doextract) {
3799                 /* Incest with pod. */
3800 #ifdef PERL_MAD
3801                 if (PL_madskills)
3802                     sv_catsv(PL_thiswhite, PL_linestr);
3803 #endif
3804                 if (*s == '=' && strnEQ(s, "=cut", 4) && !isALPHA(s[4])) {
3805                     sv_setpvs(PL_linestr, "");
3806                     PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
3807                     PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
3808                     PL_last_lop = PL_last_uni = NULL;
3809                     PL_doextract = FALSE;
3810                 }
3811             }
3812             incline(s);
3813         } while (PL_doextract);
3814         PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = s;
3815         if ((PERLDB_LINE || PERLDB_SAVESRC) && PL_curstash != PL_debstash)
3816             update_debugger_info(PL_linestr, NULL, 0);
3817         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
3818         PL_last_lop = PL_last_uni = NULL;
3819         if (CopLINE(PL_curcop) == 1) {
3820             while (s < PL_bufend && isSPACE(*s))
3821                 s++;
3822             if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
3823                 s++;
3824 #ifdef PERL_MAD
3825             if (PL_madskills)
3826                 PL_thiswhite = newSVpvn(PL_linestart, s - PL_linestart);
3827 #endif
3828             d = NULL;
3829             if (!PL_in_eval) {
3830                 if (*s == '#' && *(s+1) == '!')
3831                     d = s + 2;
3832 #ifdef ALTERNATE_SHEBANG
3833                 else {
3834                     static char const as[] = ALTERNATE_SHEBANG;
3835                     if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
3836                         d = s + (sizeof(as) - 1);
3837                 }
3838 #endif /* ALTERNATE_SHEBANG */
3839             }
3840             if (d) {
3841                 char *ipath;
3842                 char *ipathend;
3843
3844                 while (isSPACE(*d))
3845                     d++;
3846                 ipath = d;
3847                 while (*d && !isSPACE(*d))
3848                     d++;
3849                 ipathend = d;
3850
3851 #ifdef ARG_ZERO_IS_SCRIPT
3852                 if (ipathend > ipath) {
3853                     /*
3854                      * HP-UX (at least) sets argv[0] to the script name,
3855                      * which makes $^X incorrect.  And Digital UNIX and Linux,
3856                      * at least, set argv[0] to the basename of the Perl
3857                      * interpreter. So, having found "#!", we'll set it right.
3858                      */
3859                     SV * const x = GvSV(gv_fetchpvs("\030", GV_ADD|GV_NOTQUAL,
3860                                                     SVt_PV)); /* $^X */
3861                     assert(SvPOK(x) || SvGMAGICAL(x));
3862                     if (sv_eq(x, CopFILESV(PL_curcop))) {
3863                         sv_setpvn(x, ipath, ipathend - ipath);
3864                         SvSETMAGIC(x);
3865                     }
3866                     else {
3867                         STRLEN blen;
3868                         STRLEN llen;
3869                         const char *bstart = SvPV_const(CopFILESV(PL_curcop),blen);
3870                         const char * const lstart = SvPV_const(x,llen);
3871                         if (llen < blen) {
3872                             bstart += blen - llen;
3873                             if (strnEQ(bstart, lstart, llen) && bstart[-1] == '/') {
3874                                 sv_setpvn(x, ipath, ipathend - ipath);
3875                                 SvSETMAGIC(x);
3876                             }
3877                         }
3878                     }
3879                     TAINT_NOT;  /* $^X is always tainted, but that's OK */
3880                 }
3881 #endif /* ARG_ZERO_IS_SCRIPT */
3882
3883                 /*
3884                  * Look for options.
3885                  */
3886                 d = instr(s,"perl -");
3887                 if (!d) {
3888                     d = instr(s,"perl");
3889 #if defined(DOSISH)
3890                     /* avoid getting into infinite loops when shebang
3891                      * line contains "Perl" rather than "perl" */
3892                     if (!d) {
3893                         for (d = ipathend-4; d >= ipath; --d) {
3894                             if ((*d == 'p' || *d == 'P')
3895                                 && !ibcmp(d, "perl", 4))
3896                             {
3897                                 break;
3898                             }
3899                         }
3900                         if (d < ipath)
3901                             d = NULL;
3902                     }
3903 #endif
3904                 }
3905 #ifdef ALTERNATE_SHEBANG
3906                 /*
3907                  * If the ALTERNATE_SHEBANG on this system starts with a
3908                  * character that can be part of a Perl expression, then if
3909                  * we see it but not "perl", we're probably looking at the
3910                  * start of Perl code, not a request to hand off to some
3911                  * other interpreter.  Similarly, if "perl" is there, but
3912                  * not in the first 'word' of the line, we assume the line
3913                  * contains the start of the Perl program.
3914                  */
3915                 if (d && *s != '#') {
3916                     const char *c = ipath;
3917                     while (*c && !strchr("; \t\r\n\f\v#", *c))
3918                         c++;
3919                     if (c < d)
3920                         d = NULL;       /* "perl" not in first word; ignore */
3921                     else
3922                         *s = '#';       /* Don't try to parse shebang line */
3923                 }
3924 #endif /* ALTERNATE_SHEBANG */
3925 #ifndef MACOS_TRADITIONAL
3926                 if (!d &&
3927                     *s == '#' &&
3928                     ipathend > ipath &&
3929                     !PL_minus_c &&
3930                     !instr(s,"indir") &&
3931                     instr(PL_origargv[0],"perl"))
3932                 {
3933                     dVAR;
3934                     char **newargv;
3935
3936                     *ipathend = '\0';
3937                     s = ipathend + 1;
3938                     while (s < PL_bufend && isSPACE(*s))
3939                         s++;
3940                     if (s < PL_bufend) {
3941                         Newxz(newargv,PL_origargc+3,char*);
3942                         newargv[1] = s;
3943                         while (s < PL_bufend && !isSPACE(*s))
3944                             s++;
3945                         *s = '\0';
3946                         Copy(PL_origargv+1, newargv+2, PL_origargc+1, char*);
3947                     }
3948                     else
3949                         newargv = PL_origargv;
3950                     newargv[0] = ipath;
3951                     PERL_FPU_PRE_EXEC
3952                     PerlProc_execv(ipath, EXEC_ARGV_CAST(newargv));
3953                     PERL_FPU_POST_EXEC
3954                     Perl_croak(aTHX_ "Can't exec %s", ipath);
3955                 }
3956 #endif
3957                 if (d) {
3958                     while (*d && !isSPACE(*d))
3959                         d++;
3960                     while (SPACE_OR_TAB(*d))
3961                         d++;
3962
3963                     if (*d++ == '-') {
3964                         const bool switches_done = PL_doswitches;
3965                         const U32 oldpdb = PL_perldb;
3966                         const bool oldn = PL_minus_n;
3967                         const bool oldp = PL_minus_p;
3968                         const char *d1 = d;
3969
3970                         do {
3971                             if (*d1 == 'M' || *d1 == 'm' || *d1 == 'C') {
3972                                 const char * const m = d1;
3973                                 while (*d1 && !isSPACE(*d1))
3974                                     d1++;
3975                                 Perl_croak(aTHX_ "Too late for \"-%.*s\" option",
3976                                       (int)(d1 - m), m);
3977                             }
3978                             d1 = moreswitches(d1);
3979                         } while (d1);
3980                         if (PL_doswitches && !switches_done) {
3981                             int argc = PL_origargc;
3982                             char **argv = PL_origargv;
3983                             do {
3984                                 argc--,argv++;
3985                             } while (argc && argv[0][0] == '-' && argv[0][1]);
3986                             init_argv_symbols(argc,argv);
3987                         }
3988                         if (((PERLDB_LINE || PERLDB_SAVESRC) && !oldpdb) ||
3989                             ((PL_minus_n || PL_minus_p) && !(oldn || oldp)))
3990                               /* if we have already added "LINE: while (<>) {",
3991                                  we must not do it again */
3992                         {
3993                             sv_setpvs(PL_linestr, "");
3994                             PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
3995                             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
3996                             PL_last_lop = PL_last_uni = NULL;
3997                             PL_preambled = FALSE;
3998                             if (PERLDB_LINE || PERLDB_SAVESRC)
3999                                 (void)gv_fetchfile(PL_origfilename);
4000                             goto retry;
4001                         }
4002                     }
4003                 }
4004             }
4005         }
4006         if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
4007             PL_bufptr = s;
4008             PL_lex_state = LEX_FORMLINE;
4009             return yylex();
4010         }
4011         goto retry;
4012     case '\r':
4013 #ifdef PERL_STRICT_CR
4014         Perl_warn(aTHX_ "Illegal character \\%03o (carriage return)", '\r');
4015         Perl_croak(aTHX_
4016       "\t(Maybe you didn't strip carriage returns after a network transfer?)\n");
4017 #endif
4018     case ' ': case '\t': case '\f': case 013:
4019 #ifdef MACOS_TRADITIONAL
4020     case '\312':
4021 #endif
4022 #ifdef PERL_MAD
4023         PL_realtokenstart = -1;
4024         if (!PL_thiswhite)
4025             PL_thiswhite = newSVpvs("");
4026         sv_catpvn(PL_thiswhite, s, 1);
4027 #endif
4028         s++;
4029         goto retry;
4030     case '#':
4031     case '\n':
4032 #ifdef PERL_MAD
4033         PL_realtokenstart = -1;
4034         if (PL_madskills)
4035             PL_faketokens = 0;
4036 #endif
4037         if (PL_lex_state != LEX_NORMAL || (PL_in_eval && !PL_rsfp)) {
4038             if (*s == '#' && s == PL_linestart && PL_in_eval && !PL_rsfp) {
4039                 /* handle eval qq[#line 1 "foo"\n ...] */
4040                 CopLINE_dec(PL_curcop);
4041                 incline(s);
4042             }
4043             if (PL_madskills && !PL_lex_formbrack && !PL_in_eval) {
4044                 s = SKIPSPACE0(s);
4045                 if (!PL_in_eval || PL_rsfp)
4046                     incline(s);
4047             }
4048             else {
4049                 d = s;
4050                 while (d < PL_bufend && *d != '\n')
4051                     d++;
4052                 if (d < PL_bufend)
4053                     d++;
4054                 else if (d > PL_bufend) /* Found by Ilya: feed random input to Perl. */
4055                   Perl_croak(aTHX_ "panic: input overflow");
4056 #ifdef PERL_MAD
4057                 if (PL_madskills)
4058                     PL_thiswhite = newSVpvn(s, d - s);
4059 #endif
4060                 s = d;
4061                 incline(s);
4062             }
4063             if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
4064                 PL_bufptr = s;
4065                 PL_lex_state = LEX_FORMLINE;
4066                 return yylex();
4067             }
4068         }
4069         else {
4070 #ifdef PERL_MAD
4071             if (PL_madskills && CopLINE(PL_curcop) >= 1 && !PL_lex_formbrack) {
4072                 if (CopLINE(PL_curcop) == 1 && s[0] == '#' && s[1] == '!') {
4073                     PL_faketokens = 0;
4074                     s = SKIPSPACE0(s);
4075                     TOKEN(PEG); /* make sure any #! line is accessible */
4076                 }
4077                 s = SKIPSPACE0(s);
4078             }
4079             else {
4080 /*              if (PL_madskills && PL_lex_formbrack) { */
4081                     d = s;
4082                     while (d < PL_bufend && *d != '\n')
4083                         d++;
4084                     if (d < PL_bufend)
4085                         d++;
4086                     else if (d > PL_bufend) /* Found by Ilya: feed random input to Perl. */
4087                       Perl_croak(aTHX_ "panic: input overflow");
4088                     if (PL_madskills && CopLINE(PL_curcop) >= 1) {
4089                         if (!PL_thiswhite)
4090                             PL_thiswhite = newSVpvs("");
4091                         if (CopLINE(PL_curcop) == 1) {
4092                             sv_setpvs(PL_thiswhite, "");
4093                             PL_faketokens = 0;
4094                         }
4095                         sv_catpvn(PL_thiswhite, s, d - s);
4096                     }
4097                     s = d;
4098 /*              }
4099                 *s = '\0';
4100                 PL_bufend = s; */
4101             }
4102 #else
4103             *s = '\0';
4104             PL_bufend = s;
4105 #endif
4106         }
4107         goto retry;
4108     case '-':
4109         if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
4110             I32 ftst = 0;
4111             char tmp;
4112
4113             s++;
4114             PL_bufptr = s;
4115             tmp = *s++;
4116
4117             while (s < PL_bufend && SPACE_OR_TAB(*s))
4118                 s++;
4119
4120             if (strnEQ(s,"=>",2)) {
4121                 s = force_word(PL_bufptr,WORD,FALSE,FALSE,FALSE);
4122                 DEBUG_T( { printbuf("### Saw unary minus before =>, forcing word %s\n", s); } );
4123                 OPERATOR('-');          /* unary minus */
4124             }
4125             PL_last_uni = PL_oldbufptr;
4126             switch (tmp) {
4127             case 'r': ftst = OP_FTEREAD;        break;
4128             case 'w': ftst = OP_FTEWRITE;       break;
4129             case 'x': ftst = OP_FTEEXEC;        break;
4130             case 'o': ftst = OP_FTEOWNED;       break;
4131             case 'R': ftst = OP_FTRREAD;        break;
4132             case 'W': ftst = OP_FTRWRITE;       break;
4133             case 'X': ftst = OP_FTREXEC;        break;
4134             case 'O': ftst = OP_FTROWNED;       break;
4135             case 'e': ftst = OP_FTIS;           break;
4136             case 'z': ftst = OP_FTZERO;         break;
4137             case 's': ftst = OP_FTSIZE;         break;
4138             case 'f': ftst = OP_FTFILE;         break;
4139             case 'd': ftst = OP_FTDIR;          break;
4140             case 'l': ftst = OP_FTLINK;         break;
4141             case 'p': ftst = OP_FTPIPE;         break;
4142             case 'S': ftst = OP_FTSOCK;         break;
4143             case 'u': ftst = OP_FTSUID;         break;
4144             case 'g': ftst = OP_FTSGID;         break;
4145             case 'k': ftst = OP_FTSVTX;         break;
4146             case 'b': ftst = OP_FTBLK;          break;
4147             case 'c': ftst = OP_FTCHR;          break;
4148             case 't': ftst = OP_FTTTY;          break;
4149             case 'T': ftst = OP_FTTEXT;         break;
4150             case 'B': ftst = OP_FTBINARY;       break;
4151             case 'M': case 'A': case 'C':
4152                 gv_fetchpvs("\024", GV_ADD|GV_NOTQUAL, SVt_PV);
4153                 switch (tmp) {
4154                 case 'M': ftst = OP_FTMTIME;    break;
4155                 case 'A': ftst = OP_FTATIME;    break;
4156                 case 'C': ftst = OP_FTCTIME;    break;
4157                 default:                        break;
4158                 }
4159                 break;
4160             default:
4161                 break;
4162             }
4163             if (ftst) {
4164                 PL_last_lop_op = (OPCODE)ftst;
4165                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
4166                         "### Saw file test %c\n", (int)tmp);
4167                 } );
4168                 FTST(ftst);
4169             }
4170             else {
4171                 /* Assume it was a minus followed by a one-letter named
4172                  * subroutine call (or a -bareword), then. */
4173                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
4174                         "### '-%c' looked like a file test but was not\n",
4175                         (int) tmp);
4176                 } );
4177                 s = --PL_bufptr;
4178             }
4179         }
4180         {
4181             const char tmp = *s++;
4182             if (*s == tmp) {
4183                 s++;
4184                 if (PL_expect == XOPERATOR)
4185                     TERM(POSTDEC);
4186                 else
4187                     OPERATOR(PREDEC);
4188             }
4189             else if (*s == '>') {
4190                 s++;
4191                 s = SKIPSPACE1(s);
4192                 if (isIDFIRST_lazy_if(s,UTF)) {
4193                     s = force_word(s,METHOD,FALSE,TRUE,FALSE);
4194                     TOKEN(ARROW);
4195                 }
4196                 else if (*s == '$')
4197                     OPERATOR(ARROW);
4198                 else
4199                     TERM(ARROW);
4200             }
4201             if (PL_expect == XOPERATOR)
4202                 Aop(OP_SUBTRACT);
4203             else {
4204                 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
4205                     check_uni();
4206                 OPERATOR('-');          /* unary minus */
4207             }
4208         }
4209
4210     case '+':
4211         {
4212             const char tmp = *s++;
4213             if (*s == tmp) {
4214                 s++;
4215                 if (PL_expect == XOPERATOR)
4216                     TERM(POSTINC);
4217                 else
4218                     OPERATOR(PREINC);
4219             }
4220             if (PL_expect == XOPERATOR)
4221                 Aop(OP_ADD);
4222             else {
4223                 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
4224                     check_uni();
4225                 OPERATOR('+');
4226             }
4227         }
4228
4229     case '*':
4230         if (PL_expect != XOPERATOR) {
4231             s = scan_ident(s, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
4232             PL_expect = XOPERATOR;
4233             force_ident(PL_tokenbuf, '*');
4234             if (!*PL_tokenbuf)
4235                 PREREF('*');
4236             TERM('*');
4237         }
4238         s++;
4239         if (*s == '*') {
4240             s++;
4241             PWop(OP_POW);
4242         }
4243         Mop(OP_MULTIPLY);
4244
4245     case '%':
4246         if (PL_expect == XOPERATOR) {
4247             ++s;
4248             Mop(OP_MODULO);
4249         }
4250         PL_tokenbuf[0] = '%';
4251         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
4252                 sizeof PL_tokenbuf - 1, FALSE);
4253         if (!PL_tokenbuf[1]) {
4254             PREREF('%');
4255         }
4256         PL_pending_ident = '%';
4257         TERM('%');
4258
4259     case '^':
4260         s++;
4261         BOop(OP_BIT_XOR);
4262     case '[':
4263         PL_lex_brackets++;
4264         /* FALL THROUGH */
4265     case '~':
4266         if (s[1] == '~'
4267             && (PL_expect == XOPERATOR || PL_expect == XTERMORDORDOR))
4268         {
4269             s += 2;
4270             Eop(OP_SMARTMATCH);
4271         }
4272     case ',':
4273         {
4274             const char tmp = *s++;
4275             OPERATOR(tmp);
4276         }
4277     case ':':
4278         if (s[1] == ':') {
4279             len = 0;
4280             goto just_a_word_zero_gv;
4281         }
4282         s++;
4283         switch (PL_expect) {
4284             OP *attrs;
4285 #ifdef PERL_MAD
4286             I32 stuffstart;
4287 #endif
4288         case XOPERATOR:
4289             if (!PL_in_my || PL_lex_state != LEX_NORMAL)
4290                 break;
4291             PL_bufptr = s;      /* update in case we back off */
4292             goto grabattrs;
4293         case XATTRBLOCK:
4294             PL_expect = XBLOCK;
4295             goto grabattrs;
4296         case XATTRTERM:
4297             PL_expect = XTERMBLOCK;
4298          grabattrs:
4299 #ifdef PERL_MAD
4300             stuffstart = s - SvPVX(PL_linestr) - 1;
4301 #endif
4302             s = PEEKSPACE(s);
4303             attrs = NULL;
4304             while (isIDFIRST_lazy_if(s,UTF)) {
4305                 I32 tmp;
4306                 SV *sv;
4307                 d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
4308                 if (isLOWER(*s) && (tmp = keyword(PL_tokenbuf, len, 0))) {
4309                     if (tmp < 0) tmp = -tmp;
4310                     switch (tmp) {
4311                     case KEY_or:
4312                     case KEY_and:
4313                     case KEY_for:
4314                     case KEY_unless:
4315                     case KEY_if:
4316                     case KEY_while:
4317                     case KEY_until:
4318                         goto got_attrs;
4319                     default:
4320                         break;
4321                     }
4322                 }
4323                 sv = newSVpvn(s, len);
4324                 if (*d == '(') {
4325                     d = scan_str(d,TRUE,TRUE);
4326                     if (!d) {
4327                         /* MUST advance bufptr here to avoid bogus
4328                            "at end of line" context messages from yyerror().
4329                          */
4330                         PL_bufptr = s + len;
4331                         yyerror("Unterminated attribute parameter in attribute list");
4332                         if (attrs)
4333                             op_free(attrs);
4334                         sv_free(sv);
4335                         return REPORT(0);       /* EOF indicator */
4336                     }
4337                 }
4338                 if (PL_lex_stuff) {
4339                     sv_catsv(sv, PL_lex_stuff);
4340                     attrs = append_elem(OP_LIST, attrs,
4341                                         newSVOP(OP_CONST, 0, sv));
4342                     SvREFCNT_dec(PL_lex_stuff);
4343                     PL_lex_stuff = NULL;
4344                 }
4345                 else {
4346                     if (len == 6 && strnEQ(SvPVX(sv), "unique", len)) {
4347                         sv_free(sv);
4348                         if (PL_in_my == KEY_our) {
4349 #ifdef USE_ITHREADS
4350                             GvUNIQUE_on(cGVOPx_gv(pl_yylval.opval));
4351 #else
4352                             /* skip to avoid loading attributes.pm */
4353 #endif
4354                             deprecate(":unique");
4355                         }
4356                         else
4357                             Perl_croak(aTHX_ "The 'unique' attribute may only be applied to 'our' variables");
4358                     }
4359
4360                     /* NOTE: any CV attrs applied here need to be part of
4361                        the CVf_BUILTIN_ATTRS define in cv.h! */
4362                     else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "lvalue", len)) {
4363                         sv_free(sv);
4364                         CvLVALUE_on(PL_compcv);
4365                     }
4366                     else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "locked", len)) {
4367                         sv_free(sv);
4368                         CvLOCKED_on(PL_compcv);
4369                     }
4370                     else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "method", len)) {
4371                         sv_free(sv);
4372                         CvMETHOD_on(PL_compcv);
4373                     }
4374                     /* After we've set the flags, it could be argued that
4375                        we don't need to do the attributes.pm-based setting
4376                        process, and shouldn't bother appending recognized
4377                        flags.  To experiment with that, uncomment the
4378                        following "else".  (Note that's already been
4379                        uncommented.  That keeps the above-applied built-in
4380                        attributes from being intercepted (and possibly
4381                        rejected) by a package's attribute routines, but is
4382                        justified by the performance win for the common case
4383                        of applying only built-in attributes.) */
4384                     else
4385                         attrs = append_elem(OP_LIST, attrs,
4386                                             newSVOP(OP_CONST, 0,
4387                                                     sv));
4388                 }
4389                 s = PEEKSPACE(d);
4390                 if (*s == ':' && s[1] != ':')
4391                     s = PEEKSPACE(s+1);
4392                 else if (s == d)
4393                     break;      /* require real whitespace or :'s */
4394                 /* XXX losing whitespace on sequential attributes here */
4395             }
4396             {
4397                 const char tmp
4398                     = (PL_expect == XOPERATOR ? '=' : '{'); /*'}(' for vi */
4399                 if (*s != ';' && *s != '}' && *s != tmp
4400                     && (tmp != '=' || *s != ')')) {
4401                     const char q = ((*s == '\'') ? '"' : '\'');
4402                     /* If here for an expression, and parsed no attrs, back
4403                        off. */
4404                     if (tmp == '=' && !attrs) {
4405                         s = PL_bufptr;
4406                         break;
4407                     }
4408                     /* MUST advance bufptr here to avoid bogus "at end of line"
4409                        context messages from yyerror().
4410                     */
4411                     PL_bufptr = s;
4412                     yyerror( (const char *)
4413                              (*s
4414                               ? Perl_form(aTHX_ "Invalid separator character "
4415                                           "%c%c%c in attribute list", q, *s, q)
4416                               : "Unterminated attribute list" ) );
4417                     if (attrs)
4418                         op_free(attrs);
4419