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