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