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