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