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