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