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