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