Turn barewords into strings to run under strict subs.
[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 /*
876  * S_force_word
877  * When the lexer knows the next thing is a word (for instance, it has
878  * just seen -> and it knows that the next char is a word char, then
879  * it calls S_force_word to stick the next word into the PL_next lookahead.
880  *
881  * Arguments:
882  *   char *start : buffer position (must be within PL_linestr)
883  *   int token   : PL_next will be this type of bare word (e.g., METHOD,WORD)
884  *   int check_keyword : if true, Perl checks to make sure the word isn't
885  *       a keyword (do this if the word is a label, e.g. goto FOO)
886  *   int allow_pack : if true, : characters will also be allowed (require,
887  *       use, etc. do this)
888  *   int allow_initial_tick : used by the "sub" lexer only.
889  */
890
891 STATIC char *
892 S_force_word(pTHX_ register char *start, int token, int check_keyword, int allow_pack, int allow_initial_tick)
893 {
894     register char *s;
895     STRLEN len;
896
897     start = skipspace(start);
898     s = start;
899     if (isIDFIRST_lazy_if(s,UTF) ||
900         (allow_pack && *s == ':') ||
901         (allow_initial_tick && *s == '\'') )
902     {
903         s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, allow_pack, &len);
904         if (check_keyword && keyword(PL_tokenbuf, len))
905             return start;
906         if (token == METHOD) {
907             s = skipspace(s);
908             if (*s == '(')
909                 PL_expect = XTERM;
910             else {
911                 PL_expect = XOPERATOR;
912             }
913         }
914         PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST,0, newSVpv(PL_tokenbuf,0));
915         PL_nextval[PL_nexttoke].opval->op_private |= OPpCONST_BARE;
916         if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
917             SvUTF8_on(((SVOP*)PL_nextval[PL_nexttoke].opval)->op_sv);
918         force_next(token);
919     }
920     return s;
921 }
922
923 /*
924  * S_force_ident
925  * Called when the lexer wants $foo *foo &foo etc, but the program
926  * text only contains the "foo" portion.  The first argument is a pointer
927  * to the "foo", and the second argument is the type symbol to prefix.
928  * Forces the next token to be a "WORD".
929  * Creates the symbol if it didn't already exist (via gv_fetchpv()).
930  */
931
932 STATIC void
933 S_force_ident(pTHX_ register char *s, int kind)
934 {
935     if (s && *s) {
936         OP* o = (OP*)newSVOP(OP_CONST, 0, newSVpv(s,0));
937         PL_nextval[PL_nexttoke].opval = o;
938         force_next(WORD);
939         if (kind) {
940             o->op_private = OPpCONST_ENTERED;
941             /* XXX see note in pp_entereval() for why we forgo typo
942                warnings if the symbol must be introduced in an eval.
943                GSAR 96-10-12 */
944             gv_fetchpv(s, PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : TRUE,
945                 kind == '$' ? SVt_PV :
946                 kind == '@' ? SVt_PVAV :
947                 kind == '%' ? SVt_PVHV :
948                               SVt_PVGV
949                 );
950         }
951     }
952 }
953
954 NV
955 Perl_str_to_version(pTHX_ SV *sv)
956 {
957     NV retval = 0.0;
958     NV nshift = 1.0;
959     STRLEN len;
960     char *start = SvPVx(sv,len);
961     bool utf = SvUTF8(sv) ? TRUE : FALSE;
962     char *end = start + len;
963     while (start < end) {
964         STRLEN skip;
965         UV n;
966         if (utf)
967             n = utf8n_to_uvchr((U8*)start, len, &skip, 0);
968         else {
969             n = *(U8*)start;
970             skip = 1;
971         }
972         retval += ((NV)n)/nshift;
973         start += skip;
974         nshift *= 1000;
975     }
976     return retval;
977 }
978
979 /*
980  * S_force_version
981  * Forces the next token to be a version number.
982  * If the next token appears to be an invalid version number, (e.g. "v2b"),
983  * and if "guessing" is TRUE, then no new token is created (and the caller
984  * must use an alternative parsing method).
985  */
986
987 STATIC char *
988 S_force_version(pTHX_ char *s, int guessing)
989 {
990     OP *version = Nullop;
991     char *d;
992
993     s = skipspace(s);
994
995     d = s;
996     if (*d == 'v')
997         d++;
998     if (isDIGIT(*d)) {
999         while (isDIGIT(*d) || *d == '_' || *d == '.')
1000             d++;
1001         if (*d == ';' || isSPACE(*d) || *d == '}' || !*d) {
1002             SV *ver;
1003             s = scan_num(s, &yylval);
1004             version = yylval.opval;
1005             ver = cSVOPx(version)->op_sv;
1006             if (SvPOK(ver) && !SvNIOK(ver)) {
1007                 (void)SvUPGRADE(ver, SVt_PVNV);
1008                 SvNVX(ver) = str_to_version(ver);
1009                 SvNOK_on(ver);          /* hint that it is a version */
1010             }
1011         }
1012         else if (guessing)
1013             return s;
1014     }
1015
1016     /* NOTE: The parser sees the package name and the VERSION swapped */
1017     PL_nextval[PL_nexttoke].opval = version;
1018     force_next(WORD);
1019
1020     return s;
1021 }
1022
1023 /*
1024  * S_tokeq
1025  * Tokenize a quoted string passed in as an SV.  It finds the next
1026  * chunk, up to end of string or a backslash.  It may make a new
1027  * SV containing that chunk (if HINT_NEW_STRING is on).  It also
1028  * turns \\ into \.
1029  */
1030
1031 STATIC SV *
1032 S_tokeq(pTHX_ SV *sv)
1033 {
1034     register char *s;
1035     register char *send;
1036     register char *d;
1037     STRLEN len = 0;
1038     SV *pv = sv;
1039
1040     if (!SvLEN(sv))
1041         goto finish;
1042
1043     s = SvPV_force(sv, len);
1044     if (SvTYPE(sv) >= SVt_PVIV && SvIVX(sv) == -1)
1045         goto finish;
1046     send = s + len;
1047     while (s < send && *s != '\\')
1048         s++;
1049     if (s == send)
1050         goto finish;
1051     d = s;
1052     if ( PL_hints & HINT_NEW_STRING ) {
1053         pv = sv_2mortal(newSVpvn(SvPVX(pv), len));
1054         if (SvUTF8(sv))
1055             SvUTF8_on(pv);
1056     }
1057     while (s < send) {
1058         if (*s == '\\') {
1059             if (s + 1 < send && (s[1] == '\\'))
1060                 s++;            /* all that, just for this */
1061         }
1062         *d++ = *s++;
1063     }
1064     *d = '\0';
1065     SvCUR_set(sv, d - SvPVX(sv));
1066   finish:
1067     if ( PL_hints & HINT_NEW_STRING )
1068        return new_constant(NULL, 0, "q", sv, pv, "q");
1069     return sv;
1070 }
1071
1072 /*
1073  * Now come three functions related to double-quote context,
1074  * S_sublex_start, S_sublex_push, and S_sublex_done.  They're used when
1075  * converting things like "\u\Lgnat" into ucfirst(lc("gnat")).  They
1076  * interact with PL_lex_state, and create fake ( ... ) argument lists
1077  * to handle functions and concatenation.
1078  * They assume that whoever calls them will be setting up a fake
1079  * join call, because each subthing puts a ',' after it.  This lets
1080  *   "lower \luPpEr"
1081  * become
1082  *  join($, , 'lower ', lcfirst( 'uPpEr', ) ,)
1083  *
1084  * (I'm not sure whether the spurious commas at the end of lcfirst's
1085  * arguments and join's arguments are created or not).
1086  */
1087
1088 /*
1089  * S_sublex_start
1090  * Assumes that yylval.ival is the op we're creating (e.g. OP_LCFIRST).
1091  *
1092  * Pattern matching will set PL_lex_op to the pattern-matching op to
1093  * make (we return THING if yylval.ival is OP_NULL, PMFUNC otherwise).
1094  *
1095  * OP_CONST and OP_READLINE are easy--just make the new op and return.
1096  *
1097  * Everything else becomes a FUNC.
1098  *
1099  * Sets PL_lex_state to LEX_INTERPPUSH unless (ival was OP_NULL or we
1100  * had an OP_CONST or OP_READLINE).  This just sets us up for a
1101  * call to S_sublex_push().
1102  */
1103
1104 STATIC I32
1105 S_sublex_start(pTHX)
1106 {
1107     register I32 op_type = yylval.ival;
1108
1109     if (op_type == OP_NULL) {
1110         yylval.opval = PL_lex_op;
1111         PL_lex_op = Nullop;
1112         return THING;
1113     }
1114     if (op_type == OP_CONST || op_type == OP_READLINE) {
1115         SV *sv = tokeq(PL_lex_stuff);
1116
1117         if (SvTYPE(sv) == SVt_PVIV) {
1118             /* Overloaded constants, nothing fancy: Convert to SVt_PV: */
1119             STRLEN len;
1120             char *p;
1121             SV *nsv;
1122
1123             p = SvPV(sv, len);
1124             nsv = newSVpvn(p, len);
1125             if (SvUTF8(sv))
1126                 SvUTF8_on(nsv);
1127             SvREFCNT_dec(sv);
1128             sv = nsv;
1129         }
1130         yylval.opval = (OP*)newSVOP(op_type, 0, sv);
1131         PL_lex_stuff = Nullsv;
1132         /* Allow <FH> // "foo" */
1133         if (op_type == OP_READLINE)
1134             PL_expect = XTERMORDORDOR;
1135         return THING;
1136     }
1137
1138     PL_sublex_info.super_state = PL_lex_state;
1139     PL_sublex_info.sub_inwhat = op_type;
1140     PL_sublex_info.sub_op = PL_lex_op;
1141     PL_lex_state = LEX_INTERPPUSH;
1142
1143     PL_expect = XTERM;
1144     if (PL_lex_op) {
1145         yylval.opval = PL_lex_op;
1146         PL_lex_op = Nullop;
1147         return PMFUNC;
1148     }
1149     else
1150         return FUNC;
1151 }
1152
1153 /*
1154  * S_sublex_push
1155  * Create a new scope to save the lexing state.  The scope will be
1156  * ended in S_sublex_done.  Returns a '(', starting the function arguments
1157  * to the uc, lc, etc. found before.
1158  * Sets PL_lex_state to LEX_INTERPCONCAT.
1159  */
1160
1161 STATIC I32
1162 S_sublex_push(pTHX)
1163 {
1164     ENTER;
1165
1166     PL_lex_state = PL_sublex_info.super_state;
1167     SAVEI32(PL_lex_dojoin);
1168     SAVEI32(PL_lex_brackets);
1169     SAVEI32(PL_lex_casemods);
1170     SAVEI32(PL_lex_starts);
1171     SAVEI32(PL_lex_state);
1172     SAVEVPTR(PL_lex_inpat);
1173     SAVEI32(PL_lex_inwhat);
1174     SAVECOPLINE(PL_curcop);
1175     SAVEPPTR(PL_bufptr);
1176     SAVEPPTR(PL_bufend);
1177     SAVEPPTR(PL_oldbufptr);
1178     SAVEPPTR(PL_oldoldbufptr);
1179     SAVEPPTR(PL_last_lop);
1180     SAVEPPTR(PL_last_uni);
1181     SAVEPPTR(PL_linestart);
1182     SAVESPTR(PL_linestr);
1183     SAVEGENERICPV(PL_lex_brackstack);
1184     SAVEGENERICPV(PL_lex_casestack);
1185
1186     PL_linestr = PL_lex_stuff;
1187     PL_lex_stuff = Nullsv;
1188
1189     PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart
1190         = SvPVX(PL_linestr);
1191     PL_bufend += SvCUR(PL_linestr);
1192     PL_last_lop = PL_last_uni = Nullch;
1193     SAVEFREESV(PL_linestr);
1194
1195     PL_lex_dojoin = FALSE;
1196     PL_lex_brackets = 0;
1197     New(899, PL_lex_brackstack, 120, char);
1198     New(899, PL_lex_casestack, 12, char);
1199     PL_lex_casemods = 0;
1200     *PL_lex_casestack = '\0';
1201     PL_lex_starts = 0;
1202     PL_lex_state = LEX_INTERPCONCAT;
1203     CopLINE_set(PL_curcop, (line_t)PL_multi_start);
1204
1205     PL_lex_inwhat = PL_sublex_info.sub_inwhat;
1206     if (PL_lex_inwhat == OP_MATCH || PL_lex_inwhat == OP_QR || PL_lex_inwhat == OP_SUBST)
1207         PL_lex_inpat = PL_sublex_info.sub_op;
1208     else
1209         PL_lex_inpat = Nullop;
1210
1211     return '(';
1212 }
1213
1214 /*
1215  * S_sublex_done
1216  * Restores lexer state after a S_sublex_push.
1217  */
1218
1219 STATIC I32
1220 S_sublex_done(pTHX)
1221 {
1222     if (!PL_lex_starts++) {
1223         SV *sv = newSVpvn("",0);
1224         if (SvUTF8(PL_linestr))
1225             SvUTF8_on(sv);
1226         PL_expect = XOPERATOR;
1227         yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
1228         return THING;
1229     }
1230
1231     if (PL_lex_casemods) {              /* oops, we've got some unbalanced parens */
1232         PL_lex_state = LEX_INTERPCASEMOD;
1233         return yylex();
1234     }
1235
1236     /* Is there a right-hand side to take care of? (s//RHS/ or tr//RHS/) */
1237     if (PL_lex_repl && (PL_lex_inwhat == OP_SUBST || PL_lex_inwhat == OP_TRANS)) {
1238         PL_linestr = PL_lex_repl;
1239         PL_lex_inpat = 0;
1240         PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
1241         PL_bufend += SvCUR(PL_linestr);
1242         PL_last_lop = PL_last_uni = Nullch;
1243         SAVEFREESV(PL_linestr);
1244         PL_lex_dojoin = FALSE;
1245         PL_lex_brackets = 0;
1246         PL_lex_casemods = 0;
1247         *PL_lex_casestack = '\0';
1248         PL_lex_starts = 0;
1249         if (SvEVALED(PL_lex_repl)) {
1250             PL_lex_state = LEX_INTERPNORMAL;
1251             PL_lex_starts++;
1252             /*  we don't clear PL_lex_repl here, so that we can check later
1253                 whether this is an evalled subst; that means we rely on the
1254                 logic to ensure sublex_done() is called again only via the
1255                 branch (in yylex()) that clears PL_lex_repl, else we'll loop */
1256         }
1257         else {
1258             PL_lex_state = LEX_INTERPCONCAT;
1259             PL_lex_repl = Nullsv;
1260         }
1261         return ',';
1262     }
1263     else {
1264         LEAVE;
1265         PL_bufend = SvPVX(PL_linestr);
1266         PL_bufend += SvCUR(PL_linestr);
1267         PL_expect = XOPERATOR;
1268         PL_sublex_info.sub_inwhat = 0;
1269         return ')';
1270     }
1271 }
1272
1273 /*
1274   scan_const
1275
1276   Extracts a pattern, double-quoted string, or transliteration.  This
1277   is terrifying code.
1278
1279   It looks at lex_inwhat and PL_lex_inpat to find out whether it's
1280   processing a pattern (PL_lex_inpat is true), a transliteration
1281   (lex_inwhat & OP_TRANS is true), or a double-quoted string.
1282
1283   Returns a pointer to the character scanned up to. Iff this is
1284   advanced from the start pointer supplied (ie if anything was
1285   successfully parsed), will leave an OP for the substring scanned
1286   in yylval. Caller must intuit reason for not parsing further
1287   by looking at the next characters herself.
1288
1289   In patterns:
1290     backslashes:
1291       double-quoted style: \r and \n
1292       regexp special ones: \D \s
1293       constants: \x3
1294       backrefs: \1 (deprecated in substitution replacements)
1295       case and quoting: \U \Q \E
1296     stops on @ and $, but not for $ as tail anchor
1297
1298   In transliterations:
1299     characters are VERY literal, except for - not at the start or end
1300     of the string, which indicates a range.  scan_const expands the
1301     range to the full set of intermediate characters.
1302
1303   In double-quoted strings:
1304     backslashes:
1305       double-quoted style: \r and \n
1306       constants: \x3
1307       backrefs: \1 (deprecated)
1308       case and quoting: \U \Q \E
1309     stops on @ and $
1310
1311   scan_const does *not* construct ops to handle interpolated strings.
1312   It stops processing as soon as it finds an embedded $ or @ variable
1313   and leaves it to the caller to work out what's going on.
1314
1315   @ in pattern could be: @foo, @{foo}, @$foo, @'foo, @::foo.
1316
1317   $ in pattern could be $foo or could be tail anchor.  Assumption:
1318   it's a tail anchor if $ is the last thing in the string, or if it's
1319   followed by one of ")| \n\t"
1320
1321   \1 (backreferences) are turned into $1
1322
1323   The structure of the code is
1324       while (there's a character to process) {
1325           handle transliteration ranges
1326           skip regexp comments
1327           skip # initiated comments in //x patterns
1328           check for embedded @foo
1329           check for embedded scalars
1330           if (backslash) {
1331               leave intact backslashes from leave (below)
1332               deprecate \1 in strings and sub replacements
1333               handle string-changing backslashes \l \U \Q \E, etc.
1334               switch (what was escaped) {
1335                   handle - in a transliteration (becomes a literal -)
1336                   handle \132 octal characters
1337                   handle 0x15 hex characters
1338                   handle \cV (control V)
1339                   handle printf backslashes (\f, \r, \n, etc)
1340               } (end switch)
1341           } (end if backslash)
1342     } (end while character to read)
1343                 
1344 */
1345
1346 STATIC char *
1347 S_scan_const(pTHX_ char *start)
1348 {
1349     register char *send = PL_bufend;            /* end of the constant */
1350     SV *sv = NEWSV(93, send - start);           /* sv for the constant */
1351     register char *s = start;                   /* start of the constant */
1352     register char *d = SvPVX(sv);               /* destination for copies */
1353     bool dorange = FALSE;                       /* are we in a translit range? */
1354     bool didrange = FALSE;                      /* did we just finish a range? */
1355     I32  has_utf8 = FALSE;                      /* Output constant is UTF8 */
1356     I32  this_utf8 = UTF;                       /* The source string is assumed to be UTF8 */
1357     UV uv;
1358
1359     const char *leaveit =       /* set of acceptably-backslashed characters */
1360         PL_lex_inpat
1361             ? "\\.^$@AGZdDwWsSbBpPXC+*?|()-nrtfeaxz0123456789[{]} \t\n\r\f\v#"
1362             : "";
1363
1364     if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
1365         /* If we are doing a trans and we know we want UTF8 set expectation */
1366         has_utf8   = PL_sublex_info.sub_op->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF);
1367         this_utf8  = PL_sublex_info.sub_op->op_private & (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
1368     }
1369
1370
1371     while (s < send || dorange) {
1372         /* get transliterations out of the way (they're most literal) */
1373         if (PL_lex_inwhat == OP_TRANS) {
1374             /* expand a range A-Z to the full set of characters.  AIE! */
1375             if (dorange) {
1376                 I32 i;                          /* current expanded character */
1377                 I32 min;                        /* first character in range */
1378                 I32 max;                        /* last character in range */
1379
1380                 if (has_utf8) {
1381                     char *c = (char*)utf8_hop((U8*)d, -1);
1382                     char *e = d++;
1383                     while (e-- > c)
1384                         *(e + 1) = *e;
1385                     *c = (char)UTF_TO_NATIVE(0xff);
1386                     /* mark the range as done, and continue */
1387                     dorange = FALSE;
1388                     didrange = TRUE;
1389                     continue;
1390                 }
1391
1392                 i = d - SvPVX(sv);              /* remember current offset */
1393                 SvGROW(sv, SvLEN(sv) + 256);    /* never more than 256 chars in a range */
1394                 d = SvPVX(sv) + i;              /* refresh d after realloc */
1395                 d -= 2;                         /* eat the first char and the - */
1396
1397                 min = (U8)*d;                   /* first char in range */
1398                 max = (U8)d[1];                 /* last char in range  */
1399
1400                 if (min > max) {
1401                     Perl_croak(aTHX_
1402                                "Invalid range \"%c-%c\" in transliteration operator",
1403                                (char)min, (char)max);
1404                 }
1405
1406 #ifdef EBCDIC
1407                 if ((isLOWER(min) && isLOWER(max)) ||
1408                     (isUPPER(min) && isUPPER(max))) {
1409                     if (isLOWER(min)) {
1410                         for (i = min; i <= max; i++)
1411                             if (isLOWER(i))
1412                                 *d++ = NATIVE_TO_NEED(has_utf8,i);
1413                     } else {
1414                         for (i = min; i <= max; i++)
1415                             if (isUPPER(i))
1416                                 *d++ = NATIVE_TO_NEED(has_utf8,i);
1417                     }
1418                 }
1419                 else
1420 #endif
1421                     for (i = min; i <= max; i++)
1422                         *d++ = (char)i;
1423
1424                 /* mark the range as done, and continue */
1425                 dorange = FALSE;
1426                 didrange = TRUE;
1427                 continue;
1428             }
1429
1430             /* range begins (ignore - as first or last char) */
1431             else if (*s == '-' && s+1 < send  && s != start) {
1432                 if (didrange) {
1433                     Perl_croak(aTHX_ "Ambiguous range in transliteration operator");
1434                 }
1435                 if (has_utf8) {
1436                     *d++ = (char)UTF_TO_NATIVE(0xff);   /* use illegal utf8 byte--see pmtrans */
1437                     s++;
1438                     continue;
1439                 }
1440                 dorange = TRUE;
1441                 s++;
1442             }
1443             else {
1444                 didrange = FALSE;
1445             }
1446         }
1447
1448         /* if we get here, we're not doing a transliteration */
1449
1450         /* skip for regexp comments /(?#comment)/ and code /(?{code})/,
1451            except for the last char, which will be done separately. */
1452         else if (*s == '(' && PL_lex_inpat && s[1] == '?') {
1453             if (s[2] == '#') {
1454                 while (s+1 < send && *s != ')')
1455                     *d++ = NATIVE_TO_NEED(has_utf8,*s++);
1456             }
1457             else if (s[2] == '{' /* This should match regcomp.c */
1458                      || ((s[2] == 'p' || s[2] == '?') && s[3] == '{'))
1459             {
1460                 I32 count = 1;
1461                 char *regparse = s + (s[2] == '{' ? 3 : 4);
1462                 char c;
1463
1464                 while (count && (c = *regparse)) {
1465                     if (c == '\\' && regparse[1])
1466                         regparse++;
1467                     else if (c == '{')
1468                         count++;
1469                     else if (c == '}')
1470                         count--;
1471                     regparse++;
1472                 }
1473                 if (*regparse != ')')
1474                     regparse--;         /* Leave one char for continuation. */
1475                 while (s < regparse)
1476                     *d++ = NATIVE_TO_NEED(has_utf8,*s++);
1477             }
1478         }
1479
1480         /* likewise skip #-initiated comments in //x patterns */
1481         else if (*s == '#' && PL_lex_inpat &&
1482           ((PMOP*)PL_lex_inpat)->op_pmflags & PMf_EXTENDED) {
1483             while (s+1 < send && *s != '\n')
1484                 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
1485         }
1486
1487         /* check for embedded arrays
1488            (@foo, @::foo, @'foo, @{foo}, @$foo, @+, @-)
1489            */
1490         else if (*s == '@' && s[1]
1491                  && (isALNUM_lazy_if(s+1,UTF) || strchr(":'{$+-", s[1])))
1492             break;
1493
1494         /* check for embedded scalars.  only stop if we're sure it's a
1495            variable.
1496         */
1497         else if (*s == '$') {
1498             if (!PL_lex_inpat)  /* not a regexp, so $ must be var */
1499                 break;
1500             if (s + 1 < send && !strchr("()| \r\n\t", s[1]))
1501                 break;          /* in regexp, $ might be tail anchor */
1502         }
1503
1504         /* End of else if chain - OP_TRANS rejoin rest */
1505
1506         /* backslashes */
1507         if (*s == '\\' && s+1 < send) {
1508             s++;
1509
1510             /* some backslashes we leave behind */
1511             if (*leaveit && *s && strchr(leaveit, *s)) {
1512                 *d++ = NATIVE_TO_NEED(has_utf8,'\\');
1513                 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
1514                 continue;
1515             }
1516
1517             /* deprecate \1 in strings and substitution replacements */
1518             if (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat &&
1519                 isDIGIT(*s) && *s != '0' && !isDIGIT(s[1]))
1520             {
1521                 if (ckWARN(WARN_SYNTAX))
1522                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "\\%c better written as $%c", *s, *s);
1523                 *--s = '$';
1524                 break;
1525             }
1526
1527             /* string-change backslash escapes */
1528             if (PL_lex_inwhat != OP_TRANS && *s && strchr("lLuUEQ", *s)) {
1529                 --s;
1530                 break;
1531             }
1532
1533             /* if we get here, it's either a quoted -, or a digit */
1534             switch (*s) {
1535
1536             /* quoted - in transliterations */
1537             case '-':
1538                 if (PL_lex_inwhat == OP_TRANS) {
1539                     *d++ = *s++;
1540                     continue;
1541                 }
1542                 /* FALL THROUGH */
1543             default:
1544                 {
1545                     if (ckWARN(WARN_MISC) &&
1546                         isALNUM(*s) && 
1547                         *s != '_')
1548                         Perl_warner(aTHX_ packWARN(WARN_MISC),
1549                                "Unrecognized escape \\%c passed through",
1550                                *s);
1551                     /* default action is to copy the quoted character */
1552                     goto default_action;
1553                 }
1554
1555             /* \132 indicates an octal constant */
1556             case '0': case '1': case '2': case '3':
1557             case '4': case '5': case '6': case '7':
1558                 {
1559                     I32 flags = 0;
1560                     STRLEN len = 3;
1561                     uv = grok_oct(s, &len, &flags, NULL);
1562                     s += len;
1563                 }
1564                 goto NUM_ESCAPE_INSERT;
1565
1566             /* \x24 indicates a hex constant */
1567             case 'x':
1568                 ++s;
1569                 if (*s == '{') {
1570                     char* e = strchr(s, '}');
1571                     I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
1572                       PERL_SCAN_DISALLOW_PREFIX;
1573                     STRLEN len;
1574
1575                     ++s;
1576                     if (!e) {
1577                         yyerror("Missing right brace on \\x{}");
1578                         continue;
1579                     }
1580                     len = e - s;
1581                     uv = grok_hex(s, &len, &flags, NULL);
1582                     s = e + 1;
1583                 }
1584                 else {
1585                     {
1586                         STRLEN len = 2;
1587                         I32 flags = PERL_SCAN_DISALLOW_PREFIX;
1588                         uv = grok_hex(s, &len, &flags, NULL);
1589                         s += len;
1590                     }
1591                 }
1592
1593               NUM_ESCAPE_INSERT:
1594                 /* Insert oct or hex escaped character.
1595                  * There will always enough room in sv since such
1596                  * escapes will be longer than any UTF-8 sequence
1597                  * they can end up as. */
1598                 
1599                 /* We need to map to chars to ASCII before doing the tests
1600                    to cover EBCDIC
1601                 */
1602                 if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(uv))) {
1603                     if (!has_utf8 && uv > 255) {
1604                         /* Might need to recode whatever we have
1605                          * accumulated so far if it contains any
1606                          * hibit chars.
1607                          *
1608                          * (Can't we keep track of that and avoid
1609                          *  this rescan? --jhi)
1610                          */
1611                         int hicount = 0;
1612                         U8 *c;
1613                         for (c = (U8 *) SvPVX(sv); c < (U8 *)d; c++) {
1614                             if (!NATIVE_IS_INVARIANT(*c)) {
1615                                 hicount++;
1616                             }
1617                         }
1618                         if (hicount) {
1619                             STRLEN offset = d - SvPVX(sv);
1620                             U8 *src, *dst;
1621                             d = SvGROW(sv, SvLEN(sv) + hicount + 1) + offset;
1622                             src = (U8 *)d - 1;
1623                             dst = src+hicount;
1624                             d  += hicount;
1625                             while (src >= (U8 *)SvPVX(sv)) {
1626                                 if (!NATIVE_IS_INVARIANT(*src)) {
1627                                     U8 ch = NATIVE_TO_ASCII(*src);
1628                                     *dst-- = (U8)UTF8_EIGHT_BIT_LO(ch);
1629                                     *dst-- = (U8)UTF8_EIGHT_BIT_HI(ch);
1630                                 }
1631                                 else {
1632                                     *dst-- = *src;
1633                                 }
1634                                 src--;
1635                             }
1636                         }
1637                     }
1638
1639                     if (has_utf8 || uv > 255) {
1640                         d = (char*)uvchr_to_utf8((U8*)d, uv);
1641                         has_utf8 = TRUE;
1642                         if (PL_lex_inwhat == OP_TRANS &&
1643                             PL_sublex_info.sub_op) {
1644                             PL_sublex_info.sub_op->op_private |=
1645                                 (PL_lex_repl ? OPpTRANS_FROM_UTF
1646                                              : OPpTRANS_TO_UTF);
1647                         }
1648                     }
1649                     else {
1650                         *d++ = (char)uv;
1651                     }
1652                 }
1653                 else {
1654                     *d++ = (char) uv;
1655                 }
1656                 continue;
1657
1658             /* \N{LATIN SMALL LETTER A} is a named character */
1659             case 'N':
1660                 ++s;
1661                 if (*s == '{') {
1662                     char* e = strchr(s, '}');
1663                     SV *res;
1664                     STRLEN len;
1665                     char *str;
1666
1667                     if (!e) {
1668                         yyerror("Missing right brace on \\N{}");
1669                         e = s - 1;
1670                         goto cont_scan;
1671                     }
1672                     if (e > s + 2 && s[1] == 'U' && s[2] == '+') {
1673                         /* \N{U+...} */
1674                         I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
1675                           PERL_SCAN_DISALLOW_PREFIX;
1676                         s += 3;
1677                         len = e - s;
1678                         uv = grok_hex(s, &len, &flags, NULL);
1679                         s = e + 1;
1680                         goto NUM_ESCAPE_INSERT;
1681                     }
1682                     res = newSVpvn(s + 1, e - s - 1);
1683                     res = new_constant( Nullch, 0, "charnames",
1684                                         res, Nullsv, "\\N{...}" );
1685                     if (has_utf8)
1686                         sv_utf8_upgrade(res);
1687                     str = SvPV(res,len);
1688 #ifdef EBCDIC_NEVER_MIND
1689                     /* charnames uses pack U and that has been
1690                      * recently changed to do the below uni->native
1691                      * mapping, so this would be redundant (and wrong,
1692                      * the code point would be doubly converted).
1693                      * But leave this in just in case the pack U change
1694                      * gets revoked, but the semantics is still
1695                      * desireable for charnames. --jhi */
1696                     {
1697                          UV uv = utf8_to_uvchr((U8*)str, 0);
1698
1699                          if (uv < 0x100) {
1700                               U8 tmpbuf[UTF8_MAXLEN+1], *d;
1701
1702                               d = uvchr_to_utf8(tmpbuf, UNI_TO_NATIVE(uv));
1703                               sv_setpvn(res, (char *)tmpbuf, d - tmpbuf);
1704                               str = SvPV(res, len);
1705                          }
1706                     }
1707 #endif
1708                     if (!has_utf8 && SvUTF8(res)) {
1709                         char *ostart = SvPVX(sv);
1710                         SvCUR_set(sv, d - ostart);
1711                         SvPOK_on(sv);
1712                         *d = '\0';
1713                         sv_utf8_upgrade(sv);
1714                         /* this just broke our allocation above... */
1715                         SvGROW(sv, (STRLEN)(send - start));
1716                         d = SvPVX(sv) + SvCUR(sv);
1717                         has_utf8 = TRUE;
1718                     }
1719                     if (len > (STRLEN)(e - s + 4)) { /* I _guess_ 4 is \N{} --jhi */
1720                         char *odest = SvPVX(sv);
1721
1722                         SvGROW(sv, (SvLEN(sv) + len - (e - s + 4)));
1723                         d = SvPVX(sv) + (d - odest);
1724                     }
1725                     Copy(str, d, len, char);
1726                     d += len;
1727                     SvREFCNT_dec(res);
1728                   cont_scan:
1729                     s = e + 1;
1730                 }
1731                 else
1732                     yyerror("Missing braces on \\N{}");
1733                 continue;
1734
1735             /* \c is a control character */
1736             case 'c':
1737                 s++;
1738                 if (s < send) {
1739                     U8 c = *s++;
1740 #ifdef EBCDIC
1741                     if (isLOWER(c))
1742                         c = toUPPER(c);
1743 #endif
1744                     *d++ = NATIVE_TO_NEED(has_utf8,toCTRL(c));
1745                 }
1746                 else {
1747                     yyerror("Missing control char name in \\c");
1748                 }
1749                 continue;
1750
1751             /* printf-style backslashes, formfeeds, newlines, etc */
1752             case 'b':
1753                 *d++ = NATIVE_TO_NEED(has_utf8,'\b');
1754                 break;
1755             case 'n':
1756                 *d++ = NATIVE_TO_NEED(has_utf8,'\n');
1757                 break;
1758             case 'r':
1759                 *d++ = NATIVE_TO_NEED(has_utf8,'\r');
1760                 break;
1761             case 'f':
1762                 *d++ = NATIVE_TO_NEED(has_utf8,'\f');
1763                 break;
1764             case 't':
1765                 *d++ = NATIVE_TO_NEED(has_utf8,'\t');
1766                 break;
1767             case 'e':
1768                 *d++ = ASCII_TO_NEED(has_utf8,'\033');
1769                 break;
1770             case 'a':
1771                 *d++ = ASCII_TO_NEED(has_utf8,'\007');
1772                 break;
1773             } /* end switch */
1774
1775             s++;
1776             continue;
1777         } /* end if (backslash) */
1778
1779     default_action:
1780         /* If we started with encoded form, or already know we want it
1781            and then encode the next character */
1782         if ((has_utf8 || this_utf8) && !NATIVE_IS_INVARIANT((U8)(*s))) {
1783             STRLEN len  = 1;
1784             UV uv       = (this_utf8) ? utf8n_to_uvchr((U8*)s, send - s, &len, 0) : (UV) ((U8) *s);
1785             STRLEN need = UNISKIP(NATIVE_TO_UNI(uv));
1786             s += len;
1787             if (need > len) {
1788                 /* encoded value larger than old, need extra space (NOTE: SvCUR() not set here) */
1789                 STRLEN off = d - SvPVX(sv);
1790                 d = SvGROW(sv, SvLEN(sv) + (need-len)) + off;
1791             }
1792             d = (char*)uvchr_to_utf8((U8*)d, uv);
1793             has_utf8 = TRUE;
1794         }
1795         else {
1796             *d++ = NATIVE_TO_NEED(has_utf8,*s++);
1797         }
1798     } /* while loop to process each character */
1799
1800     /* terminate the string and set up the sv */
1801     *d = '\0';
1802     SvCUR_set(sv, d - SvPVX(sv));
1803     if (SvCUR(sv) >= SvLEN(sv))
1804         Perl_croak(aTHX_ "panic: constant overflowed allocated space");
1805
1806     SvPOK_on(sv);
1807     if (PL_encoding && !has_utf8) {
1808         sv_recode_to_utf8(sv, PL_encoding);
1809         if (SvUTF8(sv))
1810             has_utf8 = TRUE;
1811     }
1812     if (has_utf8) {
1813         SvUTF8_on(sv);
1814         if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
1815             PL_sublex_info.sub_op->op_private |=
1816                     (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
1817         }
1818     }
1819
1820     /* shrink the sv if we allocated more than we used */
1821     if (SvCUR(sv) + 5 < SvLEN(sv)) {
1822         SvLEN_set(sv, SvCUR(sv) + 1);
1823         Renew(SvPVX(sv), SvLEN(sv), char);
1824     }
1825
1826     /* return the substring (via yylval) only if we parsed anything */
1827     if (s > PL_bufptr) {
1828         if ( PL_hints & ( PL_lex_inpat ? HINT_NEW_RE : HINT_NEW_STRING ) )
1829             sv = new_constant(start, s - start, (PL_lex_inpat ? "qr" : "q"),
1830                               sv, Nullsv,
1831                               ( PL_lex_inwhat == OP_TRANS
1832                                 ? "tr"
1833                                 : ( (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat)
1834                                     ? "s"
1835                                     : "qq")));
1836         yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
1837     } else
1838         SvREFCNT_dec(sv);
1839     return s;
1840 }
1841
1842 /* S_intuit_more
1843  * Returns TRUE if there's more to the expression (e.g., a subscript),
1844  * FALSE otherwise.
1845  *
1846  * It deals with "$foo[3]" and /$foo[3]/ and /$foo[0123456789$]+/
1847  *
1848  * ->[ and ->{ return TRUE
1849  * { and [ outside a pattern are always subscripts, so return TRUE
1850  * if we're outside a pattern and it's not { or [, then return FALSE
1851  * if we're in a pattern and the first char is a {
1852  *   {4,5} (any digits around the comma) returns FALSE
1853  * if we're in a pattern and the first char is a [
1854  *   [] returns FALSE
1855  *   [SOMETHING] has a funky algorithm to decide whether it's a
1856  *      character class or not.  It has to deal with things like
1857  *      /$foo[-3]/ and /$foo[$bar]/ as well as /$foo[$\d]+/
1858  * anything else returns TRUE
1859  */
1860
1861 /* This is the one truly awful dwimmer necessary to conflate C and sed. */
1862
1863 STATIC int
1864 S_intuit_more(pTHX_ register char *s)
1865 {
1866     if (PL_lex_brackets)
1867         return TRUE;
1868     if (*s == '-' && s[1] == '>' && (s[2] == '[' || s[2] == '{'))
1869         return TRUE;
1870     if (*s != '{' && *s != '[')
1871         return FALSE;
1872     if (!PL_lex_inpat)
1873         return TRUE;
1874
1875     /* In a pattern, so maybe we have {n,m}. */
1876     if (*s == '{') {
1877         s++;
1878         if (!isDIGIT(*s))
1879             return TRUE;
1880         while (isDIGIT(*s))
1881             s++;
1882         if (*s == ',')
1883             s++;
1884         while (isDIGIT(*s))
1885             s++;
1886         if (*s == '}')
1887             return FALSE;
1888         return TRUE;
1889         
1890     }
1891
1892     /* On the other hand, maybe we have a character class */
1893
1894     s++;
1895     if (*s == ']' || *s == '^')
1896         return FALSE;
1897     else {
1898         /* this is terrifying, and it works */
1899         int weight = 2;         /* let's weigh the evidence */
1900         char seen[256];
1901         unsigned char un_char = 255, last_un_char;
1902         char *send = strchr(s,']');
1903         char tmpbuf[sizeof PL_tokenbuf * 4];
1904
1905         if (!send)              /* has to be an expression */
1906             return TRUE;
1907
1908         Zero(seen,256,char);
1909         if (*s == '$')
1910             weight -= 3;
1911         else if (isDIGIT(*s)) {
1912             if (s[1] != ']') {
1913                 if (isDIGIT(s[1]) && s[2] == ']')
1914                     weight -= 10;
1915             }
1916             else
1917                 weight -= 100;
1918         }
1919         for (; s < send; s++) {
1920             last_un_char = un_char;
1921             un_char = (unsigned char)*s;
1922             switch (*s) {
1923             case '@':
1924             case '&':
1925             case '$':
1926                 weight -= seen[un_char] * 10;
1927                 if (isALNUM_lazy_if(s+1,UTF)) {
1928                     scan_ident(s, send, tmpbuf, sizeof tmpbuf, FALSE);
1929                     if ((int)strlen(tmpbuf) > 1 && gv_fetchpv(tmpbuf,FALSE, SVt_PV))
1930                         weight -= 100;
1931                     else
1932                         weight -= 10;
1933                 }
1934                 else if (*s == '$' && s[1] &&
1935                   strchr("[#!%*<>()-=",s[1])) {
1936                     if (/*{*/ strchr("])} =",s[2]))
1937                         weight -= 10;
1938                     else
1939                         weight -= 1;
1940                 }
1941                 break;
1942             case '\\':
1943                 un_char = 254;
1944                 if (s[1]) {
1945                     if (strchr("wds]",s[1]))
1946                         weight += 100;
1947                     else if (seen['\''] || seen['"'])
1948                         weight += 1;
1949                     else if (strchr("rnftbxcav",s[1]))
1950                         weight += 40;
1951                     else if (isDIGIT(s[1])) {
1952                         weight += 40;
1953                         while (s[1] && isDIGIT(s[1]))
1954                             s++;
1955                     }
1956                 }
1957                 else
1958                     weight += 100;
1959                 break;
1960             case '-':
1961                 if (s[1] == '\\')
1962                     weight += 50;
1963                 if (strchr("aA01! ",last_un_char))
1964                     weight += 30;
1965                 if (strchr("zZ79~",s[1]))
1966                     weight += 30;
1967                 if (last_un_char == 255 && (isDIGIT(s[1]) || s[1] == '$'))
1968                     weight -= 5;        /* cope with negative subscript */
1969                 break;
1970             default:
1971                 if (!isALNUM(last_un_char)
1972                     && !(last_un_char == '$' || last_un_char == '@'
1973                          || last_un_char == '&')
1974                     && isALPHA(*s) && s[1] && isALPHA(s[1])) {
1975                     char *d = tmpbuf;
1976                     while (isALPHA(*s))
1977                         *d++ = *s++;
1978                     *d = '\0';
1979                     if (keyword(tmpbuf, d - tmpbuf))
1980                         weight -= 150;
1981                 }
1982                 if (un_char == last_un_char + 1)
1983                     weight += 5;
1984                 weight -= seen[un_char];
1985                 break;
1986             }
1987             seen[un_char]++;
1988         }
1989         if (weight >= 0)        /* probably a character class */
1990             return FALSE;
1991     }
1992
1993     return TRUE;
1994 }
1995
1996 /*
1997  * S_intuit_method
1998  *
1999  * Does all the checking to disambiguate
2000  *   foo bar
2001  * between foo(bar) and bar->foo.  Returns 0 if not a method, otherwise
2002  * FUNCMETH (bar->foo(args)) or METHOD (bar->foo args).
2003  *
2004  * First argument is the stuff after the first token, e.g. "bar".
2005  *
2006  * Not a method if bar is a filehandle.
2007  * Not a method if foo is a subroutine prototyped to take a filehandle.
2008  * Not a method if it's really "Foo $bar"
2009  * Method if it's "foo $bar"
2010  * Not a method if it's really "print foo $bar"
2011  * Method if it's really "foo package::" (interpreted as package->foo)
2012  * Not a method if bar is known to be a subroutine ("sub bar; foo bar")
2013  * Not a method if bar is a filehandle or package, but is quoted with
2014  *   =>
2015  */
2016
2017 STATIC int
2018 S_intuit_method(pTHX_ char *start, GV *gv)
2019 {
2020     char *s = start + (*start == '$');
2021     char tmpbuf[sizeof PL_tokenbuf];
2022     STRLEN len;
2023     GV* indirgv;
2024
2025     if (gv) {
2026         CV *cv;
2027         if (GvIO(gv))
2028             return 0;
2029         if ((cv = GvCVu(gv))) {
2030             char *proto = SvPVX(cv);
2031             if (proto) {
2032                 if (*proto == ';')
2033                     proto++;
2034                 if (*proto == '*')
2035                     return 0;
2036             }
2037         } else
2038             gv = 0;
2039     }
2040     s = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
2041     /* start is the beginning of the possible filehandle/object,
2042      * and s is the end of it
2043      * tmpbuf is a copy of it
2044      */
2045
2046     if (*start == '$') {
2047         if (gv || PL_last_lop_op == OP_PRINT || isUPPER(*PL_tokenbuf))
2048             return 0;
2049         s = skipspace(s);
2050         PL_bufptr = start;
2051         PL_expect = XREF;
2052         return *s == '(' ? FUNCMETH : METHOD;
2053     }
2054     if (!keyword(tmpbuf, len)) {
2055         if (len > 2 && tmpbuf[len - 2] == ':' && tmpbuf[len - 1] == ':') {
2056             len -= 2;
2057             tmpbuf[len] = '\0';
2058             goto bare_package;
2059         }
2060         indirgv = gv_fetchpv(tmpbuf, FALSE, SVt_PVCV);
2061         if (indirgv && GvCVu(indirgv))
2062             return 0;
2063         /* filehandle or package name makes it a method */
2064         if (!gv || GvIO(indirgv) || gv_stashpvn(tmpbuf, len, FALSE)) {
2065             s = skipspace(s);
2066             if ((PL_bufend - s) >= 2 && *s == '=' && *(s+1) == '>')
2067                 return 0;       /* no assumptions -- "=>" quotes bearword */
2068       bare_package:
2069             PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST, 0,
2070                                                    newSVpvn(tmpbuf,len));
2071             PL_nextval[PL_nexttoke].opval->op_private = OPpCONST_BARE;
2072             PL_expect = XTERM;
2073             force_next(WORD);
2074             PL_bufptr = s;
2075             return *s == '(' ? FUNCMETH : METHOD;
2076         }
2077     }
2078     return 0;
2079 }
2080
2081 /*
2082  * S_incl_perldb
2083  * Return a string of Perl code to load the debugger.  If PERL5DB
2084  * is set, it will return the contents of that, otherwise a
2085  * compile-time require of perl5db.pl.
2086  */
2087
2088 STATIC char*
2089 S_incl_perldb(pTHX)
2090 {
2091     if (PL_perldb) {
2092         char *pdb = PerlEnv_getenv("PERL5DB");
2093
2094         if (pdb)
2095             return pdb;
2096         SETERRNO(0,SS_NORMAL);
2097         return "BEGIN { require 'perl5db.pl' }";
2098     }
2099     return "";
2100 }
2101
2102
2103 /* Encoded script support. filter_add() effectively inserts a
2104  * 'pre-processing' function into the current source input stream.
2105  * Note that the filter function only applies to the current source file
2106  * (e.g., it will not affect files 'require'd or 'use'd by this one).
2107  *
2108  * The datasv parameter (which may be NULL) can be used to pass
2109  * private data to this instance of the filter. The filter function
2110  * can recover the SV using the FILTER_DATA macro and use it to
2111  * store private buffers and state information.
2112  *
2113  * The supplied datasv parameter is upgraded to a PVIO type
2114  * and the IoDIRP/IoANY field is used to store the function pointer,
2115  * and IOf_FAKE_DIRP is enabled on datasv to mark this as such.
2116  * Note that IoTOP_NAME, IoFMT_NAME, IoBOTTOM_NAME, if set for
2117  * private use must be set using malloc'd pointers.
2118  */
2119
2120 SV *
2121 Perl_filter_add(pTHX_ filter_t funcp, SV *datasv)
2122 {
2123     if (!funcp)
2124         return Nullsv;
2125
2126     if (!PL_rsfp_filters)
2127         PL_rsfp_filters = newAV();
2128     if (!datasv)
2129         datasv = NEWSV(255,0);
2130     if (!SvUPGRADE(datasv, SVt_PVIO))
2131         Perl_die(aTHX_ "Can't upgrade filter_add data to SVt_PVIO");
2132     IoANY(datasv) = (void *)funcp; /* stash funcp into spare field */
2133     IoFLAGS(datasv) |= IOf_FAKE_DIRP;
2134     DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_add func %p (%s)\n",
2135                           (void*)funcp, SvPV_nolen(datasv)));
2136     av_unshift(PL_rsfp_filters, 1);
2137     av_store(PL_rsfp_filters, 0, datasv) ;
2138     return(datasv);
2139 }
2140
2141
2142 /* Delete most recently added instance of this filter function. */
2143 void
2144 Perl_filter_del(pTHX_ filter_t funcp)
2145 {
2146     SV *datasv;
2147     DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_del func %p", (void*)funcp));
2148     if (!PL_rsfp_filters || AvFILLp(PL_rsfp_filters)<0)
2149         return;
2150     /* if filter is on top of stack (usual case) just pop it off */
2151     datasv = FILTER_DATA(AvFILLp(PL_rsfp_filters));
2152     if (IoANY(datasv) == (void *)funcp) {
2153         IoFLAGS(datasv) &= ~IOf_FAKE_DIRP;
2154         IoANY(datasv) = (void *)NULL;
2155         sv_free(av_pop(PL_rsfp_filters));
2156
2157         return;
2158     }
2159     /* we need to search for the correct entry and clear it     */
2160     Perl_die(aTHX_ "filter_del can only delete in reverse order (currently)");
2161 }
2162
2163
2164 /* Invoke the idxth filter function for the current rsfp.        */
2165 /* maxlen 0 = read one text line */
2166 I32
2167 Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
2168 {
2169     filter_t funcp;
2170     SV *datasv = NULL;
2171
2172     if (!PL_rsfp_filters)
2173         return -1;
2174     if (idx > AvFILLp(PL_rsfp_filters)) {       /* Any more filters?    */
2175         /* Provide a default input filter to make life easy.    */
2176         /* Note that we append to the line. This is handy.      */
2177         DEBUG_P(PerlIO_printf(Perl_debug_log,
2178                               "filter_read %d: from rsfp\n", idx));
2179         if (maxlen) {
2180             /* Want a block */
2181             int len ;
2182             int old_len = SvCUR(buf_sv) ;
2183
2184             /* ensure buf_sv is large enough */
2185             SvGROW(buf_sv, (STRLEN)(old_len + maxlen)) ;
2186             if ((len = PerlIO_read(PL_rsfp, SvPVX(buf_sv) + old_len, maxlen)) <= 0){
2187                 if (PerlIO_error(PL_rsfp))
2188                     return -1;          /* error */
2189                 else
2190                     return 0 ;          /* end of file */
2191             }
2192             SvCUR_set(buf_sv, old_len + len) ;
2193         } else {
2194             /* Want a line */
2195             if (sv_gets(buf_sv, PL_rsfp, SvCUR(buf_sv)) == NULL) {
2196                 if (PerlIO_error(PL_rsfp))
2197                     return -1;          /* error */
2198                 else
2199                     return 0 ;          /* end of file */
2200             }
2201         }
2202         return SvCUR(buf_sv);
2203     }
2204     /* Skip this filter slot if filter has been deleted */
2205     if ( (datasv = FILTER_DATA(idx)) == &PL_sv_undef) {
2206         DEBUG_P(PerlIO_printf(Perl_debug_log,
2207                               "filter_read %d: skipped (filter deleted)\n",
2208                               idx));
2209         return FILTER_READ(idx+1, buf_sv, maxlen); /* recurse */
2210     }
2211     /* Get function pointer hidden within datasv        */
2212     funcp = (filter_t)IoANY(datasv);
2213     DEBUG_P(PerlIO_printf(Perl_debug_log,
2214                           "filter_read %d: via function %p (%s)\n",
2215                           idx, (void*)funcp, SvPV_nolen(datasv)));
2216     /* Call function. The function is expected to       */
2217     /* call "FILTER_READ(idx+1, buf_sv)" first.         */
2218     /* Return: <0:error, =0:eof, >0:not eof             */
2219     return (*funcp)(aTHX_ idx, buf_sv, maxlen);
2220 }
2221
2222 STATIC char *
2223 S_filter_gets(pTHX_ register SV *sv, register PerlIO *fp, STRLEN append)
2224 {
2225 #ifdef PERL_CR_FILTER
2226     if (!PL_rsfp_filters) {
2227         filter_add(S_cr_textfilter,NULL);
2228     }
2229 #endif
2230     if (PL_rsfp_filters) {
2231         if (!append)
2232             SvCUR_set(sv, 0);   /* start with empty line        */
2233         if (FILTER_READ(0, sv, 0) > 0)
2234             return ( SvPVX(sv) ) ;
2235         else
2236             return Nullch ;
2237     }
2238     else
2239         return (sv_gets(sv, fp, append));
2240 }
2241
2242 STATIC HV *
2243 S_find_in_my_stash(pTHX_ char *pkgname, I32 len)
2244 {
2245     GV *gv;
2246
2247     if (len == 11 && *pkgname == '_' && strEQ(pkgname, "__PACKAGE__"))
2248         return PL_curstash;
2249
2250     if (len > 2 &&
2251         (pkgname[len - 2] == ':' && pkgname[len - 1] == ':') &&
2252         (gv = gv_fetchpv(pkgname, FALSE, SVt_PVHV)))
2253     {
2254         return GvHV(gv);                        /* Foo:: */
2255     }
2256
2257     /* use constant CLASS => 'MyClass' */
2258     if ((gv = gv_fetchpv(pkgname, FALSE, SVt_PVCV))) {
2259         SV *sv;
2260         if (GvCV(gv) && (sv = cv_const_sv(GvCV(gv)))) {
2261             pkgname = SvPV_nolen(sv);
2262         }
2263     }
2264
2265     return gv_stashpv(pkgname, FALSE);
2266 }
2267
2268 #ifdef DEBUGGING
2269     static char* exp_name[] =
2270         { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "ATTRBLOCK",
2271           "ATTRTERM", "TERMBLOCK", "TERMORDORDOR"
2272         };
2273 #endif
2274
2275 /*
2276   yylex
2277
2278   Works out what to call the token just pulled out of the input
2279   stream.  The yacc parser takes care of taking the ops we return and
2280   stitching them into a tree.
2281
2282   Returns:
2283     PRIVATEREF
2284
2285   Structure:
2286       if read an identifier
2287           if we're in a my declaration
2288               croak if they tried to say my($foo::bar)
2289               build the ops for a my() declaration
2290           if it's an access to a my() variable
2291               are we in a sort block?
2292                   croak if my($a); $a <=> $b
2293               build ops for access to a my() variable
2294           if in a dq string, and they've said @foo and we can't find @foo
2295               croak
2296           build ops for a bareword
2297       if we already built the token before, use it.
2298 */
2299
2300
2301 #ifdef __SC__
2302 #pragma segment Perl_yylex
2303 #endif
2304 int
2305 Perl_yylex(pTHX)
2306 {
2307     register char *s = PL_bufptr;
2308     register char *d;
2309     register I32 tmp;
2310     STRLEN len;
2311     GV *gv = Nullgv;
2312     GV **gvp = 0;
2313     bool bof = FALSE;
2314     I32 orig_keyword = 0;
2315
2316     DEBUG_T( {
2317         PerlIO_printf(Perl_debug_log, "### LEX_%s\n",
2318                                         lex_state_names[PL_lex_state]);
2319     } );
2320     /* check if there's an identifier for us to look at */
2321     if (PL_pending_ident)
2322         return REPORT(S_pending_ident(aTHX));
2323
2324     /* no identifier pending identification */
2325
2326     switch (PL_lex_state) {
2327 #ifdef COMMENTARY
2328     case LEX_NORMAL:            /* Some compilers will produce faster */
2329     case LEX_INTERPNORMAL:      /* code if we comment these out. */
2330         break;
2331 #endif
2332
2333     /* when we've already built the next token, just pull it out of the queue */
2334     case LEX_KNOWNEXT:
2335         PL_nexttoke--;
2336         yylval = PL_nextval[PL_nexttoke];
2337         if (!PL_nexttoke) {
2338             PL_lex_state = PL_lex_defer;
2339             PL_expect = PL_lex_expect;
2340             PL_lex_defer = LEX_NORMAL;
2341         }
2342         DEBUG_T({ PerlIO_printf(Perl_debug_log,
2343               "### Next token after '%s' was known, type %"IVdf"\n", PL_bufptr,
2344               (IV)PL_nexttype[PL_nexttoke]); });
2345
2346         return REPORT(PL_nexttype[PL_nexttoke]);
2347
2348     /* interpolated case modifiers like \L \U, including \Q and \E.
2349        when we get here, PL_bufptr is at the \
2350     */
2351     case LEX_INTERPCASEMOD:
2352 #ifdef DEBUGGING
2353         if (PL_bufptr != PL_bufend && *PL_bufptr != '\\')
2354             Perl_croak(aTHX_ "panic: INTERPCASEMOD");
2355 #endif
2356         /* handle \E or end of string */
2357         if (PL_bufptr == PL_bufend || PL_bufptr[1] == 'E') {
2358             char oldmod;
2359
2360             /* if at a \E */
2361             if (PL_lex_casemods) {
2362                 oldmod = PL_lex_casestack[--PL_lex_casemods];
2363                 PL_lex_casestack[PL_lex_casemods] = '\0';
2364
2365                 if (PL_bufptr != PL_bufend
2366                     && (oldmod == 'L' || oldmod == 'U' || oldmod == 'Q')) {
2367                     PL_bufptr += 2;
2368                     PL_lex_state = LEX_INTERPCONCAT;
2369                 }
2370                 return REPORT(')');
2371             }
2372             if (PL_bufptr != PL_bufend)
2373                 PL_bufptr += 2;
2374             PL_lex_state = LEX_INTERPCONCAT;
2375             return yylex();
2376         }
2377         else {
2378             DEBUG_T({ PerlIO_printf(Perl_debug_log,
2379               "### Saw case modifier at '%s'\n", PL_bufptr); });
2380             s = PL_bufptr + 1;
2381             if (s[1] == '\\' && s[2] == 'E') {
2382                 PL_bufptr = s + 3;
2383                 PL_lex_state = LEX_INTERPCONCAT;
2384                 return yylex();
2385             }
2386             else {
2387                 if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
2388                     tmp = *s, *s = s[2], s[2] = (char)tmp;      /* misordered... */
2389                 if ((*s == 'L' || *s == 'U') &&
2390                     (strchr(PL_lex_casestack, 'L') || strchr(PL_lex_casestack, 'U'))) {
2391                     PL_lex_casestack[--PL_lex_casemods] = '\0';
2392                     return REPORT(')');
2393                 }
2394                 if (PL_lex_casemods > 10)
2395                     Renew(PL_lex_casestack, PL_lex_casemods + 2, char);
2396                 PL_lex_casestack[PL_lex_casemods++] = *s;
2397                 PL_lex_casestack[PL_lex_casemods] = '\0';
2398                 PL_lex_state = LEX_INTERPCONCAT;
2399                 PL_nextval[PL_nexttoke].ival = 0;
2400                 force_next('(');
2401                 if (*s == 'l')
2402                     PL_nextval[PL_nexttoke].ival = OP_LCFIRST;
2403                 else if (*s == 'u')
2404                     PL_nextval[PL_nexttoke].ival = OP_UCFIRST;
2405                 else if (*s == 'L')
2406                     PL_nextval[PL_nexttoke].ival = OP_LC;
2407                 else if (*s == 'U')
2408                     PL_nextval[PL_nexttoke].ival = OP_UC;
2409                 else if (*s == 'Q')
2410                     PL_nextval[PL_nexttoke].ival = OP_QUOTEMETA;
2411                 else
2412                     Perl_croak(aTHX_ "panic: yylex");
2413                 PL_bufptr = s + 1;
2414             }
2415             force_next(FUNC);
2416             if (PL_lex_starts) {
2417                 s = PL_bufptr;
2418                 PL_lex_starts = 0;
2419                 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
2420                 if (PL_lex_casemods == 1 && PL_lex_inpat)
2421                     OPERATOR(',');
2422                 else
2423                     Aop(OP_CONCAT);
2424             }
2425             else
2426                 return yylex();
2427         }
2428
2429     case LEX_INTERPPUSH:
2430         return REPORT(sublex_push());
2431
2432     case LEX_INTERPSTART:
2433         if (PL_bufptr == PL_bufend)
2434             return REPORT(sublex_done());
2435         DEBUG_T({ PerlIO_printf(Perl_debug_log,
2436               "### Interpolated variable at '%s'\n", PL_bufptr); });
2437         PL_expect = XTERM;
2438         PL_lex_dojoin = (*PL_bufptr == '@');
2439         PL_lex_state = LEX_INTERPNORMAL;
2440         if (PL_lex_dojoin) {
2441             PL_nextval[PL_nexttoke].ival = 0;
2442             force_next(',');
2443             force_ident("\"", '$');
2444             PL_nextval[PL_nexttoke].ival = 0;
2445             force_next('$');
2446             PL_nextval[PL_nexttoke].ival = 0;
2447             force_next('(');
2448             PL_nextval[PL_nexttoke].ival = OP_JOIN;     /* emulate join($", ...) */
2449             force_next(FUNC);
2450         }
2451         if (PL_lex_starts++) {
2452             s = PL_bufptr;
2453             /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
2454             if (!PL_lex_casemods && PL_lex_inpat)
2455                 OPERATOR(',');
2456             else
2457                 Aop(OP_CONCAT);
2458         }
2459         return yylex();
2460
2461     case LEX_INTERPENDMAYBE:
2462         if (intuit_more(PL_bufptr)) {
2463             PL_lex_state = LEX_INTERPNORMAL;    /* false alarm, more expr */
2464             break;
2465         }
2466         /* FALL THROUGH */
2467
2468     case LEX_INTERPEND:
2469         if (PL_lex_dojoin) {
2470             PL_lex_dojoin = FALSE;
2471             PL_lex_state = LEX_INTERPCONCAT;
2472             return REPORT(')');
2473         }
2474         if (PL_lex_inwhat == OP_SUBST && PL_linestr == PL_lex_repl
2475             && SvEVALED(PL_lex_repl))
2476         {
2477             if (PL_bufptr != PL_bufend)
2478                 Perl_croak(aTHX_ "Bad evalled substitution pattern");
2479             PL_lex_repl = Nullsv;
2480         }
2481         /* FALLTHROUGH */
2482     case LEX_INTERPCONCAT:
2483 #ifdef DEBUGGING
2484         if (PL_lex_brackets)
2485             Perl_croak(aTHX_ "panic: INTERPCONCAT");
2486 #endif
2487         if (PL_bufptr == PL_bufend)
2488             return REPORT(sublex_done());
2489
2490         if (SvIVX(PL_linestr) == '\'') {
2491             SV *sv = newSVsv(PL_linestr);
2492             if (!PL_lex_inpat)
2493                 sv = tokeq(sv);
2494             else if ( PL_hints & HINT_NEW_RE )
2495                 sv = new_constant(NULL, 0, "qr", sv, sv, "q");
2496             yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
2497             s = PL_bufend;
2498         }
2499         else {
2500             s = scan_const(PL_bufptr);
2501             if (*s == '\\')
2502                 PL_lex_state = LEX_INTERPCASEMOD;
2503             else
2504                 PL_lex_state = LEX_INTERPSTART;
2505         }
2506
2507         if (s != PL_bufptr) {
2508             PL_nextval[PL_nexttoke] = yylval;
2509             PL_expect = XTERM;
2510             force_next(THING);
2511             if (PL_lex_starts++) {
2512                 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
2513                 if (!PL_lex_casemods && PL_lex_inpat)
2514                     OPERATOR(',');
2515                 else
2516                     Aop(OP_CONCAT);
2517             }
2518             else {
2519                 PL_bufptr = s;
2520                 return yylex();
2521             }
2522         }
2523
2524         return yylex();
2525     case LEX_FORMLINE:
2526         PL_lex_state = LEX_NORMAL;
2527         s = scan_formline(PL_bufptr);
2528         if (!PL_lex_formbrack)
2529             goto rightbracket;
2530         OPERATOR(';');
2531     }
2532
2533     s = PL_bufptr;
2534     PL_oldoldbufptr = PL_oldbufptr;
2535     PL_oldbufptr = s;
2536     DEBUG_T( {
2537         PerlIO_printf(Perl_debug_log, "### Tokener expecting %s at [%s]\n",
2538                       exp_name[PL_expect], s);
2539     } );
2540
2541   retry:
2542     switch (*s) {
2543     default:
2544         if (isIDFIRST_lazy_if(s,UTF))
2545             goto keylookup;
2546         Perl_croak(aTHX_ "Unrecognized character \\x%02X", *s & 255);
2547     case 4:
2548     case 26:
2549         goto fake_eof;                  /* emulate EOF on ^D or ^Z */
2550     case 0:
2551         if (!PL_rsfp) {
2552             PL_last_uni = 0;
2553             PL_last_lop = 0;
2554             if (PL_lex_brackets) {
2555                 if (PL_lex_formbrack)
2556                     yyerror("Format not terminated");
2557                 else
2558                     yyerror("Missing right curly or square bracket");
2559             }
2560             DEBUG_T( { PerlIO_printf(Perl_debug_log,
2561                         "### Tokener got EOF\n");
2562             } );
2563             TOKEN(0);
2564         }
2565         if (s++ < PL_bufend)
2566             goto retry;                 /* ignore stray nulls */
2567         PL_last_uni = 0;
2568         PL_last_lop = 0;
2569         if (!PL_in_eval && !PL_preambled) {
2570             PL_preambled = TRUE;
2571             sv_setpv(PL_linestr,incl_perldb());
2572             if (SvCUR(PL_linestr))
2573                 sv_catpvn(PL_linestr,";", 1);
2574             if (PL_preambleav){
2575                 while(AvFILLp(PL_preambleav) >= 0) {
2576                     SV *tmpsv = av_shift(PL_preambleav);
2577                     sv_catsv(PL_linestr, tmpsv);
2578                     sv_catpvn(PL_linestr, ";", 1);
2579                     sv_free(tmpsv);
2580                 }
2581                 sv_free((SV*)PL_preambleav);
2582                 PL_preambleav = NULL;
2583             }
2584             if (PL_minus_n || PL_minus_p) {
2585                 sv_catpv(PL_linestr, "LINE: while (<>) {");
2586                 if (PL_minus_l)
2587                     sv_catpv(PL_linestr,"chomp;");
2588                 if (PL_minus_a) {
2589                     if (PL_minus_F) {
2590                         if ((*PL_splitstr == '/' || *PL_splitstr == '\''
2591                              || *PL_splitstr == '"')
2592                               && strchr(PL_splitstr + 1, *PL_splitstr))
2593                             Perl_sv_catpvf(aTHX_ PL_linestr, "our @F=split(%s);", PL_splitstr);
2594                         else {
2595                             /* "q\0${splitstr}\0" is legal perl. Yes, even NUL
2596                                bytes can be used as quoting characters.  :-) */
2597                             /* The count here deliberately includes the NUL
2598                                that terminates the C string constant.  This
2599                                embeds the opening NUL into the string.  */
2600                             sv_catpvn(PL_linestr, "our @F=split(q", 15);
2601                             s = PL_splitstr;
2602                             do {
2603                                 /* Need to \ \s  */
2604                                 if (*s == '\\')
2605                                     sv_catpvn(PL_linestr, s, 1);
2606                                 sv_catpvn(PL_linestr, s, 1);
2607                             } while (*s++);
2608                             /* This loop will embed the trailing NUL of
2609                                PL_linestr as the last thing it does before
2610                                terminating.  */
2611                             sv_catpvn(PL_linestr, ");", 2);
2612                         }
2613                     }
2614                     else
2615                         sv_catpv(PL_linestr,"our @F=split(' ');");
2616                 }
2617             }
2618             sv_catpvn(PL_linestr, "\n", 1);
2619             PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2620             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
2621             PL_last_lop = PL_last_uni = Nullch;
2622             if (PERLDB_LINE && PL_curstash != PL_debstash) {
2623                 SV *sv = NEWSV(85,0);
2624
2625                 sv_upgrade(sv, SVt_PVMG);
2626                 sv_setsv(sv,PL_linestr);
2627                 (void)SvIOK_on(sv);
2628                 SvIVX(sv) = 0;
2629                 av_store(CopFILEAV(PL_curcop),(I32)CopLINE(PL_curcop),sv);
2630             }
2631             goto retry;
2632         }
2633         do {
2634             bof = PL_rsfp ? TRUE : FALSE;
2635             if ((s = filter_gets(PL_linestr, PL_rsfp, 0)) == Nullch) {
2636               fake_eof:
2637                 if (PL_rsfp) {
2638                     if (PL_preprocess && !PL_in_eval)
2639                         (void)PerlProc_pclose(PL_rsfp);
2640                     else if ((PerlIO *)PL_rsfp == PerlIO_stdin())
2641                         PerlIO_clearerr(PL_rsfp);
2642                     else
2643                         (void)PerlIO_close(PL_rsfp);
2644                     PL_rsfp = Nullfp;
2645                     PL_doextract = FALSE;
2646                 }
2647                 if (!PL_in_eval && (PL_minus_n || PL_minus_p)) {
2648                     sv_setpv(PL_linestr,PL_minus_p
2649                              ? ";}continue{print;}" : ";}");
2650                     PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2651                     PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
2652                     PL_last_lop = PL_last_uni = Nullch;
2653                     PL_minus_n = PL_minus_p = 0;
2654                     goto retry;
2655                 }
2656                 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2657                 PL_last_lop = PL_last_uni = Nullch;
2658                 sv_setpv(PL_linestr,"");
2659                 TOKEN(';');     /* not infinite loop because rsfp is NULL now */
2660             }
2661             /* If it looks like the start of a BOM or raw UTF-16,
2662              * check if it in fact is. */
2663             else if (bof &&
2664                      (*s == 0 ||
2665                       *(U8*)s == 0xEF ||
2666                       *(U8*)s >= 0xFE ||
2667                       s[1] == 0)) {
2668 #ifdef PERLIO_IS_STDIO
2669 #  ifdef __GNU_LIBRARY__
2670 #    if __GNU_LIBRARY__ == 1 /* Linux glibc5 */
2671 #      define FTELL_FOR_PIPE_IS_BROKEN
2672 #    endif
2673 #  else
2674 #    ifdef __GLIBC__
2675 #      if __GLIBC__ == 1 /* maybe some glibc5 release had it like this? */
2676 #        define FTELL_FOR_PIPE_IS_BROKEN
2677 #      endif
2678 #    endif
2679 #  endif
2680 #endif
2681 #ifdef FTELL_FOR_PIPE_IS_BROKEN
2682                 /* This loses the possibility to detect the bof
2683                  * situation on perl -P when the libc5 is being used.
2684                  * Workaround?  Maybe attach some extra state to PL_rsfp?
2685                  */
2686                 if (!PL_preprocess)
2687                     bof = PerlIO_tell(PL_rsfp) == SvCUR(PL_linestr);
2688 #else
2689                 bof = PerlIO_tell(PL_rsfp) == (Off_t)SvCUR(PL_linestr);
2690 #endif
2691                 if (bof) {
2692                     PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
2693                     s = swallow_bom((U8*)s);
2694                 }
2695             }
2696             if (PL_doextract) {
2697                 /* Incest with pod. */
2698                 if (*s == '=' && strnEQ(s, "=cut", 4)) {
2699                     sv_setpv(PL_linestr, "");
2700                     PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2701                     PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
2702                     PL_last_lop = PL_last_uni = Nullch;
2703                     PL_doextract = FALSE;
2704                 }
2705             }
2706             incline(s);
2707         } while (PL_doextract);
2708         PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = s;
2709         if (PERLDB_LINE && PL_curstash != PL_debstash) {
2710             SV *sv = NEWSV(85,0);
2711
2712             sv_upgrade(sv, SVt_PVMG);
2713             sv_setsv(sv,PL_linestr);
2714             (void)SvIOK_on(sv);
2715             SvIVX(sv) = 0;
2716             av_store(CopFILEAV(PL_curcop),(I32)CopLINE(PL_curcop),sv);
2717         }
2718         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
2719         PL_last_lop = PL_last_uni = Nullch;
2720         if (CopLINE(PL_curcop) == 1) {
2721             while (s < PL_bufend && isSPACE(*s))
2722                 s++;
2723             if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
2724                 s++;
2725             d = Nullch;
2726             if (!PL_in_eval) {
2727                 if (*s == '#' && *(s+1) == '!')
2728                     d = s + 2;
2729 #ifdef ALTERNATE_SHEBANG
2730                 else {
2731                     static char as[] = ALTERNATE_SHEBANG;
2732                     if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
2733                         d = s + (sizeof(as) - 1);
2734                 }
2735 #endif /* ALTERNATE_SHEBANG */
2736             }
2737             if (d) {
2738                 char *ipath;
2739                 char *ipathend;
2740
2741                 while (isSPACE(*d))
2742                     d++;
2743                 ipath = d;
2744                 while (*d && !isSPACE(*d))
2745                     d++;
2746                 ipathend = d;
2747
2748 #ifdef ARG_ZERO_IS_SCRIPT
2749                 if (ipathend > ipath) {
2750                     /*
2751                      * HP-UX (at least) sets argv[0] to the script name,
2752                      * which makes $^X incorrect.  And Digital UNIX and Linux,
2753                      * at least, set argv[0] to the basename of the Perl
2754                      * interpreter. So, having found "#!", we'll set it right.
2755                      */
2756                     SV *x = GvSV(gv_fetchpv("\030", TRUE, SVt_PV)); /* $^X */
2757                     assert(SvPOK(x) || SvGMAGICAL(x));
2758                     if (sv_eq(x, CopFILESV(PL_curcop))) {
2759                         sv_setpvn(x, ipath, ipathend - ipath);
2760                         SvSETMAGIC(x);
2761                     }
2762                     else {
2763                         STRLEN blen;
2764                         STRLEN llen;
2765                         char *bstart = SvPV(CopFILESV(PL_curcop),blen);
2766                         char *lstart = SvPV(x,llen);
2767                         if (llen < blen) {
2768                             bstart += blen - llen;
2769                             if (strnEQ(bstart, lstart, llen) && bstart[-1] == '/') {
2770                                 sv_setpvn(x, ipath, ipathend - ipath);
2771                                 SvSETMAGIC(x);
2772                             }
2773                         }
2774                     }
2775                     TAINT_NOT;  /* $^X is always tainted, but that's OK */
2776                 }
2777 #endif /* ARG_ZERO_IS_SCRIPT */
2778
2779                 /*
2780                  * Look for options.
2781                  */
2782                 d = instr(s,"perl -");
2783                 if (!d) {
2784                     d = instr(s,"perl");
2785 #if defined(DOSISH)
2786                     /* avoid getting into infinite loops when shebang
2787                      * line contains "Perl" rather than "perl" */
2788                     if (!d) {
2789                         for (d = ipathend-4; d >= ipath; --d) {
2790                             if ((*d == 'p' || *d == 'P')
2791                                 && !ibcmp(d, "perl", 4))
2792                             {
2793                                 break;
2794                             }
2795                         }
2796                         if (d < ipath)
2797                             d = Nullch;
2798                     }
2799 #endif
2800                 }
2801 #ifdef ALTERNATE_SHEBANG
2802                 /*
2803                  * If the ALTERNATE_SHEBANG on this system starts with a
2804                  * character that can be part of a Perl expression, then if
2805                  * we see it but not "perl", we're probably looking at the
2806                  * start of Perl code, not a request to hand off to some
2807                  * other interpreter.  Similarly, if "perl" is there, but
2808                  * not in the first 'word' of the line, we assume the line
2809                  * contains the start of the Perl program.
2810                  */
2811                 if (d && *s != '#') {
2812                     char *c = ipath;
2813                     while (*c && !strchr("; \t\r\n\f\v#", *c))
2814                         c++;
2815                     if (c < d)
2816                         d = Nullch;     /* "perl" not in first word; ignore */
2817                     else
2818                         *s = '#';       /* Don't try to parse shebang line */
2819                 }
2820 #endif /* ALTERNATE_SHEBANG */
2821 #ifndef MACOS_TRADITIONAL
2822                 if (!d &&
2823                     *s == '#' &&
2824                     ipathend > ipath &&
2825                     !PL_minus_c &&
2826                     !instr(s,"indir") &&
2827                     instr(PL_origargv[0],"perl"))
2828                 {
2829                     char **newargv;
2830
2831                     *ipathend = '\0';
2832                     s = ipathend + 1;
2833                     while (s < PL_bufend && isSPACE(*s))
2834                         s++;
2835                     if (s < PL_bufend) {
2836                         Newz(899,newargv,PL_origargc+3,char*);
2837                         newargv[1] = s;
2838                         while (s < PL_bufend && !isSPACE(*s))
2839                             s++;
2840                         *s = '\0';
2841                         Copy(PL_origargv+1, newargv+2, PL_origargc+1, char*);
2842                     }
2843                     else
2844                         newargv = PL_origargv;
2845                     newargv[0] = ipath;
2846                     PERL_FPU_PRE_EXEC
2847                     PerlProc_execv(ipath, EXEC_ARGV_CAST(newargv));
2848                     PERL_FPU_POST_EXEC
2849                     Perl_croak(aTHX_ "Can't exec %s", ipath);
2850                 }
2851 #endif
2852                 if (d) {
2853                     U32 oldpdb = PL_perldb;
2854                     bool oldn = PL_minus_n;
2855                     bool oldp = PL_minus_p;
2856
2857                     while (*d && !isSPACE(*d)) d++;
2858                     while (SPACE_OR_TAB(*d)) d++;
2859
2860                     if (*d++ == '-') {
2861                         bool switches_done = PL_doswitches;
2862                         do {
2863                             if (*d == 'M' || *d == 'm') {
2864                                 char *m = d;
2865                                 while (*d && !isSPACE(*d)) d++;
2866                                 Perl_croak(aTHX_ "Too late for \"-%.*s\" option",
2867                                       (int)(d - m), m);
2868                             }
2869                             d = moreswitches(d);
2870                         } while (d);
2871                         if (PL_doswitches && !switches_done) {
2872                             int argc = PL_origargc;
2873                             char **argv = PL_origargv;
2874                             do {
2875                                 argc--,argv++;
2876                             } while (argc && argv[0][0] == '-' && argv[0][1]);
2877                             init_argv_symbols(argc,argv);
2878                         }
2879                         if ((PERLDB_LINE && !oldpdb) ||
2880                             ((PL_minus_n || PL_minus_p) && !(oldn || oldp)))
2881                               /* if we have already added "LINE: while (<>) {",
2882                                  we must not do it again */
2883                         {
2884                             sv_setpv(PL_linestr, "");
2885                             PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2886                             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
2887                             PL_last_lop = PL_last_uni = Nullch;
2888                             PL_preambled = FALSE;
2889                             if (PERLDB_LINE)
2890                                 (void)gv_fetchfile(PL_origfilename);
2891                             goto retry;
2892                         }
2893                         if (PL_doswitches && !switches_done) {
2894                             int argc = PL_origargc;
2895                             char **argv = PL_origargv;
2896                             do {
2897                                 argc--,argv++;
2898                             } while (argc && argv[0][0] == '-' && argv[0][1]);
2899                             init_argv_symbols(argc,argv);
2900                         }
2901                     }
2902                 }
2903             }
2904         }
2905         if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
2906             PL_bufptr = s;
2907             PL_lex_state = LEX_FORMLINE;
2908             return yylex();
2909         }
2910         goto retry;
2911     case '\r':
2912 #ifdef PERL_STRICT_CR
2913         Perl_warn(aTHX_ "Illegal character \\%03o (carriage return)", '\r');
2914         Perl_croak(aTHX_
2915       "\t(Maybe you didn't strip carriage returns after a network transfer?)\n");
2916 #endif
2917     case ' ': case '\t': case '\f': case 013:
2918 #ifdef MACOS_TRADITIONAL
2919     case '\312':
2920 #endif
2921         s++;
2922         goto retry;
2923     case '#':
2924     case '\n':
2925         if (PL_lex_state != LEX_NORMAL || (PL_in_eval && !PL_rsfp)) {
2926             if (*s == '#' && s == PL_linestart && PL_in_eval && !PL_rsfp) {
2927                 /* handle eval qq[#line 1 "foo"\n ...] */
2928                 CopLINE_dec(PL_curcop);
2929                 incline(s);
2930             }
2931             d = PL_bufend;
2932             while (s < d && *s != '\n')
2933                 s++;
2934             if (s < d)
2935                 s++;
2936             else if (s > d) /* Found by Ilya: feed random input to Perl. */
2937               Perl_croak(aTHX_ "panic: input overflow");
2938             incline(s);
2939             if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
2940                 PL_bufptr = s;
2941                 PL_lex_state = LEX_FORMLINE;
2942                 return yylex();
2943             }
2944         }
2945         else {
2946             *s = '\0';
2947             PL_bufend = s;
2948         }
2949         goto retry;
2950     case '-':
2951         if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
2952             I32 ftst = 0;
2953
2954             s++;
2955             PL_bufptr = s;
2956             tmp = *s++;
2957
2958             while (s < PL_bufend && SPACE_OR_TAB(*s))
2959                 s++;
2960
2961             if (strnEQ(s,"=>",2)) {
2962                 s = force_word(PL_bufptr,WORD,FALSE,FALSE,FALSE);
2963                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
2964                             "### Saw unary minus before =>, forcing word '%s'\n", s);
2965                 } );
2966                 OPERATOR('-');          /* unary minus */
2967             }
2968             PL_last_uni = PL_oldbufptr;
2969             switch (tmp) {
2970             case 'r': ftst = OP_FTEREAD;        break;
2971             case 'w': ftst = OP_FTEWRITE;       break;
2972             case 'x': ftst = OP_FTEEXEC;        break;
2973             case 'o': ftst = OP_FTEOWNED;       break;
2974             case 'R': ftst = OP_FTRREAD;        break;
2975             case 'W': ftst = OP_FTRWRITE;       break;
2976             case 'X': ftst = OP_FTREXEC;        break;
2977             case 'O': ftst = OP_FTROWNED;       break;
2978             case 'e': ftst = OP_FTIS;           break;
2979             case 'z': ftst = OP_FTZERO;         break;
2980             case 's': ftst = OP_FTSIZE;         break;
2981             case 'f': ftst = OP_FTFILE;         break;
2982             case 'd': ftst = OP_FTDIR;          break;
2983             case 'l': ftst = OP_FTLINK;         break;
2984             case 'p': ftst = OP_FTPIPE;         break;
2985             case 'S': ftst = OP_FTSOCK;         break;
2986             case 'u': ftst = OP_FTSUID;         break;
2987             case 'g': ftst = OP_FTSGID;         break;
2988             case 'k': ftst = OP_FTSVTX;         break;
2989             case 'b': ftst = OP_FTBLK;          break;
2990             case 'c': ftst = OP_FTCHR;          break;
2991             case 't': ftst = OP_FTTTY;          break;
2992             case 'T': ftst = OP_FTTEXT;         break;
2993             case 'B': ftst = OP_FTBINARY;       break;
2994             case 'M': case 'A': case 'C':
2995                 gv_fetchpv("\024",TRUE, SVt_PV);
2996                 switch (tmp) {
2997                 case 'M': ftst = OP_FTMTIME;    break;
2998                 case 'A': ftst = OP_FTATIME;    break;
2999                 case 'C': ftst = OP_FTCTIME;    break;
3000                 default:                        break;
3001                 }
3002                 break;
3003             default:
3004                 break;
3005             }
3006             if (ftst) {
3007                 PL_last_lop_op = (OPCODE)ftst;
3008                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
3009                         "### Saw file test %c\n", (int)ftst);
3010                 } );
3011                 FTST(ftst);
3012             }
3013             else {
3014                 /* Assume it was a minus followed by a one-letter named
3015                  * subroutine call (or a -bareword), then. */
3016                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
3017                         "### '-%c' looked like a file test but was not\n",
3018                         (int) tmp);
3019                 } );
3020                 s = --PL_bufptr;
3021             }
3022         }
3023         tmp = *s++;
3024         if (*s == tmp) {
3025             s++;
3026             if (PL_expect == XOPERATOR)
3027                 TERM(POSTDEC);
3028             else
3029                 OPERATOR(PREDEC);
3030         }
3031         else if (*s == '>') {
3032             s++;
3033             s = skipspace(s);
3034             if (isIDFIRST_lazy_if(s,UTF)) {
3035                 s = force_word(s,METHOD,FALSE,TRUE,FALSE);
3036                 TOKEN(ARROW);
3037             }
3038             else if (*s == '$')
3039                 OPERATOR(ARROW);
3040             else
3041                 TERM(ARROW);
3042         }
3043         if (PL_expect == XOPERATOR)
3044             Aop(OP_SUBTRACT);
3045         else {
3046             if (isSPACE(*s) || !isSPACE(*PL_bufptr))
3047                 check_uni();
3048             OPERATOR('-');              /* unary minus */
3049         }
3050
3051     case '+':
3052         tmp = *s++;
3053         if (*s == tmp) {
3054             s++;
3055             if (PL_expect == XOPERATOR)
3056                 TERM(POSTINC);
3057             else
3058                 OPERATOR(PREINC);
3059         }
3060         if (PL_expect == XOPERATOR)
3061             Aop(OP_ADD);
3062         else {
3063             if (isSPACE(*s) || !isSPACE(*PL_bufptr))
3064                 check_uni();
3065             OPERATOR('+');
3066         }
3067
3068     case '*':
3069         if (PL_expect != XOPERATOR) {
3070             s = scan_ident(s, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
3071             PL_expect = XOPERATOR;
3072             force_ident(PL_tokenbuf, '*');
3073             if (!*PL_tokenbuf)
3074                 PREREF('*');
3075             TERM('*');
3076         }
3077         s++;
3078         if (*s == '*') {
3079             s++;
3080             PWop(OP_POW);
3081         }
3082         Mop(OP_MULTIPLY);
3083
3084     case '%':
3085         if (PL_expect == XOPERATOR) {
3086             ++s;
3087             Mop(OP_MODULO);
3088         }
3089         PL_tokenbuf[0] = '%';
3090         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, TRUE);
3091         if (!PL_tokenbuf[1]) {
3092             PREREF('%');
3093         }
3094         PL_pending_ident = '%';
3095         TERM('%');
3096
3097     case '^':
3098         s++;
3099         BOop(OP_BIT_XOR);
3100     case '[':
3101         PL_lex_brackets++;
3102         /* FALL THROUGH */
3103     case '~':
3104     case ',':
3105         tmp = *s++;
3106         OPERATOR(tmp);
3107     case ':':
3108         if (s[1] == ':') {
3109             len = 0;
3110             goto just_a_word;
3111         }
3112         s++;
3113         switch (PL_expect) {
3114             OP *attrs;
3115         case XOPERATOR:
3116             if (!PL_in_my || PL_lex_state != LEX_NORMAL)
3117                 break;
3118             PL_bufptr = s;      /* update in case we back off */
3119             goto grabattrs;
3120         case XATTRBLOCK:
3121             PL_expect = XBLOCK;
3122             goto grabattrs;
3123         case XATTRTERM:
3124             PL_expect = XTERMBLOCK;
3125          grabattrs:
3126             s = skipspace(s);
3127             attrs = Nullop;
3128             while (isIDFIRST_lazy_if(s,UTF)) {
3129                 d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
3130                 if (isLOWER(*s) && (tmp = keyword(PL_tokenbuf, len))) {
3131                     if (tmp < 0) tmp = -tmp;
3132                     switch (tmp) {
3133                     case KEY_or:
3134                     case KEY_and:
3135                     case KEY_err:
3136                     case KEY_for:
3137                     case KEY_unless:
3138                     case KEY_if:
3139                     case KEY_while:
3140                     case KEY_until:
3141                         goto got_attrs;
3142                     default:
3143                         break;
3144                     }
3145                 }
3146                 if (*d == '(') {
3147                     d = scan_str(d,TRUE,TRUE);
3148                     if (!d) {
3149                         /* MUST advance bufptr here to avoid bogus
3150                            "at end of line" context messages from yyerror().
3151                          */
3152                         PL_bufptr = s + len;
3153                         yyerror("Unterminated attribute parameter in attribute list");
3154                         if (attrs)
3155                             op_free(attrs);
3156                         return REPORT(0);       /* EOF indicator */
3157                     }
3158                 }
3159                 if (PL_lex_stuff) {
3160                     SV *sv = newSVpvn(s, len);
3161                     sv_catsv(sv, PL_lex_stuff);
3162                     attrs = append_elem(OP_LIST, attrs,
3163                                         newSVOP(OP_CONST, 0, sv));
3164                     SvREFCNT_dec(PL_lex_stuff);
3165                     PL_lex_stuff = Nullsv;
3166                 }
3167                 else {
3168                     if (len == 6 && strnEQ(s, "unique", len)) {
3169                         if (PL_in_my == KEY_our)
3170 #ifdef USE_ITHREADS
3171                             GvUNIQUE_on(cGVOPx_gv(yylval.opval));
3172 #else
3173                             ; /* skip to avoid loading attributes.pm */
3174 #endif
3175                         else 
3176                             Perl_croak(aTHX_ "The 'unique' attribute may only be applied to 'our' variables");
3177                     }
3178
3179                     /* NOTE: any CV attrs applied here need to be part of
3180                        the CVf_BUILTIN_ATTRS define in cv.h! */
3181                     else if (!PL_in_my && len == 6 && strnEQ(s, "lvalue", len))
3182                         CvLVALUE_on(PL_compcv);
3183                     else if (!PL_in_my && len == 6 && strnEQ(s, "locked", len))
3184                         CvLOCKED_on(PL_compcv);
3185                     else if (!PL_in_my && len == 6 && strnEQ(s, "method", len))
3186                         CvMETHOD_on(PL_compcv);
3187                     else if (!PL_in_my && len == 9 && strnEQ(s, "assertion", len))
3188                         CvASSERTION_on(PL_compcv);
3189                     /* After we've set the flags, it could be argued that
3190                        we don't need to do the attributes.pm-based setting
3191                        process, and shouldn't bother appending recognized
3192                        flags.  To experiment with that, uncomment the
3193                        following "else".  (Note that's already been
3194                        uncommented.  That keeps the above-applied built-in
3195                        attributes from being intercepted (and possibly
3196                        rejected) by a package's attribute routines, but is
3197                        justified by the performance win for the common case
3198                        of applying only built-in attributes.) */
3199                     else
3200                         attrs = append_elem(OP_LIST, attrs,
3201                                             newSVOP(OP_CONST, 0,
3202                                                     newSVpvn(s, len)));
3203                 }
3204                 s = skipspace(d);
3205                 if (*s == ':' && s[1] != ':')
3206                     s = skipspace(s+1);
3207                 else if (s == d)
3208                     break;      /* require real whitespace or :'s */
3209             }
3210             tmp = (PL_expect == XOPERATOR ? '=' : '{'); /*'}(' for vi */
3211             if (*s != ';' && *s != '}' && *s != tmp && (tmp != '=' || *s != ')')) {
3212                 char q = ((*s == '\'') ? '"' : '\'');
3213                 /* If here for an expression, and parsed no attrs, back off. */
3214                 if (tmp == '=' && !attrs) {
3215                     s = PL_bufptr;
3216                     break;
3217                 }
3218                 /* MUST advance bufptr here to avoid bogus "at end of line"
3219                    context messages from yyerror().
3220                  */
3221                 PL_bufptr = s;
3222                 if (!*s)
3223                     yyerror("Unterminated attribute list");
3224                 else
3225                     yyerror(Perl_form(aTHX_ "Invalid separator character %c%c%c in attribute list",
3226                                       q, *s, q));
3227                 if (attrs)
3228                     op_free(attrs);
3229                 OPERATOR(':');
3230             }
3231         got_attrs:
3232             if (attrs) {
3233                 PL_nextval[PL_nexttoke].opval = attrs;
3234                 force_next(THING);
3235             }
3236             TOKEN(COLONATTR);
3237         }
3238         OPERATOR(':');
3239     case '(':
3240         s++;
3241         if (PL_last_lop == PL_oldoldbufptr || PL_last_uni == PL_oldoldbufptr)
3242             PL_oldbufptr = PL_oldoldbufptr;             /* allow print(STDOUT 123) */
3243         else
3244             PL_expect = XTERM;
3245         s = skipspace(s);
3246         TOKEN('(');
3247     case ';':
3248         CLINE;
3249         tmp = *s++;
3250         OPERATOR(tmp);
3251     case ')':
3252         tmp = *s++;
3253         s = skipspace(s);
3254         if (*s == '{')
3255             PREBLOCK(tmp);
3256         TERM(tmp);
3257     case ']':
3258         s++;
3259         if (PL_lex_brackets <= 0)
3260             yyerror("Unmatched right square bracket");
3261         else
3262             --PL_lex_brackets;
3263         if (PL_lex_state == LEX_INTERPNORMAL) {
3264             if (PL_lex_brackets == 0) {
3265                 if (*s != '[' && *s != '{' && (*s != '-' || s[1] != '>'))
3266                     PL_lex_state = LEX_INTERPEND;
3267             }
3268         }
3269         TERM(']');
3270     case '{':
3271       leftbracket:
3272         s++;
3273         if (PL_lex_brackets > 100) {
3274             Renew(PL_lex_brackstack, PL_lex_brackets + 10, char);
3275         }
3276         switch (PL_expect) {
3277         case XTERM:
3278             if (PL_lex_formbrack) {
3279                 s--;
3280                 PRETERMBLOCK(DO);
3281             }
3282             if (PL_oldoldbufptr == PL_last_lop)
3283                 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
3284             else
3285                 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
3286             OPERATOR(HASHBRACK);
3287         case XOPERATOR:
3288             while (s < PL_bufend && SPACE_OR_TAB(*s))
3289                 s++;
3290             d = s;
3291             PL_tokenbuf[0] = '\0';
3292             if (d < PL_bufend && *d == '-') {
3293                 PL_tokenbuf[0] = '-';
3294                 d++;
3295                 while (d < PL_bufend && SPACE_OR_TAB(*d))
3296                     d++;
3297             }
3298             if (d < PL_bufend && isIDFIRST_lazy_if(d,UTF)) {
3299                 d = scan_word(d, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
3300                               FALSE, &len);
3301                 while (d < PL_bufend && SPACE_OR_TAB(*d))
3302                     d++;
3303                 if (*d == '}') {
3304                     char minus = (PL_tokenbuf[0] == '-');
3305                     s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
3306                     if (minus)
3307                         force_next('-');
3308                 }
3309             }
3310             /* FALL THROUGH */
3311         case XATTRBLOCK:
3312         case XBLOCK:
3313             PL_lex_brackstack[PL_lex_brackets++] = XSTATE;
3314             PL_expect = XSTATE;
3315             break;
3316         case XATTRTERM:
3317         case XTERMBLOCK:
3318             PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
3319             PL_expect = XSTATE;
3320             break;
3321         default: {
3322                 char *t;
3323                 if (PL_oldoldbufptr == PL_last_lop)
3324                     PL_lex_brackstack[PL_lex_brackets++] = XTERM;
3325                 else
3326                     PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
3327                 s = skipspace(s);
3328                 if (*s == '}') {
3329                     if (PL_expect == XREF && PL_lex_state == LEX_INTERPNORMAL) {
3330                         PL_expect = XTERM;
3331                         /* This hack is to get the ${} in the message. */
3332                         PL_bufptr = s+1;
3333                         yyerror("syntax error");
3334                         break;
3335                     }
3336                     OPERATOR(HASHBRACK);
3337                 }
3338                 /* This hack serves to disambiguate a pair of curlies
3339                  * as being a block or an anon hash.  Normally, expectation
3340                  * determines that, but in cases where we're not in a
3341                  * position to expect anything in particular (like inside
3342                  * eval"") we have to resolve the ambiguity.  This code
3343                  * covers the case where the first term in the curlies is a
3344                  * quoted string.  Most other cases need to be explicitly
3345                  * disambiguated by prepending a `+' before the opening
3346                  * curly in order to force resolution as an anon hash.
3347                  *
3348                  * XXX should probably propagate the outer expectation
3349                  * into eval"" to rely less on this hack, but that could
3350                  * potentially break current behavior of eval"".
3351                  * GSAR 97-07-21
3352                  */
3353                 t = s;
3354                 if (*s == '\'' || *s == '"' || *s == '`') {
3355                     /* common case: get past first string, handling escapes */
3356                     for (t++; t < PL_bufend && *t != *s;)
3357                         if (*t++ == '\\' && (*t == '\\' || *t == *s))
3358                             t++;
3359                     t++;
3360                 }
3361                 else if (*s == 'q') {
3362                     if (++t < PL_bufend
3363                         && (!isALNUM(*t)
3364                             || ((*t == 'q' || *t == 'x') && ++t < PL_bufend
3365                                 && !isALNUM(*t))))
3366                     {
3367                         /* skip q//-like construct */
3368                         char *tmps;
3369                         char open, close, term;
3370                         I32 brackets = 1;
3371
3372                         while (t < PL_bufend && isSPACE(*t))
3373                             t++;
3374                         /* check for q => */
3375                         if (t+1 < PL_bufend && t[0] == '=' && t[1] == '>') {
3376                             OPERATOR(HASHBRACK);
3377                         }
3378                         term = *t;
3379                         open = term;
3380                         if (term && (tmps = strchr("([{< )]}> )]}>",term)))
3381                             term = tmps[5];
3382                         close = term;
3383                         if (open == close)
3384                             for (t++; t < PL_bufend; t++) {
3385                                 if (*t == '\\' && t+1 < PL_bufend && open != '\\')
3386                                     t++;
3387                                 else if (*t == open)
3388                                     break;
3389                             }
3390                         else {
3391                             for (t++; t < PL_bufend; t++) {
3392                                 if (*t == '\\' && t+1 < PL_bufend)
3393                                     t++;
3394                                 else if (*t == close && --brackets <= 0)
3395                                     break;
3396                                 else if (*t == open)
3397                                     brackets++;
3398                             }
3399                         }
3400                         t++;
3401                     }
3402                     else
3403                         /* skip plain q word */
3404                         while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
3405                              t += UTF8SKIP(t);
3406                 }
3407                 else if (isALNUM_lazy_if(t,UTF)) {
3408                     t += UTF8SKIP(t);
3409                     while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
3410                          t += UTF8SKIP(t);
3411                 }
3412                 while (t < PL_bufend && isSPACE(*t))
3413                     t++;
3414                 /* if comma follows first term, call it an anon hash */
3415                 /* XXX it could be a comma expression with loop modifiers */
3416                 if (t < PL_bufend && ((*t == ',' && (*s == 'q' || !isLOWER(*s)))
3417                                    || (*t == '=' && t[1] == '>')))
3418                     OPERATOR(HASHBRACK);
3419                 if (PL_expect == XREF)
3420                     PL_expect = XTERM;
3421                 else {
3422                     PL_lex_brackstack[PL_lex_brackets-1] = XSTATE;
3423                     PL_expect = XSTATE;
3424                 }
3425             }
3426             break;
3427         }
3428         yylval.ival = CopLINE(PL_curcop);
3429         if (isSPACE(*s) || *s == '#')
3430             PL_copline = NOLINE;   /* invalidate current command line number */
3431         TOKEN('{');
3432     case '}':
3433       rightbracket:
3434         s++;
3435         if (PL_lex_brackets <= 0)
3436             yyerror("Unmatched right curly bracket");
3437         else
3438             PL_expect = (expectation)PL_lex_brackstack[--PL_lex_brackets];
3439         if (PL_lex_brackets < PL_lex_formbrack && PL_lex_state != LEX_INTERPNORMAL)
3440             PL_lex_formbrack = 0;
3441         if (PL_lex_state == LEX_INTERPNORMAL) {
3442             if (PL_lex_brackets == 0) {
3443                 if (PL_expect & XFAKEBRACK) {
3444                     PL_expect &= XENUMMASK;
3445                     PL_lex_state = LEX_INTERPEND;
3446                     PL_bufptr = s;
3447                     return yylex();     /* ignore fake brackets */
3448                 }
3449                 if (*s == '-' && s[1] == '>')
3450                     PL_lex_state = LEX_INTERPENDMAYBE;
3451                 else if (*s != '[' && *s != '{')
3452                     PL_lex_state = LEX_INTERPEND;
3453             }
3454         }
3455         if (PL_expect & XFAKEBRACK) {
3456             PL_expect &= XENUMMASK;
3457             PL_bufptr = s;
3458             return yylex();             /* ignore fake brackets */
3459         }
3460         force_next('}');
3461         TOKEN(';');
3462     case '&':
3463         s++;
3464         tmp = *s++;
3465         if (tmp == '&')
3466             AOPERATOR(ANDAND);
3467         s--;
3468         if (PL_expect == XOPERATOR) {
3469             if (ckWARN(WARN_SEMICOLON)
3470                 && isIDFIRST_lazy_if(s,UTF) && PL_bufptr == PL_linestart)
3471             {
3472                 CopLINE_dec(PL_curcop);
3473                 Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), PL_warn_nosemi);
3474                 CopLINE_inc(PL_curcop);
3475             }
3476             BAop(OP_BIT_AND);
3477         }
3478
3479         s = scan_ident(s - 1, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
3480         if (*PL_tokenbuf) {
3481             PL_expect = XOPERATOR;
3482             force_ident(PL_tokenbuf, '&');
3483         }
3484         else
3485             PREREF('&');
3486         yylval.ival = (OPpENTERSUB_AMPER<<8);
3487         TERM('&');
3488
3489     case '|':
3490         s++;
3491         tmp = *s++;
3492         if (tmp == '|')
3493             AOPERATOR(OROR);
3494         s--;
3495         BOop(OP_BIT_OR);
3496     case '=':
3497         s++;
3498         tmp = *s++;
3499         if (tmp == '=')
3500             Eop(OP_EQ);
3501         if (tmp == '>')
3502             OPERATOR(',');
3503         if (tmp == '~')
3504             PMop(OP_MATCH);
3505         if (ckWARN(WARN_SYNTAX) && tmp && isSPACE(*s) && strchr("+-*/%.^&|<",tmp))
3506             Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Reversed %c= operator",(int)tmp);
3507         s--;
3508         if (PL_expect == XSTATE && isALPHA(tmp) &&
3509                 (s == PL_linestart+1 || s[-2] == '\n') )
3510         {
3511             if (PL_in_eval && !PL_rsfp) {
3512                 d = PL_bufend;
3513                 while (s < d) {
3514                     if (*s++ == '\n') {
3515                         incline(s);
3516                         if (strnEQ(s,"=cut",4)) {
3517                             s = strchr(s,'\n');
3518                             if (s)
3519                                 s++;
3520                             else
3521                                 s = d;
3522                             incline(s);
3523                             goto retry;
3524                         }
3525                     }
3526                 }
3527                 goto retry;
3528             }
3529             s = PL_bufend;
3530             PL_doextract = TRUE;
3531             goto retry;
3532         }
3533         if (PL_lex_brackets < PL_lex_formbrack) {
3534             char *t;
3535 #ifdef PERL_STRICT_CR
3536             for (t = s; SPACE_OR_TAB(*t); t++) ;
3537 #else
3538             for (t = s; SPACE_OR_TAB(*t) || *t == '\r'; t++) ;
3539 #endif
3540             if (*t == '\n' || *t == '#') {
3541                 s--;
3542                 PL_expect = XBLOCK;
3543                 goto leftbracket;
3544             }
3545         }
3546         yylval.ival = 0;
3547         OPERATOR(ASSIGNOP);
3548     case '!':
3549         s++;
3550         tmp = *s++;
3551         if (tmp == '=') {
3552             /* was this !=~ where !~ was meant?
3553              * warn on m:!=~\s+([/?]|[msy]\W|tr\W): */
3554
3555             if (*s == '~' && ckWARN(WARN_SYNTAX)) {
3556                 char *t = s+1;
3557
3558                 while (t < PL_bufend && isSPACE(*t))
3559                     ++t;
3560
3561                 if (*t == '/' || *t == '?' ||
3562                     ((*t == 'm' || *t == 's' || *t == 'y') && !isALNUM(t[1])) ||
3563                     (*t == 't' && t[1] == 'r' && !isALNUM(t[2])))
3564                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
3565                                 "!=~ should be !~");
3566             }
3567             Eop(OP_NE);
3568         }
3569         if (tmp == '~')
3570             PMop(OP_NOT);
3571         s--;
3572         OPERATOR('!');
3573     case '<':
3574         if (PL_expect != XOPERATOR) {
3575             if (s[1] != '<' && !strchr(s,'>'))
3576                 check_uni();
3577             if (s[1] == '<')
3578                 s = scan_heredoc(s);
3579             else
3580                 s = scan_inputsymbol(s);
3581             TERM(sublex_start());
3582         }
3583         s++;
3584         tmp = *s++;
3585         if (tmp == '<')
3586             SHop(OP_LEFT_SHIFT);
3587         if (tmp == '=') {
3588             tmp = *s++;
3589             if (tmp == '>')
3590                 Eop(OP_NCMP);
3591             s--;
3592             Rop(OP_LE);
3593         }
3594         s--;
3595         Rop(OP_LT);
3596     case '>':
3597         s++;
3598         tmp = *s++;
3599         if (tmp == '>')
3600             SHop(OP_RIGHT_SHIFT);
3601         if (tmp == '=')
3602             Rop(OP_GE);
3603         s--;
3604         Rop(OP_GT);
3605
3606     case '$':
3607         CLINE;
3608
3609         if (PL_expect == XOPERATOR) {
3610             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3611                 PL_expect = XTERM;
3612                 depcom();
3613                 return REPORT(','); /* grandfather non-comma-format format */
3614             }
3615         }
3616
3617         if (s[1] == '#' && (isIDFIRST_lazy_if(s+2,UTF) || strchr("{$:+-", s[2]))) {
3618             PL_tokenbuf[0] = '@';
3619             s = scan_ident(s + 1, PL_bufend, PL_tokenbuf + 1,
3620                            sizeof PL_tokenbuf - 1, FALSE);
3621             if (PL_expect == XOPERATOR)
3622                 no_op("Array length", s);
3623             if (!PL_tokenbuf[1])
3624                 PREREF(DOLSHARP);
3625             PL_expect = XOPERATOR;
3626             PL_pending_ident = '#';
3627             TOKEN(DOLSHARP);
3628         }
3629
3630         PL_tokenbuf[0] = '$';
3631         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
3632                        sizeof PL_tokenbuf - 1, FALSE);
3633         if (PL_expect == XOPERATOR)
3634             no_op("Scalar", s);
3635         if (!PL_tokenbuf[1]) {
3636             if (s == PL_bufend)
3637                 yyerror("Final $ should be \\$ or $name");
3638             PREREF('$');
3639         }
3640
3641         /* This kludge not intended to be bulletproof. */
3642         if (PL_tokenbuf[1] == '[' && !PL_tokenbuf[2]) {
3643             yylval.opval = newSVOP(OP_CONST, 0,
3644                                    newSViv(PL_compiling.cop_arybase));
3645             yylval.opval->op_private = OPpCONST_ARYBASE;
3646             TERM(THING);
3647         }
3648
3649         d = s;
3650         tmp = (I32)*s;
3651         if (PL_lex_state == LEX_NORMAL)
3652             s = skipspace(s);
3653
3654         if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
3655             char *t;
3656             if (*s == '[') {
3657                 PL_tokenbuf[0] = '@';
3658                 if (ckWARN(WARN_SYNTAX)) {
3659                     for(t = s + 1;
3660                         isSPACE(*t) || isALNUM_lazy_if(t,UTF) || *t == '$';
3661                         t++) ;
3662                     if (*t++ == ',') {
3663                         PL_bufptr = skipspace(PL_bufptr);
3664                         while (t < PL_bufend && *t != ']')
3665                             t++;
3666                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
3667                                 "Multidimensional syntax %.*s not supported",
3668                                 (t - PL_bufptr) + 1, PL_bufptr);
3669                     }
3670                 }
3671             }
3672             else if (*s == '{') {
3673                 PL_tokenbuf[0] = '%';
3674                 if (ckWARN(WARN_SYNTAX) && strEQ(PL_tokenbuf+1, "SIG") &&
3675                     (t = strchr(s, '}')) && (t = strchr(t, '=')))
3676                 {
3677                     char tmpbuf[sizeof PL_tokenbuf];
3678                     STRLEN len;
3679                     for (t++; isSPACE(*t); t++) ;
3680                     if (isIDFIRST_lazy_if(t,UTF)) {
3681                         t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE, &len);
3682                         for (; isSPACE(*t); t++) ;
3683                         if (*t == ';' && get_cv(tmpbuf, FALSE))
3684                             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
3685                                 "You need to quote \"%s\"", tmpbuf);
3686                     }
3687                 }
3688             }
3689         }
3690
3691         PL_expect = XOPERATOR;
3692         if (PL_lex_state == LEX_NORMAL && isSPACE((char)tmp)) {
3693             bool islop = (PL_last_lop == PL_oldoldbufptr);
3694             if (!islop || PL_last_lop_op == OP_GREPSTART)
3695                 PL_expect = XOPERATOR;
3696             else if (strchr("$@\"'`q", *s))
3697                 PL_expect = XTERM;              /* e.g. print $fh "foo" */
3698             else if (strchr("&*<%", *s) && isIDFIRST_lazy_if(s+1,UTF))
3699                 PL_expect = XTERM;              /* e.g. print $fh &sub */
3700             else if (isIDFIRST_lazy_if(s,UTF)) {
3701                 char tmpbuf[sizeof PL_tokenbuf];
3702                 scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
3703                 if ((tmp = keyword(tmpbuf, len))) {
3704                     /* binary operators exclude handle interpretations */
3705                     switch (tmp) {
3706                     case -KEY_x:
3707                     case -KEY_eq:
3708                     case -KEY_ne:
3709                     case -KEY_gt:
3710                     case -KEY_lt:
3711                     case -KEY_ge:
3712                     case -KEY_le:
3713                     case -KEY_cmp:
3714                         break;
3715                     default:
3716                         PL_expect = XTERM;      /* e.g. print $fh length() */
3717                         break;
3718                     }
3719                 }
3720                 else {
3721                     PL_expect = XTERM;          /* e.g. print $fh subr() */
3722                 }
3723             }
3724             else if (isDIGIT(*s))
3725                 PL_expect = XTERM;              /* e.g. print $fh 3 */
3726             else if (*s == '.' && isDIGIT(s[1]))
3727                 PL_expect = XTERM;              /* e.g. print $fh .3 */
3728             else if ((*s == '?' || *s == '-' || *s == '+')
3729                      && !isSPACE(s[1]) && s[1] != '=')
3730                 PL_expect = XTERM;              /* e.g. print $fh -1 */
3731             else if (*s == '/' && !isSPACE(s[1]) && s[1] != '=' && s[1] != '/')
3732                 PL_expect = XTERM;              /* e.g. print $fh /.../
3733                                                  XXX except DORDOR operator */
3734             else if (*s == '<' && s[1] == '<' && !isSPACE(s[2]) && s[2] != '=')
3735                 PL_expect = XTERM;              /* print $fh <<"EOF" */
3736         }
3737         PL_pending_ident = '$';
3738         TOKEN('$');
3739
3740     case '@':
3741         if (PL_expect == XOPERATOR)
3742             no_op("Array", s);
3743         PL_tokenbuf[0] = '@';
3744         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, FALSE);
3745         if (!PL_tokenbuf[1]) {
3746             PREREF('@');
3747         }
3748         if (PL_lex_state == LEX_NORMAL)
3749             s = skipspace(s);
3750         if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
3751             if (*s == '{')
3752                 PL_tokenbuf[0] = '%';
3753
3754             /* Warn about @ where they meant $. */
3755             if (ckWARN(WARN_SYNTAX)) {
3756                 if (*s == '[' || *s == '{') {
3757                     char *t = s + 1;
3758                     while (*t && (isALNUM_lazy_if(t,UTF) || strchr(" \t$#+-'\"", *t)))
3759                         t++;
3760                     if (*t == '}' || *t == ']') {
3761                         t++;
3762                         PL_bufptr = skipspace(PL_bufptr);
3763                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
3764                             "Scalar value %.*s better written as $%.*s",
3765                             t-PL_bufptr, PL_bufptr, t-PL_bufptr-1, PL_bufptr+1);
3766                     }
3767                 }
3768             }
3769         }
3770         PL_pending_ident = '@';
3771         TERM('@');
3772
3773      case '/':                  /* may be division, defined-or, or pattern */
3774         if (PL_expect == XTERMORDORDOR && s[1] == '/') {
3775             s += 2;
3776             AOPERATOR(DORDOR);
3777         }
3778      case '?':                  /* may either be conditional or pattern */
3779          if(PL_expect == XOPERATOR) {
3780              tmp = *s++;
3781              if(tmp == '?') {
3782                   OPERATOR('?');
3783              }
3784              else {
3785                  tmp = *s++;
3786                  if(tmp == '/') {
3787                      /* A // operator. */
3788                     AOPERATOR(DORDOR);
3789                  }
3790                  else {
3791                      s--;
3792                      Mop(OP_DIVIDE);
3793                  }
3794              }
3795          }
3796          else {
3797              /* Disable warning on "study /blah/" */
3798              if (PL_oldoldbufptr == PL_last_uni
3799               && (*PL_last_uni != 's' || s - PL_last_uni < 5
3800                   || memNE(PL_last_uni, "study", 5)
3801                   || isALNUM_lazy_if(PL_last_uni+5,UTF)
3802               ))
3803                  check_uni();
3804              s = scan_pat(s,OP_MATCH);
3805              TERM(sublex_start());
3806          }
3807
3808     case '.':
3809         if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack
3810 #ifdef PERL_STRICT_CR
3811             && s[1] == '\n'
3812 #else
3813             && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n'))
3814 #endif
3815             && (s == PL_linestart || s[-1] == '\n') )
3816         {
3817             PL_lex_formbrack = 0;
3818             PL_expect = XSTATE;
3819             goto rightbracket;
3820         }
3821         if (PL_expect == XOPERATOR || !isDIGIT(s[1])) {
3822             tmp = *s++;
3823             if (*s == tmp) {
3824                 s++;
3825                 if (*s == tmp) {
3826                     s++;
3827                     yylval.ival = OPf_SPECIAL;
3828                 }
3829                 else
3830                     yylval.ival = 0;
3831                 OPERATOR(DOTDOT);
3832             }
3833             if (PL_expect != XOPERATOR)
3834                 check_uni();
3835             Aop(OP_CONCAT);
3836         }
3837         /* FALL THROUGH */
3838     case '0': case '1': case '2': case '3': case '4':
3839     case '5': case '6': case '7': case '8': case '9':
3840         s = scan_num(s, &yylval);
3841         DEBUG_T( { PerlIO_printf(Perl_debug_log,
3842                     "### Saw number in '%s'\n", s);
3843         } );
3844         if (PL_expect == XOPERATOR)
3845             no_op("Number",s);
3846         TERM(THING);
3847
3848     case '\'':
3849         s = scan_str(s,FALSE,FALSE);
3850         DEBUG_T( { PerlIO_printf(Perl_debug_log,
3851                     "### Saw string before '%s'\n", s);
3852         } );
3853         if (PL_expect == XOPERATOR) {
3854             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3855                 PL_expect = XTERM;
3856                 depcom();
3857                 return REPORT(','); /* grandfather non-comma-format format */
3858             }
3859             else
3860                 no_op("String",s);
3861         }
3862         if (!s)
3863             missingterm((char*)0);
3864         yylval.ival = OP_CONST;
3865         TERM(sublex_start());
3866
3867     case '"':
3868         s = scan_str(s,FALSE,FALSE);
3869         DEBUG_T( { PerlIO_printf(Perl_debug_log,
3870                     "### Saw string before '%s'\n", s);
3871         } );
3872         if (PL_expect == XOPERATOR) {
3873             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3874                 PL_expect = XTERM;
3875                 depcom();
3876                 return REPORT(','); /* grandfather non-comma-format format */
3877             }
3878             else
3879                 no_op("String",s);
3880         }
3881         if (!s)
3882             missingterm((char*)0);
3883         yylval.ival = OP_CONST;
3884         for (d = SvPV(PL_lex_stuff, len); len; len--, d++) {
3885             if (*d == '$' || *d == '@' || *d == '\\' || !UTF8_IS_INVARIANT((U8)*d)) {
3886                 yylval.ival = OP_STRINGIFY;
3887                 break;
3888             }
3889         }
3890         TERM(sublex_start());
3891
3892     case '`':
3893         s = scan_str(s,FALSE,FALSE);
3894         DEBUG_T( { PerlIO_printf(Perl_debug_log,
3895                     "### Saw backtick string before '%s'\n", s);
3896         } );
3897         if (PL_expect == XOPERATOR)
3898             no_op("Backticks",s);
3899         if (!s)
3900             missingterm((char*)0);
3901         yylval.ival = OP_BACKTICK;
3902         set_csh();
3903         TERM(sublex_start());
3904
3905     case '\\':
3906         s++;
3907         if (ckWARN(WARN_SYNTAX) && PL_lex_inwhat && isDIGIT(*s))
3908             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),"Can't use \\%c to mean $%c in expression",
3909                         *s, *s);
3910         if (PL_expect == XOPERATOR)
3911             no_op("Backslash",s);
3912         OPERATOR(REFGEN);
3913
3914     case 'v':
3915         if (isDIGIT(s[1]) && PL_expect != XOPERATOR) {
3916             char *start = s;
3917             start++;
3918             start++;
3919             while (isDIGIT(*start) || *start == '_')
3920                 start++;
3921             if (*start == '.' && isDIGIT(start[1])) {
3922                 s = scan_num(s, &yylval);
3923                 TERM(THING);
3924             }
3925             /* avoid v123abc() or $h{v1}, allow C<print v10;> */
3926             else if (!isALPHA(*start) && (PL_expect == XTERM
3927                         || PL_expect == XREF || PL_expect == XSTATE
3928                         || PL_expect == XTERMORDORDOR)) {
3929                 char c = *start;
3930                 GV *gv;
3931                 *start = '\0';
3932                 gv = gv_fetchpv(s, FALSE, SVt_PVCV);
3933                 *start = c;
3934                 if (!gv) {
3935                     s = scan_num(s, &yylval);
3936                     TERM(THING);
3937                 }
3938             }
3939         }
3940         goto keylookup;
3941     case 'x':
3942         if (isDIGIT(s[1]) && PL_expect == XOPERATOR) {
3943             s++;
3944             Mop(OP_REPEAT);
3945         }
3946         goto keylookup;
3947
3948     case '_':
3949     case 'a': case 'A':
3950     case 'b': case 'B':
3951     case 'c': case 'C':
3952     case 'd': case 'D':
3953     case 'e': case 'E':
3954     case 'f': case 'F':
3955     case 'g': case 'G':
3956     case 'h': case 'H':
3957     case 'i': case 'I':
3958     case 'j': case 'J':
3959     case 'k': case 'K':
3960     case 'l': case 'L':
3961     case 'm': case 'M':
3962     case 'n': case 'N':
3963     case 'o': case 'O':
3964     case 'p': case 'P':
3965     case 'q': case 'Q':
3966     case 'r': case 'R':
3967     case 's': case 'S':
3968     case 't': case 'T':
3969     case 'u': case 'U':
3970               case 'V':
3971     case 'w': case 'W':
3972               case 'X':
3973     case 'y': case 'Y':
3974     case 'z': case 'Z':
3975
3976       keylookup: {
3977         orig_keyword = 0;
3978         gv = Nullgv;
3979         gvp = 0;
3980
3981         PL_bufptr = s;
3982         s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
3983
3984         /* Some keywords can be followed by any delimiter, including ':' */
3985         tmp = ((len == 1 && strchr("msyq", PL_tokenbuf[0])) ||
3986                (len == 2 && ((PL_tokenbuf[0] == 't' && PL_tokenbuf[1] == 'r') ||
3987                              (PL_tokenbuf[0] == 'q' &&
3988                               strchr("qwxr", PL_tokenbuf[1])))));
3989
3990         /* x::* is just a word, unless x is "CORE" */
3991         if (!tmp && *s == ':' && s[1] == ':' && strNE(PL_tokenbuf, "CORE"))
3992             goto just_a_word;
3993
3994         d = s;
3995         while (d < PL_bufend && isSPACE(*d))
3996                 d++;    /* no comments skipped here, or s### is misparsed */
3997
3998         /* Is this a label? */
3999         if (!tmp && PL_expect == XSTATE
4000               && d < PL_bufend && *d == ':' && *(d + 1) != ':') {
4001             s = d + 1;
4002             yylval.pval = savepv(PL_tokenbuf);
4003             CLINE;
4004             TOKEN(LABEL);
4005         }
4006
4007         /* Check for keywords */
4008         tmp = keyword(PL_tokenbuf, len);
4009
4010         /* Is this a word before a => operator? */
4011         if (*d == '=' && d[1] == '>') {
4012             CLINE;
4013             yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(PL_tokenbuf,0));
4014             yylval.opval->op_private = OPpCONST_BARE;
4015             if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
4016               SvUTF8_on(((SVOP*)yylval.opval)->op_sv);
4017             TERM(WORD);
4018         }
4019
4020         if (tmp < 0) {                  /* second-class keyword? */
4021             GV *ogv = Nullgv;   /* override (winner) */
4022             GV *hgv = Nullgv;   /* hidden (loser) */
4023             if (PL_expect != XOPERATOR && (*s != ':' || s[1] != ':')) {
4024                 CV *cv;
4025                 if ((gv = gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVCV)) &&
4026                     (cv = GvCVu(gv)))
4027                 {
4028                     if (GvIMPORTED_CV(gv))
4029                         ogv = gv;
4030                     else if (! CvMETHOD(cv))
4031                         hgv = gv;
4032                 }
4033                 if (!ogv &&
4034                     (gvp = (GV**)hv_fetch(PL_globalstash,PL_tokenbuf,len,FALSE)) &&
4035                     (gv = *gvp) != (GV*)&PL_sv_undef &&
4036                     GvCVu(gv) && GvIMPORTED_CV(gv))
4037                 {
4038                     ogv = gv;
4039                 }
4040             }
4041             if (ogv) {
4042                 orig_keyword = tmp;
4043                 tmp = 0;                /* overridden by import or by GLOBAL */
4044             }
4045             else if (gv && !gvp
4046                      && -tmp==KEY_lock  /* XXX generalizable kludge */
4047                      && GvCVu(gv)
4048                      && !hv_fetch(GvHVn(PL_incgv), "Thread.pm", 9, FALSE))
4049             {
4050                 tmp = 0;                /* any sub overrides "weak" keyword */
4051             }
4052             else if (gv && !gvp
4053                     && tmp == -KEY_err
4054                     && GvCVu(gv)
4055                     && PL_expect != XOPERATOR
4056                     && PL_expect != XTERMORDORDOR)
4057             {
4058                 /* any sub overrides the "err" keyword, except when really an
4059                  * operator is expected */
4060                 tmp = 0;
4061             }
4062             else {                      /* no override */
4063                 tmp = -tmp;
4064                 if (tmp == KEY_dump && ckWARN(WARN_MISC)) {
4065                     Perl_warner(aTHX_ packWARN(WARN_MISC),
4066                             "dump() better written as CORE::dump()");
4067                 }
4068                 gv = Nullgv;
4069                 gvp = 0;
4070                 if (ckWARN(WARN_AMBIGUOUS) && hgv
4071                     && tmp != KEY_x && tmp != KEY_CORE) /* never ambiguous */
4072                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
4073                         "Ambiguous call resolved as CORE::%s(), %s",
4074                          GvENAME(hgv), "qualify as such or use &");
4075             }
4076         }
4077
4078       reserved_word:
4079         switch (tmp) {
4080
4081         default:                        /* not a keyword */
4082           just_a_word: {
4083                 SV *sv;
4084                 int pkgname = 0;
4085                 char lastchar = (PL_bufptr == PL_oldoldbufptr ? 0 : PL_bufptr[-1]);
4086
4087                 /* Get the rest if it looks like a package qualifier */
4088
4089                 if (*s == '\'' || (*s == ':' && s[1] == ':')) {
4090                     STRLEN morelen;
4091                     s = scan_word(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len,
4092                                   TRUE, &morelen);
4093                     if (!morelen)
4094                         Perl_croak(aTHX_ "Bad name after %s%s", PL_tokenbuf,
4095                                 *s == '\'' ? "'" : "::");
4096                     len += morelen;
4097                     pkgname = 1;
4098                 }
4099
4100                 if (PL_expect == XOPERATOR) {
4101                     if (PL_bufptr == PL_linestart) {
4102                         CopLINE_dec(PL_curcop);
4103                         Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), PL_warn_nosemi);
4104                         CopLINE_inc(PL_curcop);
4105                     }
4106                     else
4107                         no_op("Bareword",s);
4108                 }
4109
4110                 /* Look for a subroutine with this name in current package,
4111                    unless name is "Foo::", in which case Foo is a bearword
4112                    (and a package name). */
4113
4114                 if (len > 2 &&
4115                     PL_tokenbuf[len - 2] == ':' && PL_tokenbuf[len - 1] == ':')
4116                 {
4117                     if (ckWARN(WARN_BAREWORD) && ! gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVHV))
4118                         Perl_warner(aTHX_ packWARN(WARN_BAREWORD),
4119                             "Bareword \"%s\" refers to nonexistent package",
4120                              PL_tokenbuf);
4121                     len -= 2;
4122                     PL_tokenbuf[len] = '\0';
4123                     gv = Nullgv;
4124                     gvp = 0;
4125                 }
4126                 else {
4127                     len = 0;
4128                     if (!gv)
4129                         gv = gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVCV);
4130                 }
4131
4132                 /* if we saw a global override before, get the right name */
4133
4134                 if (gvp) {
4135                     sv = newSVpvn("CORE::GLOBAL::",14);
4136                     sv_catpv(sv,PL_tokenbuf);
4137                 }
4138                 else
4139                     sv = newSVpv(PL_tokenbuf,0);
4140
4141                 /* Presume this is going to be a bareword of some sort. */
4142
4143                 CLINE;
4144                 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
4145                 yylval.opval->op_private = OPpCONST_BARE;
4146                 /* UTF-8 package name? */
4147                 if (UTF && !IN_BYTES &&
4148                     is_utf8_string((U8*)SvPVX(sv), SvCUR(sv)))
4149                     SvUTF8_on(sv);
4150
4151                 /* And if "Foo::", then that's what it certainly is. */
4152
4153                 if (len)
4154                     goto safe_bareword;
4155
4156                 /* See if it's the indirect object for a list operator. */
4157
4158                 if (PL_oldoldbufptr &&
4159                     PL_oldoldbufptr < PL_bufptr &&
4160                     (PL_oldoldbufptr == PL_last_lop
4161                      || PL_oldoldbufptr == PL_last_uni) &&
4162                     /* NO SKIPSPACE BEFORE HERE! */
4163                     (PL_expect == XREF ||
4164                      ((PL_opargs[PL_last_lop_op] >> OASHIFT)& 7) == OA_FILEREF))
4165                 {
4166                     bool immediate_paren = *s == '(';
4167
4168                     /* (Now we can afford to cross potential line boundary.) */
4169                     s = skipspace(s);
4170
4171                     /* Two barewords in a row may indicate method call. */
4172
4173                     if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') && (tmp=intuit_method(s,gv)))
4174                         return REPORT(tmp);
4175
4176                     /* If not a declared subroutine, it's an indirect object. */
4177                     /* (But it's an indir obj regardless for sort.) */
4178
4179                     if ( !immediate_paren && (PL_last_lop_op == OP_SORT ||
4180                          ((!gv || !GvCVu(gv)) &&
4181                         (PL_last_lop_op != OP_MAPSTART &&
4182                          PL_last_lop_op != OP_GREPSTART))))
4183                     {
4184                         PL_expect = (PL_last_lop == PL_oldoldbufptr) ? XTERM : XOPERATOR;
4185                         goto bareword;
4186                     }
4187                 }
4188
4189                 PL_expect = XOPERATOR;
4190                 s = skipspace(s);
4191
4192                 /* Is this a word before a => operator? */
4193                 if (*s == '=' && s[1] == '>' && !pkgname) {
4194                     CLINE;
4195                     sv_setpv(((SVOP*)yylval.opval)->op_sv, PL_tokenbuf);
4196                     if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
4197                       SvUTF8_on(((SVOP*)yylval.opval)->op_sv);
4198                     TERM(WORD);
4199                 }
4200
4201                 /* If followed by a paren, it's certainly a subroutine. */
4202                 if (*s == '(') {
4203                     CLINE;
4204                     if (gv && GvCVu(gv)) {
4205                         for (d = s + 1; SPACE_OR_TAB(*d); d++) ;
4206                         if (*d == ')' && (sv = cv_const_sv(GvCV(gv)))) {
4207                             s = d + 1;
4208                             goto its_constant;
4209                         }
4210                     }
4211                     PL_nextval[PL_nexttoke].opval = yylval.opval;
4212                     PL_expect = XOPERATOR;
4213                     force_next(WORD);
4214                     yylval.ival = 0;
4215                     TOKEN('&');
4216                 }
4217
4218                 /* If followed by var or block, call it a method (unless sub) */
4219
4220                 if ((*s == '$' || *s == '{') && (!gv || !GvCVu(gv))) {
4221                     PL_last_lop = PL_oldbufptr;
4222                     PL_last_lop_op = OP_METHOD;
4223                     PREBLOCK(METHOD);
4224                 }
4225
4226                 /* If followed by a bareword, see if it looks like indir obj. */
4227
4228                 if (!orig_keyword
4229                         && (isIDFIRST_lazy_if(s,UTF) || *s == '$')
4230                         && (tmp = intuit_method(s,gv)))
4231                     return REPORT(tmp);
4232
4233                 /* Not a method, so call it a subroutine (if defined) */
4234
4235                 if (gv && GvCVu(gv)) {
4236                     CV* cv;
4237                     if (lastchar == '-' && ckWARN_d(WARN_AMBIGUOUS))
4238                         Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
4239                                 "Ambiguous use of -%s resolved as -&%s()",
4240                                 PL_tokenbuf, PL_tokenbuf);
4241                     /* Check for a constant sub */
4242                     cv = GvCV(gv);
4243                     if ((sv = cv_const_sv(cv))) {
4244                   its_constant:
4245                         SvREFCNT_dec(((SVOP*)yylval.opval)->op_sv);
4246                         ((SVOP*)yylval.opval)->op_sv = SvREFCNT_inc(sv);
4247                         yylval.opval->op_private = 0;
4248                         TOKEN(WORD);
4249                     }
4250
4251                     /* Resolve to GV now. */
4252                     op_free(yylval.opval);
4253                     yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
4254                     yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
4255                     PL_last_lop = PL_oldbufptr;
4256                     PL_last_lop_op = OP_ENTERSUB;
4257                     /* Is there a prototype? */
4258                     if (SvPOK(cv)) {
4259                         STRLEN len;
4260                         char *proto = SvPV((SV*)cv, len);
4261                         if (!len)
4262                             TERM(FUNC0SUB);
4263                         if (*proto == '$' && proto[1] == '\0')
4264                             OPERATOR(UNIOPSUB);
4265                         while (*proto == ';')
4266                             proto++;
4267                         if (*proto == '&' && *s == '{') {
4268                             sv_setpv(PL_subname, PL_curstash ? 
4269                                         "__ANON__" : "__ANON__::__ANON__");
4270                             PREBLOCK(LSTOPSUB);
4271                         }
4272                     }
4273                     PL_nextval[PL_nexttoke].opval = yylval.opval;
4274                     PL_expect = XTERM;
4275                     force_next(WORD);
4276                     TOKEN(NOAMP);
4277                 }
4278
4279                 /* Call it a bare word */
4280
4281                 if (PL_hints & HINT_STRICT_SUBS)
4282                     yylval.opval->op_private |= OPpCONST_STRICT;
4283                 else {
4284                 bareword:
4285                     if (ckWARN(WARN_RESERVED)) {
4286                         if (lastchar != '-') {
4287                             for (d = PL_tokenbuf; *d && isLOWER(*d); d++) ;
4288                             if (!*d && !gv_stashpv(PL_tokenbuf,FALSE))
4289                                 Perl_warner(aTHX_ packWARN(WARN_RESERVED), PL_warn_reserved,
4290                                        PL_tokenbuf);
4291                         }
4292                     }
4293                 }
4294
4295             safe_bareword:
4296                 if ((lastchar == '*' || lastchar == '%' || lastchar == '&')
4297                     && ckWARN_d(WARN_AMBIGUOUS)) {
4298                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
4299                         "Operator or semicolon missing before %c%s",
4300                         lastchar, PL_tokenbuf);
4301                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
4302                         "Ambiguous use of %c resolved as operator %c",
4303                         lastchar, lastchar);
4304                 }
4305                 TOKEN(WORD);
4306             }
4307
4308         case KEY___FILE__:
4309             yylval.opval = (OP*)newSVOP(OP_CONST, 0,
4310                                         newSVpv(CopFILE(PL_curcop),0));
4311             TERM(THING);
4312
4313         case KEY___LINE__:
4314             yylval.opval = (OP*)newSVOP(OP_CONST, 0,
4315                                     Perl_newSVpvf(aTHX_ "%"IVdf, (IV)CopLINE(PL_curcop)));
4316             TERM(THING);
4317
4318         case KEY___PACKAGE__:
4319             yylval.opval = (OP*)newSVOP(OP_CONST, 0,
4320                                         (PL_curstash
4321                                          ? newSVpv(HvNAME(PL_curstash), 0)
4322                                          : &PL_sv_undef));
4323             TERM(THING);
4324
4325         case KEY___DATA__:
4326         case KEY___END__: {
4327             GV *gv;
4328
4329             /*SUPPRESS 560*/
4330             if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
4331                 char *pname = "main";
4332                 if (PL_tokenbuf[2] == 'D')
4333                     pname = HvNAME(PL_curstash ? PL_curstash : PL_defstash);
4334                 gv = gv_fetchpv(Perl_form(aTHX_ "%s::DATA", pname), TRUE, SVt_PVIO);
4335                 GvMULTI_on(gv);
4336                 if (!GvIO(gv))
4337                     GvIOp(gv) = newIO();
4338                 IoIFP(GvIOp(gv)) = PL_rsfp;
4339 #if defined(HAS_FCNTL) && defined(F_SETFD)
4340                 {
4341                     int fd = PerlIO_fileno(PL_rsfp);
4342                     fcntl(fd,F_SETFD,fd >= 3);
4343                 }
4344 #endif
4345                 /* Mark this internal pseudo-handle as clean */
4346                 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
4347                 if (PL_preprocess)
4348                     IoTYPE(GvIOp(gv)) = IoTYPE_PIPE;
4349                 else if ((PerlIO*)PL_rsfp == PerlIO_stdin())
4350                     IoTYPE(GvIOp(gv)) = IoTYPE_STD;
4351                 else
4352                     IoTYPE(GvIOp(gv)) = IoTYPE_RDONLY;
4353 #if defined(WIN32) && !defined(PERL_TEXTMODE_SCRIPTS)
4354                 /* if the script was opened in binmode, we need to revert
4355                  * it to text mode for compatibility; but only iff it has CRs
4356                  * XXX this is a questionable hack at best. */
4357                 if (PL_bufend-PL_bufptr > 2
4358                     && PL_bufend[-1] == '\n' && PL_bufend[-2] == '\r')
4359                 {
4360                     Off_t loc = 0;
4361                     if (IoTYPE(GvIOp(gv)) == IoTYPE_RDONLY) {
4362                         loc = PerlIO_tell(PL_rsfp);
4363                         (void)PerlIO_seek(PL_rsfp, 0L, 0);
4364                     }
4365 #ifdef NETWARE
4366                         if (PerlLIO_setmode(PL_rsfp, O_TEXT) != -1) {
4367 #else
4368                     if (PerlLIO_setmode(PerlIO_fileno(PL_rsfp), O_TEXT) != -1) {
4369 #endif  /* NETWARE */
4370 #ifdef PERLIO_IS_STDIO /* really? */
4371 #  if defined(__BORLANDC__)
4372                         /* XXX see note in do_binmode() */
4373                         ((FILE*)PL_rsfp)->flags &= ~_F_BIN;
4374 #  endif
4375 #endif
4376                         if (loc > 0)
4377                             PerlIO_seek(PL_rsfp, loc, 0);
4378                     }
4379                 }
4380 #endif
4381 #ifdef PERLIO_LAYERS
4382                 if (!IN_BYTES) {
4383                     if (UTF)
4384                         PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, ":utf8");
4385                     else if (PL_encoding) {
4386                         SV *name;
4387                         dSP;
4388                         ENTER;
4389                         SAVETMPS;
4390                         PUSHMARK(sp);
4391                         EXTEND(SP, 1);
4392                         XPUSHs(PL_encoding);
4393                         PUTBACK;
4394                         call_method("name", G_SCALAR);
4395                         SPAGAIN;
4396                         name = POPs;
4397                         PUTBACK;
4398                         PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, 
4399                                             Perl_form(aTHX_ ":encoding(%"SVf")",
4400                                                       name));
4401                         FREETMPS;
4402                         LEAVE;
4403                     }
4404                 }
4405 #endif
4406                 PL_rsfp = Nullfp;
4407             }
4408             goto fake_eof;
4409         }
4410
4411         case KEY_AUTOLOAD:
4412         case KEY_DESTROY:
4413         case KEY_BEGIN:
4414         case KEY_CHECK:
4415         case KEY_INIT:
4416         case KEY_END:
4417             if (PL_expect == XSTATE) {
4418                 s = PL_bufptr;
4419                 goto really_sub;
4420             }
4421             goto just_a_word;
4422
4423         case KEY_CORE:
4424             if (*s == ':' && s[1] == ':') {
4425                 s += 2;
4426                 d = s;
4427                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
4428                 if (!(tmp = keyword(PL_tokenbuf, len)))
4429                     Perl_croak(aTHX_ "CORE::%s is not a keyword", PL_tokenbuf);
4430                 if (tmp < 0)
4431                     tmp = -tmp;
4432                 goto reserved_word;
4433             }
4434             goto just_a_word;
4435
4436         case KEY_abs:
4437             UNI(OP_ABS);
4438
4439         case KEY_alarm:
4440             UNI(OP_ALARM);
4441
4442         case KEY_accept:
4443             LOP(OP_ACCEPT,XTERM);
4444
4445         case KEY_and:
4446             OPERATOR(ANDOP);
4447
4448         case KEY_atan2:
4449             LOP(OP_ATAN2,XTERM);
4450
4451         case KEY_bind:
4452             LOP(OP_BIND,XTERM);
4453
4454         case KEY_binmode:
4455             LOP(OP_BINMODE,XTERM);
4456
4457         case KEY_bless:
4458             LOP(OP_BLESS,XTERM);
4459
4460         case KEY_chop:
4461             UNI(OP_CHOP);
4462
4463         case KEY_continue:
4464             PREBLOCK(CONTINUE);
4465
4466         case KEY_chdir:
4467             (void)gv_fetchpv("ENV",TRUE, SVt_PVHV);     /* may use HOME */
4468             UNI(OP_CHDIR);
4469
4470         case KEY_close:
4471             UNI(OP_CLOSE);
4472
4473         case KEY_closedir:
4474             UNI(OP_CLOSEDIR);
4475
4476         case KEY_cmp:
4477             Eop(OP_SCMP);
4478
4479         case KEY_caller:
4480             UNI(OP_CALLER);
4481
4482         case KEY_crypt:
4483 #ifdef FCRYPT
4484             if (!PL_cryptseen) {
4485                 PL_cryptseen = TRUE;
4486                 init_des();
4487             }
4488 #endif
4489             LOP(OP_CRYPT,XTERM);
4490
4491         case KEY_chmod:
4492             LOP(OP_CHMOD,XTERM);
4493
4494         case KEY_chown:
4495             LOP(OP_CHOWN,XTERM);
4496
4497         case KEY_connect:
4498             LOP(OP_CONNECT,XTERM);
4499
4500         case KEY_chr:
4501             UNI(OP_CHR);
4502
4503         case KEY_cos:
4504             UNI(OP_COS);
4505
4506         case KEY_chroot:
4507             UNI(OP_CHROOT);
4508
4509         case KEY_do:
4510             s = skipspace(s);
4511             if (*s == '{')
4512                 PRETERMBLOCK(DO);
4513             if (*s != '\'')
4514                 s = force_word(s,WORD,TRUE,TRUE,FALSE);
4515             OPERATOR(DO);
4516
4517         case KEY_die:
4518             PL_hints |= HINT_BLOCK_SCOPE;
4519             LOP(OP_DIE,XTERM);
4520
4521         case KEY_defined:
4522             UNI(OP_DEFINED);
4523
4524         case KEY_delete:
4525             UNI(OP_DELETE);
4526
4527         case KEY_dbmopen:
4528             gv_fetchpv("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
4529             LOP(OP_DBMOPEN,XTERM);
4530
4531         case KEY_dbmclose:
4532             UNI(OP_DBMCLOSE);
4533
4534         case KEY_dump:
4535             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4536             LOOPX(OP_DUMP);
4537
4538         case KEY_else:
4539             PREBLOCK(ELSE);
4540
4541         case KEY_elsif:
4542             yylval.ival = CopLINE(PL_curcop);
4543             OPERATOR(ELSIF);
4544
4545         case KEY_eq:
4546             Eop(OP_SEQ);
4547
4548         case KEY_exists:
4549             UNI(OP_EXISTS);
4550         
4551         case KEY_exit:
4552             UNI(OP_EXIT);
4553
4554         case KEY_eval:
4555             s = skipspace(s);
4556             PL_expect = (*s == '{') ? XTERMBLOCK : XTERM;
4557             UNIBRACK(OP_ENTEREVAL);
4558
4559         case KEY_eof:
4560             UNI(OP_EOF);
4561
4562         case KEY_err:
4563             OPERATOR(DOROP);
4564
4565         case KEY_exp:
4566             UNI(OP_EXP);
4567
4568         case KEY_each:
4569             UNI(OP_EACH);
4570
4571         case KEY_exec:
4572             set_csh();
4573             LOP(OP_EXEC,XREF);
4574
4575         case KEY_endhostent:
4576             FUN0(OP_EHOSTENT);
4577
4578         case KEY_endnetent:
4579             FUN0(OP_ENETENT);
4580
4581         case KEY_endservent:
4582             FUN0(OP_ESERVENT);
4583
4584         case KEY_endprotoent:
4585             FUN0(OP_EPROTOENT);
4586
4587         case KEY_endpwent:
4588             FUN0(OP_EPWENT);
4589
4590         case KEY_endgrent:
4591             FUN0(OP_EGRENT);
4592
4593         case KEY_for:
4594         case KEY_foreach:
4595             yylval.ival = CopLINE(PL_curcop);
4596             s = skipspace(s);
4597             if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) {
4598                 char *p = s;
4599                 if ((PL_bufend - p) >= 3 &&
4600                     strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
4601                     p += 2;
4602                 else if ((PL_bufend - p) >= 4 &&
4603                     strnEQ(p, "our", 3) && isSPACE(*(p + 3)))
4604                     p += 3;
4605                 p = skipspace(p);
4606                 if (isIDFIRST_lazy_if(p,UTF)) {
4607                     p = scan_ident(p, PL_bufend,
4608                         PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
4609                     p = skipspace(p);
4610                 }
4611                 if (*p != '$')
4612                     Perl_croak(aTHX_ "Missing $ on loop variable");
4613             }
4614             OPERATOR(FOR);
4615
4616         case KEY_formline:
4617             LOP(OP_FORMLINE,XTERM);
4618
4619         case KEY_fork:
4620             FUN0(OP_FORK);
4621
4622         case KEY_fcntl:
4623             LOP(OP_FCNTL,XTERM);
4624
4625         case KEY_fileno:
4626             UNI(OP_FILENO);
4627
4628         case KEY_flock:
4629             LOP(OP_FLOCK,XTERM);
4630
4631         case KEY_gt:
4632             Rop(OP_SGT);
4633
4634         case KEY_ge:
4635             Rop(OP_SGE);
4636
4637         case KEY_grep:
4638             LOP(OP_GREPSTART, XREF);
4639
4640         case KEY_goto:
4641             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4642             LOOPX(OP_GOTO);
4643
4644         case KEY_gmtime:
4645             UNI(OP_GMTIME);
4646
4647         case KEY_getc:
4648             UNIDOR(OP_GETC);
4649
4650         case KEY_getppid:
4651             FUN0(OP_GETPPID);
4652
4653         case KEY_getpgrp:
4654             UNI(OP_GETPGRP);
4655
4656         case KEY_getpriority:
4657             LOP(OP_GETPRIORITY,XTERM);
4658
4659         case KEY_getprotobyname:
4660             UNI(OP_GPBYNAME);
4661
4662         case KEY_getprotobynumber:
4663             LOP(OP_GPBYNUMBER,XTERM);
4664
4665         case KEY_getprotoent:
4666             FUN0(OP_GPROTOENT);
4667
4668         case KEY_getpwent:
4669             FUN0(OP_GPWENT);
4670
4671         case KEY_getpwnam:
4672             UNI(OP_GPWNAM);
4673
4674         case KEY_getpwuid:
4675             UNI(OP_GPWUID);
4676
4677         case KEY_getpeername:
4678             UNI(OP_GETPEERNAME);
4679
4680         case KEY_gethostbyname:
4681             UNI(OP_GHBYNAME);
4682
4683         case KEY_gethostbyaddr:
4684             LOP(OP_GHBYADDR,XTERM);
4685
4686         case KEY_gethostent:
4687             FUN0(OP_GHOSTENT);
4688
4689         case KEY_getnetbyname:
4690             UNI(OP_GNBYNAME);
4691
4692         case KEY_getnetbyaddr:
4693             LOP(OP_GNBYADDR,XTERM);
4694
4695         case KEY_getnetent:
4696             FUN0(OP_GNETENT);
4697
4698         case KEY_getservbyname:
4699             LOP(OP_GSBYNAME,XTERM);
4700
4701         case KEY_getservbyport:
4702             LOP(OP_GSBYPORT,XTERM);
4703
4704         case KEY_getservent:
4705             FUN0(OP_GSERVENT);
4706
4707         case KEY_getsockname:
4708             UNI(OP_GETSOCKNAME);
4709
4710         case KEY_getsockopt:
4711             LOP(OP_GSOCKOPT,XTERM);
4712
4713         case KEY_getgrent:
4714             FUN0(OP_GGRENT);
4715
4716         case KEY_getgrnam:
4717             UNI(OP_GGRNAM);
4718
4719         case KEY_getgrgid:
4720             UNI(OP_GGRGID);
4721
4722         case KEY_getlogin:
4723             FUN0(OP_GETLOGIN);
4724
4725         case KEY_glob:
4726             set_csh();
4727             LOP(OP_GLOB,XTERM);
4728
4729         case KEY_hex:
4730             UNI(OP_HEX);
4731
4732         case KEY_if:
4733             yylval.ival = CopLINE(PL_curcop);
4734             OPERATOR(IF);
4735
4736         case KEY_index:
4737             LOP(OP_INDEX,XTERM);
4738
4739         case KEY_int:
4740             UNI(OP_INT);
4741
4742         case KEY_ioctl:
4743             LOP(OP_IOCTL,XTERM);
4744
4745         case KEY_join:
4746             LOP(OP_JOIN,XTERM);
4747
4748         case KEY_keys:
4749             UNI(OP_KEYS);
4750
4751         case KEY_kill:
4752             LOP(OP_KILL,XTERM);
4753
4754         case KEY_last:
4755             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4756             LOOPX(OP_LAST);
4757         
4758         case KEY_lc:
4759             UNI(OP_LC);
4760
4761         case KEY_lcfirst:
4762             UNI(OP_LCFIRST);
4763
4764         case KEY_local:
4765             yylval.ival = 0;
4766             OPERATOR(LOCAL);
4767
4768         case KEY_length:
4769             UNI(OP_LENGTH);
4770
4771         case KEY_lt:
4772             Rop(OP_SLT);
4773
4774         case KEY_le:
4775             Rop(OP_SLE);
4776
4777         case KEY_localtime:
4778             UNI(OP_LOCALTIME);
4779
4780         case KEY_log:
4781             UNI(OP_LOG);
4782
4783         case KEY_link:
4784             LOP(OP_LINK,XTERM);
4785
4786         case KEY_listen:
4787             LOP(OP_LISTEN,XTERM);
4788
4789         case KEY_lock:
4790             UNI(OP_LOCK);
4791
4792         case KEY_lstat:
4793             UNI(OP_LSTAT);
4794
4795         case KEY_m:
4796             s = scan_pat(s,OP_MATCH);
4797             TERM(sublex_start());
4798
4799         case KEY_map:
4800             LOP(OP_MAPSTART, XREF);
4801
4802         case KEY_mkdir:
4803             LOP(OP_MKDIR,XTERM);
4804
4805         case KEY_msgctl:
4806             LOP(OP_MSGCTL,XTERM);
4807
4808         case KEY_msgget:
4809             LOP(OP_MSGGET,XTERM);
4810
4811         case KEY_msgrcv:
4812             LOP(OP_MSGRCV,XTERM);
4813
4814         case KEY_msgsnd:
4815             LOP(OP_MSGSND,XTERM);
4816
4817         case KEY_our:
4818         case KEY_my:
4819             PL_in_my = tmp;
4820             s = skipspace(s);
4821             if (isIDFIRST_lazy_if(s,UTF)) {
4822                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
4823                 if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
4824                     goto really_sub;
4825                 PL_in_my_stash = find_in_my_stash(PL_tokenbuf, len);
4826                 if (!PL_in_my_stash) {
4827                     char tmpbuf[1024];
4828                     PL_bufptr = s;
4829                     sprintf(tmpbuf, "No such class %.1000s", PL_tokenbuf);
4830                     yyerror(tmpbuf);
4831                 }
4832             }
4833             yylval.ival = 1;
4834             OPERATOR(MY);
4835
4836         case KEY_next:
4837             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4838             LOOPX(OP_NEXT);
4839
4840         case KEY_ne:
4841             Eop(OP_SNE);
4842
4843         case KEY_no:
4844             if (PL_expect != XSTATE)
4845                 yyerror("\"no\" not allowed in expression");
4846             s = force_word(s,WORD,FALSE,TRUE,FALSE);
4847             s = force_version(s, FALSE);
4848             yylval.ival = 0;
4849             OPERATOR(USE);
4850
4851         case KEY_not:
4852             if (*s == '(' || (s = skipspace(s), *s == '('))
4853                 FUN1(OP_NOT);
4854             else
4855                 OPERATOR(NOTOP);
4856
4857         case KEY_open:
4858             s = skipspace(s);
4859             if (isIDFIRST_lazy_if(s,UTF)) {
4860                 char *t;
4861                 for (d = s; isALNUM_lazy_if(d,UTF); d++) ;
4862                 for (t=d; *t && isSPACE(*t); t++) ;
4863                 if ( *t && strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
4864                     /* [perl #16184] */
4865                     && !(t[0] == '=' && t[1] == '>')
4866                 ) {
4867                     Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE),
4868                            "Precedence problem: open %.*s should be open(%.*s)",
4869                             d - s, s, d - s, s);
4870                 }
4871             }
4872             LOP(OP_OPEN,XTERM);
4873
4874         case KEY_or:
4875             yylval.ival = OP_OR;
4876             OPERATOR(OROP);
4877
4878         case KEY_ord:
4879             UNI(OP_ORD);
4880
4881         case KEY_oct:
4882             UNI(OP_OCT);
4883
4884         case KEY_opendir:
4885             LOP(OP_OPEN_DIR,XTERM);
4886
4887         case KEY_print:
4888             checkcomma(s,PL_tokenbuf,"filehandle");
4889             LOP(OP_PRINT,XREF);
4890
4891         case KEY_printf:
4892             checkcomma(s,PL_tokenbuf,"filehandle");
4893             LOP(OP_PRTF,XREF);
4894
4895         case KEY_prototype:
4896             UNI(OP_PROTOTYPE);
4897
4898         case KEY_push:
4899             LOP(OP_PUSH,XTERM);
4900
4901         case KEY_pop:
4902             UNIDOR(OP_POP);
4903
4904         case KEY_pos:
4905             UNIDOR(OP_POS);
4906         
4907         case KEY_pack:
4908             LOP(OP_PACK,XTERM);
4909
4910         case KEY_package:
4911             s = force_word(s,WORD,FALSE,TRUE,FALSE);
4912             OPERATOR(PACKAGE);
4913
4914         case KEY_pipe:
4915             LOP(OP_PIPE_OP,XTERM);
4916
4917         case KEY_q:
4918             s = scan_str(s,FALSE,FALSE);
4919             if (!s)
4920                 missingterm((char*)0);
4921             yylval.ival = OP_CONST;
4922             TERM(sublex_start());
4923
4924         case KEY_quotemeta:
4925             UNI(OP_QUOTEMETA);
4926
4927         case KEY_qw:
4928             s = scan_str(s,FALSE,FALSE);
4929             if (!s)
4930                 missingterm((char*)0);
4931             force_next(')');
4932             if (SvCUR(PL_lex_stuff)) {
4933                 OP *words = Nullop;
4934                 int warned = 0;
4935                 d = SvPV_force(PL_lex_stuff, len);
4936                 while (len) {
4937                     SV *sv;
4938                     for (; isSPACE(*d) && len; --len, ++d) ;
4939                     if (len) {
4940                         char *b = d;
4941                         if (!warned && ckWARN(WARN_QW)) {
4942                             for (; !isSPACE(*d) && len; --len, ++d) {
4943                                 if (*d == ',') {
4944                                     Perl_warner(aTHX_ packWARN(WARN_QW),
4945                                         "Possible attempt to separate words with commas");
4946                                     ++warned;
4947                                 }
4948                                 else if (*d == '#') {
4949                                     Perl_warner(aTHX_ packWARN(WARN_QW),
4950                                         "Possible attempt to put comments in qw() list");
4951                                     ++warned;
4952                                 }
4953                             }
4954                         }
4955                         else {
4956                             for (; !isSPACE(*d) && len; --len, ++d) ;
4957                         }
4958                         sv = newSVpvn(b, d-b);
4959                         if (DO_UTF8(PL_lex_stuff))
4960                             SvUTF8_on(sv);
4961                         words = append_elem(OP_LIST, words,
4962                                             newSVOP(OP_CONST, 0, tokeq(sv)));
4963                     }
4964                 }
4965                 if (words) {
4966                     PL_nextval[PL_nexttoke].opval = words;
4967                     force_next(THING);
4968                 }
4969             }
4970             if (PL_lex_stuff) {
4971                 SvREFCNT_dec(PL_lex_stuff);
4972                 PL_lex_stuff = Nullsv;
4973             }
4974             PL_expect = XTERM;
4975             TOKEN('(');
4976
4977         case KEY_qq:
4978             s = scan_str(s,FALSE,FALSE);
4979             if (!s)
4980                 missingterm((char*)0);
4981             yylval.ival = OP_STRINGIFY;
4982             if (SvIVX(PL_lex_stuff) == '\'')
4983                 SvIVX(PL_lex_stuff) = 0;        /* qq'$foo' should intepolate */
4984             TERM(sublex_start());
4985
4986         case KEY_qr:
4987             s = scan_pat(s,OP_QR);
4988             TERM(sublex_start());
4989
4990         case KEY_qx:
4991             s = scan_str(s,FALSE,FALSE);
4992             if (!s)
4993                 missingterm((char*)0);
4994             yylval.ival = OP_BACKTICK;
4995             set_csh();
4996             TERM(sublex_start());
4997
4998         case KEY_return:
4999             OLDLOP(OP_RETURN);
5000
5001         case KEY_require:
5002             s = skipspace(s);
5003             if (isDIGIT(*s)) {
5004                 s = force_version(s, FALSE);
5005             }
5006             else if (*s != 'v' || !isDIGIT(s[1])
5007                     || (s = force_version(s, TRUE), *s == 'v'))
5008             {
5009                 *PL_tokenbuf = '\0';
5010                 s = force_word(s,WORD,TRUE,TRUE,FALSE);
5011                 if (isIDFIRST_lazy_if(PL_tokenbuf,UTF))
5012                     gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf), TRUE);
5013                 else if (*s == '<')
5014                     yyerror("<> should be quotes");
5015             }
5016             UNI(OP_REQUIRE);
5017
5018         case KEY_reset:
5019             UNI(OP_RESET);
5020
5021         case KEY_redo:
5022             s = force_word(s,WORD,TRUE,FALSE,FALSE);
5023             LOOPX(OP_REDO);
5024
5025         case KEY_rename:
5026             LOP(OP_RENAME,XTERM);
5027
5028         case KEY_rand:
5029             UNI(OP_RAND);
5030
5031         case KEY_rmdir:
5032             UNI(OP_RMDIR);
5033
5034         case KEY_rindex:
5035             LOP(OP_RINDEX,XTERM);
5036
5037         case KEY_read:
5038             LOP(OP_READ,XTERM);
5039
5040         case KEY_readdir:
5041             UNI(OP_READDIR);
5042
5043         case KEY_readline:
5044             set_csh();
5045             UNIDOR(OP_READLINE);
5046
5047         case KEY_readpipe:
5048             set_csh();
5049             UNI(OP_BACKTICK);
5050
5051         case KEY_rewinddir:
5052             UNI(OP_REWINDDIR);
5053
5054         case KEY_recv:
5055             LOP(OP_RECV,XTERM);
5056
5057         case KEY_reverse:
5058             LOP(OP_REVERSE,XTERM);
5059
5060         case KEY_readlink:
5061             UNIDOR(OP_READLINK);
5062
5063         case KEY_ref:
5064             UNI(OP_REF);
5065
5066         case KEY_s:
5067             s = scan_subst(s);
5068             if (yylval.opval)
5069                 TERM(sublex_start());
5070             else
5071                 TOKEN(1);       /* force error */
5072
5073         case KEY_chomp:
5074             UNI(OP_CHOMP);
5075         
5076         case KEY_scalar:
5077             UNI(OP_SCALAR);
5078
5079         case KEY_select:
5080             LOP(OP_SELECT,XTERM);
5081
5082         case KEY_seek:
5083             LOP(OP_SEEK,XTERM);
5084
5085         case KEY_semctl:
5086             LOP(OP_SEMCTL,XTERM);
5087
5088         case KEY_semget:
5089             LOP(OP_SEMGET,XTERM);
5090
5091         case KEY_semop:
5092             LOP(OP_SEMOP,XTERM);
5093
5094         case KEY_send:
5095             LOP(OP_SEND,XTERM);
5096
5097         case KEY_setpgrp:
5098             LOP(OP_SETPGRP,XTERM);
5099
5100         case KEY_setpriority:
5101             LOP(OP_SETPRIORITY,XTERM);
5102
5103         case KEY_sethostent:
5104             UNI(OP_SHOSTENT);
5105
5106         case KEY_setnetent:
5107             UNI(OP_SNETENT);
5108
5109         case KEY_setservent:
5110             UNI(OP_SSERVENT);
5111
5112         case KEY_setprotoent:
5113             UNI(OP_SPROTOENT);
5114
5115         case KEY_setpwent:
5116             FUN0(OP_SPWENT);
5117
5118         case KEY_setgrent:
5119             FUN0(OP_SGRENT);
5120
5121         case KEY_seekdir:
5122             LOP(OP_SEEKDIR,XTERM);
5123
5124         case KEY_setsockopt:
5125             LOP(OP_SSOCKOPT,XTERM);
5126
5127         case KEY_shift:
5128             UNIDOR(OP_SHIFT);
5129
5130         case KEY_shmctl:
5131             LOP(OP_SHMCTL,XTERM);
5132
5133         case KEY_shmget:
5134             LOP(OP_SHMGET,XTERM);
5135
5136         case KEY_shmread:
5137             LOP(OP_SHMREAD,XTERM);
5138
5139         case KEY_shmwrite:
5140             LOP(OP_SHMWRITE,XTERM);
5141
5142         case KEY_shutdown:
5143             LOP(OP_SHUTDOWN,XTERM);
5144
5145         case KEY_sin:
5146             UNI(OP_SIN);
5147
5148         case KEY_sleep:
5149             UNI(OP_SLEEP);
5150
5151         case KEY_socket:
5152             LOP(OP_SOCKET,XTERM);
5153
5154         case KEY_socketpair:
5155             LOP(OP_SOCKPAIR,XTERM);
5156
5157         case KEY_sort:
5158             checkcomma(s,PL_tokenbuf,"subroutine name");
5159             s = skipspace(s);
5160             if (*s == ';' || *s == ')')         /* probably a close */
5161                 Perl_croak(aTHX_ "sort is now a reserved word");
5162             PL_expect = XTERM;
5163             s = force_word(s,WORD,TRUE,TRUE,FALSE);
5164             LOP(OP_SORT,XREF);
5165
5166         case KEY_split:
5167             LOP(OP_SPLIT,XTERM);
5168
5169         case KEY_sprintf:
5170             LOP(OP_SPRINTF,XTERM);
5171
5172         case KEY_splice:
5173             LOP(OP_SPLICE,XTERM);
5174
5175         case KEY_sqrt:
5176             UNI(OP_SQRT);
5177
5178         case KEY_srand:
5179             UNI(OP_SRAND);
5180
5181         case KEY_stat:
5182             UNI(OP_STAT);
5183
5184         case KEY_study:
5185             UNI(OP_STUDY);
5186
5187         case KEY_substr:
5188             LOP(OP_SUBSTR,XTERM);
5189
5190         case KEY_format:
5191         case KEY_sub:
5192           really_sub:
5193             {
5194                 char tmpbuf[sizeof PL_tokenbuf];
5195                 SSize_t tboffset = 0;
5196                 expectation attrful;
5197                 bool have_name, have_proto, bad_proto;
5198                 int key = tmp;
5199
5200                 s = skipspace(s);
5201
5202                 if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' ||
5203                     (*s == ':' && s[1] == ':'))
5204                 {
5205                     PL_expect = XBLOCK;
5206                     attrful = XATTRBLOCK;
5207                     /* remember buffer pos'n for later force_word */
5208                     tboffset = s - PL_oldbufptr;
5209                     d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
5210                     if (strchr(tmpbuf, ':'))
5211                         sv_setpv(PL_subname, tmpbuf);
5212                     else {
5213                         sv_setsv(PL_subname,PL_curstname);
5214                         sv_catpvn(PL_subname,"::",2);
5215                         sv_catpvn(PL_subname,tmpbuf,len);
5216                     }
5217                     s = skipspace(d);
5218                     have_name = TRUE;
5219                 }
5220                 else {
5221                     if (key == KEY_my)
5222                         Perl_croak(aTHX_ "Missing name in \"my sub\"");
5223                     PL_expect = XTERMBLOCK;
5224                     attrful = XATTRTERM;
5225                     sv_setpv(PL_subname,"?");
5226                     have_name = FALSE;
5227                 }
5228
5229                 if (key == KEY_format) {
5230                     if (*s == '=')
5231                         PL_lex_formbrack = PL_lex_brackets + 1;
5232                     if (have_name)
5233                         (void) force_word(PL_oldbufptr + tboffset, WORD,
5234                                           FALSE, TRUE, TRUE);
5235                     OPERATOR(FORMAT);
5236                 }
5237
5238                 /* Look for a prototype */
5239                 if (*s == '(') {
5240                     char *p;
5241
5242                     s = scan_str(s,FALSE,FALSE);
5243                     if (!s)
5244                         Perl_croak(aTHX_ "Prototype not terminated");
5245                     /* strip spaces and check for bad characters */
5246                     d = SvPVX(PL_lex_stuff);
5247                     tmp = 0;
5248                     bad_proto = FALSE;
5249                     for (p = d; *p; ++p) {
5250                         if (!isSPACE(*p)) {
5251                             d[tmp++] = *p;
5252                             if (!strchr("$@%*;[]&\\", *p))
5253                                 bad_proto = TRUE;
5254                         }
5255                     }
5256                     d[tmp] = '\0';
5257                     if (bad_proto && ckWARN(WARN_SYNTAX))
5258                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5259                                     "Illegal character in prototype for %"SVf" : %s",
5260                                     PL_subname, d);
5261                     SvCUR(PL_lex_stuff) = tmp;
5262                     have_proto = TRUE;
5263
5264                     s = skipspace(s);
5265                 }
5266                 else
5267                     have_proto = FALSE;
5268
5269                 if (*s == ':' && s[1] != ':')
5270                     PL_expect = attrful;
5271                 else if (*s != '{' && key == KEY_sub) {
5272                     if (!have_name)
5273                         Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine");
5274                     else if (*s != ';')
5275                         Perl_croak(aTHX_ "Illegal declaration of subroutine %"SVf, PL_subname);
5276                 }
5277
5278                 if (have_proto) {
5279                     PL_nextval[PL_nexttoke].opval =
5280                         (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
5281                     PL_lex_stuff = Nullsv;
5282                     force_next(THING);
5283                 }
5284                 if (!have_name) {
5285                     sv_setpv(PL_subname,
5286                         PL_curstash ? "__ANON__" : "__ANON__::__ANON__");
5287                     TOKEN(ANONSUB);
5288                 }
5289                 (void) force_word(PL_oldbufptr + tboffset, WORD,
5290                                   FALSE, TRUE, TRUE);
5291                 if (key == KEY_my)
5292                     TOKEN(MYSUB);
5293                 TOKEN(SUB);
5294             }
5295
5296         case KEY_system:
5297             set_csh();
5298             LOP(OP_SYSTEM,XREF);
5299
5300         case KEY_symlink:
5301             LOP(OP_SYMLINK,XTERM);
5302
5303         case KEY_syscall:
5304             LOP(OP_SYSCALL,XTERM);
5305
5306         case KEY_sysopen:
5307             LOP(OP_SYSOPEN,XTERM);
5308
5309         case KEY_sysseek:
5310             LOP(OP_SYSSEEK,XTERM);
5311
5312         case KEY_sysread:
5313             LOP(OP_SYSREAD,XTERM);
5314
5315         case KEY_syswrite:
5316             LOP(OP_SYSWRITE,XTERM);
5317
5318         case KEY_tr:
5319             s = scan_trans(s);
5320             TERM(sublex_start());
5321
5322         case KEY_tell:
5323             UNI(OP_TELL);
5324
5325         case KEY_telldir:
5326             UNI(OP_TELLDIR);
5327
5328         case KEY_tie:
5329             LOP(OP_TIE,XTERM);
5330
5331         case KEY_tied:
5332             UNI(OP_TIED);
5333
5334         case KEY_time:
5335             FUN0(OP_TIME);
5336
5337         case KEY_times:
5338             FUN0(OP_TMS);
5339
5340         case KEY_truncate:
5341             LOP(OP_TRUNCATE,XTERM);
5342
5343         case KEY_uc:
5344             UNI(OP_UC);
5345
5346         case KEY_ucfirst:
5347             UNI(OP_UCFIRST);
5348
5349         case KEY_untie:
5350             UNI(OP_UNTIE);
5351
5352         case KEY_until:
5353             yylval.ival = CopLINE(PL_curcop);
5354             OPERATOR(UNTIL);
5355
5356         case KEY_unless:
5357             yylval.ival = CopLINE(PL_curcop);
5358             OPERATOR(UNLESS);
5359
5360         case KEY_unlink:
5361             LOP(OP_UNLINK,XTERM);
5362
5363         case KEY_undef:
5364             UNIDOR(OP_UNDEF);
5365
5366         case KEY_unpack:
5367             LOP(OP_UNPACK,XTERM);
5368
5369         case KEY_utime:
5370             LOP(OP_UTIME,XTERM);
5371
5372         case KEY_umask:
5373             UNIDOR(OP_UMASK);
5374
5375         case KEY_unshift:
5376             LOP(OP_UNSHIFT,XTERM);
5377
5378         case KEY_use:
5379             if (PL_expect != XSTATE)
5380                 yyerror("\"use\" not allowed in expression");
5381             s = skipspace(s);
5382             if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
5383                 s = force_version(s, TRUE);
5384                 if (*s == ';' || (s = skipspace(s), *s == ';')) {
5385                     PL_nextval[PL_nexttoke].opval = Nullop;
5386                     force_next(WORD);
5387                 }
5388                 else if (*s == 'v') {
5389                     s = force_word(s,WORD,FALSE,TRUE,FALSE);
5390                     s = force_version(s, FALSE);
5391                 }
5392             }
5393             else {
5394                 s = force_word(s,WORD,FALSE,TRUE,FALSE);
5395                 s = force_version(s, FALSE);
5396             }
5397             yylval.ival = 1;
5398             OPERATOR(USE);
5399
5400         case KEY_values:
5401             UNI(OP_VALUES);
5402
5403         case KEY_vec:
5404             LOP(OP_VEC,XTERM);
5405
5406         case KEY_while:
5407             yylval.ival = CopLINE(PL_curcop);
5408             OPERATOR(WHILE);
5409
5410         case KEY_warn:
5411             PL_hints |= HINT_BLOCK_SCOPE;
5412             LOP(OP_WARN,XTERM);
5413
5414         case KEY_wait:
5415             FUN0(OP_WAIT);
5416
5417         case KEY_waitpid:
5418             LOP(OP_WAITPID,XTERM);
5419
5420         case KEY_wantarray:
5421             FUN0(OP_WANTARRAY);
5422
5423         case KEY_write:
5424 #ifdef EBCDIC
5425         {
5426             char ctl_l[2];
5427             ctl_l[0] = toCTRL('L');
5428             ctl_l[1] = '\0';
5429             gv_fetchpv(ctl_l,TRUE, SVt_PV);
5430         }
5431 #else
5432             gv_fetchpv("\f",TRUE, SVt_PV);      /* Make sure $^L is defined */
5433 #endif
5434             UNI(OP_ENTERWRITE);
5435
5436         case KEY_x:
5437             if (PL_expect == XOPERATOR)
5438                 Mop(OP_REPEAT);
5439             check_uni();
5440             goto just_a_word;
5441
5442         case KEY_xor:
5443             yylval.ival = OP_XOR;
5444             OPERATOR(OROP);
5445
5446         case KEY_y:
5447             s = scan_trans(s);
5448             TERM(sublex_start());
5449         }
5450     }}
5451 }
5452 #ifdef __SC__
5453 #pragma segment Main
5454 #endif
5455
5456 static int
5457 S_pending_ident(pTHX)
5458 {
5459     register char *d;
5460     register I32 tmp = 0;
5461     /* pit holds the identifier we read and pending_ident is reset */
5462     char pit = PL_pending_ident;
5463     PL_pending_ident = 0;
5464
5465     DEBUG_T({ PerlIO_printf(Perl_debug_log,
5466           "### Tokener saw identifier '%s'\n", PL_tokenbuf); });
5467
5468     /* if we're in a my(), we can't allow dynamics here.
5469        $foo'bar has already been turned into $foo::bar, so
5470        just check for colons.
5471
5472        if it's a legal name, the OP is a PADANY.
5473     */
5474     if (PL_in_my) {
5475         if (PL_in_my == KEY_our) {      /* "our" is merely analogous to "my" */
5476             if (strchr(PL_tokenbuf,':'))
5477                 yyerror(Perl_form(aTHX_ "No package name allowed for "
5478                                   "variable %s in \"our\"",
5479                                   PL_tokenbuf));
5480             tmp = allocmy(PL_tokenbuf);
5481         }
5482         else {
5483             if (strchr(PL_tokenbuf,':'))
5484                 yyerror(Perl_form(aTHX_ PL_no_myglob,PL_tokenbuf));
5485
5486             yylval.opval = newOP(OP_PADANY, 0);
5487             yylval.opval->op_targ = allocmy(PL_tokenbuf);
5488             return PRIVATEREF;
5489         }
5490     }
5491
5492     /*
5493        build the ops for accesses to a my() variable.
5494
5495        Deny my($a) or my($b) in a sort block, *if* $a or $b is
5496        then used in a comparison.  This catches most, but not
5497        all cases.  For instance, it catches
5498            sort { my($a); $a <=> $b }
5499        but not
5500            sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
5501        (although why you'd do that is anyone's guess).
5502     */
5503
5504     if (!strchr(PL_tokenbuf,':')) {
5505         if (!PL_in_my)
5506             tmp = pad_findmy(PL_tokenbuf);
5507         if (tmp != NOT_IN_PAD) {
5508             /* might be an "our" variable" */
5509             if (PAD_COMPNAME_FLAGS(tmp) & SVpad_OUR) {
5510                 /* build ops for a bareword */
5511                 SV *sym = newSVpv(HvNAME(PAD_COMPNAME_OURSTASH(tmp)), 0);
5512                 sv_catpvn(sym, "::", 2);
5513                 sv_catpv(sym, PL_tokenbuf+1);
5514                 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
5515                 yylval.opval->op_private = OPpCONST_ENTERED;
5516                 gv_fetchpv(SvPVX(sym),
5517                     (PL_in_eval
5518                         ? (GV_ADDMULTI | GV_ADDINEVAL)
5519                         : GV_ADDMULTI
5520                     ),
5521                     ((PL_tokenbuf[0] == '$') ? SVt_PV
5522                      : (PL_tokenbuf[0] == '@') ? SVt_PVAV
5523                      : SVt_PVHV));
5524                 return WORD;
5525             }
5526
5527             /* if it's a sort block and they're naming $a or $b */
5528             if (PL_last_lop_op == OP_SORT &&
5529                 PL_tokenbuf[0] == '$' &&
5530                 (PL_tokenbuf[1] == 'a' || PL_tokenbuf[1] == 'b')
5531                 && !PL_tokenbuf[2])
5532             {
5533                 for (d = PL_in_eval ? PL_oldoldbufptr : PL_linestart;
5534                      d < PL_bufend && *d != '\n';
5535                      d++)
5536                 {
5537                     if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
5538                         Perl_croak(aTHX_ "Can't use \"my %s\" in sort comparison",
5539                               PL_tokenbuf);
5540                     }
5541                 }
5542             }
5543
5544             yylval.opval = newOP(OP_PADANY, 0);
5545             yylval.opval->op_targ = tmp;
5546             return PRIVATEREF;
5547         }
5548     }
5549
5550     /*
5551        Whine if they've said @foo in a doublequoted string,
5552        and @foo isn't a variable we can find in the symbol
5553        table.
5554     */
5555     if (pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
5556         GV *gv = gv_fetchpv(PL_tokenbuf+1, FALSE, SVt_PVAV);
5557         if ((!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
5558              && ckWARN(WARN_AMBIGUOUS))
5559         {
5560             /* Downgraded from fatal to warning 20000522 mjd */
5561             Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
5562                         "Possible unintended interpolation of %s in string",
5563                          PL_tokenbuf);
5564         }
5565     }
5566
5567     /* build ops for a bareword */
5568     yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(PL_tokenbuf+1, 0));
5569     yylval.opval->op_private = OPpCONST_ENTERED;
5570     gv_fetchpv(PL_tokenbuf+1, PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : TRUE,
5571                ((PL_tokenbuf[0] == '$') ? SVt_PV
5572                 : (PL_tokenbuf[0] == '@') ? SVt_PVAV
5573                 : SVt_PVHV));
5574     return WORD;
5575 }
5576
5577 I32
5578 Perl_keyword(pTHX_ register char *d, I32 len)
5579 {
5580     switch (*d) {
5581     case '_':
5582         if (d[1] == '_') {
5583             if (strEQ(d,"__FILE__"))            return -KEY___FILE__;
5584             if (strEQ(d,"__LINE__"))            return -KEY___LINE__;
5585             if (strEQ(d,"__PACKAGE__"))         return -KEY___PACKAGE__;
5586             if (strEQ(d,"__DATA__"))            return KEY___DATA__;
5587             if (strEQ(d,"__END__"))             return KEY___END__;
5588         }
5589         break;
5590     case 'A':
5591         if (strEQ(d,"AUTOLOAD"))                return KEY_AUTOLOAD;
5592         break;
5593     case 'a':
5594         switch (len) {
5595         case 3:
5596             if (strEQ(d,"and"))                 return -KEY_and;
5597             if (strEQ(d,"abs"))                 return -KEY_abs;
5598             break;
5599         case 5:
5600             if (strEQ(d,"alarm"))               return -KEY_alarm;
5601             if (strEQ(d,"atan2"))               return -KEY_atan2;
5602             break;
5603         case 6:
5604             if (strEQ(d,"accept"))              return -KEY_accept;
5605             break;
5606         }
5607         break;
5608     case 'B':
5609         if (strEQ(d,"BEGIN"))                   return KEY_BEGIN;
5610         break;
5611     case 'b':
5612         if (strEQ(d,"bless"))                   return -KEY_bless;
5613         if (strEQ(d,"bind"))                    return -KEY_bind;
5614         if (strEQ(d,"binmode"))                 return -KEY_binmode;
5615         break;
5616     case 'C':
5617         if (strEQ(d,"CORE"))                    return -KEY_CORE;
5618         if (strEQ(d,"CHECK"))                   return KEY_CHECK;
5619         break;
5620     case 'c':
5621         switch (len) {
5622         case 3:
5623             if (strEQ(d,"cmp"))                 return -KEY_cmp;
5624             if (strEQ(d,"chr"))                 return -KEY_chr;
5625             if (strEQ(d,"cos"))                 return -KEY_cos;
5626             break;
5627         case 4:
5628             if (strEQ(d,"chop"))                return -KEY_chop;
5629             break;
5630         case 5:
5631             if (strEQ(d,"close"))               return -KEY_close;
5632             if (strEQ(d,"chdir"))               return -KEY_chdir;
5633             if (strEQ(d,"chomp"))               return -KEY_chomp;
5634             if (strEQ(d,"chmod"))               return -KEY_chmod;
5635             if (strEQ(d,"chown"))               return -KEY_chown;
5636             if (strEQ(d,"crypt"))               return -KEY_crypt;
5637             break;
5638         case 6:
5639             if (strEQ(d,"chroot"))              return -KEY_chroot;
5640             if (strEQ(d,"caller"))              return -KEY_caller;
5641             break;
5642         case 7:
5643             if (strEQ(d,"connect"))             return -KEY_connect;
5644             break;
5645         case 8:
5646             if (strEQ(d,"closedir"))            return -KEY_closedir;
5647             if (strEQ(d,"continue"))            return -KEY_continue;
5648             break;
5649         }
5650         break;
5651     case 'D':
5652         if (strEQ(d,"DESTROY"))                 return KEY_DESTROY;
5653         break;
5654     case 'd':
5655         switch (len) {
5656         case 2:
5657             if (strEQ(d,"do"))                  return KEY_do;
5658             break;
5659         case 3:
5660             if (strEQ(d,"die"))                 return -KEY_die;
5661             break;
5662         case 4:
5663             if (strEQ(d,"dump"))                return -KEY_dump;
5664             break;
5665         case 6:
5666             if (strEQ(d,"delete"))              return KEY_delete;
5667             break;
5668         case 7:
5669             if (strEQ(d,"defined"))             return KEY_defined;
5670             if (strEQ(d,"dbmopen"))             return -KEY_dbmopen;
5671             break;
5672         case 8:
5673             if (strEQ(d,"dbmclose"))            return -KEY_dbmclose;
5674             break;
5675         }
5676         break;
5677     case 'E':
5678         if (strEQ(d,"END"))                     return KEY_END;
5679         break;
5680     case 'e':
5681         switch (len) {
5682         case 2:
5683             if (strEQ(d,"eq"))                  return -KEY_eq;
5684             break;
5685         case 3:
5686             if (strEQ(d,"eof"))                 return -KEY_eof;
5687             if (strEQ(d,"err"))                 return -KEY_err;
5688             if (strEQ(d,"exp"))                 return -KEY_exp;
5689             break;
5690         case 4:
5691             if (strEQ(d,"else"))                return KEY_else;
5692             if (strEQ(d,"exit"))                return -KEY_exit;
5693             if (strEQ(d,"eval"))                return KEY_eval;
5694             if (strEQ(d,"exec"))                return -KEY_exec;
5695            if (strEQ(d,"each"))                return -KEY_each;
5696             break;
5697         case 5:
5698             if (strEQ(d,"elsif"))               return KEY_elsif;
5699             break;
5700         case 6:
5701             if (strEQ(d,"exists"))              return KEY_exists;
5702             if (strEQ(d,"elseif") && ckWARN_d(WARN_SYNTAX))
5703                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5704                         "elseif should be elsif");
5705             break;
5706         case 8:
5707             if (strEQ(d,"endgrent"))            return -KEY_endgrent;
5708             if (strEQ(d,"endpwent"))            return -KEY_endpwent;
5709             break;
5710         case 9:
5711             if (strEQ(d,"endnetent"))           return -KEY_endnetent;
5712             break;
5713         case 10:
5714             if (strEQ(d,"endhostent"))          return -KEY_endhostent;
5715             if (strEQ(d,"endservent"))          return -KEY_endservent;
5716             break;
5717         case 11:
5718             if (strEQ(d,"endprotoent"))         return -KEY_endprotoent;
5719             break;
5720         }
5721         break;
5722     case 'f':
5723         switch (len) {
5724         case 3:
5725             if (strEQ(d,"for"))                 return KEY_for;
5726             break;
5727         case 4:
5728             if (strEQ(d,"fork"))                return -KEY_fork;
5729             break;
5730         case 5:
5731             if (strEQ(d,"fcntl"))               return -KEY_fcntl;
5732             if (strEQ(d,"flock"))               return -KEY_flock;
5733             break;
5734         case 6:
5735             if (strEQ(d,"format"))              return KEY_format;
5736             if (strEQ(d,"fileno"))              return -KEY_fileno;
5737             break;
5738         case 7:
5739             if (strEQ(d,"foreach"))             return KEY_foreach;
5740             break;
5741         case 8:
5742             if (strEQ(d,"formline"))            return -KEY_formline;
5743             break;
5744         }
5745         break;
5746     case 'g':
5747         if (strnEQ(d,"get",3)) {
5748             d += 3;
5749             if (*d == 'p') {
5750                 switch (len) {
5751                 case 7:
5752                     if (strEQ(d,"ppid"))        return -KEY_getppid;
5753                     if (strEQ(d,"pgrp"))        return -KEY_getpgrp;
5754                     break;
5755                 case 8:
5756                     if (strEQ(d,"pwent"))       return -KEY_getpwent;
5757                     if (strEQ(d,"pwnam"))       return -KEY_getpwnam;
5758                     if (strEQ(d,"pwuid"))       return -KEY_getpwuid;
5759                     break;
5760                 case 11:
5761                     if (strEQ(d,"peername"))    return -KEY_getpeername;
5762                     if (strEQ(d,"protoent"))    return -KEY_getprotoent;
5763                     if (strEQ(d,"priority"))    return -KEY_getpriority;
5764                     break;
5765                 case 14:
5766                     if (strEQ(d,"protobyname")) return -KEY_getprotobyname;
5767                     break;
5768                 case 16:
5769                     if (strEQ(d,"protobynumber"))return -KEY_getprotobynumber;
5770                     break;
5771                 }
5772             }
5773             else if (*d == 'h') {
5774                 if (strEQ(d,"hostbyname"))      return -KEY_gethostbyname;
5775                 if (strEQ(d,"hostbyaddr"))      return -KEY_gethostbyaddr;
5776                 if (strEQ(d,"hostent"))         return -KEY_gethostent;
5777             }
5778             else if (*d == 'n') {
5779                 if (strEQ(d,"netbyname"))       return -KEY_getnetbyname;
5780                 if (strEQ(d,"netbyaddr"))       return -KEY_getnetbyaddr;
5781                 if (strEQ(d,"netent"))          return -KEY_getnetent;
5782             }
5783             else if (*d == 's') {
5784                 if (strEQ(d,"servbyname"))      return -KEY_getservbyname;
5785                 if (strEQ(d,"servbyport"))      return -KEY_getservbyport;
5786                 if (strEQ(d,"servent"))         return -KEY_getservent;
5787                 if (strEQ(d,"sockname"))        return -KEY_getsockname;
5788                 if (strEQ(d,"sockopt"))         return -KEY_getsockopt;
5789             }
5790             else if (*d == 'g') {
5791                 if (strEQ(d,"grent"))           return -KEY_getgrent;
5792                 if (strEQ(d,"grnam"))           return -KEY_getgrnam;
5793                 if (strEQ(d,"grgid"))           return -KEY_getgrgid;
5794             }
5795             else if (*d == 'l') {
5796                 if (strEQ(d,"login"))           return -KEY_getlogin;
5797             }
5798             else if (*d == 'c' && d[1] == '\0') return -KEY_getc;
5799             break;
5800         }
5801         switch (len) {
5802         case 2:
5803             if (strEQ(d,"gt"))                  return -KEY_gt;
5804             if (strEQ(d,"ge"))                  return -KEY_ge;
5805             break;
5806         case 4:
5807             if (strEQ(d,"grep"))                return KEY_grep;
5808             if (strEQ(d,"goto"))                return KEY_goto;
5809             if (strEQ(d,"glob"))                return KEY_glob;
5810             break;
5811         case 6:
5812             if (strEQ(d,"gmtime"))              return -KEY_gmtime;
5813             break;
5814         }
5815         break;
5816     case 'h':
5817         if (strEQ(d,"hex"))                     return -KEY_hex;
5818         break;
5819     case 'I':
5820         if (strEQ(d,"INIT"))                    return KEY_INIT;
5821         break;
5822     case 'i':
5823         switch (len) {
5824         case 2:
5825             if (strEQ(d,"if"))                  return KEY_if;
5826             break;
5827         case 3:
5828             if (strEQ(d,"int"))                 return -KEY_int;
5829             break;
5830         case 5:
5831             if (strEQ(d,"index"))               return -KEY_index;
5832             if (strEQ(d,"ioctl"))               return -KEY_ioctl;
5833             break;
5834         }
5835         break;
5836     case 'j':
5837         if (strEQ(d,"join"))                    return -KEY_join;
5838         break;
5839     case 'k':
5840         if (len == 4) {
5841            if (strEQ(d,"keys"))                return -KEY_keys;
5842             if (strEQ(d,"kill"))                return -KEY_kill;
5843         }
5844         break;
5845     case 'l':
5846         switch (len) {
5847         case 2:
5848             if (strEQ(d,"lt"))                  return -KEY_lt;
5849             if (strEQ(d,"le"))                  return -KEY_le;
5850             if (strEQ(d,"lc"))                  return -KEY_lc;
5851             break;
5852         case 3:
5853             if (strEQ(d,"log"))                 return -KEY_log;
5854             break;
5855         case 4:
5856             if (strEQ(d,"last"))                return KEY_last;
5857             if (strEQ(d,"link"))                return -KEY_link;
5858             if (strEQ(d,"lock"))                return -KEY_lock;
5859             break;
5860         case 5:
5861             if (strEQ(d,"local"))               return KEY_local;
5862             if (strEQ(d,"lstat"))               return -KEY_lstat;
5863             break;
5864         case 6:
5865             if (strEQ(d,"length"))              return -KEY_length;
5866             if (strEQ(d,"listen"))              return -KEY_listen;
5867             break;
5868         case 7:
5869             if (strEQ(d,"lcfirst"))             return -KEY_lcfirst;
5870             break;
5871         case 9:
5872             if (strEQ(d,"localtime"))           return -KEY_localtime;
5873             break;
5874         }
5875         break;
5876     case 'm':
5877         switch (len) {
5878         case 1:                                 return KEY_m;
5879         case 2:
5880             if (strEQ(d,"my"))                  return KEY_my;
5881             break;
5882         case 3:
5883             if (strEQ(d,"map"))                 return KEY_map;
5884             break;
5885         case 5:
5886             if (strEQ(d,"mkdir"))               return -KEY_mkdir;
5887             break;
5888         case 6:
5889             if (strEQ(d,"msgctl"))              return -KEY_msgctl;
5890             if (strEQ(d,"msgget"))              return -KEY_msgget;
5891             if (strEQ(d,"msgrcv"))              return -KEY_msgrcv;
5892             if (strEQ(d,"msgsnd"))              return -KEY_msgsnd;
5893             break;
5894         }
5895         break;
5896     case 'n':
5897         if (strEQ(d,"next"))                    return KEY_next;
5898         if (strEQ(d,"ne"))                      return -KEY_ne;
5899         if (strEQ(d,"not"))                     return -KEY_not;
5900         if (strEQ(d,"no"))                      return KEY_no;
5901         break;
5902     case 'o':
5903         switch (len) {
5904         case 2:
5905             if (strEQ(d,"or"))                  return -KEY_or;
5906             break;
5907         case 3:
5908             if (strEQ(d,"ord"))                 return -KEY_ord;
5909             if (strEQ(d,"oct"))                 return -KEY_oct;
5910             if (strEQ(d,"our"))                 return KEY_our;
5911             break;
5912         case 4:
5913             if (strEQ(d,"open"))                return -KEY_open;
5914             break;
5915         case 7:
5916             if (strEQ(d,"opendir"))             return -KEY_opendir;
5917             break;
5918         }
5919         break;
5920     case 'p':
5921         switch (len) {
5922         case 3:
5923            if (strEQ(d,"pop"))                 return -KEY_pop;
5924             if (strEQ(d,"pos"))                 return KEY_pos;
5925             break;
5926         case 4:
5927            if (strEQ(d,"push"))                return -KEY_push;
5928             if (strEQ(d,"pack"))                return -KEY_pack;
5929             if (strEQ(d,"pipe"))                return -KEY_pipe;
5930             break;
5931         case 5:
5932             if (strEQ(d,"print"))               return KEY_print;
5933             break;
5934         case 6:
5935             if (strEQ(d,"printf"))              return KEY_printf;
5936             break;
5937         case 7:
5938             if (strEQ(d,"package"))             return KEY_package;
5939             break;
5940         case 9:
5941             if (strEQ(d,"prototype"))           return KEY_prototype;
5942         }
5943         break;
5944     case 'q':
5945         if (len == 1) {
5946                                                 return KEY_q;
5947         }
5948         else if (len == 2) {
5949             switch (d[1]) {
5950             case 'r':                           return KEY_qr;
5951             case 'q':                           return KEY_qq;
5952             case 'w':                           return KEY_qw;
5953             case 'x':                           return KEY_qx;
5954             };
5955         }
5956         else if (strEQ(d,"quotemeta"))          return -KEY_quotemeta;
5957         break;
5958     case 'r':
5959         switch (len) {
5960         case 3:
5961             if (strEQ(d,"ref"))                 return -KEY_ref;
5962             break;
5963         case 4:
5964             if (strEQ(d,"read"))                return -KEY_read;
5965             if (strEQ(d,"rand"))                return -KEY_rand;
5966             if (strEQ(d,"recv"))                return -KEY_recv;
5967             if (strEQ(d,"redo"))                return KEY_redo;
5968             break;
5969         case 5:
5970             if (strEQ(d,"rmdir"))               return -KEY_rmdir;
5971             if (strEQ(d,"reset"))               return -KEY_reset;
5972             break;
5973         case 6:
5974             if (strEQ(d,"return"))              return KEY_return;
5975             if (strEQ(d,"rename"))              return -KEY_rename;
5976             if (strEQ(d,"rindex"))              return -KEY_rindex;
5977             break;
5978         case 7:
5979             if (strEQ(d,"require"))             return KEY_require;
5980             if (strEQ(d,"reverse"))             return -KEY_reverse;
5981             if (strEQ(d,"readdir"))             return -KEY_readdir;
5982             break;
5983         case 8:
5984             if (strEQ(d,"readlink"))            return -KEY_readlink;
5985             if (strEQ(d,"readline"))            return -KEY_readline;
5986             if (strEQ(d,"readpipe"))            return -KEY_readpipe;
5987             break;
5988         case 9:
5989             if (strEQ(d,"rewinddir"))           return -KEY_rewinddir;
5990             break;
5991         }
5992         break;
5993     case 's':
5994         switch (d[1]) {
5995         case 0:                                 return KEY_s;
5996         case 'c':
5997             if (strEQ(d,"scalar"))              return KEY_scalar;
5998             break;
5999         case 'e':
6000             switch (len) {
6001             case 4:
6002                 if (strEQ(d,"seek"))            return -KEY_seek;
6003                 if (strEQ(d,"send"))            return -KEY_send;
6004                 break;
6005             case 5:
6006                 if (strEQ(d,"semop"))           return -KEY_semop;
6007                 break;
6008             case 6:
6009                 if (strEQ(d,"select"))          return -KEY_select;
6010                 if (strEQ(d,"semctl"))          return -KEY_semctl;
6011                 if (strEQ(d,"semget"))          return -KEY_semget;
6012                 break;
6013             case 7:
6014                 if (strEQ(d,"setpgrp"))         return -KEY_setpgrp;
6015                 if (strEQ(d,"seekdir"))         return -KEY_seekdir;
6016                 break;
6017             case 8:
6018                 if (strEQ(d,"setpwent"))        return -KEY_setpwent;
6019                 if (strEQ(d,"setgrent"))        return -KEY_setgrent;
6020                 break;
6021             case 9:
6022                 if (strEQ(d,"setnetent"))       return -KEY_setnetent;
6023                 break;
6024             case 10:
6025                 if (strEQ(d,"setsockopt"))      return -KEY_setsockopt;
6026                 if (strEQ(d,"sethostent"))      return -KEY_sethostent;
6027                 if (strEQ(d,"setservent"))      return -KEY_setservent;
6028                 break;
6029             case 11:
6030                 if (strEQ(d,"setpriority"))     return -KEY_setpriority;
6031                 if (strEQ(d,"setprotoent"))     return -KEY_setprotoent;
6032                 break;
6033             }
6034             break;
6035         case 'h':
6036             switch (len) {
6037             case 5:
6038                if (strEQ(d,"shift"))           return -KEY_shift;
6039                 break;
6040             case 6:
6041                 if (strEQ(d,"shmctl"))          return -KEY_shmctl;
6042                 if (strEQ(d,"shmget"))          return -KEY_shmget;
6043                 break;
6044             case 7:
6045                 if (strEQ(d,"shmread"))         return -KEY_shmread;
6046                 break;
6047             case 8:
6048                 if (strEQ(d,"shmwrite"))        return -KEY_shmwrite;
6049                 if (strEQ(d,"shutdown"))        return -KEY_shutdown;
6050                 break;
6051             }
6052             break;
6053         case 'i':
6054             if (strEQ(d,"sin"))                 return -KEY_sin;
6055             break;
6056         case 'l':
6057             if (strEQ(d,"sleep"))               return -KEY_sleep;
6058             break;
6059         case 'o':
6060             if (strEQ(d,"sort"))                return KEY_sort;
6061             if (strEQ(d,"socket"))              return -KEY_socket;
6062             if (strEQ(d,"socketpair"))          return -KEY_socketpair;
6063             break;
6064         case 'p':
6065             if (strEQ(d,"split"))               return KEY_split;
6066             if (strEQ(d,"sprintf"))             return -KEY_sprintf;
6067            if (strEQ(d,"splice"))              return -KEY_splice;
6068             break;
6069         case 'q':
6070             if (strEQ(d,"sqrt"))                return -KEY_sqrt;
6071             break;
6072         case 'r':
6073             if (strEQ(d,"srand"))               return -KEY_srand;
6074             break;
6075         case 't':
6076             if (strEQ(d,"stat"))                return -KEY_stat;
6077             if (strEQ(d,"study"))               return KEY_study;
6078             break;
6079         case 'u':
6080             if (strEQ(d,"substr"))              return -KEY_substr;
6081             if (strEQ(d,"sub"))                 return KEY_sub;
6082             break;
6083         case 'y':
6084             switch (len) {
6085             case 6:
6086                 if (strEQ(d,"system"))          return -KEY_system;
6087                 break;
6088             case 7:
6089                 if (strEQ(d,"symlink"))         return -KEY_symlink;
6090                 if (strEQ(d,"syscall"))         return -KEY_syscall;
6091                 if (strEQ(d,"sysopen"))         return -KEY_sysopen;
6092                 if (strEQ(d,"sysread"))         return -KEY_sysread;
6093                 if (strEQ(d,"sysseek"))         return -KEY_sysseek;
6094                 break;
6095             case 8:
6096                 if (strEQ(d,"syswrite"))        return -KEY_syswrite;
6097                 break;
6098             }
6099             break;
6100         }
6101         break;
6102     case 't':
6103         switch (len) {
6104         case 2:
6105             if (strEQ(d,"tr"))                  return KEY_tr;
6106             break;
6107         case 3:
6108             if (strEQ(d,"tie"))                 return KEY_tie;
6109             break;
6110         case 4:
6111             if (strEQ(d,"tell"))                return -KEY_tell;
6112             if (strEQ(d,"tied"))                return KEY_tied;
6113             if (strEQ(d,"time"))                return -KEY_time;
6114             break;
6115         case 5:
6116             if (strEQ(d,"times"))               return -KEY_times;
6117             break;
6118         case 7:
6119             if (strEQ(d,"telldir"))             return -KEY_telldir;
6120             break;
6121         case 8:
6122             if (strEQ(d,"truncate"))            return -KEY_truncate;
6123             break;
6124         }
6125         break;
6126     case 'u':
6127         switch (len) {
6128         case 2:
6129             if (strEQ(d,"uc"))                  return -KEY_uc;
6130             break;
6131         case 3:
6132             if (strEQ(d,"use"))                 return KEY_use;
6133             break;
6134         case 5:
6135             if (strEQ(d,"undef"))               return KEY_undef;
6136             if (strEQ(d,"until"))               return KEY_until;
6137             if (strEQ(d,"untie"))               return KEY_untie;
6138             if (strEQ(d,"utime"))               return -KEY_utime;
6139             if (strEQ(d,"umask"))               return -KEY_umask;
6140             break;
6141         case 6:
6142             if (strEQ(d,"unless"))              return KEY_unless;
6143             if (strEQ(d,"unpack"))              return -KEY_unpack;
6144             if (strEQ(d,"unlink"))              return -KEY_unlink;
6145             break;
6146         case 7:
6147            if (strEQ(d,"unshift"))             return -KEY_unshift;
6148             if (strEQ(d,"ucfirst"))             return -KEY_ucfirst;
6149             break;
6150         }
6151         break;
6152     case 'v':
6153         if (strEQ(d,"values"))                  return -KEY_values;
6154         if (strEQ(d,"vec"))                     return -KEY_vec;
6155         break;
6156     case 'w':
6157         switch (len) {
6158         case 4:
6159             if (strEQ(d,"warn"))                return -KEY_warn;
6160             if (strEQ(d,"wait"))                return -KEY_wait;
6161             break;
6162         case 5:
6163             if (strEQ(d,"while"))               return KEY_while;
6164             if (strEQ(d,"write"))               return -KEY_write;
6165             break;
6166         case 7:
6167             if (strEQ(d,"waitpid"))             return -KEY_waitpid;
6168             break;
6169         case 9:
6170             if (strEQ(d,"wantarray"))           return -KEY_wantarray;
6171             break;
6172         }
6173         break;
6174     case 'x':
6175         if (len == 1)                           return -KEY_x;
6176         if (strEQ(d,"xor"))                     return -KEY_xor;
6177         break;
6178     case 'y':
6179         if (len == 1)                           return KEY_y;
6180         break;
6181     case 'z':
6182         break;
6183     }
6184     return 0;
6185 }
6186
6187 STATIC void
6188 S_checkcomma(pTHX_ register char *s, char *name, char *what)
6189 {
6190     char *w;
6191
6192     if (*s == ' ' && s[1] == '(') {     /* XXX gotta be a better way */
6193         if (ckWARN(WARN_SYNTAX)) {
6194             int level = 1;
6195             for (w = s+2; *w && level; w++) {
6196                 if (*w == '(')
6197                     ++level;
6198                 else if (*w == ')')
6199                     --level;
6200             }
6201             if (*w)
6202                 for (; *w && isSPACE(*w); w++) ;
6203             if (!*w || !strchr(";|})]oaiuw!=", *w))     /* an advisory hack only... */
6204                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
6205                             "%s (...) interpreted as function",name);
6206         }
6207     }
6208     while (s < PL_bufend && isSPACE(*s))
6209         s++;
6210     if (*s == '(')
6211         s++;
6212     while (s < PL_bufend && isSPACE(*s))
6213         s++;
6214     if (isIDFIRST_lazy_if(s,UTF)) {
6215         w = s++;
6216         while (isALNUM_lazy_if(s,UTF))
6217             s++;
6218         while (s < PL_bufend && isSPACE(*s))
6219             s++;
6220         if (*s == ',') {
6221             int kw;
6222             *s = '\0';
6223             kw = keyword(w, s - w) || get_cv(w, FALSE) != 0;
6224             *s = ',';
6225             if (kw)
6226                 return;
6227             Perl_croak(aTHX_ "No comma allowed after %s", what);
6228         }
6229     }
6230 }
6231
6232 /* Either returns sv, or mortalizes sv and returns a new SV*.
6233    Best used as sv=new_constant(..., sv, ...).
6234    If s, pv are NULL, calls subroutine with one argument,
6235    and type is used with error messages only. */
6236
6237 STATIC SV *
6238 S_new_constant(pTHX_ char *s, STRLEN len, const char *key, SV *sv, SV *pv,
6239                const char *type)
6240 {
6241     dSP;
6242     HV *table = GvHV(PL_hintgv);                 /* ^H */
6243     SV *res;
6244     SV **cvp;
6245     SV *cv, *typesv;
6246     const char *why1, *why2, *why3;
6247
6248     if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
6249         SV *msg;
6250         
6251         why2 = strEQ(key,"charnames")
6252                ? "(possibly a missing \"use charnames ...\")"
6253                : "";
6254         msg = Perl_newSVpvf(aTHX_ "Constant(%s) unknown: %s",
6255                             (type ? type: "undef"), why2);
6256
6257         /* This is convoluted and evil ("goto considered harmful")
6258          * but I do not understand the intricacies of all the different
6259          * failure modes of %^H in here.  The goal here is to make
6260          * the most probable error message user-friendly. --jhi */
6261
6262         goto msgdone;
6263
6264     report:
6265         msg = Perl_newSVpvf(aTHX_ "Constant(%s): %s%s%s",
6266                             (type ? type: "undef"), why1, why2, why3);
6267     msgdone:
6268         yyerror(SvPVX(msg));
6269         SvREFCNT_dec(msg);
6270         return sv;
6271     }
6272     cvp = hv_fetch(table, key, strlen(key), FALSE);
6273     if (!cvp || !SvOK(*cvp)) {
6274         why1 = "$^H{";
6275         why2 = key;
6276         why3 = "} is not defined";
6277         goto report;
6278     }
6279     sv_2mortal(sv);                     /* Parent created it permanently */
6280     cv = *cvp;
6281     if (!pv && s)
6282         pv = sv_2mortal(newSVpvn(s, len));
6283     if (type && pv)
6284         typesv = sv_2mortal(newSVpv(type, 0));
6285     else
6286         typesv = &PL_sv_undef;
6287
6288     PUSHSTACKi(PERLSI_OVERLOAD);
6289     ENTER ;
6290     SAVETMPS;
6291
6292     PUSHMARK(SP) ;
6293     EXTEND(sp, 3);
6294     if (pv)
6295         PUSHs(pv);
6296     PUSHs(sv);
6297     if (pv)
6298         PUSHs(typesv);
6299     PUTBACK;
6300     call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
6301
6302     SPAGAIN ;
6303
6304     /* Check the eval first */
6305     if (!PL_in_eval && SvTRUE(ERRSV)) {
6306         STRLEN n_a;
6307         sv_catpv(ERRSV, "Propagated");
6308         yyerror(SvPV(ERRSV, n_a)); /* Duplicates the message inside eval */
6309         (void)POPs;
6310         res = SvREFCNT_inc(sv);
6311     }
6312     else {
6313         res = POPs;
6314         (void)SvREFCNT_inc(res);
6315     }
6316
6317     PUTBACK ;
6318     FREETMPS ;
6319     LEAVE ;
6320     POPSTACK;
6321
6322     if (!SvOK(res)) {
6323         why1 = "Call to &{$^H{";
6324         why2 = key;
6325         why3 = "}} did not return a defined value";
6326         sv = res;
6327         goto report;
6328     }
6329
6330     return res;
6331 }
6332
6333 STATIC char *
6334 S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
6335 {
6336     register char *d = dest;
6337     register char *e = d + destlen - 3;  /* two-character token, ending NUL */
6338     for (;;) {
6339         if (d >= e)
6340             Perl_croak(aTHX_ ident_too_long);
6341         if (isALNUM(*s))        /* UTF handled below */
6342             *d++ = *s++;
6343         else if (*s == '\'' && allow_package && isIDFIRST_lazy_if(s+1,UTF)) {
6344             *d++ = ':';
6345             *d++ = ':';
6346             s++;
6347         }
6348         else if (*s == ':' && s[1] == ':' && allow_package && s[2] != '$') {
6349             *d++ = *s++;
6350             *d++ = *s++;
6351         }
6352         else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
6353             char *t = s + UTF8SKIP(s);
6354             while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
6355                 t += UTF8SKIP(t);
6356             if (d + (t - s) > e)
6357                 Perl_croak(aTHX_ ident_too_long);
6358             Copy(s, d, t - s, char);
6359             d += t - s;
6360             s = t;
6361         }
6362         else {
6363             *d = '\0';
6364             *slp = d - dest;
6365             return s;
6366         }
6367     }
6368 }
6369
6370 STATIC char *
6371 S_scan_ident(pTHX_ register char *s, register char *send, char *dest, STRLEN destlen, I32 ck_uni)
6372 {
6373     register char *d;
6374     register char *e;
6375     char *bracket = 0;
6376     char funny = *s++;
6377
6378     if (isSPACE(*s))
6379         s = skipspace(s);
6380     d = dest;
6381     e = d + destlen - 3;        /* two-character token, ending NUL */
6382     if (isDIGIT(*s)) {
6383         while (isDIGIT(*s)) {
6384             if (d >= e)
6385                 Perl_croak(aTHX_ ident_too_long);
6386             *d++ = *s++;
6387         }
6388     }
6389     else {
6390         for (;;) {
6391             if (d >= e)
6392                 Perl_croak(aTHX_ ident_too_long);
6393             if (isALNUM(*s))    /* UTF handled below */
6394                 *d++ = *s++;
6395             else if (*s == '\'' && isIDFIRST_lazy_if(s+1,UTF)) {
6396                 *d++ = ':';
6397                 *d++ = ':';
6398                 s++;
6399             }
6400             else if (*s == ':' && s[1] == ':') {
6401                 *d++ = *s++;
6402                 *d++ = *s++;
6403             }
6404             else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
6405                 char *t = s + UTF8SKIP(s);
6406                 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
6407                     t += UTF8SKIP(t);
6408                 if (d + (t - s) > e)
6409                     Perl_croak(aTHX_ ident_too_long);
6410                 Copy(s, d, t - s, char);
6411                 d += t - s;
6412                 s = t;
6413             }
6414             else
6415                 break;
6416         }
6417     }
6418     *d = '\0';
6419     d = dest;
6420     if (*d) {
6421         if (PL_lex_state != LEX_NORMAL)
6422             PL_lex_state = LEX_INTERPENDMAYBE;
6423         return s;
6424     }
6425     if (*s == '$' && s[1] &&
6426         (isALNUM_lazy_if(s+1,UTF) || s[1] == '$' || s[1] == '{' || strnEQ(s+1,"::",2)) )
6427     {
6428         return s;
6429     }
6430     if (*s == '{') {
6431         bracket = s;
6432         s++;
6433     }
6434     else if (ck_uni)
6435         check_uni();
6436     if (s < send)
6437         *d = *s++;
6438     d[1] = '\0';
6439     if (*d == '^' && *s && isCONTROLVAR(*s)) {
6440         *d = toCTRL(*s);
6441         s++;
6442     }
6443     if (bracket) {
6444         if (isSPACE(s[-1])) {
6445             while (s < send) {
6446                 char ch = *s++;
6447                 if (!SPACE_OR_TAB(ch)) {
6448                     *d = ch;
6449                     break;
6450                 }
6451             }
6452         }
6453         if (isIDFIRST_lazy_if(d,UTF)) {
6454             d++;
6455             if (UTF) {
6456                 e = s;
6457                 while ((e < send && isALNUM_lazy_if(e,UTF)) || *e == ':') {
6458                     e += UTF8SKIP(e);
6459                     while (e < send && UTF8_IS_CONTINUED(*e) && is_utf8_mark((U8*)e))
6460                         e += UTF8SKIP(e);
6461                 }
6462                 Copy(s, d, e - s, char);
6463                 d += e - s;
6464                 s = e;
6465             }
6466             else {
6467                 while ((isALNUM(*s) || *s == ':') && d < e)
6468                     *d++ = *s++;
6469                 if (d >= e)
6470                     Perl_croak(aTHX_ ident_too_long);
6471             }
6472             *d = '\0';
6473             while (s < send && SPACE_OR_TAB(*s)) s++;
6474             if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
6475                 if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest)) {
6476                     const char *brack = *s == '[' ? "[...]" : "{...}";
6477                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
6478                         "Ambiguous use of %c{%s%s} resolved to %c%s%s",
6479                         funny, dest, brack, funny, dest, brack);
6480                 }
6481                 bracket++;
6482                 PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
6483                 return s;
6484             }
6485         }
6486         /* Handle extended ${^Foo} variables
6487          * 1999-02-27 mjd-perl-patch@plover.com */
6488         else if (!isALNUM(*d) && !isPRINT(*d) /* isCTRL(d) */
6489                  && isALNUM(*s))
6490         {
6491             d++;
6492             while (isALNUM(*s) && d < e) {
6493                 *d++ = *s++;
6494             }
6495             if (d >= e)
6496                 Perl_croak(aTHX_ ident_too_long);
6497             *d = '\0';
6498         }
6499         if (*s == '}') {
6500             s++;
6501             if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) {
6502                 PL_lex_state = LEX_INTERPEND;
6503                 PL_expect = XREF;
6504             }
6505             if (funny == '#')
6506                 funny = '@';
6507             if (PL_lex_state == LEX_NORMAL) {
6508                 if (ckWARN(WARN_AMBIGUOUS) &&
6509                     (keyword(dest, d - dest) || get_cv(dest, FALSE)))
6510                 {
6511                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
6512                         "Ambiguous use of %c{%s} resolved to %c%s",
6513                         funny, dest, funny, dest);
6514                 }
6515             }
6516         }
6517         else {
6518             s = bracket;                /* let the parser handle it */
6519             *dest = '\0';
6520         }
6521     }
6522     else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
6523         PL_lex_state = LEX_INTERPEND;
6524     return s;
6525 }
6526
6527 void
6528 Perl_pmflag(pTHX_ U32* pmfl, int ch)
6529 {
6530     if (ch == 'i')
6531         *pmfl |= PMf_FOLD;
6532     else if (ch == 'g')
6533         *pmfl |= PMf_GLOBAL;
6534     else if (ch == 'c')
6535         *pmfl |= PMf_CONTINUE;
6536     else if (ch == 'o')
6537         *pmfl |= PMf_KEEP;
6538     else if (ch == 'm')
6539         *pmfl |= PMf_MULTILINE;
6540     else if (ch == 's')
6541         *pmfl |= PMf_SINGLELINE;
6542     else if (ch == 'x')
6543         *pmfl |= PMf_EXTENDED;
6544 }
6545
6546 STATIC char *
6547 S_scan_pat(pTHX_ char *start, I32 type)
6548 {
6549     PMOP *pm;
6550     char *s;
6551
6552     s = scan_str(start,FALSE,FALSE);
6553     if (!s)
6554         Perl_croak(aTHX_ "Search pattern not terminated");
6555
6556     pm = (PMOP*)newPMOP(type, 0);
6557     if (PL_multi_open == '?')
6558         pm->op_pmflags |= PMf_ONCE;
6559     if(type == OP_QR) {
6560         while (*s && strchr("iomsx", *s))
6561             pmflag(&pm->op_pmflags,*s++);
6562     }
6563     else {
6564         while (*s && strchr("iogcmsx", *s))
6565             pmflag(&pm->op_pmflags,*s++);
6566     }
6567     /* issue a warning if /c is specified,but /g is not */
6568     if (ckWARN(WARN_REGEXP) && 
6569         (pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL))
6570     {
6571         Perl_warner(aTHX_ packWARN(WARN_REGEXP), c_without_g);
6572     }
6573
6574     pm->op_pmpermflags = pm->op_pmflags;
6575
6576     PL_lex_op = (OP*)pm;
6577     yylval.ival = OP_MATCH;
6578     return s;
6579 }
6580
6581 STATIC char *
6582 S_scan_subst(pTHX_ char *start)
6583 {
6584     register char *s;
6585     register PMOP *pm;
6586     I32 first_start;
6587     I32 es = 0;
6588
6589     yylval.ival = OP_NULL;
6590
6591     s = scan_str(start,FALSE,FALSE);
6592
6593     if (!s)
6594         Perl_croak(aTHX_ "Substitution pattern not terminated");
6595
6596     if (s[-1] == PL_multi_open)
6597         s--;
6598
6599     first_start = PL_multi_start;
6600     s = scan_str(s,FALSE,FALSE);
6601     if (!s) {
6602         if (PL_lex_stuff) {
6603             SvREFCNT_dec(PL_lex_stuff);
6604             PL_lex_stuff = Nullsv;
6605         }
6606         Perl_croak(aTHX_ "Substitution replacement not terminated");
6607     }
6608     PL_multi_start = first_start;       /* so whole substitution is taken together */
6609
6610     pm = (PMOP*)newPMOP(OP_SUBST, 0);
6611     while (*s) {
6612         if (*s == 'e') {
6613             s++;
6614             es++;
6615         }
6616         else if (strchr("iogcmsx", *s))
6617             pmflag(&pm->op_pmflags,*s++);
6618         else
6619             break;
6620     }
6621
6622     /* /c is not meaningful with s/// */
6623     if (ckWARN(WARN_REGEXP) && (pm->op_pmflags & PMf_CONTINUE))
6624     {
6625         Perl_warner(aTHX_ packWARN(WARN_REGEXP), c_in_subst);
6626     }
6627
6628     if (es) {
6629         SV *repl;
6630         PL_sublex_info.super_bufptr = s;
6631         PL_sublex_info.super_bufend = PL_bufend;
6632         PL_multi_end = 0;
6633         pm->op_pmflags |= PMf_EVAL;
6634         repl = newSVpvn("",0);
6635         while (es-- > 0)
6636             sv_catpv(repl, es ? "eval " : "do ");
6637         sv_catpvn(repl, "{ ", 2);
6638         sv_catsv(repl, PL_lex_repl);
6639         sv_catpvn(repl, " };", 2);
6640         SvEVALED_on(repl);
6641         SvREFCNT_dec(PL_lex_repl);
6642         PL_lex_repl = repl;
6643     }
6644
6645     pm->op_pmpermflags = pm->op_pmflags;
6646     PL_lex_op = (OP*)pm;
6647     yylval.ival = OP_SUBST;
6648     return s;
6649 }
6650
6651 STATIC char *
6652 S_scan_trans(pTHX_ char *start)
6653 {
6654     register char* s;
6655     OP *o;
6656     short *tbl;
6657     I32 squash;
6658     I32 del;
6659     I32 complement;
6660
6661     yylval.ival = OP_NULL;
6662
6663     s = scan_str(start,FALSE,FALSE);
6664     if (!s)
6665         Perl_croak(aTHX_ "Transliteration pattern not terminated");
6666     if (s[-1] == PL_multi_open)
6667         s--;
6668
6669     s = scan_str(s,FALSE,FALSE);
6670     if (!s) {
6671         if (PL_lex_stuff) {
6672             SvREFCNT_dec(PL_lex_stuff);
6673             PL_lex_stuff = Nullsv;
6674         }
6675         Perl_croak(aTHX_ "Transliteration replacement not terminated");
6676     }
6677
6678     complement = del = squash = 0;
6679     while (1) {
6680         switch (*s) {
6681         case 'c':
6682             complement = OPpTRANS_COMPLEMENT;
6683             break;
6684         case 'd':
6685             del = OPpTRANS_DELETE;
6686             break;
6687         case 's':
6688             squash = OPpTRANS_SQUASH;
6689             break;
6690         default:
6691             goto no_more;
6692         }
6693         s++;
6694     }
6695   no_more:
6696
6697     New(803, tbl, complement&&!del?258:256, short);
6698     o = newPVOP(OP_TRANS, 0, (char*)tbl);
6699     o->op_private &= ~OPpTRANS_ALL;
6700     o->op_private |= del|squash|complement|
6701       (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
6702       (DO_UTF8(PL_lex_repl) ? OPpTRANS_TO_UTF   : 0);
6703
6704     PL_lex_op = o;
6705     yylval.ival = OP_TRANS;
6706     return s;
6707 }
6708
6709 STATIC char *
6710 S_scan_heredoc(pTHX_ register char *s)
6711 {
6712     SV *herewas;
6713     I32 op_type = OP_SCALAR;
6714     I32 len;
6715     SV *tmpstr;
6716     char term;
6717     register char *d;
6718     register char *e;
6719     char *peek;
6720     int outer = (PL_rsfp && !(PL_lex_inwhat == OP_SCALAR));
6721
6722     s += 2;
6723     d = PL_tokenbuf;
6724     e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
6725     if (!outer)
6726         *d++ = '\n';
6727     for (peek = s; SPACE_OR_TAB(*peek); peek++) ;
6728     if (*peek == '`' || *peek == '\'' || *peek =='"') {
6729         s = peek;
6730         term = *s++;
6731         s = delimcpy(d, e, s, PL_bufend, term, &len);
6732         d += len;
6733         if (s < PL_bufend)
6734             s++;
6735     }
6736     else {
6737         if (*s == '\\')
6738             s++, term = '\'';
6739         else
6740             term = '"';
6741         if (!isALNUM_lazy_if(s,UTF))
6742             deprecate_old("bare << to mean <<\"\"");
6743         for (; isALNUM_lazy_if(s,UTF); s++) {
6744             if (d < e)
6745                 *d++ = *s;
6746         }
6747     }
6748     if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
6749         Perl_croak(aTHX_ "Delimiter for here document is too long");
6750     *d++ = '\n';
6751     *d = '\0';
6752     len = d - PL_tokenbuf;
6753 #ifndef PERL_STRICT_CR
6754     d = strchr(s, '\r');
6755     if (d) {
6756         char *olds = s;
6757         s = d;
6758         while (s < PL_bufend) {
6759             if (*s == '\r') {
6760                 *d++ = '\n';
6761                 if (*++s == '\n')
6762                     s++;
6763             }
6764             else if (*s == '\n' && s[1] == '\r') {      /* \015\013 on a mac? */
6765                 *d++ = *s++;
6766                 s++;
6767             }
6768             else
6769                 *d++ = *s++;
6770         }
6771         *d = '\0';
6772         PL_bufend = d;
6773         SvCUR_set(PL_linestr, PL_bufend - SvPVX(PL_linestr));
6774         s = olds;
6775     }
6776 #endif
6777     d = "\n";
6778     if (outer || !(d=ninstr(s,PL_bufend,d,d+1)))
6779         herewas = newSVpvn(s,PL_bufend-s);
6780     else
6781         s--, herewas = newSVpvn(s,d-s);
6782     s += SvCUR(herewas);
6783
6784     tmpstr = NEWSV(87,79);
6785     sv_upgrade(tmpstr, SVt_PVIV);
6786     if (term == '\'') {
6787         op_type = OP_CONST;
6788         SvIVX(tmpstr) = -1;
6789     }
6790     else if (term == '`') {
6791         op_type = OP_BACKTICK;
6792         SvIVX(tmpstr) = '\\';
6793     }
6794
6795     CLINE;
6796     PL_multi_start = CopLINE(PL_curcop);
6797     PL_multi_open = PL_multi_close = '<';
6798     term = *PL_tokenbuf;
6799     if (PL_lex_inwhat == OP_SUBST && PL_in_eval && !PL_rsfp) {
6800         char *bufptr = PL_sublex_info.super_bufptr;
6801         char *bufend = PL_sublex_info.super_bufend;
6802         char *olds = s - SvCUR(herewas);
6803         s = strchr(bufptr, '\n');
6804         if (!s)
6805             s = bufend;
6806         d = s;
6807         while (s < bufend &&
6808           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
6809             if (*s++ == '\n')
6810                 CopLINE_inc(PL_curcop);
6811         }
6812         if (s >= bufend) {
6813             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
6814             missingterm(PL_tokenbuf);
6815         }
6816         sv_setpvn(herewas,bufptr,d-bufptr+1);
6817         sv_setpvn(tmpstr,d+1,s-d);
6818         s += len - 1;
6819         sv_catpvn(herewas,s,bufend-s);
6820         Copy(SvPVX(herewas),bufptr,SvCUR(herewas) + 1,char);
6821
6822         s = olds;
6823         goto retval;
6824     }
6825     else if (!outer) {
6826         d = s;
6827         while (s < PL_bufend &&
6828           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
6829             if (*s++ == '\n')
6830                 CopLINE_inc(PL_curcop);
6831         }
6832         if (s >= PL_bufend) {
6833             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
6834             missingterm(PL_tokenbuf);
6835         }
6836         sv_setpvn(tmpstr,d+1,s-d);
6837         s += len - 1;
6838         CopLINE_inc(PL_curcop); /* the preceding stmt passes a newline */
6839
6840         sv_catpvn(herewas,s,PL_bufend-s);
6841         sv_setsv(PL_linestr,herewas);
6842         PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
6843         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
6844         PL_last_lop = PL_last_uni = Nullch;
6845     }
6846     else
6847         sv_setpvn(tmpstr,"",0);   /* avoid "uninitialized" warning */
6848     while (s >= PL_bufend) {    /* multiple line string? */
6849         if (!outer ||
6850          !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
6851             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
6852             missingterm(PL_tokenbuf);
6853         }
6854         CopLINE_inc(PL_curcop);
6855         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
6856         PL_last_lop = PL_last_uni = Nullch;
6857 #ifndef PERL_STRICT_CR
6858         if (PL_bufend - PL_linestart >= 2) {
6859             if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
6860                 (PL_bufend[-2] == '\n' && PL_bufend[-1] == '\r'))
6861             {
6862                 PL_bufend[-2] = '\n';
6863                 PL_bufend--;
6864                 SvCUR_set(PL_linestr, PL_bufend - SvPVX(PL_linestr));
6865             }
6866             else if (PL_bufend[-1] == '\r')
6867                 PL_bufend[-1] = '\n';
6868         }
6869         else if (PL_bufend - PL_linestart == 1 && PL_bufend[-1] == '\r')
6870             PL_bufend[-1] = '\n';
6871 #endif
6872         if (PERLDB_LINE && PL_curstash != PL_debstash) {
6873             SV *sv = NEWSV(88,0);
6874
6875             sv_upgrade(sv, SVt_PVMG);
6876             sv_setsv(sv,PL_linestr);
6877             (void)SvIOK_on(sv);
6878             SvIVX(sv) = 0;
6879             av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop),sv);
6880         }
6881         if (*s == term && memEQ(s,PL_tokenbuf,len)) {
6882             STRLEN off = PL_bufend - 1 - SvPVX(PL_linestr);
6883             *(SvPVX(PL_linestr) + off ) = ' ';
6884             sv_catsv(PL_linestr,herewas);
6885             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
6886             s = SvPVX(PL_linestr) + off; /* In case PV of PL_linestr moved. */
6887         }
6888         else {
6889             s = PL_bufend;
6890             sv_catsv(tmpstr,PL_linestr);
6891         }
6892     }
6893     s++;
6894 retval:
6895     PL_multi_end = CopLINE(PL_curcop);
6896     if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
6897         SvLEN_set(tmpstr, SvCUR(tmpstr) + 1);
6898         Renew(SvPVX(tmpstr), SvLEN(tmpstr), char);
6899     }
6900     SvREFCNT_dec(herewas);
6901     if (!IN_BYTES) {
6902         if (UTF && is_utf8_string((U8*)SvPVX(tmpstr), SvCUR(tmpstr)))
6903             SvUTF8_on(tmpstr);
6904         else if (PL_encoding)
6905             sv_recode_to_utf8(tmpstr, PL_encoding);
6906     }
6907     PL_lex_stuff = tmpstr;
6908     yylval.ival = op_type;
6909     return s;
6910 }
6911
6912 /* scan_inputsymbol
6913    takes: current position in input buffer
6914    returns: new position in input buffer
6915    side-effects: yylval and lex_op are set.
6916
6917    This code handles:
6918
6919    <>           read from ARGV
6920    <FH>         read from filehandle
6921    <pkg::FH>    read from package qualified filehandle
6922    <pkg'FH>     read from package qualified filehandle
6923    <$fh>        read from filehandle in $fh
6924    <*.h>        filename glob
6925
6926 */
6927
6928 STATIC char *
6929 S_scan_inputsymbol(pTHX_ char *start)
6930 {
6931     register char *s = start;           /* current position in buffer */
6932     register char *d;
6933     register char *e;
6934     char *end;
6935     I32 len;
6936
6937     d = PL_tokenbuf;                    /* start of temp holding space */
6938     e = PL_tokenbuf + sizeof PL_tokenbuf;       /* end of temp holding space */
6939     end = strchr(s, '\n');
6940     if (!end)
6941         end = PL_bufend;
6942     s = delimcpy(d, e, s + 1, end, '>', &len);  /* extract until > */
6943
6944     /* die if we didn't have space for the contents of the <>,
6945        or if it didn't end, or if we see a newline
6946     */
6947
6948     if (len >= sizeof PL_tokenbuf)
6949         Perl_croak(aTHX_ "Excessively long <> operator");
6950     if (s >= end)
6951         Perl_croak(aTHX_ "Unterminated <> operator");
6952
6953     s++;
6954
6955     /* check for <$fh>
6956        Remember, only scalar variables are interpreted as filehandles by
6957        this code.  Anything more complex (e.g., <$fh{$num}>) will be
6958        treated as a glob() call.
6959        This code makes use of the fact that except for the $ at the front,
6960        a scalar variable and a filehandle look the same.
6961     */
6962     if (*d == '$' && d[1]) d++;
6963
6964     /* allow <Pkg'VALUE> or <Pkg::VALUE> */
6965     while (*d && (isALNUM_lazy_if(d,UTF) || *d == '\'' || *d == ':'))
6966         d++;
6967
6968     /* If we've tried to read what we allow filehandles to look like, and
6969        there's still text left, then it must be a glob() and not a getline.
6970        Use scan_str to pull out the stuff between the <> and treat it
6971        as nothing more than a string.
6972     */
6973
6974     if (d - PL_tokenbuf != len) {
6975         yylval.ival = OP_GLOB;
6976         set_csh();
6977         s = scan_str(start,FALSE,FALSE);
6978         if (!s)
6979            Perl_croak(aTHX_ "Glob not terminated");
6980         return s;
6981     }
6982     else {
6983         bool readline_overriden = FALSE;
6984         GV *gv_readline = Nullgv;
6985         GV **gvp;
6986         /* we're in a filehandle read situation */
6987         d = PL_tokenbuf;
6988
6989         /* turn <> into <ARGV> */
6990         if (!len)
6991             Copy("ARGV",d,5,char);
6992
6993         /* Check whether readline() is overriden */
6994         if (((gv_readline = gv_fetchpv("readline", FALSE, SVt_PVCV))
6995                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline))
6996                 ||
6997                 ((gvp = (GV**)hv_fetch(PL_globalstash, "readline", 8, FALSE))
6998                 && (gv_readline = *gvp) != (GV*)&PL_sv_undef
6999                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline)))
7000             readline_overriden = TRUE;
7001
7002         /* if <$fh>, create the ops to turn the variable into a
7003            filehandle
7004         */
7005         if (*d == '$') {
7006             I32 tmp;
7007
7008             /* try to find it in the pad for this block, otherwise find
7009                add symbol table ops
7010             */
7011             if ((tmp = pad_findmy(d)) != NOT_IN_PAD) {
7012                 if (PAD_COMPNAME_FLAGS(tmp) & SVpad_OUR) {
7013                     SV *sym = sv_2mortal(
7014                             newSVpv(HvNAME(PAD_COMPNAME_OURSTASH(tmp)),0));
7015                     sv_catpvn(sym, "::", 2);
7016                     sv_catpv(sym, d+1);
7017                     d = SvPVX(sym);
7018                     goto intro_sym;
7019                 }
7020                 else {
7021                     OP *o = newOP(OP_PADSV, 0);
7022                     o->op_targ = tmp;
7023                     PL_lex_op = readline_overriden
7024                         ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
7025                                 append_elem(OP_LIST, o,
7026                                     newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
7027                         : (OP*)newUNOP(OP_READLINE, 0, o);
7028                 }
7029             }
7030             else {
7031                 GV *gv;
7032                 ++d;
7033 intro_sym:
7034                 gv = gv_fetchpv(d,
7035                                 (PL_in_eval
7036                                  ? (GV_ADDMULTI | GV_ADDINEVAL)
7037                                  : GV_ADDMULTI),
7038                                 SVt_PV);
7039                 PL_lex_op = readline_overriden
7040                     ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
7041                             append_elem(OP_LIST,
7042                                 newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
7043                                 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
7044                     : (OP*)newUNOP(OP_READLINE, 0,
7045                             newUNOP(OP_RV2SV, 0,
7046                                 newGVOP(OP_GV, 0, gv)));
7047             }
7048             if (!readline_overriden)
7049                 PL_lex_op->op_flags |= OPf_SPECIAL;
7050             /* we created the ops in PL_lex_op, so make yylval.ival a null op */
7051             yylval.ival = OP_NULL;
7052         }
7053
7054         /* If it's none of the above, it must be a literal filehandle
7055            (<Foo::BAR> or <FOO>) so build a simple readline OP */
7056         else {
7057             GV *gv = gv_fetchpv(d,TRUE, SVt_PVIO);
7058             PL_lex_op = readline_overriden
7059                 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
7060                         append_elem(OP_LIST,
7061                             newGVOP(OP_GV, 0, gv),
7062                             newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
7063                 : (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
7064             yylval.ival = OP_NULL;
7065         }
7066     }
7067
7068     return s;
7069 }
7070
7071
7072 /* scan_str
7073    takes: start position in buffer
7074           keep_quoted preserve \ on the embedded delimiter(s)
7075           keep_delims preserve the delimiters around the string
7076    returns: position to continue reading from buffer
7077    side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
7078         updates the read buffer.
7079
7080    This subroutine pulls a string out of the input.  It is called for:
7081         q               single quotes           q(literal text)
7082         '               single quotes           'literal text'
7083         qq              double quotes           qq(interpolate $here please)
7084         "               double quotes           "interpolate $here please"
7085         qx              backticks               qx(/bin/ls -l)
7086         `               backticks               `/bin/ls -l`
7087         qw              quote words             @EXPORT_OK = qw( func() $spam )
7088         m//             regexp match            m/this/
7089         s///            regexp substitute       s/this/that/
7090         tr///           string transliterate    tr/this/that/
7091         y///            string transliterate    y/this/that/
7092         ($*@)           sub prototypes          sub foo ($)
7093         (stuff)         sub attr parameters     sub foo : attr(stuff)
7094         <>              readline or globs       <FOO>, <>, <$fh>, or <*.c>
7095         
7096    In most of these cases (all but <>, patterns and transliterate)
7097    yylex() calls scan_str().  m// makes yylex() call scan_pat() which
7098    calls scan_str().  s/// makes yylex() call scan_subst() which calls
7099    scan_str().  tr/// and y/// make yylex() call scan_trans() which
7100    calls scan_str().
7101
7102    It skips whitespace before the string starts, and treats the first
7103    character as the delimiter.  If the delimiter is one of ([{< then
7104    the corresponding "close" character )]}> is used as the closing
7105    delimiter.  It allows quoting of delimiters, and if the string has
7106    balanced delimiters ([{<>}]) it allows nesting.
7107
7108    On success, the SV with the resulting string is put into lex_stuff or,
7109    if that is already non-NULL, into lex_repl. The second case occurs only
7110    when parsing the RHS of the special constructs s/// and tr/// (y///).
7111    For convenience, the terminating delimiter character is stuffed into
7112    SvIVX of the SV.
7113 */
7114
7115 STATIC char *
7116 S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
7117 {
7118     SV *sv;                             /* scalar value: string */
7119     char *tmps;                         /* temp string, used for delimiter matching */
7120     register char *s = start;           /* current position in the buffer */
7121     register char term;                 /* terminating character */
7122     register char *to;                  /* current position in the sv's data */
7123     I32 brackets = 1;                   /* bracket nesting level */
7124     bool has_utf8 = FALSE;              /* is there any utf8 content? */
7125     I32 termcode;                       /* terminating char. code */
7126     U8 termstr[UTF8_MAXLEN];            /* terminating string */
7127     STRLEN termlen;                     /* length of terminating string */
7128     char *last = NULL;                  /* last position for nesting bracket */
7129
7130     /* skip space before the delimiter */
7131     if (isSPACE(*s))
7132         s = skipspace(s);
7133
7134     /* mark where we are, in case we need to report errors */
7135     CLINE;
7136
7137     /* after skipping whitespace, the next character is the terminator */
7138     term = *s;
7139     if (!UTF) {
7140         termcode = termstr[0] = term;
7141         termlen = 1;
7142     }
7143     else {
7144         termcode = utf8_to_uvchr((U8*)s, &termlen);
7145         Copy(s, termstr, termlen, U8);
7146         if (!UTF8_IS_INVARIANT(term))
7147             has_utf8 = TRUE;
7148     }
7149
7150     /* mark where we are */
7151     PL_multi_start = CopLINE(PL_curcop);
7152     PL_multi_open = term;
7153
7154     /* find corresponding closing delimiter */
7155     if (term && (tmps = strchr("([{< )]}> )]}>",term)))
7156         termcode = termstr[0] = term = tmps[5];
7157
7158     PL_multi_close = term;
7159
7160     /* create a new SV to hold the contents.  87 is leak category, I'm
7161        assuming.  79 is the SV's initial length.  What a random number. */
7162     sv = NEWSV(87,79);
7163     sv_upgrade(sv, SVt_PVIV);
7164     SvIVX(sv) = termcode;
7165     (void)SvPOK_only(sv);               /* validate pointer */
7166
7167     /* move past delimiter and try to read a complete string */
7168     if (keep_delims)
7169         sv_catpvn(sv, s, termlen);
7170     s += termlen;
7171     for (;;) {
7172         if (PL_encoding && !UTF) {
7173             bool cont = TRUE;
7174
7175             while (cont) {
7176                 int offset = s - SvPVX(PL_linestr);
7177                 bool found = sv_cat_decode(sv, PL_encoding, PL_linestr,
7178                                            &offset, (char*)termstr, termlen);
7179                 char *ns = SvPVX(PL_linestr) + offset;
7180                 char *svlast = SvEND(sv) - 1;
7181
7182                 for (; s < ns; s++) {
7183                     if (*s == '\n' && !PL_rsfp)
7184                         CopLINE_inc(PL_curcop);
7185                 }
7186                 if (!found)
7187                     goto read_more_line;
7188                 else {
7189                     /* handle quoted delimiters */
7190                     if (SvCUR(sv) > 1 && *(svlast-1) == '\\') {
7191                         char *t;
7192                         for (t = svlast-2; t >= SvPVX(sv) && *t == '\\';)
7193                             t--;
7194                         if ((svlast-1 - t) % 2) {
7195                             if (!keep_quoted) {
7196                                 *(svlast-1) = term;
7197                                 *svlast = '\0';
7198                                 SvCUR_set(sv, SvCUR(sv) - 1);
7199                             }
7200                             continue;
7201                         }
7202                     }
7203                     if (PL_multi_open == PL_multi_close) {
7204                         cont = FALSE;
7205                     }
7206                     else {
7207                         char *t, *w;
7208                         if (!last)
7209                             last = SvPVX(sv);
7210                         for (w = t = last; t < svlast; w++, t++) {
7211                             /* At here, all closes are "was quoted" one,
7212                                so we don't check PL_multi_close. */
7213                             if (*t == '\\') {
7214                                 if (!keep_quoted && *(t+1) == PL_multi_open)
7215                                     t++;
7216                                 else
7217                                     *w++ = *t++;
7218                             }
7219                             else if (*t == PL_multi_open)
7220                                 brackets++;
7221
7222                             *w = *t;
7223                         }
7224                         if (w < t) {
7225                             *w++ = term;
7226                             *w = '\0';
7227                             SvCUR_set(sv, w - SvPVX(sv));
7228                         }
7229                         last = w;
7230                         if (--brackets <= 0)
7231                             cont = FALSE;
7232                     }
7233                 }
7234             }
7235             if (!keep_delims) {
7236                 SvCUR_set(sv, SvCUR(sv) - 1);
7237                 *SvEND(sv) = '\0';
7238             }
7239             break;
7240         }
7241
7242         /* extend sv if need be */
7243         SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
7244         /* set 'to' to the next character in the sv's string */
7245         to = SvPVX(sv)+SvCUR(sv);
7246
7247         /* if open delimiter is the close delimiter read unbridle */
7248         if (PL_multi_open == PL_multi_close) {
7249             for (; s < PL_bufend; s++,to++) {
7250                 /* embedded newlines increment the current line number */
7251                 if (*s == '\n' && !PL_rsfp)
7252                     CopLINE_inc(PL_curcop);
7253                 /* handle quoted delimiters */
7254                 if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
7255                     if (!keep_quoted && s[1] == term)
7256                         s++;
7257                 /* any other quotes are simply copied straight through */
7258                     else
7259                         *to++ = *s++;
7260                 }
7261                 /* terminate when run out of buffer (the for() condition), or
7262                    have found the terminator */
7263                 else if (*s == term) {
7264                     if (termlen == 1)
7265                         break;
7266                     if (s+termlen <= PL_bufend && memEQ(s, (char*)termstr, termlen))
7267                         break;
7268                 }
7269                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
7270                     has_utf8 = TRUE;
7271                 *to = *s;
7272             }
7273         }
7274         
7275         /* if the terminator isn't the same as the start character (e.g.,
7276            matched brackets), we have to allow more in the quoting, and
7277            be prepared for nested brackets.
7278         */
7279         else {
7280             /* read until we run out of string, or we find the terminator */
7281             for (; s < PL_bufend; s++,to++) {
7282                 /* embedded newlines increment the line count */
7283                 if (*s == '\n' && !PL_rsfp)
7284                     CopLINE_inc(PL_curcop);
7285                 /* backslashes can escape the open or closing characters */
7286                 if (*s == '\\' && s+1 < PL_bufend) {
7287                     if (!keep_quoted &&
7288                         ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
7289                         s++;
7290                     else
7291                         *to++ = *s++;
7292                 }
7293                 /* allow nested opens and closes */
7294                 else if (*s == PL_multi_close && --brackets <= 0)
7295                     break;
7296                 else if (*s == PL_multi_open)
7297                     brackets++;
7298                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
7299                     has_utf8 = TRUE;
7300                 *to = *s;
7301             }
7302         }
7303         /* terminate the copied string and update the sv's end-of-string */
7304         *to = '\0';
7305         SvCUR_set(sv, to - SvPVX(sv));
7306
7307         /*
7308          * this next chunk reads more into the buffer if we're not done yet
7309          */
7310
7311         if (s < PL_bufend)
7312             break;              /* handle case where we are done yet :-) */
7313
7314 #ifndef PERL_STRICT_CR
7315         if (to - SvPVX(sv) >= 2) {
7316             if ((to[-2] == '\r' && to[-1] == '\n') ||
7317                 (to[-2] == '\n' && to[-1] == '\r'))
7318             {
7319                 to[-2] = '\n';
7320                 to--;
7321                 SvCUR_set(sv, to - SvPVX(sv));
7322             }
7323             else if (to[-1] == '\r')
7324                 to[-1] = '\n';
7325         }
7326         else if (to - SvPVX(sv) == 1 && to[-1] == '\r')
7327             to[-1] = '\n';
7328 #endif
7329         
7330      read_more_line:
7331         /* if we're out of file, or a read fails, bail and reset the current
7332            line marker so we can report where the unterminated string began
7333         */
7334         if (!PL_rsfp ||
7335          !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
7336             sv_free(sv);
7337             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
7338             return Nullch;
7339         }
7340         /* we read a line, so increment our line counter */
7341         CopLINE_inc(PL_curcop);
7342
7343         /* update debugger info */
7344         if (PERLDB_LINE && PL_curstash != PL_debstash) {
7345             SV *sv = NEWSV(88,0);
7346
7347             sv_upgrade(sv, SVt_PVMG);
7348             sv_setsv(sv,PL_linestr);
7349             (void)SvIOK_on(sv);
7350             SvIVX(sv) = 0;
7351             av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop), sv);
7352         }
7353
7354         /* having changed the buffer, we must update PL_bufend */
7355         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
7356         PL_last_lop = PL_last_uni = Nullch;
7357     }
7358
7359     /* at this point, we have successfully read the delimited string */
7360
7361     if (!PL_encoding || UTF) {
7362         if (keep_delims)
7363             sv_catpvn(sv, s, termlen);
7364         s += termlen;
7365     }
7366     if (has_utf8 || PL_encoding)
7367         SvUTF8_on(sv);
7368
7369     PL_multi_end = CopLINE(PL_curcop);
7370
7371     /* if we allocated too much space, give some back */
7372     if (SvCUR(sv) + 5 < SvLEN(sv)) {
7373         SvLEN_set(sv, SvCUR(sv) + 1);
7374         Renew(SvPVX(sv), SvLEN(sv), char);
7375     }
7376
7377     /* decide whether this is the first or second quoted string we've read
7378        for this op
7379     */
7380
7381     if (PL_lex_stuff)
7382         PL_lex_repl = sv;
7383     else
7384         PL_lex_stuff = sv;
7385     return s;
7386 }
7387
7388 /*
7389   scan_num
7390   takes: pointer to position in buffer
7391   returns: pointer to new position in buffer
7392   side-effects: builds ops for the constant in yylval.op
7393
7394   Read a number in any of the formats that Perl accepts:
7395
7396   \d(_?\d)*(\.(\d(_?\d)*)?)?[Ee][\+\-]?(\d(_?\d)*)      12 12.34 12.
7397   \.\d(_?\d)*[Ee][\+\-]?(\d(_?\d)*)                     .34
7398   0b[01](_?[01])*
7399   0[0-7](_?[0-7])*
7400   0x[0-9A-Fa-f](_?[0-9A-Fa-f])*
7401
7402   Like most scan_ routines, it uses the PL_tokenbuf buffer to hold the
7403   thing it reads.
7404
7405   If it reads a number without a decimal point or an exponent, it will
7406   try converting the number to an integer and see if it can do so
7407   without loss of precision.
7408 */
7409
7410 char *
7411 Perl_scan_num(pTHX_ char *start, YYSTYPE* lvalp)
7412 {
7413     register char *s = start;           /* current position in buffer */
7414     register char *d;                   /* destination in temp buffer */
7415     register char *e;                   /* end of temp buffer */
7416     NV nv;                              /* number read, as a double */
7417     SV *sv = Nullsv;                    /* place to put the converted number */
7418     bool floatit;                       /* boolean: int or float? */
7419     char *lastub = 0;                   /* position of last underbar */
7420     static char number_too_long[] = "Number too long";
7421
7422     /* We use the first character to decide what type of number this is */
7423
7424     switch (*s) {
7425     default:
7426       Perl_croak(aTHX_ "panic: scan_num");
7427
7428     /* if it starts with a 0, it could be an octal number, a decimal in
7429        0.13 disguise, or a hexadecimal number, or a binary number. */
7430     case '0':
7431         {
7432           /* variables:
7433              u          holds the "number so far"
7434              shift      the power of 2 of the base
7435                         (hex == 4, octal == 3, binary == 1)
7436              overflowed was the number more than we can hold?
7437
7438              Shift is used when we add a digit.  It also serves as an "are
7439              we in octal/hex/binary?" indicator to disallow hex characters
7440              when in octal mode.
7441            */
7442             NV n = 0.0;
7443             UV u = 0;
7444             I32 shift;
7445             bool overflowed = FALSE;
7446             bool just_zero  = TRUE;     /* just plain 0 or binary number? */
7447             static NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
7448             static char* bases[5] = { "", "binary", "", "octal",
7449                                       "hexadecimal" };
7450             static char* Bases[5] = { "", "Binary", "", "Octal",
7451                                       "Hexadecimal" };
7452             static char *maxima[5] = { "",
7453                                        "0b11111111111111111111111111111111",
7454                                        "",
7455                                        "037777777777",
7456                                        "0xffffffff" };
7457             char *base, *Base, *max;
7458
7459             /* check for hex */
7460             if (s[1] == 'x') {
7461                 shift = 4;
7462                 s += 2;
7463                 just_zero = FALSE;
7464             } else if (s[1] == 'b') {
7465                 shift = 1;
7466                 s += 2;
7467                 just_zero = FALSE;
7468             }
7469             /* check for a decimal in disguise */
7470             else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
7471                 goto decimal;
7472             /* so it must be octal */
7473             else {
7474                 shift = 3;
7475                 s++;
7476             }
7477
7478             if (*s == '_') {
7479                if (ckWARN(WARN_SYNTAX))
7480                    Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7481                                "Misplaced _ in number");
7482                lastub = s++;
7483             }
7484
7485             base = bases[shift];
7486             Base = Bases[shift];
7487             max  = maxima[shift];
7488
7489             /* read the rest of the number */
7490             for (;;) {
7491                 /* x is used in the overflow test,
7492                    b is the digit we're adding on. */
7493                 UV x, b;
7494
7495                 switch (*s) {
7496
7497                 /* if we don't mention it, we're done */
7498                 default:
7499                     goto out;
7500
7501                 /* _ are ignored -- but warned about if consecutive */
7502                 case '_':
7503                     if (ckWARN(WARN_SYNTAX) && lastub && s == lastub + 1)
7504                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7505                                     "Misplaced _ in number");
7506                     lastub = s++;
7507                     break;
7508
7509                 /* 8 and 9 are not octal */
7510                 case '8': case '9':
7511                     if (shift == 3)
7512                         yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
7513                     /* FALL THROUGH */
7514
7515                 /* octal digits */
7516                 case '2': case '3': case '4':
7517                 case '5': case '6': case '7':
7518                     if (shift == 1)
7519                         yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
7520                     /* FALL THROUGH */
7521
7522                 case '0': case '1':
7523                     b = *s++ & 15;              /* ASCII digit -> value of digit */
7524                     goto digit;
7525
7526                 /* hex digits */
7527                 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
7528                 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
7529                     /* make sure they said 0x */
7530                     if (shift != 4)
7531                         goto out;
7532                     b = (*s++ & 7) + 9;
7533
7534                     /* Prepare to put the digit we have onto the end
7535                        of the number so far.  We check for overflows.
7536                     */
7537
7538                   digit:
7539                     just_zero = FALSE;
7540                     if (!overflowed) {
7541                         x = u << shift; /* make room for the digit */
7542
7543                         if ((x >> shift) != u
7544                             && !(PL_hints & HINT_NEW_BINARY)) {
7545                             overflowed = TRUE;
7546                             n = (NV) u;
7547                             if (ckWARN_d(WARN_OVERFLOW))
7548                                 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
7549                                             "Integer overflow in %s number",
7550                                             base);
7551                         } else
7552                             u = x | b;          /* add the digit to the end */
7553                     }
7554                     if (overflowed) {
7555                         n *= nvshift[shift];
7556                         /* If an NV has not enough bits in its
7557                          * mantissa to represent an UV this summing of
7558                          * small low-order numbers is a waste of time
7559                          * (because the NV cannot preserve the
7560                          * low-order bits anyway): we could just
7561                          * remember when did we overflow and in the
7562                          * end just multiply n by the right
7563                          * amount. */
7564                         n += (NV) b;
7565                     }
7566                     break;
7567                 }
7568             }
7569
7570           /* if we get here, we had success: make a scalar value from
7571              the number.
7572           */
7573           out:
7574
7575             /* final misplaced underbar check */
7576             if (s[-1] == '_') {
7577                 if (ckWARN(WARN_SYNTAX))
7578                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
7579             }
7580
7581             sv = NEWSV(92,0);
7582             if (overflowed) {
7583                 if (ckWARN(WARN_PORTABLE) && n > 4294967295.0)
7584                     Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
7585                                 "%s number > %s non-portable",
7586                                 Base, max);
7587                 sv_setnv(sv, n);
7588             }
7589             else {
7590 #if UVSIZE > 4
7591                 if (ckWARN(WARN_PORTABLE) && u > 0xffffffff)
7592                     Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
7593                                 "%s number > %s non-portable",
7594                                 Base, max);
7595 #endif
7596                 sv_setuv(sv, u);
7597             }
7598             if (just_zero && (PL_hints & HINT_NEW_INTEGER))
7599                 sv = new_constant(start, s - start, "integer", 
7600                                   sv, Nullsv, NULL);
7601             else if (PL_hints & HINT_NEW_BINARY)
7602                 sv = new_constant(start, s - start, "binary", sv, Nullsv, NULL);
7603         }
7604         break;
7605
7606     /*
7607       handle decimal numbers.
7608       we're also sent here when we read a 0 as the first digit
7609     */
7610     case '1': case '2': case '3': case '4': case '5':
7611     case '6': case '7': case '8': case '9': case '.':
7612       decimal:
7613         d = PL_tokenbuf;
7614         e = PL_tokenbuf + sizeof PL_tokenbuf - 6; /* room for various punctuation */
7615         floatit = FALSE;
7616
7617         /* read next group of digits and _ and copy into d */
7618         while (isDIGIT(*s) || *s == '_') {
7619             /* skip underscores, checking for misplaced ones
7620                if -w is on
7621             */
7622             if (*s == '_') {
7623                 if (ckWARN(WARN_SYNTAX) && lastub && s == lastub + 1)
7624                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7625                                 "Misplaced _ in number");
7626                 lastub = s++;
7627             }
7628             else {
7629                 /* check for end of fixed-length buffer */
7630                 if (d >= e)
7631                     Perl_croak(aTHX_ number_too_long);
7632                 /* if we're ok, copy the character */
7633                 *d++ = *s++;
7634             }
7635         }
7636
7637         /* final misplaced underbar check */
7638         if (lastub && s == lastub + 1) {
7639             if (ckWARN(WARN_SYNTAX))
7640                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
7641         }
7642
7643         /* read a decimal portion if there is one.  avoid
7644            3..5 being interpreted as the number 3. followed
7645            by .5
7646         */
7647         if (*s == '.' && s[1] != '.') {
7648             floatit = TRUE;
7649             *d++ = *s++;
7650
7651             if (*s == '_') {
7652                 if (ckWARN(WARN_SYNTAX))
7653                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7654                                 "Misplaced _ in number");
7655                 lastub = s;
7656             }
7657
7658             /* copy, ignoring underbars, until we run out of digits.
7659             */
7660             for (; isDIGIT(*s) || *s == '_'; s++) {
7661                 /* fixed length buffer check */
7662                 if (d >= e)
7663                     Perl_croak(aTHX_ number_too_long);
7664                 if (*s == '_') {
7665                    if (ckWARN(WARN_SYNTAX) && lastub && s == lastub + 1)
7666                        Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7667                                    "Misplaced _ in number");
7668                    lastub = s;
7669                 }
7670                 else
7671                     *d++ = *s;
7672             }
7673             /* fractional part ending in underbar? */
7674             if (s[-1] == '_') {
7675                 if (ckWARN(WARN_SYNTAX))
7676                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7677                                 "Misplaced _ in number");
7678             }
7679             if (*s == '.' && isDIGIT(s[1])) {
7680                 /* oops, it's really a v-string, but without the "v" */
7681                 s = start;
7682                 goto vstring;
7683             }
7684         }
7685
7686         /* read exponent part, if present */
7687         if ((*s == 'e' || *s == 'E') && strchr("+-0123456789_", s[1])) {
7688             floatit = TRUE;
7689             s++;
7690
7691             /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
7692             *d++ = 'e';         /* At least some Mach atof()s don't grok 'E' */
7693
7694             /* stray preinitial _ */
7695             if (*s == '_') {
7696                 if (ckWARN(WARN_SYNTAX))
7697                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7698                                 "Misplaced _ in number");
7699                 lastub = s++;
7700             }
7701
7702             /* allow positive or negative exponent */
7703             if (*s == '+' || *s == '-')
7704                 *d++ = *s++;
7705
7706             /* stray initial _ */
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             /* read digits of exponent */
7715             while (isDIGIT(*s) || *s == '_') {
7716                 if (isDIGIT(*s)) {
7717                     if (d >= e)
7718                         Perl_croak(aTHX_ number_too_long);
7719                     *d++ = *s++;
7720                 }
7721                 else {
7722                    if (ckWARN(WARN_SYNTAX) &&
7723                        ((lastub && s == lastub + 1) ||
7724                         (!isDIGIT(s[1]) && s[1] != '_')))
7725                        Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7726                                    "Misplaced _ in number");
7727                    lastub = s++;
7728                 }
7729             }
7730         }
7731
7732
7733         /* make an sv from the string */
7734         sv = NEWSV(92,0);
7735
7736         /*
7737            We try to do an integer conversion first if no characters
7738            indicating "float" have been found.
7739          */
7740
7741         if (!floatit) {
7742             UV uv;
7743             int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
7744
7745             if (flags == IS_NUMBER_IN_UV) {
7746               if (uv <= IV_MAX)
7747                 sv_setiv(sv, uv); /* Prefer IVs over UVs. */
7748               else
7749                 sv_setuv(sv, uv);
7750             } else if (flags == (IS_NUMBER_IN_UV | IS_NUMBER_NEG)) {
7751               if (uv <= (UV) IV_MIN)
7752                 sv_setiv(sv, -(IV)uv);
7753               else
7754                 floatit = TRUE;
7755             } else
7756               floatit = TRUE;
7757         }
7758         if (floatit) {
7759             /* terminate the string */
7760             *d = '\0';
7761             nv = Atof(PL_tokenbuf);
7762             sv_setnv(sv, nv);
7763         }
7764
7765         if ( floatit ? (PL_hints & HINT_NEW_FLOAT) :
7766                        (PL_hints & HINT_NEW_INTEGER) )
7767             sv = new_constant(PL_tokenbuf, d - PL_tokenbuf,
7768                               (floatit ? "float" : "integer"),
7769                               sv, Nullsv, NULL);
7770         break;
7771
7772     /* if it starts with a v, it could be a v-string */
7773     case 'v':
7774 vstring:
7775                 sv = NEWSV(92,5); /* preallocate storage space */
7776                 s = scan_vstring(s,sv);
7777         break;
7778     }
7779
7780     /* make the op for the constant and return */
7781
7782     if (sv)
7783         lvalp->opval = newSVOP(OP_CONST, 0, sv);
7784     else
7785         lvalp->opval = Nullop;
7786
7787     return s;
7788 }
7789
7790 STATIC char *
7791 S_scan_formline(pTHX_ register char *s)
7792 {
7793     register char *eol;
7794     register char *t;
7795     SV *stuff = newSVpvn("",0);
7796     bool needargs = FALSE;
7797     bool eofmt = FALSE;
7798
7799     while (!needargs) {
7800         if (*s == '.') {
7801             /*SUPPRESS 530*/
7802 #ifdef PERL_STRICT_CR
7803             for (t = s+1;SPACE_OR_TAB(*t); t++) ;
7804 #else
7805             for (t = s+1;SPACE_OR_TAB(*t) || *t == '\r'; t++) ;
7806 #endif
7807             if (*t == '\n' || t == PL_bufend) {
7808                 eofmt = TRUE;
7809                 break;
7810             }
7811         }
7812         if (PL_in_eval && !PL_rsfp) {
7813             eol = memchr(s,'\n',PL_bufend-s);
7814             if (!eol++)
7815                 eol = PL_bufend;
7816         }
7817         else
7818             eol = PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
7819         if (*s != '#') {
7820             for (t = s; t < eol; t++) {
7821                 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
7822                     needargs = FALSE;
7823                     goto enough;        /* ~~ must be first line in formline */
7824                 }
7825                 if (*t == '@' || *t == '^')
7826                     needargs = TRUE;
7827             }
7828             if (eol > s) {
7829                 sv_catpvn(stuff, s, eol-s);
7830 #ifndef PERL_STRICT_CR
7831                 if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
7832                     char *end = SvPVX(stuff) + SvCUR(stuff);
7833                     end[-2] = '\n';
7834                     end[-1] = '\0';
7835                     SvCUR(stuff)--;
7836                 }
7837 #endif
7838             }
7839             else
7840               break;
7841         }
7842         s = eol;
7843         if (PL_rsfp) {
7844             s = filter_gets(PL_linestr, PL_rsfp, 0);
7845             PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
7846             PL_bufend = PL_bufptr + SvCUR(PL_linestr);
7847             PL_last_lop = PL_last_uni = Nullch;
7848             if (!s) {
7849                 s = PL_bufptr;
7850                 break;
7851             }
7852         }
7853         incline(s);
7854     }
7855   enough:
7856     if (SvCUR(stuff)) {
7857         PL_expect = XTERM;
7858         if (needargs) {
7859             PL_lex_state = LEX_NORMAL;
7860             PL_nextval[PL_nexttoke].ival = 0;
7861             force_next(',');
7862         }
7863         else
7864             PL_lex_state = LEX_FORMLINE;
7865         if (!IN_BYTES) {
7866             if (UTF && is_utf8_string((U8*)SvPVX(stuff), SvCUR(stuff)))
7867                 SvUTF8_on(stuff);
7868             else if (PL_encoding)
7869                 sv_recode_to_utf8(stuff, PL_encoding);
7870         }
7871         PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, stuff);
7872         force_next(THING);
7873         PL_nextval[PL_nexttoke].ival = OP_FORMLINE;
7874         force_next(LSTOP);
7875     }
7876     else {
7877         SvREFCNT_dec(stuff);
7878         if (eofmt)
7879             PL_lex_formbrack = 0;
7880         PL_bufptr = s;
7881     }
7882     return s;
7883 }
7884
7885 STATIC void
7886 S_set_csh(pTHX)
7887 {
7888 #ifdef CSH
7889     if (!PL_cshlen)
7890         PL_cshlen = strlen(PL_cshname);
7891 #endif
7892 }
7893
7894 I32
7895 Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
7896 {
7897     I32 oldsavestack_ix = PL_savestack_ix;
7898     CV* outsidecv = PL_compcv;
7899
7900     if (PL_compcv) {
7901         assert(SvTYPE(PL_compcv) == SVt_PVCV);
7902     }
7903     SAVEI32(PL_subline);
7904     save_item(PL_subname);
7905     SAVESPTR(PL_compcv);
7906
7907     PL_compcv = (CV*)NEWSV(1104,0);
7908     sv_upgrade((SV *)PL_compcv, is_format ? SVt_PVFM : SVt_PVCV);
7909     CvFLAGS(PL_compcv) |= flags;
7910
7911     PL_subline = CopLINE(PL_curcop);
7912     CvPADLIST(PL_compcv) = pad_new(padnew_SAVE|padnew_SAVESUB);
7913     CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc(outsidecv);
7914     CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
7915
7916     return oldsavestack_ix;
7917 }
7918
7919 #ifdef __SC__
7920 #pragma segment Perl_yylex
7921 #endif
7922 int
7923 Perl_yywarn(pTHX_ char *s)
7924 {
7925     PL_in_eval |= EVAL_WARNONLY;
7926     yyerror(s);
7927     PL_in_eval &= ~EVAL_WARNONLY;
7928     return 0;
7929 }
7930
7931 int
7932 Perl_yyerror(pTHX_ char *s)
7933 {
7934     char *where = NULL;
7935     char *context = NULL;
7936     int contlen = -1;
7937     SV *msg;
7938
7939     if (!yychar || (yychar == ';' && !PL_rsfp))
7940         where = "at EOF";
7941     else if (PL_bufptr > PL_oldoldbufptr && PL_bufptr - PL_oldoldbufptr < 200 &&
7942       PL_oldoldbufptr != PL_oldbufptr && PL_oldbufptr != PL_bufptr) {
7943         /*
7944                 Only for NetWare:
7945                 The code below is removed for NetWare because it abends/crashes on NetWare
7946                 when the script has error such as not having the closing quotes like:
7947                     if ($var eq "value)
7948                 Checking of white spaces is anyway done in NetWare code.
7949         */
7950 #ifndef NETWARE
7951         while (isSPACE(*PL_oldoldbufptr))
7952             PL_oldoldbufptr++;
7953 #endif
7954         context = PL_oldoldbufptr;
7955         contlen = PL_bufptr - PL_oldoldbufptr;
7956     }
7957     else if (PL_bufptr > PL_oldbufptr && PL_bufptr - PL_oldbufptr < 200 &&
7958       PL_oldbufptr != PL_bufptr) {
7959         /*
7960                 Only for NetWare:
7961                 The code below is removed for NetWare because it abends/crashes on NetWare
7962                 when the script has error such as not having the closing quotes like:
7963                     if ($var eq "value)
7964                 Checking of white spaces is anyway done in NetWare code.
7965         */
7966 #ifndef NETWARE
7967         while (isSPACE(*PL_oldbufptr))
7968             PL_oldbufptr++;
7969 #endif
7970         context = PL_oldbufptr;
7971         contlen = PL_bufptr - PL_oldbufptr;
7972     }
7973     else if (yychar > 255)
7974         where = "next token ???";
7975     else if (yychar == -2) { /* YYEMPTY */
7976         if (PL_lex_state == LEX_NORMAL ||
7977            (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
7978             where = "at end of line";
7979         else if (PL_lex_inpat)
7980             where = "within pattern";
7981         else
7982             where = "within string";
7983     }
7984     else {
7985         SV *where_sv = sv_2mortal(newSVpvn("next char ", 10));
7986         if (yychar < 32)
7987             Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
7988         else if (isPRINT_LC(yychar))
7989             Perl_sv_catpvf(aTHX_ where_sv, "%c", yychar);
7990         else
7991             Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
7992         where = SvPVX(where_sv);
7993     }
7994     msg = sv_2mortal(newSVpv(s, 0));
7995     Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
7996         OutCopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
7997     if (context)
7998         Perl_sv_catpvf(aTHX_ msg, "near \"%.*s\"\n", contlen, context);
7999     else
8000         Perl_sv_catpvf(aTHX_ msg, "%s\n", where);
8001     if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
8002         Perl_sv_catpvf(aTHX_ msg,
8003         "  (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
8004                 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
8005         PL_multi_end = 0;
8006     }
8007     if (PL_in_eval & EVAL_WARNONLY && ckWARN_d(WARN_SYNTAX))
8008         Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "%"SVf, msg);
8009     else
8010         qerror(msg);
8011     if (PL_error_count >= 10) {
8012         if (PL_in_eval && SvCUR(ERRSV))
8013             Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
8014             ERRSV, OutCopFILE(PL_curcop));
8015         else
8016             Perl_croak(aTHX_ "%s has too many errors.\n",
8017             OutCopFILE(PL_curcop));
8018     }
8019     PL_in_my = 0;
8020     PL_in_my_stash = Nullhv;
8021     return 0;
8022 }
8023 #ifdef __SC__
8024 #pragma segment Main
8025 #endif
8026
8027 STATIC char*
8028 S_swallow_bom(pTHX_ U8 *s)
8029 {
8030     STRLEN slen;
8031     slen = SvCUR(PL_linestr);
8032     switch (s[0]) {
8033     case 0xFF:
8034         if (s[1] == 0xFE) {
8035             /* UTF-16 little-endian? (or UTF32-LE?) */
8036             if (s[2] == 0 && s[3] == 0)  /* UTF-32 little-endian */
8037                 Perl_croak(aTHX_ "Unsupported script encoding UTF32-LE");
8038 #ifndef PERL_NO_UTF16_FILTER
8039             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF16-LE script encoding (BOM)\n");
8040             s += 2;
8041         utf16le:
8042             if (PL_bufend > (char*)s) {
8043                 U8 *news;
8044                 I32 newlen;
8045
8046                 filter_add(utf16rev_textfilter, NULL);
8047                 New(898, news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
8048                 utf16_to_utf8_reversed(s, news,
8049                                        PL_bufend - (char*)s - 1,
8050                                        &newlen);
8051                 sv_setpvn(PL_linestr, (const char*)news, newlen);
8052                 Safefree(news);
8053                 SvUTF8_on(PL_linestr);
8054                 s = (U8*)SvPVX(PL_linestr);
8055                 PL_bufend = SvPVX(PL_linestr) + newlen;
8056             }
8057 #else
8058             Perl_croak(aTHX_ "Unsupported script encoding UTF16-LE");
8059 #endif
8060         }
8061         break;
8062     case 0xFE:
8063         if (s[1] == 0xFF) {   /* UTF-16 big-endian? */
8064 #ifndef PERL_NO_UTF16_FILTER
8065             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (BOM)\n");
8066             s += 2;
8067         utf16be:
8068             if (PL_bufend > (char *)s) {
8069                 U8 *news;
8070                 I32 newlen;
8071
8072                 filter_add(utf16_textfilter, NULL);
8073                 New(898, news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
8074                 utf16_to_utf8(s, news,
8075                               PL_bufend - (char*)s,
8076                               &newlen);
8077                 sv_setpvn(PL_linestr, (const char*)news, newlen);
8078                 Safefree(news);
8079                 SvUTF8_on(PL_linestr);
8080                 s = (U8*)SvPVX(PL_linestr);
8081                 PL_bufend = SvPVX(PL_linestr) + newlen;
8082             }
8083 #else
8084             Perl_croak(aTHX_ "Unsupported script encoding UTF16-BE");
8085 #endif
8086         }
8087         break;
8088     case 0xEF:
8089         if (slen > 2 && s[1] == 0xBB && s[2] == 0xBF) {
8090             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
8091             s += 3;                      /* UTF-8 */
8092         }
8093         break;
8094     case 0:
8095         if (slen > 3) {
8096              if (s[1] == 0) {
8097                   if (s[2] == 0xFE && s[3] == 0xFF) {
8098                        /* UTF-32 big-endian */
8099                        Perl_croak(aTHX_ "Unsupported script encoding UTF32-BE");
8100                   }
8101              }
8102              else if (s[2] == 0 && s[3] != 0) {
8103                   /* Leading bytes
8104                    * 00 xx 00 xx
8105                    * are a good indicator of UTF-16BE. */
8106                   if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (no BOM)\n");
8107                   goto utf16be;
8108              }
8109         }
8110     default:
8111          if (slen > 3 && s[1] == 0 && s[2] != 0 && s[3] == 0) {
8112                   /* Leading bytes
8113                    * xx 00 xx 00
8114                    * are a good indicator of UTF-16LE. */
8115               if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (no BOM)\n");
8116               goto utf16le;
8117          }
8118     }
8119     return (char*)s;
8120 }
8121
8122 /*
8123  * restore_rsfp
8124  * Restore a source filter.
8125  */
8126
8127 static void
8128 restore_rsfp(pTHX_ void *f)
8129 {
8130     PerlIO *fp = (PerlIO*)f;
8131
8132     if (PL_rsfp == PerlIO_stdin())
8133         PerlIO_clearerr(PL_rsfp);
8134     else if (PL_rsfp && (PL_rsfp != fp))
8135         PerlIO_close(PL_rsfp);
8136     PL_rsfp = fp;
8137 }
8138
8139 #ifndef PERL_NO_UTF16_FILTER
8140 static I32
8141 utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
8142 {
8143     STRLEN old = SvCUR(sv);
8144     I32 count = FILTER_READ(idx+1, sv, maxlen);
8145     DEBUG_P(PerlIO_printf(Perl_debug_log,
8146                           "utf16_textfilter(%p): %d %d (%d)\n",
8147                           utf16_textfilter, idx, maxlen, (int) count));
8148     if (count) {
8149         U8* tmps;
8150         I32 newlen;
8151         New(898, tmps, SvCUR(sv) * 3 / 2 + 1, U8);
8152         Copy(SvPVX(sv), tmps, old, char);
8153         utf16_to_utf8((U8*)SvPVX(sv) + old, tmps + old,
8154                       SvCUR(sv) - old, &newlen);
8155         sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
8156     }
8157     DEBUG_P({sv_dump(sv);});
8158     return SvCUR(sv);
8159 }
8160
8161 static I32
8162 utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen)
8163 {
8164     STRLEN old = SvCUR(sv);
8165     I32 count = FILTER_READ(idx+1, sv, maxlen);
8166     DEBUG_P(PerlIO_printf(Perl_debug_log,
8167                           "utf16rev_textfilter(%p): %d %d (%d)\n",
8168                           utf16rev_textfilter, idx, maxlen, (int) count));
8169     if (count) {
8170         U8* tmps;
8171         I32 newlen;
8172         New(898, tmps, SvCUR(sv) * 3 / 2 + 1, U8);
8173         Copy(SvPVX(sv), tmps, old, char);
8174         utf16_to_utf8((U8*)SvPVX(sv) + old, tmps + old,
8175                       SvCUR(sv) - old, &newlen);
8176         sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
8177     }
8178     DEBUG_P({ sv_dump(sv); });
8179     return count;
8180 }
8181 #endif
8182
8183 /*
8184 Returns a pointer to the next character after the parsed
8185 vstring, as well as updating the passed in sv.
8186
8187 Function must be called like
8188
8189         sv = NEWSV(92,5);
8190         s = scan_vstring(s,sv);
8191
8192 The sv should already be large enough to store the vstring
8193 passed in, for performance reasons.
8194
8195 */
8196
8197 char *
8198 Perl_scan_vstring(pTHX_ char *s, SV *sv)
8199 {
8200     char *pos = s;
8201     char *start = s;
8202     if (*pos == 'v') pos++;  /* get past 'v' */
8203     while (pos < PL_bufend && (isDIGIT(*pos) || *pos == '_'))
8204         pos++;
8205     if ( *pos != '.') {
8206         /* this may not be a v-string if followed by => */
8207         char *next = pos;
8208         while (next < PL_bufend && isSPACE(*next))
8209             ++next;
8210         if ((PL_bufend - next) >= 2 && *next == '=' && next[1] == '>' ) {
8211             /* return string not v-string */
8212             sv_setpvn(sv,(char *)s,pos-s);
8213             return pos;
8214         }
8215     }
8216
8217     if (!isALPHA(*pos)) {
8218         UV rev;
8219         U8 tmpbuf[UTF8_MAXLEN+1];
8220         U8 *tmpend;
8221
8222         if (*s == 'v') s++;  /* get past 'v' */
8223
8224         sv_setpvn(sv, "", 0);
8225
8226         for (;;) {
8227             rev = 0;
8228             {
8229                 /* this is atoi() that tolerates underscores */
8230                 char *end = pos;
8231                 UV mult = 1;
8232                 while (--end >= s) {
8233                     UV orev;
8234                     if (*end == '_')
8235                         continue;
8236                     orev = rev;
8237                     rev += (*end - '0') * mult;
8238                     mult *= 10;
8239                     if (orev > rev && ckWARN_d(WARN_OVERFLOW))
8240                         Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
8241                                     "Integer overflow in decimal number");
8242                 }
8243             }
8244 #ifdef EBCDIC
8245             if (rev > 0x7FFFFFFF)
8246                  Perl_croak(aTHX_ "In EBCDIC the v-string components cannot exceed 2147483647");
8247 #endif
8248             /* Append native character for the rev point */
8249             tmpend = uvchr_to_utf8(tmpbuf, rev);
8250             sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
8251             if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(rev)))
8252                  SvUTF8_on(sv);
8253             if (pos + 1 < PL_bufend && *pos == '.' && isDIGIT(pos[1]))
8254                  s = ++pos;
8255             else {
8256                  s = pos;
8257                  break;
8258             }
8259             while (pos < PL_bufend && (isDIGIT(*pos) || *pos == '_'))
8260                  pos++;
8261         }
8262         SvPOK_on(sv);
8263         sv_magic(sv,NULL,PERL_MAGIC_vstring,(const char*)start, pos-start);
8264         SvRMAGICAL_on(sv);
8265     }
8266     return s;
8267 }
8268