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