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