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