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