Change the internal prototype of the pop() and shift() builtins
[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 parentheses 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         if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
790             SvUTF8_on(((SVOP*)PL_nextval[PL_nexttoke].opval)->op_sv);
791         force_next(token);
792     }
793     return s;
794 }
795
796 /*
797  * S_force_ident
798  * Called when the lexer wants $foo *foo &foo etc, but the program
799  * text only contains the "foo" portion.  The first argument is a pointer
800  * to the "foo", and the second argument is the type symbol to prefix.
801  * Forces the next token to be a "WORD".
802  * Creates the symbol if it didn't already exist (via gv_fetchpv()).
803  */
804
805 STATIC void
806 S_force_ident(pTHX_ register char *s, int kind)
807 {
808     if (s && *s) {
809         OP* o = (OP*)newSVOP(OP_CONST, 0, newSVpv(s,0));
810         PL_nextval[PL_nexttoke].opval = o;
811         force_next(WORD);
812         if (kind) {
813             o->op_private = OPpCONST_ENTERED;
814             /* XXX see note in pp_entereval() for why we forgo typo
815                warnings if the symbol must be introduced in an eval.
816                GSAR 96-10-12 */
817             gv_fetchpv(s, PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : TRUE,
818                 kind == '$' ? SVt_PV :
819                 kind == '@' ? SVt_PVAV :
820                 kind == '%' ? SVt_PVHV :
821                               SVt_PVGV
822                 );
823         }
824     }
825 }
826
827 NV
828 Perl_str_to_version(pTHX_ SV *sv)
829 {
830     NV retval = 0.0;
831     NV nshift = 1.0;
832     STRLEN len;
833     char *start = SvPVx(sv,len);
834     bool utf = SvUTF8(sv) ? TRUE : FALSE;
835     char *end = start + len;
836     while (start < end) {
837         STRLEN skip;
838         UV n;
839         if (utf)
840             n = utf8n_to_uvchr((U8*)start, len, &skip, 0);
841         else {
842             n = *(U8*)start;
843             skip = 1;
844         }
845         retval += ((NV)n)/nshift;
846         start += skip;
847         nshift *= 1000;
848     }
849     return retval;
850 }
851
852 /*
853  * S_force_version
854  * Forces the next token to be a version number.
855  * If the next token appears to be an invalid version number, (e.g. "v2b"),
856  * and if "guessing" is TRUE, then no new token is created (and the caller
857  * must use an alternative parsing method).
858  */
859
860 STATIC char *
861 S_force_version(pTHX_ char *s, int guessing)
862 {
863     OP *version = Nullop;
864     char *d;
865
866     s = skipspace(s);
867
868     d = s;
869     if (*d == 'v')
870         d++;
871     if (isDIGIT(*d)) {
872         while (isDIGIT(*d) || *d == '_' || *d == '.')
873             d++;
874         if (*d == ';' || isSPACE(*d) || *d == '}' || !*d) {
875             SV *ver;
876             s = scan_num(s, &yylval);
877             version = yylval.opval;
878             ver = cSVOPx(version)->op_sv;
879             if (SvPOK(ver) && !SvNIOK(ver)) {
880                 (void)SvUPGRADE(ver, SVt_PVNV);
881                 SvNVX(ver) = str_to_version(ver);
882                 SvNOK_on(ver);          /* hint that it is a version */
883             }
884         }
885         else if (guessing)
886             return s;
887     }
888
889     /* NOTE: The parser sees the package name and the VERSION swapped */
890     PL_nextval[PL_nexttoke].opval = version;
891     force_next(WORD);
892
893     return s;
894 }
895
896 /*
897  * S_tokeq
898  * Tokenize a quoted string passed in as an SV.  It finds the next
899  * chunk, up to end of string or a backslash.  It may make a new
900  * SV containing that chunk (if HINT_NEW_STRING is on).  It also
901  * turns \\ into \.
902  */
903
904 STATIC SV *
905 S_tokeq(pTHX_ SV *sv)
906 {
907     register char *s;
908     register char *send;
909     register char *d;
910     STRLEN len = 0;
911     SV *pv = sv;
912
913     if (!SvLEN(sv))
914         goto finish;
915
916     s = SvPV_force(sv, len);
917     if (SvTYPE(sv) >= SVt_PVIV && SvIVX(sv) == -1)
918         goto finish;
919     send = s + len;
920     while (s < send && *s != '\\')
921         s++;
922     if (s == send)
923         goto finish;
924     d = s;
925     if ( PL_hints & HINT_NEW_STRING ) {
926         pv = sv_2mortal(newSVpvn(SvPVX(pv), len));
927         if (SvUTF8(sv))
928             SvUTF8_on(pv);
929     }
930     while (s < send) {
931         if (*s == '\\') {
932             if (s + 1 < send && (s[1] == '\\'))
933                 s++;            /* all that, just for this */
934         }
935         *d++ = *s++;
936     }
937     *d = '\0';
938     SvCUR_set(sv, d - SvPVX(sv));
939   finish:
940     if ( PL_hints & HINT_NEW_STRING )
941        return new_constant(NULL, 0, "q", sv, pv, "q");
942     return sv;
943 }
944
945 /*
946  * Now come three functions related to double-quote context,
947  * S_sublex_start, S_sublex_push, and S_sublex_done.  They're used when
948  * converting things like "\u\Lgnat" into ucfirst(lc("gnat")).  They
949  * interact with PL_lex_state, and create fake ( ... ) argument lists
950  * to handle functions and concatenation.
951  * They assume that whoever calls them will be setting up a fake
952  * join call, because each subthing puts a ',' after it.  This lets
953  *   "lower \luPpEr"
954  * become
955  *  join($, , 'lower ', lcfirst( 'uPpEr', ) ,)
956  *
957  * (I'm not sure whether the spurious commas at the end of lcfirst's
958  * arguments and join's arguments are created or not).
959  */
960
961 /*
962  * S_sublex_start
963  * Assumes that yylval.ival is the op we're creating (e.g. OP_LCFIRST).
964  *
965  * Pattern matching will set PL_lex_op to the pattern-matching op to
966  * make (we return THING if yylval.ival is OP_NULL, PMFUNC otherwise).
967  *
968  * OP_CONST and OP_READLINE are easy--just make the new op and return.
969  *
970  * Everything else becomes a FUNC.
971  *
972  * Sets PL_lex_state to LEX_INTERPPUSH unless (ival was OP_NULL or we
973  * had an OP_CONST or OP_READLINE).  This just sets us up for a
974  * call to S_sublex_push().
975  */
976
977 STATIC I32
978 S_sublex_start(pTHX)
979 {
980     register I32 op_type = yylval.ival;
981
982     if (op_type == OP_NULL) {
983         yylval.opval = PL_lex_op;
984         PL_lex_op = Nullop;
985         return THING;
986     }
987     if (op_type == OP_CONST || op_type == OP_READLINE) {
988         SV *sv = tokeq(PL_lex_stuff);
989
990         if (SvTYPE(sv) == SVt_PVIV) {
991             /* Overloaded constants, nothing fancy: Convert to SVt_PV: */
992             STRLEN len;
993             char *p;
994             SV *nsv;
995
996             p = SvPV(sv, len);
997             nsv = newSVpvn(p, len);
998             if (SvUTF8(sv))
999                 SvUTF8_on(nsv);
1000             SvREFCNT_dec(sv);
1001             sv = nsv;
1002         }
1003         yylval.opval = (OP*)newSVOP(op_type, 0, sv);
1004         PL_lex_stuff = Nullsv;
1005         /* Allow <FH> // "foo" */
1006         if (op_type == OP_READLINE)
1007             PL_expect = XTERMORDORDOR;
1008         return THING;
1009     }
1010
1011     PL_sublex_info.super_state = PL_lex_state;
1012     PL_sublex_info.sub_inwhat = op_type;
1013     PL_sublex_info.sub_op = PL_lex_op;
1014     PL_lex_state = LEX_INTERPPUSH;
1015
1016     PL_expect = XTERM;
1017     if (PL_lex_op) {
1018         yylval.opval = PL_lex_op;
1019         PL_lex_op = Nullop;
1020         return PMFUNC;
1021     }
1022     else
1023         return FUNC;
1024 }
1025
1026 /*
1027  * S_sublex_push
1028  * Create a new scope to save the lexing state.  The scope will be
1029  * ended in S_sublex_done.  Returns a '(', starting the function arguments
1030  * to the uc, lc, etc. found before.
1031  * Sets PL_lex_state to LEX_INTERPCONCAT.
1032  */
1033
1034 STATIC I32
1035 S_sublex_push(pTHX)
1036 {
1037     ENTER;
1038
1039     PL_lex_state = PL_sublex_info.super_state;
1040     SAVEI32(PL_lex_dojoin);
1041     SAVEI32(PL_lex_brackets);
1042     SAVEI32(PL_lex_casemods);
1043     SAVEI32(PL_lex_starts);
1044     SAVEI32(PL_lex_state);
1045     SAVEVPTR(PL_lex_inpat);
1046     SAVEI32(PL_lex_inwhat);
1047     SAVECOPLINE(PL_curcop);
1048     SAVEPPTR(PL_bufptr);
1049     SAVEPPTR(PL_bufend);
1050     SAVEPPTR(PL_oldbufptr);
1051     SAVEPPTR(PL_oldoldbufptr);
1052     SAVEPPTR(PL_last_lop);
1053     SAVEPPTR(PL_last_uni);
1054     SAVEPPTR(PL_linestart);
1055     SAVESPTR(PL_linestr);
1056     SAVEGENERICPV(PL_lex_brackstack);
1057     SAVEGENERICPV(PL_lex_casestack);
1058
1059     PL_linestr = PL_lex_stuff;
1060     PL_lex_stuff = Nullsv;
1061
1062     PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart
1063         = SvPVX(PL_linestr);
1064     PL_bufend += SvCUR(PL_linestr);
1065     PL_last_lop = PL_last_uni = Nullch;
1066     SAVEFREESV(PL_linestr);
1067
1068     PL_lex_dojoin = FALSE;
1069     PL_lex_brackets = 0;
1070     New(899, PL_lex_brackstack, 120, char);
1071     New(899, PL_lex_casestack, 12, char);
1072     PL_lex_casemods = 0;
1073     *PL_lex_casestack = '\0';
1074     PL_lex_starts = 0;
1075     PL_lex_state = LEX_INTERPCONCAT;
1076     CopLINE_set(PL_curcop, (line_t)PL_multi_start);
1077
1078     PL_lex_inwhat = PL_sublex_info.sub_inwhat;
1079     if (PL_lex_inwhat == OP_MATCH || PL_lex_inwhat == OP_QR || PL_lex_inwhat == OP_SUBST)
1080         PL_lex_inpat = PL_sublex_info.sub_op;
1081     else
1082         PL_lex_inpat = Nullop;
1083
1084     return '(';
1085 }
1086
1087 /*
1088  * S_sublex_done
1089  * Restores lexer state after a S_sublex_push.
1090  */
1091
1092 STATIC I32
1093 S_sublex_done(pTHX)
1094 {
1095     if (!PL_lex_starts++) {
1096         SV *sv = newSVpvn("",0);
1097         if (SvUTF8(PL_linestr))
1098             SvUTF8_on(sv);
1099         PL_expect = XOPERATOR;
1100         yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
1101         return THING;
1102     }
1103
1104     if (PL_lex_casemods) {              /* oops, we've got some unbalanced parens */
1105         PL_lex_state = LEX_INTERPCASEMOD;
1106         return yylex();
1107     }
1108
1109     /* Is there a right-hand side to take care of? (s//RHS/ or tr//RHS/) */
1110     if (PL_lex_repl && (PL_lex_inwhat == OP_SUBST || PL_lex_inwhat == OP_TRANS)) {
1111         PL_linestr = PL_lex_repl;
1112         PL_lex_inpat = 0;
1113         PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
1114         PL_bufend += SvCUR(PL_linestr);
1115         PL_last_lop = PL_last_uni = Nullch;
1116         SAVEFREESV(PL_linestr);
1117         PL_lex_dojoin = FALSE;
1118         PL_lex_brackets = 0;
1119         PL_lex_casemods = 0;
1120         *PL_lex_casestack = '\0';
1121         PL_lex_starts = 0;
1122         if (SvEVALED(PL_lex_repl)) {
1123             PL_lex_state = LEX_INTERPNORMAL;
1124             PL_lex_starts++;
1125             /*  we don't clear PL_lex_repl here, so that we can check later
1126                 whether this is an evalled subst; that means we rely on the
1127                 logic to ensure sublex_done() is called again only via the
1128                 branch (in yylex()) that clears PL_lex_repl, else we'll loop */
1129         }
1130         else {
1131             PL_lex_state = LEX_INTERPCONCAT;
1132             PL_lex_repl = Nullsv;
1133         }
1134         return ',';
1135     }
1136     else {
1137         LEAVE;
1138         PL_bufend = SvPVX(PL_linestr);
1139         PL_bufend += SvCUR(PL_linestr);
1140         PL_expect = XOPERATOR;
1141         PL_sublex_info.sub_inwhat = 0;
1142         return ')';
1143     }
1144 }
1145
1146 /*
1147   scan_const
1148
1149   Extracts a pattern, double-quoted string, or transliteration.  This
1150   is terrifying code.
1151
1152   It looks at lex_inwhat and PL_lex_inpat to find out whether it's
1153   processing a pattern (PL_lex_inpat is true), a transliteration
1154   (lex_inwhat & OP_TRANS is true), or a double-quoted string.
1155
1156   Returns a pointer to the character scanned up to. Iff this is
1157   advanced from the start pointer supplied (ie if anything was
1158   successfully parsed), will leave an OP for the substring scanned
1159   in yylval. Caller must intuit reason for not parsing further
1160   by looking at the next characters herself.
1161
1162   In patterns:
1163     backslashes:
1164       double-quoted style: \r and \n
1165       regexp special ones: \D \s
1166       constants: \x3
1167       backrefs: \1 (deprecated in substitution replacements)
1168       case and quoting: \U \Q \E
1169     stops on @ and $, but not for $ as tail anchor
1170
1171   In transliterations:
1172     characters are VERY literal, except for - not at the start or end
1173     of the string, which indicates a range.  scan_const expands the
1174     range to the full set of intermediate characters.
1175
1176   In double-quoted strings:
1177     backslashes:
1178       double-quoted style: \r and \n
1179       constants: \x3
1180       backrefs: \1 (deprecated)
1181       case and quoting: \U \Q \E
1182     stops on @ and $
1183
1184   scan_const does *not* construct ops to handle interpolated strings.
1185   It stops processing as soon as it finds an embedded $ or @ variable
1186   and leaves it to the caller to work out what's going on.
1187
1188   @ in pattern could be: @foo, @{foo}, @$foo, @'foo, @::foo.
1189
1190   $ in pattern could be $foo or could be tail anchor.  Assumption:
1191   it's a tail anchor if $ is the last thing in the string, or if it's
1192   followed by one of ")| \n\t"
1193
1194   \1 (backreferences) are turned into $1
1195
1196   The structure of the code is
1197       while (there's a character to process) {
1198           handle transliteration ranges
1199           skip regexp comments
1200           skip # initiated comments in //x patterns
1201           check for embedded @foo
1202           check for embedded scalars
1203           if (backslash) {
1204               leave intact backslashes from leave (below)
1205               deprecate \1 in strings and sub replacements
1206               handle string-changing backslashes \l \U \Q \E, etc.
1207               switch (what was escaped) {
1208                   handle - in a transliteration (becomes a literal -)
1209                   handle \132 octal characters
1210                   handle 0x15 hex characters
1211                   handle \cV (control V)
1212                   handle printf backslashes (\f, \r, \n, etc)
1213               } (end switch)
1214           } (end if backslash)
1215     } (end while character to read)
1216                 
1217 */
1218
1219 STATIC char *
1220 S_scan_const(pTHX_ char *start)
1221 {
1222     register char *send = PL_bufend;            /* end of the constant */
1223     SV *sv = NEWSV(93, send - start);           /* sv for the constant */
1224     register char *s = start;                   /* start of the constant */
1225     register char *d = SvPVX(sv);               /* destination for copies */
1226     bool dorange = FALSE;                       /* are we in a translit range? */
1227     bool didrange = FALSE;                      /* did we just finish a range? */
1228     I32  has_utf8 = FALSE;                      /* Output constant is UTF8 */
1229     I32  this_utf8 = UTF;                       /* The source string is assumed to be UTF8 */
1230     UV uv;
1231
1232     const char *leaveit =       /* set of acceptably-backslashed characters */
1233         PL_lex_inpat
1234             ? "\\.^$@AGZdDwWsSbBpPXC+*?|()-nrtfeaxcz0123456789[{]} \t\n\r\f\v#"
1235             : "";
1236
1237     if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
1238         /* If we are doing a trans and we know we want UTF8 set expectation */
1239         has_utf8   = PL_sublex_info.sub_op->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF);
1240         this_utf8  = PL_sublex_info.sub_op->op_private & (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
1241     }
1242
1243
1244     while (s < send || dorange) {
1245         /* get transliterations out of the way (they're most literal) */
1246         if (PL_lex_inwhat == OP_TRANS) {
1247             /* expand a range A-Z to the full set of characters.  AIE! */
1248             if (dorange) {
1249                 I32 i;                          /* current expanded character */
1250                 I32 min;                        /* first character in range */
1251                 I32 max;                        /* last character in range */
1252
1253                 if (has_utf8) {
1254                     char *c = (char*)utf8_hop((U8*)d, -1);
1255                     char *e = d++;
1256                     while (e-- > c)
1257                         *(e + 1) = *e;
1258                     *c = (char)UTF_TO_NATIVE(0xff);
1259                     /* mark the range as done, and continue */
1260                     dorange = FALSE;
1261                     didrange = TRUE;
1262                     continue;
1263                 }
1264
1265                 i = d - SvPVX(sv);              /* remember current offset */
1266                 SvGROW(sv, SvLEN(sv) + 256);    /* never more than 256 chars in a range */
1267                 d = SvPVX(sv) + i;              /* refresh d after realloc */
1268                 d -= 2;                         /* eat the first char and the - */
1269
1270                 min = (U8)*d;                   /* first char in range */
1271                 max = (U8)d[1];                 /* last char in range  */
1272
1273                 if (min > max) {
1274                     Perl_croak(aTHX_
1275                                "Invalid range \"%c-%c\" in transliteration operator",
1276                                (char)min, (char)max);
1277                 }
1278
1279 #ifdef EBCDIC
1280                 if ((isLOWER(min) && isLOWER(max)) ||
1281                     (isUPPER(min) && isUPPER(max))) {
1282                     if (isLOWER(min)) {
1283                         for (i = min; i <= max; i++)
1284                             if (isLOWER(i))
1285                                 *d++ = NATIVE_TO_NEED(has_utf8,i);
1286                     } else {
1287                         for (i = min; i <= max; i++)
1288                             if (isUPPER(i))
1289                                 *d++ = NATIVE_TO_NEED(has_utf8,i);
1290                     }
1291                 }
1292                 else
1293 #endif
1294                     for (i = min; i <= max; i++)
1295                         *d++ = (char)i;
1296
1297                 /* mark the range as done, and continue */
1298                 dorange = FALSE;
1299                 didrange = TRUE;
1300                 continue;
1301             }
1302
1303             /* range begins (ignore - as first or last char) */
1304             else if (*s == '-' && s+1 < send  && s != start) {
1305                 if (didrange) {
1306                     Perl_croak(aTHX_ "Ambiguous range in transliteration operator");
1307                 }
1308                 if (has_utf8) {
1309                     *d++ = (char)UTF_TO_NATIVE(0xff);   /* use illegal utf8 byte--see pmtrans */
1310                     s++;
1311                     continue;
1312                 }
1313                 dorange = TRUE;
1314                 s++;
1315             }
1316             else {
1317                 didrange = FALSE;
1318             }
1319         }
1320
1321         /* if we get here, we're not doing a transliteration */
1322
1323         /* skip for regexp comments /(?#comment)/ and code /(?{code})/,
1324            except for the last char, which will be done separately. */
1325         else if (*s == '(' && PL_lex_inpat && s[1] == '?') {
1326             if (s[2] == '#') {
1327                 while (s+1 < send && *s != ')')
1328                     *d++ = NATIVE_TO_NEED(has_utf8,*s++);
1329             }
1330             else if (s[2] == '{' /* This should match regcomp.c */
1331                      || ((s[2] == 'p' || s[2] == '?') && s[3] == '{'))
1332             {
1333                 I32 count = 1;
1334                 char *regparse = s + (s[2] == '{' ? 3 : 4);
1335                 char c;
1336
1337                 while (count && (c = *regparse)) {
1338                     if (c == '\\' && regparse[1])
1339                         regparse++;
1340                     else if (c == '{')
1341                         count++;
1342                     else if (c == '}')
1343                         count--;
1344                     regparse++;
1345                 }
1346                 if (*regparse != ')')
1347                     regparse--;         /* Leave one char for continuation. */
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                     PERL_FPU_PRE_EXEC
2708                     PerlProc_execv(ipath, EXEC_ARGV_CAST(newargv));
2709                     PERL_FPU_POST_EXEC
2710                     Perl_croak(aTHX_ "Can't exec %s", ipath);
2711                 }
2712 #endif
2713                 if (d) {
2714                     U32 oldpdb = PL_perldb;
2715                     bool oldn = PL_minus_n;
2716                     bool oldp = PL_minus_p;
2717
2718                     while (*d && !isSPACE(*d)) d++;
2719                     while (SPACE_OR_TAB(*d)) d++;
2720
2721                     if (*d++ == '-') {
2722                         bool switches_done = PL_doswitches;
2723                         do {
2724                             if (*d == 'M' || *d == 'm') {
2725                                 char *m = d;
2726                                 while (*d && !isSPACE(*d)) d++;
2727                                 Perl_croak(aTHX_ "Too late for \"-%.*s\" option",
2728                                       (int)(d - m), m);
2729                             }
2730                             d = moreswitches(d);
2731                         } while (d);
2732                         if (PL_doswitches && !switches_done) {
2733                             int argc = PL_origargc;
2734                             char **argv = PL_origargv;
2735                             do {
2736                                 argc--,argv++;
2737                             } while (argc && argv[0][0] == '-' && argv[0][1]);
2738                             init_argv_symbols(argc,argv);
2739                         }
2740                         if ((PERLDB_LINE && !oldpdb) ||
2741                             ((PL_minus_n || PL_minus_p) && !(oldn || oldp)))
2742                               /* if we have already added "LINE: while (<>) {",
2743                                  we must not do it again */
2744                         {
2745                             sv_setpv(PL_linestr, "");
2746                             PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2747                             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
2748                             PL_last_lop = PL_last_uni = Nullch;
2749                             PL_preambled = FALSE;
2750                             if (PERLDB_LINE)
2751                                 (void)gv_fetchfile(PL_origfilename);
2752                             goto retry;
2753                         }
2754                         if (PL_doswitches && !switches_done) {
2755                             int argc = PL_origargc;
2756                             char **argv = PL_origargv;
2757                             do {
2758                                 argc--,argv++;
2759                             } while (argc && argv[0][0] == '-' && argv[0][1]);
2760                             init_argv_symbols(argc,argv);
2761                         }
2762                     }
2763                 }
2764             }
2765         }
2766         if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
2767             PL_bufptr = s;
2768             PL_lex_state = LEX_FORMLINE;
2769             return yylex();
2770         }
2771         goto retry;
2772     case '\r':
2773 #ifdef PERL_STRICT_CR
2774         Perl_warn(aTHX_ "Illegal character \\%03o (carriage return)", '\r');
2775         Perl_croak(aTHX_
2776       "\t(Maybe you didn't strip carriage returns after a network transfer?)\n");
2777 #endif
2778     case ' ': case '\t': case '\f': case 013:
2779 #ifdef MACOS_TRADITIONAL
2780     case '\312':
2781 #endif
2782         s++;
2783         goto retry;
2784     case '#':
2785     case '\n':
2786         if (PL_lex_state != LEX_NORMAL || (PL_in_eval && !PL_rsfp)) {
2787             if (*s == '#' && s == PL_linestart && PL_in_eval && !PL_rsfp) {
2788                 /* handle eval qq[#line 1 "foo"\n ...] */
2789                 CopLINE_dec(PL_curcop);
2790                 incline(s);
2791             }
2792             d = PL_bufend;
2793             while (s < d && *s != '\n')
2794                 s++;
2795             if (s < d)
2796                 s++;
2797             else if (s > d) /* Found by Ilya: feed random input to Perl. */
2798               Perl_croak(aTHX_ "panic: input overflow");
2799             incline(s);
2800             if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
2801                 PL_bufptr = s;
2802                 PL_lex_state = LEX_FORMLINE;
2803                 return yylex();
2804             }
2805         }
2806         else {
2807             *s = '\0';
2808             PL_bufend = s;
2809         }
2810         goto retry;
2811     case '-':
2812         if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
2813             I32 ftst = 0;
2814
2815             s++;
2816             PL_bufptr = s;
2817             tmp = *s++;
2818
2819             while (s < PL_bufend && SPACE_OR_TAB(*s))
2820                 s++;
2821
2822             if (strnEQ(s,"=>",2)) {
2823                 s = force_word(PL_bufptr,WORD,FALSE,FALSE,FALSE);
2824                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
2825                             "### Saw unary minus before =>, forcing word '%s'\n", s);
2826                 } );
2827                 OPERATOR('-');          /* unary minus */
2828             }
2829             PL_last_uni = PL_oldbufptr;
2830             switch (tmp) {
2831             case 'r': ftst = OP_FTEREAD;        break;
2832             case 'w': ftst = OP_FTEWRITE;       break;
2833             case 'x': ftst = OP_FTEEXEC;        break;
2834             case 'o': ftst = OP_FTEOWNED;       break;
2835             case 'R': ftst = OP_FTRREAD;        break;
2836             case 'W': ftst = OP_FTRWRITE;       break;
2837             case 'X': ftst = OP_FTREXEC;        break;
2838             case 'O': ftst = OP_FTROWNED;       break;
2839             case 'e': ftst = OP_FTIS;           break;
2840             case 'z': ftst = OP_FTZERO;         break;
2841             case 's': ftst = OP_FTSIZE;         break;
2842             case 'f': ftst = OP_FTFILE;         break;
2843             case 'd': ftst = OP_FTDIR;          break;
2844             case 'l': ftst = OP_FTLINK;         break;
2845             case 'p': ftst = OP_FTPIPE;         break;
2846             case 'S': ftst = OP_FTSOCK;         break;
2847             case 'u': ftst = OP_FTSUID;         break;
2848             case 'g': ftst = OP_FTSGID;         break;
2849             case 'k': ftst = OP_FTSVTX;         break;
2850             case 'b': ftst = OP_FTBLK;          break;
2851             case 'c': ftst = OP_FTCHR;          break;
2852             case 't': ftst = OP_FTTTY;          break;
2853             case 'T': ftst = OP_FTTEXT;         break;
2854             case 'B': ftst = OP_FTBINARY;       break;
2855             case 'M': case 'A': case 'C':
2856                 gv_fetchpv("\024",TRUE, SVt_PV);
2857                 switch (tmp) {
2858                 case 'M': ftst = OP_FTMTIME;    break;
2859                 case 'A': ftst = OP_FTATIME;    break;
2860                 case 'C': ftst = OP_FTCTIME;    break;
2861                 default:                        break;
2862                 }
2863                 break;
2864             default:
2865                 break;
2866             }
2867             if (ftst) {
2868                 PL_last_lop_op = (OPCODE)ftst;
2869                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
2870                         "### Saw file test %c\n", (int)ftst);
2871                 } );
2872                 FTST(ftst);
2873             }
2874             else {
2875                 /* Assume it was a minus followed by a one-letter named
2876                  * subroutine call (or a -bareword), then. */
2877                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
2878                         "### %c looked like a file test but was not\n",
2879                         (int)ftst);
2880                 } );
2881                 s -= 2;
2882             }
2883         }
2884         tmp = *s++;
2885         if (*s == tmp) {
2886             s++;
2887             if (PL_expect == XOPERATOR)
2888                 TERM(POSTDEC);
2889             else
2890                 OPERATOR(PREDEC);
2891         }
2892         else if (*s == '>') {
2893             s++;
2894             s = skipspace(s);
2895             if (isIDFIRST_lazy_if(s,UTF)) {
2896                 s = force_word(s,METHOD,FALSE,TRUE,FALSE);
2897                 TOKEN(ARROW);
2898             }
2899             else if (*s == '$')
2900                 OPERATOR(ARROW);
2901             else
2902                 TERM(ARROW);
2903         }
2904         if (PL_expect == XOPERATOR)
2905             Aop(OP_SUBTRACT);
2906         else {
2907             if (isSPACE(*s) || !isSPACE(*PL_bufptr))
2908                 check_uni();
2909             OPERATOR('-');              /* unary minus */
2910         }
2911
2912     case '+':
2913         tmp = *s++;
2914         if (*s == tmp) {
2915             s++;
2916             if (PL_expect == XOPERATOR)
2917                 TERM(POSTINC);
2918             else
2919                 OPERATOR(PREINC);
2920         }
2921         if (PL_expect == XOPERATOR)
2922             Aop(OP_ADD);
2923         else {
2924             if (isSPACE(*s) || !isSPACE(*PL_bufptr))
2925                 check_uni();
2926             OPERATOR('+');
2927         }
2928
2929     case '*':
2930         if (PL_expect != XOPERATOR) {
2931             s = scan_ident(s, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
2932             PL_expect = XOPERATOR;
2933             force_ident(PL_tokenbuf, '*');
2934             if (!*PL_tokenbuf)
2935                 PREREF('*');
2936             TERM('*');
2937         }
2938         s++;
2939         if (*s == '*') {
2940             s++;
2941             PWop(OP_POW);
2942         }
2943         Mop(OP_MULTIPLY);
2944
2945     case '%':
2946         if (PL_expect == XOPERATOR) {
2947             ++s;
2948             Mop(OP_MODULO);
2949         }
2950         PL_tokenbuf[0] = '%';
2951         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, TRUE);
2952         if (!PL_tokenbuf[1]) {
2953             PREREF('%');
2954         }
2955         PL_pending_ident = '%';
2956         TERM('%');
2957
2958     case '^':
2959         s++;
2960         BOop(OP_BIT_XOR);
2961     case '[':
2962         PL_lex_brackets++;
2963         /* FALL THROUGH */
2964     case '~':
2965     case ',':
2966         tmp = *s++;
2967         OPERATOR(tmp);
2968     case ':':
2969         if (s[1] == ':') {
2970             len = 0;
2971             goto just_a_word;
2972         }
2973         s++;
2974         switch (PL_expect) {
2975             OP *attrs;
2976         case XOPERATOR:
2977             if (!PL_in_my || PL_lex_state != LEX_NORMAL)
2978                 break;
2979             PL_bufptr = s;      /* update in case we back off */
2980             goto grabattrs;
2981         case XATTRBLOCK:
2982             PL_expect = XBLOCK;
2983             goto grabattrs;
2984         case XATTRTERM:
2985             PL_expect = XTERMBLOCK;
2986          grabattrs:
2987             s = skipspace(s);
2988             attrs = Nullop;
2989             while (isIDFIRST_lazy_if(s,UTF)) {
2990                 d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
2991                 if (isLOWER(*s) && (tmp = keyword(PL_tokenbuf, len))) {
2992                     if (tmp < 0) tmp = -tmp;
2993                     switch (tmp) {
2994                     case KEY_or:
2995                     case KEY_and:
2996                     case KEY_err:
2997                     case KEY_for:
2998                     case KEY_unless:
2999                     case KEY_if:
3000                     case KEY_while:
3001                     case KEY_until:
3002                         goto got_attrs;
3003                     default:
3004                         break;
3005                     }
3006                 }
3007                 if (*d == '(') {
3008                     d = scan_str(d,TRUE,TRUE);
3009                     if (!d) {
3010                         /* MUST advance bufptr here to avoid bogus
3011                            "at end of line" context messages from yyerror().
3012                          */
3013                         PL_bufptr = s + len;
3014                         yyerror("Unterminated attribute parameter in attribute list");
3015                         if (attrs)
3016                             op_free(attrs);
3017                         return 0;       /* EOF indicator */
3018                     }
3019                 }
3020                 if (PL_lex_stuff) {
3021                     SV *sv = newSVpvn(s, len);
3022                     sv_catsv(sv, PL_lex_stuff);
3023                     attrs = append_elem(OP_LIST, attrs,
3024                                         newSVOP(OP_CONST, 0, sv));
3025                     SvREFCNT_dec(PL_lex_stuff);
3026                     PL_lex_stuff = Nullsv;
3027                 }
3028                 else {
3029                     /* NOTE: any CV attrs applied here need to be part of
3030                        the CVf_BUILTIN_ATTRS define in cv.h! */
3031                     if (!PL_in_my && len == 6 && strnEQ(s, "lvalue", len))
3032                         CvLVALUE_on(PL_compcv);
3033                     else if (!PL_in_my && len == 6 && strnEQ(s, "locked", len))
3034                         CvLOCKED_on(PL_compcv);
3035                     else if (!PL_in_my && len == 6 && strnEQ(s, "method", len))
3036                         CvMETHOD_on(PL_compcv);
3037                     else if (!PL_in_my && len == 9 && strnEQ(s, "assertion", len))
3038                         CvASSERTION_on(PL_compcv);
3039 #ifdef USE_ITHREADS
3040                     else if (PL_in_my == KEY_our && len == 6 &&
3041                              strnEQ(s, "unique", len))
3042                         GvUNIQUE_on(cGVOPx_gv(yylval.opval));
3043 #endif
3044                     /* After we've set the flags, it could be argued that
3045                        we don't need to do the attributes.pm-based setting
3046                        process, and shouldn't bother appending recognized
3047                        flags.  To experiment with that, uncomment the
3048                        following "else".  (Note that's already been
3049                        uncommented.  That keeps the above-applied built-in
3050                        attributes from being intercepted (and possibly
3051                        rejected) by a package's attribute routines, but is
3052                        justified by the performance win for the common case
3053                        of applying only built-in attributes.) */
3054                     else
3055                         attrs = append_elem(OP_LIST, attrs,
3056                                             newSVOP(OP_CONST, 0,
3057                                                     newSVpvn(s, len)));
3058                 }
3059                 s = skipspace(d);
3060                 if (*s == ':' && s[1] != ':')
3061                     s = skipspace(s+1);
3062                 else if (s == d)
3063                     break;      /* require real whitespace or :'s */
3064             }
3065             tmp = (PL_expect == XOPERATOR ? '=' : '{'); /*'}(' for vi */
3066             if (*s != ';' && *s != '}' && *s != tmp && (tmp != '=' || *s != ')')) {
3067                 char q = ((*s == '\'') ? '"' : '\'');
3068                 /* If here for an expression, and parsed no attrs, back off. */
3069                 if (tmp == '=' && !attrs) {
3070                     s = PL_bufptr;
3071                     break;
3072                 }
3073                 /* MUST advance bufptr here to avoid bogus "at end of line"
3074                    context messages from yyerror().
3075                  */
3076                 PL_bufptr = s;
3077                 if (!*s)
3078                     yyerror("Unterminated attribute list");
3079                 else
3080                     yyerror(Perl_form(aTHX_ "Invalid separator character %c%c%c in attribute list",
3081                                       q, *s, q));
3082                 if (attrs)
3083                     op_free(attrs);
3084                 OPERATOR(':');
3085             }
3086         got_attrs:
3087             if (attrs) {
3088                 PL_nextval[PL_nexttoke].opval = attrs;
3089                 force_next(THING);
3090             }
3091             TOKEN(COLONATTR);
3092         }
3093         OPERATOR(':');
3094     case '(':
3095         s++;
3096         if (PL_last_lop == PL_oldoldbufptr || PL_last_uni == PL_oldoldbufptr)
3097             PL_oldbufptr = PL_oldoldbufptr;             /* allow print(STDOUT 123) */
3098         else
3099             PL_expect = XTERM;
3100         s = skipspace(s);
3101         TOKEN('(');
3102     case ';':
3103         CLINE;
3104         tmp = *s++;
3105         OPERATOR(tmp);
3106     case ')':
3107         tmp = *s++;
3108         s = skipspace(s);
3109         if (*s == '{')
3110             PREBLOCK(tmp);
3111         TERM(tmp);
3112     case ']':
3113         s++;
3114         if (PL_lex_brackets <= 0)
3115             yyerror("Unmatched right square bracket");
3116         else
3117             --PL_lex_brackets;
3118         if (PL_lex_state == LEX_INTERPNORMAL) {
3119             if (PL_lex_brackets == 0) {
3120                 if (*s != '[' && *s != '{' && (*s != '-' || s[1] != '>'))
3121                     PL_lex_state = LEX_INTERPEND;
3122             }
3123         }
3124         TERM(']');
3125     case '{':
3126       leftbracket:
3127         s++;
3128         if (PL_lex_brackets > 100) {
3129             Renew(PL_lex_brackstack, PL_lex_brackets + 10, char);
3130         }
3131         switch (PL_expect) {
3132         case XTERM:
3133             if (PL_lex_formbrack) {
3134                 s--;
3135                 PRETERMBLOCK(DO);
3136             }
3137             if (PL_oldoldbufptr == PL_last_lop)
3138                 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
3139             else
3140                 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
3141             OPERATOR(HASHBRACK);
3142         case XOPERATOR:
3143             while (s < PL_bufend && SPACE_OR_TAB(*s))
3144                 s++;
3145             d = s;
3146             PL_tokenbuf[0] = '\0';
3147             if (d < PL_bufend && *d == '-') {
3148                 PL_tokenbuf[0] = '-';
3149                 d++;
3150                 while (d < PL_bufend && SPACE_OR_TAB(*d))
3151                     d++;
3152             }
3153             if (d < PL_bufend && isIDFIRST_lazy_if(d,UTF)) {
3154                 d = scan_word(d, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
3155                               FALSE, &len);
3156                 while (d < PL_bufend && SPACE_OR_TAB(*d))
3157                     d++;
3158                 if (*d == '}') {
3159                     char minus = (PL_tokenbuf[0] == '-');
3160                     s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
3161                     if (minus)
3162                         force_next('-');
3163                 }
3164             }
3165             /* FALL THROUGH */
3166         case XATTRBLOCK:
3167         case XBLOCK:
3168             PL_lex_brackstack[PL_lex_brackets++] = XSTATE;
3169             PL_expect = XSTATE;
3170             break;
3171         case XATTRTERM:
3172         case XTERMBLOCK:
3173             PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
3174             PL_expect = XSTATE;
3175             break;
3176         default: {
3177                 char *t;
3178                 if (PL_oldoldbufptr == PL_last_lop)
3179                     PL_lex_brackstack[PL_lex_brackets++] = XTERM;
3180                 else
3181                     PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
3182                 s = skipspace(s);
3183                 if (*s == '}') {
3184                     if (PL_expect == XREF && PL_lex_state == LEX_INTERPNORMAL) {
3185                         PL_expect = XTERM;
3186                         /* This hack is to get the ${} in the message. */
3187                         PL_bufptr = s+1;
3188                         yyerror("syntax error");
3189                         break;
3190                     }
3191                     OPERATOR(HASHBRACK);
3192                 }
3193                 /* This hack serves to disambiguate a pair of curlies
3194                  * as being a block or an anon hash.  Normally, expectation
3195                  * determines that, but in cases where we're not in a
3196                  * position to expect anything in particular (like inside
3197                  * eval"") we have to resolve the ambiguity.  This code
3198                  * covers the case where the first term in the curlies is a
3199                  * quoted string.  Most other cases need to be explicitly
3200                  * disambiguated by prepending a `+' before the opening
3201                  * curly in order to force resolution as an anon hash.
3202                  *
3203                  * XXX should probably propagate the outer expectation
3204                  * into eval"" to rely less on this hack, but that could
3205                  * potentially break current behavior of eval"".
3206                  * GSAR 97-07-21
3207                  */
3208                 t = s;
3209                 if (*s == '\'' || *s == '"' || *s == '`') {
3210                     /* common case: get past first string, handling escapes */
3211                     for (t++; t < PL_bufend && *t != *s;)
3212                         if (*t++ == '\\' && (*t == '\\' || *t == *s))
3213                             t++;
3214                     t++;
3215                 }
3216                 else if (*s == 'q') {
3217                     if (++t < PL_bufend
3218                         && (!isALNUM(*t)
3219                             || ((*t == 'q' || *t == 'x') && ++t < PL_bufend
3220                                 && !isALNUM(*t))))
3221                     {
3222                         /* skip q//-like construct */
3223                         char *tmps;
3224                         char open, close, term;
3225                         I32 brackets = 1;
3226
3227                         while (t < PL_bufend && isSPACE(*t))
3228                             t++;
3229                         /* check for q => */
3230                         if (t+1 < PL_bufend && t[0] == '=' && t[1] == '>') {
3231                             OPERATOR(HASHBRACK);
3232                         }
3233                         term = *t;
3234                         open = term;
3235                         if (term && (tmps = strchr("([{< )]}> )]}>",term)))
3236                             term = tmps[5];
3237                         close = term;
3238                         if (open == close)
3239                             for (t++; t < PL_bufend; t++) {
3240                                 if (*t == '\\' && t+1 < PL_bufend && open != '\\')
3241                                     t++;
3242                                 else if (*t == open)
3243                                     break;
3244                             }
3245                         else {
3246                             for (t++; t < PL_bufend; t++) {
3247                                 if (*t == '\\' && t+1 < PL_bufend)
3248                                     t++;
3249                                 else if (*t == close && --brackets <= 0)
3250                                     break;
3251                                 else if (*t == open)
3252                                     brackets++;
3253                             }
3254                         }
3255                         t++;
3256                     }
3257                     else
3258                         /* skip plain q word */
3259                         while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
3260                              t += UTF8SKIP(t);
3261                 }
3262                 else if (isALNUM_lazy_if(t,UTF)) {
3263                     t += UTF8SKIP(t);
3264                     while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
3265                          t += UTF8SKIP(t);
3266                 }
3267                 while (t < PL_bufend && isSPACE(*t))
3268                     t++;
3269                 /* if comma follows first term, call it an anon hash */
3270                 /* XXX it could be a comma expression with loop modifiers */
3271                 if (t < PL_bufend && ((*t == ',' && (*s == 'q' || !isLOWER(*s)))
3272                                    || (*t == '=' && t[1] == '>')))
3273                     OPERATOR(HASHBRACK);
3274                 if (PL_expect == XREF)
3275                     PL_expect = XTERM;
3276                 else {
3277                     PL_lex_brackstack[PL_lex_brackets-1] = XSTATE;
3278                     PL_expect = XSTATE;
3279                 }
3280             }
3281             break;
3282         }
3283         yylval.ival = CopLINE(PL_curcop);
3284         if (isSPACE(*s) || *s == '#')
3285             PL_copline = NOLINE;   /* invalidate current command line number */
3286         TOKEN('{');
3287     case '}':
3288       rightbracket:
3289         s++;
3290         if (PL_lex_brackets <= 0)
3291             yyerror("Unmatched right curly bracket");
3292         else
3293             PL_expect = (expectation)PL_lex_brackstack[--PL_lex_brackets];
3294         if (PL_lex_brackets < PL_lex_formbrack && PL_lex_state != LEX_INTERPNORMAL)
3295             PL_lex_formbrack = 0;
3296         if (PL_lex_state == LEX_INTERPNORMAL) {
3297             if (PL_lex_brackets == 0) {
3298                 if (PL_expect & XFAKEBRACK) {
3299                     PL_expect &= XENUMMASK;
3300                     PL_lex_state = LEX_INTERPEND;
3301                     PL_bufptr = s;
3302                     return yylex();     /* ignore fake brackets */
3303                 }
3304                 if (*s == '-' && s[1] == '>')
3305                     PL_lex_state = LEX_INTERPENDMAYBE;
3306                 else if (*s != '[' && *s != '{')
3307                     PL_lex_state = LEX_INTERPEND;
3308             }
3309         }
3310         if (PL_expect & XFAKEBRACK) {
3311             PL_expect &= XENUMMASK;
3312             PL_bufptr = s;
3313             return yylex();             /* ignore fake brackets */
3314         }
3315         force_next('}');
3316         TOKEN(';');
3317     case '&':
3318         s++;
3319         tmp = *s++;
3320         if (tmp == '&')
3321             AOPERATOR(ANDAND);
3322         s--;
3323         if (PL_expect == XOPERATOR) {
3324             if (ckWARN(WARN_SEMICOLON)
3325                 && isIDFIRST_lazy_if(s,UTF) && PL_bufptr == PL_linestart)
3326             {
3327                 CopLINE_dec(PL_curcop);
3328                 Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), PL_warn_nosemi);
3329                 CopLINE_inc(PL_curcop);
3330             }
3331             BAop(OP_BIT_AND);
3332         }
3333
3334         s = scan_ident(s - 1, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
3335         if (*PL_tokenbuf) {
3336             PL_expect = XOPERATOR;
3337             force_ident(PL_tokenbuf, '&');
3338         }
3339         else
3340             PREREF('&');
3341         yylval.ival = (OPpENTERSUB_AMPER<<8);
3342         TERM('&');
3343
3344     case '|':
3345         s++;
3346         tmp = *s++;
3347         if (tmp == '|')
3348             AOPERATOR(OROR);
3349         s--;
3350         BOop(OP_BIT_OR);
3351     case '=':
3352         s++;
3353         tmp = *s++;
3354         if (tmp == '=')
3355             Eop(OP_EQ);
3356         if (tmp == '>')
3357             OPERATOR(',');
3358         if (tmp == '~')
3359             PMop(OP_MATCH);
3360         if (ckWARN(WARN_SYNTAX) && tmp && isSPACE(*s) && strchr("+-*/%.^&|<",tmp))
3361             Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Reversed %c= operator",(int)tmp);
3362         s--;
3363         if (PL_expect == XSTATE && isALPHA(tmp) &&
3364                 (s == PL_linestart+1 || s[-2] == '\n') )
3365         {
3366             if (PL_in_eval && !PL_rsfp) {
3367                 d = PL_bufend;
3368                 while (s < d) {
3369                     if (*s++ == '\n') {
3370                         incline(s);
3371                         if (strnEQ(s,"=cut",4)) {
3372                             s = strchr(s,'\n');
3373                             if (s)
3374                                 s++;
3375                             else
3376                                 s = d;
3377                             incline(s);
3378                             goto retry;
3379                         }
3380                     }
3381                 }
3382                 goto retry;
3383             }
3384             s = PL_bufend;
3385             PL_doextract = TRUE;
3386             goto retry;
3387         }
3388         if (PL_lex_brackets < PL_lex_formbrack) {
3389             char *t;
3390 #ifdef PERL_STRICT_CR
3391             for (t = s; SPACE_OR_TAB(*t); t++) ;
3392 #else
3393             for (t = s; SPACE_OR_TAB(*t) || *t == '\r'; t++) ;
3394 #endif
3395             if (*t == '\n' || *t == '#') {
3396                 s--;
3397                 PL_expect = XBLOCK;
3398                 goto leftbracket;
3399             }
3400         }
3401         yylval.ival = 0;
3402         OPERATOR(ASSIGNOP);
3403     case '!':
3404         s++;
3405         tmp = *s++;
3406         if (tmp == '=')
3407             Eop(OP_NE);
3408         if (tmp == '~')
3409             PMop(OP_NOT);
3410         s--;
3411         OPERATOR('!');
3412     case '<':
3413         if (PL_expect != XOPERATOR) {
3414             if (s[1] != '<' && !strchr(s,'>'))
3415                 check_uni();
3416             if (s[1] == '<')
3417                 s = scan_heredoc(s);
3418             else
3419                 s = scan_inputsymbol(s);
3420             TERM(sublex_start());
3421         }
3422         s++;
3423         tmp = *s++;
3424         if (tmp == '<')
3425             SHop(OP_LEFT_SHIFT);
3426         if (tmp == '=') {
3427             tmp = *s++;
3428             if (tmp == '>')
3429                 Eop(OP_NCMP);
3430             s--;
3431             Rop(OP_LE);
3432         }
3433         s--;
3434         Rop(OP_LT);
3435     case '>':
3436         s++;
3437         tmp = *s++;
3438         if (tmp == '>')
3439             SHop(OP_RIGHT_SHIFT);
3440         if (tmp == '=')
3441             Rop(OP_GE);
3442         s--;
3443         Rop(OP_GT);
3444
3445     case '$':
3446         CLINE;
3447
3448         if (PL_expect == XOPERATOR) {
3449             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3450                 PL_expect = XTERM;
3451                 depcom();
3452                 return ','; /* grandfather non-comma-format format */
3453             }
3454         }
3455
3456         if (s[1] == '#' && (isIDFIRST_lazy_if(s+2,UTF) || strchr("{$:+-", s[2]))) {
3457             PL_tokenbuf[0] = '@';
3458             s = scan_ident(s + 1, PL_bufend, PL_tokenbuf + 1,
3459                            sizeof PL_tokenbuf - 1, FALSE);
3460             if (PL_expect == XOPERATOR)
3461                 no_op("Array length", s);
3462             if (!PL_tokenbuf[1])
3463                 PREREF(DOLSHARP);
3464             PL_expect = XOPERATOR;
3465             PL_pending_ident = '#';
3466             TOKEN(DOLSHARP);
3467         }
3468
3469         PL_tokenbuf[0] = '$';
3470         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
3471                        sizeof PL_tokenbuf - 1, FALSE);
3472         if (PL_expect == XOPERATOR)
3473             no_op("Scalar", s);
3474         if (!PL_tokenbuf[1]) {
3475             if (s == PL_bufend)
3476                 yyerror("Final $ should be \\$ or $name");
3477             PREREF('$');
3478         }
3479
3480         /* This kludge not intended to be bulletproof. */
3481         if (PL_tokenbuf[1] == '[' && !PL_tokenbuf[2]) {
3482             yylval.opval = newSVOP(OP_CONST, 0,
3483                                    newSViv(PL_compiling.cop_arybase));
3484             yylval.opval->op_private = OPpCONST_ARYBASE;
3485             TERM(THING);
3486         }
3487
3488         d = s;
3489         tmp = (I32)*s;
3490         if (PL_lex_state == LEX_NORMAL)
3491             s = skipspace(s);
3492
3493         if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
3494             char *t;
3495             if (*s == '[') {
3496                 PL_tokenbuf[0] = '@';
3497                 if (ckWARN(WARN_SYNTAX)) {
3498                     for(t = s + 1;
3499                         isSPACE(*t) || isALNUM_lazy_if(t,UTF) || *t == '$';
3500                         t++) ;
3501                     if (*t++ == ',') {
3502                         PL_bufptr = skipspace(PL_bufptr);
3503                         while (t < PL_bufend && *t != ']')
3504                             t++;
3505                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
3506                                 "Multidimensional syntax %.*s not supported",
3507                                 (t - PL_bufptr) + 1, PL_bufptr);
3508                     }
3509                 }
3510             }
3511             else if (*s == '{') {
3512                 PL_tokenbuf[0] = '%';
3513                 if (ckWARN(WARN_SYNTAX) && strEQ(PL_tokenbuf+1, "SIG") &&
3514                     (t = strchr(s, '}')) && (t = strchr(t, '=')))
3515                 {
3516                     char tmpbuf[sizeof PL_tokenbuf];
3517                     STRLEN len;
3518                     for (t++; isSPACE(*t); t++) ;
3519                     if (isIDFIRST_lazy_if(t,UTF)) {
3520                         t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE, &len);
3521                         for (; isSPACE(*t); t++) ;
3522                         if (*t == ';' && get_cv(tmpbuf, FALSE))
3523                             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
3524                                 "You need to quote \"%s\"", tmpbuf);
3525                     }
3526                 }
3527             }
3528         }
3529
3530         PL_expect = XOPERATOR;
3531         if (PL_lex_state == LEX_NORMAL && isSPACE((char)tmp)) {
3532             bool islop = (PL_last_lop == PL_oldoldbufptr);
3533             if (!islop || PL_last_lop_op == OP_GREPSTART)
3534                 PL_expect = XOPERATOR;
3535             else if (strchr("$@\"'`q", *s))
3536                 PL_expect = XTERM;              /* e.g. print $fh "foo" */
3537             else if (strchr("&*<%", *s) && isIDFIRST_lazy_if(s+1,UTF))
3538                 PL_expect = XTERM;              /* e.g. print $fh &sub */
3539             else if (isIDFIRST_lazy_if(s,UTF)) {
3540                 char tmpbuf[sizeof PL_tokenbuf];
3541                 scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
3542                 if ((tmp = keyword(tmpbuf, len))) {
3543                     /* binary operators exclude handle interpretations */
3544                     switch (tmp) {
3545                     case -KEY_x:
3546                     case -KEY_eq:
3547                     case -KEY_ne:
3548                     case -KEY_gt:
3549                     case -KEY_lt:
3550                     case -KEY_ge:
3551                     case -KEY_le:
3552                     case -KEY_cmp:
3553                         break;
3554                     default:
3555                         PL_expect = XTERM;      /* e.g. print $fh length() */
3556                         break;
3557                     }
3558                 }
3559                 else {
3560                     PL_expect = XTERM;          /* e.g. print $fh subr() */
3561                 }
3562             }
3563             else if (isDIGIT(*s))
3564                 PL_expect = XTERM;              /* e.g. print $fh 3 */
3565             else if (*s == '.' && isDIGIT(s[1]))
3566                 PL_expect = XTERM;              /* e.g. print $fh .3 */
3567             else if (strchr("?-+", *s) && !isSPACE(s[1]) && s[1] != '=')
3568                 PL_expect = XTERM;              /* e.g. print $fh -1 */
3569             else if (*s == '/' && !isSPACE(s[1]) && s[1] != '=' && s[1] != '/')
3570                 PL_expect = XTERM;              /* e.g. print $fh /.../
3571                                                  XXX except DORDOR operator */
3572             else if (*s == '<' && s[1] == '<' && !isSPACE(s[2]) && s[2] != '=')
3573                 PL_expect = XTERM;              /* print $fh <<"EOF" */
3574         }
3575         PL_pending_ident = '$';
3576         TOKEN('$');
3577
3578     case '@':
3579         if (PL_expect == XOPERATOR)
3580             no_op("Array", s);
3581         PL_tokenbuf[0] = '@';
3582         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, FALSE);
3583         if (!PL_tokenbuf[1]) {
3584             PREREF('@');
3585         }
3586         if (PL_lex_state == LEX_NORMAL)
3587             s = skipspace(s);
3588         if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
3589             if (*s == '{')
3590                 PL_tokenbuf[0] = '%';
3591
3592             /* Warn about @ where they meant $. */
3593             if (ckWARN(WARN_SYNTAX)) {
3594                 if (*s == '[' || *s == '{') {
3595                     char *t = s + 1;
3596                     while (*t && (isALNUM_lazy_if(t,UTF) || strchr(" \t$#+-'\"", *t)))
3597                         t++;
3598                     if (*t == '}' || *t == ']') {
3599                         t++;
3600                         PL_bufptr = skipspace(PL_bufptr);
3601                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
3602                             "Scalar value %.*s better written as $%.*s",
3603                             t-PL_bufptr, PL_bufptr, t-PL_bufptr-1, PL_bufptr+1);
3604                     }
3605                 }
3606             }
3607         }
3608         PL_pending_ident = '@';
3609         TERM('@');
3610
3611      case '/':                  /* may be division, defined-or, or pattern */
3612         if (PL_expect == XTERMORDORDOR && s[1] == '/') {
3613             s += 2;
3614             AOPERATOR(DORDOR);
3615         }
3616      case '?':                  /* may either be conditional or pattern */
3617          if(PL_expect == XOPERATOR) {
3618              tmp = *s++;
3619              if(tmp == '?') {
3620                   OPERATOR('?');
3621              }
3622              else {
3623                  tmp = *s++;
3624                  if(tmp == '/') {
3625                      /* A // operator. */
3626                     AOPERATOR(DORDOR);
3627                  }
3628                  else {
3629                      s--;
3630                      Mop(OP_DIVIDE);
3631                  }
3632              }
3633          }
3634          else {
3635              /* Disable warning on "study /blah/" */
3636              if (PL_oldoldbufptr == PL_last_uni
3637               && (*PL_last_uni != 's' || s - PL_last_uni < 5
3638                   || memNE(PL_last_uni, "study", 5)
3639                   || isALNUM_lazy_if(PL_last_uni+5,UTF)
3640               ))
3641                  check_uni();
3642              s = scan_pat(s,OP_MATCH);
3643              TERM(sublex_start());
3644          }
3645
3646     case '.':
3647         if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack
3648 #ifdef PERL_STRICT_CR
3649             && s[1] == '\n'
3650 #else
3651             && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n'))
3652 #endif
3653             && (s == PL_linestart || s[-1] == '\n') )
3654         {
3655             PL_lex_formbrack = 0;
3656             PL_expect = XSTATE;
3657             goto rightbracket;
3658         }
3659         if (PL_expect == XOPERATOR || !isDIGIT(s[1])) {
3660             tmp = *s++;
3661             if (*s == tmp) {
3662                 s++;
3663                 if (*s == tmp) {
3664                     s++;
3665                     yylval.ival = OPf_SPECIAL;
3666                 }
3667                 else
3668                     yylval.ival = 0;
3669                 OPERATOR(DOTDOT);
3670             }
3671             if (PL_expect != XOPERATOR)
3672                 check_uni();
3673             Aop(OP_CONCAT);
3674         }
3675         /* FALL THROUGH */
3676     case '0': case '1': case '2': case '3': case '4':
3677     case '5': case '6': case '7': case '8': case '9':
3678         s = scan_num(s, &yylval);
3679         DEBUG_T( { PerlIO_printf(Perl_debug_log,
3680                     "### Saw number in '%s'\n", s);
3681         } );
3682         if (PL_expect == XOPERATOR)
3683             no_op("Number",s);
3684         TERM(THING);
3685
3686     case '\'':
3687         s = scan_str(s,FALSE,FALSE);
3688         DEBUG_T( { PerlIO_printf(Perl_debug_log,
3689                     "### Saw string before '%s'\n", s);
3690         } );
3691         if (PL_expect == XOPERATOR) {
3692             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3693                 PL_expect = XTERM;
3694                 depcom();
3695                 return ',';     /* grandfather non-comma-format format */
3696             }
3697             else
3698                 no_op("String",s);
3699         }
3700         if (!s)
3701             missingterm((char*)0);
3702         yylval.ival = OP_CONST;
3703         TERM(sublex_start());
3704
3705     case '"':
3706         s = scan_str(s,FALSE,FALSE);
3707         DEBUG_T( { PerlIO_printf(Perl_debug_log,
3708                     "### Saw string before '%s'\n", s);
3709         } );
3710         if (PL_expect == XOPERATOR) {
3711             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3712                 PL_expect = XTERM;
3713                 depcom();
3714                 return ',';     /* grandfather non-comma-format format */
3715             }
3716             else
3717                 no_op("String",s);
3718         }
3719         if (!s)
3720             missingterm((char*)0);
3721         yylval.ival = OP_CONST;
3722         for (d = SvPV(PL_lex_stuff, len); len; len--, d++) {
3723             if (*d == '$' || *d == '@' || *d == '\\' || !UTF8_IS_INVARIANT((U8)*d)) {
3724                 yylval.ival = OP_STRINGIFY;
3725                 break;
3726             }
3727         }
3728         TERM(sublex_start());
3729
3730     case '`':
3731         s = scan_str(s,FALSE,FALSE);
3732         DEBUG_T( { PerlIO_printf(Perl_debug_log,
3733                     "### Saw backtick string before '%s'\n", s);
3734         } );
3735         if (PL_expect == XOPERATOR)
3736             no_op("Backticks",s);
3737         if (!s)
3738             missingterm((char*)0);
3739         yylval.ival = OP_BACKTICK;
3740         set_csh();
3741         TERM(sublex_start());
3742
3743     case '\\':
3744         s++;
3745         if (ckWARN(WARN_SYNTAX) && PL_lex_inwhat && isDIGIT(*s))
3746             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),"Can't use \\%c to mean $%c in expression",
3747                         *s, *s);
3748         if (PL_expect == XOPERATOR)
3749             no_op("Backslash",s);
3750         OPERATOR(REFGEN);
3751
3752     case 'v':
3753         if (isDIGIT(s[1]) && PL_expect != XOPERATOR) {
3754             char *start = s;
3755             start++;
3756             start++;
3757             while (isDIGIT(*start) || *start == '_')
3758                 start++;
3759             if (*start == '.' && isDIGIT(start[1])) {
3760                 s = scan_num(s, &yylval);
3761                 TERM(THING);
3762             }
3763             /* avoid v123abc() or $h{v1}, allow C<print v10;> */
3764             else if (!isALPHA(*start) && (PL_expect == XTERM
3765                         || PL_expect == XREF || PL_expect == XSTATE
3766                         || PL_expect == XTERMORDORDOR)) {
3767                 char c = *start;
3768                 GV *gv;
3769                 *start = '\0';
3770                 gv = gv_fetchpv(s, FALSE, SVt_PVCV);
3771                 *start = c;
3772                 if (!gv) {
3773                     s = scan_num(s, &yylval);
3774                     TERM(THING);
3775                 }
3776             }
3777         }
3778         goto keylookup;
3779     case 'x':
3780         if (isDIGIT(s[1]) && PL_expect == XOPERATOR) {
3781             s++;
3782             Mop(OP_REPEAT);
3783         }
3784         goto keylookup;
3785
3786     case '_':
3787     case 'a': case 'A':
3788     case 'b': case 'B':
3789     case 'c': case 'C':
3790     case 'd': case 'D':
3791     case 'e': case 'E':
3792     case 'f': case 'F':
3793     case 'g': case 'G':
3794     case 'h': case 'H':
3795     case 'i': case 'I':
3796     case 'j': case 'J':
3797     case 'k': case 'K':
3798     case 'l': case 'L':
3799     case 'm': case 'M':
3800     case 'n': case 'N':
3801     case 'o': case 'O':
3802     case 'p': case 'P':
3803     case 'q': case 'Q':
3804     case 'r': case 'R':
3805     case 's': case 'S':
3806     case 't': case 'T':
3807     case 'u': case 'U':
3808               case 'V':
3809     case 'w': case 'W':
3810               case 'X':
3811     case 'y': case 'Y':
3812     case 'z': case 'Z':
3813
3814       keylookup: {
3815         orig_keyword = 0;
3816         gv = Nullgv;
3817         gvp = 0;
3818
3819         PL_bufptr = s;
3820         s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
3821
3822         /* Some keywords can be followed by any delimiter, including ':' */
3823         tmp = ((len == 1 && strchr("msyq", PL_tokenbuf[0])) ||
3824                (len == 2 && ((PL_tokenbuf[0] == 't' && PL_tokenbuf[1] == 'r') ||
3825                              (PL_tokenbuf[0] == 'q' &&
3826                               strchr("qwxr", PL_tokenbuf[1])))));
3827
3828         /* x::* is just a word, unless x is "CORE" */
3829         if (!tmp && *s == ':' && s[1] == ':' && strNE(PL_tokenbuf, "CORE"))
3830             goto just_a_word;
3831
3832         d = s;
3833         while (d < PL_bufend && isSPACE(*d))
3834                 d++;    /* no comments skipped here, or s### is misparsed */
3835
3836         /* Is this a label? */
3837         if (!tmp && PL_expect == XSTATE
3838               && d < PL_bufend && *d == ':' && *(d + 1) != ':') {
3839             s = d + 1;
3840             yylval.pval = savepv(PL_tokenbuf);
3841             CLINE;
3842             TOKEN(LABEL);
3843         }
3844
3845         /* Check for keywords */
3846         tmp = keyword(PL_tokenbuf, len);
3847
3848         /* Is this a word before a => operator? */
3849         if (*d == '=' && d[1] == '>') {
3850             CLINE;
3851             yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(PL_tokenbuf,0));
3852             yylval.opval->op_private = OPpCONST_BARE;
3853             if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
3854               SvUTF8_on(((SVOP*)yylval.opval)->op_sv);
3855             TERM(WORD);
3856         }
3857
3858         if (tmp < 0) {                  /* second-class keyword? */
3859             GV *ogv = Nullgv;   /* override (winner) */
3860             GV *hgv = Nullgv;   /* hidden (loser) */
3861             if (PL_expect != XOPERATOR && (*s != ':' || s[1] != ':')) {
3862                 CV *cv;
3863                 if ((gv = gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVCV)) &&
3864                     (cv = GvCVu(gv)))
3865                 {
3866                     if (GvIMPORTED_CV(gv))
3867                         ogv = gv;
3868                     else if (! CvMETHOD(cv))
3869                         hgv = gv;
3870                 }
3871                 if (!ogv &&
3872                     (gvp = (GV**)hv_fetch(PL_globalstash,PL_tokenbuf,len,FALSE)) &&
3873                     (gv = *gvp) != (GV*)&PL_sv_undef &&
3874                     GvCVu(gv) && GvIMPORTED_CV(gv))
3875                 {
3876                     ogv = gv;
3877                 }
3878             }
3879             if (ogv) {
3880                 orig_keyword = tmp;
3881                 tmp = 0;                /* overridden by import or by GLOBAL */
3882             }
3883             else if (gv && !gvp
3884                      && -tmp==KEY_lock  /* XXX generalizable kludge */
3885                      && GvCVu(gv)
3886                      && !hv_fetch(GvHVn(PL_incgv), "Thread.pm", 9, FALSE))
3887             {
3888                 tmp = 0;                /* any sub overrides "weak" keyword */
3889             }
3890             else {                      /* no override */
3891                 tmp = -tmp;
3892                 if (tmp == KEY_dump && ckWARN(WARN_MISC)) {
3893                     Perl_warner(aTHX_ packWARN(WARN_MISC),
3894                             "dump() better written as CORE::dump()");
3895                 }
3896                 gv = Nullgv;
3897                 gvp = 0;
3898                 if (ckWARN(WARN_AMBIGUOUS) && hgv
3899                     && tmp != KEY_x && tmp != KEY_CORE) /* never ambiguous */
3900                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
3901                         "Ambiguous call resolved as CORE::%s(), %s",
3902                          GvENAME(hgv), "qualify as such or use &");
3903             }
3904         }
3905
3906       reserved_word:
3907         switch (tmp) {
3908
3909         default:                        /* not a keyword */
3910           just_a_word: {
3911                 SV *sv;
3912                 int pkgname = 0;
3913                 char lastchar = (PL_bufptr == PL_oldoldbufptr ? 0 : PL_bufptr[-1]);
3914
3915                 /* Get the rest if it looks like a package qualifier */
3916
3917                 if (*s == '\'' || (*s == ':' && s[1] == ':')) {
3918                     STRLEN morelen;
3919                     s = scan_word(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len,
3920                                   TRUE, &morelen);
3921                     if (!morelen)
3922                         Perl_croak(aTHX_ "Bad name after %s%s", PL_tokenbuf,
3923                                 *s == '\'' ? "'" : "::");
3924                     len += morelen;
3925                     pkgname = 1;
3926                 }
3927
3928                 if (PL_expect == XOPERATOR) {
3929                     if (PL_bufptr == PL_linestart) {
3930                         CopLINE_dec(PL_curcop);
3931                         Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), PL_warn_nosemi);
3932                         CopLINE_inc(PL_curcop);
3933                     }
3934                     else
3935                         no_op("Bareword",s);
3936                 }
3937
3938                 /* Look for a subroutine with this name in current package,
3939                    unless name is "Foo::", in which case Foo is a bearword
3940                    (and a package name). */
3941
3942                 if (len > 2 &&
3943                     PL_tokenbuf[len - 2] == ':' && PL_tokenbuf[len - 1] == ':')
3944                 {
3945                     if (ckWARN(WARN_BAREWORD) && ! gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVHV))
3946                         Perl_warner(aTHX_ packWARN(WARN_BAREWORD),
3947                             "Bareword \"%s\" refers to nonexistent package",
3948                              PL_tokenbuf);
3949                     len -= 2;
3950                     PL_tokenbuf[len] = '\0';
3951                     gv = Nullgv;
3952                     gvp = 0;
3953                 }
3954                 else {
3955                     len = 0;
3956                     if (!gv)
3957                         gv = gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVCV);
3958                 }
3959
3960                 /* if we saw a global override before, get the right name */
3961
3962                 if (gvp) {
3963                     sv = newSVpvn("CORE::GLOBAL::",14);
3964                     sv_catpv(sv,PL_tokenbuf);
3965                 }
3966                 else
3967                     sv = newSVpv(PL_tokenbuf,0);
3968
3969                 /* Presume this is going to be a bareword of some sort. */
3970
3971                 CLINE;
3972                 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
3973                 yylval.opval->op_private = OPpCONST_BARE;
3974                 /* UTF-8 package name? */
3975                 if (UTF && !IN_BYTES &&
3976                     is_utf8_string((U8*)SvPVX(sv), SvCUR(sv)))
3977                     SvUTF8_on(sv);
3978
3979                 /* And if "Foo::", then that's what it certainly is. */
3980
3981                 if (len)
3982                     goto safe_bareword;
3983
3984                 /* See if it's the indirect object for a list operator. */
3985
3986                 if (PL_oldoldbufptr &&
3987                     PL_oldoldbufptr < PL_bufptr &&
3988                     (PL_oldoldbufptr == PL_last_lop
3989                      || PL_oldoldbufptr == PL_last_uni) &&
3990                     /* NO SKIPSPACE BEFORE HERE! */
3991                     (PL_expect == XREF ||
3992                      ((PL_opargs[PL_last_lop_op] >> OASHIFT)& 7) == OA_FILEREF))
3993                 {
3994                     bool immediate_paren = *s == '(';
3995
3996                     /* (Now we can afford to cross potential line boundary.) */
3997                     s = skipspace(s);
3998
3999                     /* Two barewords in a row may indicate method call. */
4000
4001                     if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') && (tmp=intuit_method(s,gv)))
4002                         return tmp;
4003
4004                     /* If not a declared subroutine, it's an indirect object. */
4005                     /* (But it's an indir obj regardless for sort.) */
4006
4007                     if ( !immediate_paren && (PL_last_lop_op == OP_SORT ||
4008                          ((!gv || !GvCVu(gv)) &&
4009                         (PL_last_lop_op != OP_MAPSTART &&
4010                          PL_last_lop_op != OP_GREPSTART))))
4011                     {
4012                         PL_expect = (PL_last_lop == PL_oldoldbufptr) ? XTERM : XOPERATOR;
4013                         goto bareword;
4014                     }
4015                 }
4016
4017                 PL_expect = XOPERATOR;
4018                 s = skipspace(s);
4019
4020                 /* Is this a word before a => operator? */
4021                 if (*s == '=' && s[1] == '>' && !pkgname) {
4022                     CLINE;
4023                     sv_setpv(((SVOP*)yylval.opval)->op_sv, PL_tokenbuf);
4024                     if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
4025                       SvUTF8_on(((SVOP*)yylval.opval)->op_sv);
4026                     TERM(WORD);
4027                 }
4028
4029                 /* If followed by a paren, it's certainly a subroutine. */
4030                 if (*s == '(') {
4031                     CLINE;
4032                     if (gv && GvCVu(gv)) {
4033                         for (d = s + 1; SPACE_OR_TAB(*d); d++) ;
4034                         if (*d == ')' && (sv = cv_const_sv(GvCV(gv)))) {
4035                             s = d + 1;
4036                             goto its_constant;
4037                         }
4038                     }
4039                     PL_nextval[PL_nexttoke].opval = yylval.opval;
4040                     PL_expect = XOPERATOR;
4041                     force_next(WORD);
4042                     yylval.ival = 0;
4043                     TOKEN('&');
4044                 }
4045
4046                 /* If followed by var or block, call it a method (unless sub) */
4047
4048                 if ((*s == '$' || *s == '{') && (!gv || !GvCVu(gv))) {
4049                     PL_last_lop = PL_oldbufptr;
4050                     PL_last_lop_op = OP_METHOD;
4051                     PREBLOCK(METHOD);
4052                 }
4053
4054                 /* If followed by a bareword, see if it looks like indir obj. */
4055
4056                 if (!orig_keyword
4057                         && (isIDFIRST_lazy_if(s,UTF) || *s == '$')
4058                         && (tmp = intuit_method(s,gv)))
4059                     return tmp;
4060
4061                 /* Not a method, so call it a subroutine (if defined) */
4062
4063                 if (gv && GvCVu(gv)) {
4064                     CV* cv;
4065                     if (lastchar == '-' && ckWARN_d(WARN_AMBIGUOUS))
4066                         Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
4067                                 "Ambiguous use of -%s resolved as -&%s()",
4068                                 PL_tokenbuf, PL_tokenbuf);
4069                     /* Check for a constant sub */
4070                     cv = GvCV(gv);
4071                     if ((sv = cv_const_sv(cv))) {
4072                   its_constant:
4073                         SvREFCNT_dec(((SVOP*)yylval.opval)->op_sv);
4074                         ((SVOP*)yylval.opval)->op_sv = SvREFCNT_inc(sv);
4075                         yylval.opval->op_private = 0;
4076                         TOKEN(WORD);
4077                     }
4078
4079                     /* Resolve to GV now. */
4080                     op_free(yylval.opval);
4081                     yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
4082                     yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
4083                     PL_last_lop = PL_oldbufptr;
4084                     PL_last_lop_op = OP_ENTERSUB;
4085                     /* Is there a prototype? */
4086                     if (SvPOK(cv)) {
4087                         STRLEN len;
4088                         char *proto = SvPV((SV*)cv, len);
4089                         if (!len)
4090                             TERM(FUNC0SUB);
4091                         if (strEQ(proto, "$"))
4092                             OPERATOR(UNIOPSUB);
4093                         while (*proto == ';')
4094                             proto++;
4095                         if (*proto == '&' && *s == '{') {
4096                             sv_setpv(PL_subname, PL_curstash ? 
4097                                         "__ANON__" : "__ANON__::__ANON__");
4098                             PREBLOCK(LSTOPSUB);
4099                         }
4100                     }
4101                     PL_nextval[PL_nexttoke].opval = yylval.opval;
4102                     PL_expect = XTERM;
4103                     force_next(WORD);
4104                     TOKEN(NOAMP);
4105                 }
4106
4107                 /* Call it a bare word */
4108
4109                 if (PL_hints & HINT_STRICT_SUBS)
4110                     yylval.opval->op_private |= OPpCONST_STRICT;
4111                 else {
4112                 bareword:
4113                     if (ckWARN(WARN_RESERVED)) {
4114                         if (lastchar != '-') {
4115                             for (d = PL_tokenbuf; *d && isLOWER(*d); d++) ;
4116                             if (!*d && !gv_stashpv(PL_tokenbuf,FALSE))
4117                                 Perl_warner(aTHX_ packWARN(WARN_RESERVED), PL_warn_reserved,
4118                                        PL_tokenbuf);
4119                         }
4120                     }
4121                 }
4122
4123             safe_bareword:
4124                 if (lastchar && strchr("*%&", lastchar) && ckWARN_d(WARN_AMBIGUOUS)) {
4125                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
4126                         "Operator or semicolon missing before %c%s",
4127                         lastchar, PL_tokenbuf);
4128                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
4129                         "Ambiguous use of %c resolved as operator %c",
4130                         lastchar, lastchar);
4131                 }
4132                 TOKEN(WORD);
4133             }
4134
4135         case KEY___FILE__:
4136             yylval.opval = (OP*)newSVOP(OP_CONST, 0,
4137                                         newSVpv(CopFILE(PL_curcop),0));
4138             TERM(THING);
4139
4140         case KEY___LINE__:
4141             yylval.opval = (OP*)newSVOP(OP_CONST, 0,
4142                                     Perl_newSVpvf(aTHX_ "%"IVdf, (IV)CopLINE(PL_curcop)));
4143             TERM(THING);
4144
4145         case KEY___PACKAGE__:
4146             yylval.opval = (OP*)newSVOP(OP_CONST, 0,
4147                                         (PL_curstash
4148                                          ? newSVsv(PL_curstname)
4149                                          : &PL_sv_undef));
4150             TERM(THING);
4151
4152         case KEY___DATA__:
4153         case KEY___END__: {
4154             GV *gv;
4155
4156             /*SUPPRESS 560*/
4157             if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
4158                 char *pname = "main";
4159                 if (PL_tokenbuf[2] == 'D')
4160                     pname = HvNAME(PL_curstash ? PL_curstash : PL_defstash);
4161                 gv = gv_fetchpv(Perl_form(aTHX_ "%s::DATA", pname), TRUE, SVt_PVIO);
4162                 GvMULTI_on(gv);
4163                 if (!GvIO(gv))
4164                     GvIOp(gv) = newIO();
4165                 IoIFP(GvIOp(gv)) = PL_rsfp;
4166 #if defined(HAS_FCNTL) && defined(F_SETFD)
4167                 {
4168                     int fd = PerlIO_fileno(PL_rsfp);
4169                     fcntl(fd,F_SETFD,fd >= 3);
4170                 }
4171 #endif
4172                 /* Mark this internal pseudo-handle as clean */
4173                 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
4174                 if (PL_preprocess)
4175                     IoTYPE(GvIOp(gv)) = IoTYPE_PIPE;
4176                 else if ((PerlIO*)PL_rsfp == PerlIO_stdin())
4177                     IoTYPE(GvIOp(gv)) = IoTYPE_STD;
4178                 else
4179                     IoTYPE(GvIOp(gv)) = IoTYPE_RDONLY;
4180 #if defined(WIN32) && !defined(PERL_TEXTMODE_SCRIPTS)
4181                 /* if the script was opened in binmode, we need to revert
4182                  * it to text mode for compatibility; but only iff it has CRs
4183                  * XXX this is a questionable hack at best. */
4184                 if (PL_bufend-PL_bufptr > 2
4185                     && PL_bufend[-1] == '\n' && PL_bufend[-2] == '\r')
4186                 {
4187                     Off_t loc = 0;
4188                     if (IoTYPE(GvIOp(gv)) == IoTYPE_RDONLY) {
4189                         loc = PerlIO_tell(PL_rsfp);
4190                         (void)PerlIO_seek(PL_rsfp, 0L, 0);
4191                     }
4192 #ifdef NETWARE
4193                         if (PerlLIO_setmode(PL_rsfp, O_TEXT) != -1) {
4194 #else
4195                     if (PerlLIO_setmode(PerlIO_fileno(PL_rsfp), O_TEXT) != -1) {
4196 #endif  /* NETWARE */
4197 #ifdef PERLIO_IS_STDIO /* really? */
4198 #  if defined(__BORLANDC__)
4199                         /* XXX see note in do_binmode() */
4200                         ((FILE*)PL_rsfp)->flags &= ~_F_BIN;
4201 #  endif
4202 #endif
4203                         if (loc > 0)
4204                             PerlIO_seek(PL_rsfp, loc, 0);
4205                     }
4206                 }
4207 #endif
4208 #ifdef PERLIO_LAYERS
4209                 if (!IN_BYTES) {
4210                     if (UTF)
4211                         PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, ":utf8");
4212                     else if (PL_encoding) {
4213                         SV *name;
4214                         dSP;
4215                         ENTER;
4216                         SAVETMPS;
4217                         PUSHMARK(sp);
4218                         EXTEND(SP, 1);
4219                         XPUSHs(PL_encoding);
4220                         PUTBACK;
4221                         call_method("name", G_SCALAR);
4222                         SPAGAIN;
4223                         name = POPs;
4224                         PUTBACK;
4225                         PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, 
4226                                             Perl_form(aTHX_ ":encoding(%"SVf")",
4227                                                       name));
4228                         FREETMPS;
4229                         LEAVE;
4230                     }
4231                 }
4232 #endif
4233                 PL_rsfp = Nullfp;
4234             }
4235             goto fake_eof;
4236         }
4237
4238         case KEY_AUTOLOAD:
4239         case KEY_DESTROY:
4240         case KEY_BEGIN:
4241         case KEY_CHECK:
4242         case KEY_INIT:
4243         case KEY_END:
4244             if (PL_expect == XSTATE) {
4245                 s = PL_bufptr;
4246                 goto really_sub;
4247             }
4248             goto just_a_word;
4249
4250         case KEY_CORE:
4251             if (*s == ':' && s[1] == ':') {
4252                 s += 2;
4253                 d = s;
4254                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
4255                 if (!(tmp = keyword(PL_tokenbuf, len)))
4256                     Perl_croak(aTHX_ "CORE::%s is not a keyword", PL_tokenbuf);
4257                 if (tmp < 0)
4258                     tmp = -tmp;
4259                 goto reserved_word;
4260             }
4261             goto just_a_word;
4262
4263         case KEY_abs:
4264             UNI(OP_ABS);
4265
4266         case KEY_alarm:
4267             UNI(OP_ALARM);
4268
4269         case KEY_accept:
4270             LOP(OP_ACCEPT,XTERM);
4271
4272         case KEY_and:
4273             OPERATOR(ANDOP);
4274
4275         case KEY_atan2:
4276             LOP(OP_ATAN2,XTERM);
4277
4278         case KEY_bind:
4279             LOP(OP_BIND,XTERM);
4280
4281         case KEY_binmode:
4282             LOP(OP_BINMODE,XTERM);
4283
4284         case KEY_bless:
4285             LOP(OP_BLESS,XTERM);
4286
4287         case KEY_chop:
4288             UNI(OP_CHOP);
4289
4290         case KEY_continue:
4291             PREBLOCK(CONTINUE);
4292
4293         case KEY_chdir:
4294             (void)gv_fetchpv("ENV",TRUE, SVt_PVHV);     /* may use HOME */
4295             UNI(OP_CHDIR);
4296
4297         case KEY_close:
4298             UNI(OP_CLOSE);
4299
4300         case KEY_closedir:
4301             UNI(OP_CLOSEDIR);
4302
4303         case KEY_cmp:
4304             Eop(OP_SCMP);
4305
4306         case KEY_caller:
4307             UNI(OP_CALLER);
4308
4309         case KEY_crypt:
4310 #ifdef FCRYPT
4311             if (!PL_cryptseen) {
4312                 PL_cryptseen = TRUE;
4313                 init_des();
4314             }
4315 #endif
4316             LOP(OP_CRYPT,XTERM);
4317
4318         case KEY_chmod:
4319             LOP(OP_CHMOD,XTERM);
4320
4321         case KEY_chown:
4322             LOP(OP_CHOWN,XTERM);
4323
4324         case KEY_connect:
4325             LOP(OP_CONNECT,XTERM);
4326
4327         case KEY_chr:
4328             UNI(OP_CHR);
4329
4330         case KEY_cos:
4331             UNI(OP_COS);
4332
4333         case KEY_chroot:
4334             UNI(OP_CHROOT);
4335
4336         case KEY_do:
4337             s = skipspace(s);
4338             if (*s == '{')
4339                 PRETERMBLOCK(DO);
4340             if (*s != '\'')
4341                 s = force_word(s,WORD,TRUE,TRUE,FALSE);
4342             OPERATOR(DO);
4343
4344         case KEY_die:
4345             PL_hints |= HINT_BLOCK_SCOPE;
4346             LOP(OP_DIE,XTERM);
4347
4348         case KEY_defined:
4349             UNI(OP_DEFINED);
4350
4351         case KEY_delete:
4352             UNI(OP_DELETE);
4353
4354         case KEY_dbmopen:
4355             gv_fetchpv("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
4356             LOP(OP_DBMOPEN,XTERM);
4357
4358         case KEY_dbmclose:
4359             UNI(OP_DBMCLOSE);
4360
4361         case KEY_dump:
4362             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4363             LOOPX(OP_DUMP);
4364
4365         case KEY_else:
4366             PREBLOCK(ELSE);
4367
4368         case KEY_elsif:
4369             yylval.ival = CopLINE(PL_curcop);
4370             OPERATOR(ELSIF);
4371
4372         case KEY_eq:
4373             Eop(OP_SEQ);
4374
4375         case KEY_exists:
4376             UNI(OP_EXISTS);
4377         
4378         case KEY_exit:
4379             UNI(OP_EXIT);
4380
4381         case KEY_eval:
4382             s = skipspace(s);
4383             PL_expect = (*s == '{') ? XTERMBLOCK : XTERM;
4384             UNIBRACK(OP_ENTEREVAL);
4385
4386         case KEY_eof:
4387             UNI(OP_EOF);
4388
4389         case KEY_err:
4390             OPERATOR(DOROP);
4391
4392         case KEY_exp:
4393             UNI(OP_EXP);
4394
4395         case KEY_each:
4396             UNI(OP_EACH);
4397
4398         case KEY_exec:
4399             set_csh();
4400             LOP(OP_EXEC,XREF);
4401
4402         case KEY_endhostent:
4403             FUN0(OP_EHOSTENT);
4404
4405         case KEY_endnetent:
4406             FUN0(OP_ENETENT);
4407
4408         case KEY_endservent:
4409             FUN0(OP_ESERVENT);
4410
4411         case KEY_endprotoent:
4412             FUN0(OP_EPROTOENT);
4413
4414         case KEY_endpwent:
4415             FUN0(OP_EPWENT);
4416
4417         case KEY_endgrent:
4418             FUN0(OP_EGRENT);
4419
4420         case KEY_for:
4421         case KEY_foreach:
4422             yylval.ival = CopLINE(PL_curcop);
4423             s = skipspace(s);
4424             if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) {
4425                 char *p = s;
4426                 if ((PL_bufend - p) >= 3 &&
4427                     strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
4428                     p += 2;
4429                 else if ((PL_bufend - p) >= 4 &&
4430                     strnEQ(p, "our", 3) && isSPACE(*(p + 3)))
4431                     p += 3;
4432                 p = skipspace(p);
4433                 if (isIDFIRST_lazy_if(p,UTF)) {
4434                     p = scan_ident(p, PL_bufend,
4435                         PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
4436                     p = skipspace(p);
4437                 }
4438                 if (*p != '$')
4439                     Perl_croak(aTHX_ "Missing $ on loop variable");
4440             }
4441             OPERATOR(FOR);
4442
4443         case KEY_formline:
4444             LOP(OP_FORMLINE,XTERM);
4445
4446         case KEY_fork:
4447             FUN0(OP_FORK);
4448
4449         case KEY_fcntl:
4450             LOP(OP_FCNTL,XTERM);
4451
4452         case KEY_fileno:
4453             UNI(OP_FILENO);
4454
4455         case KEY_flock:
4456             LOP(OP_FLOCK,XTERM);
4457
4458         case KEY_gt:
4459             Rop(OP_SGT);
4460
4461         case KEY_ge:
4462             Rop(OP_SGE);
4463
4464         case KEY_grep:
4465             LOP(OP_GREPSTART, XREF);
4466
4467         case KEY_goto:
4468             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4469             LOOPX(OP_GOTO);
4470
4471         case KEY_gmtime:
4472             UNI(OP_GMTIME);
4473
4474         case KEY_getc:
4475             UNIDOR(OP_GETC);
4476
4477         case KEY_getppid:
4478             FUN0(OP_GETPPID);
4479
4480         case KEY_getpgrp:
4481             UNI(OP_GETPGRP);
4482
4483         case KEY_getpriority:
4484             LOP(OP_GETPRIORITY,XTERM);
4485
4486         case KEY_getprotobyname:
4487             UNI(OP_GPBYNAME);
4488
4489         case KEY_getprotobynumber:
4490             LOP(OP_GPBYNUMBER,XTERM);
4491
4492         case KEY_getprotoent:
4493             FUN0(OP_GPROTOENT);
4494
4495         case KEY_getpwent:
4496             FUN0(OP_GPWENT);
4497
4498         case KEY_getpwnam:
4499             UNI(OP_GPWNAM);
4500
4501         case KEY_getpwuid:
4502             UNI(OP_GPWUID);
4503
4504         case KEY_getpeername:
4505             UNI(OP_GETPEERNAME);
4506
4507         case KEY_gethostbyname:
4508             UNI(OP_GHBYNAME);
4509
4510         case KEY_gethostbyaddr:
4511             LOP(OP_GHBYADDR,XTERM);
4512
4513         case KEY_gethostent:
4514             FUN0(OP_GHOSTENT);
4515
4516         case KEY_getnetbyname:
4517             UNI(OP_GNBYNAME);
4518
4519         case KEY_getnetbyaddr:
4520             LOP(OP_GNBYADDR,XTERM);
4521
4522         case KEY_getnetent:
4523             FUN0(OP_GNETENT);
4524
4525         case KEY_getservbyname:
4526             LOP(OP_GSBYNAME,XTERM);
4527
4528         case KEY_getservbyport:
4529             LOP(OP_GSBYPORT,XTERM);
4530
4531         case KEY_getservent:
4532             FUN0(OP_GSERVENT);
4533
4534         case KEY_getsockname:
4535             UNI(OP_GETSOCKNAME);
4536
4537         case KEY_getsockopt:
4538             LOP(OP_GSOCKOPT,XTERM);
4539
4540         case KEY_getgrent:
4541             FUN0(OP_GGRENT);
4542
4543         case KEY_getgrnam:
4544             UNI(OP_GGRNAM);
4545
4546         case KEY_getgrgid:
4547             UNI(OP_GGRGID);
4548
4549         case KEY_getlogin:
4550             FUN0(OP_GETLOGIN);
4551
4552         case KEY_glob:
4553             set_csh();
4554             LOP(OP_GLOB,XTERM);
4555
4556         case KEY_hex:
4557             UNI(OP_HEX);
4558
4559         case KEY_if:
4560             yylval.ival = CopLINE(PL_curcop);
4561             OPERATOR(IF);
4562
4563         case KEY_index:
4564             LOP(OP_INDEX,XTERM);
4565
4566         case KEY_int:
4567             UNI(OP_INT);
4568
4569         case KEY_ioctl:
4570             LOP(OP_IOCTL,XTERM);
4571
4572         case KEY_join:
4573             LOP(OP_JOIN,XTERM);
4574
4575         case KEY_keys:
4576             UNI(OP_KEYS);
4577
4578         case KEY_kill:
4579             LOP(OP_KILL,XTERM);
4580
4581         case KEY_last:
4582             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4583             LOOPX(OP_LAST);
4584         
4585         case KEY_lc:
4586             UNI(OP_LC);
4587
4588         case KEY_lcfirst:
4589             UNI(OP_LCFIRST);
4590
4591         case KEY_local:
4592             yylval.ival = 0;
4593             OPERATOR(LOCAL);
4594
4595         case KEY_length:
4596             UNI(OP_LENGTH);
4597
4598         case KEY_lt:
4599             Rop(OP_SLT);
4600
4601         case KEY_le:
4602             Rop(OP_SLE);
4603
4604         case KEY_localtime:
4605             UNI(OP_LOCALTIME);
4606
4607         case KEY_log:
4608             UNI(OP_LOG);
4609
4610         case KEY_link:
4611             LOP(OP_LINK,XTERM);
4612
4613         case KEY_listen:
4614             LOP(OP_LISTEN,XTERM);
4615
4616         case KEY_lock:
4617             UNI(OP_LOCK);
4618
4619         case KEY_lstat:
4620             UNI(OP_LSTAT);
4621
4622         case KEY_m:
4623             s = scan_pat(s,OP_MATCH);
4624             TERM(sublex_start());
4625
4626         case KEY_map:
4627             LOP(OP_MAPSTART, XREF);
4628
4629         case KEY_mkdir:
4630             LOP(OP_MKDIR,XTERM);
4631
4632         case KEY_msgctl:
4633             LOP(OP_MSGCTL,XTERM);
4634
4635         case KEY_msgget:
4636             LOP(OP_MSGGET,XTERM);
4637
4638         case KEY_msgrcv:
4639             LOP(OP_MSGRCV,XTERM);
4640
4641         case KEY_msgsnd:
4642             LOP(OP_MSGSND,XTERM);
4643
4644         case KEY_our:
4645         case KEY_my:
4646             PL_in_my = tmp;
4647             s = skipspace(s);
4648             if (isIDFIRST_lazy_if(s,UTF)) {
4649                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
4650                 if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
4651                     goto really_sub;
4652                 PL_in_my_stash = find_in_my_stash(PL_tokenbuf, len);
4653                 if (!PL_in_my_stash) {
4654                     char tmpbuf[1024];
4655                     PL_bufptr = s;
4656                     sprintf(tmpbuf, "No such class %.1000s", PL_tokenbuf);
4657                     yyerror(tmpbuf);
4658                 }
4659             }
4660             yylval.ival = 1;
4661             OPERATOR(MY);
4662
4663         case KEY_next:
4664             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4665             LOOPX(OP_NEXT);
4666
4667         case KEY_ne:
4668             Eop(OP_SNE);
4669
4670         case KEY_no:
4671             if (PL_expect != XSTATE)
4672                 yyerror("\"no\" not allowed in expression");
4673             s = force_word(s,WORD,FALSE,TRUE,FALSE);
4674             s = force_version(s, FALSE);
4675             yylval.ival = 0;
4676             OPERATOR(USE);
4677
4678         case KEY_not:
4679             if (*s == '(' || (s = skipspace(s), *s == '('))
4680                 FUN1(OP_NOT);
4681             else
4682                 OPERATOR(NOTOP);
4683
4684         case KEY_open:
4685             s = skipspace(s);
4686             if (isIDFIRST_lazy_if(s,UTF)) {
4687                 char *t;
4688                 for (d = s; isALNUM_lazy_if(d,UTF); d++) ;
4689                 t = skipspace(d);
4690                 if (strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
4691                     /* [perl #16184] */
4692                     && !(t[0] == '=' && t[1] == '>')
4693                 ) {
4694                     Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE),
4695                            "Precedence problem: open %.*s should be open(%.*s)",
4696                             d - s, s, d - s, s);
4697                 }
4698             }
4699             LOP(OP_OPEN,XTERM);
4700
4701         case KEY_or:
4702             yylval.ival = OP_OR;
4703             OPERATOR(OROP);
4704
4705         case KEY_ord:
4706             UNI(OP_ORD);
4707
4708         case KEY_oct:
4709             UNI(OP_OCT);
4710
4711         case KEY_opendir:
4712             LOP(OP_OPEN_DIR,XTERM);
4713
4714         case KEY_print:
4715             checkcomma(s,PL_tokenbuf,"filehandle");
4716             LOP(OP_PRINT,XREF);
4717
4718         case KEY_printf:
4719             checkcomma(s,PL_tokenbuf,"filehandle");
4720             LOP(OP_PRTF,XREF);
4721
4722         case KEY_prototype:
4723             UNI(OP_PROTOTYPE);
4724
4725         case KEY_push:
4726             LOP(OP_PUSH,XTERM);
4727
4728         case KEY_pop:
4729             UNIDOR(OP_POP);
4730
4731         case KEY_pos:
4732             UNIDOR(OP_POS);
4733         
4734         case KEY_pack:
4735             LOP(OP_PACK,XTERM);
4736
4737         case KEY_package:
4738             s = force_word(s,WORD,FALSE,TRUE,FALSE);
4739             OPERATOR(PACKAGE);
4740
4741         case KEY_pipe:
4742             LOP(OP_PIPE_OP,XTERM);
4743
4744         case KEY_q:
4745             s = scan_str(s,FALSE,FALSE);
4746             if (!s)
4747                 missingterm((char*)0);
4748             yylval.ival = OP_CONST;
4749             TERM(sublex_start());
4750
4751         case KEY_quotemeta:
4752             UNI(OP_QUOTEMETA);
4753
4754         case KEY_qw:
4755             s = scan_str(s,FALSE,FALSE);
4756             if (!s)
4757                 missingterm((char*)0);
4758             force_next(')');
4759             if (SvCUR(PL_lex_stuff)) {
4760                 OP *words = Nullop;
4761                 int warned = 0;
4762                 d = SvPV_force(PL_lex_stuff, len);
4763                 while (len) {
4764                     SV *sv;
4765                     for (; isSPACE(*d) && len; --len, ++d) ;
4766                     if (len) {
4767                         char *b = d;
4768                         if (!warned && ckWARN(WARN_QW)) {
4769                             for (; !isSPACE(*d) && len; --len, ++d) {
4770                                 if (*d == ',') {
4771                                     Perl_warner(aTHX_ packWARN(WARN_QW),
4772                                         "Possible attempt to separate words with commas");
4773                                     ++warned;
4774                                 }
4775                                 else if (*d == '#') {
4776                                     Perl_warner(aTHX_ packWARN(WARN_QW),
4777                                         "Possible attempt to put comments in qw() list");
4778                                     ++warned;
4779                                 }
4780                             }
4781                         }
4782                         else {
4783                             for (; !isSPACE(*d) && len; --len, ++d) ;
4784                         }
4785                         sv = newSVpvn(b, d-b);
4786                         if (DO_UTF8(PL_lex_stuff))
4787                             SvUTF8_on(sv);
4788                         words = append_elem(OP_LIST, words,
4789                                             newSVOP(OP_CONST, 0, tokeq(sv)));
4790                     }
4791                 }
4792                 if (words) {
4793                     PL_nextval[PL_nexttoke].opval = words;
4794                     force_next(THING);
4795                 }
4796             }
4797             if (PL_lex_stuff) {
4798                 SvREFCNT_dec(PL_lex_stuff);
4799                 PL_lex_stuff = Nullsv;
4800             }
4801             PL_expect = XTERM;
4802             TOKEN('(');
4803
4804         case KEY_qq:
4805             s = scan_str(s,FALSE,FALSE);
4806             if (!s)
4807                 missingterm((char*)0);
4808             yylval.ival = OP_STRINGIFY;
4809             if (SvIVX(PL_lex_stuff) == '\'')
4810                 SvIVX(PL_lex_stuff) = 0;        /* qq'$foo' should intepolate */
4811             TERM(sublex_start());
4812
4813         case KEY_qr:
4814             s = scan_pat(s,OP_QR);
4815             TERM(sublex_start());
4816
4817         case KEY_qx:
4818             s = scan_str(s,FALSE,FALSE);
4819             if (!s)
4820                 missingterm((char*)0);
4821             yylval.ival = OP_BACKTICK;
4822             set_csh();
4823             TERM(sublex_start());
4824
4825         case KEY_return:
4826             OLDLOP(OP_RETURN);
4827
4828         case KEY_require:
4829             s = skipspace(s);
4830             if (isDIGIT(*s)) {
4831                 s = force_version(s, FALSE);
4832             }
4833             else if (*s != 'v' || !isDIGIT(s[1])
4834                     || (s = force_version(s, TRUE), *s == 'v'))
4835             {
4836                 *PL_tokenbuf = '\0';
4837                 s = force_word(s,WORD,TRUE,TRUE,FALSE);
4838                 if (isIDFIRST_lazy_if(PL_tokenbuf,UTF))
4839                     gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf), TRUE);
4840                 else if (*s == '<')
4841                     yyerror("<> should be quotes");
4842             }
4843             UNI(OP_REQUIRE);
4844
4845         case KEY_reset:
4846             UNI(OP_RESET);
4847
4848         case KEY_redo:
4849             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4850             LOOPX(OP_REDO);
4851
4852         case KEY_rename:
4853             LOP(OP_RENAME,XTERM);
4854
4855         case KEY_rand:
4856             UNI(OP_RAND);
4857
4858         case KEY_rmdir:
4859             UNI(OP_RMDIR);
4860
4861         case KEY_rindex:
4862             LOP(OP_RINDEX,XTERM);
4863
4864         case KEY_read:
4865             LOP(OP_READ,XTERM);
4866
4867         case KEY_readdir:
4868             UNI(OP_READDIR);
4869
4870         case KEY_readline:
4871             set_csh();
4872             UNIDOR(OP_READLINE);
4873
4874         case KEY_readpipe:
4875             set_csh();
4876             UNI(OP_BACKTICK);
4877
4878         case KEY_rewinddir:
4879             UNI(OP_REWINDDIR);
4880
4881         case KEY_recv:
4882             LOP(OP_RECV,XTERM);
4883
4884         case KEY_reverse:
4885             LOP(OP_REVERSE,XTERM);
4886
4887         case KEY_readlink:
4888             UNIDOR(OP_READLINK);
4889
4890         case KEY_ref:
4891             UNI(OP_REF);
4892
4893         case KEY_s:
4894             s = scan_subst(s);
4895             if (yylval.opval)
4896                 TERM(sublex_start());
4897             else
4898                 TOKEN(1);       /* force error */
4899
4900         case KEY_chomp:
4901             UNI(OP_CHOMP);
4902         
4903         case KEY_scalar:
4904             UNI(OP_SCALAR);
4905
4906         case KEY_select:
4907             LOP(OP_SELECT,XTERM);
4908
4909         case KEY_seek:
4910             LOP(OP_SEEK,XTERM);
4911
4912         case KEY_semctl:
4913             LOP(OP_SEMCTL,XTERM);
4914
4915         case KEY_semget:
4916             LOP(OP_SEMGET,XTERM);
4917
4918         case KEY_semop:
4919             LOP(OP_SEMOP,XTERM);
4920
4921         case KEY_send:
4922             LOP(OP_SEND,XTERM);
4923
4924         case KEY_setpgrp:
4925             LOP(OP_SETPGRP,XTERM);
4926
4927         case KEY_setpriority:
4928             LOP(OP_SETPRIORITY,XTERM);
4929
4930         case KEY_sethostent:
4931             UNI(OP_SHOSTENT);
4932
4933         case KEY_setnetent:
4934             UNI(OP_SNETENT);
4935
4936         case KEY_setservent:
4937             UNI(OP_SSERVENT);
4938
4939         case KEY_setprotoent:
4940             UNI(OP_SPROTOENT);
4941
4942         case KEY_setpwent:
4943             FUN0(OP_SPWENT);
4944
4945         case KEY_setgrent:
4946             FUN0(OP_SGRENT);
4947
4948         case KEY_seekdir:
4949             LOP(OP_SEEKDIR,XTERM);
4950
4951         case KEY_setsockopt:
4952             LOP(OP_SSOCKOPT,XTERM);
4953
4954         case KEY_shift:
4955             UNIDOR(OP_SHIFT);
4956
4957         case KEY_shmctl:
4958             LOP(OP_SHMCTL,XTERM);
4959
4960         case KEY_shmget:
4961             LOP(OP_SHMGET,XTERM);
4962
4963         case KEY_shmread:
4964             LOP(OP_SHMREAD,XTERM);
4965
4966         case KEY_shmwrite:
4967             LOP(OP_SHMWRITE,XTERM);
4968
4969         case KEY_shutdown:
4970             LOP(OP_SHUTDOWN,XTERM);
4971
4972         case KEY_sin:
4973             UNI(OP_SIN);
4974
4975         case KEY_sleep:
4976             UNI(OP_SLEEP);
4977
4978         case KEY_socket:
4979             LOP(OP_SOCKET,XTERM);
4980
4981         case KEY_socketpair:
4982             LOP(OP_SOCKPAIR,XTERM);
4983
4984         case KEY_sort:
4985             checkcomma(s,PL_tokenbuf,"subroutine name");
4986             s = skipspace(s);
4987             if (*s == ';' || *s == ')')         /* probably a close */
4988                 Perl_croak(aTHX_ "sort is now a reserved word");
4989             PL_expect = XTERM;
4990             s = force_word(s,WORD,TRUE,TRUE,FALSE);
4991             LOP(OP_SORT,XREF);
4992
4993         case KEY_split:
4994             LOP(OP_SPLIT,XTERM);
4995
4996         case KEY_sprintf:
4997             LOP(OP_SPRINTF,XTERM);
4998
4999         case KEY_splice:
5000             LOP(OP_SPLICE,XTERM);
5001
5002         case KEY_sqrt:
5003             UNI(OP_SQRT);
5004
5005         case KEY_srand:
5006             UNI(OP_SRAND);
5007
5008         case KEY_stat:
5009             UNI(OP_STAT);
5010
5011         case KEY_study:
5012             UNI(OP_STUDY);
5013
5014         case KEY_substr:
5015             LOP(OP_SUBSTR,XTERM);
5016
5017         case KEY_format:
5018         case KEY_sub:
5019           really_sub:
5020             {
5021                 char tmpbuf[sizeof PL_tokenbuf];
5022                 SSize_t tboffset = 0;
5023                 expectation attrful;
5024                 bool have_name, have_proto, bad_proto;
5025                 int key = tmp;
5026
5027                 s = skipspace(s);
5028
5029                 if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' ||
5030                     (*s == ':' && s[1] == ':'))
5031                 {
5032                     PL_expect = XBLOCK;
5033                     attrful = XATTRBLOCK;
5034                     /* remember buffer pos'n for later force_word */
5035                     tboffset = s - PL_oldbufptr;
5036                     d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
5037                     if (strchr(tmpbuf, ':'))
5038                         sv_setpv(PL_subname, tmpbuf);
5039                     else {
5040                         sv_setsv(PL_subname,PL_curstname);
5041                         sv_catpvn(PL_subname,"::",2);
5042                         sv_catpvn(PL_subname,tmpbuf,len);
5043                     }
5044                     s = skipspace(d);
5045                     have_name = TRUE;
5046                 }
5047                 else {
5048                     if (key == KEY_my)
5049                         Perl_croak(aTHX_ "Missing name in \"my sub\"");
5050                     PL_expect = XTERMBLOCK;
5051                     attrful = XATTRTERM;
5052                     sv_setpv(PL_subname,"?");
5053                     have_name = FALSE;
5054                 }
5055
5056                 if (key == KEY_format) {
5057                     if (*s == '=')
5058                         PL_lex_formbrack = PL_lex_brackets + 1;
5059                     if (have_name)
5060                         (void) force_word(PL_oldbufptr + tboffset, WORD,
5061                                           FALSE, TRUE, TRUE);
5062                     OPERATOR(FORMAT);
5063                 }
5064
5065                 /* Look for a prototype */
5066                 if (*s == '(') {
5067                     char *p;
5068
5069                     s = scan_str(s,FALSE,FALSE);
5070                     if (!s)
5071                         Perl_croak(aTHX_ "Prototype not terminated");
5072                     /* strip spaces and check for bad characters */
5073                     d = SvPVX(PL_lex_stuff);
5074                     tmp = 0;
5075                     bad_proto = FALSE;
5076                     for (p = d; *p; ++p) {
5077                         if (!isSPACE(*p)) {
5078                             d[tmp++] = *p;
5079                             if (!strchr("$@%*;[]&\\", *p))
5080                                 bad_proto = TRUE;
5081                         }
5082                     }
5083                     d[tmp] = '\0';
5084                     if (bad_proto && ckWARN(WARN_SYNTAX))
5085                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5086                                     "Illegal character in prototype for %"SVf" : %s",
5087                                     PL_subname, d);
5088                     SvCUR(PL_lex_stuff) = tmp;
5089                     have_proto = TRUE;
5090
5091                     s = skipspace(s);
5092                 }
5093                 else
5094                     have_proto = FALSE;
5095
5096                 if (*s == ':' && s[1] != ':')
5097                     PL_expect = attrful;
5098                 else if (!have_name && *s != '{' && key == KEY_sub)
5099                     Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine");
5100
5101                 if (have_proto) {
5102                     PL_nextval[PL_nexttoke].opval =
5103                         (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
5104                     PL_lex_stuff = Nullsv;
5105                     force_next(THING);
5106                 }
5107                 if (!have_name) {
5108                     sv_setpv(PL_subname,
5109                         PL_curstash ? "__ANON__" : "__ANON__::__ANON__");
5110                     TOKEN(ANONSUB);
5111                 }
5112                 (void) force_word(PL_oldbufptr + tboffset, WORD,
5113                                   FALSE, TRUE, TRUE);
5114                 if (key == KEY_my)
5115                     TOKEN(MYSUB);
5116                 TOKEN(SUB);
5117             }
5118
5119         case KEY_system:
5120             set_csh();
5121             LOP(OP_SYSTEM,XREF);
5122
5123         case KEY_symlink:
5124             LOP(OP_SYMLINK,XTERM);
5125
5126         case KEY_syscall:
5127             LOP(OP_SYSCALL,XTERM);
5128
5129         case KEY_sysopen:
5130             LOP(OP_SYSOPEN,XTERM);
5131
5132         case KEY_sysseek:
5133             LOP(OP_SYSSEEK,XTERM);
5134
5135         case KEY_sysread:
5136             LOP(OP_SYSREAD,XTERM);
5137
5138         case KEY_syswrite:
5139             LOP(OP_SYSWRITE,XTERM);
5140
5141         case KEY_tr:
5142             s = scan_trans(s);
5143             TERM(sublex_start());
5144
5145         case KEY_tell:
5146             UNI(OP_TELL);
5147
5148         case KEY_telldir:
5149             UNI(OP_TELLDIR);
5150
5151         case KEY_tie:
5152             LOP(OP_TIE,XTERM);
5153
5154         case KEY_tied:
5155             UNI(OP_TIED);
5156
5157         case KEY_time:
5158             FUN0(OP_TIME);
5159
5160         case KEY_times:
5161             FUN0(OP_TMS);
5162
5163         case KEY_truncate:
5164             LOP(OP_TRUNCATE,XTERM);
5165
5166         case KEY_uc:
5167             UNI(OP_UC);
5168
5169         case KEY_ucfirst:
5170             UNI(OP_UCFIRST);
5171
5172         case KEY_untie:
5173             UNI(OP_UNTIE);
5174
5175         case KEY_until:
5176             yylval.ival = CopLINE(PL_curcop);
5177             OPERATOR(UNTIL);
5178
5179         case KEY_unless:
5180             yylval.ival = CopLINE(PL_curcop);
5181             OPERATOR(UNLESS);
5182
5183         case KEY_unlink:
5184             LOP(OP_UNLINK,XTERM);
5185
5186         case KEY_undef:
5187             UNIDOR(OP_UNDEF);
5188
5189         case KEY_unpack:
5190             LOP(OP_UNPACK,XTERM);
5191
5192         case KEY_utime:
5193             LOP(OP_UTIME,XTERM);
5194
5195         case KEY_umask:
5196             UNIDOR(OP_UMASK);
5197
5198         case KEY_unshift:
5199             LOP(OP_UNSHIFT,XTERM);
5200
5201         case KEY_use:
5202             if (PL_expect != XSTATE)
5203                 yyerror("\"use\" not allowed in expression");
5204             s = skipspace(s);
5205             if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
5206                 s = force_version(s, TRUE);
5207                 if (*s == ';' || (s = skipspace(s), *s == ';')) {
5208                     PL_nextval[PL_nexttoke].opval = Nullop;
5209                     force_next(WORD);
5210                 }
5211                 else if (*s == 'v') {
5212                     s = force_word(s,WORD,FALSE,TRUE,FALSE);
5213                     s = force_version(s, FALSE);
5214                 }
5215             }
5216             else {
5217                 s = force_word(s,WORD,FALSE,TRUE,FALSE);
5218                 s = force_version(s, FALSE);
5219             }
5220             yylval.ival = 1;
5221             OPERATOR(USE);
5222
5223         case KEY_values:
5224             UNI(OP_VALUES);
5225
5226         case KEY_vec:
5227             LOP(OP_VEC,XTERM);
5228
5229         case KEY_while:
5230             yylval.ival = CopLINE(PL_curcop);
5231             OPERATOR(WHILE);
5232
5233         case KEY_warn:
5234             PL_hints |= HINT_BLOCK_SCOPE;
5235             LOP(OP_WARN,XTERM);
5236
5237         case KEY_wait:
5238             FUN0(OP_WAIT);
5239
5240         case KEY_waitpid:
5241             LOP(OP_WAITPID,XTERM);
5242
5243         case KEY_wantarray:
5244             FUN0(OP_WANTARRAY);
5245
5246         case KEY_write:
5247 #ifdef EBCDIC
5248         {
5249             char ctl_l[2];
5250             ctl_l[0] = toCTRL('L');
5251             ctl_l[1] = '\0';
5252             gv_fetchpv(ctl_l,TRUE, SVt_PV);
5253         }
5254 #else
5255             gv_fetchpv("\f",TRUE, SVt_PV);      /* Make sure $^L is defined */
5256 #endif
5257             UNI(OP_ENTERWRITE);
5258
5259         case KEY_x:
5260             if (PL_expect == XOPERATOR)
5261                 Mop(OP_REPEAT);
5262             check_uni();
5263             goto just_a_word;
5264
5265         case KEY_xor:
5266             yylval.ival = OP_XOR;
5267             OPERATOR(OROP);
5268
5269         case KEY_y:
5270             s = scan_trans(s);
5271             TERM(sublex_start());
5272         }
5273     }}
5274 }
5275 #ifdef __SC__
5276 #pragma segment Main
5277 #endif
5278
5279 static int
5280 S_pending_ident(pTHX)
5281 {
5282     register char *d;
5283     register I32 tmp = 0;
5284     /* pit holds the identifier we read and pending_ident is reset */
5285     char pit = PL_pending_ident;
5286     PL_pending_ident = 0;
5287
5288     DEBUG_T({ PerlIO_printf(Perl_debug_log,
5289           "### Tokener saw identifier '%s'\n", PL_tokenbuf); });
5290
5291     /* if we're in a my(), we can't allow dynamics here.
5292        $foo'bar has already been turned into $foo::bar, so
5293        just check for colons.
5294
5295        if it's a legal name, the OP is a PADANY.
5296     */
5297     if (PL_in_my) {
5298         if (PL_in_my == KEY_our) {      /* "our" is merely analogous to "my" */
5299             if (strchr(PL_tokenbuf,':'))
5300                 yyerror(Perl_form(aTHX_ "No package name allowed for "
5301                                   "variable %s in \"our\"",
5302                                   PL_tokenbuf));
5303             tmp = allocmy(PL_tokenbuf);
5304         }
5305         else {
5306             if (strchr(PL_tokenbuf,':'))
5307                 yyerror(Perl_form(aTHX_ PL_no_myglob,PL_tokenbuf));
5308
5309             yylval.opval = newOP(OP_PADANY, 0);
5310             yylval.opval->op_targ = allocmy(PL_tokenbuf);
5311             return PRIVATEREF;
5312         }
5313     }
5314
5315     /*
5316        build the ops for accesses to a my() variable.
5317
5318        Deny my($a) or my($b) in a sort block, *if* $a or $b is
5319        then used in a comparison.  This catches most, but not
5320        all cases.  For instance, it catches
5321            sort { my($a); $a <=> $b }
5322        but not
5323            sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
5324        (although why you'd do that is anyone's guess).
5325     */
5326
5327     if (!strchr(PL_tokenbuf,':')) {
5328         if (!PL_in_my)
5329             tmp = pad_findmy(PL_tokenbuf);
5330         if (tmp != NOT_IN_PAD) {
5331             /* might be an "our" variable" */
5332             if (PAD_COMPNAME_FLAGS(tmp) & SVpad_OUR) {
5333                 /* build ops for a bareword */
5334                 SV *sym = newSVpv(HvNAME(PAD_COMPNAME_OURSTASH(tmp)), 0);
5335                 sv_catpvn(sym, "::", 2);
5336                 sv_catpv(sym, PL_tokenbuf+1);
5337                 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
5338                 yylval.opval->op_private = OPpCONST_ENTERED;
5339                 gv_fetchpv(SvPVX(sym),
5340                     (PL_in_eval
5341                         ? (GV_ADDMULTI | GV_ADDINEVAL)
5342                         : GV_ADDMULTI
5343                     ),
5344                     ((PL_tokenbuf[0] == '$') ? SVt_PV
5345                      : (PL_tokenbuf[0] == '@') ? SVt_PVAV
5346                      : SVt_PVHV));
5347                 return WORD;
5348             }
5349
5350             /* if it's a sort block and they're naming $a or $b */
5351             if (PL_last_lop_op == OP_SORT &&
5352                 PL_tokenbuf[0] == '$' &&
5353                 (PL_tokenbuf[1] == 'a' || PL_tokenbuf[1] == 'b')
5354                 && !PL_tokenbuf[2])
5355             {
5356                 for (d = PL_in_eval ? PL_oldoldbufptr : PL_linestart;
5357                      d < PL_bufend && *d != '\n';
5358                      d++)
5359                 {
5360                     if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
5361                         Perl_croak(aTHX_ "Can't use \"my %s\" in sort comparison",
5362                               PL_tokenbuf);
5363                     }
5364                 }
5365             }
5366
5367             yylval.opval = newOP(OP_PADANY, 0);
5368             yylval.opval->op_targ = tmp;
5369             return PRIVATEREF;
5370         }
5371     }
5372
5373     /*
5374        Whine if they've said @foo in a doublequoted string,
5375        and @foo isn't a variable we can find in the symbol
5376        table.
5377     */
5378     if (pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
5379         GV *gv = gv_fetchpv(PL_tokenbuf+1, FALSE, SVt_PVAV);
5380         if ((!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
5381              && ckWARN(WARN_AMBIGUOUS))
5382         {
5383             /* Downgraded from fatal to warning 20000522 mjd */
5384             Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
5385                         "Possible unintended interpolation of %s in string",
5386                          PL_tokenbuf);
5387         }
5388     }
5389
5390     /* build ops for a bareword */
5391     yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(PL_tokenbuf+1, 0));
5392     yylval.opval->op_private = OPpCONST_ENTERED;
5393     gv_fetchpv(PL_tokenbuf+1, PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : TRUE,
5394                ((PL_tokenbuf[0] == '$') ? SVt_PV
5395                 : (PL_tokenbuf[0] == '@') ? SVt_PVAV
5396                 : SVt_PVHV));
5397     return WORD;
5398 }
5399
5400 I32
5401 Perl_keyword(pTHX_ register char *d, I32 len)
5402 {
5403     switch (*d) {
5404     case '_':
5405         if (d[1] == '_') {
5406             if (strEQ(d,"__FILE__"))            return -KEY___FILE__;
5407             if (strEQ(d,"__LINE__"))            return -KEY___LINE__;
5408             if (strEQ(d,"__PACKAGE__"))         return -KEY___PACKAGE__;
5409             if (strEQ(d,"__DATA__"))            return KEY___DATA__;
5410             if (strEQ(d,"__END__"))             return KEY___END__;
5411         }
5412         break;
5413     case 'A':
5414         if (strEQ(d,"AUTOLOAD"))                return KEY_AUTOLOAD;
5415         break;
5416     case 'a':
5417         switch (len) {
5418         case 3:
5419             if (strEQ(d,"and"))                 return -KEY_and;
5420             if (strEQ(d,"abs"))                 return -KEY_abs;
5421             break;
5422         case 5:
5423             if (strEQ(d,"alarm"))               return -KEY_alarm;
5424             if (strEQ(d,"atan2"))               return -KEY_atan2;
5425             break;
5426         case 6:
5427             if (strEQ(d,"accept"))              return -KEY_accept;
5428             break;
5429         }
5430         break;
5431     case 'B':
5432         if (strEQ(d,"BEGIN"))                   return KEY_BEGIN;
5433         break;
5434     case 'b':
5435         if (strEQ(d,"bless"))                   return -KEY_bless;
5436         if (strEQ(d,"bind"))                    return -KEY_bind;
5437         if (strEQ(d,"binmode"))                 return -KEY_binmode;
5438         break;
5439     case 'C':
5440         if (strEQ(d,"CORE"))                    return -KEY_CORE;
5441         if (strEQ(d,"CHECK"))                   return KEY_CHECK;
5442         break;
5443     case 'c':
5444         switch (len) {
5445         case 3:
5446             if (strEQ(d,"cmp"))                 return -KEY_cmp;
5447             if (strEQ(d,"chr"))                 return -KEY_chr;
5448             if (strEQ(d,"cos"))                 return -KEY_cos;
5449             break;
5450         case 4:
5451             if (strEQ(d,"chop"))                return -KEY_chop;
5452             break;
5453         case 5:
5454             if (strEQ(d,"close"))               return -KEY_close;
5455             if (strEQ(d,"chdir"))               return -KEY_chdir;
5456             if (strEQ(d,"chomp"))               return -KEY_chomp;
5457             if (strEQ(d,"chmod"))               return -KEY_chmod;
5458             if (strEQ(d,"chown"))               return -KEY_chown;
5459             if (strEQ(d,"crypt"))               return -KEY_crypt;
5460             break;
5461         case 6:
5462             if (strEQ(d,"chroot"))              return -KEY_chroot;
5463             if (strEQ(d,"caller"))              return -KEY_caller;
5464             break;
5465         case 7:
5466             if (strEQ(d,"connect"))             return -KEY_connect;
5467             break;
5468         case 8:
5469             if (strEQ(d,"closedir"))            return -KEY_closedir;
5470             if (strEQ(d,"continue"))            return -KEY_continue;
5471             break;
5472         }
5473         break;
5474     case 'D':
5475         if (strEQ(d,"DESTROY"))                 return KEY_DESTROY;
5476         break;
5477     case 'd':
5478         switch (len) {
5479         case 2:
5480             if (strEQ(d,"do"))                  return KEY_do;
5481             break;
5482         case 3:
5483             if (strEQ(d,"die"))                 return -KEY_die;
5484             break;
5485         case 4:
5486             if (strEQ(d,"dump"))                return -KEY_dump;
5487             break;
5488         case 6:
5489             if (strEQ(d,"delete"))              return KEY_delete;
5490             break;
5491         case 7:
5492             if (strEQ(d,"defined"))             return KEY_defined;
5493             if (strEQ(d,"dbmopen"))             return -KEY_dbmopen;
5494             break;
5495         case 8:
5496             if (strEQ(d,"dbmclose"))            return -KEY_dbmclose;
5497             break;
5498         }
5499         break;
5500     case 'E':
5501         if (strEQ(d,"END"))                     return KEY_END;
5502         break;
5503     case 'e':
5504         switch (len) {
5505         case 2:
5506             if (strEQ(d,"eq"))                  return -KEY_eq;
5507             break;
5508         case 3:
5509             if (strEQ(d,"eof"))                 return -KEY_eof;
5510             if (strEQ(d,"err"))                 return -KEY_err;
5511             if (strEQ(d,"exp"))                 return -KEY_exp;
5512             break;
5513         case 4:
5514             if (strEQ(d,"else"))                return KEY_else;
5515             if (strEQ(d,"exit"))                return -KEY_exit;
5516             if (strEQ(d,"eval"))                return KEY_eval;
5517             if (strEQ(d,"exec"))                return -KEY_exec;
5518            if (strEQ(d,"each"))                return -KEY_each;
5519             break;
5520         case 5:
5521             if (strEQ(d,"elsif"))               return KEY_elsif;
5522             break;
5523         case 6:
5524             if (strEQ(d,"exists"))              return KEY_exists;
5525             if (strEQ(d,"elseif")) Perl_warn(aTHX_ "elseif should be elsif");
5526             break;
5527         case 8:
5528             if (strEQ(d,"endgrent"))            return -KEY_endgrent;
5529             if (strEQ(d,"endpwent"))            return -KEY_endpwent;
5530             break;
5531         case 9:
5532             if (strEQ(d,"endnetent"))           return -KEY_endnetent;
5533             break;
5534         case 10:
5535             if (strEQ(d,"endhostent"))          return -KEY_endhostent;
5536             if (strEQ(d,"endservent"))          return -KEY_endservent;
5537             break;
5538         case 11:
5539             if (strEQ(d,"endprotoent"))         return -KEY_endprotoent;
5540             break;
5541         }
5542         break;
5543     case 'f':
5544         switch (len) {
5545         case 3:
5546             if (strEQ(d,"for"))                 return KEY_for;
5547             break;
5548         case 4:
5549             if (strEQ(d,"fork"))                return -KEY_fork;
5550             break;
5551         case 5:
5552             if (strEQ(d,"fcntl"))               return -KEY_fcntl;
5553             if (strEQ(d,"flock"))               return -KEY_flock;
5554             break;
5555         case 6:
5556             if (strEQ(d,"format"))              return KEY_format;
5557             if (strEQ(d,"fileno"))              return -KEY_fileno;
5558             break;
5559         case 7:
5560             if (strEQ(d,"foreach"))             return KEY_foreach;
5561             break;
5562         case 8:
5563             if (strEQ(d,"formline"))            return -KEY_formline;
5564             break;
5565         }
5566         break;
5567     case 'g':
5568         if (strnEQ(d,"get",3)) {
5569             d += 3;
5570             if (*d == 'p') {
5571                 switch (len) {
5572                 case 7:
5573                     if (strEQ(d,"ppid"))        return -KEY_getppid;
5574                     if (strEQ(d,"pgrp"))        return -KEY_getpgrp;
5575                     break;
5576                 case 8:
5577                     if (strEQ(d,"pwent"))       return -KEY_getpwent;
5578                     if (strEQ(d,"pwnam"))       return -KEY_getpwnam;
5579                     if (strEQ(d,"pwuid"))       return -KEY_getpwuid;
5580                     break;
5581                 case 11:
5582                     if (strEQ(d,"peername"))    return -KEY_getpeername;
5583                     if (strEQ(d,"protoent"))    return -KEY_getprotoent;
5584                     if (strEQ(d,"priority"))    return -KEY_getpriority;
5585                     break;
5586                 case 14:
5587                     if (strEQ(d,"protobyname")) return -KEY_getprotobyname;
5588                     break;
5589                 case 16:
5590                     if (strEQ(d,"protobynumber"))return -KEY_getprotobynumber;
5591                     break;
5592                 }
5593             }
5594             else if (*d == 'h') {
5595                 if (strEQ(d,"hostbyname"))      return -KEY_gethostbyname;
5596                 if (strEQ(d,"hostbyaddr"))      return -KEY_gethostbyaddr;
5597                 if (strEQ(d,"hostent"))         return -KEY_gethostent;
5598             }
5599             else if (*d == 'n') {
5600                 if (strEQ(d,"netbyname"))       return -KEY_getnetbyname;
5601                 if (strEQ(d,"netbyaddr"))       return -KEY_getnetbyaddr;
5602                 if (strEQ(d,"netent"))          return -KEY_getnetent;
5603             }
5604             else if (*d == 's') {
5605                 if (strEQ(d,"servbyname"))      return -KEY_getservbyname;
5606                 if (strEQ(d,"servbyport"))      return -KEY_getservbyport;
5607                 if (strEQ(d,"servent"))         return -KEY_getservent;
5608                 if (strEQ(d,"sockname"))        return -KEY_getsockname;
5609                 if (strEQ(d,"sockopt"))         return -KEY_getsockopt;
5610             }
5611             else if (*d == 'g') {
5612                 if (strEQ(d,"grent"))           return -KEY_getgrent;
5613                 if (strEQ(d,"grnam"))           return -KEY_getgrnam;
5614                 if (strEQ(d,"grgid"))           return -KEY_getgrgid;
5615             }
5616             else if (*d == 'l') {
5617                 if (strEQ(d,"login"))           return -KEY_getlogin;
5618             }
5619             else if (strEQ(d,"c"))              return -KEY_getc;
5620             break;
5621         }
5622         switch (len) {
5623         case 2:
5624             if (strEQ(d,"gt"))                  return -KEY_gt;
5625             if (strEQ(d,"ge"))                  return -KEY_ge;
5626             break;
5627         case 4:
5628             if (strEQ(d,"grep"))                return KEY_grep;
5629             if (strEQ(d,"goto"))                return KEY_goto;
5630             if (strEQ(d,"glob"))                return KEY_glob;
5631             break;
5632         case 6:
5633             if (strEQ(d,"gmtime"))              return -KEY_gmtime;
5634             break;
5635         }
5636         break;
5637     case 'h':
5638         if (strEQ(d,"hex"))                     return -KEY_hex;
5639         break;
5640     case 'I':
5641         if (strEQ(d,"INIT"))                    return KEY_INIT;
5642         break;
5643     case 'i':
5644         switch (len) {
5645         case 2:
5646             if (strEQ(d,"if"))                  return KEY_if;
5647             break;
5648         case 3:
5649             if (strEQ(d,"int"))                 return -KEY_int;
5650             break;
5651         case 5:
5652             if (strEQ(d,"index"))               return -KEY_index;
5653             if (strEQ(d,"ioctl"))               return -KEY_ioctl;
5654             break;
5655         }
5656         break;
5657     case 'j':
5658         if (strEQ(d,"join"))                    return -KEY_join;
5659         break;
5660     case 'k':
5661         if (len == 4) {
5662            if (strEQ(d,"keys"))                return -KEY_keys;
5663             if (strEQ(d,"kill"))                return -KEY_kill;
5664         }
5665         break;
5666     case 'l':
5667         switch (len) {
5668         case 2:
5669             if (strEQ(d,"lt"))                  return -KEY_lt;
5670             if (strEQ(d,"le"))                  return -KEY_le;
5671             if (strEQ(d,"lc"))                  return -KEY_lc;
5672             break;
5673         case 3:
5674             if (strEQ(d,"log"))                 return -KEY_log;
5675             break;
5676         case 4:
5677             if (strEQ(d,"last"))                return KEY_last;
5678             if (strEQ(d,"link"))                return -KEY_link;
5679             if (strEQ(d,"lock"))                return -KEY_lock;
5680             break;
5681         case 5:
5682             if (strEQ(d,"local"))               return KEY_local;
5683             if (strEQ(d,"lstat"))               return -KEY_lstat;
5684             break;
5685         case 6:
5686             if (strEQ(d,"length"))              return -KEY_length;
5687             if (strEQ(d,"listen"))              return -KEY_listen;
5688             break;
5689         case 7:
5690             if (strEQ(d,"lcfirst"))             return -KEY_lcfirst;
5691             break;
5692         case 9:
5693             if (strEQ(d,"localtime"))           return -KEY_localtime;
5694             break;
5695         }
5696         break;
5697     case 'm':
5698         switch (len) {
5699         case 1:                                 return KEY_m;
5700         case 2:
5701             if (strEQ(d,"my"))                  return KEY_my;
5702             break;
5703         case 3:
5704             if (strEQ(d,"map"))                 return KEY_map;
5705             break;
5706         case 5:
5707             if (strEQ(d,"mkdir"))               return -KEY_mkdir;
5708             break;
5709         case 6:
5710             if (strEQ(d,"msgctl"))              return -KEY_msgctl;
5711             if (strEQ(d,"msgget"))              return -KEY_msgget;
5712             if (strEQ(d,"msgrcv"))              return -KEY_msgrcv;
5713             if (strEQ(d,"msgsnd"))              return -KEY_msgsnd;
5714             break;
5715         }
5716         break;
5717     case 'n':
5718         if (strEQ(d,"next"))                    return KEY_next;
5719         if (strEQ(d,"ne"))                      return -KEY_ne;
5720         if (strEQ(d,"not"))                     return -KEY_not;
5721         if (strEQ(d,"no"))                      return KEY_no;
5722         break;
5723     case 'o':
5724         switch (len) {
5725         case 2:
5726             if (strEQ(d,"or"))                  return -KEY_or;
5727             break;
5728         case 3:
5729             if (strEQ(d,"ord"))                 return -KEY_ord;
5730             if (strEQ(d,"oct"))                 return -KEY_oct;
5731             if (strEQ(d,"our"))                 return KEY_our;
5732             break;
5733         case 4:
5734             if (strEQ(d,"open"))                return -KEY_open;
5735             break;
5736         case 7:
5737             if (strEQ(d,"opendir"))             return -KEY_opendir;
5738             break;
5739         }
5740         break;
5741     case 'p':
5742         switch (len) {
5743         case 3:
5744            if (strEQ(d,"pop"))                 return -KEY_pop;
5745             if (strEQ(d,"pos"))                 return KEY_pos;
5746             break;
5747         case 4:
5748            if (strEQ(d,"push"))                return -KEY_push;
5749             if (strEQ(d,"pack"))                return -KEY_pack;
5750             if (strEQ(d,"pipe"))                return -KEY_pipe;
5751             break;
5752         case 5:
5753             if (strEQ(d,"print"))               return KEY_print;
5754             break;
5755         case 6:
5756             if (strEQ(d,"printf"))              return KEY_printf;
5757             break;
5758         case 7:
5759             if (strEQ(d,"package"))             return KEY_package;
5760             break;
5761         case 9:
5762             if (strEQ(d,"prototype"))           return KEY_prototype;
5763         }
5764         break;
5765     case 'q':
5766         if (len <= 2) {
5767             if (strEQ(d,"q"))                   return KEY_q;
5768             if (strEQ(d,"qr"))                  return KEY_qr;
5769             if (strEQ(d,"qq"))                  return KEY_qq;
5770             if (strEQ(d,"qw"))                  return KEY_qw;
5771             if (strEQ(d,"qx"))                  return KEY_qx;
5772         }
5773         else if (strEQ(d,"quotemeta"))          return -KEY_quotemeta;
5774         break;
5775     case 'r':
5776         switch (len) {
5777         case 3:
5778             if (strEQ(d,"ref"))                 return -KEY_ref;
5779             break;
5780         case 4:
5781             if (strEQ(d,"read"))                return -KEY_read;
5782             if (strEQ(d,"rand"))                return -KEY_rand;
5783             if (strEQ(d,"recv"))                return -KEY_recv;
5784             if (strEQ(d,"redo"))                return KEY_redo;
5785             break;
5786         case 5:
5787             if (strEQ(d,"rmdir"))               return -KEY_rmdir;
5788             if (strEQ(d,"reset"))               return -KEY_reset;
5789             break;
5790         case 6:
5791             if (strEQ(d,"return"))              return KEY_return;
5792             if (strEQ(d,"rename"))              return -KEY_rename;
5793             if (strEQ(d,"rindex"))              return -KEY_rindex;
5794             break;
5795         case 7:
5796             if (strEQ(d,"require"))             return KEY_require;
5797             if (strEQ(d,"reverse"))             return -KEY_reverse;
5798             if (strEQ(d,"readdir"))             return -KEY_readdir;
5799             break;
5800         case 8:
5801             if (strEQ(d,"readlink"))            return -KEY_readlink;
5802             if (strEQ(d,"readline"))            return -KEY_readline;
5803             if (strEQ(d,"readpipe"))            return -KEY_readpipe;
5804             break;
5805         case 9:
5806             if (strEQ(d,"rewinddir"))           return -KEY_rewinddir;
5807             break;
5808         }
5809         break;
5810     case 's':
5811         switch (d[1]) {
5812         case 0:                                 return KEY_s;
5813         case 'c':
5814             if (strEQ(d,"scalar"))              return KEY_scalar;
5815             break;
5816         case 'e':
5817             switch (len) {
5818             case 4:
5819                 if (strEQ(d,"seek"))            return -KEY_seek;
5820                 if (strEQ(d,"send"))            return -KEY_send;
5821                 break;
5822             case 5:
5823                 if (strEQ(d,"semop"))           return -KEY_semop;
5824                 break;
5825             case 6:
5826                 if (strEQ(d,"select"))          return -KEY_select;
5827                 if (strEQ(d,"semctl"))          return -KEY_semctl;
5828                 if (strEQ(d,"semget"))          return -KEY_semget;
5829                 break;
5830             case 7:
5831                 if (strEQ(d,"setpgrp"))         return -KEY_setpgrp;
5832                 if (strEQ(d,"seekdir"))         return -KEY_seekdir;
5833                 break;
5834             case 8:
5835                 if (strEQ(d,"setpwent"))        return -KEY_setpwent;
5836                 if (strEQ(d,"setgrent"))        return -KEY_setgrent;
5837                 break;
5838             case 9:
5839                 if (strEQ(d,"setnetent"))       return -KEY_setnetent;
5840                 break;
5841             case 10:
5842                 if (strEQ(d,"setsockopt"))      return -KEY_setsockopt;
5843                 if (strEQ(d,"sethostent"))      return -KEY_sethostent;
5844                 if (strEQ(d,"setservent"))      return -KEY_setservent;
5845                 break;
5846             case 11:
5847                 if (strEQ(d,"setpriority"))     return -KEY_setpriority;
5848                 if (strEQ(d,"setprotoent"))     return -KEY_setprotoent;
5849                 break;
5850             }
5851             break;
5852         case 'h':
5853             switch (len) {
5854             case 5:
5855                if (strEQ(d,"shift"))           return -KEY_shift;
5856                 break;
5857             case 6:
5858                 if (strEQ(d,"shmctl"))          return -KEY_shmctl;
5859                 if (strEQ(d,"shmget"))          return -KEY_shmget;
5860                 break;
5861             case 7:
5862                 if (strEQ(d,"shmread"))         return -KEY_shmread;
5863                 break;
5864             case 8:
5865                 if (strEQ(d,"shmwrite"))        return -KEY_shmwrite;
5866                 if (strEQ(d,"shutdown"))        return -KEY_shutdown;
5867                 break;
5868             }
5869             break;
5870         case 'i':
5871             if (strEQ(d,"sin"))                 return -KEY_sin;
5872             break;
5873         case 'l':
5874             if (strEQ(d,"sleep"))               return -KEY_sleep;
5875             break;
5876         case 'o':
5877             if (strEQ(d,"sort"))                return KEY_sort;
5878             if (strEQ(d,"socket"))              return -KEY_socket;
5879             if (strEQ(d,"socketpair"))          return -KEY_socketpair;
5880             break;
5881         case 'p':
5882             if (strEQ(d,"split"))               return KEY_split;
5883             if (strEQ(d,"sprintf"))             return -KEY_sprintf;
5884            if (strEQ(d,"splice"))              return -KEY_splice;
5885             break;
5886         case 'q':
5887             if (strEQ(d,"sqrt"))                return -KEY_sqrt;
5888             break;
5889         case 'r':
5890             if (strEQ(d,"srand"))               return -KEY_srand;
5891             break;
5892         case 't':
5893             if (strEQ(d,"stat"))                return -KEY_stat;
5894             if (strEQ(d,"study"))               return KEY_study;
5895             break;
5896         case 'u':
5897             if (strEQ(d,"substr"))              return -KEY_substr;
5898             if (strEQ(d,"sub"))                 return KEY_sub;
5899             break;
5900         case 'y':
5901             switch (len) {
5902             case 6:
5903                 if (strEQ(d,"system"))          return -KEY_system;
5904                 break;
5905             case 7:
5906                 if (strEQ(d,"symlink"))         return -KEY_symlink;
5907                 if (strEQ(d,"syscall"))         return -KEY_syscall;
5908                 if (strEQ(d,"sysopen"))         return -KEY_sysopen;
5909                 if (strEQ(d,"sysread"))         return -KEY_sysread;
5910                 if (strEQ(d,"sysseek"))         return -KEY_sysseek;
5911                 break;
5912             case 8:
5913                 if (strEQ(d,"syswrite"))        return -KEY_syswrite;
5914                 break;
5915             }
5916             break;
5917         }
5918         break;
5919     case 't':
5920         switch (len) {
5921         case 2:
5922             if (strEQ(d,"tr"))                  return KEY_tr;
5923             break;
5924         case 3:
5925             if (strEQ(d,"tie"))                 return KEY_tie;
5926             break;
5927         case 4:
5928             if (strEQ(d,"tell"))                return -KEY_tell;
5929             if (strEQ(d,"tied"))                return KEY_tied;
5930             if (strEQ(d,"time"))                return -KEY_time;
5931             break;
5932         case 5:
5933             if (strEQ(d,"times"))               return -KEY_times;
5934             break;
5935         case 7:
5936             if (strEQ(d,"telldir"))             return -KEY_telldir;
5937             break;
5938         case 8:
5939             if (strEQ(d,"truncate"))            return -KEY_truncate;
5940             break;
5941         }
5942         break;
5943     case 'u':
5944         switch (len) {
5945         case 2:
5946             if (strEQ(d,"uc"))                  return -KEY_uc;
5947             break;
5948         case 3:
5949             if (strEQ(d,"use"))                 return KEY_use;
5950             break;
5951         case 5:
5952             if (strEQ(d,"undef"))               return KEY_undef;
5953             if (strEQ(d,"until"))               return KEY_until;
5954             if (strEQ(d,"untie"))               return KEY_untie;
5955             if (strEQ(d,"utime"))               return -KEY_utime;
5956             if (strEQ(d,"umask"))               return -KEY_umask;
5957             break;
5958         case 6:
5959             if (strEQ(d,"unless"))              return KEY_unless;
5960             if (strEQ(d,"unpack"))              return -KEY_unpack;
5961             if (strEQ(d,"unlink"))              return -KEY_unlink;
5962             break;
5963         case 7:
5964            if (strEQ(d,"unshift"))             return -KEY_unshift;
5965             if (strEQ(d,"ucfirst"))             return -KEY_ucfirst;
5966             break;
5967         }
5968         break;
5969     case 'v':
5970         if (strEQ(d,"values"))                  return -KEY_values;
5971         if (strEQ(d,"vec"))                     return -KEY_vec;
5972         break;
5973     case 'w':
5974         switch (len) {
5975         case 4:
5976             if (strEQ(d,"warn"))                return -KEY_warn;
5977             if (strEQ(d,"wait"))                return -KEY_wait;
5978             break;
5979         case 5:
5980             if (strEQ(d,"while"))               return KEY_while;
5981             if (strEQ(d,"write"))               return -KEY_write;
5982             break;
5983         case 7:
5984             if (strEQ(d,"waitpid"))             return -KEY_waitpid;
5985             break;
5986         case 9:
5987             if (strEQ(d,"wantarray"))           return -KEY_wantarray;
5988             break;
5989         }
5990         break;
5991     case 'x':
5992         if (len == 1)                           return -KEY_x;
5993         if (strEQ(d,"xor"))                     return -KEY_xor;
5994         break;
5995     case 'y':
5996         if (len == 1)                           return KEY_y;
5997         break;
5998     case 'z':
5999         break;
6000     }
6001     return 0;
6002 }
6003
6004 STATIC void
6005 S_checkcomma(pTHX_ register char *s, char *name, char *what)
6006 {
6007     char *w;
6008
6009     if (*s == ' ' && s[1] == '(') {     /* XXX gotta be a better way */
6010         if (ckWARN(WARN_SYNTAX)) {
6011             int level = 1;
6012             for (w = s+2; *w && level; w++) {
6013                 if (*w == '(')
6014                     ++level;
6015                 else if (*w == ')')
6016                     --level;
6017             }
6018             if (*w)
6019                 for (; *w && isSPACE(*w); w++) ;
6020             if (!*w || !strchr(";|})]oaiuw!=", *w))     /* an advisory hack only... */
6021                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
6022                             "%s (...) interpreted as function",name);
6023         }
6024     }
6025     while (s < PL_bufend && isSPACE(*s))
6026         s++;
6027     if (*s == '(')
6028         s++;
6029     while (s < PL_bufend && isSPACE(*s))
6030         s++;
6031     if (isIDFIRST_lazy_if(s,UTF)) {
6032         w = s++;
6033         while (isALNUM_lazy_if(s,UTF))
6034             s++;
6035         while (s < PL_bufend && isSPACE(*s))
6036             s++;
6037         if (*s == ',') {
6038             int kw;
6039             *s = '\0';
6040             kw = keyword(w, s - w) || get_cv(w, FALSE) != 0;
6041             *s = ',';
6042             if (kw)
6043                 return;
6044             Perl_croak(aTHX_ "No comma allowed after %s", what);
6045         }
6046     }
6047 }
6048
6049 /* Either returns sv, or mortalizes sv and returns a new SV*.
6050    Best used as sv=new_constant(..., sv, ...).
6051    If s, pv are NULL, calls subroutine with one argument,
6052    and type is used with error messages only. */
6053
6054 STATIC SV *
6055 S_new_constant(pTHX_ char *s, STRLEN len, const char *key, SV *sv, SV *pv,
6056                const char *type)
6057 {
6058     dSP;
6059     HV *table = GvHV(PL_hintgv);                 /* ^H */
6060     SV *res;
6061     SV **cvp;
6062     SV *cv, *typesv;
6063     const char *why1, *why2, *why3;
6064
6065     if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
6066         SV *msg;
6067         
6068         why2 = strEQ(key,"charnames")
6069                ? "(possibly a missing \"use charnames ...\")"
6070                : "";
6071         msg = Perl_newSVpvf(aTHX_ "Constant(%s) unknown: %s",
6072                             (type ? type: "undef"), why2);
6073
6074         /* This is convoluted and evil ("goto considered harmful")
6075          * but I do not understand the intricacies of all the different
6076          * failure modes of %^H in here.  The goal here is to make
6077          * the most probable error message user-friendly. --jhi */
6078
6079         goto msgdone;
6080
6081     report:
6082         msg = Perl_newSVpvf(aTHX_ "Constant(%s): %s%s%s",
6083                             (type ? type: "undef"), why1, why2, why3);
6084     msgdone:
6085         yyerror(SvPVX(msg));
6086         SvREFCNT_dec(msg);
6087         return sv;
6088     }
6089     cvp = hv_fetch(table, key, strlen(key), FALSE);
6090     if (!cvp || !SvOK(*cvp)) {
6091         why1 = "$^H{";
6092         why2 = key;
6093         why3 = "} is not defined";
6094         goto report;
6095     }
6096     sv_2mortal(sv);                     /* Parent created it permanently */
6097     cv = *cvp;
6098     if (!pv && s)
6099         pv = sv_2mortal(newSVpvn(s, len));
6100     if (type && pv)
6101         typesv = sv_2mortal(newSVpv(type, 0));
6102     else
6103         typesv = &PL_sv_undef;
6104
6105     PUSHSTACKi(PERLSI_OVERLOAD);
6106     ENTER ;
6107     SAVETMPS;
6108
6109     PUSHMARK(SP) ;
6110     EXTEND(sp, 3);
6111     if (pv)
6112         PUSHs(pv);
6113     PUSHs(sv);
6114     if (pv)
6115         PUSHs(typesv);
6116     PUTBACK;
6117     call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
6118
6119     SPAGAIN ;
6120
6121     /* Check the eval first */
6122     if (!PL_in_eval && SvTRUE(ERRSV)) {
6123         STRLEN n_a;
6124         sv_catpv(ERRSV, "Propagated");
6125         yyerror(SvPV(ERRSV, n_a)); /* Duplicates the message inside eval */
6126         (void)POPs;
6127         res = SvREFCNT_inc(sv);
6128     }
6129     else {
6130         res = POPs;
6131         (void)SvREFCNT_inc(res);
6132     }
6133
6134     PUTBACK ;
6135     FREETMPS ;
6136     LEAVE ;
6137     POPSTACK;
6138
6139     if (!SvOK(res)) {
6140         why1 = "Call to &{$^H{";
6141         why2 = key;
6142         why3 = "}} did not return a defined value";
6143         sv = res;
6144         goto report;
6145     }
6146
6147     return res;
6148 }
6149
6150 STATIC char *
6151 S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
6152 {
6153     register char *d = dest;
6154     register char *e = d + destlen - 3;  /* two-character token, ending NUL */
6155     for (;;) {
6156         if (d >= e)
6157             Perl_croak(aTHX_ ident_too_long);
6158         if (isALNUM(*s))        /* UTF handled below */
6159             *d++ = *s++;
6160         else if (*s == '\'' && allow_package && isIDFIRST_lazy_if(s+1,UTF)) {
6161             *d++ = ':';
6162             *d++ = ':';
6163             s++;
6164         }
6165         else if (*s == ':' && s[1] == ':' && allow_package && s[2] != '$') {
6166             *d++ = *s++;
6167             *d++ = *s++;
6168         }
6169         else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
6170             char *t = s + UTF8SKIP(s);
6171             while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
6172                 t += UTF8SKIP(t);
6173             if (d + (t - s) > e)
6174                 Perl_croak(aTHX_ ident_too_long);
6175             Copy(s, d, t - s, char);
6176             d += t - s;
6177             s = t;
6178         }
6179         else {
6180             *d = '\0';
6181             *slp = d - dest;
6182             return s;
6183         }
6184     }
6185 }
6186
6187 STATIC char *
6188 S_scan_ident(pTHX_ register char *s, register char *send, char *dest, STRLEN destlen, I32 ck_uni)
6189 {
6190     register char *d;
6191     register char *e;
6192     char *bracket = 0;
6193     char funny = *s++;
6194
6195     if (isSPACE(*s))
6196         s = skipspace(s);
6197     d = dest;
6198     e = d + destlen - 3;        /* two-character token, ending NUL */
6199     if (isDIGIT(*s)) {
6200         while (isDIGIT(*s)) {
6201             if (d >= e)
6202                 Perl_croak(aTHX_ ident_too_long);
6203             *d++ = *s++;
6204         }
6205     }
6206     else {
6207         for (;;) {
6208             if (d >= e)
6209                 Perl_croak(aTHX_ ident_too_long);
6210             if (isALNUM(*s))    /* UTF handled below */
6211                 *d++ = *s++;
6212             else if (*s == '\'' && isIDFIRST_lazy_if(s+1,UTF)) {
6213                 *d++ = ':';
6214                 *d++ = ':';
6215                 s++;
6216             }
6217             else if (*s == ':' && s[1] == ':') {
6218                 *d++ = *s++;
6219                 *d++ = *s++;
6220             }
6221             else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
6222                 char *t = s + UTF8SKIP(s);
6223                 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
6224                     t += UTF8SKIP(t);
6225                 if (d + (t - s) > e)
6226                     Perl_croak(aTHX_ ident_too_long);
6227                 Copy(s, d, t - s, char);
6228                 d += t - s;
6229                 s = t;
6230             }
6231             else
6232                 break;
6233         }
6234     }
6235     *d = '\0';
6236     d = dest;
6237     if (*d) {
6238         if (PL_lex_state != LEX_NORMAL)
6239             PL_lex_state = LEX_INTERPENDMAYBE;
6240         return s;
6241     }
6242     if (*s == '$' && s[1] &&
6243         (isALNUM_lazy_if(s+1,UTF) || strchr("${", s[1]) || strnEQ(s+1,"::",2)) )
6244     {
6245         return s;
6246     }
6247     if (*s == '{') {
6248         bracket = s;
6249         s++;
6250     }
6251     else if (ck_uni)
6252         check_uni();
6253     if (s < send)
6254         *d = *s++;
6255     d[1] = '\0';
6256     if (*d == '^' && *s && isCONTROLVAR(*s)) {
6257         *d = toCTRL(*s);
6258         s++;
6259     }
6260     if (bracket) {
6261         if (isSPACE(s[-1])) {
6262             while (s < send) {
6263                 char ch = *s++;
6264                 if (!SPACE_OR_TAB(ch)) {
6265                     *d = ch;
6266                     break;
6267                 }
6268             }
6269         }
6270         if (isIDFIRST_lazy_if(d,UTF)) {
6271             d++;
6272             if (UTF) {
6273                 e = s;
6274                 while ((e < send && isALNUM_lazy_if(e,UTF)) || *e == ':') {
6275                     e += UTF8SKIP(e);
6276                     while (e < send && UTF8_IS_CONTINUED(*e) && is_utf8_mark((U8*)e))
6277                         e += UTF8SKIP(e);
6278                 }
6279                 Copy(s, d, e - s, char);
6280                 d += e - s;
6281                 s = e;
6282             }
6283             else {
6284                 while ((isALNUM(*s) || *s == ':') && d < e)
6285                     *d++ = *s++;
6286                 if (d >= e)
6287                     Perl_croak(aTHX_ ident_too_long);
6288             }
6289             *d = '\0';
6290             while (s < send && SPACE_OR_TAB(*s)) s++;
6291             if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
6292                 if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest)) {
6293                     const char *brack = *s == '[' ? "[...]" : "{...}";
6294                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
6295                         "Ambiguous use of %c{%s%s} resolved to %c%s%s",
6296                         funny, dest, brack, funny, dest, brack);
6297                 }
6298                 bracket++;
6299                 PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
6300                 return s;
6301             }
6302         }
6303         /* Handle extended ${^Foo} variables
6304          * 1999-02-27 mjd-perl-patch@plover.com */
6305         else if (!isALNUM(*d) && !isPRINT(*d) /* isCTRL(d) */
6306                  && isALNUM(*s))
6307         {
6308             d++;
6309             while (isALNUM(*s) && d < e) {
6310                 *d++ = *s++;
6311             }
6312             if (d >= e)
6313                 Perl_croak(aTHX_ ident_too_long);
6314             *d = '\0';
6315         }
6316         if (*s == '}') {
6317             s++;
6318             if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) {
6319                 PL_lex_state = LEX_INTERPEND;
6320                 PL_expect = XREF;
6321             }
6322             if (funny == '#')
6323                 funny = '@';
6324             if (PL_lex_state == LEX_NORMAL) {
6325                 if (ckWARN(WARN_AMBIGUOUS) &&
6326                     (keyword(dest, d - dest) || get_cv(dest, FALSE)))
6327                 {
6328                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
6329                         "Ambiguous use of %c{%s} resolved to %c%s",
6330                         funny, dest, funny, dest);
6331                 }
6332             }
6333         }
6334         else {
6335             s = bracket;                /* let the parser handle it */
6336             *dest = '\0';
6337         }
6338     }
6339     else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
6340         PL_lex_state = LEX_INTERPEND;
6341     return s;
6342 }
6343
6344 void
6345 Perl_pmflag(pTHX_ U32* pmfl, int ch)
6346 {
6347     if (ch == 'i')
6348         *pmfl |= PMf_FOLD;
6349     else if (ch == 'g')
6350         *pmfl |= PMf_GLOBAL;
6351     else if (ch == 'c')
6352         *pmfl |= PMf_CONTINUE;
6353     else if (ch == 'o')
6354         *pmfl |= PMf_KEEP;
6355     else if (ch == 'm')
6356         *pmfl |= PMf_MULTILINE;
6357     else if (ch == 's')
6358         *pmfl |= PMf_SINGLELINE;
6359     else if (ch == 'x')
6360         *pmfl |= PMf_EXTENDED;
6361 }
6362
6363 STATIC char *
6364 S_scan_pat(pTHX_ char *start, I32 type)
6365 {
6366     PMOP *pm;
6367     char *s;
6368
6369     s = scan_str(start,FALSE,FALSE);
6370     if (!s)
6371         Perl_croak(aTHX_ "Search pattern not terminated");
6372
6373     pm = (PMOP*)newPMOP(type, 0);
6374     if (PL_multi_open == '?')
6375         pm->op_pmflags |= PMf_ONCE;
6376     if(type == OP_QR) {
6377         while (*s && strchr("iomsx", *s))
6378             pmflag(&pm->op_pmflags,*s++);
6379     }
6380     else {
6381         while (*s && strchr("iogcmsx", *s))
6382             pmflag(&pm->op_pmflags,*s++);
6383     }
6384     /* issue a warning if /c is specified,but /g is not */
6385     if (ckWARN(WARN_REGEXP) && 
6386         (pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL))
6387     {
6388         Perl_warner(aTHX_ packWARN(WARN_REGEXP), c_without_g);
6389     }
6390
6391     pm->op_pmpermflags = pm->op_pmflags;
6392
6393     PL_lex_op = (OP*)pm;
6394     yylval.ival = OP_MATCH;
6395     return s;
6396 }
6397
6398 STATIC char *
6399 S_scan_subst(pTHX_ char *start)
6400 {
6401     register char *s;
6402     register PMOP *pm;
6403     I32 first_start;
6404     I32 es = 0;
6405
6406     yylval.ival = OP_NULL;
6407
6408     s = scan_str(start,FALSE,FALSE);
6409
6410     if (!s)
6411         Perl_croak(aTHX_ "Substitution pattern not terminated");
6412
6413     if (s[-1] == PL_multi_open)
6414         s--;
6415
6416     first_start = PL_multi_start;
6417     s = scan_str(s,FALSE,FALSE);
6418     if (!s) {
6419         if (PL_lex_stuff) {
6420             SvREFCNT_dec(PL_lex_stuff);
6421             PL_lex_stuff = Nullsv;
6422         }
6423         Perl_croak(aTHX_ "Substitution replacement not terminated");
6424     }
6425     PL_multi_start = first_start;       /* so whole substitution is taken together */
6426
6427     pm = (PMOP*)newPMOP(OP_SUBST, 0);
6428     while (*s) {
6429         if (*s == 'e') {
6430             s++;
6431             es++;
6432         }
6433         else if (strchr("iogcmsx", *s))
6434             pmflag(&pm->op_pmflags,*s++);
6435         else
6436             break;
6437     }
6438
6439     /* /c is not meaningful with s/// */
6440     if (ckWARN(WARN_REGEXP) && (pm->op_pmflags & PMf_CONTINUE))
6441     {
6442         Perl_warner(aTHX_ packWARN(WARN_REGEXP), c_in_subst);
6443     }
6444
6445     if (es) {
6446         SV *repl;
6447         PL_sublex_info.super_bufptr = s;
6448         PL_sublex_info.super_bufend = PL_bufend;
6449         PL_multi_end = 0;
6450         pm->op_pmflags |= PMf_EVAL;
6451         repl = newSVpvn("",0);
6452         while (es-- > 0)
6453             sv_catpv(repl, es ? "eval " : "do ");
6454         sv_catpvn(repl, "{ ", 2);
6455         sv_catsv(repl, PL_lex_repl);
6456         sv_catpvn(repl, " };", 2);
6457         SvEVALED_on(repl);
6458         SvREFCNT_dec(PL_lex_repl);
6459         PL_lex_repl = repl;
6460     }
6461
6462     pm->op_pmpermflags = pm->op_pmflags;
6463     PL_lex_op = (OP*)pm;
6464     yylval.ival = OP_SUBST;
6465     return s;
6466 }
6467
6468 STATIC char *
6469 S_scan_trans(pTHX_ char *start)
6470 {
6471     register char* s;
6472     OP *o;
6473     short *tbl;
6474     I32 squash;
6475     I32 del;
6476     I32 complement;
6477
6478     yylval.ival = OP_NULL;
6479
6480     s = scan_str(start,FALSE,FALSE);
6481     if (!s)
6482         Perl_croak(aTHX_ "Transliteration pattern not terminated");
6483     if (s[-1] == PL_multi_open)
6484         s--;
6485
6486     s = scan_str(s,FALSE,FALSE);
6487     if (!s) {
6488         if (PL_lex_stuff) {
6489             SvREFCNT_dec(PL_lex_stuff);
6490             PL_lex_stuff = Nullsv;
6491         }
6492         Perl_croak(aTHX_ "Transliteration replacement not terminated");
6493     }
6494
6495     complement = del = squash = 0;
6496     while (strchr("cds", *s)) {
6497         if (*s == 'c')
6498             complement = OPpTRANS_COMPLEMENT;
6499         else if (*s == 'd')
6500             del = OPpTRANS_DELETE;
6501         else if (*s == 's')
6502             squash = OPpTRANS_SQUASH;
6503         s++;
6504     }
6505
6506     New(803, tbl, complement&&!del?258:256, short);
6507     o = newPVOP(OP_TRANS, 0, (char*)tbl);
6508     o->op_private = del|squash|complement|
6509       (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
6510       (DO_UTF8(PL_lex_repl) ? OPpTRANS_TO_UTF   : 0);
6511
6512     PL_lex_op = o;
6513     yylval.ival = OP_TRANS;
6514     return s;
6515 }
6516
6517 STATIC char *
6518 S_scan_heredoc(pTHX_ register char *s)
6519 {
6520     SV *herewas;
6521     I32 op_type = OP_SCALAR;
6522     I32 len;
6523     SV *tmpstr;
6524     char term;
6525     register char *d;
6526     register char *e;
6527     char *peek;
6528     int outer = (PL_rsfp && !(PL_lex_inwhat == OP_SCALAR));
6529
6530     s += 2;
6531     d = PL_tokenbuf;
6532     e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
6533     if (!outer)
6534         *d++ = '\n';
6535     for (peek = s; SPACE_OR_TAB(*peek); peek++) ;
6536     if (*peek && strchr("`'\"",*peek)) {
6537         s = peek;
6538         term = *s++;
6539         s = delimcpy(d, e, s, PL_bufend, term, &len);
6540         d += len;
6541         if (s < PL_bufend)
6542             s++;
6543     }
6544     else {
6545         if (*s == '\\')
6546             s++, term = '\'';
6547         else
6548             term = '"';
6549         if (!isALNUM_lazy_if(s,UTF))
6550             deprecate_old("bare << to mean <<\"\"");
6551         for (; isALNUM_lazy_if(s,UTF); s++) {
6552             if (d < e)
6553                 *d++ = *s;
6554         }
6555     }
6556     if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
6557         Perl_croak(aTHX_ "Delimiter for here document is too long");
6558     *d++ = '\n';
6559     *d = '\0';
6560     len = d - PL_tokenbuf;
6561 #ifndef PERL_STRICT_CR
6562     d = strchr(s, '\r');
6563     if (d) {
6564         char *olds = s;
6565         s = d;
6566         while (s < PL_bufend) {
6567             if (*s == '\r') {
6568                 *d++ = '\n';
6569                 if (*++s == '\n')
6570                     s++;
6571             }
6572             else if (*s == '\n' && s[1] == '\r') {      /* \015\013 on a mac? */
6573                 *d++ = *s++;
6574                 s++;
6575             }
6576             else
6577                 *d++ = *s++;
6578         }
6579         *d = '\0';
6580         PL_bufend = d;
6581         SvCUR_set(PL_linestr, PL_bufend - SvPVX(PL_linestr));
6582         s = olds;
6583     }
6584 #endif
6585     d = "\n";
6586     if (outer || !(d=ninstr(s,PL_bufend,d,d+1)))
6587         herewas = newSVpvn(s,PL_bufend-s);
6588     else
6589         s--, herewas = newSVpvn(s,d-s);
6590     s += SvCUR(herewas);
6591
6592     tmpstr = NEWSV(87,79);
6593     sv_upgrade(tmpstr, SVt_PVIV);
6594     if (term == '\'') {
6595         op_type = OP_CONST;
6596         SvIVX(tmpstr) = -1;
6597     }
6598     else if (term == '`') {
6599         op_type = OP_BACKTICK;
6600         SvIVX(tmpstr) = '\\';
6601     }
6602
6603     CLINE;
6604     PL_multi_start = CopLINE(PL_curcop);
6605     PL_multi_open = PL_multi_close = '<';
6606     term = *PL_tokenbuf;
6607     if (PL_lex_inwhat == OP_SUBST && PL_in_eval && !PL_rsfp) {
6608         char *bufptr = PL_sublex_info.super_bufptr;
6609         char *bufend = PL_sublex_info.super_bufend;
6610         char *olds = s - SvCUR(herewas);
6611         s = strchr(bufptr, '\n');
6612         if (!s)
6613             s = bufend;
6614         d = s;
6615         while (s < bufend &&
6616           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
6617             if (*s++ == '\n')
6618                 CopLINE_inc(PL_curcop);
6619         }
6620         if (s >= bufend) {
6621             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
6622             missingterm(PL_tokenbuf);
6623         }
6624         sv_setpvn(herewas,bufptr,d-bufptr+1);
6625         sv_setpvn(tmpstr,d+1,s-d);
6626         s += len - 1;
6627         sv_catpvn(herewas,s,bufend-s);
6628         (void)strcpy(bufptr,SvPVX(herewas));
6629
6630         s = olds;
6631         goto retval;
6632     }
6633     else if (!outer) {
6634         d = s;
6635         while (s < PL_bufend &&
6636           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
6637             if (*s++ == '\n')
6638                 CopLINE_inc(PL_curcop);
6639         }
6640         if (s >= PL_bufend) {
6641             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
6642             missingterm(PL_tokenbuf);
6643         }
6644         sv_setpvn(tmpstr,d+1,s-d);
6645         s += len - 1;
6646         CopLINE_inc(PL_curcop); /* the preceding stmt passes a newline */
6647
6648         sv_catpvn(herewas,s,PL_bufend-s);
6649         sv_setsv(PL_linestr,herewas);
6650         PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
6651         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
6652         PL_last_lop = PL_last_uni = Nullch;
6653     }
6654     else
6655         sv_setpvn(tmpstr,"",0);   /* avoid "uninitialized" warning */
6656     while (s >= PL_bufend) {    /* multiple line string? */
6657         if (!outer ||
6658          !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
6659             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
6660             missingterm(PL_tokenbuf);
6661         }
6662         CopLINE_inc(PL_curcop);
6663         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
6664         PL_last_lop = PL_last_uni = Nullch;
6665 #ifndef PERL_STRICT_CR
6666         if (PL_bufend - PL_linestart >= 2) {
6667             if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
6668                 (PL_bufend[-2] == '\n' && PL_bufend[-1] == '\r'))
6669             {
6670                 PL_bufend[-2] = '\n';
6671                 PL_bufend--;
6672                 SvCUR_set(PL_linestr, PL_bufend - SvPVX(PL_linestr));
6673             }
6674             else if (PL_bufend[-1] == '\r')
6675                 PL_bufend[-1] = '\n';
6676         }
6677         else if (PL_bufend - PL_linestart == 1 && PL_bufend[-1] == '\r')
6678             PL_bufend[-1] = '\n';
6679 #endif
6680         if (PERLDB_LINE && PL_curstash != PL_debstash) {
6681             SV *sv = NEWSV(88,0);
6682
6683             sv_upgrade(sv, SVt_PVMG);
6684             sv_setsv(sv,PL_linestr);
6685             (void)SvIOK_on(sv);
6686             SvIVX(sv) = 0;
6687             av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop),sv);
6688         }
6689         if (*s == term && memEQ(s,PL_tokenbuf,len)) {
6690             s = PL_bufend - 1;
6691             *s = ' ';
6692             sv_catsv(PL_linestr,herewas);
6693             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
6694         }
6695         else {
6696             s = PL_bufend;
6697             sv_catsv(tmpstr,PL_linestr);
6698         }
6699     }
6700     s++;
6701 retval:
6702     PL_multi_end = CopLINE(PL_curcop);
6703     if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
6704         SvLEN_set(tmpstr, SvCUR(tmpstr) + 1);
6705         Renew(SvPVX(tmpstr), SvLEN(tmpstr), char);
6706     }
6707     SvREFCNT_dec(herewas);
6708     if (!IN_BYTES) {
6709         if (UTF && is_utf8_string((U8*)SvPVX(tmpstr), SvCUR(tmpstr)))
6710             SvUTF8_on(tmpstr);
6711         else if (PL_encoding)
6712             sv_recode_to_utf8(tmpstr, PL_encoding);
6713     }
6714     PL_lex_stuff = tmpstr;
6715     yylval.ival = op_type;
6716     return s;
6717 }
6718
6719 /* scan_inputsymbol
6720    takes: current position in input buffer
6721    returns: new position in input buffer
6722    side-effects: yylval and lex_op are set.
6723
6724    This code handles:
6725
6726    <>           read from ARGV
6727    <FH>         read from filehandle
6728    <pkg::FH>    read from package qualified filehandle
6729    <pkg'FH>     read from package qualified filehandle
6730    <$fh>        read from filehandle in $fh
6731    <*.h>        filename glob
6732
6733 */
6734
6735 STATIC char *
6736 S_scan_inputsymbol(pTHX_ char *start)
6737 {
6738     register char *s = start;           /* current position in buffer */
6739     register char *d;
6740     register char *e;
6741     char *end;
6742     I32 len;
6743
6744     d = PL_tokenbuf;                    /* start of temp holding space */
6745     e = PL_tokenbuf + sizeof PL_tokenbuf;       /* end of temp holding space */
6746     end = strchr(s, '\n');
6747     if (!end)
6748         end = PL_bufend;
6749     s = delimcpy(d, e, s + 1, end, '>', &len);  /* extract until > */
6750
6751     /* die if we didn't have space for the contents of the <>,
6752        or if it didn't end, or if we see a newline
6753     */
6754
6755     if (len >= sizeof PL_tokenbuf)
6756         Perl_croak(aTHX_ "Excessively long <> operator");
6757     if (s >= end)
6758         Perl_croak(aTHX_ "Unterminated <> operator");
6759
6760     s++;
6761
6762     /* check for <$fh>
6763        Remember, only scalar variables are interpreted as filehandles by
6764        this code.  Anything more complex (e.g., <$fh{$num}>) will be
6765        treated as a glob() call.
6766        This code makes use of the fact that except for the $ at the front,
6767        a scalar variable and a filehandle look the same.
6768     */
6769     if (*d == '$' && d[1]) d++;
6770
6771     /* allow <Pkg'VALUE> or <Pkg::VALUE> */
6772     while (*d && (isALNUM_lazy_if(d,UTF) || *d == '\'' || *d == ':'))
6773         d++;
6774
6775     /* If we've tried to read what we allow filehandles to look like, and
6776        there's still text left, then it must be a glob() and not a getline.
6777        Use scan_str to pull out the stuff between the <> and treat it
6778        as nothing more than a string.
6779     */
6780
6781     if (d - PL_tokenbuf != len) {
6782         yylval.ival = OP_GLOB;
6783         set_csh();
6784         s = scan_str(start,FALSE,FALSE);
6785         if (!s)
6786            Perl_croak(aTHX_ "Glob not terminated");
6787         return s;
6788     }
6789     else {
6790         bool readline_overriden = FALSE;
6791         GV *gv_readline = Nullgv;
6792         GV **gvp;
6793         /* we're in a filehandle read situation */
6794         d = PL_tokenbuf;
6795
6796         /* turn <> into <ARGV> */
6797         if (!len)
6798             (void)strcpy(d,"ARGV");
6799
6800         /* Check whether readline() is overriden */
6801         if (((gv_readline = gv_fetchpv("readline", FALSE, SVt_PVCV))
6802                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline))
6803                 ||
6804                 ((gvp = (GV**)hv_fetch(PL_globalstash, "readline", 8, FALSE))
6805                 && (gv_readline = *gvp) != (GV*)&PL_sv_undef
6806                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline)))
6807             readline_overriden = TRUE;
6808
6809         /* if <$fh>, create the ops to turn the variable into a
6810            filehandle
6811         */
6812         if (*d == '$') {
6813             I32 tmp;
6814
6815             /* try to find it in the pad for this block, otherwise find
6816                add symbol table ops
6817             */
6818             if ((tmp = pad_findmy(d)) != NOT_IN_PAD) {
6819                 if (PAD_COMPNAME_FLAGS(tmp) & SVpad_OUR) {
6820                     SV *sym = sv_2mortal(
6821                             newSVpv(HvNAME(PAD_COMPNAME_OURSTASH(tmp)),0));
6822                     sv_catpvn(sym, "::", 2);
6823                     sv_catpv(sym, d+1);
6824                     d = SvPVX(sym);
6825                     goto intro_sym;
6826                 }
6827                 else {
6828                     OP *o = newOP(OP_PADSV, 0);
6829                     o->op_targ = tmp;
6830                     PL_lex_op = readline_overriden
6831                         ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
6832                                 append_elem(OP_LIST, o,
6833                                     newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
6834                         : (OP*)newUNOP(OP_READLINE, 0, o);
6835                 }
6836             }
6837             else {
6838                 GV *gv;
6839                 ++d;
6840 intro_sym:
6841                 gv = gv_fetchpv(d,
6842                                 (PL_in_eval
6843                                  ? (GV_ADDMULTI | GV_ADDINEVAL)
6844                                  : GV_ADDMULTI),
6845                                 SVt_PV);
6846                 PL_lex_op = readline_overriden
6847                     ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
6848                             append_elem(OP_LIST,
6849                                 newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
6850                                 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
6851                     : (OP*)newUNOP(OP_READLINE, 0,
6852                             newUNOP(OP_RV2SV, 0,
6853                                 newGVOP(OP_GV, 0, gv)));
6854             }
6855             if (!readline_overriden)
6856                 PL_lex_op->op_flags |= OPf_SPECIAL;
6857             /* we created the ops in PL_lex_op, so make yylval.ival a null op */
6858             yylval.ival = OP_NULL;
6859         }
6860
6861         /* If it's none of the above, it must be a literal filehandle
6862            (<Foo::BAR> or <FOO>) so build a simple readline OP */
6863         else {
6864             GV *gv = gv_fetchpv(d,TRUE, SVt_PVIO);
6865             PL_lex_op = readline_overriden
6866                 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
6867                         append_elem(OP_LIST,
6868                             newGVOP(OP_GV, 0, gv),
6869                             newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
6870                 : (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
6871             yylval.ival = OP_NULL;
6872         }
6873     }
6874
6875     return s;
6876 }
6877
6878
6879 /* scan_str
6880    takes: start position in buffer
6881           keep_quoted preserve \ on the embedded delimiter(s)
6882           keep_delims preserve the delimiters around the string
6883    returns: position to continue reading from buffer
6884    side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
6885         updates the read buffer.
6886
6887    This subroutine pulls a string out of the input.  It is called for:
6888         q               single quotes           q(literal text)
6889         '               single quotes           'literal text'
6890         qq              double quotes           qq(interpolate $here please)
6891         "               double quotes           "interpolate $here please"
6892         qx              backticks               qx(/bin/ls -l)
6893         `               backticks               `/bin/ls -l`
6894         qw              quote words             @EXPORT_OK = qw( func() $spam )
6895         m//             regexp match            m/this/
6896         s///            regexp substitute       s/this/that/
6897         tr///           string transliterate    tr/this/that/
6898         y///            string transliterate    y/this/that/
6899         ($*@)           sub prototypes          sub foo ($)
6900         (stuff)         sub attr parameters     sub foo : attr(stuff)
6901         <>              readline or globs       <FOO>, <>, <$fh>, or <*.c>
6902         
6903    In most of these cases (all but <>, patterns and transliterate)
6904    yylex() calls scan_str().  m// makes yylex() call scan_pat() which
6905    calls scan_str().  s/// makes yylex() call scan_subst() which calls
6906    scan_str().  tr/// and y/// make yylex() call scan_trans() which
6907    calls scan_str().
6908
6909    It skips whitespace before the string starts, and treats the first
6910    character as the delimiter.  If the delimiter is one of ([{< then
6911    the corresponding "close" character )]}> is used as the closing
6912    delimiter.  It allows quoting of delimiters, and if the string has
6913    balanced delimiters ([{<>}]) it allows nesting.
6914
6915    On success, the SV with the resulting string is put into lex_stuff or,
6916    if that is already non-NULL, into lex_repl. The second case occurs only
6917    when parsing the RHS of the special constructs s/// and tr/// (y///).
6918    For convenience, the terminating delimiter character is stuffed into
6919    SvIVX of the SV.
6920 */
6921
6922 STATIC char *
6923 S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
6924 {
6925     SV *sv;                             /* scalar value: string */
6926     char *tmps;                         /* temp string, used for delimiter matching */
6927     register char *s = start;           /* current position in the buffer */
6928     register char term;                 /* terminating character */
6929     register char *to;                  /* current position in the sv's data */
6930     I32 brackets = 1;                   /* bracket nesting level */
6931     bool has_utf8 = FALSE;              /* is there any utf8 content? */
6932     I32 termcode;                       /* terminating char. code */
6933     U8 termstr[UTF8_MAXLEN];            /* terminating string */
6934     STRLEN termlen;                     /* length of terminating string */
6935     char *last = NULL;                  /* last position for nesting bracket */
6936
6937     /* skip space before the delimiter */
6938     if (isSPACE(*s))
6939         s = skipspace(s);
6940
6941     /* mark where we are, in case we need to report errors */
6942     CLINE;
6943
6944     /* after skipping whitespace, the next character is the terminator */
6945     term = *s;
6946     if (!UTF) {
6947         termcode = termstr[0] = term;
6948         termlen = 1;
6949     }
6950     else {
6951         termcode = utf8_to_uvchr((U8*)s, &termlen);
6952         Copy(s, termstr, termlen, U8);
6953         if (!UTF8_IS_INVARIANT(term))
6954             has_utf8 = TRUE;
6955     }
6956
6957     /* mark where we are */
6958     PL_multi_start = CopLINE(PL_curcop);
6959     PL_multi_open = term;
6960
6961     /* find corresponding closing delimiter */
6962     if (term && (tmps = strchr("([{< )]}> )]}>",term)))
6963         termcode = termstr[0] = term = tmps[5];
6964
6965     PL_multi_close = term;
6966
6967     /* create a new SV to hold the contents.  87 is leak category, I'm
6968        assuming.  79 is the SV's initial length.  What a random number. */
6969     sv = NEWSV(87,79);
6970     sv_upgrade(sv, SVt_PVIV);
6971     SvIVX(sv) = termcode;
6972     (void)SvPOK_only(sv);               /* validate pointer */
6973
6974     /* move past delimiter and try to read a complete string */
6975     if (keep_delims)
6976         sv_catpvn(sv, s, termlen);
6977     s += termlen;
6978     for (;;) {
6979         if (PL_encoding && !UTF) {
6980             bool cont = TRUE;
6981
6982             while (cont) {
6983                 int offset = s - SvPVX(PL_linestr);
6984                 bool found = sv_cat_decode(sv, PL_encoding, PL_linestr,
6985                                            &offset, (char*)termstr, termlen);
6986                 char *ns = SvPVX(PL_linestr) + offset;
6987                 char *svlast = SvEND(sv) - 1;
6988
6989                 for (; s < ns; s++) {
6990                     if (*s == '\n' && !PL_rsfp)
6991                         CopLINE_inc(PL_curcop);
6992                 }
6993                 if (!found)
6994                     goto read_more_line;
6995                 else {
6996                     /* handle quoted delimiters */
6997                     if (SvCUR(sv) > 1 && *(svlast-1) == '\\') {
6998                         char *t;
6999                         for (t = svlast-2; t >= SvPVX(sv) && *t == '\\';)
7000                             t--;
7001                         if ((svlast-1 - t) % 2) {
7002                             if (!keep_quoted) {
7003                                 *(svlast-1) = term;
7004                                 *svlast = '\0';
7005                                 SvCUR_set(sv, SvCUR(sv) - 1);
7006                             }
7007                             continue;
7008                         }
7009                     }
7010                     if (PL_multi_open == PL_multi_close) {
7011                         cont = FALSE;
7012                     }
7013                     else {
7014                         char *t, *w;
7015                         if (!last)
7016                             last = SvPVX(sv);
7017                         for (w = t = last; t < svlast; w++, t++) {
7018                             /* At here, all closes are "was quoted" one,
7019                                so we don't check PL_multi_close. */
7020                             if (*t == '\\') {
7021                                 if (!keep_quoted && *(t+1) == PL_multi_open)
7022                                     t++;
7023                                 else
7024                                     *w++ = *t++;
7025                             }
7026                             else if (*t == PL_multi_open)
7027                                 brackets++;
7028
7029                             *w = *t;
7030                         }
7031                         if (w < t) {
7032                             *w++ = term;
7033                             *w = '\0';
7034                             SvCUR_set(sv, w - SvPVX(sv));
7035                         }
7036                         last = w;
7037                         if (--brackets <= 0)
7038                             cont = FALSE;
7039                     }
7040                 }
7041             }
7042             if (!keep_delims) {
7043                 SvCUR_set(sv, SvCUR(sv) - 1);
7044                 *SvEND(sv) = '\0';
7045             }
7046             break;
7047         }
7048
7049         /* extend sv if need be */
7050         SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
7051         /* set 'to' to the next character in the sv's string */
7052         to = SvPVX(sv)+SvCUR(sv);
7053
7054         /* if open delimiter is the close delimiter read unbridle */
7055         if (PL_multi_open == PL_multi_close) {
7056             for (; s < PL_bufend; s++,to++) {
7057                 /* embedded newlines increment the current line number */
7058                 if (*s == '\n' && !PL_rsfp)
7059                     CopLINE_inc(PL_curcop);
7060                 /* handle quoted delimiters */
7061                 if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
7062                     if (!keep_quoted && s[1] == term)
7063                         s++;
7064                 /* any other quotes are simply copied straight through */
7065                     else
7066                         *to++ = *s++;
7067                 }
7068                 /* terminate when run out of buffer (the for() condition), or
7069                    have found the terminator */
7070                 else if (*s == term) {
7071                     if (termlen == 1)
7072                         break;
7073                     if (s+termlen <= PL_bufend && memEQ(s, (char*)termstr, termlen))
7074                         break;
7075                 }
7076                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
7077                     has_utf8 = TRUE;
7078                 *to = *s;
7079             }
7080         }
7081         
7082         /* if the terminator isn't the same as the start character (e.g.,
7083            matched brackets), we have to allow more in the quoting, and
7084            be prepared for nested brackets.
7085         */
7086         else {
7087             /* read until we run out of string, or we find the terminator */
7088             for (; s < PL_bufend; s++,to++) {
7089                 /* embedded newlines increment the line count */
7090                 if (*s == '\n' && !PL_rsfp)
7091                     CopLINE_inc(PL_curcop);
7092                 /* backslashes can escape the open or closing characters */
7093                 if (*s == '\\' && s+1 < PL_bufend) {
7094                     if (!keep_quoted &&
7095                         ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
7096                         s++;
7097                     else
7098                         *to++ = *s++;
7099                 }
7100                 /* allow nested opens and closes */
7101                 else if (*s == PL_multi_close && --brackets <= 0)
7102                     break;
7103                 else if (*s == PL_multi_open)
7104                     brackets++;
7105                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
7106                     has_utf8 = TRUE;
7107                 *to = *s;
7108             }
7109         }
7110         /* terminate the copied string and update the sv's end-of-string */
7111         *to = '\0';
7112         SvCUR_set(sv, to - SvPVX(sv));
7113
7114         /*
7115          * this next chunk reads more into the buffer if we're not done yet
7116          */
7117
7118         if (s < PL_bufend)
7119             break;              /* handle case where we are done yet :-) */
7120
7121 #ifndef PERL_STRICT_CR
7122         if (to - SvPVX(sv) >= 2) {
7123             if ((to[-2] == '\r' && to[-1] == '\n') ||
7124                 (to[-2] == '\n' && to[-1] == '\r'))
7125             {
7126                 to[-2] = '\n';
7127                 to--;
7128                 SvCUR_set(sv, to - SvPVX(sv));
7129             }
7130             else if (to[-1] == '\r')
7131                 to[-1] = '\n';
7132         }
7133         else if (to - SvPVX(sv) == 1 && to[-1] == '\r')
7134             to[-1] = '\n';
7135 #endif
7136         
7137      read_more_line:
7138         /* if we're out of file, or a read fails, bail and reset the current
7139            line marker so we can report where the unterminated string began
7140         */
7141         if (!PL_rsfp ||
7142          !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
7143             sv_free(sv);
7144             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
7145             return Nullch;
7146         }
7147         /* we read a line, so increment our line counter */
7148         CopLINE_inc(PL_curcop);
7149
7150         /* update debugger info */
7151         if (PERLDB_LINE && PL_curstash != PL_debstash) {
7152             SV *sv = NEWSV(88,0);
7153
7154             sv_upgrade(sv, SVt_PVMG);
7155             sv_setsv(sv,PL_linestr);
7156             (void)SvIOK_on(sv);
7157             SvIVX(sv) = 0;
7158             av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop), sv);
7159         }
7160
7161         /* having changed the buffer, we must update PL_bufend */
7162         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
7163         PL_last_lop = PL_last_uni = Nullch;
7164     }
7165
7166     /* at this point, we have successfully read the delimited string */
7167
7168     if (!PL_encoding || UTF) {
7169         if (keep_delims)
7170             sv_catpvn(sv, s, termlen);
7171         s += termlen;
7172     }
7173     if (has_utf8 || PL_encoding)
7174         SvUTF8_on(sv);
7175
7176     PL_multi_end = CopLINE(PL_curcop);
7177
7178     /* if we allocated too much space, give some back */
7179     if (SvCUR(sv) + 5 < SvLEN(sv)) {
7180         SvLEN_set(sv, SvCUR(sv) + 1);
7181         Renew(SvPVX(sv), SvLEN(sv), char);
7182     }
7183
7184     /* decide whether this is the first or second quoted string we've read
7185        for this op
7186     */
7187
7188     if (PL_lex_stuff)
7189         PL_lex_repl = sv;
7190     else
7191         PL_lex_stuff = sv;
7192     return s;
7193 }
7194
7195 /*
7196   scan_num
7197   takes: pointer to position in buffer
7198   returns: pointer to new position in buffer
7199   side-effects: builds ops for the constant in yylval.op
7200
7201   Read a number in any of the formats that Perl accepts:
7202
7203   \d(_?\d)*(\.(\d(_?\d)*)?)?[Ee][\+\-]?(\d(_?\d)*)      12 12.34 12.
7204   \.\d(_?\d)*[Ee][\+\-]?(\d(_?\d)*)                     .34
7205   0b[01](_?[01])*
7206   0[0-7](_?[0-7])*
7207   0x[0-9A-Fa-f](_?[0-9A-Fa-f])*
7208
7209   Like most scan_ routines, it uses the PL_tokenbuf buffer to hold the
7210   thing it reads.
7211
7212   If it reads a number without a decimal point or an exponent, it will
7213   try converting the number to an integer and see if it can do so
7214   without loss of precision.
7215 */
7216
7217 char *
7218 Perl_scan_num(pTHX_ char *start, YYSTYPE* lvalp)
7219 {
7220     register char *s = start;           /* current position in buffer */
7221     register char *d;                   /* destination in temp buffer */
7222     register char *e;                   /* end of temp buffer */
7223     NV nv;                              /* number read, as a double */
7224     SV *sv = Nullsv;                    /* place to put the converted number */
7225     bool floatit;                       /* boolean: int or float? */
7226     char *lastub = 0;                   /* position of last underbar */
7227     static char number_too_long[] = "Number too long";
7228
7229     /* We use the first character to decide what type of number this is */
7230
7231     switch (*s) {
7232     default:
7233       Perl_croak(aTHX_ "panic: scan_num");
7234
7235     /* if it starts with a 0, it could be an octal number, a decimal in
7236        0.13 disguise, or a hexadecimal number, or a binary number. */
7237     case '0':
7238         {
7239           /* variables:
7240              u          holds the "number so far"
7241              shift      the power of 2 of the base
7242                         (hex == 4, octal == 3, binary == 1)
7243              overflowed was the number more than we can hold?
7244
7245              Shift is used when we add a digit.  It also serves as an "are
7246              we in octal/hex/binary?" indicator to disallow hex characters
7247              when in octal mode.
7248            */
7249             NV n = 0.0;
7250             UV u = 0;
7251             I32 shift;
7252             bool overflowed = FALSE;
7253             static NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
7254             static char* bases[5] = { "", "binary", "", "octal",
7255                                       "hexadecimal" };
7256             static char* Bases[5] = { "", "Binary", "", "Octal",
7257                                       "Hexadecimal" };
7258             static char *maxima[5] = { "",
7259                                        "0b11111111111111111111111111111111",
7260                                        "",
7261                                        "037777777777",
7262                                        "0xffffffff" };
7263             char *base, *Base, *max;
7264
7265             /* check for hex */
7266             if (s[1] == 'x') {
7267                 shift = 4;
7268                 s += 2;
7269             } else if (s[1] == 'b') {
7270                 shift = 1;
7271                 s += 2;
7272             }
7273             /* check for a decimal in disguise */
7274             else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
7275                 goto decimal;
7276             /* so it must be octal */
7277             else {
7278                 shift = 3;
7279                 s++;
7280             }
7281
7282             if (*s == '_') {
7283                if (ckWARN(WARN_SYNTAX))
7284                    Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7285                                "Misplaced _ in number");
7286                lastub = s++;
7287             }
7288
7289             base = bases[shift];
7290             Base = Bases[shift];
7291             max  = maxima[shift];
7292
7293             /* read the rest of the number */
7294             for (;;) {
7295                 /* x is used in the overflow test,
7296                    b is the digit we're adding on. */
7297                 UV x, b;
7298
7299                 switch (*s) {
7300
7301                 /* if we don't mention it, we're done */
7302                 default:
7303                     goto out;
7304
7305                 /* _ are ignored -- but warned about if consecutive */
7306                 case '_':
7307                     if (ckWARN(WARN_SYNTAX) && lastub && s == lastub + 1)
7308                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7309                                     "Misplaced _ in number");
7310                     lastub = s++;
7311                     break;
7312
7313                 /* 8 and 9 are not octal */
7314                 case '8': case '9':
7315                     if (shift == 3)
7316                         yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
7317                     /* FALL THROUGH */
7318
7319                 /* octal digits */
7320                 case '2': case '3': case '4':
7321                 case '5': case '6': case '7':
7322                     if (shift == 1)
7323                         yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
7324                     /* FALL THROUGH */
7325
7326                 case '0': case '1':
7327                     b = *s++ & 15;              /* ASCII digit -> value of digit */
7328                     goto digit;
7329
7330                 /* hex digits */
7331                 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
7332                 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
7333                     /* make sure they said 0x */
7334                     if (shift != 4)
7335                         goto out;
7336                     b = (*s++ & 7) + 9;
7337
7338                     /* Prepare to put the digit we have onto the end
7339                        of the number so far.  We check for overflows.
7340                     */
7341
7342                   digit:
7343                     if (!overflowed) {
7344                         x = u << shift; /* make room for the digit */
7345
7346                         if ((x >> shift) != u
7347                             && !(PL_hints & HINT_NEW_BINARY)) {
7348                             overflowed = TRUE;
7349                             n = (NV) u;
7350                             if (ckWARN_d(WARN_OVERFLOW))
7351                                 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
7352                                             "Integer overflow in %s number",
7353                                             base);
7354                         } else
7355                             u = x | b;          /* add the digit to the end */
7356                     }
7357                     if (overflowed) {
7358                         n *= nvshift[shift];
7359                         /* If an NV has not enough bits in its
7360                          * mantissa to represent an UV this summing of
7361                          * small low-order numbers is a waste of time
7362                          * (because the NV cannot preserve the
7363                          * low-order bits anyway): we could just
7364                          * remember when did we overflow and in the
7365                          * end just multiply n by the right
7366                          * amount. */
7367                         n += (NV) b;
7368                     }
7369                     break;
7370                 }
7371             }
7372
7373           /* if we get here, we had success: make a scalar value from
7374              the number.
7375           */
7376           out:
7377
7378             /* final misplaced underbar check */
7379             if (s[-1] == '_') {
7380                 if (ckWARN(WARN_SYNTAX))
7381                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
7382             }
7383
7384             sv = NEWSV(92,0);
7385             if (overflowed) {
7386                 if (ckWARN(WARN_PORTABLE) && n > 4294967295.0)
7387                     Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
7388                                 "%s number > %s non-portable",
7389                                 Base, max);
7390                 sv_setnv(sv, n);
7391             }
7392             else {
7393 #if UVSIZE > 4
7394                 if (ckWARN(WARN_PORTABLE) && u > 0xffffffff)
7395                     Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
7396                                 "%s number > %s non-portable",
7397                                 Base, max);
7398 #endif
7399                 sv_setuv(sv, u);
7400             }
7401             if (PL_hints & HINT_NEW_BINARY)
7402                 sv = new_constant(start, s - start, "binary", sv, Nullsv, NULL);
7403         }
7404         break;
7405
7406     /*
7407       handle decimal numbers.
7408       we're also sent here when we read a 0 as the first digit
7409     */
7410     case '1': case '2': case '3': case '4': case '5':
7411     case '6': case '7': case '8': case '9': case '.':
7412       decimal:
7413         d = PL_tokenbuf;
7414         e = PL_tokenbuf + sizeof PL_tokenbuf - 6; /* room for various punctuation */
7415         floatit = FALSE;
7416
7417         /* read next group of digits and _ and copy into d */
7418         while (isDIGIT(*s) || *s == '_') {
7419             /* skip underscores, checking for misplaced ones
7420                if -w is on
7421             */
7422             if (*s == '_') {
7423                 if (ckWARN(WARN_SYNTAX) && lastub && s == lastub + 1)
7424                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7425                                 "Misplaced _ in number");
7426                 lastub = s++;
7427             }
7428             else {
7429                 /* check for end of fixed-length buffer */
7430                 if (d >= e)
7431                     Perl_croak(aTHX_ number_too_long);
7432                 /* if we're ok, copy the character */
7433                 *d++ = *s++;
7434             }
7435         }
7436
7437         /* final misplaced underbar check */
7438         if (lastub && s == lastub + 1) {
7439             if (ckWARN(WARN_SYNTAX))
7440                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
7441         }
7442
7443         /* read a decimal portion if there is one.  avoid
7444            3..5 being interpreted as the number 3. followed
7445            by .5
7446         */
7447         if (*s == '.' && s[1] != '.') {
7448             floatit = TRUE;
7449             *d++ = *s++;
7450
7451             if (*s == '_') {
7452                 if (ckWARN(WARN_SYNTAX))
7453                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7454                                 "Misplaced _ in number");
7455                 lastub = s;
7456             }
7457
7458             /* copy, ignoring underbars, until we run out of digits.
7459             */
7460             for (; isDIGIT(*s) || *s == '_'; s++) {
7461                 /* fixed length buffer check */
7462                 if (d >= e)
7463                     Perl_croak(aTHX_ number_too_long);
7464                 if (*s == '_') {
7465                    if (ckWARN(WARN_SYNTAX) && lastub && s == lastub + 1)
7466                        Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7467                                    "Misplaced _ in number");
7468                    lastub = s;
7469                 }
7470                 else
7471                     *d++ = *s;
7472             }
7473             /* fractional part ending in underbar? */
7474             if (s[-1] == '_') {
7475                 if (ckWARN(WARN_SYNTAX))
7476                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7477                                 "Misplaced _ in number");
7478             }
7479             if (*s == '.' && isDIGIT(s[1])) {
7480                 /* oops, it's really a v-string, but without the "v" */
7481                 s = start;
7482                 goto vstring;
7483             }
7484         }
7485
7486         /* read exponent part, if present */
7487         if (*s && strchr("eE",*s) && strchr("+-0123456789_", s[1])) {
7488             floatit = TRUE;
7489             s++;
7490
7491             /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
7492             *d++ = 'e';         /* At least some Mach atof()s don't grok 'E' */
7493
7494             /* stray preinitial _ */
7495             if (*s == '_') {
7496                 if (ckWARN(WARN_SYNTAX))
7497                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7498                                 "Misplaced _ in number");
7499                 lastub = s++;
7500             }
7501
7502             /* allow positive or negative exponent */
7503             if (*s == '+' || *s == '-')
7504                 *d++ = *s++;
7505
7506             /* stray initial _ */
7507             if (*s == '_') {
7508                 if (ckWARN(WARN_SYNTAX))
7509                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7510                                 "Misplaced _ in number");
7511                 lastub = s++;
7512             }
7513
7514             /* read digits of exponent */
7515             while (isDIGIT(*s) || *s == '_') {
7516                 if (isDIGIT(*s)) {
7517                     if (d >= e)
7518                         Perl_croak(aTHX_ number_too_long);
7519                     *d++ = *s++;
7520                 }
7521                 else {
7522                    if (ckWARN(WARN_SYNTAX) &&
7523                        ((lastub && s == lastub + 1) ||
7524                         (!isDIGIT(s[1]) && s[1] != '_')))
7525                        Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7526                                    "Misplaced _ in number");
7527                    lastub = s++;
7528                 }
7529             }
7530         }
7531
7532
7533         /* make an sv from the string */
7534         sv = NEWSV(92,0);
7535
7536         /*
7537            We try to do an integer conversion first if no characters
7538            indicating "float" have been found.
7539          */
7540
7541         if (!floatit) {
7542             UV uv;
7543             int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
7544
7545             if (flags == IS_NUMBER_IN_UV) {
7546               if (uv <= IV_MAX)
7547                 sv_setiv(sv, uv); /* Prefer IVs over UVs. */
7548               else
7549                 sv_setuv(sv, uv);
7550             } else if (flags == (IS_NUMBER_IN_UV | IS_NUMBER_NEG)) {
7551               if (uv <= (UV) IV_MIN)
7552                 sv_setiv(sv, -(IV)uv);
7553               else
7554                 floatit = TRUE;
7555             } else
7556               floatit = TRUE;
7557         }
7558         if (floatit) {
7559             /* terminate the string */
7560             *d = '\0';
7561             nv = Atof(PL_tokenbuf);
7562             sv_setnv(sv, nv);
7563         }
7564
7565         if ( floatit ? (PL_hints & HINT_NEW_FLOAT) :
7566                        (PL_hints & HINT_NEW_INTEGER) )
7567             sv = new_constant(PL_tokenbuf, d - PL_tokenbuf,
7568                               (floatit ? "float" : "integer"),
7569                               sv, Nullsv, NULL);
7570         break;
7571
7572     /* if it starts with a v, it could be a v-string */
7573     case 'v':
7574 vstring:
7575                 sv = NEWSV(92,5); /* preallocate storage space */
7576                 s = scan_vstring(s,sv);
7577         break;
7578     }
7579
7580     /* make the op for the constant and return */
7581
7582     if (sv)
7583         lvalp->opval = newSVOP(OP_CONST, 0, sv);
7584     else
7585         lvalp->opval = Nullop;
7586
7587     return s;
7588 }
7589
7590 STATIC char *
7591 S_scan_formline(pTHX_ register char *s)
7592 {
7593     register char *eol;
7594     register char *t;
7595     SV *stuff = newSVpvn("",0);
7596     bool needargs = FALSE;
7597
7598     while (!needargs) {
7599         if (*s == '.' || *s == /*{*/'}') {
7600             /*SUPPRESS 530*/
7601 #ifdef PERL_STRICT_CR
7602             for (t = s+1;SPACE_OR_TAB(*t); t++) ;
7603 #else
7604             for (t = s+1;SPACE_OR_TAB(*t) || *t == '\r'; t++) ;
7605 #endif
7606             if (*t == '\n' || t == PL_bufend)
7607                 break;
7608         }
7609         if (PL_in_eval && !PL_rsfp) {
7610             eol = strchr(s,'\n');
7611             if (!eol++)
7612                 eol = PL_bufend;
7613         }
7614         else
7615             eol = PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
7616         if (*s != '#') {
7617             for (t = s; t < eol; t++) {
7618                 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
7619                     needargs = FALSE;
7620                     goto enough;        /* ~~ must be first line in formline */
7621                 }
7622                 if (*t == '@' || *t == '^')
7623                     needargs = TRUE;
7624             }
7625             if (eol > s) {
7626                 sv_catpvn(stuff, s, eol-s);
7627 #ifndef PERL_STRICT_CR
7628                 if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
7629                     char *end = SvPVX(stuff) + SvCUR(stuff);
7630                     end[-2] = '\n';
7631                     end[-1] = '\0';
7632                     SvCUR(stuff)--;
7633                 }
7634 #endif
7635             }
7636             else
7637               break;
7638         }
7639         s = eol;
7640         if (PL_rsfp) {
7641             s = filter_gets(PL_linestr, PL_rsfp, 0);
7642             PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
7643             PL_bufend = PL_bufptr + SvCUR(PL_linestr);
7644             PL_last_lop = PL_last_uni = Nullch;
7645             if (!s) {
7646                 s = PL_bufptr;
7647                 yyerror("Format not terminated");
7648                 break;
7649             }
7650         }
7651         incline(s);
7652     }
7653   enough:
7654     if (SvCUR(stuff)) {
7655         PL_expect = XTERM;
7656         if (needargs) {
7657             PL_lex_state = LEX_NORMAL;
7658             PL_nextval[PL_nexttoke].ival = 0;
7659             force_next(',');
7660         }
7661         else
7662             PL_lex_state = LEX_FORMLINE;
7663         if (!IN_BYTES) {
7664             if (UTF && is_utf8_string((U8*)SvPVX(stuff), SvCUR(stuff)))
7665                 SvUTF8_on(stuff);
7666             else if (PL_encoding)
7667                 sv_recode_to_utf8(stuff, PL_encoding);
7668         }
7669         PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, stuff);
7670         force_next(THING);
7671         PL_nextval[PL_nexttoke].ival = OP_FORMLINE;
7672         force_next(LSTOP);
7673     }
7674     else {
7675         SvREFCNT_dec(stuff);
7676         PL_lex_formbrack = 0;
7677         PL_bufptr = s;
7678     }
7679     return s;
7680 }
7681
7682 STATIC void
7683 S_set_csh(pTHX)
7684 {
7685 #ifdef CSH
7686     if (!PL_cshlen)
7687         PL_cshlen = strlen(PL_cshname);
7688 #endif
7689 }
7690
7691 I32
7692 Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
7693 {
7694     I32 oldsavestack_ix = PL_savestack_ix;
7695     CV* outsidecv = PL_compcv;
7696
7697     if (PL_compcv) {
7698         assert(SvTYPE(PL_compcv) == SVt_PVCV);
7699     }
7700     SAVEI32(PL_subline);
7701     save_item(PL_subname);
7702     SAVESPTR(PL_compcv);
7703
7704     PL_compcv = (CV*)NEWSV(1104,0);
7705     sv_upgrade((SV *)PL_compcv, is_format ? SVt_PVFM : SVt_PVCV);
7706     CvFLAGS(PL_compcv) |= flags;
7707
7708     PL_subline = CopLINE(PL_curcop);
7709     CvPADLIST(PL_compcv) = pad_new(padnew_SAVE|padnew_SAVESUB);
7710     CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc(outsidecv);
7711     CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
7712
7713     return oldsavestack_ix;
7714 }
7715
7716 #ifdef __SC__
7717 #pragma segment Perl_yylex
7718 #endif
7719 int
7720 Perl_yywarn(pTHX_ char *s)
7721 {
7722     PL_in_eval |= EVAL_WARNONLY;
7723     yyerror(s);
7724     PL_in_eval &= ~EVAL_WARNONLY;
7725     return 0;
7726 }
7727
7728 int
7729 Perl_yyerror(pTHX_ char *s)
7730 {
7731     char *where = NULL;
7732     char *context = NULL;
7733     int contlen = -1;
7734     SV *msg;
7735
7736     if (!yychar || (yychar == ';' && !PL_rsfp))
7737         where = "at EOF";
7738     else if (PL_bufptr > PL_oldoldbufptr && PL_bufptr - PL_oldoldbufptr < 200 &&
7739       PL_oldoldbufptr != PL_oldbufptr && 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_oldoldbufptr))
7749             PL_oldoldbufptr++;
7750 #endif
7751         context = PL_oldoldbufptr;
7752         contlen = PL_bufptr - PL_oldoldbufptr;
7753     }
7754     else if (PL_bufptr > PL_oldbufptr && PL_bufptr - PL_oldbufptr < 200 &&
7755       PL_oldbufptr != PL_bufptr) {
7756         /*
7757                 Only for NetWare:
7758                 The code below is removed for NetWare because it abends/crashes on NetWare
7759                 when the script has error such as not having the closing quotes like:
7760                     if ($var eq "value)
7761                 Checking of white spaces is anyway done in NetWare code.
7762         */
7763 #ifndef NETWARE
7764         while (isSPACE(*PL_oldbufptr))
7765             PL_oldbufptr++;
7766 #endif
7767         context = PL_oldbufptr;
7768         contlen = PL_bufptr - PL_oldbufptr;
7769     }
7770     else if (yychar > 255)
7771         where = "next token ???";
7772 #ifdef USE_PURE_BISON
7773 /*  GNU Bison sets the value -2 */
7774     else if (yychar == -2) {
7775 #else
7776     else if ((yychar & 127) == 127) {
7777 #endif
7778         if (PL_lex_state == LEX_NORMAL ||
7779            (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
7780             where = "at end of line";
7781         else if (PL_lex_inpat)
7782             where = "within pattern";
7783         else
7784             where = "within string";
7785     }
7786     else {
7787         SV *where_sv = sv_2mortal(newSVpvn("next char ", 10));
7788         if (yychar < 32)
7789             Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
7790         else if (isPRINT_LC(yychar))
7791             Perl_sv_catpvf(aTHX_ where_sv, "%c", yychar);
7792         else
7793             Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
7794         where = SvPVX(where_sv);
7795     }
7796     msg = sv_2mortal(newSVpv(s, 0));
7797     Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
7798         OutCopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
7799     if (context)
7800         Perl_sv_catpvf(aTHX_ msg, "near \"%.*s\"\n", contlen, context);
7801     else
7802         Perl_sv_catpvf(aTHX_ msg, "%s\n", where);
7803     if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
7804         Perl_sv_catpvf(aTHX_ msg,
7805         "  (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
7806                 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
7807         PL_multi_end = 0;
7808     }
7809     if (PL_in_eval & EVAL_WARNONLY)
7810         Perl_warn(aTHX_ "%"SVf, msg);
7811     else
7812         qerror(msg);
7813     if (PL_error_count >= 10) {
7814         if (PL_in_eval && SvCUR(ERRSV))
7815             Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
7816             ERRSV, OutCopFILE(PL_curcop));
7817         else
7818             Perl_croak(aTHX_ "%s has too many errors.\n",
7819             OutCopFILE(PL_curcop));
7820     }
7821     PL_in_my = 0;
7822     PL_in_my_stash = Nullhv;
7823     return 0;
7824 }
7825 #ifdef __SC__
7826 #pragma segment Main
7827 #endif
7828
7829 STATIC char*
7830 S_swallow_bom(pTHX_ U8 *s)
7831 {
7832     STRLEN slen;
7833     slen = SvCUR(PL_linestr);
7834     switch (*s) {
7835     case 0xFF:
7836         if (s[1] == 0xFE) {
7837             /* UTF-16 little-endian */
7838             if (s[2] == 0 && s[3] == 0)  /* UTF-32 little-endian */
7839                 Perl_croak(aTHX_ "Unsupported script encoding");
7840 #ifndef PERL_NO_UTF16_FILTER
7841             DEBUG_p(PerlIO_printf(Perl_debug_log, "UTF-LE script encoding\n"));
7842             s += 2;
7843             if (PL_bufend > (char*)s) {
7844                 U8 *news;
7845                 I32 newlen;
7846
7847                 filter_add(utf16rev_textfilter, NULL);
7848                 New(898, news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
7849                 PL_bufend = (char*)utf16_to_utf8_reversed(s, news,
7850                                                  PL_bufend - (char*)s - 1,
7851                                                  &newlen);
7852                 Copy(news, s, newlen, U8);
7853                 SvCUR_set(PL_linestr, newlen);
7854                 PL_bufend = SvPVX(PL_linestr) + newlen;
7855                 news[newlen++] = '\0';
7856                 Safefree(news);
7857             }
7858 #else
7859             Perl_croak(aTHX_ "Unsupported script encoding");
7860 #endif
7861         }
7862         break;
7863     case 0xFE:
7864         if (s[1] == 0xFF) {   /* UTF-16 big-endian */
7865 #ifndef PERL_NO_UTF16_FILTER
7866             DEBUG_p(PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding\n"));
7867             s += 2;
7868             if (PL_bufend > (char *)s) {
7869                 U8 *news;
7870                 I32 newlen;
7871
7872                 filter_add(utf16_textfilter, NULL);
7873                 New(898, news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
7874                 PL_bufend = (char*)utf16_to_utf8(s, news,
7875                                                  PL_bufend - (char*)s,
7876                                                  &newlen);
7877                 Copy(news, s, newlen, U8);
7878                 SvCUR_set(PL_linestr, newlen);
7879                 PL_bufend = SvPVX(PL_linestr) + newlen;
7880                 news[newlen++] = '\0';
7881                 Safefree(news);
7882             }
7883 #else
7884             Perl_croak(aTHX_ "Unsupported script encoding");
7885 #endif
7886         }
7887         break;
7888     case 0xEF:
7889         if (slen > 2 && s[1] == 0xBB && s[2] == 0xBF) {
7890             DEBUG_p(PerlIO_printf(Perl_debug_log, "UTF-8 script encoding\n"));
7891             s += 3;                      /* UTF-8 */
7892         }
7893         break;
7894     case 0:
7895         if (slen > 3 && s[1] == 0 &&  /* UTF-32 big-endian */
7896             s[2] == 0xFE && s[3] == 0xFF)
7897         {
7898             Perl_croak(aTHX_ "Unsupported script encoding");
7899         }
7900     }
7901     return (char*)s;
7902 }
7903
7904 /*
7905  * restore_rsfp
7906  * Restore a source filter.
7907  */
7908
7909 static void
7910 restore_rsfp(pTHX_ void *f)
7911 {
7912     PerlIO *fp = (PerlIO*)f;
7913
7914     if (PL_rsfp == PerlIO_stdin())
7915         PerlIO_clearerr(PL_rsfp);
7916     else if (PL_rsfp && (PL_rsfp != fp))
7917         PerlIO_close(PL_rsfp);
7918     PL_rsfp = fp;
7919 }
7920
7921 #ifndef PERL_NO_UTF16_FILTER
7922 static I32
7923 utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
7924 {
7925     I32 count = FILTER_READ(idx+1, sv, maxlen);
7926     if (count) {
7927         U8* tmps;
7928         U8* tend;
7929         I32 newlen;
7930         New(898, tmps, SvCUR(sv) * 3 / 2 + 1, U8);
7931         if (!*SvPV_nolen(sv))
7932         /* Game over, but don't feed an odd-length string to utf16_to_utf8 */
7933         return count;
7934
7935         tend = utf16_to_utf8((U8*)SvPVX(sv), tmps, SvCUR(sv), &newlen);
7936         sv_usepvn(sv, (char*)tmps, tend - tmps);
7937     }
7938     return count;
7939 }
7940
7941 static I32
7942 utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen)
7943 {
7944     I32 count = FILTER_READ(idx+1, sv, maxlen);
7945     if (count) {
7946         U8* tmps;
7947         U8* tend;
7948         I32 newlen;
7949         if (!*SvPV_nolen(sv))
7950         /* Game over, but don't feed an odd-length string to utf16_to_utf8 */
7951         return count;
7952
7953         New(898, tmps, SvCUR(sv) * 3 / 2 + 1, U8);
7954         tend = utf16_to_utf8_reversed((U8*)SvPVX(sv), tmps, SvCUR(sv), &newlen);
7955         sv_usepvn(sv, (char*)tmps, tend - tmps);
7956     }
7957     return count;
7958 }
7959 #endif
7960
7961 /*
7962 Returns a pointer to the next character after the parsed
7963 vstring, as well as updating the passed in sv.
7964
7965 Function must be called like
7966
7967         sv = NEWSV(92,5);
7968         s = scan_vstring(s,sv);
7969
7970 The sv should already be large enough to store the vstring
7971 passed in, for performance reasons.
7972
7973 */
7974
7975 char *
7976 Perl_scan_vstring(pTHX_ char *s, SV *sv)
7977 {
7978     char *pos = s;
7979     char *start = s;
7980     if (*pos == 'v') pos++;  /* get past 'v' */
7981     while (pos < PL_bufend && (isDIGIT(*pos) || *pos == '_'))
7982         pos++;
7983     if ( *pos != '.') {
7984         /* this may not be a v-string if followed by => */
7985         char *next = pos;
7986         while (next < PL_bufend && isSPACE(*next))
7987             ++next;
7988         if ((PL_bufend - next) >= 2 && *next == '=' && next[1] == '>' ) {
7989             /* return string not v-string */
7990             sv_setpvn(sv,(char *)s,pos-s);
7991             return pos;
7992         }
7993     }
7994
7995     if (!isALPHA(*pos)) {
7996         UV rev;
7997         U8 tmpbuf[UTF8_MAXLEN+1];
7998         U8 *tmpend;
7999
8000         if (*s == 'v') s++;  /* get past 'v' */
8001
8002         sv_setpvn(sv, "", 0);
8003
8004         for (;;) {
8005             rev = 0;
8006             {
8007                 /* this is atoi() that tolerates underscores */
8008                 char *end = pos;
8009                 UV mult = 1;
8010                 while (--end >= s) {
8011                     UV orev;
8012                     if (*end == '_')
8013                         continue;
8014                     orev = rev;
8015                     rev += (*end - '0') * mult;
8016                     mult *= 10;
8017                     if (orev > rev && ckWARN_d(WARN_OVERFLOW))
8018                         Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
8019                                     "Integer overflow in decimal number");
8020                 }
8021             }
8022 #ifdef EBCDIC
8023             if (rev > 0x7FFFFFFF)
8024                  Perl_croak(aTHX_ "In EBCDIC the v-string components cannot exceed 2147483647");
8025 #endif
8026             /* Append native character for the rev point */
8027             tmpend = uvchr_to_utf8(tmpbuf, rev);
8028             sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
8029             if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(rev)))
8030                  SvUTF8_on(sv);
8031             if (pos + 1 < PL_bufend && *pos == '.' && isDIGIT(pos[1]))
8032                  s = ++pos;
8033             else {
8034                  s = pos;
8035                  break;
8036             }
8037             while (pos < PL_bufend && (isDIGIT(*pos) || *pos == '_'))
8038                  pos++;
8039         }
8040         SvPOK_on(sv);
8041         sv_magic(sv,NULL,PERL_MAGIC_vstring,(const char*)start, pos-start);
8042         SvRMAGICAL_on(sv);
8043     }
8044     return s;
8045 }
8046