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