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