Pull the am-I-utf8-or-not logic into one place (S_newSV_maybe_utf8)
[p5sagit/p5-mst-13.2.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                     yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
4264                     PL_last_lop = PL_oldbufptr;
4265                     PL_last_lop_op = OP_ENTERSUB;
4266                     /* Is there a prototype? */
4267                     if (SvPOK(cv)) {
4268                         STRLEN len;
4269                         char *proto = SvPV((SV*)cv, len);
4270                         if (!len)
4271                             TERM(FUNC0SUB);
4272                         if (*proto == '$' && proto[1] == '\0')
4273                             OPERATOR(UNIOPSUB);
4274                         while (*proto == ';')
4275                             proto++;
4276                         if (*proto == '&' && *s == '{') {
4277                             sv_setpv(PL_subname, PL_curstash ? 
4278                                         "__ANON__" : "__ANON__::__ANON__");
4279                             PREBLOCK(LSTOPSUB);
4280                         }
4281                     }
4282                     PL_nextval[PL_nexttoke].opval = yylval.opval;
4283                     PL_expect = XTERM;
4284                     force_next(WORD);
4285                     TOKEN(NOAMP);
4286                 }
4287
4288                 /* Call it a bare word */
4289
4290                 if (PL_hints & HINT_STRICT_SUBS)
4291                     yylval.opval->op_private |= OPpCONST_STRICT;
4292                 else {
4293                 bareword:
4294                     if (ckWARN(WARN_RESERVED)) {
4295                         if (lastchar != '-') {
4296                             for (d = PL_tokenbuf; *d && isLOWER(*d); d++) ;
4297                             if (!*d && !gv_stashpv(PL_tokenbuf,FALSE))
4298                                 Perl_warner(aTHX_ packWARN(WARN_RESERVED), PL_warn_reserved,
4299                                        PL_tokenbuf);
4300                         }
4301                     }
4302                 }
4303
4304             safe_bareword:
4305                 if ((lastchar == '*' || lastchar == '%' || lastchar == '&')
4306                     && ckWARN_d(WARN_AMBIGUOUS)) {
4307                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
4308                         "Operator or semicolon missing before %c%s",
4309                         lastchar, PL_tokenbuf);
4310                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
4311                         "Ambiguous use of %c resolved as operator %c",
4312                         lastchar, lastchar);
4313                 }
4314                 TOKEN(WORD);
4315             }
4316
4317         case KEY___FILE__:
4318             yylval.opval = (OP*)newSVOP(OP_CONST, 0,
4319                                         newSVpv(CopFILE(PL_curcop),0));
4320             TERM(THING);
4321
4322         case KEY___LINE__:
4323             yylval.opval = (OP*)newSVOP(OP_CONST, 0,
4324                                     Perl_newSVpvf(aTHX_ "%"IVdf, (IV)CopLINE(PL_curcop)));
4325             TERM(THING);
4326
4327         case KEY___PACKAGE__:
4328             yylval.opval = (OP*)newSVOP(OP_CONST, 0,
4329                                         (PL_curstash
4330                                          ? newSVpv(HvNAME(PL_curstash), 0)
4331                                          : &PL_sv_undef));
4332             TERM(THING);
4333
4334         case KEY___DATA__:
4335         case KEY___END__: {
4336             GV *gv;
4337
4338             /*SUPPRESS 560*/
4339             if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
4340                 char *pname = "main";
4341                 if (PL_tokenbuf[2] == 'D')
4342                     pname = HvNAME(PL_curstash ? PL_curstash : PL_defstash);
4343                 gv = gv_fetchpv(Perl_form(aTHX_ "%s::DATA", pname), TRUE, SVt_PVIO);
4344                 GvMULTI_on(gv);
4345                 if (!GvIO(gv))
4346                     GvIOp(gv) = newIO();
4347                 IoIFP(GvIOp(gv)) = PL_rsfp;
4348 #if defined(HAS_FCNTL) && defined(F_SETFD)
4349                 {
4350                     int fd = PerlIO_fileno(PL_rsfp);
4351                     fcntl(fd,F_SETFD,fd >= 3);
4352                 }
4353 #endif
4354                 /* Mark this internal pseudo-handle as clean */
4355                 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
4356                 if (PL_preprocess)
4357                     IoTYPE(GvIOp(gv)) = IoTYPE_PIPE;
4358                 else if ((PerlIO*)PL_rsfp == PerlIO_stdin())
4359                     IoTYPE(GvIOp(gv)) = IoTYPE_STD;
4360                 else
4361                     IoTYPE(GvIOp(gv)) = IoTYPE_RDONLY;
4362 #if defined(WIN32) && !defined(PERL_TEXTMODE_SCRIPTS)
4363                 /* if the script was opened in binmode, we need to revert
4364                  * it to text mode for compatibility; but only iff it has CRs
4365                  * XXX this is a questionable hack at best. */
4366                 if (PL_bufend-PL_bufptr > 2
4367                     && PL_bufend[-1] == '\n' && PL_bufend[-2] == '\r')
4368                 {
4369                     Off_t loc = 0;
4370                     if (IoTYPE(GvIOp(gv)) == IoTYPE_RDONLY) {
4371                         loc = PerlIO_tell(PL_rsfp);
4372                         (void)PerlIO_seek(PL_rsfp, 0L, 0);
4373                     }
4374 #ifdef NETWARE
4375                         if (PerlLIO_setmode(PL_rsfp, O_TEXT) != -1) {
4376 #else
4377                     if (PerlLIO_setmode(PerlIO_fileno(PL_rsfp), O_TEXT) != -1) {
4378 #endif  /* NETWARE */
4379 #ifdef PERLIO_IS_STDIO /* really? */
4380 #  if defined(__BORLANDC__)
4381                         /* XXX see note in do_binmode() */
4382                         ((FILE*)PL_rsfp)->flags &= ~_F_BIN;
4383 #  endif
4384 #endif
4385                         if (loc > 0)
4386                             PerlIO_seek(PL_rsfp, loc, 0);
4387                     }
4388                 }
4389 #endif
4390 #ifdef PERLIO_LAYERS
4391                 if (!IN_BYTES) {
4392                     if (UTF)
4393                         PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, ":utf8");
4394                     else if (PL_encoding) {
4395                         SV *name;
4396                         dSP;
4397                         ENTER;
4398                         SAVETMPS;
4399                         PUSHMARK(sp);
4400                         EXTEND(SP, 1);
4401                         XPUSHs(PL_encoding);
4402                         PUTBACK;
4403                         call_method("name", G_SCALAR);
4404                         SPAGAIN;
4405                         name = POPs;
4406                         PUTBACK;
4407                         PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, 
4408                                             Perl_form(aTHX_ ":encoding(%"SVf")",
4409                                                       name));
4410                         FREETMPS;
4411                         LEAVE;
4412                     }
4413                 }
4414 #endif
4415                 PL_rsfp = Nullfp;
4416             }
4417             goto fake_eof;
4418         }
4419
4420         case KEY_AUTOLOAD:
4421         case KEY_DESTROY:
4422         case KEY_BEGIN:
4423         case KEY_CHECK:
4424         case KEY_INIT:
4425         case KEY_END:
4426             if (PL_expect == XSTATE) {
4427                 s = PL_bufptr;
4428                 goto really_sub;
4429             }
4430             goto just_a_word;
4431
4432         case KEY_CORE:
4433             if (*s == ':' && s[1] == ':') {
4434                 s += 2;
4435                 d = s;
4436                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
4437                 if (!(tmp = keyword(PL_tokenbuf, len)))
4438                     Perl_croak(aTHX_ "CORE::%s is not a keyword", PL_tokenbuf);
4439                 if (tmp < 0)
4440                     tmp = -tmp;
4441                 goto reserved_word;
4442             }
4443             goto just_a_word;
4444
4445         case KEY_abs:
4446             UNI(OP_ABS);
4447
4448         case KEY_alarm:
4449             UNI(OP_ALARM);
4450
4451         case KEY_accept:
4452             LOP(OP_ACCEPT,XTERM);
4453
4454         case KEY_and:
4455             OPERATOR(ANDOP);
4456
4457         case KEY_atan2:
4458             LOP(OP_ATAN2,XTERM);
4459
4460         case KEY_bind:
4461             LOP(OP_BIND,XTERM);
4462
4463         case KEY_binmode:
4464             LOP(OP_BINMODE,XTERM);
4465
4466         case KEY_bless:
4467             LOP(OP_BLESS,XTERM);
4468
4469         case KEY_chop:
4470             UNI(OP_CHOP);
4471
4472         case KEY_continue:
4473             PREBLOCK(CONTINUE);
4474
4475         case KEY_chdir:
4476             (void)gv_fetchpv("ENV",TRUE, SVt_PVHV);     /* may use HOME */
4477             UNI(OP_CHDIR);
4478
4479         case KEY_close:
4480             UNI(OP_CLOSE);
4481
4482         case KEY_closedir:
4483             UNI(OP_CLOSEDIR);
4484
4485         case KEY_cmp:
4486             Eop(OP_SCMP);
4487
4488         case KEY_caller:
4489             UNI(OP_CALLER);
4490
4491         case KEY_crypt:
4492 #ifdef FCRYPT
4493             if (!PL_cryptseen) {
4494                 PL_cryptseen = TRUE;
4495                 init_des();
4496             }
4497 #endif
4498             LOP(OP_CRYPT,XTERM);
4499
4500         case KEY_chmod:
4501             LOP(OP_CHMOD,XTERM);
4502
4503         case KEY_chown:
4504             LOP(OP_CHOWN,XTERM);
4505
4506         case KEY_connect:
4507             LOP(OP_CONNECT,XTERM);
4508
4509         case KEY_chr:
4510             UNI(OP_CHR);
4511
4512         case KEY_cos:
4513             UNI(OP_COS);
4514
4515         case KEY_chroot:
4516             UNI(OP_CHROOT);
4517
4518         case KEY_do:
4519             s = skipspace(s);
4520             if (*s == '{')
4521                 PRETERMBLOCK(DO);
4522             if (*s != '\'')
4523                 s = force_word(s,WORD,TRUE,TRUE,FALSE);
4524             OPERATOR(DO);
4525
4526         case KEY_die:
4527             PL_hints |= HINT_BLOCK_SCOPE;
4528             LOP(OP_DIE,XTERM);
4529
4530         case KEY_defined:
4531             UNI(OP_DEFINED);
4532
4533         case KEY_delete:
4534             UNI(OP_DELETE);
4535
4536         case KEY_dbmopen:
4537             gv_fetchpv("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
4538             LOP(OP_DBMOPEN,XTERM);
4539
4540         case KEY_dbmclose:
4541             UNI(OP_DBMCLOSE);
4542
4543         case KEY_dump:
4544             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4545             LOOPX(OP_DUMP);
4546
4547         case KEY_else:
4548             PREBLOCK(ELSE);
4549
4550         case KEY_elsif:
4551             yylval.ival = CopLINE(PL_curcop);
4552             OPERATOR(ELSIF);
4553
4554         case KEY_eq:
4555             Eop(OP_SEQ);
4556
4557         case KEY_exists:
4558             UNI(OP_EXISTS);
4559         
4560         case KEY_exit:
4561             UNI(OP_EXIT);
4562
4563         case KEY_eval:
4564             s = skipspace(s);
4565             PL_expect = (*s == '{') ? XTERMBLOCK : XTERM;
4566             UNIBRACK(OP_ENTEREVAL);
4567
4568         case KEY_eof:
4569             UNI(OP_EOF);
4570
4571         case KEY_err:
4572             OPERATOR(DOROP);
4573
4574         case KEY_exp:
4575             UNI(OP_EXP);
4576
4577         case KEY_each:
4578             UNI(OP_EACH);
4579
4580         case KEY_exec:
4581             set_csh();
4582             LOP(OP_EXEC,XREF);
4583
4584         case KEY_endhostent:
4585             FUN0(OP_EHOSTENT);
4586
4587         case KEY_endnetent:
4588             FUN0(OP_ENETENT);
4589
4590         case KEY_endservent:
4591             FUN0(OP_ESERVENT);
4592
4593         case KEY_endprotoent:
4594             FUN0(OP_EPROTOENT);
4595
4596         case KEY_endpwent:
4597             FUN0(OP_EPWENT);
4598
4599         case KEY_endgrent:
4600             FUN0(OP_EGRENT);
4601
4602         case KEY_for:
4603         case KEY_foreach:
4604             yylval.ival = CopLINE(PL_curcop);
4605             s = skipspace(s);
4606             if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) {
4607                 char *p = s;
4608                 if ((PL_bufend - p) >= 3 &&
4609                     strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
4610                     p += 2;
4611                 else if ((PL_bufend - p) >= 4 &&
4612                     strnEQ(p, "our", 3) && isSPACE(*(p + 3)))
4613                     p += 3;
4614                 p = skipspace(p);
4615                 if (isIDFIRST_lazy_if(p,UTF)) {
4616                     p = scan_ident(p, PL_bufend,
4617                         PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
4618                     p = skipspace(p);
4619                 }
4620                 if (*p != '$')
4621                     Perl_croak(aTHX_ "Missing $ on loop variable");
4622             }
4623             OPERATOR(FOR);
4624
4625         case KEY_formline:
4626             LOP(OP_FORMLINE,XTERM);
4627
4628         case KEY_fork:
4629             FUN0(OP_FORK);
4630
4631         case KEY_fcntl:
4632             LOP(OP_FCNTL,XTERM);
4633
4634         case KEY_fileno:
4635             UNI(OP_FILENO);
4636
4637         case KEY_flock:
4638             LOP(OP_FLOCK,XTERM);
4639
4640         case KEY_gt:
4641             Rop(OP_SGT);
4642
4643         case KEY_ge:
4644             Rop(OP_SGE);
4645
4646         case KEY_grep:
4647             LOP(OP_GREPSTART, XREF);
4648
4649         case KEY_goto:
4650             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4651             LOOPX(OP_GOTO);
4652
4653         case KEY_gmtime:
4654             UNI(OP_GMTIME);
4655
4656         case KEY_getc:
4657             UNIDOR(OP_GETC);
4658
4659         case KEY_getppid:
4660             FUN0(OP_GETPPID);
4661
4662         case KEY_getpgrp:
4663             UNI(OP_GETPGRP);
4664
4665         case KEY_getpriority:
4666             LOP(OP_GETPRIORITY,XTERM);
4667
4668         case KEY_getprotobyname:
4669             UNI(OP_GPBYNAME);
4670
4671         case KEY_getprotobynumber:
4672             LOP(OP_GPBYNUMBER,XTERM);
4673
4674         case KEY_getprotoent:
4675             FUN0(OP_GPROTOENT);
4676
4677         case KEY_getpwent:
4678             FUN0(OP_GPWENT);
4679
4680         case KEY_getpwnam:
4681             UNI(OP_GPWNAM);
4682
4683         case KEY_getpwuid:
4684             UNI(OP_GPWUID);
4685
4686         case KEY_getpeername:
4687             UNI(OP_GETPEERNAME);
4688
4689         case KEY_gethostbyname:
4690             UNI(OP_GHBYNAME);
4691
4692         case KEY_gethostbyaddr:
4693             LOP(OP_GHBYADDR,XTERM);
4694
4695         case KEY_gethostent:
4696             FUN0(OP_GHOSTENT);
4697
4698         case KEY_getnetbyname:
4699             UNI(OP_GNBYNAME);
4700
4701         case KEY_getnetbyaddr:
4702             LOP(OP_GNBYADDR,XTERM);
4703
4704         case KEY_getnetent:
4705             FUN0(OP_GNETENT);
4706
4707         case KEY_getservbyname:
4708             LOP(OP_GSBYNAME,XTERM);
4709
4710         case KEY_getservbyport:
4711             LOP(OP_GSBYPORT,XTERM);
4712
4713         case KEY_getservent:
4714             FUN0(OP_GSERVENT);
4715
4716         case KEY_getsockname:
4717             UNI(OP_GETSOCKNAME);
4718
4719         case KEY_getsockopt:
4720             LOP(OP_GSOCKOPT,XTERM);
4721
4722         case KEY_getgrent:
4723             FUN0(OP_GGRENT);
4724
4725         case KEY_getgrnam:
4726             UNI(OP_GGRNAM);
4727
4728         case KEY_getgrgid:
4729             UNI(OP_GGRGID);
4730
4731         case KEY_getlogin:
4732             FUN0(OP_GETLOGIN);
4733
4734         case KEY_glob:
4735             set_csh();
4736             LOP(OP_GLOB,XTERM);
4737
4738         case KEY_hex:
4739             UNI(OP_HEX);
4740
4741         case KEY_if:
4742             yylval.ival = CopLINE(PL_curcop);
4743             OPERATOR(IF);
4744
4745         case KEY_index:
4746             LOP(OP_INDEX,XTERM);
4747
4748         case KEY_int:
4749             UNI(OP_INT);
4750
4751         case KEY_ioctl:
4752             LOP(OP_IOCTL,XTERM);
4753
4754         case KEY_join:
4755             LOP(OP_JOIN,XTERM);
4756
4757         case KEY_keys:
4758             UNI(OP_KEYS);
4759
4760         case KEY_kill:
4761             LOP(OP_KILL,XTERM);
4762
4763         case KEY_last:
4764             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4765             LOOPX(OP_LAST);
4766         
4767         case KEY_lc:
4768             UNI(OP_LC);
4769
4770         case KEY_lcfirst:
4771             UNI(OP_LCFIRST);
4772
4773         case KEY_local:
4774             yylval.ival = 0;
4775             OPERATOR(LOCAL);
4776
4777         case KEY_length:
4778             UNI(OP_LENGTH);
4779
4780         case KEY_lt:
4781             Rop(OP_SLT);
4782
4783         case KEY_le:
4784             Rop(OP_SLE);
4785
4786         case KEY_localtime:
4787             UNI(OP_LOCALTIME);
4788
4789         case KEY_log:
4790             UNI(OP_LOG);
4791
4792         case KEY_link:
4793             LOP(OP_LINK,XTERM);
4794
4795         case KEY_listen:
4796             LOP(OP_LISTEN,XTERM);
4797
4798         case KEY_lock:
4799             UNI(OP_LOCK);
4800
4801         case KEY_lstat:
4802             UNI(OP_LSTAT);
4803
4804         case KEY_m:
4805             s = scan_pat(s,OP_MATCH);
4806             TERM(sublex_start());
4807
4808         case KEY_map:
4809             LOP(OP_MAPSTART, XREF);
4810
4811         case KEY_mkdir:
4812             LOP(OP_MKDIR,XTERM);
4813
4814         case KEY_msgctl:
4815             LOP(OP_MSGCTL,XTERM);
4816
4817         case KEY_msgget:
4818             LOP(OP_MSGGET,XTERM);
4819
4820         case KEY_msgrcv:
4821             LOP(OP_MSGRCV,XTERM);
4822
4823         case KEY_msgsnd:
4824             LOP(OP_MSGSND,XTERM);
4825
4826         case KEY_our:
4827         case KEY_my:
4828             PL_in_my = tmp;
4829             s = skipspace(s);
4830             if (isIDFIRST_lazy_if(s,UTF)) {
4831                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
4832                 if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
4833                     goto really_sub;
4834                 PL_in_my_stash = find_in_my_stash(PL_tokenbuf, len);
4835                 if (!PL_in_my_stash) {
4836                     char tmpbuf[1024];
4837                     PL_bufptr = s;
4838                     sprintf(tmpbuf, "No such class %.1000s", PL_tokenbuf);
4839                     yyerror(tmpbuf);
4840                 }
4841             }
4842             yylval.ival = 1;
4843             OPERATOR(MY);
4844
4845         case KEY_next:
4846             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4847             LOOPX(OP_NEXT);
4848
4849         case KEY_ne:
4850             Eop(OP_SNE);
4851
4852         case KEY_no:
4853             if (PL_expect != XSTATE)
4854                 yyerror("\"no\" not allowed in expression");
4855             s = force_word(s,WORD,FALSE,TRUE,FALSE);
4856             s = force_version(s, FALSE);
4857             yylval.ival = 0;
4858             OPERATOR(USE);
4859
4860         case KEY_not:
4861             if (*s == '(' || (s = skipspace(s), *s == '('))
4862                 FUN1(OP_NOT);
4863             else
4864                 OPERATOR(NOTOP);
4865
4866         case KEY_open:
4867             s = skipspace(s);
4868             if (isIDFIRST_lazy_if(s,UTF)) {
4869                 char *t;
4870                 for (d = s; isALNUM_lazy_if(d,UTF); d++) ;
4871                 for (t=d; *t && isSPACE(*t); t++) ;
4872                 if ( *t && strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
4873                     /* [perl #16184] */
4874                     && !(t[0] == '=' && t[1] == '>')
4875                 ) {
4876                     Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE),
4877                            "Precedence problem: open %.*s should be open(%.*s)",
4878                             d - s, s, d - s, s);
4879                 }
4880             }
4881             LOP(OP_OPEN,XTERM);
4882
4883         case KEY_or:
4884             yylval.ival = OP_OR;
4885             OPERATOR(OROP);
4886
4887         case KEY_ord:
4888             UNI(OP_ORD);
4889
4890         case KEY_oct:
4891             UNI(OP_OCT);
4892
4893         case KEY_opendir:
4894             LOP(OP_OPEN_DIR,XTERM);
4895
4896         case KEY_print:
4897             checkcomma(s,PL_tokenbuf,"filehandle");
4898             LOP(OP_PRINT,XREF);
4899
4900         case KEY_printf:
4901             checkcomma(s,PL_tokenbuf,"filehandle");
4902             LOP(OP_PRTF,XREF);
4903
4904         case KEY_prototype:
4905             UNI(OP_PROTOTYPE);
4906
4907         case KEY_push:
4908             LOP(OP_PUSH,XTERM);
4909
4910         case KEY_pop:
4911             UNIDOR(OP_POP);
4912
4913         case KEY_pos:
4914             UNIDOR(OP_POS);
4915         
4916         case KEY_pack:
4917             LOP(OP_PACK,XTERM);
4918
4919         case KEY_package:
4920             s = force_word(s,WORD,FALSE,TRUE,FALSE);
4921             OPERATOR(PACKAGE);
4922
4923         case KEY_pipe:
4924             LOP(OP_PIPE_OP,XTERM);
4925
4926         case KEY_q:
4927             s = scan_str(s,FALSE,FALSE);
4928             if (!s)
4929                 missingterm((char*)0);
4930             yylval.ival = OP_CONST;
4931             TERM(sublex_start());
4932
4933         case KEY_quotemeta:
4934             UNI(OP_QUOTEMETA);
4935
4936         case KEY_qw:
4937             s = scan_str(s,FALSE,FALSE);
4938             if (!s)
4939                 missingterm((char*)0);
4940             force_next(')');
4941             if (SvCUR(PL_lex_stuff)) {
4942                 OP *words = Nullop;
4943                 int warned = 0;
4944                 d = SvPV_force(PL_lex_stuff, len);
4945                 while (len) {
4946                     SV *sv;
4947                     for (; isSPACE(*d) && len; --len, ++d) ;
4948                     if (len) {
4949                         char *b = d;
4950                         if (!warned && ckWARN(WARN_QW)) {
4951                             for (; !isSPACE(*d) && len; --len, ++d) {
4952                                 if (*d == ',') {
4953                                     Perl_warner(aTHX_ packWARN(WARN_QW),
4954                                         "Possible attempt to separate words with commas");
4955                                     ++warned;
4956                                 }
4957                                 else if (*d == '#') {
4958                                     Perl_warner(aTHX_ packWARN(WARN_QW),
4959                                         "Possible attempt to put comments in qw() list");
4960                                     ++warned;
4961                                 }
4962                             }
4963                         }
4964                         else {
4965                             for (; !isSPACE(*d) && len; --len, ++d) ;
4966                         }
4967                         sv = newSVpvn(b, d-b);
4968                         if (DO_UTF8(PL_lex_stuff))
4969                             SvUTF8_on(sv);
4970                         words = append_elem(OP_LIST, words,
4971                                             newSVOP(OP_CONST, 0, tokeq(sv)));
4972                     }
4973                 }
4974                 if (words) {
4975                     PL_nextval[PL_nexttoke].opval = words;
4976                     force_next(THING);
4977                 }
4978             }
4979             if (PL_lex_stuff) {
4980                 SvREFCNT_dec(PL_lex_stuff);
4981                 PL_lex_stuff = Nullsv;
4982             }
4983             PL_expect = XTERM;
4984             TOKEN('(');
4985
4986         case KEY_qq:
4987             s = scan_str(s,FALSE,FALSE);
4988             if (!s)
4989                 missingterm((char*)0);
4990             yylval.ival = OP_STRINGIFY;
4991             if (SvIVX(PL_lex_stuff) == '\'')
4992                 SvIVX(PL_lex_stuff) = 0;        /* qq'$foo' should intepolate */
4993             TERM(sublex_start());
4994
4995         case KEY_qr:
4996             s = scan_pat(s,OP_QR);
4997             TERM(sublex_start());
4998
4999         case KEY_qx:
5000             s = scan_str(s,FALSE,FALSE);
5001             if (!s)
5002                 missingterm((char*)0);
5003             yylval.ival = OP_BACKTICK;
5004             set_csh();
5005             TERM(sublex_start());
5006
5007         case KEY_return:
5008             OLDLOP(OP_RETURN);
5009
5010         case KEY_require:
5011             s = skipspace(s);
5012             if (isDIGIT(*s)) {
5013                 s = force_version(s, FALSE);
5014             }
5015             else if (*s != 'v' || !isDIGIT(s[1])
5016                     || (s = force_version(s, TRUE), *s == 'v'))
5017             {
5018                 *PL_tokenbuf = '\0';
5019                 s = force_word(s,WORD,TRUE,TRUE,FALSE);
5020                 if (isIDFIRST_lazy_if(PL_tokenbuf,UTF))
5021                     gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf), TRUE);
5022                 else if (*s == '<')
5023                     yyerror("<> should be quotes");
5024             }
5025             UNI(OP_REQUIRE);
5026
5027         case KEY_reset:
5028             UNI(OP_RESET);
5029
5030         case KEY_redo:
5031             s = force_word(s,WORD,TRUE,FALSE,FALSE);
5032             LOOPX(OP_REDO);
5033
5034         case KEY_rename:
5035             LOP(OP_RENAME,XTERM);
5036
5037         case KEY_rand:
5038             UNI(OP_RAND);
5039
5040         case KEY_rmdir:
5041             UNI(OP_RMDIR);
5042
5043         case KEY_rindex:
5044             LOP(OP_RINDEX,XTERM);
5045
5046         case KEY_read:
5047             LOP(OP_READ,XTERM);
5048
5049         case KEY_readdir:
5050             UNI(OP_READDIR);
5051
5052         case KEY_readline:
5053             set_csh();
5054             UNIDOR(OP_READLINE);
5055
5056         case KEY_readpipe:
5057             set_csh();
5058             UNI(OP_BACKTICK);
5059
5060         case KEY_rewinddir:
5061             UNI(OP_REWINDDIR);
5062
5063         case KEY_recv:
5064             LOP(OP_RECV,XTERM);
5065
5066         case KEY_reverse:
5067             LOP(OP_REVERSE,XTERM);
5068
5069         case KEY_readlink:
5070             UNIDOR(OP_READLINK);
5071
5072         case KEY_ref:
5073             UNI(OP_REF);
5074
5075         case KEY_s:
5076             s = scan_subst(s);
5077             if (yylval.opval)
5078                 TERM(sublex_start());
5079             else
5080                 TOKEN(1);       /* force error */
5081
5082         case KEY_chomp:
5083             UNI(OP_CHOMP);
5084         
5085         case KEY_scalar:
5086             UNI(OP_SCALAR);
5087
5088         case KEY_select:
5089             LOP(OP_SELECT,XTERM);
5090
5091         case KEY_seek:
5092             LOP(OP_SEEK,XTERM);
5093
5094         case KEY_semctl:
5095             LOP(OP_SEMCTL,XTERM);
5096
5097         case KEY_semget:
5098             LOP(OP_SEMGET,XTERM);
5099
5100         case KEY_semop:
5101             LOP(OP_SEMOP,XTERM);
5102
5103         case KEY_send:
5104             LOP(OP_SEND,XTERM);
5105
5106         case KEY_setpgrp:
5107             LOP(OP_SETPGRP,XTERM);
5108
5109         case KEY_setpriority:
5110             LOP(OP_SETPRIORITY,XTERM);
5111
5112         case KEY_sethostent:
5113             UNI(OP_SHOSTENT);
5114
5115         case KEY_setnetent:
5116             UNI(OP_SNETENT);
5117
5118         case KEY_setservent:
5119             UNI(OP_SSERVENT);
5120
5121         case KEY_setprotoent:
5122             UNI(OP_SPROTOENT);
5123
5124         case KEY_setpwent:
5125             FUN0(OP_SPWENT);
5126
5127         case KEY_setgrent:
5128             FUN0(OP_SGRENT);
5129
5130         case KEY_seekdir:
5131             LOP(OP_SEEKDIR,XTERM);
5132
5133         case KEY_setsockopt:
5134             LOP(OP_SSOCKOPT,XTERM);
5135
5136         case KEY_shift:
5137             UNIDOR(OP_SHIFT);
5138
5139         case KEY_shmctl:
5140             LOP(OP_SHMCTL,XTERM);
5141
5142         case KEY_shmget:
5143             LOP(OP_SHMGET,XTERM);
5144
5145         case KEY_shmread:
5146             LOP(OP_SHMREAD,XTERM);
5147
5148         case KEY_shmwrite:
5149             LOP(OP_SHMWRITE,XTERM);
5150
5151         case KEY_shutdown:
5152             LOP(OP_SHUTDOWN,XTERM);
5153
5154         case KEY_sin:
5155             UNI(OP_SIN);
5156
5157         case KEY_sleep:
5158             UNI(OP_SLEEP);
5159
5160         case KEY_socket:
5161             LOP(OP_SOCKET,XTERM);
5162
5163         case KEY_socketpair:
5164             LOP(OP_SOCKPAIR,XTERM);
5165
5166         case KEY_sort:
5167             checkcomma(s,PL_tokenbuf,"subroutine name");
5168             s = skipspace(s);
5169             if (*s == ';' || *s == ')')         /* probably a close */
5170                 Perl_croak(aTHX_ "sort is now a reserved word");
5171             PL_expect = XTERM;
5172             s = force_word(s,WORD,TRUE,TRUE,FALSE);
5173             LOP(OP_SORT,XREF);
5174
5175         case KEY_split:
5176             LOP(OP_SPLIT,XTERM);
5177
5178         case KEY_sprintf:
5179             LOP(OP_SPRINTF,XTERM);
5180
5181         case KEY_splice:
5182             LOP(OP_SPLICE,XTERM);
5183
5184         case KEY_sqrt:
5185             UNI(OP_SQRT);
5186
5187         case KEY_srand:
5188             UNI(OP_SRAND);
5189
5190         case KEY_stat:
5191             UNI(OP_STAT);
5192
5193         case KEY_study:
5194             UNI(OP_STUDY);
5195
5196         case KEY_substr:
5197             LOP(OP_SUBSTR,XTERM);
5198
5199         case KEY_format:
5200         case KEY_sub:
5201           really_sub:
5202             {
5203                 char tmpbuf[sizeof PL_tokenbuf];
5204                 SSize_t tboffset = 0;
5205                 expectation attrful;
5206                 bool have_name, have_proto, bad_proto;
5207                 int key = tmp;
5208
5209                 s = skipspace(s);
5210
5211                 if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' ||
5212                     (*s == ':' && s[1] == ':'))
5213                 {
5214                     PL_expect = XBLOCK;
5215                     attrful = XATTRBLOCK;
5216                     /* remember buffer pos'n for later force_word */
5217                     tboffset = s - PL_oldbufptr;
5218                     d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
5219                     if (strchr(tmpbuf, ':'))
5220                         sv_setpv(PL_subname, tmpbuf);
5221                     else {
5222                         sv_setsv(PL_subname,PL_curstname);
5223                         sv_catpvn(PL_subname,"::",2);
5224                         sv_catpvn(PL_subname,tmpbuf,len);
5225                     }
5226                     s = skipspace(d);
5227                     have_name = TRUE;
5228                 }
5229                 else {
5230                     if (key == KEY_my)
5231                         Perl_croak(aTHX_ "Missing name in \"my sub\"");
5232                     PL_expect = XTERMBLOCK;
5233                     attrful = XATTRTERM;
5234                     sv_setpv(PL_subname,"?");
5235                     have_name = FALSE;
5236                 }
5237
5238                 if (key == KEY_format) {
5239                     if (*s == '=')
5240                         PL_lex_formbrack = PL_lex_brackets + 1;
5241                     if (have_name)
5242                         (void) force_word(PL_oldbufptr + tboffset, WORD,
5243                                           FALSE, TRUE, TRUE);
5244                     OPERATOR(FORMAT);
5245                 }
5246
5247                 /* Look for a prototype */
5248                 if (*s == '(') {
5249                     char *p;
5250
5251                     s = scan_str(s,FALSE,FALSE);
5252                     if (!s)
5253                         Perl_croak(aTHX_ "Prototype not terminated");
5254                     /* strip spaces and check for bad characters */
5255                     d = SvPVX(PL_lex_stuff);
5256                     tmp = 0;
5257                     bad_proto = FALSE;
5258                     for (p = d; *p; ++p) {
5259                         if (!isSPACE(*p)) {
5260                             d[tmp++] = *p;
5261                             if (!strchr("$@%*;[]&\\", *p))
5262                                 bad_proto = TRUE;
5263                         }
5264                     }
5265                     d[tmp] = '\0';
5266                     if (bad_proto && ckWARN(WARN_SYNTAX))
5267                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5268                                     "Illegal character in prototype for %"SVf" : %s",
5269                                     PL_subname, d);
5270                     SvCUR(PL_lex_stuff) = tmp;
5271                     have_proto = TRUE;
5272
5273                     s = skipspace(s);
5274                 }
5275                 else
5276                     have_proto = FALSE;
5277
5278                 if (*s == ':' && s[1] != ':')
5279                     PL_expect = attrful;
5280                 else if (*s != '{' && key == KEY_sub) {
5281                     if (!have_name)
5282                         Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine");
5283                     else if (*s != ';')
5284                         Perl_croak(aTHX_ "Illegal declaration of subroutine %"SVf, PL_subname);
5285                 }
5286
5287                 if (have_proto) {
5288                     PL_nextval[PL_nexttoke].opval =
5289                         (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
5290                     PL_lex_stuff = Nullsv;
5291                     force_next(THING);
5292                 }
5293                 if (!have_name) {
5294                     sv_setpv(PL_subname,
5295                         PL_curstash ? "__ANON__" : "__ANON__::__ANON__");
5296                     TOKEN(ANONSUB);
5297                 }
5298                 (void) force_word(PL_oldbufptr + tboffset, WORD,
5299                                   FALSE, TRUE, TRUE);
5300                 if (key == KEY_my)
5301                     TOKEN(MYSUB);
5302                 TOKEN(SUB);
5303             }
5304
5305         case KEY_system:
5306             set_csh();
5307             LOP(OP_SYSTEM,XREF);
5308
5309         case KEY_symlink:
5310             LOP(OP_SYMLINK,XTERM);
5311
5312         case KEY_syscall:
5313             LOP(OP_SYSCALL,XTERM);
5314
5315         case KEY_sysopen:
5316             LOP(OP_SYSOPEN,XTERM);
5317
5318         case KEY_sysseek:
5319             LOP(OP_SYSSEEK,XTERM);
5320
5321         case KEY_sysread:
5322             LOP(OP_SYSREAD,XTERM);
5323
5324         case KEY_syswrite:
5325             LOP(OP_SYSWRITE,XTERM);
5326
5327         case KEY_tr:
5328             s = scan_trans(s);
5329             TERM(sublex_start());
5330
5331         case KEY_tell:
5332             UNI(OP_TELL);
5333
5334         case KEY_telldir:
5335             UNI(OP_TELLDIR);
5336
5337         case KEY_tie:
5338             LOP(OP_TIE,XTERM);
5339
5340         case KEY_tied:
5341             UNI(OP_TIED);
5342
5343         case KEY_time:
5344             FUN0(OP_TIME);
5345
5346         case KEY_times:
5347             FUN0(OP_TMS);
5348
5349         case KEY_truncate:
5350             LOP(OP_TRUNCATE,XTERM);
5351
5352         case KEY_uc:
5353             UNI(OP_UC);
5354
5355         case KEY_ucfirst:
5356             UNI(OP_UCFIRST);
5357
5358         case KEY_untie:
5359             UNI(OP_UNTIE);
5360
5361         case KEY_until:
5362             yylval.ival = CopLINE(PL_curcop);
5363             OPERATOR(UNTIL);
5364
5365         case KEY_unless:
5366             yylval.ival = CopLINE(PL_curcop);
5367             OPERATOR(UNLESS);
5368
5369         case KEY_unlink:
5370             LOP(OP_UNLINK,XTERM);
5371
5372         case KEY_undef:
5373             UNIDOR(OP_UNDEF);
5374
5375         case KEY_unpack:
5376             LOP(OP_UNPACK,XTERM);
5377
5378         case KEY_utime:
5379             LOP(OP_UTIME,XTERM);
5380
5381         case KEY_umask:
5382             UNIDOR(OP_UMASK);
5383
5384         case KEY_unshift:
5385             LOP(OP_UNSHIFT,XTERM);
5386
5387         case KEY_use:
5388             if (PL_expect != XSTATE)
5389                 yyerror("\"use\" not allowed in expression");
5390             s = skipspace(s);
5391             if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
5392                 s = force_version(s, TRUE);
5393                 if (*s == ';' || (s = skipspace(s), *s == ';')) {
5394                     PL_nextval[PL_nexttoke].opval = Nullop;
5395                     force_next(WORD);
5396                 }
5397                 else if (*s == 'v') {
5398                     s = force_word(s,WORD,FALSE,TRUE,FALSE);
5399                     s = force_version(s, FALSE);
5400                 }
5401             }
5402             else {
5403                 s = force_word(s,WORD,FALSE,TRUE,FALSE);
5404                 s = force_version(s, FALSE);
5405             }
5406             yylval.ival = 1;
5407             OPERATOR(USE);
5408
5409         case KEY_values:
5410             UNI(OP_VALUES);
5411
5412         case KEY_vec:
5413             LOP(OP_VEC,XTERM);
5414
5415         case KEY_while:
5416             yylval.ival = CopLINE(PL_curcop);
5417             OPERATOR(WHILE);
5418
5419         case KEY_warn:
5420             PL_hints |= HINT_BLOCK_SCOPE;
5421             LOP(OP_WARN,XTERM);
5422
5423         case KEY_wait:
5424             FUN0(OP_WAIT);
5425
5426         case KEY_waitpid:
5427             LOP(OP_WAITPID,XTERM);
5428
5429         case KEY_wantarray:
5430             FUN0(OP_WANTARRAY);
5431
5432         case KEY_write:
5433 #ifdef EBCDIC
5434         {
5435             char ctl_l[2];
5436             ctl_l[0] = toCTRL('L');
5437             ctl_l[1] = '\0';
5438             gv_fetchpv(ctl_l,TRUE, SVt_PV);
5439         }
5440 #else
5441             gv_fetchpv("\f",TRUE, SVt_PV);      /* Make sure $^L is defined */
5442 #endif
5443             UNI(OP_ENTERWRITE);
5444
5445         case KEY_x:
5446             if (PL_expect == XOPERATOR)
5447                 Mop(OP_REPEAT);
5448             check_uni();
5449             goto just_a_word;
5450
5451         case KEY_xor:
5452             yylval.ival = OP_XOR;
5453             OPERATOR(OROP);
5454
5455         case KEY_y:
5456             s = scan_trans(s);
5457             TERM(sublex_start());
5458         }
5459     }}
5460 }
5461 #ifdef __SC__
5462 #pragma segment Main
5463 #endif
5464
5465 static int
5466 S_pending_ident(pTHX)
5467 {
5468     register char *d;
5469     register I32 tmp = 0;
5470     /* pit holds the identifier we read and pending_ident is reset */
5471     char pit = PL_pending_ident;
5472     PL_pending_ident = 0;
5473
5474     DEBUG_T({ PerlIO_printf(Perl_debug_log,
5475           "### Tokener saw identifier '%s'\n", PL_tokenbuf); });
5476
5477     /* if we're in a my(), we can't allow dynamics here.
5478        $foo'bar has already been turned into $foo::bar, so
5479        just check for colons.
5480
5481        if it's a legal name, the OP is a PADANY.
5482     */
5483     if (PL_in_my) {
5484         if (PL_in_my == KEY_our) {      /* "our" is merely analogous to "my" */
5485             if (strchr(PL_tokenbuf,':'))
5486                 yyerror(Perl_form(aTHX_ "No package name allowed for "
5487                                   "variable %s in \"our\"",
5488                                   PL_tokenbuf));
5489             tmp = allocmy(PL_tokenbuf);
5490         }
5491         else {
5492             if (strchr(PL_tokenbuf,':'))
5493                 yyerror(Perl_form(aTHX_ PL_no_myglob,PL_tokenbuf));
5494
5495             yylval.opval = newOP(OP_PADANY, 0);
5496             yylval.opval->op_targ = allocmy(PL_tokenbuf);
5497             return PRIVATEREF;
5498         }
5499     }
5500
5501     /*
5502        build the ops for accesses to a my() variable.
5503
5504        Deny my($a) or my($b) in a sort block, *if* $a or $b is
5505        then used in a comparison.  This catches most, but not
5506        all cases.  For instance, it catches
5507            sort { my($a); $a <=> $b }
5508        but not
5509            sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
5510        (although why you'd do that is anyone's guess).
5511     */
5512
5513     if (!strchr(PL_tokenbuf,':')) {
5514         if (!PL_in_my)
5515             tmp = pad_findmy(PL_tokenbuf);
5516         if (tmp != NOT_IN_PAD) {
5517             /* might be an "our" variable" */
5518             if (PAD_COMPNAME_FLAGS(tmp) & SVpad_OUR) {
5519                 /* build ops for a bareword */
5520                 SV *sym = newSVpv(HvNAME(PAD_COMPNAME_OURSTASH(tmp)), 0);
5521                 sv_catpvn(sym, "::", 2);
5522                 sv_catpv(sym, PL_tokenbuf+1);
5523                 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
5524                 yylval.opval->op_private = OPpCONST_ENTERED;
5525                 gv_fetchsv(sym,
5526                     (PL_in_eval
5527                         ? (GV_ADDMULTI | GV_ADDINEVAL)
5528                         : GV_ADDMULTI
5529                     ),
5530                     ((PL_tokenbuf[0] == '$') ? SVt_PV
5531                      : (PL_tokenbuf[0] == '@') ? SVt_PVAV
5532                      : SVt_PVHV));
5533                 return WORD;
5534             }
5535
5536             /* if it's a sort block and they're naming $a or $b */
5537             if (PL_last_lop_op == OP_SORT &&
5538                 PL_tokenbuf[0] == '$' &&
5539                 (PL_tokenbuf[1] == 'a' || PL_tokenbuf[1] == 'b')
5540                 && !PL_tokenbuf[2])
5541             {
5542                 for (d = PL_in_eval ? PL_oldoldbufptr : PL_linestart;
5543                      d < PL_bufend && *d != '\n';
5544                      d++)
5545                 {
5546                     if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
5547                         Perl_croak(aTHX_ "Can't use \"my %s\" in sort comparison",
5548                               PL_tokenbuf);
5549                     }
5550                 }
5551             }
5552
5553             yylval.opval = newOP(OP_PADANY, 0);
5554             yylval.opval->op_targ = tmp;
5555             return PRIVATEREF;
5556         }
5557     }
5558
5559     /*
5560        Whine if they've said @foo in a doublequoted string,
5561        and @foo isn't a variable we can find in the symbol
5562        table.
5563     */
5564     if (pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
5565         GV *gv = gv_fetchpv(PL_tokenbuf+1, FALSE, SVt_PVAV);
5566         if ((!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
5567              && ckWARN(WARN_AMBIGUOUS))
5568         {
5569             /* Downgraded from fatal to warning 20000522 mjd */
5570             Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
5571                         "Possible unintended interpolation of %s in string",
5572                          PL_tokenbuf);
5573         }
5574     }
5575
5576     /* build ops for a bareword */
5577     yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(PL_tokenbuf+1, 0));
5578     yylval.opval->op_private = OPpCONST_ENTERED;
5579     gv_fetchpv(PL_tokenbuf+1, PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : TRUE,
5580                ((PL_tokenbuf[0] == '$') ? SVt_PV
5581                 : (PL_tokenbuf[0] == '@') ? SVt_PVAV
5582                 : SVt_PVHV));
5583     return WORD;
5584 }
5585
5586 I32
5587 Perl_keyword(pTHX_ register char *d, I32 len)
5588 {
5589     switch (*d) {
5590     case '_':
5591         if (d[1] == '_') {
5592             if (strEQ(d,"__FILE__"))            return -KEY___FILE__;
5593             if (strEQ(d,"__LINE__"))            return -KEY___LINE__;
5594             if (strEQ(d,"__PACKAGE__"))         return -KEY___PACKAGE__;
5595             if (strEQ(d,"__DATA__"))            return KEY___DATA__;
5596             if (strEQ(d,"__END__"))             return KEY___END__;
5597         }
5598         break;
5599     case 'A':
5600         if (strEQ(d,"AUTOLOAD"))                return KEY_AUTOLOAD;
5601         break;
5602     case 'a':
5603         switch (len) {
5604         case 3:
5605             if (strEQ(d,"and"))                 return -KEY_and;
5606             if (strEQ(d,"abs"))                 return -KEY_abs;
5607             break;
5608         case 5:
5609             if (strEQ(d,"alarm"))               return -KEY_alarm;
5610             if (strEQ(d,"atan2"))               return -KEY_atan2;
5611             break;
5612         case 6:
5613             if (strEQ(d,"accept"))              return -KEY_accept;
5614             break;
5615         }
5616         break;
5617     case 'B':
5618         if (strEQ(d,"BEGIN"))                   return KEY_BEGIN;
5619         break;
5620     case 'b':
5621         if (strEQ(d,"bless"))                   return -KEY_bless;
5622         if (strEQ(d,"bind"))                    return -KEY_bind;
5623         if (strEQ(d,"binmode"))                 return -KEY_binmode;
5624         break;
5625     case 'C':
5626         if (strEQ(d,"CORE"))                    return -KEY_CORE;
5627         if (strEQ(d,"CHECK"))                   return KEY_CHECK;
5628         break;
5629     case 'c':
5630         switch (len) {
5631         case 3:
5632             if (strEQ(d,"cmp"))                 return -KEY_cmp;
5633             if (strEQ(d,"chr"))                 return -KEY_chr;
5634             if (strEQ(d,"cos"))                 return -KEY_cos;
5635             break;
5636         case 4:
5637             if (strEQ(d,"chop"))                return -KEY_chop;
5638             break;
5639         case 5:
5640             if (strEQ(d,"close"))               return -KEY_close;
5641             if (strEQ(d,"chdir"))               return -KEY_chdir;
5642             if (strEQ(d,"chomp"))               return -KEY_chomp;
5643             if (strEQ(d,"chmod"))               return -KEY_chmod;
5644             if (strEQ(d,"chown"))               return -KEY_chown;
5645             if (strEQ(d,"crypt"))               return -KEY_crypt;
5646             break;
5647         case 6:
5648             if (strEQ(d,"chroot"))              return -KEY_chroot;
5649             if (strEQ(d,"caller"))              return -KEY_caller;
5650             break;
5651         case 7:
5652             if (strEQ(d,"connect"))             return -KEY_connect;
5653             break;
5654         case 8:
5655             if (strEQ(d,"closedir"))            return -KEY_closedir;
5656             if (strEQ(d,"continue"))            return -KEY_continue;
5657             break;
5658         }
5659         break;
5660     case 'D':
5661         if (strEQ(d,"DESTROY"))                 return KEY_DESTROY;
5662         break;
5663     case 'd':
5664         switch (len) {
5665         case 2:
5666             if (strEQ(d,"do"))                  return KEY_do;
5667             break;
5668         case 3:
5669             if (strEQ(d,"die"))                 return -KEY_die;
5670             break;
5671         case 4:
5672             if (strEQ(d,"dump"))                return -KEY_dump;
5673             break;
5674         case 6:
5675             if (strEQ(d,"delete"))              return KEY_delete;
5676             break;
5677         case 7:
5678             if (strEQ(d,"defined"))             return KEY_defined;
5679             if (strEQ(d,"dbmopen"))             return -KEY_dbmopen;
5680             break;
5681         case 8:
5682             if (strEQ(d,"dbmclose"))            return -KEY_dbmclose;
5683             break;
5684         }
5685         break;
5686     case 'E':
5687         if (strEQ(d,"END"))                     return KEY_END;
5688         break;
5689     case 'e':
5690         switch (len) {
5691         case 2:
5692             if (strEQ(d,"eq"))                  return -KEY_eq;
5693             break;
5694         case 3:
5695             if (strEQ(d,"eof"))                 return -KEY_eof;
5696             if (strEQ(d,"err"))                 return -KEY_err;
5697             if (strEQ(d,"exp"))                 return -KEY_exp;
5698             break;
5699         case 4:
5700             if (strEQ(d,"else"))                return KEY_else;
5701             if (strEQ(d,"exit"))                return -KEY_exit;
5702             if (strEQ(d,"eval"))                return KEY_eval;
5703             if (strEQ(d,"exec"))                return -KEY_exec;
5704            if (strEQ(d,"each"))                return -KEY_each;
5705             break;
5706         case 5:
5707             if (strEQ(d,"elsif"))               return KEY_elsif;
5708             break;
5709         case 6:
5710             if (strEQ(d,"exists"))              return KEY_exists;
5711             if (strEQ(d,"elseif") && ckWARN_d(WARN_SYNTAX))
5712                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5713                         "elseif should be elsif");
5714             break;
5715         case 8:
5716             if (strEQ(d,"endgrent"))            return -KEY_endgrent;
5717             if (strEQ(d,"endpwent"))            return -KEY_endpwent;
5718             break;
5719         case 9:
5720             if (strEQ(d,"endnetent"))           return -KEY_endnetent;
5721             break;
5722         case 10:
5723             if (strEQ(d,"endhostent"))          return -KEY_endhostent;
5724             if (strEQ(d,"endservent"))          return -KEY_endservent;
5725             break;
5726         case 11:
5727             if (strEQ(d,"endprotoent"))         return -KEY_endprotoent;
5728             break;
5729         }
5730         break;
5731     case 'f':
5732         switch (len) {
5733         case 3:
5734             if (strEQ(d,"for"))                 return KEY_for;
5735             break;
5736         case 4:
5737             if (strEQ(d,"fork"))                return -KEY_fork;
5738             break;
5739         case 5:
5740             if (strEQ(d,"fcntl"))               return -KEY_fcntl;
5741             if (strEQ(d,"flock"))               return -KEY_flock;
5742             break;
5743         case 6:
5744             if (strEQ(d,"format"))              return KEY_format;
5745             if (strEQ(d,"fileno"))              return -KEY_fileno;
5746             break;
5747         case 7:
5748             if (strEQ(d,"foreach"))             return KEY_foreach;
5749             break;
5750         case 8:
5751             if (strEQ(d,"formline"))            return -KEY_formline;
5752             break;
5753         }
5754         break;
5755     case 'g':
5756         if (strnEQ(d,"get",3)) {
5757             d += 3;
5758             if (*d == 'p') {
5759                 switch (len) {
5760                 case 7:
5761                     if (strEQ(d,"ppid"))        return -KEY_getppid;
5762                     if (strEQ(d,"pgrp"))        return -KEY_getpgrp;
5763                     break;
5764                 case 8:
5765                     if (strEQ(d,"pwent"))       return -KEY_getpwent;
5766                     if (strEQ(d,"pwnam"))       return -KEY_getpwnam;
5767                     if (strEQ(d,"pwuid"))       return -KEY_getpwuid;
5768                     break;
5769                 case 11:
5770                     if (strEQ(d,"peername"))    return -KEY_getpeername;
5771                     if (strEQ(d,"protoent"))    return -KEY_getprotoent;
5772                     if (strEQ(d,"priority"))    return -KEY_getpriority;
5773                     break;
5774                 case 14:
5775                     if (strEQ(d,"protobyname")) return -KEY_getprotobyname;
5776                     break;
5777                 case 16:
5778                     if (strEQ(d,"protobynumber"))return -KEY_getprotobynumber;
5779                     break;
5780                 }
5781             }
5782             else if (*d == 'h') {
5783                 if (strEQ(d,"hostbyname"))      return -KEY_gethostbyname;
5784                 if (strEQ(d,"hostbyaddr"))      return -KEY_gethostbyaddr;
5785                 if (strEQ(d,"hostent"))         return -KEY_gethostent;
5786             }
5787             else if (*d == 'n') {
5788                 if (strEQ(d,"netbyname"))       return -KEY_getnetbyname;
5789                 if (strEQ(d,"netbyaddr"))       return -KEY_getnetbyaddr;
5790                 if (strEQ(d,"netent"))          return -KEY_getnetent;
5791             }
5792             else if (*d == 's') {
5793                 if (strEQ(d,"servbyname"))      return -KEY_getservbyname;
5794                 if (strEQ(d,"servbyport"))      return -KEY_getservbyport;
5795                 if (strEQ(d,"servent"))         return -KEY_getservent;
5796                 if (strEQ(d,"sockname"))        return -KEY_getsockname;
5797                 if (strEQ(d,"sockopt"))         return -KEY_getsockopt;
5798             }
5799             else if (*d == 'g') {
5800                 if (strEQ(d,"grent"))           return -KEY_getgrent;
5801                 if (strEQ(d,"grnam"))           return -KEY_getgrnam;
5802                 if (strEQ(d,"grgid"))           return -KEY_getgrgid;
5803             }
5804             else if (*d == 'l') {
5805                 if (strEQ(d,"login"))           return -KEY_getlogin;
5806             }
5807             else if (*d == 'c' && d[1] == '\0') return -KEY_getc;
5808             break;
5809         }
5810         switch (len) {
5811         case 2:
5812             if (strEQ(d,"gt"))                  return -KEY_gt;
5813             if (strEQ(d,"ge"))                  return -KEY_ge;
5814             break;
5815         case 4:
5816             if (strEQ(d,"grep"))                return KEY_grep;
5817             if (strEQ(d,"goto"))                return KEY_goto;
5818             if (strEQ(d,"glob"))                return KEY_glob;
5819             break;
5820         case 6:
5821             if (strEQ(d,"gmtime"))              return -KEY_gmtime;
5822             break;
5823         }
5824         break;
5825     case 'h':
5826         if (strEQ(d,"hex"))                     return -KEY_hex;
5827         break;
5828     case 'I':
5829         if (strEQ(d,"INIT"))                    return KEY_INIT;
5830         break;
5831     case 'i':
5832         switch (len) {
5833         case 2:
5834             if (strEQ(d,"if"))                  return KEY_if;
5835             break;
5836         case 3:
5837             if (strEQ(d,"int"))                 return -KEY_int;
5838             break;
5839         case 5:
5840             if (strEQ(d,"index"))               return -KEY_index;
5841             if (strEQ(d,"ioctl"))               return -KEY_ioctl;
5842             break;
5843         }
5844         break;
5845     case 'j':
5846         if (strEQ(d,"join"))                    return -KEY_join;
5847         break;
5848     case 'k':
5849         if (len == 4) {
5850            if (strEQ(d,"keys"))                return -KEY_keys;
5851             if (strEQ(d,"kill"))                return -KEY_kill;
5852         }
5853         break;
5854     case 'l':
5855         switch (len) {
5856         case 2:
5857             if (strEQ(d,"lt"))                  return -KEY_lt;
5858             if (strEQ(d,"le"))                  return -KEY_le;
5859             if (strEQ(d,"lc"))                  return -KEY_lc;
5860             break;
5861         case 3:
5862             if (strEQ(d,"log"))                 return -KEY_log;
5863             break;
5864         case 4:
5865             if (strEQ(d,"last"))                return KEY_last;
5866             if (strEQ(d,"link"))                return -KEY_link;
5867             if (strEQ(d,"lock"))                return -KEY_lock;
5868             break;
5869         case 5:
5870             if (strEQ(d,"local"))               return KEY_local;
5871             if (strEQ(d,"lstat"))               return -KEY_lstat;
5872             break;
5873         case 6:
5874             if (strEQ(d,"length"))              return -KEY_length;
5875             if (strEQ(d,"listen"))              return -KEY_listen;
5876             break;
5877         case 7:
5878             if (strEQ(d,"lcfirst"))             return -KEY_lcfirst;
5879             break;
5880         case 9:
5881             if (strEQ(d,"localtime"))           return -KEY_localtime;
5882             break;
5883         }
5884         break;
5885     case 'm':
5886         switch (len) {
5887         case 1:                                 return KEY_m;
5888         case 2:
5889             if (strEQ(d,"my"))                  return KEY_my;
5890             break;
5891         case 3:
5892             if (strEQ(d,"map"))                 return KEY_map;
5893             break;
5894         case 5:
5895             if (strEQ(d,"mkdir"))               return -KEY_mkdir;
5896             break;
5897         case 6:
5898             if (strEQ(d,"msgctl"))              return -KEY_msgctl;
5899             if (strEQ(d,"msgget"))              return -KEY_msgget;
5900             if (strEQ(d,"msgrcv"))              return -KEY_msgrcv;
5901             if (strEQ(d,"msgsnd"))              return -KEY_msgsnd;
5902             break;
5903         }
5904         break;
5905     case 'n':
5906         if (strEQ(d,"next"))                    return KEY_next;
5907         if (strEQ(d,"ne"))                      return -KEY_ne;
5908         if (strEQ(d,"not"))                     return -KEY_not;
5909         if (strEQ(d,"no"))                      return KEY_no;
5910         break;
5911     case 'o':
5912         switch (len) {
5913         case 2:
5914             if (strEQ(d,"or"))                  return -KEY_or;
5915             break;
5916         case 3:
5917             if (strEQ(d,"ord"))                 return -KEY_ord;
5918             if (strEQ(d,"oct"))                 return -KEY_oct;
5919             if (strEQ(d,"our"))                 return KEY_our;
5920             break;
5921         case 4:
5922             if (strEQ(d,"open"))                return -KEY_open;
5923             break;
5924         case 7:
5925             if (strEQ(d,"opendir"))             return -KEY_opendir;
5926             break;
5927         }
5928         break;
5929     case 'p':
5930         switch (len) {
5931         case 3:
5932            if (strEQ(d,"pop"))                 return -KEY_pop;
5933             if (strEQ(d,"pos"))                 return KEY_pos;
5934             break;
5935         case 4:
5936            if (strEQ(d,"push"))                return -KEY_push;
5937             if (strEQ(d,"pack"))                return -KEY_pack;
5938             if (strEQ(d,"pipe"))                return -KEY_pipe;
5939             break;
5940         case 5:
5941             if (strEQ(d,"print"))               return KEY_print;
5942             break;
5943         case 6:
5944             if (strEQ(d,"printf"))              return KEY_printf;
5945             break;
5946         case 7:
5947             if (strEQ(d,"package"))             return KEY_package;
5948             break;
5949         case 9:
5950             if (strEQ(d,"prototype"))           return KEY_prototype;
5951         }
5952         break;
5953     case 'q':
5954         if (len == 1) {
5955                                                 return KEY_q;
5956         }
5957         else if (len == 2) {
5958             switch (d[1]) {
5959             case 'r':                           return KEY_qr;
5960             case 'q':                           return KEY_qq;
5961             case 'w':                           return KEY_qw;
5962             case 'x':                           return KEY_qx;
5963             };
5964         }
5965         else if (strEQ(d,"quotemeta"))          return -KEY_quotemeta;
5966         break;
5967     case 'r':
5968         switch (len) {
5969         case 3:
5970             if (strEQ(d,"ref"))                 return -KEY_ref;
5971             break;
5972         case 4:
5973             if (strEQ(d,"read"))                return -KEY_read;
5974             if (strEQ(d,"rand"))                return -KEY_rand;
5975             if (strEQ(d,"recv"))                return -KEY_recv;
5976             if (strEQ(d,"redo"))                return KEY_redo;
5977             break;
5978         case 5:
5979             if (strEQ(d,"rmdir"))               return -KEY_rmdir;
5980             if (strEQ(d,"reset"))               return -KEY_reset;
5981             break;
5982         case 6:
5983             if (strEQ(d,"return"))              return KEY_return;
5984             if (strEQ(d,"rename"))              return -KEY_rename;
5985             if (strEQ(d,"rindex"))              return -KEY_rindex;
5986             break;
5987         case 7:
5988             if (strEQ(d,"require"))             return KEY_require;
5989             if (strEQ(d,"reverse"))             return -KEY_reverse;
5990             if (strEQ(d,"readdir"))             return -KEY_readdir;
5991             break;
5992         case 8:
5993             if (strEQ(d,"readlink"))            return -KEY_readlink;
5994             if (strEQ(d,"readline"))            return -KEY_readline;
5995             if (strEQ(d,"readpipe"))            return -KEY_readpipe;
5996             break;
5997         case 9:
5998             if (strEQ(d,"rewinddir"))           return -KEY_rewinddir;
5999             break;
6000         }
6001         break;
6002     case 's':
6003         switch (d[1]) {
6004         case 0:                                 return KEY_s;
6005         case 'c':
6006             if (strEQ(d,"scalar"))              return KEY_scalar;
6007             break;
6008         case 'e':
6009             switch (len) {
6010             case 4:
6011                 if (strEQ(d,"seek"))            return -KEY_seek;
6012                 if (strEQ(d,"send"))            return -KEY_send;
6013                 break;
6014             case 5:
6015                 if (strEQ(d,"semop"))           return -KEY_semop;
6016                 break;
6017             case 6:
6018                 if (strEQ(d,"select"))          return -KEY_select;
6019                 if (strEQ(d,"semctl"))          return -KEY_semctl;
6020                 if (strEQ(d,"semget"))          return -KEY_semget;
6021                 break;
6022             case 7:
6023                 if (strEQ(d,"setpgrp"))         return -KEY_setpgrp;
6024                 if (strEQ(d,"seekdir"))         return -KEY_seekdir;
6025                 break;
6026             case 8:
6027                 if (strEQ(d,"setpwent"))        return -KEY_setpwent;
6028                 if (strEQ(d,"setgrent"))        return -KEY_setgrent;
6029                 break;
6030             case 9:
6031                 if (strEQ(d,"setnetent"))       return -KEY_setnetent;
6032                 break;
6033             case 10:
6034                 if (strEQ(d,"setsockopt"))      return -KEY_setsockopt;
6035                 if (strEQ(d,"sethostent"))      return -KEY_sethostent;
6036                 if (strEQ(d,"setservent"))      return -KEY_setservent;
6037                 break;
6038             case 11:
6039                 if (strEQ(d,"setpriority"))     return -KEY_setpriority;
6040                 if (strEQ(d,"setprotoent"))     return -KEY_setprotoent;
6041                 break;
6042             }
6043             break;
6044         case 'h':
6045             switch (len) {
6046             case 5:
6047                if (strEQ(d,"shift"))           return -KEY_shift;
6048                 break;
6049             case 6:
6050                 if (strEQ(d,"shmctl"))          return -KEY_shmctl;
6051                 if (strEQ(d,"shmget"))          return -KEY_shmget;
6052                 break;
6053             case 7:
6054                 if (strEQ(d,"shmread"))         return -KEY_shmread;
6055                 break;
6056             case 8:
6057                 if (strEQ(d,"shmwrite"))        return -KEY_shmwrite;
6058                 if (strEQ(d,"shutdown"))        return -KEY_shutdown;
6059                 break;
6060             }
6061             break;
6062         case 'i':
6063             if (strEQ(d,"sin"))                 return -KEY_sin;
6064             break;
6065         case 'l':
6066             if (strEQ(d,"sleep"))               return -KEY_sleep;
6067             break;
6068         case 'o':
6069             if (strEQ(d,"sort"))                return KEY_sort;
6070             if (strEQ(d,"socket"))              return -KEY_socket;
6071             if (strEQ(d,"socketpair"))          return -KEY_socketpair;
6072             break;
6073         case 'p':
6074             if (strEQ(d,"split"))               return KEY_split;
6075             if (strEQ(d,"sprintf"))             return -KEY_sprintf;
6076            if (strEQ(d,"splice"))              return -KEY_splice;
6077             break;
6078         case 'q':
6079             if (strEQ(d,"sqrt"))                return -KEY_sqrt;
6080             break;
6081         case 'r':
6082             if (strEQ(d,"srand"))               return -KEY_srand;
6083             break;
6084         case 't':
6085             if (strEQ(d,"stat"))                return -KEY_stat;
6086             if (strEQ(d,"study"))               return KEY_study;
6087             break;
6088         case 'u':
6089             if (strEQ(d,"substr"))              return -KEY_substr;
6090             if (strEQ(d,"sub"))                 return KEY_sub;
6091             break;
6092         case 'y':
6093             switch (len) {
6094             case 6:
6095                 if (strEQ(d,"system"))          return -KEY_system;
6096                 break;
6097             case 7:
6098                 if (strEQ(d,"symlink"))         return -KEY_symlink;
6099                 if (strEQ(d,"syscall"))         return -KEY_syscall;
6100                 if (strEQ(d,"sysopen"))         return -KEY_sysopen;
6101                 if (strEQ(d,"sysread"))         return -KEY_sysread;
6102                 if (strEQ(d,"sysseek"))         return -KEY_sysseek;
6103                 break;
6104             case 8:
6105                 if (strEQ(d,"syswrite"))        return -KEY_syswrite;
6106                 break;
6107             }
6108             break;
6109         }
6110         break;
6111     case 't':
6112         switch (len) {
6113         case 2:
6114             if (strEQ(d,"tr"))                  return KEY_tr;
6115             break;
6116         case 3:
6117             if (strEQ(d,"tie"))                 return KEY_tie;
6118             break;
6119         case 4:
6120             if (strEQ(d,"tell"))                return -KEY_tell;
6121             if (strEQ(d,"tied"))                return KEY_tied;
6122             if (strEQ(d,"time"))                return -KEY_time;
6123             break;
6124         case 5:
6125             if (strEQ(d,"times"))               return -KEY_times;
6126             break;
6127         case 7:
6128             if (strEQ(d,"telldir"))             return -KEY_telldir;
6129             break;
6130         case 8:
6131             if (strEQ(d,"truncate"))            return -KEY_truncate;
6132             break;
6133         }
6134         break;
6135     case 'u':
6136         switch (len) {
6137         case 2:
6138             if (strEQ(d,"uc"))                  return -KEY_uc;
6139             break;
6140         case 3:
6141             if (strEQ(d,"use"))                 return KEY_use;
6142             break;
6143         case 5:
6144             if (strEQ(d,"undef"))               return KEY_undef;
6145             if (strEQ(d,"until"))               return KEY_until;
6146             if (strEQ(d,"untie"))               return KEY_untie;
6147             if (strEQ(d,"utime"))               return -KEY_utime;
6148             if (strEQ(d,"umask"))               return -KEY_umask;
6149             break;
6150         case 6:
6151             if (strEQ(d,"unless"))              return KEY_unless;
6152             if (strEQ(d,"unpack"))              return -KEY_unpack;
6153             if (strEQ(d,"unlink"))              return -KEY_unlink;
6154             break;
6155         case 7:
6156            if (strEQ(d,"unshift"))             return -KEY_unshift;
6157             if (strEQ(d,"ucfirst"))             return -KEY_ucfirst;
6158             break;
6159         }
6160         break;
6161     case 'v':
6162         if (strEQ(d,"values"))                  return -KEY_values;
6163         if (strEQ(d,"vec"))                     return -KEY_vec;
6164         break;
6165     case 'w':
6166         switch (len) {
6167         case 4:
6168             if (strEQ(d,"warn"))                return -KEY_warn;
6169             if (strEQ(d,"wait"))                return -KEY_wait;
6170             break;
6171         case 5:
6172             if (strEQ(d,"while"))               return KEY_while;
6173             if (strEQ(d,"write"))               return -KEY_write;
6174             break;
6175         case 7:
6176             if (strEQ(d,"waitpid"))             return -KEY_waitpid;
6177             break;
6178         case 9:
6179             if (strEQ(d,"wantarray"))           return -KEY_wantarray;
6180             break;
6181         }
6182         break;
6183     case 'x':
6184         if (len == 1)                           return -KEY_x;
6185         if (strEQ(d,"xor"))                     return -KEY_xor;
6186         break;
6187     case 'y':
6188         if (len == 1)                           return KEY_y;
6189         break;
6190     case 'z':
6191         break;
6192     }
6193     return 0;
6194 }
6195
6196 STATIC void
6197 S_checkcomma(pTHX_ register char *s, char *name, char *what)
6198 {
6199     char *w;
6200
6201     if (*s == ' ' && s[1] == '(') {     /* XXX gotta be a better way */
6202         if (ckWARN(WARN_SYNTAX)) {
6203             int level = 1;
6204             for (w = s+2; *w && level; w++) {
6205                 if (*w == '(')
6206                     ++level;
6207                 else if (*w == ')')
6208                     --level;
6209             }
6210             if (*w)
6211                 for (; *w && isSPACE(*w); w++) ;
6212             if (!*w || !strchr(";|})]oaiuw!=", *w))     /* an advisory hack only... */
6213                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
6214                             "%s (...) interpreted as function",name);
6215         }
6216     }
6217     while (s < PL_bufend && isSPACE(*s))
6218         s++;
6219     if (*s == '(')
6220         s++;
6221     while (s < PL_bufend && isSPACE(*s))
6222         s++;
6223     if (isIDFIRST_lazy_if(s,UTF)) {
6224         w = s++;
6225         while (isALNUM_lazy_if(s,UTF))
6226             s++;
6227         while (s < PL_bufend && isSPACE(*s))
6228             s++;
6229         if (*s == ',') {
6230             int kw;
6231             *s = '\0';
6232             kw = keyword(w, s - w) || get_cv(w, FALSE) != 0;
6233             *s = ',';
6234             if (kw)
6235                 return;
6236             Perl_croak(aTHX_ "No comma allowed after %s", what);
6237         }
6238     }
6239 }
6240
6241 /* Either returns sv, or mortalizes sv and returns a new SV*.
6242    Best used as sv=new_constant(..., sv, ...).
6243    If s, pv are NULL, calls subroutine with one argument,
6244    and type is used with error messages only. */
6245
6246 STATIC SV *
6247 S_new_constant(pTHX_ char *s, STRLEN len, const char *key, SV *sv, SV *pv,
6248                const char *type)
6249 {
6250     dSP;
6251     HV *table = GvHV(PL_hintgv);                 /* ^H */
6252     SV *res;
6253     SV **cvp;
6254     SV *cv, *typesv;
6255     const char *why1, *why2, *why3;
6256
6257     if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
6258         SV *msg;
6259         
6260         why2 = strEQ(key,"charnames")
6261                ? "(possibly a missing \"use charnames ...\")"
6262                : "";
6263         msg = Perl_newSVpvf(aTHX_ "Constant(%s) unknown: %s",
6264                             (type ? type: "undef"), why2);
6265
6266         /* This is convoluted and evil ("goto considered harmful")
6267          * but I do not understand the intricacies of all the different
6268          * failure modes of %^H in here.  The goal here is to make
6269          * the most probable error message user-friendly. --jhi */
6270
6271         goto msgdone;
6272
6273     report:
6274         msg = Perl_newSVpvf(aTHX_ "Constant(%s): %s%s%s",
6275                             (type ? type: "undef"), why1, why2, why3);
6276     msgdone:
6277         yyerror(SvPVX(msg));
6278         SvREFCNT_dec(msg);
6279         return sv;
6280     }
6281     cvp = hv_fetch(table, key, strlen(key), FALSE);
6282     if (!cvp || !SvOK(*cvp)) {
6283         why1 = "$^H{";
6284         why2 = key;
6285         why3 = "} is not defined";
6286         goto report;
6287     }
6288     sv_2mortal(sv);                     /* Parent created it permanently */
6289     cv = *cvp;
6290     if (!pv && s)
6291         pv = sv_2mortal(newSVpvn(s, len));
6292     if (type && pv)
6293         typesv = sv_2mortal(newSVpv(type, 0));
6294     else
6295         typesv = &PL_sv_undef;
6296
6297     PUSHSTACKi(PERLSI_OVERLOAD);
6298     ENTER ;
6299     SAVETMPS;
6300
6301     PUSHMARK(SP) ;
6302     EXTEND(sp, 3);
6303     if (pv)
6304         PUSHs(pv);
6305     PUSHs(sv);
6306     if (pv)
6307         PUSHs(typesv);
6308     PUTBACK;
6309     call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
6310
6311     SPAGAIN ;
6312
6313     /* Check the eval first */
6314     if (!PL_in_eval && SvTRUE(ERRSV)) {
6315         STRLEN n_a;
6316         sv_catpv(ERRSV, "Propagated");
6317         yyerror(SvPV(ERRSV, n_a)); /* Duplicates the message inside eval */
6318         (void)POPs;
6319         res = SvREFCNT_inc(sv);
6320     }
6321     else {
6322         res = POPs;
6323         (void)SvREFCNT_inc(res);
6324     }
6325
6326     PUTBACK ;
6327     FREETMPS ;
6328     LEAVE ;
6329     POPSTACK;
6330
6331     if (!SvOK(res)) {
6332         why1 = "Call to &{$^H{";
6333         why2 = key;
6334         why3 = "}} did not return a defined value";
6335         sv = res;
6336         goto report;
6337     }
6338
6339     return res;
6340 }
6341
6342 /* Returns a NUL terminated string, with the length of the string written to
6343    *slp
6344    */
6345 STATIC char *
6346 S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
6347 {
6348     register char *d = dest;
6349     register char *e = d + destlen - 3;  /* two-character token, ending NUL */
6350     for (;;) {
6351         if (d >= e)
6352             Perl_croak(aTHX_ ident_too_long);
6353         if (isALNUM(*s))        /* UTF handled below */
6354             *d++ = *s++;
6355         else if (*s == '\'' && allow_package && isIDFIRST_lazy_if(s+1,UTF)) {
6356             *d++ = ':';
6357             *d++ = ':';
6358             s++;
6359         }
6360         else if (*s == ':' && s[1] == ':' && allow_package && s[2] != '$') {
6361             *d++ = *s++;
6362             *d++ = *s++;
6363         }
6364         else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
6365             char *t = s + UTF8SKIP(s);
6366             while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
6367                 t += UTF8SKIP(t);
6368             if (d + (t - s) > e)
6369                 Perl_croak(aTHX_ ident_too_long);
6370             Copy(s, d, t - s, char);
6371             d += t - s;
6372             s = t;
6373         }
6374         else {
6375             *d = '\0';
6376             *slp = d - dest;
6377             return s;
6378         }
6379     }
6380 }
6381
6382 STATIC char *
6383 S_scan_ident(pTHX_ register char *s, register char *send, char *dest, STRLEN destlen, I32 ck_uni)
6384 {
6385     register char *d;
6386     register char *e;
6387     char *bracket = 0;
6388     char funny = *s++;
6389
6390     if (isSPACE(*s))
6391         s = skipspace(s);
6392     d = dest;
6393     e = d + destlen - 3;        /* two-character token, ending NUL */
6394     if (isDIGIT(*s)) {
6395         while (isDIGIT(*s)) {
6396             if (d >= e)
6397                 Perl_croak(aTHX_ ident_too_long);
6398             *d++ = *s++;
6399         }
6400     }
6401     else {
6402         for (;;) {
6403             if (d >= e)
6404                 Perl_croak(aTHX_ ident_too_long);
6405             if (isALNUM(*s))    /* UTF handled below */
6406                 *d++ = *s++;
6407             else if (*s == '\'' && isIDFIRST_lazy_if(s+1,UTF)) {
6408                 *d++ = ':';
6409                 *d++ = ':';
6410                 s++;
6411             }
6412             else if (*s == ':' && s[1] == ':') {
6413                 *d++ = *s++;
6414                 *d++ = *s++;
6415             }
6416             else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
6417                 char *t = s + UTF8SKIP(s);
6418                 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
6419                     t += UTF8SKIP(t);
6420                 if (d + (t - s) > e)
6421                     Perl_croak(aTHX_ ident_too_long);
6422                 Copy(s, d, t - s, char);
6423                 d += t - s;
6424                 s = t;
6425             }
6426             else
6427                 break;
6428         }
6429     }
6430     *d = '\0';
6431     d = dest;
6432     if (*d) {
6433         if (PL_lex_state != LEX_NORMAL)
6434             PL_lex_state = LEX_INTERPENDMAYBE;
6435         return s;
6436     }
6437     if (*s == '$' && s[1] &&
6438         (isALNUM_lazy_if(s+1,UTF) || s[1] == '$' || s[1] == '{' || strnEQ(s+1,"::",2)) )
6439     {
6440         return s;
6441     }
6442     if (*s == '{') {
6443         bracket = s;
6444         s++;
6445     }
6446     else if (ck_uni)
6447         check_uni();
6448     if (s < send)
6449         *d = *s++;
6450     d[1] = '\0';
6451     if (*d == '^' && *s && isCONTROLVAR(*s)) {
6452         *d = toCTRL(*s);
6453         s++;
6454     }
6455     if (bracket) {
6456         if (isSPACE(s[-1])) {
6457             while (s < send) {
6458                 char ch = *s++;
6459                 if (!SPACE_OR_TAB(ch)) {
6460                     *d = ch;
6461                     break;
6462                 }
6463             }
6464         }
6465         if (isIDFIRST_lazy_if(d,UTF)) {
6466             d++;
6467             if (UTF) {
6468                 e = s;
6469                 while ((e < send && isALNUM_lazy_if(e,UTF)) || *e == ':') {
6470                     e += UTF8SKIP(e);
6471                     while (e < send && UTF8_IS_CONTINUED(*e) && is_utf8_mark((U8*)e))
6472                         e += UTF8SKIP(e);
6473                 }
6474                 Copy(s, d, e - s, char);
6475                 d += e - s;
6476                 s = e;
6477             }
6478             else {
6479                 while ((isALNUM(*s) || *s == ':') && d < e)
6480                     *d++ = *s++;
6481                 if (d >= e)
6482                     Perl_croak(aTHX_ ident_too_long);
6483             }
6484             *d = '\0';
6485             while (s < send && SPACE_OR_TAB(*s)) s++;
6486             if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
6487                 if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest)) {
6488                     const char *brack = *s == '[' ? "[...]" : "{...}";
6489                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
6490                         "Ambiguous use of %c{%s%s} resolved to %c%s%s",
6491                         funny, dest, brack, funny, dest, brack);
6492                 }
6493                 bracket++;
6494                 PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
6495                 return s;
6496             }
6497         }
6498         /* Handle extended ${^Foo} variables
6499          * 1999-02-27 mjd-perl-patch@plover.com */
6500         else if (!isALNUM(*d) && !isPRINT(*d) /* isCTRL(d) */
6501                  && isALNUM(*s))
6502         {
6503             d++;
6504             while (isALNUM(*s) && d < e) {
6505                 *d++ = *s++;
6506             }
6507             if (d >= e)
6508                 Perl_croak(aTHX_ ident_too_long);
6509             *d = '\0';
6510         }
6511         if (*s == '}') {
6512             s++;
6513             if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) {
6514                 PL_lex_state = LEX_INTERPEND;
6515                 PL_expect = XREF;
6516             }
6517             if (funny == '#')
6518                 funny = '@';
6519             if (PL_lex_state == LEX_NORMAL) {
6520                 if (ckWARN(WARN_AMBIGUOUS) &&
6521                     (keyword(dest, d - dest) || get_cv(dest, FALSE)))
6522                 {
6523                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
6524                         "Ambiguous use of %c{%s} resolved to %c%s",
6525                         funny, dest, funny, dest);
6526                 }
6527             }
6528         }
6529         else {
6530             s = bracket;                /* let the parser handle it */
6531             *dest = '\0';
6532         }
6533     }
6534     else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
6535         PL_lex_state = LEX_INTERPEND;
6536     return s;
6537 }
6538
6539 void
6540 Perl_pmflag(pTHX_ U32* pmfl, int ch)
6541 {
6542     if (ch == 'i')
6543         *pmfl |= PMf_FOLD;
6544     else if (ch == 'g')
6545         *pmfl |= PMf_GLOBAL;
6546     else if (ch == 'c')
6547         *pmfl |= PMf_CONTINUE;
6548     else if (ch == 'o')
6549         *pmfl |= PMf_KEEP;
6550     else if (ch == 'm')
6551         *pmfl |= PMf_MULTILINE;
6552     else if (ch == 's')
6553         *pmfl |= PMf_SINGLELINE;
6554     else if (ch == 'x')
6555         *pmfl |= PMf_EXTENDED;
6556 }
6557
6558 STATIC char *
6559 S_scan_pat(pTHX_ char *start, I32 type)
6560 {
6561     PMOP *pm;
6562     char *s;
6563
6564     s = scan_str(start,FALSE,FALSE);
6565     if (!s)
6566         Perl_croak(aTHX_ "Search pattern not terminated");
6567
6568     pm = (PMOP*)newPMOP(type, 0);
6569     if (PL_multi_open == '?')
6570         pm->op_pmflags |= PMf_ONCE;
6571     if(type == OP_QR) {
6572         while (*s && strchr("iomsx", *s))
6573             pmflag(&pm->op_pmflags,*s++);
6574     }
6575     else {
6576         while (*s && strchr("iogcmsx", *s))
6577             pmflag(&pm->op_pmflags,*s++);
6578     }
6579     /* issue a warning if /c is specified,but /g is not */
6580     if (ckWARN(WARN_REGEXP) && 
6581         (pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL))
6582     {
6583         Perl_warner(aTHX_ packWARN(WARN_REGEXP), c_without_g);
6584     }
6585
6586     pm->op_pmpermflags = pm->op_pmflags;
6587
6588     PL_lex_op = (OP*)pm;
6589     yylval.ival = OP_MATCH;
6590     return s;
6591 }
6592
6593 STATIC char *
6594 S_scan_subst(pTHX_ char *start)
6595 {
6596     register char *s;
6597     register PMOP *pm;
6598     I32 first_start;
6599     I32 es = 0;
6600
6601     yylval.ival = OP_NULL;
6602
6603     s = scan_str(start,FALSE,FALSE);
6604
6605     if (!s)
6606         Perl_croak(aTHX_ "Substitution pattern not terminated");
6607
6608     if (s[-1] == PL_multi_open)
6609         s--;
6610
6611     first_start = PL_multi_start;
6612     s = scan_str(s,FALSE,FALSE);
6613     if (!s) {
6614         if (PL_lex_stuff) {
6615             SvREFCNT_dec(PL_lex_stuff);
6616             PL_lex_stuff = Nullsv;
6617         }
6618         Perl_croak(aTHX_ "Substitution replacement not terminated");
6619     }
6620     PL_multi_start = first_start;       /* so whole substitution is taken together */
6621
6622     pm = (PMOP*)newPMOP(OP_SUBST, 0);
6623     while (*s) {
6624         if (*s == 'e') {
6625             s++;
6626             es++;
6627         }
6628         else if (strchr("iogcmsx", *s))
6629             pmflag(&pm->op_pmflags,*s++);
6630         else
6631             break;
6632     }
6633
6634     /* /c is not meaningful with s/// */
6635     if (ckWARN(WARN_REGEXP) && (pm->op_pmflags & PMf_CONTINUE))
6636     {
6637         Perl_warner(aTHX_ packWARN(WARN_REGEXP), c_in_subst);
6638     }
6639
6640     if (es) {
6641         SV *repl;
6642         PL_sublex_info.super_bufptr = s;
6643         PL_sublex_info.super_bufend = PL_bufend;
6644         PL_multi_end = 0;
6645         pm->op_pmflags |= PMf_EVAL;
6646         repl = newSVpvn("",0);
6647         while (es-- > 0)
6648             sv_catpv(repl, es ? "eval " : "do ");
6649         sv_catpvn(repl, "{ ", 2);
6650         sv_catsv(repl, PL_lex_repl);
6651         sv_catpvn(repl, " };", 2);
6652         SvEVALED_on(repl);
6653         SvREFCNT_dec(PL_lex_repl);
6654         PL_lex_repl = repl;
6655     }
6656
6657     pm->op_pmpermflags = pm->op_pmflags;
6658     PL_lex_op = (OP*)pm;
6659     yylval.ival = OP_SUBST;
6660     return s;
6661 }
6662
6663 STATIC char *
6664 S_scan_trans(pTHX_ char *start)
6665 {
6666     register char* s;
6667     OP *o;
6668     short *tbl;
6669     I32 squash;
6670     I32 del;
6671     I32 complement;
6672
6673     yylval.ival = OP_NULL;
6674
6675     s = scan_str(start,FALSE,FALSE);
6676     if (!s)
6677         Perl_croak(aTHX_ "Transliteration pattern not terminated");
6678     if (s[-1] == PL_multi_open)
6679         s--;
6680
6681     s = scan_str(s,FALSE,FALSE);
6682     if (!s) {
6683         if (PL_lex_stuff) {
6684             SvREFCNT_dec(PL_lex_stuff);
6685             PL_lex_stuff = Nullsv;
6686         }
6687         Perl_croak(aTHX_ "Transliteration replacement not terminated");
6688     }
6689
6690     complement = del = squash = 0;
6691     while (1) {
6692         switch (*s) {
6693         case 'c':
6694             complement = OPpTRANS_COMPLEMENT;
6695             break;
6696         case 'd':
6697             del = OPpTRANS_DELETE;
6698             break;
6699         case 's':
6700             squash = OPpTRANS_SQUASH;
6701             break;
6702         default:
6703             goto no_more;
6704         }
6705         s++;
6706     }
6707   no_more:
6708
6709     New(803, tbl, complement&&!del?258:256, short);
6710     o = newPVOP(OP_TRANS, 0, (char*)tbl);
6711     o->op_private &= ~OPpTRANS_ALL;
6712     o->op_private |= del|squash|complement|
6713       (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
6714       (DO_UTF8(PL_lex_repl) ? OPpTRANS_TO_UTF   : 0);
6715
6716     PL_lex_op = o;
6717     yylval.ival = OP_TRANS;
6718     return s;
6719 }
6720
6721 STATIC char *
6722 S_scan_heredoc(pTHX_ register char *s)
6723 {
6724     SV *herewas;
6725     I32 op_type = OP_SCALAR;
6726     I32 len;
6727     SV *tmpstr;
6728     char term;
6729     register char *d;
6730     register char *e;
6731     char *peek;
6732     int outer = (PL_rsfp && !(PL_lex_inwhat == OP_SCALAR));
6733
6734     s += 2;
6735     d = PL_tokenbuf;
6736     e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
6737     if (!outer)
6738         *d++ = '\n';
6739     for (peek = s; SPACE_OR_TAB(*peek); peek++) ;
6740     if (*peek == '`' || *peek == '\'' || *peek =='"') {
6741         s = peek;
6742         term = *s++;
6743         s = delimcpy(d, e, s, PL_bufend, term, &len);
6744         d += len;
6745         if (s < PL_bufend)
6746             s++;
6747     }
6748     else {
6749         if (*s == '\\')
6750             s++, term = '\'';
6751         else
6752             term = '"';
6753         if (!isALNUM_lazy_if(s,UTF))
6754             deprecate_old("bare << to mean <<\"\"");
6755         for (; isALNUM_lazy_if(s,UTF); s++) {
6756             if (d < e)
6757                 *d++ = *s;
6758         }
6759     }
6760     if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
6761         Perl_croak(aTHX_ "Delimiter for here document is too long");
6762     *d++ = '\n';
6763     *d = '\0';
6764     len = d - PL_tokenbuf;
6765 #ifndef PERL_STRICT_CR
6766     d = strchr(s, '\r');
6767     if (d) {
6768         char *olds = s;
6769         s = d;
6770         while (s < PL_bufend) {
6771             if (*s == '\r') {
6772                 *d++ = '\n';
6773                 if (*++s == '\n')
6774                     s++;
6775             }
6776             else if (*s == '\n' && s[1] == '\r') {      /* \015\013 on a mac? */
6777                 *d++ = *s++;
6778                 s++;
6779             }
6780             else
6781                 *d++ = *s++;
6782         }
6783         *d = '\0';
6784         PL_bufend = d;
6785         SvCUR_set(PL_linestr, PL_bufend - SvPVX(PL_linestr));
6786         s = olds;
6787     }
6788 #endif
6789     d = "\n";
6790     if (outer || !(d=ninstr(s,PL_bufend,d,d+1)))
6791         herewas = newSVpvn(s,PL_bufend-s);
6792     else
6793         s--, herewas = newSVpvn(s,d-s);
6794     s += SvCUR(herewas);
6795
6796     tmpstr = NEWSV(87,79);
6797     sv_upgrade(tmpstr, SVt_PVIV);
6798     if (term == '\'') {
6799         op_type = OP_CONST;
6800         SvIVX(tmpstr) = -1;
6801     }
6802     else if (term == '`') {
6803         op_type = OP_BACKTICK;
6804         SvIVX(tmpstr) = '\\';
6805     }
6806
6807     CLINE;
6808     PL_multi_start = CopLINE(PL_curcop);
6809     PL_multi_open = PL_multi_close = '<';
6810     term = *PL_tokenbuf;
6811     if (PL_lex_inwhat == OP_SUBST && PL_in_eval && !PL_rsfp) {
6812         char *bufptr = PL_sublex_info.super_bufptr;
6813         char *bufend = PL_sublex_info.super_bufend;
6814         char *olds = s - SvCUR(herewas);
6815         s = strchr(bufptr, '\n');
6816         if (!s)
6817             s = bufend;
6818         d = s;
6819         while (s < bufend &&
6820           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
6821             if (*s++ == '\n')
6822                 CopLINE_inc(PL_curcop);
6823         }
6824         if (s >= bufend) {
6825             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
6826             missingterm(PL_tokenbuf);
6827         }
6828         sv_setpvn(herewas,bufptr,d-bufptr+1);
6829         sv_setpvn(tmpstr,d+1,s-d);
6830         s += len - 1;
6831         sv_catpvn(herewas,s,bufend-s);
6832         Copy(SvPVX(herewas),bufptr,SvCUR(herewas) + 1,char);
6833
6834         s = olds;
6835         goto retval;
6836     }
6837     else if (!outer) {
6838         d = s;
6839         while (s < PL_bufend &&
6840           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
6841             if (*s++ == '\n')
6842                 CopLINE_inc(PL_curcop);
6843         }
6844         if (s >= PL_bufend) {
6845             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
6846             missingterm(PL_tokenbuf);
6847         }
6848         sv_setpvn(tmpstr,d+1,s-d);
6849         s += len - 1;
6850         CopLINE_inc(PL_curcop); /* the preceding stmt passes a newline */
6851
6852         sv_catpvn(herewas,s,PL_bufend-s);
6853         sv_setsv(PL_linestr,herewas);
6854         PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
6855         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
6856         PL_last_lop = PL_last_uni = Nullch;
6857     }
6858     else
6859         sv_setpvn(tmpstr,"",0);   /* avoid "uninitialized" warning */
6860     while (s >= PL_bufend) {    /* multiple line string? */
6861         if (!outer ||
6862          !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
6863             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
6864             missingterm(PL_tokenbuf);
6865         }
6866         CopLINE_inc(PL_curcop);
6867         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
6868         PL_last_lop = PL_last_uni = Nullch;
6869 #ifndef PERL_STRICT_CR
6870         if (PL_bufend - PL_linestart >= 2) {
6871             if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
6872                 (PL_bufend[-2] == '\n' && PL_bufend[-1] == '\r'))
6873             {
6874                 PL_bufend[-2] = '\n';
6875                 PL_bufend--;
6876                 SvCUR_set(PL_linestr, PL_bufend - SvPVX(PL_linestr));
6877             }
6878             else if (PL_bufend[-1] == '\r')
6879                 PL_bufend[-1] = '\n';
6880         }
6881         else if (PL_bufend - PL_linestart == 1 && PL_bufend[-1] == '\r')
6882             PL_bufend[-1] = '\n';
6883 #endif
6884         if (PERLDB_LINE && PL_curstash != PL_debstash) {
6885             SV *sv = NEWSV(88,0);
6886
6887             sv_upgrade(sv, SVt_PVMG);
6888             sv_setsv(sv,PL_linestr);
6889             (void)SvIOK_on(sv);
6890             SvIVX(sv) = 0;
6891             av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop),sv);
6892         }
6893         if (*s == term && memEQ(s,PL_tokenbuf,len)) {
6894             STRLEN off = PL_bufend - 1 - SvPVX(PL_linestr);
6895             *(SvPVX(PL_linestr) + off ) = ' ';
6896             sv_catsv(PL_linestr,herewas);
6897             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
6898             s = SvPVX(PL_linestr) + off; /* In case PV of PL_linestr moved. */
6899         }
6900         else {
6901             s = PL_bufend;
6902             sv_catsv(tmpstr,PL_linestr);
6903         }
6904     }
6905     s++;
6906 retval:
6907     PL_multi_end = CopLINE(PL_curcop);
6908     if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
6909         SvLEN_set(tmpstr, SvCUR(tmpstr) + 1);
6910         Renew(SvPVX(tmpstr), SvLEN(tmpstr), char);
6911     }
6912     SvREFCNT_dec(herewas);
6913     if (!IN_BYTES) {
6914         if (UTF && is_utf8_string((U8*)SvPVX(tmpstr), SvCUR(tmpstr)))
6915             SvUTF8_on(tmpstr);
6916         else if (PL_encoding)
6917             sv_recode_to_utf8(tmpstr, PL_encoding);
6918     }
6919     PL_lex_stuff = tmpstr;
6920     yylval.ival = op_type;
6921     return s;
6922 }
6923
6924 /* scan_inputsymbol
6925    takes: current position in input buffer
6926    returns: new position in input buffer
6927    side-effects: yylval and lex_op are set.
6928
6929    This code handles:
6930
6931    <>           read from ARGV
6932    <FH>         read from filehandle
6933    <pkg::FH>    read from package qualified filehandle
6934    <pkg'FH>     read from package qualified filehandle
6935    <$fh>        read from filehandle in $fh
6936    <*.h>        filename glob
6937
6938 */
6939
6940 STATIC char *
6941 S_scan_inputsymbol(pTHX_ char *start)
6942 {
6943     register char *s = start;           /* current position in buffer */
6944     register char *d;
6945     register char *e;
6946     char *end;
6947     I32 len;
6948
6949     d = PL_tokenbuf;                    /* start of temp holding space */
6950     e = PL_tokenbuf + sizeof PL_tokenbuf;       /* end of temp holding space */
6951     end = strchr(s, '\n');
6952     if (!end)
6953         end = PL_bufend;
6954     s = delimcpy(d, e, s + 1, end, '>', &len);  /* extract until > */
6955
6956     /* die if we didn't have space for the contents of the <>,
6957        or if it didn't end, or if we see a newline
6958     */
6959
6960     if (len >= sizeof PL_tokenbuf)
6961         Perl_croak(aTHX_ "Excessively long <> operator");
6962     if (s >= end)
6963         Perl_croak(aTHX_ "Unterminated <> operator");
6964
6965     s++;
6966
6967     /* check for <$fh>
6968        Remember, only scalar variables are interpreted as filehandles by
6969        this code.  Anything more complex (e.g., <$fh{$num}>) will be
6970        treated as a glob() call.
6971        This code makes use of the fact that except for the $ at the front,
6972        a scalar variable and a filehandle look the same.
6973     */
6974     if (*d == '$' && d[1]) d++;
6975
6976     /* allow <Pkg'VALUE> or <Pkg::VALUE> */
6977     while (*d && (isALNUM_lazy_if(d,UTF) || *d == '\'' || *d == ':'))
6978         d++;
6979
6980     /* If we've tried to read what we allow filehandles to look like, and
6981        there's still text left, then it must be a glob() and not a getline.
6982        Use scan_str to pull out the stuff between the <> and treat it
6983        as nothing more than a string.
6984     */
6985
6986     if (d - PL_tokenbuf != len) {
6987         yylval.ival = OP_GLOB;
6988         set_csh();
6989         s = scan_str(start,FALSE,FALSE);
6990         if (!s)
6991            Perl_croak(aTHX_ "Glob not terminated");
6992         return s;
6993     }
6994     else {
6995         bool readline_overriden = FALSE;
6996         GV *gv_readline = Nullgv;
6997         GV **gvp;
6998         /* we're in a filehandle read situation */
6999         d = PL_tokenbuf;
7000
7001         /* turn <> into <ARGV> */
7002         if (!len)
7003             Copy("ARGV",d,5,char);
7004
7005         /* Check whether readline() is overriden */
7006         if (((gv_readline = gv_fetchpv("readline", FALSE, SVt_PVCV))
7007                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline))
7008                 ||
7009                 ((gvp = (GV**)hv_fetch(PL_globalstash, "readline", 8, FALSE))
7010                 && (gv_readline = *gvp) != (GV*)&PL_sv_undef
7011                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline)))
7012             readline_overriden = TRUE;
7013
7014         /* if <$fh>, create the ops to turn the variable into a
7015            filehandle
7016         */
7017         if (*d == '$') {
7018             I32 tmp;
7019
7020             /* try to find it in the pad for this block, otherwise find
7021                add symbol table ops
7022             */
7023             if ((tmp = pad_findmy(d)) != NOT_IN_PAD) {
7024                 if (PAD_COMPNAME_FLAGS(tmp) & SVpad_OUR) {
7025                     SV *sym = sv_2mortal(
7026                             newSVpv(HvNAME(PAD_COMPNAME_OURSTASH(tmp)),0));
7027                     sv_catpvn(sym, "::", 2);
7028                     sv_catpv(sym, d+1);
7029                     d = SvPVX(sym);
7030                     goto intro_sym;
7031                 }
7032                 else {
7033                     OP *o = newOP(OP_PADSV, 0);
7034                     o->op_targ = tmp;
7035                     PL_lex_op = readline_overriden
7036                         ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
7037                                 append_elem(OP_LIST, o,
7038                                     newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
7039                         : (OP*)newUNOP(OP_READLINE, 0, o);
7040                 }
7041             }
7042             else {
7043                 GV *gv;
7044                 ++d;
7045 intro_sym:
7046                 gv = gv_fetchpv(d,
7047                                 (PL_in_eval
7048                                  ? (GV_ADDMULTI | GV_ADDINEVAL)
7049                                  : GV_ADDMULTI),
7050                                 SVt_PV);
7051                 PL_lex_op = readline_overriden
7052                     ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
7053                             append_elem(OP_LIST,
7054                                 newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
7055                                 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
7056                     : (OP*)newUNOP(OP_READLINE, 0,
7057                             newUNOP(OP_RV2SV, 0,
7058                                 newGVOP(OP_GV, 0, gv)));
7059             }
7060             if (!readline_overriden)
7061                 PL_lex_op->op_flags |= OPf_SPECIAL;
7062             /* we created the ops in PL_lex_op, so make yylval.ival a null op */
7063             yylval.ival = OP_NULL;
7064         }
7065
7066         /* If it's none of the above, it must be a literal filehandle
7067            (<Foo::BAR> or <FOO>) so build a simple readline OP */
7068         else {
7069             GV *gv = gv_fetchpv(d,TRUE, SVt_PVIO);
7070             PL_lex_op = readline_overriden
7071                 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
7072                         append_elem(OP_LIST,
7073                             newGVOP(OP_GV, 0, gv),
7074                             newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
7075                 : (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
7076             yylval.ival = OP_NULL;
7077         }
7078     }
7079
7080     return s;
7081 }
7082
7083
7084 /* scan_str
7085    takes: start position in buffer
7086           keep_quoted preserve \ on the embedded delimiter(s)
7087           keep_delims preserve the delimiters around the string
7088    returns: position to continue reading from buffer
7089    side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
7090         updates the read buffer.
7091
7092    This subroutine pulls a string out of the input.  It is called for:
7093         q               single quotes           q(literal text)
7094         '               single quotes           'literal text'
7095         qq              double quotes           qq(interpolate $here please)
7096         "               double quotes           "interpolate $here please"
7097         qx              backticks               qx(/bin/ls -l)
7098         `               backticks               `/bin/ls -l`
7099         qw              quote words             @EXPORT_OK = qw( func() $spam )
7100         m//             regexp match            m/this/
7101         s///            regexp substitute       s/this/that/
7102         tr///           string transliterate    tr/this/that/
7103         y///            string transliterate    y/this/that/
7104         ($*@)           sub prototypes          sub foo ($)
7105         (stuff)         sub attr parameters     sub foo : attr(stuff)
7106         <>              readline or globs       <FOO>, <>, <$fh>, or <*.c>
7107         
7108    In most of these cases (all but <>, patterns and transliterate)
7109    yylex() calls scan_str().  m// makes yylex() call scan_pat() which
7110    calls scan_str().  s/// makes yylex() call scan_subst() which calls
7111    scan_str().  tr/// and y/// make yylex() call scan_trans() which
7112    calls scan_str().
7113
7114    It skips whitespace before the string starts, and treats the first
7115    character as the delimiter.  If the delimiter is one of ([{< then
7116    the corresponding "close" character )]}> is used as the closing
7117    delimiter.  It allows quoting of delimiters, and if the string has
7118    balanced delimiters ([{<>}]) it allows nesting.
7119
7120    On success, the SV with the resulting string is put into lex_stuff or,
7121    if that is already non-NULL, into lex_repl. The second case occurs only
7122    when parsing the RHS of the special constructs s/// and tr/// (y///).
7123    For convenience, the terminating delimiter character is stuffed into
7124    SvIVX of the SV.
7125 */
7126
7127 STATIC char *
7128 S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
7129 {
7130     SV *sv;                             /* scalar value: string */
7131     char *tmps;                         /* temp string, used for delimiter matching */
7132     register char *s = start;           /* current position in the buffer */
7133     register char term;                 /* terminating character */
7134     register char *to;                  /* current position in the sv's data */
7135     I32 brackets = 1;                   /* bracket nesting level */
7136     bool has_utf8 = FALSE;              /* is there any utf8 content? */
7137     I32 termcode;                       /* terminating char. code */
7138     U8 termstr[UTF8_MAXLEN];            /* terminating string */
7139     STRLEN termlen;                     /* length of terminating string */
7140     char *last = NULL;                  /* last position for nesting bracket */
7141
7142     /* skip space before the delimiter */
7143     if (isSPACE(*s))
7144         s = skipspace(s);
7145
7146     /* mark where we are, in case we need to report errors */
7147     CLINE;
7148
7149     /* after skipping whitespace, the next character is the terminator */
7150     term = *s;
7151     if (!UTF) {
7152         termcode = termstr[0] = term;
7153         termlen = 1;
7154     }
7155     else {
7156         termcode = utf8_to_uvchr((U8*)s, &termlen);
7157         Copy(s, termstr, termlen, U8);
7158         if (!UTF8_IS_INVARIANT(term))
7159             has_utf8 = TRUE;
7160     }
7161
7162     /* mark where we are */
7163     PL_multi_start = CopLINE(PL_curcop);
7164     PL_multi_open = term;
7165
7166     /* find corresponding closing delimiter */
7167     if (term && (tmps = strchr("([{< )]}> )]}>",term)))
7168         termcode = termstr[0] = term = tmps[5];
7169
7170     PL_multi_close = term;
7171
7172     /* create a new SV to hold the contents.  87 is leak category, I'm
7173        assuming.  79 is the SV's initial length.  What a random number. */
7174     sv = NEWSV(87,79);
7175     sv_upgrade(sv, SVt_PVIV);
7176     SvIVX(sv) = termcode;
7177     (void)SvPOK_only(sv);               /* validate pointer */
7178
7179     /* move past delimiter and try to read a complete string */
7180     if (keep_delims)
7181         sv_catpvn(sv, s, termlen);
7182     s += termlen;
7183     for (;;) {
7184         if (PL_encoding && !UTF) {
7185             bool cont = TRUE;
7186
7187             while (cont) {
7188                 int offset = s - SvPVX(PL_linestr);
7189                 bool found = sv_cat_decode(sv, PL_encoding, PL_linestr,
7190                                            &offset, (char*)termstr, termlen);
7191                 char *ns = SvPVX(PL_linestr) + offset;
7192                 char *svlast = SvEND(sv) - 1;
7193
7194                 for (; s < ns; s++) {
7195                     if (*s == '\n' && !PL_rsfp)
7196                         CopLINE_inc(PL_curcop);
7197                 }
7198                 if (!found)
7199                     goto read_more_line;
7200                 else {
7201                     /* handle quoted delimiters */
7202                     if (SvCUR(sv) > 1 && *(svlast-1) == '\\') {
7203                         char *t;
7204                         for (t = svlast-2; t >= SvPVX(sv) && *t == '\\';)
7205                             t--;
7206                         if ((svlast-1 - t) % 2) {
7207                             if (!keep_quoted) {
7208                                 *(svlast-1) = term;
7209                                 *svlast = '\0';
7210                                 SvCUR_set(sv, SvCUR(sv) - 1);
7211                             }
7212                             continue;
7213                         }
7214                     }
7215                     if (PL_multi_open == PL_multi_close) {
7216                         cont = FALSE;
7217                     }
7218                     else {
7219                         char *t, *w;
7220                         if (!last)
7221                             last = SvPVX(sv);
7222                         for (w = t = last; t < svlast; w++, t++) {
7223                             /* At here, all closes are "was quoted" one,
7224                                so we don't check PL_multi_close. */
7225                             if (*t == '\\') {
7226                                 if (!keep_quoted && *(t+1) == PL_multi_open)
7227                                     t++;
7228                                 else
7229                                     *w++ = *t++;
7230                             }
7231                             else if (*t == PL_multi_open)
7232                                 brackets++;
7233
7234                             *w = *t;
7235                         }
7236                         if (w < t) {
7237                             *w++ = term;
7238                             *w = '\0';
7239                             SvCUR_set(sv, w - SvPVX(sv));
7240                         }
7241                         last = w;
7242                         if (--brackets <= 0)
7243                             cont = FALSE;
7244                     }
7245                 }
7246             }
7247             if (!keep_delims) {
7248                 SvCUR_set(sv, SvCUR(sv) - 1);
7249                 *SvEND(sv) = '\0';
7250             }
7251             break;
7252         }
7253
7254         /* extend sv if need be */
7255         SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
7256         /* set 'to' to the next character in the sv's string */
7257         to = SvPVX(sv)+SvCUR(sv);
7258
7259         /* if open delimiter is the close delimiter read unbridle */
7260         if (PL_multi_open == PL_multi_close) {
7261             for (; s < PL_bufend; s++,to++) {
7262                 /* embedded newlines increment the current line number */
7263                 if (*s == '\n' && !PL_rsfp)
7264                     CopLINE_inc(PL_curcop);
7265                 /* handle quoted delimiters */
7266                 if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
7267                     if (!keep_quoted && s[1] == term)
7268                         s++;
7269                 /* any other quotes are simply copied straight through */
7270                     else
7271                         *to++ = *s++;
7272                 }
7273                 /* terminate when run out of buffer (the for() condition), or
7274                    have found the terminator */
7275                 else if (*s == term) {
7276                     if (termlen == 1)
7277                         break;
7278                     if (s+termlen <= PL_bufend && memEQ(s, (char*)termstr, termlen))
7279                         break;
7280                 }
7281                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
7282                     has_utf8 = TRUE;
7283                 *to = *s;
7284             }
7285         }
7286         
7287         /* if the terminator isn't the same as the start character (e.g.,
7288            matched brackets), we have to allow more in the quoting, and
7289            be prepared for nested brackets.
7290         */
7291         else {
7292             /* read until we run out of string, or we find the terminator */
7293             for (; s < PL_bufend; s++,to++) {
7294                 /* embedded newlines increment the line count */
7295                 if (*s == '\n' && !PL_rsfp)
7296                     CopLINE_inc(PL_curcop);
7297                 /* backslashes can escape the open or closing characters */
7298                 if (*s == '\\' && s+1 < PL_bufend) {
7299                     if (!keep_quoted &&
7300                         ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
7301                         s++;
7302                     else
7303                         *to++ = *s++;
7304                 }
7305                 /* allow nested opens and closes */
7306                 else if (*s == PL_multi_close && --brackets <= 0)
7307                     break;
7308                 else if (*s == PL_multi_open)
7309                     brackets++;
7310                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
7311                     has_utf8 = TRUE;
7312                 *to = *s;
7313             }
7314         }
7315         /* terminate the copied string and update the sv's end-of-string */
7316         *to = '\0';
7317         SvCUR_set(sv, to - SvPVX(sv));
7318
7319         /*
7320          * this next chunk reads more into the buffer if we're not done yet
7321          */
7322
7323         if (s < PL_bufend)
7324             break;              /* handle case where we are done yet :-) */
7325
7326 #ifndef PERL_STRICT_CR
7327         if (to - SvPVX(sv) >= 2) {
7328             if ((to[-2] == '\r' && to[-1] == '\n') ||
7329                 (to[-2] == '\n' && to[-1] == '\r'))
7330             {
7331                 to[-2] = '\n';
7332                 to--;
7333                 SvCUR_set(sv, to - SvPVX(sv));
7334             }
7335             else if (to[-1] == '\r')
7336                 to[-1] = '\n';
7337         }
7338         else if (to - SvPVX(sv) == 1 && to[-1] == '\r')
7339             to[-1] = '\n';
7340 #endif
7341         
7342      read_more_line:
7343         /* if we're out of file, or a read fails, bail and reset the current
7344            line marker so we can report where the unterminated string began
7345         */
7346         if (!PL_rsfp ||
7347          !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
7348             sv_free(sv);
7349             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
7350             return Nullch;
7351         }
7352         /* we read a line, so increment our line counter */
7353         CopLINE_inc(PL_curcop);
7354
7355         /* update debugger info */
7356         if (PERLDB_LINE && PL_curstash != PL_debstash) {
7357             SV *sv = NEWSV(88,0);
7358
7359             sv_upgrade(sv, SVt_PVMG);
7360             sv_setsv(sv,PL_linestr);
7361             (void)SvIOK_on(sv);
7362             SvIVX(sv) = 0;
7363             av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop), sv);
7364         }
7365
7366         /* having changed the buffer, we must update PL_bufend */
7367         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
7368         PL_last_lop = PL_last_uni = Nullch;
7369     }
7370
7371     /* at this point, we have successfully read the delimited string */
7372
7373     if (!PL_encoding || UTF) {
7374         if (keep_delims)
7375             sv_catpvn(sv, s, termlen);
7376         s += termlen;
7377     }
7378     if (has_utf8 || PL_encoding)
7379         SvUTF8_on(sv);
7380
7381     PL_multi_end = CopLINE(PL_curcop);
7382
7383     /* if we allocated too much space, give some back */
7384     if (SvCUR(sv) + 5 < SvLEN(sv)) {
7385         SvLEN_set(sv, SvCUR(sv) + 1);
7386         Renew(SvPVX(sv), SvLEN(sv), char);
7387     }
7388
7389     /* decide whether this is the first or second quoted string we've read
7390        for this op
7391     */
7392
7393     if (PL_lex_stuff)
7394         PL_lex_repl = sv;
7395     else
7396         PL_lex_stuff = sv;
7397     return s;
7398 }
7399
7400 /*
7401   scan_num
7402   takes: pointer to position in buffer
7403   returns: pointer to new position in buffer
7404   side-effects: builds ops for the constant in yylval.op
7405
7406   Read a number in any of the formats that Perl accepts:
7407
7408   \d(_?\d)*(\.(\d(_?\d)*)?)?[Ee][\+\-]?(\d(_?\d)*)      12 12.34 12.
7409   \.\d(_?\d)*[Ee][\+\-]?(\d(_?\d)*)                     .34
7410   0b[01](_?[01])*
7411   0[0-7](_?[0-7])*
7412   0x[0-9A-Fa-f](_?[0-9A-Fa-f])*
7413
7414   Like most scan_ routines, it uses the PL_tokenbuf buffer to hold the
7415   thing it reads.
7416
7417   If it reads a number without a decimal point or an exponent, it will
7418   try converting the number to an integer and see if it can do so
7419   without loss of precision.
7420 */
7421
7422 char *
7423 Perl_scan_num(pTHX_ char *start, YYSTYPE* lvalp)
7424 {
7425     register char *s = start;           /* current position in buffer */
7426     register char *d;                   /* destination in temp buffer */
7427     register char *e;                   /* end of temp buffer */
7428     NV nv;                              /* number read, as a double */
7429     SV *sv = Nullsv;                    /* place to put the converted number */
7430     bool floatit;                       /* boolean: int or float? */
7431     char *lastub = 0;                   /* position of last underbar */
7432     static char number_too_long[] = "Number too long";
7433
7434     /* We use the first character to decide what type of number this is */
7435
7436     switch (*s) {
7437     default:
7438       Perl_croak(aTHX_ "panic: scan_num");
7439
7440     /* if it starts with a 0, it could be an octal number, a decimal in
7441        0.13 disguise, or a hexadecimal number, or a binary number. */
7442     case '0':
7443         {
7444           /* variables:
7445              u          holds the "number so far"
7446              shift      the power of 2 of the base
7447                         (hex == 4, octal == 3, binary == 1)
7448              overflowed was the number more than we can hold?
7449
7450              Shift is used when we add a digit.  It also serves as an "are
7451              we in octal/hex/binary?" indicator to disallow hex characters
7452              when in octal mode.
7453            */
7454             NV n = 0.0;
7455             UV u = 0;
7456             I32 shift;
7457             bool overflowed = FALSE;
7458             bool just_zero  = TRUE;     /* just plain 0 or binary number? */
7459             static NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
7460             static char* bases[5] = { "", "binary", "", "octal",
7461                                       "hexadecimal" };
7462             static char* Bases[5] = { "", "Binary", "", "Octal",
7463                                       "Hexadecimal" };
7464             static char *maxima[5] = { "",
7465                                        "0b11111111111111111111111111111111",
7466                                        "",
7467                                        "037777777777",
7468                                        "0xffffffff" };
7469             char *base, *Base, *max;
7470
7471             /* check for hex */
7472             if (s[1] == 'x') {
7473                 shift = 4;
7474                 s += 2;
7475                 just_zero = FALSE;
7476             } else if (s[1] == 'b') {
7477                 shift = 1;
7478                 s += 2;
7479                 just_zero = FALSE;
7480             }
7481             /* check for a decimal in disguise */
7482             else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
7483                 goto decimal;
7484             /* so it must be octal */
7485             else {
7486                 shift = 3;
7487                 s++;
7488             }
7489
7490             if (*s == '_') {
7491                if (ckWARN(WARN_SYNTAX))
7492                    Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7493                                "Misplaced _ in number");
7494                lastub = s++;
7495             }
7496
7497             base = bases[shift];
7498             Base = Bases[shift];
7499             max  = maxima[shift];
7500
7501             /* read the rest of the number */
7502             for (;;) {
7503                 /* x is used in the overflow test,
7504                    b is the digit we're adding on. */
7505                 UV x, b;
7506
7507                 switch (*s) {
7508
7509                 /* if we don't mention it, we're done */
7510                 default:
7511                     goto out;
7512
7513                 /* _ are ignored -- but warned about if consecutive */
7514                 case '_':
7515                     if (ckWARN(WARN_SYNTAX) && lastub && s == lastub + 1)
7516                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7517                                     "Misplaced _ in number");
7518                     lastub = s++;
7519                     break;
7520
7521                 /* 8 and 9 are not octal */
7522                 case '8': case '9':
7523                     if (shift == 3)
7524                         yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
7525                     /* FALL THROUGH */
7526
7527                 /* octal digits */
7528                 case '2': case '3': case '4':
7529                 case '5': case '6': case '7':
7530                     if (shift == 1)
7531                         yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
7532                     /* FALL THROUGH */
7533
7534                 case '0': case '1':
7535                     b = *s++ & 15;              /* ASCII digit -> value of digit */
7536                     goto digit;
7537
7538                 /* hex digits */
7539                 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
7540                 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
7541                     /* make sure they said 0x */
7542                     if (shift != 4)
7543                         goto out;
7544                     b = (*s++ & 7) + 9;
7545
7546                     /* Prepare to put the digit we have onto the end
7547                        of the number so far.  We check for overflows.
7548                     */
7549
7550                   digit:
7551                     just_zero = FALSE;
7552                     if (!overflowed) {
7553                         x = u << shift; /* make room for the digit */
7554
7555                         if ((x >> shift) != u
7556                             && !(PL_hints & HINT_NEW_BINARY)) {
7557                             overflowed = TRUE;
7558                             n = (NV) u;
7559                             if (ckWARN_d(WARN_OVERFLOW))
7560                                 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
7561                                             "Integer overflow in %s number",
7562                                             base);
7563                         } else
7564                             u = x | b;          /* add the digit to the end */
7565                     }
7566                     if (overflowed) {
7567                         n *= nvshift[shift];
7568                         /* If an NV has not enough bits in its
7569                          * mantissa to represent an UV this summing of
7570                          * small low-order numbers is a waste of time
7571                          * (because the NV cannot preserve the
7572                          * low-order bits anyway): we could just
7573                          * remember when did we overflow and in the
7574                          * end just multiply n by the right
7575                          * amount. */
7576                         n += (NV) b;
7577                     }
7578                     break;
7579                 }
7580             }
7581
7582           /* if we get here, we had success: make a scalar value from
7583              the number.
7584           */
7585           out:
7586
7587             /* final misplaced underbar check */
7588             if (s[-1] == '_') {
7589                 if (ckWARN(WARN_SYNTAX))
7590                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
7591             }
7592
7593             sv = NEWSV(92,0);
7594             if (overflowed) {
7595                 if (ckWARN(WARN_PORTABLE) && n > 4294967295.0)
7596                     Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
7597                                 "%s number > %s non-portable",
7598                                 Base, max);
7599                 sv_setnv(sv, n);
7600             }
7601             else {
7602 #if UVSIZE > 4
7603                 if (ckWARN(WARN_PORTABLE) && u > 0xffffffff)
7604                     Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
7605                                 "%s number > %s non-portable",
7606                                 Base, max);
7607 #endif
7608                 sv_setuv(sv, u);
7609             }
7610             if (just_zero && (PL_hints & HINT_NEW_INTEGER))
7611                 sv = new_constant(start, s - start, "integer", 
7612                                   sv, Nullsv, NULL);
7613             else if (PL_hints & HINT_NEW_BINARY)
7614                 sv = new_constant(start, s - start, "binary", sv, Nullsv, NULL);
7615         }
7616         break;
7617
7618     /*
7619       handle decimal numbers.
7620       we're also sent here when we read a 0 as the first digit
7621     */
7622     case '1': case '2': case '3': case '4': case '5':
7623     case '6': case '7': case '8': case '9': case '.':
7624       decimal:
7625         d = PL_tokenbuf;
7626         e = PL_tokenbuf + sizeof PL_tokenbuf - 6; /* room for various punctuation */
7627         floatit = FALSE;
7628
7629         /* read next group of digits and _ and copy into d */
7630         while (isDIGIT(*s) || *s == '_') {
7631             /* skip underscores, checking for misplaced ones
7632                if -w is on
7633             */
7634             if (*s == '_') {
7635                 if (ckWARN(WARN_SYNTAX) && lastub && s == lastub + 1)
7636                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7637                                 "Misplaced _ in number");
7638                 lastub = s++;
7639             }
7640             else {
7641                 /* check for end of fixed-length buffer */
7642                 if (d >= e)
7643                     Perl_croak(aTHX_ number_too_long);
7644                 /* if we're ok, copy the character */
7645                 *d++ = *s++;
7646             }
7647         }
7648
7649         /* final misplaced underbar check */
7650         if (lastub && s == lastub + 1) {
7651             if (ckWARN(WARN_SYNTAX))
7652                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
7653         }
7654
7655         /* read a decimal portion if there is one.  avoid
7656            3..5 being interpreted as the number 3. followed
7657            by .5
7658         */
7659         if (*s == '.' && s[1] != '.') {
7660             floatit = TRUE;
7661             *d++ = *s++;
7662
7663             if (*s == '_') {
7664                 if (ckWARN(WARN_SYNTAX))
7665                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7666                                 "Misplaced _ in number");
7667                 lastub = s;
7668             }
7669
7670             /* copy, ignoring underbars, until we run out of digits.
7671             */
7672             for (; isDIGIT(*s) || *s == '_'; s++) {
7673                 /* fixed length buffer check */
7674                 if (d >= e)
7675                     Perl_croak(aTHX_ number_too_long);
7676                 if (*s == '_') {
7677                    if (ckWARN(WARN_SYNTAX) && lastub && s == lastub + 1)
7678                        Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7679                                    "Misplaced _ in number");
7680                    lastub = s;
7681                 }
7682                 else
7683                     *d++ = *s;
7684             }
7685             /* fractional part ending in underbar? */
7686             if (s[-1] == '_') {
7687                 if (ckWARN(WARN_SYNTAX))
7688                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7689                                 "Misplaced _ in number");
7690             }
7691             if (*s == '.' && isDIGIT(s[1])) {
7692                 /* oops, it's really a v-string, but without the "v" */
7693                 s = start;
7694                 goto vstring;
7695             }
7696         }
7697
7698         /* read exponent part, if present */
7699         if ((*s == 'e' || *s == 'E') && strchr("+-0123456789_", s[1])) {
7700             floatit = TRUE;
7701             s++;
7702
7703             /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
7704             *d++ = 'e';         /* At least some Mach atof()s don't grok 'E' */
7705
7706             /* stray preinitial _ */
7707             if (*s == '_') {
7708                 if (ckWARN(WARN_SYNTAX))
7709                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7710                                 "Misplaced _ in number");
7711                 lastub = s++;
7712             }
7713
7714             /* allow positive or negative exponent */
7715             if (*s == '+' || *s == '-')
7716                 *d++ = *s++;
7717
7718             /* stray initial _ */
7719             if (*s == '_') {
7720                 if (ckWARN(WARN_SYNTAX))
7721                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7722                                 "Misplaced _ in number");
7723                 lastub = s++;
7724             }
7725
7726             /* read digits of exponent */
7727             while (isDIGIT(*s) || *s == '_') {
7728                 if (isDIGIT(*s)) {
7729                     if (d >= e)
7730                         Perl_croak(aTHX_ number_too_long);
7731                     *d++ = *s++;
7732                 }
7733                 else {
7734                    if (ckWARN(WARN_SYNTAX) &&
7735                        ((lastub && s == lastub + 1) ||
7736                         (!isDIGIT(s[1]) && s[1] != '_')))
7737                        Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7738                                    "Misplaced _ in number");
7739                    lastub = s++;
7740                 }
7741             }
7742         }
7743
7744
7745         /* make an sv from the string */
7746         sv = NEWSV(92,0);
7747
7748         /*
7749            We try to do an integer conversion first if no characters
7750            indicating "float" have been found.
7751          */
7752
7753         if (!floatit) {
7754             UV uv;
7755             int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
7756
7757             if (flags == IS_NUMBER_IN_UV) {
7758               if (uv <= IV_MAX)
7759                 sv_setiv(sv, uv); /* Prefer IVs over UVs. */
7760               else
7761                 sv_setuv(sv, uv);
7762             } else if (flags == (IS_NUMBER_IN_UV | IS_NUMBER_NEG)) {
7763               if (uv <= (UV) IV_MIN)
7764                 sv_setiv(sv, -(IV)uv);
7765               else
7766                 floatit = TRUE;
7767             } else
7768               floatit = TRUE;
7769         }
7770         if (floatit) {
7771             /* terminate the string */
7772             *d = '\0';
7773             nv = Atof(PL_tokenbuf);
7774             sv_setnv(sv, nv);
7775         }
7776
7777         if ( floatit ? (PL_hints & HINT_NEW_FLOAT) :
7778                        (PL_hints & HINT_NEW_INTEGER) )
7779             sv = new_constant(PL_tokenbuf, d - PL_tokenbuf,
7780                               (floatit ? "float" : "integer"),
7781                               sv, Nullsv, NULL);
7782         break;
7783
7784     /* if it starts with a v, it could be a v-string */
7785     case 'v':
7786 vstring:
7787                 sv = NEWSV(92,5); /* preallocate storage space */
7788                 s = scan_vstring(s,sv);
7789         break;
7790     }
7791
7792     /* make the op for the constant and return */
7793
7794     if (sv)
7795         lvalp->opval = newSVOP(OP_CONST, 0, sv);
7796     else
7797         lvalp->opval = Nullop;
7798
7799     return s;
7800 }
7801
7802 STATIC char *
7803 S_scan_formline(pTHX_ register char *s)
7804 {
7805     register char *eol;
7806     register char *t;
7807     SV *stuff = newSVpvn("",0);
7808     bool needargs = FALSE;
7809     bool eofmt = FALSE;
7810
7811     while (!needargs) {
7812         if (*s == '.') {
7813             /*SUPPRESS 530*/
7814 #ifdef PERL_STRICT_CR
7815             for (t = s+1;SPACE_OR_TAB(*t); t++) ;
7816 #else
7817             for (t = s+1;SPACE_OR_TAB(*t) || *t == '\r'; t++) ;
7818 #endif
7819             if (*t == '\n' || t == PL_bufend) {
7820                 eofmt = TRUE;
7821                 break;
7822             }
7823         }
7824         if (PL_in_eval && !PL_rsfp) {
7825             eol = memchr(s,'\n',PL_bufend-s);
7826             if (!eol++)
7827                 eol = PL_bufend;
7828         }
7829         else
7830             eol = PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
7831         if (*s != '#') {
7832             for (t = s; t < eol; t++) {
7833                 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
7834                     needargs = FALSE;
7835                     goto enough;        /* ~~ must be first line in formline */
7836                 }
7837                 if (*t == '@' || *t == '^')
7838                     needargs = TRUE;
7839             }
7840             if (eol > s) {
7841                 sv_catpvn(stuff, s, eol-s);
7842 #ifndef PERL_STRICT_CR
7843                 if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
7844                     char *end = SvPVX(stuff) + SvCUR(stuff);
7845                     end[-2] = '\n';
7846                     end[-1] = '\0';
7847                     SvCUR(stuff)--;
7848                 }
7849 #endif
7850             }
7851             else
7852               break;
7853         }
7854         s = eol;
7855         if (PL_rsfp) {
7856             s = filter_gets(PL_linestr, PL_rsfp, 0);
7857             PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
7858             PL_bufend = PL_bufptr + SvCUR(PL_linestr);
7859             PL_last_lop = PL_last_uni = Nullch;
7860             if (!s) {
7861                 s = PL_bufptr;
7862                 break;
7863             }
7864         }
7865         incline(s);
7866     }
7867   enough:
7868     if (SvCUR(stuff)) {
7869         PL_expect = XTERM;
7870         if (needargs) {
7871             PL_lex_state = LEX_NORMAL;
7872             PL_nextval[PL_nexttoke].ival = 0;
7873             force_next(',');
7874         }
7875         else
7876             PL_lex_state = LEX_FORMLINE;
7877         if (!IN_BYTES) {
7878             if (UTF && is_utf8_string((U8*)SvPVX(stuff), SvCUR(stuff)))
7879                 SvUTF8_on(stuff);
7880             else if (PL_encoding)
7881                 sv_recode_to_utf8(stuff, PL_encoding);
7882         }
7883         PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, stuff);
7884         force_next(THING);
7885         PL_nextval[PL_nexttoke].ival = OP_FORMLINE;
7886         force_next(LSTOP);
7887     }
7888     else {
7889         SvREFCNT_dec(stuff);
7890         if (eofmt)
7891             PL_lex_formbrack = 0;
7892         PL_bufptr = s;
7893     }
7894     return s;
7895 }
7896
7897 STATIC void
7898 S_set_csh(pTHX)
7899 {
7900 #ifdef CSH
7901     if (!PL_cshlen)
7902         PL_cshlen = strlen(PL_cshname);
7903 #endif
7904 }
7905
7906 I32
7907 Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
7908 {
7909     I32 oldsavestack_ix = PL_savestack_ix;
7910     CV* outsidecv = PL_compcv;
7911
7912     if (PL_compcv) {
7913         assert(SvTYPE(PL_compcv) == SVt_PVCV);
7914     }
7915     SAVEI32(PL_subline);
7916     save_item(PL_subname);
7917     SAVESPTR(PL_compcv);
7918
7919     PL_compcv = (CV*)NEWSV(1104,0);
7920     sv_upgrade((SV *)PL_compcv, is_format ? SVt_PVFM : SVt_PVCV);
7921     CvFLAGS(PL_compcv) |= flags;
7922
7923     PL_subline = CopLINE(PL_curcop);
7924     CvPADLIST(PL_compcv) = pad_new(padnew_SAVE|padnew_SAVESUB);
7925     CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc(outsidecv);
7926     CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
7927
7928     return oldsavestack_ix;
7929 }
7930
7931 #ifdef __SC__
7932 #pragma segment Perl_yylex
7933 #endif
7934 int
7935 Perl_yywarn(pTHX_ char *s)
7936 {
7937     PL_in_eval |= EVAL_WARNONLY;
7938     yyerror(s);
7939     PL_in_eval &= ~EVAL_WARNONLY;
7940     return 0;
7941 }
7942
7943 int
7944 Perl_yyerror(pTHX_ char *s)
7945 {
7946     char *where = NULL;
7947     char *context = NULL;
7948     int contlen = -1;
7949     SV *msg;
7950
7951     if (!yychar || (yychar == ';' && !PL_rsfp))
7952         where = "at EOF";
7953     else if (PL_bufptr > PL_oldoldbufptr && PL_bufptr - PL_oldoldbufptr < 200 &&
7954       PL_oldoldbufptr != PL_oldbufptr && PL_oldbufptr != PL_bufptr) {
7955         /*
7956                 Only for NetWare:
7957                 The code below is removed for NetWare because it abends/crashes on NetWare
7958                 when the script has error such as not having the closing quotes like:
7959                     if ($var eq "value)
7960                 Checking of white spaces is anyway done in NetWare code.
7961         */
7962 #ifndef NETWARE
7963         while (isSPACE(*PL_oldoldbufptr))
7964             PL_oldoldbufptr++;
7965 #endif
7966         context = PL_oldoldbufptr;
7967         contlen = PL_bufptr - PL_oldoldbufptr;
7968     }
7969     else if (PL_bufptr > PL_oldbufptr && PL_bufptr - PL_oldbufptr < 200 &&
7970       PL_oldbufptr != PL_bufptr) {
7971         /*
7972                 Only for NetWare:
7973                 The code below is removed for NetWare because it abends/crashes on NetWare
7974                 when the script has error such as not having the closing quotes like:
7975                     if ($var eq "value)
7976                 Checking of white spaces is anyway done in NetWare code.
7977         */
7978 #ifndef NETWARE
7979         while (isSPACE(*PL_oldbufptr))
7980             PL_oldbufptr++;
7981 #endif
7982         context = PL_oldbufptr;
7983         contlen = PL_bufptr - PL_oldbufptr;
7984     }
7985     else if (yychar > 255)
7986         where = "next token ???";
7987     else if (yychar == -2) { /* YYEMPTY */
7988         if (PL_lex_state == LEX_NORMAL ||
7989            (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
7990             where = "at end of line";
7991         else if (PL_lex_inpat)
7992             where = "within pattern";
7993         else
7994             where = "within string";
7995     }
7996     else {
7997         SV *where_sv = sv_2mortal(newSVpvn("next char ", 10));
7998         if (yychar < 32)
7999             Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
8000         else if (isPRINT_LC(yychar))
8001             Perl_sv_catpvf(aTHX_ where_sv, "%c", yychar);
8002         else
8003             Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
8004         where = SvPVX(where_sv);
8005     }
8006     msg = sv_2mortal(newSVpv(s, 0));
8007     Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
8008         OutCopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
8009     if (context)
8010         Perl_sv_catpvf(aTHX_ msg, "near \"%.*s\"\n", contlen, context);
8011     else
8012         Perl_sv_catpvf(aTHX_ msg, "%s\n", where);
8013     if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
8014         Perl_sv_catpvf(aTHX_ msg,
8015         "  (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
8016                 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
8017         PL_multi_end = 0;
8018     }
8019     if (PL_in_eval & EVAL_WARNONLY && ckWARN_d(WARN_SYNTAX))
8020         Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "%"SVf, msg);
8021     else
8022         qerror(msg);
8023     if (PL_error_count >= 10) {
8024         if (PL_in_eval && SvCUR(ERRSV))
8025             Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
8026             ERRSV, OutCopFILE(PL_curcop));
8027         else
8028             Perl_croak(aTHX_ "%s has too many errors.\n",
8029             OutCopFILE(PL_curcop));
8030     }
8031     PL_in_my = 0;
8032     PL_in_my_stash = Nullhv;
8033     return 0;
8034 }
8035 #ifdef __SC__
8036 #pragma segment Main
8037 #endif
8038
8039 STATIC char*
8040 S_swallow_bom(pTHX_ U8 *s)
8041 {
8042     STRLEN slen;
8043     slen = SvCUR(PL_linestr);
8044     switch (s[0]) {
8045     case 0xFF:
8046         if (s[1] == 0xFE) {
8047             /* UTF-16 little-endian? (or UTF32-LE?) */
8048             if (s[2] == 0 && s[3] == 0)  /* UTF-32 little-endian */
8049                 Perl_croak(aTHX_ "Unsupported script encoding UTF32-LE");
8050 #ifndef PERL_NO_UTF16_FILTER
8051             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF16-LE script encoding (BOM)\n");
8052             s += 2;
8053         utf16le:
8054             if (PL_bufend > (char*)s) {
8055                 U8 *news;
8056                 I32 newlen;
8057
8058                 filter_add(utf16rev_textfilter, NULL);
8059                 New(898, news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
8060                 utf16_to_utf8_reversed(s, news,
8061                                        PL_bufend - (char*)s - 1,
8062                                        &newlen);
8063                 sv_setpvn(PL_linestr, (const char*)news, newlen);
8064                 Safefree(news);
8065                 SvUTF8_on(PL_linestr);
8066                 s = (U8*)SvPVX(PL_linestr);
8067                 PL_bufend = SvPVX(PL_linestr) + newlen;
8068             }
8069 #else
8070             Perl_croak(aTHX_ "Unsupported script encoding UTF16-LE");
8071 #endif
8072         }
8073         break;
8074     case 0xFE:
8075         if (s[1] == 0xFF) {   /* UTF-16 big-endian? */
8076 #ifndef PERL_NO_UTF16_FILTER
8077             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (BOM)\n");
8078             s += 2;
8079         utf16be:
8080             if (PL_bufend > (char *)s) {
8081                 U8 *news;
8082                 I32 newlen;
8083
8084                 filter_add(utf16_textfilter, NULL);
8085                 New(898, news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
8086                 utf16_to_utf8(s, news,
8087                               PL_bufend - (char*)s,
8088                               &newlen);
8089                 sv_setpvn(PL_linestr, (const char*)news, newlen);
8090                 Safefree(news);
8091                 SvUTF8_on(PL_linestr);
8092                 s = (U8*)SvPVX(PL_linestr);
8093                 PL_bufend = SvPVX(PL_linestr) + newlen;
8094             }
8095 #else
8096             Perl_croak(aTHX_ "Unsupported script encoding UTF16-BE");
8097 #endif
8098         }
8099         break;
8100     case 0xEF:
8101         if (slen > 2 && s[1] == 0xBB && s[2] == 0xBF) {
8102             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
8103             s += 3;                      /* UTF-8 */
8104         }
8105         break;
8106     case 0:
8107         if (slen > 3) {
8108              if (s[1] == 0) {
8109                   if (s[2] == 0xFE && s[3] == 0xFF) {
8110                        /* UTF-32 big-endian */
8111                        Perl_croak(aTHX_ "Unsupported script encoding UTF32-BE");
8112                   }
8113              }
8114              else if (s[2] == 0 && s[3] != 0) {
8115                   /* Leading bytes
8116                    * 00 xx 00 xx
8117                    * are a good indicator of UTF-16BE. */
8118                   if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (no BOM)\n");
8119                   goto utf16be;
8120              }
8121         }
8122     default:
8123          if (slen > 3 && s[1] == 0 && s[2] != 0 && s[3] == 0) {
8124                   /* Leading bytes
8125                    * xx 00 xx 00
8126                    * are a good indicator of UTF-16LE. */
8127               if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (no BOM)\n");
8128               goto utf16le;
8129          }
8130     }
8131     return (char*)s;
8132 }
8133
8134 /*
8135  * restore_rsfp
8136  * Restore a source filter.
8137  */
8138
8139 static void
8140 restore_rsfp(pTHX_ void *f)
8141 {
8142     PerlIO *fp = (PerlIO*)f;
8143
8144     if (PL_rsfp == PerlIO_stdin())
8145         PerlIO_clearerr(PL_rsfp);
8146     else if (PL_rsfp && (PL_rsfp != fp))
8147         PerlIO_close(PL_rsfp);
8148     PL_rsfp = fp;
8149 }
8150
8151 #ifndef PERL_NO_UTF16_FILTER
8152 static I32
8153 utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
8154 {
8155     STRLEN old = SvCUR(sv);
8156     I32 count = FILTER_READ(idx+1, sv, maxlen);
8157     DEBUG_P(PerlIO_printf(Perl_debug_log,
8158                           "utf16_textfilter(%p): %d %d (%d)\n",
8159                           utf16_textfilter, idx, maxlen, (int) count));
8160     if (count) {
8161         U8* tmps;
8162         I32 newlen;
8163         New(898, tmps, SvCUR(sv) * 3 / 2 + 1, U8);
8164         Copy(SvPVX(sv), tmps, old, char);
8165         utf16_to_utf8((U8*)SvPVX(sv) + old, tmps + old,
8166                       SvCUR(sv) - old, &newlen);
8167         sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
8168     }
8169     DEBUG_P({sv_dump(sv);});
8170     return SvCUR(sv);
8171 }
8172
8173 static I32
8174 utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen)
8175 {
8176     STRLEN old = SvCUR(sv);
8177     I32 count = FILTER_READ(idx+1, sv, maxlen);
8178     DEBUG_P(PerlIO_printf(Perl_debug_log,
8179                           "utf16rev_textfilter(%p): %d %d (%d)\n",
8180                           utf16rev_textfilter, idx, maxlen, (int) count));
8181     if (count) {
8182         U8* tmps;
8183         I32 newlen;
8184         New(898, tmps, SvCUR(sv) * 3 / 2 + 1, U8);
8185         Copy(SvPVX(sv), tmps, old, char);
8186         utf16_to_utf8((U8*)SvPVX(sv) + old, tmps + old,
8187                       SvCUR(sv) - old, &newlen);
8188         sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
8189     }
8190     DEBUG_P({ sv_dump(sv); });
8191     return count;
8192 }
8193 #endif
8194
8195 /*
8196 Returns a pointer to the next character after the parsed
8197 vstring, as well as updating the passed in sv.
8198
8199 Function must be called like
8200
8201         sv = NEWSV(92,5);
8202         s = scan_vstring(s,sv);
8203
8204 The sv should already be large enough to store the vstring
8205 passed in, for performance reasons.
8206
8207 */
8208
8209 char *
8210 Perl_scan_vstring(pTHX_ char *s, SV *sv)
8211 {
8212     char *pos = s;
8213     char *start = s;
8214     if (*pos == 'v') pos++;  /* get past 'v' */
8215     while (pos < PL_bufend && (isDIGIT(*pos) || *pos == '_'))
8216         pos++;
8217     if ( *pos != '.') {
8218         /* this may not be a v-string if followed by => */
8219         char *next = pos;
8220         while (next < PL_bufend && isSPACE(*next))
8221             ++next;
8222         if ((PL_bufend - next) >= 2 && *next == '=' && next[1] == '>' ) {
8223             /* return string not v-string */
8224             sv_setpvn(sv,(char *)s,pos-s);
8225             return pos;
8226         }
8227     }
8228
8229     if (!isALPHA(*pos)) {
8230         UV rev;
8231         U8 tmpbuf[UTF8_MAXLEN+1];
8232         U8 *tmpend;
8233
8234         if (*s == 'v') s++;  /* get past 'v' */
8235
8236         sv_setpvn(sv, "", 0);
8237
8238         for (;;) {
8239             rev = 0;
8240             {
8241                 /* this is atoi() that tolerates underscores */
8242                 char *end = pos;
8243                 UV mult = 1;
8244                 while (--end >= s) {
8245                     UV orev;
8246                     if (*end == '_')
8247                         continue;
8248                     orev = rev;
8249                     rev += (*end - '0') * mult;
8250                     mult *= 10;
8251                     if (orev > rev && ckWARN_d(WARN_OVERFLOW))
8252                         Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
8253                                     "Integer overflow in decimal number");
8254                 }
8255             }
8256 #ifdef EBCDIC
8257             if (rev > 0x7FFFFFFF)
8258                  Perl_croak(aTHX_ "In EBCDIC the v-string components cannot exceed 2147483647");
8259 #endif
8260             /* Append native character for the rev point */
8261             tmpend = uvchr_to_utf8(tmpbuf, rev);
8262             sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
8263             if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(rev)))
8264                  SvUTF8_on(sv);
8265             if (pos + 1 < PL_bufend && *pos == '.' && isDIGIT(pos[1]))
8266                  s = ++pos;
8267             else {
8268                  s = pos;
8269                  break;
8270             }
8271             while (pos < PL_bufend && (isDIGIT(*pos) || *pos == '_'))
8272                  pos++;
8273         }
8274         SvPOK_on(sv);
8275         sv_magic(sv,NULL,PERL_MAGIC_vstring,(const char*)start, pos-start);
8276         SvRMAGICAL_on(sv);
8277     }
8278     return s;
8279 }
8280