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