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