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