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