This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate:
[perl5.git] / toke.c
1 /*    toke.c
2  *
3  *    Copyright (c) 1991-2003, 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 (!IN_BYTES) {
4163                     if (UTF)
4164                         PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, ":utf8");
4165                     else if (PL_encoding) {
4166                         SV *name;
4167                         dSP;
4168                         ENTER;
4169                         SAVETMPS;
4170                         PUSHMARK(sp);
4171                         EXTEND(SP, 1);
4172                         XPUSHs(PL_encoding);
4173                         PUTBACK;
4174                         call_method("name", G_SCALAR);
4175                         SPAGAIN;
4176                         name = POPs;
4177                         PUTBACK;
4178                         PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, 
4179                                             Perl_form(aTHX_ ":encoding(%"SVf")",
4180                                                       name));
4181                         FREETMPS;
4182                         LEAVE;
4183                     }
4184                 }
4185 #endif
4186                 PL_rsfp = Nullfp;
4187             }
4188             goto fake_eof;
4189         }
4190
4191         case KEY_AUTOLOAD:
4192         case KEY_DESTROY:
4193         case KEY_BEGIN:
4194         case KEY_CHECK:
4195         case KEY_INIT:
4196         case KEY_END:
4197             if (PL_expect == XSTATE) {
4198                 s = PL_bufptr;
4199                 goto really_sub;
4200             }
4201             goto just_a_word;
4202
4203         case KEY_CORE:
4204             if (*s == ':' && s[1] == ':') {
4205                 s += 2;
4206                 d = s;
4207                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
4208                 if (!(tmp = keyword(PL_tokenbuf, len)))
4209                     Perl_croak(aTHX_ "CORE::%s is not a keyword", PL_tokenbuf);
4210                 if (tmp < 0)
4211                     tmp = -tmp;
4212                 goto reserved_word;
4213             }
4214             goto just_a_word;
4215
4216         case KEY_abs:
4217             UNI(OP_ABS);
4218
4219         case KEY_alarm:
4220             UNI(OP_ALARM);
4221
4222         case KEY_accept:
4223             LOP(OP_ACCEPT,XTERM);
4224
4225         case KEY_and:
4226             OPERATOR(ANDOP);
4227
4228         case KEY_atan2:
4229             LOP(OP_ATAN2,XTERM);
4230
4231         case KEY_bind:
4232             LOP(OP_BIND,XTERM);
4233
4234         case KEY_binmode:
4235             LOP(OP_BINMODE,XTERM);
4236
4237         case KEY_bless:
4238             LOP(OP_BLESS,XTERM);
4239
4240         case KEY_chop:
4241             UNI(OP_CHOP);
4242
4243         case KEY_continue:
4244             PREBLOCK(CONTINUE);
4245
4246         case KEY_chdir:
4247             (void)gv_fetchpv("ENV",TRUE, SVt_PVHV);     /* may use HOME */
4248             UNI(OP_CHDIR);
4249
4250         case KEY_close:
4251             UNI(OP_CLOSE);
4252
4253         case KEY_closedir:
4254             UNI(OP_CLOSEDIR);
4255
4256         case KEY_cmp:
4257             Eop(OP_SCMP);
4258
4259         case KEY_caller:
4260             UNI(OP_CALLER);
4261
4262         case KEY_crypt:
4263 #ifdef FCRYPT
4264             if (!PL_cryptseen) {
4265                 PL_cryptseen = TRUE;
4266                 init_des();
4267             }
4268 #endif
4269             LOP(OP_CRYPT,XTERM);
4270
4271         case KEY_chmod:
4272             LOP(OP_CHMOD,XTERM);
4273
4274         case KEY_chown:
4275             LOP(OP_CHOWN,XTERM);
4276
4277         case KEY_connect:
4278             LOP(OP_CONNECT,XTERM);
4279
4280         case KEY_chr:
4281             UNI(OP_CHR);
4282
4283         case KEY_cos:
4284             UNI(OP_COS);
4285
4286         case KEY_chroot:
4287             UNI(OP_CHROOT);
4288
4289         case KEY_do:
4290             s = skipspace(s);
4291             if (*s == '{')
4292                 PRETERMBLOCK(DO);
4293             if (*s != '\'')
4294                 s = force_word(s,WORD,TRUE,TRUE,FALSE);
4295             OPERATOR(DO);
4296
4297         case KEY_die:
4298             PL_hints |= HINT_BLOCK_SCOPE;
4299             LOP(OP_DIE,XTERM);
4300
4301         case KEY_defined:
4302             UNI(OP_DEFINED);
4303
4304         case KEY_delete:
4305             UNI(OP_DELETE);
4306
4307         case KEY_dbmopen:
4308             gv_fetchpv("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
4309             LOP(OP_DBMOPEN,XTERM);
4310
4311         case KEY_dbmclose:
4312             UNI(OP_DBMCLOSE);
4313
4314         case KEY_dump:
4315             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4316             LOOPX(OP_DUMP);
4317
4318         case KEY_else:
4319             PREBLOCK(ELSE);
4320
4321         case KEY_elsif:
4322             yylval.ival = CopLINE(PL_curcop);
4323             OPERATOR(ELSIF);
4324
4325         case KEY_eq:
4326             Eop(OP_SEQ);
4327
4328         case KEY_exists:
4329             UNI(OP_EXISTS);
4330         
4331         case KEY_exit:
4332             UNI(OP_EXIT);
4333
4334         case KEY_eval:
4335             s = skipspace(s);
4336             PL_expect = (*s == '{') ? XTERMBLOCK : XTERM;
4337             UNIBRACK(OP_ENTEREVAL);
4338
4339         case KEY_eof:
4340             UNI(OP_EOF);
4341
4342         case KEY_exp:
4343             UNI(OP_EXP);
4344
4345         case KEY_each:
4346             UNI(OP_EACH);
4347
4348         case KEY_exec:
4349             set_csh();
4350             LOP(OP_EXEC,XREF);
4351
4352         case KEY_endhostent:
4353             FUN0(OP_EHOSTENT);
4354
4355         case KEY_endnetent:
4356             FUN0(OP_ENETENT);
4357
4358         case KEY_endservent:
4359             FUN0(OP_ESERVENT);
4360
4361         case KEY_endprotoent:
4362             FUN0(OP_EPROTOENT);
4363
4364         case KEY_endpwent:
4365             FUN0(OP_EPWENT);
4366
4367         case KEY_endgrent:
4368             FUN0(OP_EGRENT);
4369
4370         case KEY_for:
4371         case KEY_foreach:
4372             yylval.ival = CopLINE(PL_curcop);
4373             s = skipspace(s);
4374             if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) {
4375                 char *p = s;
4376                 if ((PL_bufend - p) >= 3 &&
4377                     strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
4378                     p += 2;
4379                 else if ((PL_bufend - p) >= 4 &&
4380                     strnEQ(p, "our", 3) && isSPACE(*(p + 3)))
4381                     p += 3;
4382                 p = skipspace(p);
4383                 if (isIDFIRST_lazy_if(p,UTF)) {
4384                     p = scan_ident(p, PL_bufend,
4385                         PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
4386                     p = skipspace(p);
4387                 }
4388                 if (*p != '$')
4389                     Perl_croak(aTHX_ "Missing $ on loop variable");
4390             }
4391             OPERATOR(FOR);
4392
4393         case KEY_formline:
4394             LOP(OP_FORMLINE,XTERM);
4395
4396         case KEY_fork:
4397             FUN0(OP_FORK);
4398
4399         case KEY_fcntl:
4400             LOP(OP_FCNTL,XTERM);
4401
4402         case KEY_fileno:
4403             UNI(OP_FILENO);
4404
4405         case KEY_flock:
4406             LOP(OP_FLOCK,XTERM);
4407
4408         case KEY_gt:
4409             Rop(OP_SGT);
4410
4411         case KEY_ge:
4412             Rop(OP_SGE);
4413
4414         case KEY_grep:
4415             LOP(OP_GREPSTART, XREF);
4416
4417         case KEY_goto:
4418             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4419             LOOPX(OP_GOTO);
4420
4421         case KEY_gmtime:
4422             UNI(OP_GMTIME);
4423
4424         case KEY_getc:
4425             UNI(OP_GETC);
4426
4427         case KEY_getppid:
4428             FUN0(OP_GETPPID);
4429
4430         case KEY_getpgrp:
4431             UNI(OP_GETPGRP);
4432
4433         case KEY_getpriority:
4434             LOP(OP_GETPRIORITY,XTERM);
4435
4436         case KEY_getprotobyname:
4437             UNI(OP_GPBYNAME);
4438
4439         case KEY_getprotobynumber:
4440             LOP(OP_GPBYNUMBER,XTERM);
4441
4442         case KEY_getprotoent:
4443             FUN0(OP_GPROTOENT);
4444
4445         case KEY_getpwent:
4446             FUN0(OP_GPWENT);
4447
4448         case KEY_getpwnam:
4449             UNI(OP_GPWNAM);
4450
4451         case KEY_getpwuid:
4452             UNI(OP_GPWUID);
4453
4454         case KEY_getpeername:
4455             UNI(OP_GETPEERNAME);
4456
4457         case KEY_gethostbyname:
4458             UNI(OP_GHBYNAME);
4459
4460         case KEY_gethostbyaddr:
4461             LOP(OP_GHBYADDR,XTERM);
4462
4463         case KEY_gethostent:
4464             FUN0(OP_GHOSTENT);
4465
4466         case KEY_getnetbyname:
4467             UNI(OP_GNBYNAME);
4468
4469         case KEY_getnetbyaddr:
4470             LOP(OP_GNBYADDR,XTERM);
4471
4472         case KEY_getnetent:
4473             FUN0(OP_GNETENT);
4474
4475         case KEY_getservbyname:
4476             LOP(OP_GSBYNAME,XTERM);
4477
4478         case KEY_getservbyport:
4479             LOP(OP_GSBYPORT,XTERM);
4480
4481         case KEY_getservent:
4482             FUN0(OP_GSERVENT);
4483
4484         case KEY_getsockname:
4485             UNI(OP_GETSOCKNAME);
4486
4487         case KEY_getsockopt:
4488             LOP(OP_GSOCKOPT,XTERM);
4489
4490         case KEY_getgrent:
4491             FUN0(OP_GGRENT);
4492
4493         case KEY_getgrnam:
4494             UNI(OP_GGRNAM);
4495
4496         case KEY_getgrgid:
4497             UNI(OP_GGRGID);
4498
4499         case KEY_getlogin:
4500             FUN0(OP_GETLOGIN);
4501
4502         case KEY_glob:
4503             set_csh();
4504             LOP(OP_GLOB,XTERM);
4505
4506         case KEY_hex:
4507             UNI(OP_HEX);
4508
4509         case KEY_if:
4510             yylval.ival = CopLINE(PL_curcop);
4511             OPERATOR(IF);
4512
4513         case KEY_index:
4514             LOP(OP_INDEX,XTERM);
4515
4516         case KEY_int:
4517             UNI(OP_INT);
4518
4519         case KEY_ioctl:
4520             LOP(OP_IOCTL,XTERM);
4521
4522         case KEY_join:
4523             LOP(OP_JOIN,XTERM);
4524
4525         case KEY_keys:
4526             UNI(OP_KEYS);
4527
4528         case KEY_kill:
4529             LOP(OP_KILL,XTERM);
4530
4531         case KEY_last:
4532             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4533             LOOPX(OP_LAST);
4534         
4535         case KEY_lc:
4536             UNI(OP_LC);
4537
4538         case KEY_lcfirst:
4539             UNI(OP_LCFIRST);
4540
4541         case KEY_local:
4542             yylval.ival = 0;
4543             OPERATOR(LOCAL);
4544
4545         case KEY_length:
4546             UNI(OP_LENGTH);
4547
4548         case KEY_lt:
4549             Rop(OP_SLT);
4550
4551         case KEY_le:
4552             Rop(OP_SLE);
4553
4554         case KEY_localtime:
4555             UNI(OP_LOCALTIME);
4556
4557         case KEY_log:
4558             UNI(OP_LOG);
4559
4560         case KEY_link:
4561             LOP(OP_LINK,XTERM);
4562
4563         case KEY_listen:
4564             LOP(OP_LISTEN,XTERM);
4565
4566         case KEY_lock:
4567             UNI(OP_LOCK);
4568
4569         case KEY_lstat:
4570             UNI(OP_LSTAT);
4571
4572         case KEY_m:
4573             s = scan_pat(s,OP_MATCH);
4574             TERM(sublex_start());
4575
4576         case KEY_map:
4577             LOP(OP_MAPSTART, XREF);
4578
4579         case KEY_mkdir:
4580             LOP(OP_MKDIR,XTERM);
4581
4582         case KEY_msgctl:
4583             LOP(OP_MSGCTL,XTERM);
4584
4585         case KEY_msgget:
4586             LOP(OP_MSGGET,XTERM);
4587
4588         case KEY_msgrcv:
4589             LOP(OP_MSGRCV,XTERM);
4590
4591         case KEY_msgsnd:
4592             LOP(OP_MSGSND,XTERM);
4593
4594         case KEY_our:
4595         case KEY_my:
4596             PL_in_my = tmp;
4597             s = skipspace(s);
4598             if (isIDFIRST_lazy_if(s,UTF)) {
4599                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
4600                 if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
4601                     goto really_sub;
4602                 PL_in_my_stash = find_in_my_stash(PL_tokenbuf, len);
4603                 if (!PL_in_my_stash) {
4604                     char tmpbuf[1024];
4605                     PL_bufptr = s;
4606                     sprintf(tmpbuf, "No such class %.1000s", PL_tokenbuf);
4607                     yyerror(tmpbuf);
4608                 }
4609             }
4610             yylval.ival = 1;
4611             OPERATOR(MY);
4612
4613         case KEY_next:
4614             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4615             LOOPX(OP_NEXT);
4616
4617         case KEY_ne:
4618             Eop(OP_SNE);
4619
4620         case KEY_no:
4621             if (PL_expect != XSTATE)
4622                 yyerror("\"no\" not allowed in expression");
4623             s = force_word(s,WORD,FALSE,TRUE,FALSE);
4624             s = force_version(s, FALSE);
4625             yylval.ival = 0;
4626             OPERATOR(USE);
4627
4628         case KEY_not:
4629             if (*s == '(' || (s = skipspace(s), *s == '('))
4630                 FUN1(OP_NOT);
4631             else
4632                 OPERATOR(NOTOP);
4633
4634         case KEY_open:
4635             s = skipspace(s);
4636             if (isIDFIRST_lazy_if(s,UTF)) {
4637                 char *t;
4638                 for (d = s; isALNUM_lazy_if(d,UTF); d++) ;
4639                 t = skipspace(d);
4640                 if (strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
4641                     /* [perl #16184] */
4642                     && !(t[0] == '=' && t[1] == '>')
4643                 ) {
4644                     Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE),
4645                            "Precedence problem: open %.*s should be open(%.*s)",
4646                             d - s, s, d - s, s);
4647                 }
4648             }
4649             LOP(OP_OPEN,XTERM);
4650
4651         case KEY_or:
4652             yylval.ival = OP_OR;
4653             OPERATOR(OROP);
4654
4655         case KEY_ord:
4656             UNI(OP_ORD);
4657
4658         case KEY_oct:
4659             UNI(OP_OCT);
4660
4661         case KEY_opendir:
4662             LOP(OP_OPEN_DIR,XTERM);
4663
4664         case KEY_print:
4665             checkcomma(s,PL_tokenbuf,"filehandle");
4666             LOP(OP_PRINT,XREF);
4667
4668         case KEY_printf:
4669             checkcomma(s,PL_tokenbuf,"filehandle");
4670             LOP(OP_PRTF,XREF);
4671
4672         case KEY_prototype:
4673             UNI(OP_PROTOTYPE);
4674
4675         case KEY_push:
4676             LOP(OP_PUSH,XTERM);
4677
4678         case KEY_pop:
4679             UNI(OP_POP);
4680
4681         case KEY_pos:
4682             UNI(OP_POS);
4683         
4684         case KEY_pack:
4685             LOP(OP_PACK,XTERM);
4686
4687         case KEY_package:
4688             s = force_word(s,WORD,FALSE,TRUE,FALSE);
4689             OPERATOR(PACKAGE);
4690
4691         case KEY_pipe:
4692             LOP(OP_PIPE_OP,XTERM);
4693
4694         case KEY_q:
4695             s = scan_str(s,FALSE,FALSE);
4696             if (!s)
4697                 missingterm((char*)0);
4698             yylval.ival = OP_CONST;
4699             TERM(sublex_start());
4700
4701         case KEY_quotemeta:
4702             UNI(OP_QUOTEMETA);
4703
4704         case KEY_qw:
4705             s = scan_str(s,FALSE,FALSE);
4706             if (!s)
4707                 missingterm((char*)0);
4708             force_next(')');
4709             if (SvCUR(PL_lex_stuff)) {
4710                 OP *words = Nullop;
4711                 int warned = 0;
4712                 d = SvPV_force(PL_lex_stuff, len);
4713                 while (len) {
4714                     SV *sv;
4715                     for (; isSPACE(*d) && len; --len, ++d) ;
4716                     if (len) {
4717                         char *b = d;
4718                         if (!warned && ckWARN(WARN_QW)) {
4719                             for (; !isSPACE(*d) && len; --len, ++d) {
4720                                 if (*d == ',') {
4721                                     Perl_warner(aTHX_ packWARN(WARN_QW),
4722                                         "Possible attempt to separate words with commas");
4723                                     ++warned;
4724                                 }
4725                                 else if (*d == '#') {
4726                                     Perl_warner(aTHX_ packWARN(WARN_QW),
4727                                         "Possible attempt to put comments in qw() list");
4728                                     ++warned;
4729                                 }
4730                             }
4731                         }
4732                         else {
4733                             for (; !isSPACE(*d) && len; --len, ++d) ;
4734                         }
4735                         sv = newSVpvn(b, d-b);
4736                         if (DO_UTF8(PL_lex_stuff))
4737                             SvUTF8_on(sv);
4738                         words = append_elem(OP_LIST, words,
4739                                             newSVOP(OP_CONST, 0, tokeq(sv)));
4740                     }
4741                 }
4742                 if (words) {
4743                     PL_nextval[PL_nexttoke].opval = words;
4744                     force_next(THING);
4745                 }
4746             }
4747             if (PL_lex_stuff) {
4748                 SvREFCNT_dec(PL_lex_stuff);
4749                 PL_lex_stuff = Nullsv;
4750             }
4751             PL_expect = XTERM;
4752             TOKEN('(');
4753
4754         case KEY_qq:
4755             s = scan_str(s,FALSE,FALSE);
4756             if (!s)
4757                 missingterm((char*)0);
4758             yylval.ival = OP_STRINGIFY;
4759             if (SvIVX(PL_lex_stuff) == '\'')
4760                 SvIVX(PL_lex_stuff) = 0;        /* qq'$foo' should intepolate */
4761             TERM(sublex_start());
4762
4763         case KEY_qr:
4764             s = scan_pat(s,OP_QR);
4765             TERM(sublex_start());
4766
4767         case KEY_qx:
4768             s = scan_str(s,FALSE,FALSE);
4769             if (!s)
4770                 missingterm((char*)0);
4771             yylval.ival = OP_BACKTICK;
4772             set_csh();
4773             TERM(sublex_start());
4774
4775         case KEY_return:
4776             OLDLOP(OP_RETURN);
4777
4778         case KEY_require:
4779             s = skipspace(s);
4780             if (isDIGIT(*s)) {
4781                 s = force_version(s, FALSE);
4782             }
4783             else if (*s != 'v' || !isDIGIT(s[1])
4784                     || (s = force_version(s, TRUE), *s == 'v'))
4785             {
4786                 *PL_tokenbuf = '\0';
4787                 s = force_word(s,WORD,TRUE,TRUE,FALSE);
4788                 if (isIDFIRST_lazy_if(PL_tokenbuf,UTF))
4789                     gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf), TRUE);
4790                 else if (*s == '<')
4791                     yyerror("<> should be quotes");
4792             }
4793             UNI(OP_REQUIRE);
4794
4795         case KEY_reset:
4796             UNI(OP_RESET);
4797
4798         case KEY_redo:
4799             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4800             LOOPX(OP_REDO);
4801
4802         case KEY_rename:
4803             LOP(OP_RENAME,XTERM);
4804
4805         case KEY_rand:
4806             UNI(OP_RAND);
4807
4808         case KEY_rmdir:
4809             UNI(OP_RMDIR);
4810
4811         case KEY_rindex:
4812             LOP(OP_RINDEX,XTERM);
4813
4814         case KEY_read:
4815             LOP(OP_READ,XTERM);
4816
4817         case KEY_readdir:
4818             UNI(OP_READDIR);
4819
4820         case KEY_readline:
4821             set_csh();
4822             UNI(OP_READLINE);
4823
4824         case KEY_readpipe:
4825             set_csh();
4826             UNI(OP_BACKTICK);
4827
4828         case KEY_rewinddir:
4829             UNI(OP_REWINDDIR);
4830
4831         case KEY_recv:
4832             LOP(OP_RECV,XTERM);
4833
4834         case KEY_reverse:
4835             LOP(OP_REVERSE,XTERM);
4836
4837         case KEY_readlink:
4838             UNI(OP_READLINK);
4839
4840         case KEY_ref:
4841             UNI(OP_REF);
4842
4843         case KEY_s:
4844             s = scan_subst(s);
4845             if (yylval.opval)
4846                 TERM(sublex_start());
4847             else
4848                 TOKEN(1);       /* force error */
4849
4850         case KEY_chomp:
4851             UNI(OP_CHOMP);
4852         
4853         case KEY_scalar:
4854             UNI(OP_SCALAR);
4855
4856         case KEY_select:
4857             LOP(OP_SELECT,XTERM);
4858
4859         case KEY_seek:
4860             LOP(OP_SEEK,XTERM);
4861
4862         case KEY_semctl:
4863             LOP(OP_SEMCTL,XTERM);
4864
4865         case KEY_semget:
4866             LOP(OP_SEMGET,XTERM);
4867
4868         case KEY_semop:
4869             LOP(OP_SEMOP,XTERM);
4870
4871         case KEY_send:
4872             LOP(OP_SEND,XTERM);
4873
4874         case KEY_setpgrp:
4875             LOP(OP_SETPGRP,XTERM);
4876
4877         case KEY_setpriority:
4878             LOP(OP_SETPRIORITY,XTERM);
4879
4880         case KEY_sethostent:
4881             UNI(OP_SHOSTENT);
4882
4883         case KEY_setnetent:
4884             UNI(OP_SNETENT);
4885
4886         case KEY_setservent:
4887             UNI(OP_SSERVENT);
4888
4889         case KEY_setprotoent:
4890             UNI(OP_SPROTOENT);
4891
4892         case KEY_setpwent:
4893             FUN0(OP_SPWENT);
4894
4895         case KEY_setgrent:
4896             FUN0(OP_SGRENT);
4897
4898         case KEY_seekdir:
4899             LOP(OP_SEEKDIR,XTERM);
4900
4901         case KEY_setsockopt:
4902             LOP(OP_SSOCKOPT,XTERM);
4903
4904         case KEY_shift:
4905             UNI(OP_SHIFT);
4906
4907         case KEY_shmctl:
4908             LOP(OP_SHMCTL,XTERM);
4909
4910         case KEY_shmget:
4911             LOP(OP_SHMGET,XTERM);
4912
4913         case KEY_shmread:
4914             LOP(OP_SHMREAD,XTERM);
4915
4916         case KEY_shmwrite:
4917             LOP(OP_SHMWRITE,XTERM);
4918
4919         case KEY_shutdown:
4920             LOP(OP_SHUTDOWN,XTERM);
4921
4922         case KEY_sin:
4923             UNI(OP_SIN);
4924
4925         case KEY_sleep:
4926             UNI(OP_SLEEP);
4927
4928         case KEY_socket:
4929             LOP(OP_SOCKET,XTERM);
4930
4931         case KEY_socketpair:
4932             LOP(OP_SOCKPAIR,XTERM);
4933
4934         case KEY_sort:
4935             checkcomma(s,PL_tokenbuf,"subroutine name");
4936             s = skipspace(s);
4937             if (*s == ';' || *s == ')')         /* probably a close */
4938                 Perl_croak(aTHX_ "sort is now a reserved word");
4939             PL_expect = XTERM;
4940             s = force_word(s,WORD,TRUE,TRUE,FALSE);
4941             LOP(OP_SORT,XREF);
4942
4943         case KEY_split:
4944             LOP(OP_SPLIT,XTERM);
4945
4946         case KEY_sprintf:
4947             LOP(OP_SPRINTF,XTERM);
4948
4949         case KEY_splice:
4950             LOP(OP_SPLICE,XTERM);
4951
4952         case KEY_sqrt:
4953             UNI(OP_SQRT);
4954
4955         case KEY_srand:
4956             UNI(OP_SRAND);
4957
4958         case KEY_stat:
4959             UNI(OP_STAT);
4960
4961         case KEY_study:
4962             UNI(OP_STUDY);
4963
4964         case KEY_substr:
4965             LOP(OP_SUBSTR,XTERM);
4966
4967         case KEY_format:
4968         case KEY_sub:
4969           really_sub:
4970             {
4971                 char tmpbuf[sizeof PL_tokenbuf];
4972                 SSize_t tboffset = 0;
4973                 expectation attrful;
4974                 bool have_name, have_proto, bad_proto;
4975                 int key = tmp;
4976
4977                 s = skipspace(s);
4978
4979                 if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' ||
4980                     (*s == ':' && s[1] == ':'))
4981                 {
4982                     PL_expect = XBLOCK;
4983                     attrful = XATTRBLOCK;
4984                     /* remember buffer pos'n for later force_word */
4985                     tboffset = s - PL_oldbufptr;
4986                     d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
4987                     if (strchr(tmpbuf, ':'))
4988                         sv_setpv(PL_subname, tmpbuf);
4989                     else {
4990                         sv_setsv(PL_subname,PL_curstname);
4991                         sv_catpvn(PL_subname,"::",2);
4992                         sv_catpvn(PL_subname,tmpbuf,len);
4993                     }
4994                     s = skipspace(d);
4995                     have_name = TRUE;
4996                 }
4997                 else {
4998                     if (key == KEY_my)
4999                         Perl_croak(aTHX_ "Missing name in \"my sub\"");
5000                     PL_expect = XTERMBLOCK;
5001                     attrful = XATTRTERM;
5002                     sv_setpv(PL_subname,"?");
5003                     have_name = FALSE;
5004                 }
5005
5006                 if (key == KEY_format) {
5007                     if (*s == '=')
5008                         PL_lex_formbrack = PL_lex_brackets + 1;
5009                     if (have_name)
5010                         (void) force_word(PL_oldbufptr + tboffset, WORD,
5011                                           FALSE, TRUE, TRUE);
5012                     OPERATOR(FORMAT);
5013                 }
5014
5015                 /* Look for a prototype */
5016                 if (*s == '(') {
5017                     char *p;
5018
5019                     s = scan_str(s,FALSE,FALSE);
5020                     if (!s)
5021                         Perl_croak(aTHX_ "Prototype not terminated");
5022                     /* strip spaces and check for bad characters */
5023                     d = SvPVX(PL_lex_stuff);
5024                     tmp = 0;
5025                     bad_proto = FALSE;
5026                     for (p = d; *p; ++p) {
5027                         if (!isSPACE(*p)) {
5028                             d[tmp++] = *p;
5029                             if (!strchr("$@%*;[]&\\", *p))
5030                                 bad_proto = TRUE;
5031                         }
5032                     }
5033                     d[tmp] = '\0';
5034                     if (bad_proto && ckWARN(WARN_SYNTAX))
5035                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5036                                     "Illegal character in prototype for %s : %s",
5037                                     SvPVX(PL_subname), d);
5038                     SvCUR(PL_lex_stuff) = tmp;
5039                     have_proto = TRUE;
5040
5041                     s = skipspace(s);
5042                 }
5043                 else
5044                     have_proto = FALSE;
5045
5046                 if (*s == ':' && s[1] != ':')
5047                     PL_expect = attrful;
5048                 else if (!have_name && *s != '{' && key == KEY_sub)
5049                     Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine");
5050
5051                 if (have_proto) {
5052                     PL_nextval[PL_nexttoke].opval =
5053                         (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
5054                     PL_lex_stuff = Nullsv;
5055                     force_next(THING);
5056                 }
5057                 if (!have_name) {
5058                     sv_setpv(PL_subname,
5059                         PL_curstash ? "__ANON__" : "__ANON__::__ANON__");
5060                     TOKEN(ANONSUB);
5061                 }
5062                 (void) force_word(PL_oldbufptr + tboffset, WORD,
5063                                   FALSE, TRUE, TRUE);
5064                 if (key == KEY_my)
5065                     TOKEN(MYSUB);
5066                 TOKEN(SUB);
5067             }
5068
5069         case KEY_system:
5070             set_csh();
5071             LOP(OP_SYSTEM,XREF);
5072
5073         case KEY_symlink:
5074             LOP(OP_SYMLINK,XTERM);
5075
5076         case KEY_syscall:
5077             LOP(OP_SYSCALL,XTERM);
5078
5079         case KEY_sysopen:
5080             LOP(OP_SYSOPEN,XTERM);
5081
5082         case KEY_sysseek:
5083             LOP(OP_SYSSEEK,XTERM);
5084
5085         case KEY_sysread:
5086             LOP(OP_SYSREAD,XTERM);
5087
5088         case KEY_syswrite:
5089             LOP(OP_SYSWRITE,XTERM);
5090
5091         case KEY_tr:
5092             s = scan_trans(s);
5093             TERM(sublex_start());
5094
5095         case KEY_tell:
5096             UNI(OP_TELL);
5097
5098         case KEY_telldir:
5099             UNI(OP_TELLDIR);
5100
5101         case KEY_tie:
5102             LOP(OP_TIE,XTERM);
5103
5104         case KEY_tied:
5105             UNI(OP_TIED);
5106
5107         case KEY_time:
5108             FUN0(OP_TIME);
5109
5110         case KEY_times:
5111             FUN0(OP_TMS);
5112
5113         case KEY_truncate:
5114             LOP(OP_TRUNCATE,XTERM);
5115
5116         case KEY_uc:
5117             UNI(OP_UC);
5118
5119         case KEY_ucfirst:
5120             UNI(OP_UCFIRST);
5121
5122         case KEY_untie:
5123             UNI(OP_UNTIE);
5124
5125         case KEY_until:
5126             yylval.ival = CopLINE(PL_curcop);
5127             OPERATOR(UNTIL);
5128
5129         case KEY_unless:
5130             yylval.ival = CopLINE(PL_curcop);
5131             OPERATOR(UNLESS);
5132
5133         case KEY_unlink:
5134             LOP(OP_UNLINK,XTERM);
5135
5136         case KEY_undef:
5137             UNI(OP_UNDEF);
5138
5139         case KEY_unpack:
5140             LOP(OP_UNPACK,XTERM);
5141
5142         case KEY_utime:
5143             LOP(OP_UTIME,XTERM);
5144
5145         case KEY_umask:
5146             UNI(OP_UMASK);
5147
5148         case KEY_unshift:
5149             LOP(OP_UNSHIFT,XTERM);
5150
5151         case KEY_use:
5152             if (PL_expect != XSTATE)
5153                 yyerror("\"use\" not allowed in expression");
5154             s = skipspace(s);
5155             if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
5156                 s = force_version(s, TRUE);
5157                 if (*s == ';' || (s = skipspace(s), *s == ';')) {
5158                     PL_nextval[PL_nexttoke].opval = Nullop;
5159                     force_next(WORD);
5160                 }
5161                 else if (*s == 'v') {
5162                     s = force_word(s,WORD,FALSE,TRUE,FALSE);
5163                     s = force_version(s, FALSE);
5164                 }
5165             }
5166             else {
5167                 s = force_word(s,WORD,FALSE,TRUE,FALSE);
5168                 s = force_version(s, FALSE);
5169             }
5170             yylval.ival = 1;
5171             OPERATOR(USE);
5172
5173         case KEY_values:
5174             UNI(OP_VALUES);
5175
5176         case KEY_vec:
5177             LOP(OP_VEC,XTERM);
5178
5179         case KEY_while:
5180             yylval.ival = CopLINE(PL_curcop);
5181             OPERATOR(WHILE);
5182
5183         case KEY_warn:
5184             PL_hints |= HINT_BLOCK_SCOPE;
5185             LOP(OP_WARN,XTERM);
5186
5187         case KEY_wait:
5188             FUN0(OP_WAIT);
5189
5190         case KEY_waitpid:
5191             LOP(OP_WAITPID,XTERM);
5192
5193         case KEY_wantarray:
5194             FUN0(OP_WANTARRAY);
5195
5196         case KEY_write:
5197 #ifdef EBCDIC
5198         {
5199             char ctl_l[2];
5200             ctl_l[0] = toCTRL('L');
5201             ctl_l[1] = '\0';
5202             gv_fetchpv(ctl_l,TRUE, SVt_PV);
5203         }
5204 #else
5205             gv_fetchpv("\f",TRUE, SVt_PV);      /* Make sure $^L is defined */
5206 #endif
5207             UNI(OP_ENTERWRITE);
5208
5209         case KEY_x:
5210             if (PL_expect == XOPERATOR)
5211                 Mop(OP_REPEAT);
5212             check_uni();
5213             goto just_a_word;
5214
5215         case KEY_xor:
5216             yylval.ival = OP_XOR;
5217             OPERATOR(OROP);
5218
5219         case KEY_y:
5220             s = scan_trans(s);
5221             TERM(sublex_start());
5222         }
5223     }}
5224 }
5225 #ifdef __SC__
5226 #pragma segment Main
5227 #endif
5228
5229 static int
5230 S_pending_ident(pTHX)
5231 {
5232     register char *d;
5233     register I32 tmp = 0;
5234     /* pit holds the identifier we read and pending_ident is reset */
5235     char pit = PL_pending_ident;
5236     PL_pending_ident = 0;
5237
5238     DEBUG_T({ PerlIO_printf(Perl_debug_log,
5239           "### Tokener saw identifier '%s'\n", PL_tokenbuf); });
5240
5241     /* if we're in a my(), we can't allow dynamics here.
5242        $foo'bar has already been turned into $foo::bar, so
5243        just check for colons.
5244
5245        if it's a legal name, the OP is a PADANY.
5246     */
5247     if (PL_in_my) {
5248         if (PL_in_my == KEY_our) {      /* "our" is merely analogous to "my" */
5249             if (strchr(PL_tokenbuf,':'))
5250                 yyerror(Perl_form(aTHX_ "No package name allowed for "
5251                                   "variable %s in \"our\"",
5252                                   PL_tokenbuf));
5253             tmp = allocmy(PL_tokenbuf);
5254         }
5255         else {
5256             if (strchr(PL_tokenbuf,':'))
5257                 yyerror(Perl_form(aTHX_ PL_no_myglob,PL_tokenbuf));
5258
5259             yylval.opval = newOP(OP_PADANY, 0);
5260             yylval.opval->op_targ = allocmy(PL_tokenbuf);
5261             return PRIVATEREF;
5262         }
5263     }
5264
5265     /*
5266        build the ops for accesses to a my() variable.
5267
5268        Deny my($a) or my($b) in a sort block, *if* $a or $b is
5269        then used in a comparison.  This catches most, but not
5270        all cases.  For instance, it catches
5271            sort { my($a); $a <=> $b }
5272        but not
5273            sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
5274        (although why you'd do that is anyone's guess).
5275     */
5276
5277     if (!strchr(PL_tokenbuf,':')) {
5278 #ifdef USE_5005THREADS
5279         /* Check for single character per-thread SVs */
5280         if (PL_tokenbuf[0] == '$' && PL_tokenbuf[2] == '\0'
5281             && !isALPHA(PL_tokenbuf[1]) /* Rule out obvious non-threadsvs */
5282             && (tmp = find_threadsv(&PL_tokenbuf[1])) != NOT_IN_PAD)
5283         {
5284             yylval.opval = newOP(OP_THREADSV, 0);
5285             yylval.opval->op_targ = tmp;
5286             return PRIVATEREF;
5287         }
5288 #endif /* USE_5005THREADS */
5289         if (!PL_in_my)
5290             tmp = pad_findmy(PL_tokenbuf);
5291         if (tmp != NOT_IN_PAD) {
5292             /* might be an "our" variable" */
5293             if (PAD_COMPNAME_FLAGS(tmp) & SVpad_OUR) {
5294                 /* build ops for a bareword */
5295                 SV *sym = newSVpv(HvNAME(PAD_COMPNAME_OURSTASH(tmp)), 0);
5296                 sv_catpvn(sym, "::", 2);
5297                 sv_catpv(sym, PL_tokenbuf+1);
5298                 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
5299                 yylval.opval->op_private = OPpCONST_ENTERED;
5300                 gv_fetchpv(SvPVX(sym),
5301                     (PL_in_eval
5302                         ? (GV_ADDMULTI | GV_ADDINEVAL)
5303                         : GV_ADDMULTI
5304                     ),
5305                     ((PL_tokenbuf[0] == '$') ? SVt_PV
5306                      : (PL_tokenbuf[0] == '@') ? SVt_PVAV
5307                      : SVt_PVHV));
5308                 return WORD;
5309             }
5310
5311             /* if it's a sort block and they're naming $a or $b */
5312             if (PL_last_lop_op == OP_SORT &&
5313                 PL_tokenbuf[0] == '$' &&
5314                 (PL_tokenbuf[1] == 'a' || PL_tokenbuf[1] == 'b')
5315                 && !PL_tokenbuf[2])
5316             {
5317                 for (d = PL_in_eval ? PL_oldoldbufptr : PL_linestart;
5318                      d < PL_bufend && *d != '\n';
5319                      d++)
5320                 {
5321                     if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
5322                         Perl_croak(aTHX_ "Can't use \"my %s\" in sort comparison",
5323                               PL_tokenbuf);
5324                     }
5325                 }
5326             }
5327
5328             yylval.opval = newOP(OP_PADANY, 0);
5329             yylval.opval->op_targ = tmp;
5330             return PRIVATEREF;
5331         }
5332     }
5333
5334     /*
5335        Whine if they've said @foo in a doublequoted string,
5336        and @foo isn't a variable we can find in the symbol
5337        table.
5338     */
5339     if (pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
5340         GV *gv = gv_fetchpv(PL_tokenbuf+1, FALSE, SVt_PVAV);
5341         if ((!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
5342              && ckWARN(WARN_AMBIGUOUS))
5343         {
5344             /* Downgraded from fatal to warning 20000522 mjd */
5345             Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
5346                         "Possible unintended interpolation of %s in string",
5347                          PL_tokenbuf);
5348         }
5349     }
5350
5351     /* build ops for a bareword */
5352     yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(PL_tokenbuf+1, 0));
5353     yylval.opval->op_private = OPpCONST_ENTERED;
5354     gv_fetchpv(PL_tokenbuf+1, PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : TRUE,
5355                ((PL_tokenbuf[0] == '$') ? SVt_PV
5356                 : (PL_tokenbuf[0] == '@') ? SVt_PVAV
5357                 : SVt_PVHV));
5358     return WORD;
5359 }
5360
5361 I32
5362 Perl_keyword(pTHX_ register char *d, I32 len)
5363 {
5364     switch (*d) {
5365     case '_':
5366         if (d[1] == '_') {
5367             if (strEQ(d,"__FILE__"))            return -KEY___FILE__;
5368             if (strEQ(d,"__LINE__"))            return -KEY___LINE__;
5369             if (strEQ(d,"__PACKAGE__"))         return -KEY___PACKAGE__;
5370             if (strEQ(d,"__DATA__"))            return KEY___DATA__;
5371             if (strEQ(d,"__END__"))             return KEY___END__;
5372         }
5373         break;
5374     case 'A':
5375         if (strEQ(d,"AUTOLOAD"))                return KEY_AUTOLOAD;
5376         break;
5377     case 'a':
5378         switch (len) {
5379         case 3:
5380             if (strEQ(d,"and"))                 return -KEY_and;
5381             if (strEQ(d,"abs"))                 return -KEY_abs;
5382             break;
5383         case 5:
5384             if (strEQ(d,"alarm"))               return -KEY_alarm;
5385             if (strEQ(d,"atan2"))               return -KEY_atan2;
5386             break;
5387         case 6:
5388             if (strEQ(d,"accept"))              return -KEY_accept;
5389             break;
5390         }
5391         break;
5392     case 'B':
5393         if (strEQ(d,"BEGIN"))                   return KEY_BEGIN;
5394         break;
5395     case 'b':
5396         if (strEQ(d,"bless"))                   return -KEY_bless;
5397         if (strEQ(d,"bind"))                    return -KEY_bind;
5398         if (strEQ(d,"binmode"))                 return -KEY_binmode;
5399         break;
5400     case 'C':
5401         if (strEQ(d,"CORE"))                    return -KEY_CORE;
5402         if (strEQ(d,"CHECK"))                   return KEY_CHECK;
5403         break;
5404     case 'c':
5405         switch (len) {
5406         case 3:
5407             if (strEQ(d,"cmp"))                 return -KEY_cmp;
5408             if (strEQ(d,"chr"))                 return -KEY_chr;
5409             if (strEQ(d,"cos"))                 return -KEY_cos;
5410             break;
5411         case 4:
5412             if (strEQ(d,"chop"))                return -KEY_chop;
5413             break;
5414         case 5:
5415             if (strEQ(d,"close"))               return -KEY_close;
5416             if (strEQ(d,"chdir"))               return -KEY_chdir;
5417             if (strEQ(d,"chomp"))               return -KEY_chomp;
5418             if (strEQ(d,"chmod"))               return -KEY_chmod;
5419             if (strEQ(d,"chown"))               return -KEY_chown;
5420             if (strEQ(d,"crypt"))               return -KEY_crypt;
5421             break;
5422         case 6:
5423             if (strEQ(d,"chroot"))              return -KEY_chroot;
5424             if (strEQ(d,"caller"))              return -KEY_caller;
5425             break;
5426         case 7:
5427             if (strEQ(d,"connect"))             return -KEY_connect;
5428             break;
5429         case 8:
5430             if (strEQ(d,"closedir"))            return -KEY_closedir;
5431             if (strEQ(d,"continue"))            return -KEY_continue;
5432             break;
5433         }
5434         break;
5435     case 'D':
5436         if (strEQ(d,"DESTROY"))                 return KEY_DESTROY;
5437         break;
5438     case 'd':
5439         switch (len) {
5440         case 2:
5441             if (strEQ(d,"do"))                  return KEY_do;
5442             break;
5443         case 3:
5444             if (strEQ(d,"die"))                 return -KEY_die;
5445             break;
5446         case 4:
5447             if (strEQ(d,"dump"))                return -KEY_dump;
5448             break;
5449         case 6:
5450             if (strEQ(d,"delete"))              return KEY_delete;
5451             break;
5452         case 7:
5453             if (strEQ(d,"defined"))             return KEY_defined;
5454             if (strEQ(d,"dbmopen"))             return -KEY_dbmopen;
5455             break;
5456         case 8:
5457             if (strEQ(d,"dbmclose"))            return -KEY_dbmclose;
5458             break;
5459         }
5460         break;
5461     case 'E':
5462         if (strEQ(d,"END"))                     return KEY_END;
5463         break;
5464     case 'e':
5465         switch (len) {
5466         case 2:
5467             if (strEQ(d,"eq"))                  return -KEY_eq;
5468             break;
5469         case 3:
5470             if (strEQ(d,"eof"))                 return -KEY_eof;
5471             if (strEQ(d,"exp"))                 return -KEY_exp;
5472             break;
5473         case 4:
5474             if (strEQ(d,"else"))                return KEY_else;
5475             if (strEQ(d,"exit"))                return -KEY_exit;
5476             if (strEQ(d,"eval"))                return KEY_eval;
5477             if (strEQ(d,"exec"))                return -KEY_exec;
5478            if (strEQ(d,"each"))                return -KEY_each;
5479             break;
5480         case 5:
5481             if (strEQ(d,"elsif"))               return KEY_elsif;
5482             break;
5483         case 6:
5484             if (strEQ(d,"exists"))              return KEY_exists;
5485             if (strEQ(d,"elseif")) Perl_warn(aTHX_ "elseif should be elsif");
5486             break;
5487         case 8:
5488             if (strEQ(d,"endgrent"))            return -KEY_endgrent;
5489             if (strEQ(d,"endpwent"))            return -KEY_endpwent;
5490             break;
5491         case 9:
5492             if (strEQ(d,"endnetent"))           return -KEY_endnetent;
5493             break;
5494         case 10:
5495             if (strEQ(d,"endhostent"))          return -KEY_endhostent;
5496             if (strEQ(d,"endservent"))          return -KEY_endservent;
5497             break;
5498         case 11:
5499             if (strEQ(d,"endprotoent"))         return -KEY_endprotoent;
5500             break;
5501         }
5502         break;
5503     case 'f':
5504         switch (len) {
5505         case 3:
5506             if (strEQ(d,"for"))                 return KEY_for;
5507             break;
5508         case 4:
5509             if (strEQ(d,"fork"))                return -KEY_fork;
5510             break;
5511         case 5:
5512             if (strEQ(d,"fcntl"))               return -KEY_fcntl;
5513             if (strEQ(d,"flock"))               return -KEY_flock;
5514             break;
5515         case 6:
5516             if (strEQ(d,"format"))              return KEY_format;
5517             if (strEQ(d,"fileno"))              return -KEY_fileno;
5518             break;
5519         case 7:
5520             if (strEQ(d,"foreach"))             return KEY_foreach;
5521             break;
5522         case 8:
5523             if (strEQ(d,"formline"))            return -KEY_formline;
5524             break;
5525         }
5526         break;
5527     case 'g':
5528         if (strnEQ(d,"get",3)) {
5529             d += 3;
5530             if (*d == 'p') {
5531                 switch (len) {
5532                 case 7:
5533                     if (strEQ(d,"ppid"))        return -KEY_getppid;
5534                     if (strEQ(d,"pgrp"))        return -KEY_getpgrp;
5535                     break;
5536                 case 8:
5537                     if (strEQ(d,"pwent"))       return -KEY_getpwent;
5538                     if (strEQ(d,"pwnam"))       return -KEY_getpwnam;
5539                     if (strEQ(d,"pwuid"))       return -KEY_getpwuid;
5540                     break;
5541                 case 11:
5542                     if (strEQ(d,"peername"))    return -KEY_getpeername;
5543                     if (strEQ(d,"protoent"))    return -KEY_getprotoent;
5544                     if (strEQ(d,"priority"))    return -KEY_getpriority;
5545                     break;
5546                 case 14:
5547                     if (strEQ(d,"protobyname")) return -KEY_getprotobyname;
5548                     break;
5549                 case 16:
5550                     if (strEQ(d,"protobynumber"))return -KEY_getprotobynumber;
5551                     break;
5552                 }
5553             }
5554             else if (*d == 'h') {
5555                 if (strEQ(d,"hostbyname"))      return -KEY_gethostbyname;
5556                 if (strEQ(d,"hostbyaddr"))      return -KEY_gethostbyaddr;
5557                 if (strEQ(d,"hostent"))         return -KEY_gethostent;
5558             }
5559             else if (*d == 'n') {
5560                 if (strEQ(d,"netbyname"))       return -KEY_getnetbyname;
5561                 if (strEQ(d,"netbyaddr"))       return -KEY_getnetbyaddr;
5562                 if (strEQ(d,"netent"))          return -KEY_getnetent;
5563             }
5564             else if (*d == 's') {
5565                 if (strEQ(d,"servbyname"))      return -KEY_getservbyname;
5566                 if (strEQ(d,"servbyport"))      return -KEY_getservbyport;
5567                 if (strEQ(d,"servent"))         return -KEY_getservent;
5568                 if (strEQ(d,"sockname"))        return -KEY_getsockname;
5569                 if (strEQ(d,"sockopt"))         return -KEY_getsockopt;
5570             }
5571             else if (*d == 'g') {
5572                 if (strEQ(d,"grent"))           return -KEY_getgrent;
5573                 if (strEQ(d,"grnam"))           return -KEY_getgrnam;
5574                 if (strEQ(d,"grgid"))           return -KEY_getgrgid;
5575             }
5576             else if (*d == 'l') {
5577                 if (strEQ(d,"login"))           return -KEY_getlogin;
5578             }
5579             else if (strEQ(d,"c"))              return -KEY_getc;
5580             break;
5581         }
5582         switch (len) {
5583         case 2:
5584             if (strEQ(d,"gt"))                  return -KEY_gt;
5585             if (strEQ(d,"ge"))                  return -KEY_ge;
5586             break;
5587         case 4:
5588             if (strEQ(d,"grep"))                return KEY_grep;
5589             if (strEQ(d,"goto"))                return KEY_goto;
5590             if (strEQ(d,"glob"))                return KEY_glob;
5591             break;
5592         case 6:
5593             if (strEQ(d,"gmtime"))              return -KEY_gmtime;
5594             break;
5595         }
5596         break;
5597     case 'h':
5598         if (strEQ(d,"hex"))                     return -KEY_hex;
5599         break;
5600     case 'I':
5601         if (strEQ(d,"INIT"))                    return KEY_INIT;
5602         break;
5603     case 'i':
5604         switch (len) {
5605         case 2:
5606             if (strEQ(d,"if"))                  return KEY_if;
5607             break;
5608         case 3:
5609             if (strEQ(d,"int"))                 return -KEY_int;
5610             break;
5611         case 5:
5612             if (strEQ(d,"index"))               return -KEY_index;
5613             if (strEQ(d,"ioctl"))               return -KEY_ioctl;
5614             break;
5615         }
5616         break;
5617     case 'j':
5618         if (strEQ(d,"join"))                    return -KEY_join;
5619         break;
5620     case 'k':
5621         if (len == 4) {
5622            if (strEQ(d,"keys"))                return -KEY_keys;
5623             if (strEQ(d,"kill"))                return -KEY_kill;
5624         }
5625         break;
5626     case 'l':
5627         switch (len) {
5628         case 2:
5629             if (strEQ(d,"lt"))                  return -KEY_lt;
5630             if (strEQ(d,"le"))                  return -KEY_le;
5631             if (strEQ(d,"lc"))                  return -KEY_lc;
5632             break;
5633         case 3:
5634             if (strEQ(d,"log"))                 return -KEY_log;
5635             break;
5636         case 4:
5637             if (strEQ(d,"last"))                return KEY_last;
5638             if (strEQ(d,"link"))                return -KEY_link;
5639             if (strEQ(d,"lock"))                return -KEY_lock;
5640             break;
5641         case 5:
5642             if (strEQ(d,"local"))               return KEY_local;
5643             if (strEQ(d,"lstat"))               return -KEY_lstat;
5644             break;
5645         case 6:
5646             if (strEQ(d,"length"))              return -KEY_length;
5647             if (strEQ(d,"listen"))              return -KEY_listen;
5648             break;
5649         case 7:
5650             if (strEQ(d,"lcfirst"))             return -KEY_lcfirst;
5651             break;
5652         case 9:
5653             if (strEQ(d,"localtime"))           return -KEY_localtime;
5654             break;
5655         }
5656         break;
5657     case 'm':
5658         switch (len) {
5659         case 1:                                 return KEY_m;
5660         case 2:
5661             if (strEQ(d,"my"))                  return KEY_my;
5662             break;
5663         case 3:
5664             if (strEQ(d,"map"))                 return KEY_map;
5665             break;
5666         case 5:
5667             if (strEQ(d,"mkdir"))               return -KEY_mkdir;
5668             break;
5669         case 6:
5670             if (strEQ(d,"msgctl"))              return -KEY_msgctl;
5671             if (strEQ(d,"msgget"))              return -KEY_msgget;
5672             if (strEQ(d,"msgrcv"))              return -KEY_msgrcv;
5673             if (strEQ(d,"msgsnd"))              return -KEY_msgsnd;
5674             break;
5675         }
5676         break;
5677     case 'n':
5678         if (strEQ(d,"next"))                    return KEY_next;
5679         if (strEQ(d,"ne"))                      return -KEY_ne;
5680         if (strEQ(d,"not"))                     return -KEY_not;
5681         if (strEQ(d,"no"))                      return KEY_no;
5682         break;
5683     case 'o':
5684         switch (len) {
5685         case 2:
5686             if (strEQ(d,"or"))                  return -KEY_or;
5687             break;
5688         case 3:
5689             if (strEQ(d,"ord"))                 return -KEY_ord;
5690             if (strEQ(d,"oct"))                 return -KEY_oct;
5691             if (strEQ(d,"our"))                 return KEY_our;
5692             break;
5693         case 4:
5694             if (strEQ(d,"open"))                return -KEY_open;
5695             break;
5696         case 7:
5697             if (strEQ(d,"opendir"))             return -KEY_opendir;
5698             break;
5699         }
5700         break;
5701     case 'p':
5702         switch (len) {
5703         case 3:
5704            if (strEQ(d,"pop"))                 return -KEY_pop;
5705             if (strEQ(d,"pos"))                 return KEY_pos;
5706             break;
5707         case 4:
5708            if (strEQ(d,"push"))                return -KEY_push;
5709             if (strEQ(d,"pack"))                return -KEY_pack;
5710             if (strEQ(d,"pipe"))                return -KEY_pipe;
5711             break;
5712         case 5:
5713             if (strEQ(d,"print"))               return KEY_print;
5714             break;
5715         case 6:
5716             if (strEQ(d,"printf"))              return KEY_printf;
5717             break;
5718         case 7:
5719             if (strEQ(d,"package"))             return KEY_package;
5720             break;
5721         case 9:
5722             if (strEQ(d,"prototype"))           return KEY_prototype;
5723         }
5724         break;
5725     case 'q':
5726         if (len <= 2) {
5727             if (strEQ(d,"q"))                   return KEY_q;
5728             if (strEQ(d,"qr"))                  return KEY_qr;
5729             if (strEQ(d,"qq"))                  return KEY_qq;
5730             if (strEQ(d,"qw"))                  return KEY_qw;
5731             if (strEQ(d,"qx"))                  return KEY_qx;
5732         }
5733         else if (strEQ(d,"quotemeta"))          return -KEY_quotemeta;
5734         break;
5735     case 'r':
5736         switch (len) {
5737         case 3:
5738             if (strEQ(d,"ref"))                 return -KEY_ref;
5739             break;
5740         case 4:
5741             if (strEQ(d,"read"))                return -KEY_read;
5742             if (strEQ(d,"rand"))                return -KEY_rand;
5743             if (strEQ(d,"recv"))                return -KEY_recv;
5744             if (strEQ(d,"redo"))                return KEY_redo;
5745             break;
5746         case 5:
5747             if (strEQ(d,"rmdir"))               return -KEY_rmdir;
5748             if (strEQ(d,"reset"))               return -KEY_reset;
5749             break;
5750         case 6:
5751             if (strEQ(d,"return"))              return KEY_return;
5752             if (strEQ(d,"rename"))              return -KEY_rename;
5753             if (strEQ(d,"rindex"))              return -KEY_rindex;
5754             break;
5755         case 7:
5756             if (strEQ(d,"require"))             return KEY_require;
5757             if (strEQ(d,"reverse"))             return -KEY_reverse;
5758             if (strEQ(d,"readdir"))             return -KEY_readdir;
5759             break;
5760         case 8:
5761             if (strEQ(d,"readlink"))            return -KEY_readlink;
5762             if (strEQ(d,"readline"))            return -KEY_readline;
5763             if (strEQ(d,"readpipe"))            return -KEY_readpipe;
5764             break;
5765         case 9:
5766             if (strEQ(d,"rewinddir"))           return -KEY_rewinddir;
5767             break;
5768         }
5769         break;
5770     case 's':
5771         switch (d[1]) {
5772         case 0:                                 return KEY_s;
5773         case 'c':
5774             if (strEQ(d,"scalar"))              return KEY_scalar;
5775             break;
5776         case 'e':
5777             switch (len) {
5778             case 4:
5779                 if (strEQ(d,"seek"))            return -KEY_seek;
5780                 if (strEQ(d,"send"))            return -KEY_send;
5781                 break;
5782             case 5:
5783                 if (strEQ(d,"semop"))           return -KEY_semop;
5784                 break;
5785             case 6:
5786                 if (strEQ(d,"select"))          return -KEY_select;
5787                 if (strEQ(d,"semctl"))          return -KEY_semctl;
5788                 if (strEQ(d,"semget"))          return -KEY_semget;
5789                 break;
5790             case 7:
5791                 if (strEQ(d,"setpgrp"))         return -KEY_setpgrp;
5792                 if (strEQ(d,"seekdir"))         return -KEY_seekdir;
5793                 break;
5794             case 8:
5795                 if (strEQ(d,"setpwent"))        return -KEY_setpwent;
5796                 if (strEQ(d,"setgrent"))        return -KEY_setgrent;
5797                 break;
5798             case 9:
5799                 if (strEQ(d,"setnetent"))       return -KEY_setnetent;
5800                 break;
5801             case 10:
5802                 if (strEQ(d,"setsockopt"))      return -KEY_setsockopt;
5803                 if (strEQ(d,"sethostent"))      return -KEY_sethostent;
5804                 if (strEQ(d,"setservent"))      return -KEY_setservent;
5805                 break;
5806             case 11:
5807                 if (strEQ(d,"setpriority"))     return -KEY_setpriority;
5808                 if (strEQ(d,"setprotoent"))     return -KEY_setprotoent;
5809                 break;
5810             }
5811             break;
5812         case 'h':
5813             switch (len) {
5814             case 5:
5815                if (strEQ(d,"shift"))           return -KEY_shift;
5816                 break;
5817             case 6:
5818                 if (strEQ(d,"shmctl"))          return -KEY_shmctl;
5819                 if (strEQ(d,"shmget"))          return -KEY_shmget;
5820                 break;
5821             case 7:
5822                 if (strEQ(d,"shmread"))         return -KEY_shmread;
5823                 break;
5824             case 8:
5825                 if (strEQ(d,"shmwrite"))        return -KEY_shmwrite;
5826                 if (strEQ(d,"shutdown"))        return -KEY_shutdown;
5827                 break;
5828             }
5829             break;
5830         case 'i':
5831             if (strEQ(d,"sin"))                 return -KEY_sin;
5832             break;
5833         case 'l':
5834             if (strEQ(d,"sleep"))               return -KEY_sleep;
5835             break;
5836         case 'o':
5837             if (strEQ(d,"sort"))                return KEY_sort;
5838             if (strEQ(d,"socket"))              return -KEY_socket;
5839             if (strEQ(d,"socketpair"))          return -KEY_socketpair;
5840             break;
5841         case 'p':
5842             if (strEQ(d,"split"))               return KEY_split;
5843             if (strEQ(d,"sprintf"))             return -KEY_sprintf;
5844            if (strEQ(d,"splice"))              return -KEY_splice;
5845             break;
5846         case 'q':
5847             if (strEQ(d,"sqrt"))                return -KEY_sqrt;
5848             break;
5849         case 'r':
5850             if (strEQ(d,"srand"))               return -KEY_srand;
5851             break;
5852         case 't':
5853             if (strEQ(d,"stat"))                return -KEY_stat;
5854             if (strEQ(d,"study"))               return KEY_study;
5855             break;
5856         case 'u':
5857             if (strEQ(d,"substr"))              return -KEY_substr;
5858             if (strEQ(d,"sub"))                 return KEY_sub;
5859             break;
5860         case 'y':
5861             switch (len) {
5862             case 6:
5863                 if (strEQ(d,"system"))          return -KEY_system;
5864                 break;
5865             case 7:
5866                 if (strEQ(d,"symlink"))         return -KEY_symlink;
5867                 if (strEQ(d,"syscall"))         return -KEY_syscall;
5868                 if (strEQ(d,"sysopen"))         return -KEY_sysopen;
5869                 if (strEQ(d,"sysread"))         return -KEY_sysread;
5870                 if (strEQ(d,"sysseek"))         return -KEY_sysseek;
5871                 break;
5872             case 8:
5873                 if (strEQ(d,"syswrite"))        return -KEY_syswrite;
5874                 break;
5875             }
5876             break;
5877         }
5878         break;
5879     case 't':
5880         switch (len) {
5881         case 2:
5882             if (strEQ(d,"tr"))                  return KEY_tr;
5883             break;
5884         case 3:
5885             if (strEQ(d,"tie"))                 return KEY_tie;
5886             break;
5887         case 4:
5888             if (strEQ(d,"tell"))                return -KEY_tell;
5889             if (strEQ(d,"tied"))                return KEY_tied;
5890             if (strEQ(d,"time"))                return -KEY_time;
5891             break;
5892         case 5:
5893             if (strEQ(d,"times"))               return -KEY_times;
5894             break;
5895         case 7:
5896             if (strEQ(d,"telldir"))             return -KEY_telldir;
5897             break;
5898         case 8:
5899             if (strEQ(d,"truncate"))            return -KEY_truncate;
5900             break;
5901         }
5902         break;
5903     case 'u':
5904         switch (len) {
5905         case 2:
5906             if (strEQ(d,"uc"))                  return -KEY_uc;
5907             break;
5908         case 3:
5909             if (strEQ(d,"use"))                 return KEY_use;
5910             break;
5911         case 5:
5912             if (strEQ(d,"undef"))               return KEY_undef;
5913             if (strEQ(d,"until"))               return KEY_until;
5914             if (strEQ(d,"untie"))               return KEY_untie;
5915             if (strEQ(d,"utime"))               return -KEY_utime;
5916             if (strEQ(d,"umask"))               return -KEY_umask;
5917             break;
5918         case 6:
5919             if (strEQ(d,"unless"))              return KEY_unless;
5920             if (strEQ(d,"unpack"))              return -KEY_unpack;
5921             if (strEQ(d,"unlink"))              return -KEY_unlink;
5922             break;
5923         case 7:
5924            if (strEQ(d,"unshift"))             return -KEY_unshift;
5925             if (strEQ(d,"ucfirst"))             return -KEY_ucfirst;
5926             break;
5927         }
5928         break;
5929     case 'v':
5930         if (strEQ(d,"values"))                  return -KEY_values;
5931         if (strEQ(d,"vec"))                     return -KEY_vec;
5932         break;
5933     case 'w':
5934         switch (len) {
5935         case 4:
5936             if (strEQ(d,"warn"))                return -KEY_warn;
5937             if (strEQ(d,"wait"))                return -KEY_wait;
5938             break;
5939         case 5:
5940             if (strEQ(d,"while"))               return KEY_while;
5941             if (strEQ(d,"write"))               return -KEY_write;
5942             break;
5943         case 7:
5944             if (strEQ(d,"waitpid"))             return -KEY_waitpid;
5945             break;
5946         case 9:
5947             if (strEQ(d,"wantarray"))           return -KEY_wantarray;
5948             break;
5949         }
5950         break;
5951     case 'x':
5952         if (len == 1)                           return -KEY_x;
5953         if (strEQ(d,"xor"))                     return -KEY_xor;
5954         break;
5955     case 'y':
5956         if (len == 1)                           return KEY_y;
5957         break;
5958     case 'z':
5959         break;
5960     }
5961     return 0;
5962 }
5963
5964 STATIC void
5965 S_checkcomma(pTHX_ register char *s, char *name, char *what)
5966 {
5967     char *w;
5968
5969     if (*s == ' ' && s[1] == '(') {     /* XXX gotta be a better way */
5970         if (ckWARN(WARN_SYNTAX)) {
5971             int level = 1;
5972             for (w = s+2; *w && level; w++) {
5973                 if (*w == '(')
5974                     ++level;
5975                 else if (*w == ')')
5976                     --level;
5977             }
5978             if (*w)
5979                 for (; *w && isSPACE(*w); w++) ;
5980             if (!*w || !strchr(";|})]oaiuw!=", *w))     /* an advisory hack only... */
5981                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5982                             "%s (...) interpreted as function",name);
5983         }
5984     }
5985     while (s < PL_bufend && isSPACE(*s))
5986         s++;
5987     if (*s == '(')
5988         s++;
5989     while (s < PL_bufend && isSPACE(*s))
5990         s++;
5991     if (isIDFIRST_lazy_if(s,UTF)) {
5992         w = s++;
5993         while (isALNUM_lazy_if(s,UTF))
5994             s++;
5995         while (s < PL_bufend && isSPACE(*s))
5996             s++;
5997         if (*s == ',') {
5998             int kw;
5999             *s = '\0';
6000             kw = keyword(w, s - w) || get_cv(w, FALSE) != 0;
6001             *s = ',';
6002             if (kw)
6003                 return;
6004             Perl_croak(aTHX_ "No comma allowed after %s", what);
6005         }
6006     }
6007 }
6008
6009 /* Either returns sv, or mortalizes sv and returns a new SV*.
6010    Best used as sv=new_constant(..., sv, ...).
6011    If s, pv are NULL, calls subroutine with one argument,
6012    and type is used with error messages only. */
6013
6014 STATIC SV *
6015 S_new_constant(pTHX_ char *s, STRLEN len, const char *key, SV *sv, SV *pv,
6016                const char *type)
6017 {
6018     dSP;
6019     HV *table = GvHV(PL_hintgv);                 /* ^H */
6020     SV *res;
6021     SV **cvp;
6022     SV *cv, *typesv;
6023     const char *why1, *why2, *why3;
6024
6025     if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
6026         SV *msg;
6027         
6028         why2 = strEQ(key,"charnames")
6029                ? "(possibly a missing \"use charnames ...\")"
6030                : "";
6031         msg = Perl_newSVpvf(aTHX_ "Constant(%s) unknown: %s",
6032                             (type ? type: "undef"), why2);
6033
6034         /* This is convoluted and evil ("goto considered harmful")
6035          * but I do not understand the intricacies of all the different
6036          * failure modes of %^H in here.  The goal here is to make
6037          * the most probable error message user-friendly. --jhi */
6038
6039         goto msgdone;
6040
6041     report:
6042         msg = Perl_newSVpvf(aTHX_ "Constant(%s): %s%s%s",
6043                             (type ? type: "undef"), why1, why2, why3);
6044     msgdone:
6045         yyerror(SvPVX(msg));
6046         SvREFCNT_dec(msg);
6047         return sv;
6048     }
6049     cvp = hv_fetch(table, key, strlen(key), FALSE);
6050     if (!cvp || !SvOK(*cvp)) {
6051         why1 = "$^H{";
6052         why2 = key;
6053         why3 = "} is not defined";
6054         goto report;
6055     }
6056     sv_2mortal(sv);                     /* Parent created it permanently */
6057     cv = *cvp;
6058     if (!pv && s)
6059         pv = sv_2mortal(newSVpvn(s, len));
6060     if (type && pv)
6061         typesv = sv_2mortal(newSVpv(type, 0));
6062     else
6063         typesv = &PL_sv_undef;
6064
6065     PUSHSTACKi(PERLSI_OVERLOAD);
6066     ENTER ;
6067     SAVETMPS;
6068
6069     PUSHMARK(SP) ;
6070     EXTEND(sp, 3);
6071     if (pv)
6072         PUSHs(pv);
6073     PUSHs(sv);
6074     if (pv)
6075         PUSHs(typesv);
6076     PUTBACK;
6077     call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
6078
6079     SPAGAIN ;
6080
6081     /* Check the eval first */
6082     if (!PL_in_eval && SvTRUE(ERRSV)) {
6083         STRLEN n_a;
6084         sv_catpv(ERRSV, "Propagated");
6085         yyerror(SvPV(ERRSV, n_a)); /* Duplicates the message inside eval */
6086         (void)POPs;
6087         res = SvREFCNT_inc(sv);
6088     }
6089     else {
6090         res = POPs;
6091         (void)SvREFCNT_inc(res);
6092     }
6093
6094     PUTBACK ;
6095     FREETMPS ;
6096     LEAVE ;
6097     POPSTACK;
6098
6099     if (!SvOK(res)) {
6100         why1 = "Call to &{$^H{";
6101         why2 = key;
6102         why3 = "}} did not return a defined value";
6103         sv = res;
6104         goto report;
6105     }
6106
6107     return res;
6108 }
6109
6110 STATIC char *
6111 S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
6112 {
6113     register char *d = dest;
6114     register char *e = d + destlen - 3;  /* two-character token, ending NUL */
6115     for (;;) {
6116         if (d >= e)
6117             Perl_croak(aTHX_ ident_too_long);
6118         if (isALNUM(*s))        /* UTF handled below */
6119             *d++ = *s++;
6120         else if (*s == '\'' && allow_package && isIDFIRST_lazy_if(s+1,UTF)) {
6121             *d++ = ':';
6122             *d++ = ':';
6123             s++;
6124         }
6125         else if (*s == ':' && s[1] == ':' && allow_package && s[2] != '$') {
6126             *d++ = *s++;
6127             *d++ = *s++;
6128         }
6129         else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
6130             char *t = s + UTF8SKIP(s);
6131             while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
6132                 t += UTF8SKIP(t);
6133             if (d + (t - s) > e)
6134                 Perl_croak(aTHX_ ident_too_long);
6135             Copy(s, d, t - s, char);
6136             d += t - s;
6137             s = t;
6138         }
6139         else {
6140             *d = '\0';
6141             *slp = d - dest;
6142             return s;
6143         }
6144     }
6145 }
6146
6147 STATIC char *
6148 S_scan_ident(pTHX_ register char *s, register char *send, char *dest, STRLEN destlen, I32 ck_uni)
6149 {
6150     register char *d;
6151     register char *e;
6152     char *bracket = 0;
6153     char funny = *s++;
6154
6155     if (isSPACE(*s))
6156         s = skipspace(s);
6157     d = dest;
6158     e = d + destlen - 3;        /* two-character token, ending NUL */
6159     if (isDIGIT(*s)) {
6160         while (isDIGIT(*s)) {
6161             if (d >= e)
6162                 Perl_croak(aTHX_ ident_too_long);
6163             *d++ = *s++;
6164         }
6165     }
6166     else {
6167         for (;;) {
6168             if (d >= e)
6169                 Perl_croak(aTHX_ ident_too_long);
6170             if (isALNUM(*s))    /* UTF handled below */
6171                 *d++ = *s++;
6172             else if (*s == '\'' && isIDFIRST_lazy_if(s+1,UTF)) {
6173                 *d++ = ':';
6174                 *d++ = ':';
6175                 s++;
6176             }
6177             else if (*s == ':' && s[1] == ':') {
6178                 *d++ = *s++;
6179                 *d++ = *s++;
6180             }
6181             else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
6182                 char *t = s + UTF8SKIP(s);
6183                 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
6184                     t += UTF8SKIP(t);
6185                 if (d + (t - s) > e)
6186                     Perl_croak(aTHX_ ident_too_long);
6187                 Copy(s, d, t - s, char);
6188                 d += t - s;
6189                 s = t;
6190             }
6191             else
6192                 break;
6193         }
6194     }
6195     *d = '\0';
6196     d = dest;
6197     if (*d) {
6198         if (PL_lex_state != LEX_NORMAL)
6199             PL_lex_state = LEX_INTERPENDMAYBE;
6200         return s;
6201     }
6202     if (*s == '$' && s[1] &&
6203         (isALNUM_lazy_if(s+1,UTF) || strchr("${", s[1]) || strnEQ(s+1,"::",2)) )
6204     {
6205         return s;
6206     }
6207     if (*s == '{') {
6208         bracket = s;
6209         s++;
6210     }
6211     else if (ck_uni)
6212         check_uni();
6213     if (s < send)
6214         *d = *s++;
6215     d[1] = '\0';
6216     if (*d == '^' && *s && isCONTROLVAR(*s)) {
6217         *d = toCTRL(*s);
6218         s++;
6219     }
6220     if (bracket) {
6221         if (isSPACE(s[-1])) {
6222             while (s < send) {
6223                 char ch = *s++;
6224                 if (!SPACE_OR_TAB(ch)) {
6225                     *d = ch;
6226                     break;
6227                 }
6228             }
6229         }
6230         if (isIDFIRST_lazy_if(d,UTF)) {
6231             d++;
6232             if (UTF) {
6233                 e = s;
6234                 while ((e < send && isALNUM_lazy_if(e,UTF)) || *e == ':') {
6235                     e += UTF8SKIP(e);
6236                     while (e < send && UTF8_IS_CONTINUED(*e) && is_utf8_mark((U8*)e))
6237                         e += UTF8SKIP(e);
6238                 }
6239                 Copy(s, d, e - s, char);
6240                 d += e - s;
6241                 s = e;
6242             }
6243             else {
6244                 while ((isALNUM(*s) || *s == ':') && d < e)
6245                     *d++ = *s++;
6246                 if (d >= e)
6247                     Perl_croak(aTHX_ ident_too_long);
6248             }
6249             *d = '\0';
6250             while (s < send && SPACE_OR_TAB(*s)) s++;
6251             if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
6252                 if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest)) {
6253                     const char *brack = *s == '[' ? "[...]" : "{...}";
6254                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
6255                         "Ambiguous use of %c{%s%s} resolved to %c%s%s",
6256                         funny, dest, brack, funny, dest, brack);
6257                 }
6258                 bracket++;
6259                 PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
6260                 return s;
6261             }
6262         }
6263         /* Handle extended ${^Foo} variables
6264          * 1999-02-27 mjd-perl-patch@plover.com */
6265         else if (!isALNUM(*d) && !isPRINT(*d) /* isCTRL(d) */
6266                  && isALNUM(*s))
6267         {
6268             d++;
6269             while (isALNUM(*s) && d < e) {
6270                 *d++ = *s++;
6271             }
6272             if (d >= e)
6273                 Perl_croak(aTHX_ ident_too_long);
6274             *d = '\0';
6275         }
6276         if (*s == '}') {
6277             s++;
6278             if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) {
6279                 PL_lex_state = LEX_INTERPEND;
6280                 PL_expect = XREF;
6281             }
6282             if (funny == '#')
6283                 funny = '@';
6284             if (PL_lex_state == LEX_NORMAL) {
6285                 if (ckWARN(WARN_AMBIGUOUS) &&
6286                     (keyword(dest, d - dest) || get_cv(dest, FALSE)))
6287                 {
6288                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
6289                         "Ambiguous use of %c{%s} resolved to %c%s",
6290                         funny, dest, funny, dest);
6291                 }
6292             }
6293         }
6294         else {
6295             s = bracket;                /* let the parser handle it */
6296             *dest = '\0';
6297         }
6298     }
6299     else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
6300         PL_lex_state = LEX_INTERPEND;
6301     return s;
6302 }
6303
6304 void
6305 Perl_pmflag(pTHX_ U32* pmfl, int ch)
6306 {
6307     if (ch == 'i')
6308         *pmfl |= PMf_FOLD;
6309     else if (ch == 'g')
6310         *pmfl |= PMf_GLOBAL;
6311     else if (ch == 'c')
6312         *pmfl |= PMf_CONTINUE;
6313     else if (ch == 'o')
6314         *pmfl |= PMf_KEEP;
6315     else if (ch == 'm')
6316         *pmfl |= PMf_MULTILINE;
6317     else if (ch == 's')
6318         *pmfl |= PMf_SINGLELINE;
6319     else if (ch == 'x')
6320         *pmfl |= PMf_EXTENDED;
6321 }
6322
6323 STATIC char *
6324 S_scan_pat(pTHX_ char *start, I32 type)
6325 {
6326     PMOP *pm;
6327     char *s;
6328
6329     s = scan_str(start,FALSE,FALSE);
6330     if (!s)
6331         Perl_croak(aTHX_ "Search pattern not terminated");
6332
6333     pm = (PMOP*)newPMOP(type, 0);
6334     if (PL_multi_open == '?')
6335         pm->op_pmflags |= PMf_ONCE;
6336     if(type == OP_QR) {
6337         while (*s && strchr("iomsx", *s))
6338             pmflag(&pm->op_pmflags,*s++);
6339     }
6340     else {
6341         while (*s && strchr("iogcmsx", *s))
6342             pmflag(&pm->op_pmflags,*s++);
6343     }
6344     /* issue a warning if /c is specified,but /g is not */
6345     if (ckWARN(WARN_REGEXP) && 
6346         (pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL))
6347     {
6348         Perl_warner(aTHX_ packWARN(WARN_REGEXP), c_without_g);
6349     }
6350
6351     pm->op_pmpermflags = pm->op_pmflags;
6352
6353     PL_lex_op = (OP*)pm;
6354     yylval.ival = OP_MATCH;
6355     return s;
6356 }
6357
6358 STATIC char *
6359 S_scan_subst(pTHX_ char *start)
6360 {
6361     register char *s;
6362     register PMOP *pm;
6363     I32 first_start;
6364     I32 es = 0;
6365
6366     yylval.ival = OP_NULL;
6367
6368     s = scan_str(start,FALSE,FALSE);
6369
6370     if (!s)
6371         Perl_croak(aTHX_ "Substitution pattern not terminated");
6372
6373     if (s[-1] == PL_multi_open)
6374         s--;
6375
6376     first_start = PL_multi_start;
6377     s = scan_str(s,FALSE,FALSE);
6378     if (!s) {
6379         if (PL_lex_stuff) {
6380             SvREFCNT_dec(PL_lex_stuff);
6381             PL_lex_stuff = Nullsv;
6382         }
6383         Perl_croak(aTHX_ "Substitution replacement not terminated");
6384     }
6385     PL_multi_start = first_start;       /* so whole substitution is taken together */
6386
6387     pm = (PMOP*)newPMOP(OP_SUBST, 0);
6388     while (*s) {
6389         if (*s == 'e') {
6390             s++;
6391             es++;
6392         }
6393         else if (strchr("iogcmsx", *s))
6394             pmflag(&pm->op_pmflags,*s++);
6395         else
6396             break;
6397     }
6398
6399     /* /c is not meaningful with s/// */
6400     if (ckWARN(WARN_REGEXP) && (pm->op_pmflags & PMf_CONTINUE))
6401     {
6402         Perl_warner(aTHX_ packWARN(WARN_REGEXP), c_in_subst);
6403     }
6404
6405     if (es) {
6406         SV *repl;
6407         PL_sublex_info.super_bufptr = s;
6408         PL_sublex_info.super_bufend = PL_bufend;
6409         PL_multi_end = 0;
6410         pm->op_pmflags |= PMf_EVAL;
6411         repl = newSVpvn("",0);
6412         while (es-- > 0)
6413             sv_catpv(repl, es ? "eval " : "do ");
6414         sv_catpvn(repl, "{ ", 2);
6415         sv_catsv(repl, PL_lex_repl);
6416         sv_catpvn(repl, " };", 2);
6417         SvEVALED_on(repl);
6418         SvREFCNT_dec(PL_lex_repl);
6419         PL_lex_repl = repl;
6420     }
6421
6422     pm->op_pmpermflags = pm->op_pmflags;
6423     PL_lex_op = (OP*)pm;
6424     yylval.ival = OP_SUBST;
6425     return s;
6426 }
6427
6428 STATIC char *
6429 S_scan_trans(pTHX_ char *start)
6430 {
6431     register char* s;
6432     OP *o;
6433     short *tbl;
6434     I32 squash;
6435     I32 del;
6436     I32 complement;
6437
6438     yylval.ival = OP_NULL;
6439
6440     s = scan_str(start,FALSE,FALSE);
6441     if (!s)
6442         Perl_croak(aTHX_ "Transliteration pattern not terminated");
6443     if (s[-1] == PL_multi_open)
6444         s--;
6445
6446     s = scan_str(s,FALSE,FALSE);
6447     if (!s) {
6448         if (PL_lex_stuff) {
6449             SvREFCNT_dec(PL_lex_stuff);
6450             PL_lex_stuff = Nullsv;
6451         }
6452         Perl_croak(aTHX_ "Transliteration replacement not terminated");
6453     }
6454
6455     complement = del = squash = 0;
6456     while (strchr("cds", *s)) {
6457         if (*s == 'c')
6458             complement = OPpTRANS_COMPLEMENT;
6459         else if (*s == 'd')
6460             del = OPpTRANS_DELETE;
6461         else if (*s == 's')
6462             squash = OPpTRANS_SQUASH;
6463         s++;
6464     }
6465
6466     New(803, tbl, complement&&!del?258:256, short);
6467     o = newPVOP(OP_TRANS, 0, (char*)tbl);
6468     o->op_private = del|squash|complement|
6469       (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
6470       (DO_UTF8(PL_lex_repl) ? OPpTRANS_TO_UTF   : 0);
6471
6472     PL_lex_op = o;
6473     yylval.ival = OP_TRANS;
6474     return s;
6475 }
6476
6477 STATIC char *
6478 S_scan_heredoc(pTHX_ register char *s)
6479 {
6480     SV *herewas;
6481     I32 op_type = OP_SCALAR;
6482     I32 len;
6483     SV *tmpstr;
6484     char term;
6485     register char *d;
6486     register char *e;
6487     char *peek;
6488     int outer = (PL_rsfp && !(PL_lex_inwhat == OP_SCALAR));
6489
6490     s += 2;
6491     d = PL_tokenbuf;
6492     e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
6493     if (!outer)
6494         *d++ = '\n';
6495     for (peek = s; SPACE_OR_TAB(*peek); peek++) ;
6496     if (*peek && strchr("`'\"",*peek)) {
6497         s = peek;
6498         term = *s++;
6499         s = delimcpy(d, e, s, PL_bufend, term, &len);
6500         d += len;
6501         if (s < PL_bufend)
6502             s++;
6503     }
6504     else {
6505         if (*s == '\\')
6506             s++, term = '\'';
6507         else
6508             term = '"';
6509         if (!isALNUM_lazy_if(s,UTF))
6510             deprecate_old("bare << to mean <<\"\"");
6511         for (; isALNUM_lazy_if(s,UTF); s++) {
6512             if (d < e)
6513                 *d++ = *s;
6514         }
6515     }
6516     if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
6517         Perl_croak(aTHX_ "Delimiter for here document is too long");
6518     *d++ = '\n';
6519     *d = '\0';
6520     len = d - PL_tokenbuf;
6521 #ifndef PERL_STRICT_CR
6522     d = strchr(s, '\r');
6523     if (d) {
6524         char *olds = s;
6525         s = d;
6526         while (s < PL_bufend) {
6527             if (*s == '\r') {
6528                 *d++ = '\n';
6529                 if (*++s == '\n')
6530                     s++;
6531             }
6532             else if (*s == '\n' && s[1] == '\r') {      /* \015\013 on a mac? */
6533                 *d++ = *s++;
6534                 s++;
6535             }
6536             else
6537                 *d++ = *s++;
6538         }
6539         *d = '\0';
6540         PL_bufend = d;
6541         SvCUR_set(PL_linestr, PL_bufend - SvPVX(PL_linestr));
6542         s = olds;
6543     }
6544 #endif
6545     d = "\n";
6546     if (outer || !(d=ninstr(s,PL_bufend,d,d+1)))
6547         herewas = newSVpvn(s,PL_bufend-s);
6548     else
6549         s--, herewas = newSVpvn(s,d-s);
6550     s += SvCUR(herewas);
6551
6552     tmpstr = NEWSV(87,79);
6553     sv_upgrade(tmpstr, SVt_PVIV);
6554     if (term == '\'') {
6555         op_type = OP_CONST;
6556         SvIVX(tmpstr) = -1;
6557     }
6558     else if (term == '`') {
6559         op_type = OP_BACKTICK;
6560         SvIVX(tmpstr) = '\\';
6561     }
6562
6563     CLINE;
6564     PL_multi_start = CopLINE(PL_curcop);
6565     PL_multi_open = PL_multi_close = '<';
6566     term = *PL_tokenbuf;
6567     if (PL_lex_inwhat == OP_SUBST && PL_in_eval && !PL_rsfp) {
6568         char *bufptr = PL_sublex_info.super_bufptr;
6569         char *bufend = PL_sublex_info.super_bufend;
6570         char *olds = s - SvCUR(herewas);
6571         s = strchr(bufptr, '\n');
6572         if (!s)
6573             s = bufend;
6574         d = s;
6575         while (s < bufend &&
6576           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
6577             if (*s++ == '\n')
6578                 CopLINE_inc(PL_curcop);
6579         }
6580         if (s >= bufend) {
6581             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
6582             missingterm(PL_tokenbuf);
6583         }
6584         sv_setpvn(herewas,bufptr,d-bufptr+1);
6585         sv_setpvn(tmpstr,d+1,s-d);
6586         s += len - 1;
6587         sv_catpvn(herewas,s,bufend-s);
6588         (void)strcpy(bufptr,SvPVX(herewas));
6589
6590         s = olds;
6591         goto retval;
6592     }
6593     else if (!outer) {
6594         d = s;
6595         while (s < PL_bufend &&
6596           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
6597             if (*s++ == '\n')
6598                 CopLINE_inc(PL_curcop);
6599         }
6600         if (s >= PL_bufend) {
6601             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
6602             missingterm(PL_tokenbuf);
6603         }
6604         sv_setpvn(tmpstr,d+1,s-d);
6605         s += len - 1;
6606         CopLINE_inc(PL_curcop); /* the preceding stmt passes a newline */
6607
6608         sv_catpvn(herewas,s,PL_bufend-s);
6609         sv_setsv(PL_linestr,herewas);
6610         PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
6611         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
6612         PL_last_lop = PL_last_uni = Nullch;
6613     }
6614     else
6615         sv_setpvn(tmpstr,"",0);   /* avoid "uninitialized" warning */
6616     while (s >= PL_bufend) {    /* multiple line string? */
6617         if (!outer ||
6618          !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
6619             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
6620             missingterm(PL_tokenbuf);
6621         }
6622         CopLINE_inc(PL_curcop);
6623         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
6624         PL_last_lop = PL_last_uni = Nullch;
6625 #ifndef PERL_STRICT_CR
6626         if (PL_bufend - PL_linestart >= 2) {
6627             if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
6628                 (PL_bufend[-2] == '\n' && PL_bufend[-1] == '\r'))
6629             {
6630                 PL_bufend[-2] = '\n';
6631                 PL_bufend--;
6632                 SvCUR_set(PL_linestr, PL_bufend - SvPVX(PL_linestr));
6633             }
6634             else if (PL_bufend[-1] == '\r')
6635                 PL_bufend[-1] = '\n';
6636         }
6637         else if (PL_bufend - PL_linestart == 1 && PL_bufend[-1] == '\r')
6638             PL_bufend[-1] = '\n';
6639 #endif
6640         if (PERLDB_LINE && PL_curstash != PL_debstash) {
6641             SV *sv = NEWSV(88,0);
6642
6643             sv_upgrade(sv, SVt_PVMG);
6644             sv_setsv(sv,PL_linestr);
6645             (void)SvIOK_on(sv);
6646             SvIVX(sv) = 0;
6647             av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop),sv);
6648         }
6649         if (*s == term && memEQ(s,PL_tokenbuf,len)) {
6650             s = PL_bufend - 1;
6651             *s = ' ';
6652             sv_catsv(PL_linestr,herewas);
6653             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
6654         }
6655         else {
6656             s = PL_bufend;
6657             sv_catsv(tmpstr,PL_linestr);
6658         }
6659     }
6660     s++;
6661 retval:
6662     PL_multi_end = CopLINE(PL_curcop);
6663     if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
6664         SvLEN_set(tmpstr, SvCUR(tmpstr) + 1);
6665         Renew(SvPVX(tmpstr), SvLEN(tmpstr), char);
6666     }
6667     SvREFCNT_dec(herewas);
6668     if (UTF && !IN_BYTES && is_utf8_string((U8*)SvPVX(tmpstr), SvCUR(tmpstr)))
6669         SvUTF8_on(tmpstr);
6670     PL_lex_stuff = tmpstr;
6671     yylval.ival = op_type;
6672     return s;
6673 }
6674
6675 /* scan_inputsymbol
6676    takes: current position in input buffer
6677    returns: new position in input buffer
6678    side-effects: yylval and lex_op are set.
6679
6680    This code handles:
6681
6682    <>           read from ARGV
6683    <FH>         read from filehandle
6684    <pkg::FH>    read from package qualified filehandle
6685    <pkg'FH>     read from package qualified filehandle
6686    <$fh>        read from filehandle in $fh
6687    <*.h>        filename glob
6688
6689 */
6690
6691 STATIC char *
6692 S_scan_inputsymbol(pTHX_ char *start)
6693 {
6694     register char *s = start;           /* current position in buffer */
6695     register char *d;
6696     register char *e;
6697     char *end;
6698     I32 len;
6699
6700     d = PL_tokenbuf;                    /* start of temp holding space */
6701     e = PL_tokenbuf + sizeof PL_tokenbuf;       /* end of temp holding space */
6702     end = strchr(s, '\n');
6703     if (!end)
6704         end = PL_bufend;
6705     s = delimcpy(d, e, s + 1, end, '>', &len);  /* extract until > */
6706
6707     /* die if we didn't have space for the contents of the <>,
6708        or if it didn't end, or if we see a newline
6709     */
6710
6711     if (len >= sizeof PL_tokenbuf)
6712         Perl_croak(aTHX_ "Excessively long <> operator");
6713     if (s >= end)
6714         Perl_croak(aTHX_ "Unterminated <> operator");
6715
6716     s++;
6717
6718     /* check for <$fh>
6719        Remember, only scalar variables are interpreted as filehandles by
6720        this code.  Anything more complex (e.g., <$fh{$num}>) will be
6721        treated as a glob() call.
6722        This code makes use of the fact that except for the $ at the front,
6723        a scalar variable and a filehandle look the same.
6724     */
6725     if (*d == '$' && d[1]) d++;
6726
6727     /* allow <Pkg'VALUE> or <Pkg::VALUE> */
6728     while (*d && (isALNUM_lazy_if(d,UTF) || *d == '\'' || *d == ':'))
6729         d++;
6730
6731     /* If we've tried to read what we allow filehandles to look like, and
6732        there's still text left, then it must be a glob() and not a getline.
6733        Use scan_str to pull out the stuff between the <> and treat it
6734        as nothing more than a string.
6735     */
6736
6737     if (d - PL_tokenbuf != len) {
6738         yylval.ival = OP_GLOB;
6739         set_csh();
6740         s = scan_str(start,FALSE,FALSE);
6741         if (!s)
6742            Perl_croak(aTHX_ "Glob not terminated");
6743         return s;
6744     }
6745     else {
6746         bool readline_overriden = FALSE;
6747         GV *gv_readline = Nullgv;
6748         GV **gvp;
6749         /* we're in a filehandle read situation */
6750         d = PL_tokenbuf;
6751
6752         /* turn <> into <ARGV> */
6753         if (!len)
6754             (void)strcpy(d,"ARGV");
6755
6756         /* Check whether readline() is overriden */
6757         if (((gv_readline = gv_fetchpv("readline", FALSE, SVt_PVCV))
6758                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline))
6759                 ||
6760                 ((gvp = (GV**)hv_fetch(PL_globalstash, "readline", 8, FALSE))
6761                 && (gv_readline = *gvp) != (GV*)&PL_sv_undef
6762                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline)))
6763             readline_overriden = TRUE;
6764
6765         /* if <$fh>, create the ops to turn the variable into a
6766            filehandle
6767         */
6768         if (*d == '$') {
6769             I32 tmp;
6770
6771             /* try to find it in the pad for this block, otherwise find
6772                add symbol table ops
6773             */
6774             if ((tmp = pad_findmy(d)) != NOT_IN_PAD) {
6775                 if (PAD_COMPNAME_FLAGS(tmp) & SVpad_OUR) {
6776                     SV *sym = sv_2mortal(
6777                             newSVpv(HvNAME(PAD_COMPNAME_OURSTASH(tmp)),0));
6778                     sv_catpvn(sym, "::", 2);
6779                     sv_catpv(sym, d+1);
6780                     d = SvPVX(sym);
6781                     goto intro_sym;
6782                 }
6783                 else {
6784                     OP *o = newOP(OP_PADSV, 0);
6785                     o->op_targ = tmp;
6786                     PL_lex_op = readline_overriden
6787                         ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
6788                                 append_elem(OP_LIST, o,
6789                                     newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
6790                         : (OP*)newUNOP(OP_READLINE, 0, o);
6791                 }
6792             }
6793             else {
6794                 GV *gv;
6795                 ++d;
6796 intro_sym:
6797                 gv = gv_fetchpv(d,
6798                                 (PL_in_eval
6799                                  ? (GV_ADDMULTI | GV_ADDINEVAL)
6800                                  : GV_ADDMULTI),
6801                                 SVt_PV);
6802                 PL_lex_op = readline_overriden
6803                     ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
6804                             append_elem(OP_LIST,
6805                                 newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
6806                                 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
6807                     : (OP*)newUNOP(OP_READLINE, 0,
6808                             newUNOP(OP_RV2SV, 0,
6809                                 newGVOP(OP_GV, 0, gv)));
6810             }
6811             if (!readline_overriden)
6812                 PL_lex_op->op_flags |= OPf_SPECIAL;
6813             /* we created the ops in PL_lex_op, so make yylval.ival a null op */
6814             yylval.ival = OP_NULL;
6815         }
6816
6817         /* If it's none of the above, it must be a literal filehandle
6818            (<Foo::BAR> or <FOO>) so build a simple readline OP */
6819         else {
6820             GV *gv = gv_fetchpv(d,TRUE, SVt_PVIO);
6821             PL_lex_op = readline_overriden
6822                 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
6823                         append_elem(OP_LIST,
6824                             newGVOP(OP_GV, 0, gv),
6825                             newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
6826                 : (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
6827             yylval.ival = OP_NULL;
6828         }
6829     }
6830
6831     return s;
6832 }
6833
6834
6835 /* scan_str
6836    takes: start position in buffer
6837           keep_quoted preserve \ on the embedded delimiter(s)
6838           keep_delims preserve the delimiters around the string
6839    returns: position to continue reading from buffer
6840    side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
6841         updates the read buffer.
6842
6843    This subroutine pulls a string out of the input.  It is called for:
6844         q               single quotes           q(literal text)
6845         '               single quotes           'literal text'
6846         qq              double quotes           qq(interpolate $here please)
6847         "               double quotes           "interpolate $here please"
6848         qx              backticks               qx(/bin/ls -l)
6849         `               backticks               `/bin/ls -l`
6850         qw              quote words             @EXPORT_OK = qw( func() $spam )
6851         m//             regexp match            m/this/
6852         s///            regexp substitute       s/this/that/
6853         tr///           string transliterate    tr/this/that/
6854         y///            string transliterate    y/this/that/
6855         ($*@)           sub prototypes          sub foo ($)
6856         (stuff)         sub attr parameters     sub foo : attr(stuff)
6857         <>              readline or globs       <FOO>, <>, <$fh>, or <*.c>
6858         
6859    In most of these cases (all but <>, patterns and transliterate)
6860    yylex() calls scan_str().  m// makes yylex() call scan_pat() which
6861    calls scan_str().  s/// makes yylex() call scan_subst() which calls
6862    scan_str().  tr/// and y/// make yylex() call scan_trans() which
6863    calls scan_str().
6864
6865    It skips whitespace before the string starts, and treats the first
6866    character as the delimiter.  If the delimiter is one of ([{< then
6867    the corresponding "close" character )]}> is used as the closing
6868    delimiter.  It allows quoting of delimiters, and if the string has
6869    balanced delimiters ([{<>}]) it allows nesting.
6870
6871    On success, the SV with the resulting string is put into lex_stuff or,
6872    if that is already non-NULL, into lex_repl. The second case occurs only
6873    when parsing the RHS of the special constructs s/// and tr/// (y///).
6874    For convenience, the terminating delimiter character is stuffed into
6875    SvIVX of the SV.
6876 */
6877
6878 STATIC char *
6879 S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
6880 {
6881     SV *sv;                             /* scalar value: string */
6882     char *tmps;                         /* temp string, used for delimiter matching */
6883     register char *s = start;           /* current position in the buffer */
6884     register char term;                 /* terminating character */
6885     register char *to;                  /* current position in the sv's data */
6886     I32 brackets = 1;                   /* bracket nesting level */
6887     bool has_utf8 = FALSE;              /* is there any utf8 content? */
6888     I32 termcode;                       /* terminating char. code */
6889     U8 termstr[UTF8_MAXLEN];            /* terminating string */
6890     STRLEN termlen;                     /* length of terminating string */
6891     char *last = NULL;                  /* last position for nesting bracket */
6892
6893     /* skip space before the delimiter */
6894     if (isSPACE(*s))
6895         s = skipspace(s);
6896
6897     /* mark where we are, in case we need to report errors */
6898     CLINE;
6899
6900     /* after skipping whitespace, the next character is the terminator */
6901     term = *s;
6902     if (!UTF) {
6903         termcode = termstr[0] = term;
6904         termlen = 1;
6905     }
6906     else {
6907         termcode = utf8_to_uvchr((U8*)s, &termlen);
6908         Copy(s, termstr, termlen, U8);
6909         if (!UTF8_IS_INVARIANT(term))
6910             has_utf8 = TRUE;
6911     }
6912
6913     /* mark where we are */
6914     PL_multi_start = CopLINE(PL_curcop);
6915     PL_multi_open = term;
6916
6917     /* find corresponding closing delimiter */
6918     if (term && (tmps = strchr("([{< )]}> )]}>",term)))
6919         termcode = termstr[0] = term = tmps[5];
6920
6921     PL_multi_close = term;
6922
6923     /* create a new SV to hold the contents.  87 is leak category, I'm
6924        assuming.  79 is the SV's initial length.  What a random number. */
6925     sv = NEWSV(87,79);
6926     sv_upgrade(sv, SVt_PVIV);
6927     SvIVX(sv) = termcode;
6928     (void)SvPOK_only(sv);               /* validate pointer */
6929
6930     /* move past delimiter and try to read a complete string */
6931     if (keep_delims)
6932         sv_catpvn(sv, s, termlen);
6933     s += termlen;
6934     for (;;) {
6935         if (PL_encoding && !UTF) {
6936             bool cont = TRUE;
6937
6938             while (cont) {
6939                 int offset = s - SvPVX(PL_linestr);
6940                 bool found = sv_cat_decode(sv, PL_encoding, PL_linestr,
6941                                            &offset, (char*)termstr, termlen);
6942                 char *ns = SvPVX(PL_linestr) + offset;
6943                 char *svlast = SvEND(sv) - 1;
6944
6945                 for (; s < ns; s++) {
6946                     if (*s == '\n' && !PL_rsfp)
6947                         CopLINE_inc(PL_curcop);
6948                 }
6949                 if (!found)
6950                     goto read_more_line;
6951                 else {
6952                     /* handle quoted delimiters */
6953                     if (*(svlast-1) == '\\') {
6954                         char *t;
6955                         for (t = svlast-2; t >= SvPVX(sv) && *t == '\\';)
6956                             t--;
6957                         if ((svlast-1 - t) % 2) {
6958                             if (!keep_quoted) {
6959                                 *(svlast-1) = term;
6960                                 *svlast = '\0';
6961                                 SvCUR_set(sv, SvCUR(sv) - 1);
6962                             }
6963                             continue;
6964                         }
6965                     }
6966                     if (PL_multi_open == PL_multi_close) {
6967                         cont = FALSE;
6968                     }
6969                     else {
6970                         char *t, *w;
6971                         if (!last)
6972                             last = SvPVX(sv);
6973                         for (w = t = last; t < svlast; w++, t++) {
6974                             /* At here, all closes are "was quoted" one,
6975                                so we don't check PL_multi_close. */
6976                             if (*t == '\\') {
6977                                 if (!keep_quoted && *(t+1) == PL_multi_open)
6978                                     t++;
6979                                 else
6980                                     *w++ = *t++;
6981                             }
6982                             else if (*t == PL_multi_open)
6983                                 brackets++;
6984
6985                             *w = *t;
6986                         }
6987                         if (w < t) {
6988                             *w++ = term;
6989                             *w = '\0';
6990                             SvCUR_set(sv, w - SvPVX(sv));
6991                         }
6992                         last = w;
6993                         if (--brackets <= 0)
6994                             cont = FALSE;
6995                     }
6996                 }
6997             }
6998             if (!keep_delims) {
6999                 SvCUR_set(sv, SvCUR(sv) - 1);
7000                 *SvEND(sv) = '\0';
7001             }
7002             break;
7003         }
7004
7005         /* extend sv if need be */
7006         SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
7007         /* set 'to' to the next character in the sv's string */
7008         to = SvPVX(sv)+SvCUR(sv);
7009
7010         /* if open delimiter is the close delimiter read unbridle */
7011         if (PL_multi_open == PL_multi_close) {
7012             for (; s < PL_bufend; s++,to++) {
7013                 /* embedded newlines increment the current line number */
7014                 if (*s == '\n' && !PL_rsfp)
7015                     CopLINE_inc(PL_curcop);
7016                 /* handle quoted delimiters */
7017                 if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
7018                     if (!keep_quoted && s[1] == term)
7019                         s++;
7020                 /* any other quotes are simply copied straight through */
7021                     else
7022                         *to++ = *s++;
7023                 }
7024                 /* terminate when run out of buffer (the for() condition), or
7025                    have found the terminator */
7026                 else if (*s == term) {
7027                     if (termlen == 1)
7028                         break;
7029                     if (s+termlen <= PL_bufend && memEQ(s, (char*)termstr, termlen))
7030                         break;
7031                 }
7032                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
7033                     has_utf8 = TRUE;
7034                 *to = *s;
7035             }
7036         }
7037         
7038         /* if the terminator isn't the same as the start character (e.g.,
7039            matched brackets), we have to allow more in the quoting, and
7040            be prepared for nested brackets.
7041         */
7042         else {
7043             /* read until we run out of string, or we find the terminator */
7044             for (; s < PL_bufend; s++,to++) {
7045                 /* embedded newlines increment the line count */
7046                 if (*s == '\n' && !PL_rsfp)
7047                     CopLINE_inc(PL_curcop);
7048                 /* backslashes can escape the open or closing characters */
7049                 if (*s == '\\' && s+1 < PL_bufend) {
7050                     if (!keep_quoted &&
7051                         ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
7052                         s++;
7053                     else
7054                         *to++ = *s++;
7055                 }
7056                 /* allow nested opens and closes */
7057                 else if (*s == PL_multi_close && --brackets <= 0)
7058                     break;
7059                 else if (*s == PL_multi_open)
7060                     brackets++;
7061                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
7062                     has_utf8 = TRUE;
7063                 *to = *s;
7064             }
7065         }
7066         /* terminate the copied string and update the sv's end-of-string */
7067         *to = '\0';
7068         SvCUR_set(sv, to - SvPVX(sv));
7069
7070         /*
7071          * this next chunk reads more into the buffer if we're not done yet
7072          */
7073
7074         if (s < PL_bufend)
7075             break;              /* handle case where we are done yet :-) */
7076
7077 #ifndef PERL_STRICT_CR
7078         if (to - SvPVX(sv) >= 2) {
7079             if ((to[-2] == '\r' && to[-1] == '\n') ||
7080                 (to[-2] == '\n' && to[-1] == '\r'))
7081             {
7082                 to[-2] = '\n';
7083                 to--;
7084                 SvCUR_set(sv, to - SvPVX(sv));
7085             }
7086             else if (to[-1] == '\r')
7087                 to[-1] = '\n';
7088         }
7089         else if (to - SvPVX(sv) == 1 && to[-1] == '\r')
7090             to[-1] = '\n';
7091 #endif
7092         
7093      read_more_line:
7094         /* if we're out of file, or a read fails, bail and reset the current
7095            line marker so we can report where the unterminated string began
7096         */
7097         if (!PL_rsfp ||
7098          !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
7099             sv_free(sv);
7100             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
7101             return Nullch;
7102         }
7103         /* we read a line, so increment our line counter */
7104         CopLINE_inc(PL_curcop);
7105
7106         /* update debugger info */
7107         if (PERLDB_LINE && PL_curstash != PL_debstash) {
7108             SV *sv = NEWSV(88,0);
7109
7110             sv_upgrade(sv, SVt_PVMG);
7111             sv_setsv(sv,PL_linestr);
7112             (void)SvIOK_on(sv);
7113             SvIVX(sv) = 0;
7114             av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop), sv);
7115         }
7116
7117         /* having changed the buffer, we must update PL_bufend */
7118         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
7119         PL_last_lop = PL_last_uni = Nullch;
7120     }
7121
7122     /* at this point, we have successfully read the delimited string */
7123
7124     if (!PL_encoding || UTF) {
7125         if (keep_delims)
7126             sv_catpvn(sv, s, termlen);
7127         s += termlen;
7128     }
7129     if (has_utf8 || PL_encoding)
7130         SvUTF8_on(sv);
7131
7132     PL_multi_end = CopLINE(PL_curcop);
7133
7134     /* if we allocated too much space, give some back */
7135     if (SvCUR(sv) + 5 < SvLEN(sv)) {
7136         SvLEN_set(sv, SvCUR(sv) + 1);
7137         Renew(SvPVX(sv), SvLEN(sv), char);
7138     }
7139
7140     /* decide whether this is the first or second quoted string we've read
7141        for this op
7142     */
7143
7144     if (PL_lex_stuff)
7145         PL_lex_repl = sv;
7146     else
7147         PL_lex_stuff = sv;
7148     return s;
7149 }
7150
7151 /*
7152   scan_num
7153   takes: pointer to position in buffer
7154   returns: pointer to new position in buffer
7155   side-effects: builds ops for the constant in yylval.op
7156
7157   Read a number in any of the formats that Perl accepts:
7158
7159   \d(_?\d)*(\.(\d(_?\d)*)?)?[Ee][\+\-]?(\d(_?\d)*)      12 12.34 12.
7160   \.\d(_?\d)*[Ee][\+\-]?(\d(_?\d)*)                     .34
7161   0b[01](_?[01])*
7162   0[0-7](_?[0-7])*
7163   0x[0-9A-Fa-f](_?[0-9A-Fa-f])*
7164
7165   Like most scan_ routines, it uses the PL_tokenbuf buffer to hold the
7166   thing it reads.
7167
7168   If it reads a number without a decimal point or an exponent, it will
7169   try converting the number to an integer and see if it can do so
7170   without loss of precision.
7171 */
7172
7173 char *
7174 Perl_scan_num(pTHX_ char *start, YYSTYPE* lvalp)
7175 {
7176     register char *s = start;           /* current position in buffer */
7177     register char *d;                   /* destination in temp buffer */
7178     register char *e;                   /* end of temp buffer */
7179     NV nv;                              /* number read, as a double */
7180     SV *sv = Nullsv;                    /* place to put the converted number */
7181     bool floatit;                       /* boolean: int or float? */
7182     char *lastub = 0;                   /* position of last underbar */
7183     static char number_too_long[] = "Number too long";
7184
7185     /* We use the first character to decide what type of number this is */
7186
7187     switch (*s) {
7188     default:
7189       Perl_croak(aTHX_ "panic: scan_num");
7190
7191     /* if it starts with a 0, it could be an octal number, a decimal in
7192        0.13 disguise, or a hexadecimal number, or a binary number. */
7193     case '0':
7194         {
7195           /* variables:
7196              u          holds the "number so far"
7197              shift      the power of 2 of the base
7198                         (hex == 4, octal == 3, binary == 1)
7199              overflowed was the number more than we can hold?
7200
7201              Shift is used when we add a digit.  It also serves as an "are
7202              we in octal/hex/binary?" indicator to disallow hex characters
7203              when in octal mode.
7204            */
7205             NV n = 0.0;
7206             UV u = 0;
7207             I32 shift;
7208             bool overflowed = FALSE;
7209             static NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
7210             static char* bases[5] = { "", "binary", "", "octal",
7211                                       "hexadecimal" };
7212             static char* Bases[5] = { "", "Binary", "", "Octal",
7213                                       "Hexadecimal" };
7214             static char *maxima[5] = { "",
7215                                        "0b11111111111111111111111111111111",
7216                                        "",
7217                                        "037777777777",
7218                                        "0xffffffff" };
7219             char *base, *Base, *max;
7220
7221             /* check for hex */
7222             if (s[1] == 'x') {
7223                 shift = 4;
7224                 s += 2;
7225             } else if (s[1] == 'b') {
7226                 shift = 1;
7227                 s += 2;
7228             }
7229             /* check for a decimal in disguise */
7230             else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
7231                 goto decimal;
7232             /* so it must be octal */
7233             else {
7234                 shift = 3;
7235                 s++;
7236             }
7237
7238             if (*s == '_') {
7239                if (ckWARN(WARN_SYNTAX))
7240                    Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7241                                "Misplaced _ in number");
7242                lastub = s++;
7243             }
7244
7245             base = bases[shift];
7246             Base = Bases[shift];
7247             max  = maxima[shift];
7248
7249             /* read the rest of the number */
7250             for (;;) {
7251                 /* x is used in the overflow test,
7252                    b is the digit we're adding on. */
7253                 UV x, b;
7254
7255                 switch (*s) {
7256
7257                 /* if we don't mention it, we're done */
7258                 default:
7259                     goto out;
7260
7261                 /* _ are ignored -- but warned about if consecutive */
7262                 case '_':
7263                     if (ckWARN(WARN_SYNTAX) && lastub && s == lastub + 1)
7264                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7265                                     "Misplaced _ in number");
7266                     lastub = s++;
7267                     break;
7268
7269                 /* 8 and 9 are not octal */
7270                 case '8': case '9':
7271                     if (shift == 3)
7272                         yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
7273                     /* FALL THROUGH */
7274
7275                 /* octal digits */
7276                 case '2': case '3': case '4':
7277                 case '5': case '6': case '7':
7278                     if (shift == 1)
7279                         yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
7280                     /* FALL THROUGH */
7281
7282                 case '0': case '1':
7283                     b = *s++ & 15;              /* ASCII digit -> value of digit */
7284                     goto digit;
7285
7286                 /* hex digits */
7287                 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
7288                 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
7289                     /* make sure they said 0x */
7290                     if (shift != 4)
7291                         goto out;
7292                     b = (*s++ & 7) + 9;
7293
7294                     /* Prepare to put the digit we have onto the end
7295                        of the number so far.  We check for overflows.
7296                     */
7297
7298                   digit:
7299                     if (!overflowed) {
7300                         x = u << shift; /* make room for the digit */
7301
7302                         if ((x >> shift) != u
7303                             && !(PL_hints & HINT_NEW_BINARY)) {
7304                             overflowed = TRUE;
7305                             n = (NV) u;
7306                             if (ckWARN_d(WARN_OVERFLOW))
7307                                 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
7308                                             "Integer overflow in %s number",
7309                                             base);
7310                         } else
7311                             u = x | b;          /* add the digit to the end */
7312                     }
7313                     if (overflowed) {
7314                         n *= nvshift[shift];
7315                         /* If an NV has not enough bits in its
7316                          * mantissa to represent an UV this summing of
7317                          * small low-order numbers is a waste of time
7318                          * (because the NV cannot preserve the
7319                          * low-order bits anyway): we could just
7320                          * remember when did we overflow and in the
7321                          * end just multiply n by the right
7322                          * amount. */
7323                         n += (NV) b;
7324                     }
7325                     break;
7326                 }
7327             }
7328
7329           /* if we get here, we had success: make a scalar value from
7330              the number.
7331           */
7332           out:
7333
7334             /* final misplaced underbar check */
7335             if (s[-1] == '_') {
7336                 if (ckWARN(WARN_SYNTAX))
7337                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
7338             }
7339
7340             sv = NEWSV(92,0);
7341             if (overflowed) {
7342                 if (ckWARN(WARN_PORTABLE) && n > 4294967295.0)
7343                     Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
7344                                 "%s number > %s non-portable",
7345                                 Base, max);
7346                 sv_setnv(sv, n);
7347             }
7348             else {
7349 #if UVSIZE > 4
7350                 if (ckWARN(WARN_PORTABLE) && u > 0xffffffff)
7351                     Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
7352                                 "%s number > %s non-portable",
7353                                 Base, max);
7354 #endif
7355                 sv_setuv(sv, u);
7356             }
7357             if (PL_hints & HINT_NEW_BINARY)
7358                 sv = new_constant(start, s - start, "binary", sv, Nullsv, NULL);
7359         }
7360         break;
7361
7362     /*
7363       handle decimal numbers.
7364       we're also sent here when we read a 0 as the first digit
7365     */
7366     case '1': case '2': case '3': case '4': case '5':
7367     case '6': case '7': case '8': case '9': case '.':
7368       decimal:
7369         d = PL_tokenbuf;
7370         e = PL_tokenbuf + sizeof PL_tokenbuf - 6; /* room for various punctuation */
7371         floatit = FALSE;
7372
7373         /* read next group of digits and _ and copy into d */
7374         while (isDIGIT(*s) || *s == '_') {
7375             /* skip underscores, checking for misplaced ones
7376                if -w is on
7377             */
7378             if (*s == '_') {
7379                 if (ckWARN(WARN_SYNTAX) && lastub && s == lastub + 1)
7380                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7381                                 "Misplaced _ in number");
7382                 lastub = s++;
7383             }
7384             else {
7385                 /* check for end of fixed-length buffer */
7386                 if (d >= e)
7387                     Perl_croak(aTHX_ number_too_long);
7388                 /* if we're ok, copy the character */
7389                 *d++ = *s++;
7390             }
7391         }
7392
7393         /* final misplaced underbar check */
7394         if (lastub && s == lastub + 1) {
7395             if (ckWARN(WARN_SYNTAX))
7396                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
7397         }
7398
7399         /* read a decimal portion if there is one.  avoid
7400            3..5 being interpreted as the number 3. followed
7401            by .5
7402         */
7403         if (*s == '.' && s[1] != '.') {
7404             floatit = TRUE;
7405             *d++ = *s++;
7406
7407             if (*s == '_') {
7408                 if (ckWARN(WARN_SYNTAX))
7409                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7410                                 "Misplaced _ in number");
7411                 lastub = s;
7412             }
7413
7414             /* copy, ignoring underbars, until we run out of digits.
7415             */
7416             for (; isDIGIT(*s) || *s == '_'; s++) {
7417                 /* fixed length buffer check */
7418                 if (d >= e)
7419                     Perl_croak(aTHX_ number_too_long);
7420                 if (*s == '_') {
7421                    if (ckWARN(WARN_SYNTAX) && lastub && s == lastub + 1)
7422                        Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7423                                    "Misplaced _ in number");
7424                    lastub = s;
7425                 }
7426                 else
7427                     *d++ = *s;
7428             }
7429             /* fractional part ending in underbar? */
7430             if (s[-1] == '_') {
7431                 if (ckWARN(WARN_SYNTAX))
7432                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7433                                 "Misplaced _ in number");
7434             }
7435             if (*s == '.' && isDIGIT(s[1])) {
7436                 /* oops, it's really a v-string, but without the "v" */
7437                 s = start;
7438                 goto vstring;
7439             }
7440         }
7441
7442         /* read exponent part, if present */
7443         if (*s && strchr("eE",*s) && strchr("+-0123456789_", s[1])) {
7444             floatit = TRUE;
7445             s++;
7446
7447             /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
7448             *d++ = 'e';         /* At least some Mach atof()s don't grok 'E' */
7449
7450             /* stray preinitial _ */
7451             if (*s == '_') {
7452                 if (ckWARN(WARN_SYNTAX))
7453                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7454                                 "Misplaced _ in number");
7455                 lastub = s++;
7456             }
7457
7458             /* allow positive or negative exponent */
7459             if (*s == '+' || *s == '-')
7460                 *d++ = *s++;
7461
7462             /* stray initial _ */
7463             if (*s == '_') {
7464                 if (ckWARN(WARN_SYNTAX))
7465                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7466                                 "Misplaced _ in number");
7467                 lastub = s++;
7468             }
7469
7470             /* read digits of exponent */
7471             while (isDIGIT(*s) || *s == '_') {
7472                 if (isDIGIT(*s)) {
7473                     if (d >= e)
7474                         Perl_croak(aTHX_ number_too_long);
7475                     *d++ = *s++;
7476                 }
7477                 else {
7478                    if (ckWARN(WARN_SYNTAX) &&
7479                        ((lastub && s == lastub + 1) ||
7480                         (!isDIGIT(s[1]) && s[1] != '_')))
7481                        Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7482                                    "Misplaced _ in number");
7483                    lastub = s++;
7484                 }
7485             }
7486         }
7487
7488
7489         /* make an sv from the string */
7490         sv = NEWSV(92,0);
7491
7492         /*
7493            We try to do an integer conversion first if no characters
7494            indicating "float" have been found.
7495          */
7496
7497         if (!floatit) {
7498             UV uv;
7499             int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
7500
7501             if (flags == IS_NUMBER_IN_UV) {
7502               if (uv <= IV_MAX)
7503                 sv_setiv(sv, uv); /* Prefer IVs over UVs. */
7504               else
7505                 sv_setuv(sv, uv);
7506             } else if (flags == (IS_NUMBER_IN_UV | IS_NUMBER_NEG)) {
7507               if (uv <= (UV) IV_MIN)
7508                 sv_setiv(sv, -(IV)uv);
7509               else
7510                 floatit = TRUE;
7511             } else
7512               floatit = TRUE;
7513         }
7514         if (floatit) {
7515             /* terminate the string */
7516             *d = '\0';
7517             nv = Atof(PL_tokenbuf);
7518             sv_setnv(sv, nv);
7519         }
7520
7521         if ( floatit ? (PL_hints & HINT_NEW_FLOAT) :
7522                        (PL_hints & HINT_NEW_INTEGER) )
7523             sv = new_constant(PL_tokenbuf, d - PL_tokenbuf,
7524                               (floatit ? "float" : "integer"),
7525                               sv, Nullsv, NULL);
7526         break;
7527
7528     /* if it starts with a v, it could be a v-string */
7529     case 'v':
7530 vstring:
7531                 sv = NEWSV(92,5); /* preallocate storage space */
7532                 s = new_vstring(s,sv);
7533         break;
7534     }
7535
7536     /* make the op for the constant and return */
7537
7538     if (sv)
7539         lvalp->opval = newSVOP(OP_CONST, 0, sv);
7540     else
7541         lvalp->opval = Nullop;
7542
7543     return s;
7544 }
7545
7546 STATIC char *
7547 S_scan_formline(pTHX_ register char *s)
7548 {
7549     register char *eol;
7550     register char *t;
7551     SV *stuff = newSVpvn("",0);
7552     bool needargs = FALSE;
7553
7554     while (!needargs) {
7555         if (*s == '.' || *s == /*{*/'}') {
7556             /*SUPPRESS 530*/
7557 #ifdef PERL_STRICT_CR
7558             for (t = s+1;SPACE_OR_TAB(*t); t++) ;
7559 #else
7560             for (t = s+1;SPACE_OR_TAB(*t) || *t == '\r'; t++) ;
7561 #endif
7562             if (*t == '\n' || t == PL_bufend)
7563                 break;
7564         }
7565         if (PL_in_eval && !PL_rsfp) {
7566             eol = strchr(s,'\n');
7567             if (!eol++)
7568                 eol = PL_bufend;
7569         }
7570         else
7571             eol = PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
7572         if (*s != '#') {
7573             for (t = s; t < eol; t++) {
7574                 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
7575                     needargs = FALSE;
7576                     goto enough;        /* ~~ must be first line in formline */
7577                 }
7578                 if (*t == '@' || *t == '^')
7579                     needargs = TRUE;
7580             }
7581             if (eol > s) {
7582                 sv_catpvn(stuff, s, eol-s);
7583 #ifndef PERL_STRICT_CR
7584                 if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
7585                     char *end = SvPVX(stuff) + SvCUR(stuff);
7586                     end[-2] = '\n';
7587                     end[-1] = '\0';
7588                     SvCUR(stuff)--;
7589                 }
7590 #endif
7591             }
7592             else
7593               break;
7594         }
7595         s = eol;
7596         if (PL_rsfp) {
7597             s = filter_gets(PL_linestr, PL_rsfp, 0);
7598             PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
7599             PL_bufend = PL_bufptr + SvCUR(PL_linestr);
7600             PL_last_lop = PL_last_uni = Nullch;
7601             if (!s) {
7602                 s = PL_bufptr;
7603                 yyerror("Format not terminated");
7604                 break;
7605             }
7606         }
7607         incline(s);
7608     }
7609   enough:
7610     if (SvCUR(stuff)) {
7611         PL_expect = XTERM;
7612         if (needargs) {
7613             PL_lex_state = LEX_NORMAL;
7614             PL_nextval[PL_nexttoke].ival = 0;
7615             force_next(',');
7616         }
7617         else
7618             PL_lex_state = LEX_FORMLINE;
7619         if (!IN_BYTES) {
7620             if (UTF && is_utf8_string((U8*)SvPVX(stuff), SvCUR(stuff)))
7621                 SvUTF8_on(stuff);
7622             else if (PL_encoding)
7623                 sv_recode_to_utf8(stuff, PL_encoding);
7624         }
7625         PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, stuff);
7626         force_next(THING);
7627         PL_nextval[PL_nexttoke].ival = OP_FORMLINE;
7628         force_next(LSTOP);
7629     }
7630     else {
7631         SvREFCNT_dec(stuff);
7632         PL_lex_formbrack = 0;
7633         PL_bufptr = s;
7634     }
7635     return s;
7636 }
7637
7638 STATIC void
7639 S_set_csh(pTHX)
7640 {
7641 #ifdef CSH
7642     if (!PL_cshlen)
7643         PL_cshlen = strlen(PL_cshname);
7644 #endif
7645 }
7646
7647 I32
7648 Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
7649 {
7650     I32 oldsavestack_ix = PL_savestack_ix;
7651     CV* outsidecv = PL_compcv;
7652
7653     if (PL_compcv) {
7654         assert(SvTYPE(PL_compcv) == SVt_PVCV);
7655     }
7656     SAVEI32(PL_subline);
7657     save_item(PL_subname);
7658     SAVESPTR(PL_compcv);
7659
7660     PL_compcv = (CV*)NEWSV(1104,0);
7661     sv_upgrade((SV *)PL_compcv, is_format ? SVt_PVFM : SVt_PVCV);
7662     CvFLAGS(PL_compcv) |= flags;
7663
7664     PL_subline = CopLINE(PL_curcop);
7665     CvPADLIST(PL_compcv) = pad_new(padnew_SAVE|padnew_SAVESUB);
7666     CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc(outsidecv);
7667     CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
7668 #ifdef USE_5005THREADS
7669     CvOWNER(PL_compcv) = 0;
7670     New(666, CvMUTEXP(PL_compcv), 1, perl_mutex);
7671     MUTEX_INIT(CvMUTEXP(PL_compcv));
7672 #endif /* USE_5005THREADS */
7673
7674     return oldsavestack_ix;
7675 }
7676
7677 #ifdef __SC__
7678 #pragma segment Perl_yylex
7679 #endif
7680 int
7681 Perl_yywarn(pTHX_ char *s)
7682 {
7683     PL_in_eval |= EVAL_WARNONLY;
7684     yyerror(s);
7685     PL_in_eval &= ~EVAL_WARNONLY;
7686     return 0;
7687 }
7688
7689 int
7690 Perl_yyerror(pTHX_ char *s)
7691 {
7692     char *where = NULL;
7693     char *context = NULL;
7694     int contlen = -1;
7695     SV *msg;
7696
7697     if (!yychar || (yychar == ';' && !PL_rsfp))
7698         where = "at EOF";
7699     else if (PL_bufptr > PL_oldoldbufptr && PL_bufptr - PL_oldoldbufptr < 200 &&
7700       PL_oldoldbufptr != PL_oldbufptr && PL_oldbufptr != PL_bufptr) {
7701         /*
7702                 Only for NetWare:
7703                 The code below is removed for NetWare because it abends/crashes on NetWare
7704                 when the script has error such as not having the closing quotes like:
7705                     if ($var eq "value)
7706                 Checking of white spaces is anyway done in NetWare code.
7707         */
7708 #ifndef NETWARE
7709         while (isSPACE(*PL_oldoldbufptr))
7710             PL_oldoldbufptr++;
7711 #endif
7712         context = PL_oldoldbufptr;
7713         contlen = PL_bufptr - PL_oldoldbufptr;
7714     }
7715     else if (PL_bufptr > PL_oldbufptr && PL_bufptr - PL_oldbufptr < 200 &&
7716       PL_oldbufptr != PL_bufptr) {
7717         /*
7718                 Only for NetWare:
7719                 The code below is removed for NetWare because it abends/crashes on NetWare
7720                 when the script has error such as not having the closing quotes like:
7721                     if ($var eq "value)
7722                 Checking of white spaces is anyway done in NetWare code.
7723         */
7724 #ifndef NETWARE
7725         while (isSPACE(*PL_oldbufptr))
7726             PL_oldbufptr++;
7727 #endif
7728         context = PL_oldbufptr;
7729         contlen = PL_bufptr - PL_oldbufptr;
7730     }
7731     else if (yychar > 255)
7732         where = "next token ???";
7733 #ifdef USE_PURE_BISON
7734 /*  GNU Bison sets the value -2 */
7735     else if (yychar == -2) {
7736 #else
7737     else if ((yychar & 127) == 127) {
7738 #endif
7739         if (PL_lex_state == LEX_NORMAL ||
7740            (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
7741             where = "at end of line";
7742         else if (PL_lex_inpat)
7743             where = "within pattern";
7744         else
7745             where = "within string";
7746     }
7747     else {
7748         SV *where_sv = sv_2mortal(newSVpvn("next char ", 10));
7749         if (yychar < 32)
7750             Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
7751         else if (isPRINT_LC(yychar))
7752             Perl_sv_catpvf(aTHX_ where_sv, "%c", yychar);
7753         else
7754             Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
7755         where = SvPVX(where_sv);
7756     }
7757     msg = sv_2mortal(newSVpv(s, 0));
7758     Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
7759         OutCopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
7760     if (context)
7761         Perl_sv_catpvf(aTHX_ msg, "near \"%.*s\"\n", contlen, context);
7762     else
7763         Perl_sv_catpvf(aTHX_ msg, "%s\n", where);
7764     if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
7765         Perl_sv_catpvf(aTHX_ msg,
7766         "  (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
7767                 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
7768         PL_multi_end = 0;
7769     }
7770     if (PL_in_eval & EVAL_WARNONLY)
7771         Perl_warn(aTHX_ "%"SVf, msg);
7772     else
7773         qerror(msg);
7774     if (PL_error_count >= 10) {
7775         if (PL_in_eval && SvCUR(ERRSV))
7776             Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
7777             ERRSV, OutCopFILE(PL_curcop));
7778         else
7779             Perl_croak(aTHX_ "%s has too many errors.\n",
7780             OutCopFILE(PL_curcop));
7781     }
7782     PL_in_my = 0;
7783     PL_in_my_stash = Nullhv;
7784     return 0;
7785 }
7786 #ifdef __SC__
7787 #pragma segment Main
7788 #endif
7789
7790 STATIC char*
7791 S_swallow_bom(pTHX_ U8 *s)
7792 {
7793     STRLEN slen;
7794     slen = SvCUR(PL_linestr);
7795     switch (*s) {
7796     case 0xFF:
7797         if (s[1] == 0xFE) {
7798             /* UTF-16 little-endian */
7799             if (s[2] == 0 && s[3] == 0)  /* UTF-32 little-endian */
7800                 Perl_croak(aTHX_ "Unsupported script encoding");
7801 #ifndef PERL_NO_UTF16_FILTER
7802             DEBUG_p(PerlIO_printf(Perl_debug_log, "UTF-LE script encoding\n"));
7803             s += 2;
7804             if (PL_bufend > (char*)s) {
7805                 U8 *news;
7806                 I32 newlen;
7807
7808                 filter_add(utf16rev_textfilter, NULL);
7809                 New(898, news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
7810                 PL_bufend = (char*)utf16_to_utf8_reversed(s, news,
7811                                                  PL_bufend - (char*)s - 1,
7812                                                  &newlen);
7813                 Copy(news, s, newlen, U8);
7814                 SvCUR_set(PL_linestr, newlen);
7815                 PL_bufend = SvPVX(PL_linestr) + newlen;
7816                 news[newlen++] = '\0';
7817                 Safefree(news);
7818             }
7819 #else
7820             Perl_croak(aTHX_ "Unsupported script encoding");
7821 #endif
7822         }
7823         break;
7824     case 0xFE:
7825         if (s[1] == 0xFF) {   /* UTF-16 big-endian */
7826 #ifndef PERL_NO_UTF16_FILTER
7827             DEBUG_p(PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding\n"));
7828             s += 2;
7829             if (PL_bufend > (char *)s) {
7830                 U8 *news;
7831                 I32 newlen;
7832
7833                 filter_add(utf16_textfilter, NULL);
7834                 New(898, news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
7835                 PL_bufend = (char*)utf16_to_utf8(s, news,
7836                                                  PL_bufend - (char*)s,
7837                                                  &newlen);
7838                 Copy(news, s, newlen, U8);
7839                 SvCUR_set(PL_linestr, newlen);
7840                 PL_bufend = SvPVX(PL_linestr) + newlen;
7841                 news[newlen++] = '\0';
7842                 Safefree(news);
7843             }
7844 #else
7845             Perl_croak(aTHX_ "Unsupported script encoding");
7846 #endif
7847         }
7848         break;
7849     case 0xEF:
7850         if (slen > 2 && s[1] == 0xBB && s[2] == 0xBF) {
7851             DEBUG_p(PerlIO_printf(Perl_debug_log, "UTF-8 script encoding\n"));
7852             s += 3;                      /* UTF-8 */
7853         }
7854         break;
7855     case 0:
7856         if (slen > 3 && s[1] == 0 &&  /* UTF-32 big-endian */
7857             s[2] == 0xFE && s[3] == 0xFF)
7858         {
7859             Perl_croak(aTHX_ "Unsupported script encoding");
7860         }
7861     }
7862     return (char*)s;
7863 }
7864
7865 /*
7866  * restore_rsfp
7867  * Restore a source filter.
7868  */
7869
7870 static void
7871 restore_rsfp(pTHX_ void *f)
7872 {
7873     PerlIO *fp = (PerlIO*)f;
7874
7875     if (PL_rsfp == PerlIO_stdin())
7876         PerlIO_clearerr(PL_rsfp);
7877     else if (PL_rsfp && (PL_rsfp != fp))
7878         PerlIO_close(PL_rsfp);
7879     PL_rsfp = fp;
7880 }
7881
7882 #ifndef PERL_NO_UTF16_FILTER
7883 static I32
7884 utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
7885 {
7886     I32 count = FILTER_READ(idx+1, sv, maxlen);
7887     if (count) {
7888         U8* tmps;
7889         U8* tend;
7890         I32 newlen;
7891         New(898, tmps, SvCUR(sv) * 3 / 2 + 1, U8);
7892         if (!*SvPV_nolen(sv))
7893         /* Game over, but don't feed an odd-length string to utf16_to_utf8 */
7894         return count;
7895
7896         tend = utf16_to_utf8((U8*)SvPVX(sv), tmps, SvCUR(sv), &newlen);
7897         sv_usepvn(sv, (char*)tmps, tend - tmps);
7898     }
7899     return count;
7900 }
7901
7902 static I32
7903 utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen)
7904 {
7905     I32 count = FILTER_READ(idx+1, sv, maxlen);
7906     if (count) {
7907         U8* tmps;
7908         U8* tend;
7909         I32 newlen;
7910         if (!*SvPV_nolen(sv))
7911         /* Game over, but don't feed an odd-length string to utf16_to_utf8 */
7912         return count;
7913
7914         New(898, tmps, SvCUR(sv) * 3 / 2 + 1, U8);
7915         tend = utf16_to_utf8_reversed((U8*)SvPVX(sv), tmps, SvCUR(sv), &newlen);
7916         sv_usepvn(sv, (char*)tmps, tend - tmps);
7917     }
7918     return count;
7919 }
7920 #endif
7921