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