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