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