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