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