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