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