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