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