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