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