binmode(FH); to act like binmode(FH,":bytes") as well as
[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 subroutne ("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                     TAINT_NOT;  /* $^X is always tainted, but that's OK */
2618                 }
2619 #endif /* ARG_ZERO_IS_SCRIPT */
2620
2621                 /*
2622                  * Look for options.
2623                  */
2624                 d = instr(s,"perl -");
2625                 if (!d) {
2626                     d = instr(s,"perl");
2627 #if defined(DOSISH)
2628                     /* avoid getting into infinite loops when shebang
2629                      * line contains "Perl" rather than "perl" */
2630                     if (!d) {
2631                         for (d = ipathend-4; d >= ipath; --d) {
2632                             if ((*d == 'p' || *d == 'P')
2633                                 && !ibcmp(d, "perl", 4))
2634                             {
2635                                 break;
2636                             }
2637                         }
2638                         if (d < ipath)
2639                             d = Nullch;
2640                     }
2641 #endif
2642                 }
2643 #ifdef ALTERNATE_SHEBANG
2644                 /*
2645                  * If the ALTERNATE_SHEBANG on this system starts with a
2646                  * character that can be part of a Perl expression, then if
2647                  * we see it but not "perl", we're probably looking at the
2648                  * start of Perl code, not a request to hand off to some
2649                  * other interpreter.  Similarly, if "perl" is there, but
2650                  * not in the first 'word' of the line, we assume the line
2651                  * contains the start of the Perl program.
2652                  */
2653                 if (d && *s != '#') {
2654                     char *c = ipath;
2655                     while (*c && !strchr("; \t\r\n\f\v#", *c))
2656                         c++;
2657                     if (c < d)
2658                         d = Nullch;     /* "perl" not in first word; ignore */
2659                     else
2660                         *s = '#';       /* Don't try to parse shebang line */
2661                 }
2662 #endif /* ALTERNATE_SHEBANG */
2663 #ifndef MACOS_TRADITIONAL
2664                 if (!d &&
2665                     *s == '#' &&
2666                     ipathend > ipath &&
2667                     !PL_minus_c &&
2668                     !instr(s,"indir") &&
2669                     instr(PL_origargv[0],"perl"))
2670                 {
2671                     char **newargv;
2672
2673                     *ipathend = '\0';
2674                     s = ipathend + 1;
2675                     while (s < PL_bufend && isSPACE(*s))
2676                         s++;
2677                     if (s < PL_bufend) {
2678                         Newz(899,newargv,PL_origargc+3,char*);
2679                         newargv[1] = s;
2680                         while (s < PL_bufend && !isSPACE(*s))
2681                             s++;
2682                         *s = '\0';
2683                         Copy(PL_origargv+1, newargv+2, PL_origargc+1, char*);
2684                     }
2685                     else
2686                         newargv = PL_origargv;
2687                     newargv[0] = ipath;
2688                     PerlProc_execv(ipath, EXEC_ARGV_CAST(newargv));
2689                     Perl_croak(aTHX_ "Can't exec %s", ipath);
2690                 }
2691 #endif
2692                 if (d) {
2693                     U32 oldpdb = PL_perldb;
2694                     bool oldn = PL_minus_n;
2695                     bool oldp = PL_minus_p;
2696
2697                     while (*d && !isSPACE(*d)) d++;
2698                     while (SPACE_OR_TAB(*d)) d++;
2699
2700                     if (*d++ == '-') {
2701                         bool switches_done = PL_doswitches;
2702                         do {
2703                             if (*d == 'M' || *d == 'm') {
2704                                 char *m = d;
2705                                 while (*d && !isSPACE(*d)) d++;
2706                                 Perl_croak(aTHX_ "Too late for \"-%.*s\" option",
2707                                       (int)(d - m), m);
2708                             }
2709                             d = moreswitches(d);
2710                         } while (d);
2711                         if ((PERLDB_LINE && !oldpdb) ||
2712                             ((PL_minus_n || PL_minus_p) && !(oldn || oldp)))
2713                               /* if we have already added "LINE: while (<>) {",
2714                                  we must not do it again */
2715                         {
2716                             sv_setpv(PL_linestr, "");
2717                             PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2718                             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
2719                             PL_last_lop = PL_last_uni = Nullch;
2720                             PL_preambled = FALSE;
2721                             if (PERLDB_LINE)
2722                                 (void)gv_fetchfile(PL_origfilename);
2723                             goto retry;
2724                         }
2725                         if (PL_doswitches && !switches_done) {
2726                             int argc = PL_origargc;
2727                             char **argv = PL_origargv;
2728                             do {
2729                                 argc--,argv++;
2730                             } while (argc && argv[0][0] == '-' && argv[0][1]);
2731                             init_argv_symbols(argc,argv);
2732                         }
2733                     }
2734                 }
2735             }
2736         }
2737         if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
2738             PL_bufptr = s;
2739             PL_lex_state = LEX_FORMLINE;
2740             return yylex();
2741         }
2742         goto retry;
2743     case '\r':
2744 #ifdef PERL_STRICT_CR
2745         Perl_warn(aTHX_ "Illegal character \\%03o (carriage return)", '\r');
2746         Perl_croak(aTHX_
2747       "\t(Maybe you didn't strip carriage returns after a network transfer?)\n");
2748 #endif
2749     case ' ': case '\t': case '\f': case 013:
2750 #ifdef MACOS_TRADITIONAL
2751     case '\312':
2752 #endif
2753         s++;
2754         goto retry;
2755     case '#':
2756     case '\n':
2757         if (PL_lex_state != LEX_NORMAL || (PL_in_eval && !PL_rsfp)) {
2758             if (*s == '#' && s == PL_linestart && PL_in_eval && !PL_rsfp) {
2759                 /* handle eval qq[#line 1 "foo"\n ...] */
2760                 CopLINE_dec(PL_curcop);
2761                 incline(s);
2762             }
2763             d = PL_bufend;
2764             while (s < d && *s != '\n')
2765                 s++;
2766             if (s < d)
2767                 s++;
2768             else if (s > d) /* Found by Ilya: feed random input to Perl. */
2769               Perl_croak(aTHX_ "panic: input overflow");
2770             incline(s);
2771             if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
2772                 PL_bufptr = s;
2773                 PL_lex_state = LEX_FORMLINE;
2774                 return yylex();
2775             }
2776         }
2777         else {
2778             *s = '\0';
2779             PL_bufend = s;
2780         }
2781         goto retry;
2782     case '-':
2783         if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
2784             I32 ftst = 0;
2785
2786             s++;
2787             PL_bufptr = s;
2788             tmp = *s++;
2789
2790             while (s < PL_bufend && SPACE_OR_TAB(*s))
2791                 s++;
2792
2793             if (strnEQ(s,"=>",2)) {
2794                 s = force_word(PL_bufptr,WORD,FALSE,FALSE,FALSE);
2795                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
2796                             "### Saw unary minus before =>, forcing word '%s'\n", s);
2797                 } );
2798                 OPERATOR('-');          /* unary minus */
2799             }
2800             PL_last_uni = PL_oldbufptr;
2801             switch (tmp) {
2802             case 'r': ftst = OP_FTEREAD;        break;
2803             case 'w': ftst = OP_FTEWRITE;       break;
2804             case 'x': ftst = OP_FTEEXEC;        break;
2805             case 'o': ftst = OP_FTEOWNED;       break;
2806             case 'R': ftst = OP_FTRREAD;        break;
2807             case 'W': ftst = OP_FTRWRITE;       break;
2808             case 'X': ftst = OP_FTREXEC;        break;
2809             case 'O': ftst = OP_FTROWNED;       break;
2810             case 'e': ftst = OP_FTIS;           break;
2811             case 'z': ftst = OP_FTZERO;         break;
2812             case 's': ftst = OP_FTSIZE;         break;
2813             case 'f': ftst = OP_FTFILE;         break;
2814             case 'd': ftst = OP_FTDIR;          break;
2815             case 'l': ftst = OP_FTLINK;         break;
2816             case 'p': ftst = OP_FTPIPE;         break;
2817             case 'S': ftst = OP_FTSOCK;         break;
2818             case 'u': ftst = OP_FTSUID;         break;
2819             case 'g': ftst = OP_FTSGID;         break;
2820             case 'k': ftst = OP_FTSVTX;         break;
2821             case 'b': ftst = OP_FTBLK;          break;
2822             case 'c': ftst = OP_FTCHR;          break;
2823             case 't': ftst = OP_FTTTY;          break;
2824             case 'T': ftst = OP_FTTEXT;         break;
2825             case 'B': ftst = OP_FTBINARY;       break;
2826             case 'M': case 'A': case 'C':
2827                 gv_fetchpv("\024",TRUE, SVt_PV);
2828                 switch (tmp) {
2829                 case 'M': ftst = OP_FTMTIME;    break;
2830                 case 'A': ftst = OP_FTATIME;    break;
2831                 case 'C': ftst = OP_FTCTIME;    break;
2832                 default:                        break;
2833                 }
2834                 break;
2835             default:
2836                 break;
2837             }
2838             if (ftst) {
2839                 PL_last_lop_op = (OPCODE)ftst;
2840                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
2841                         "### Saw file test %c\n", (int)ftst);
2842                 } );
2843                 FTST(ftst);
2844             }
2845             else {
2846                 /* Assume it was a minus followed by a one-letter named
2847                  * subroutine call (or a -bareword), then. */
2848                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
2849                         "### %c looked like a file test but was not\n",
2850                         (int)ftst);
2851                 } );
2852                 s -= 2;
2853             }
2854         }
2855         tmp = *s++;
2856         if (*s == tmp) {
2857             s++;
2858             if (PL_expect == XOPERATOR)
2859                 TERM(POSTDEC);
2860             else
2861                 OPERATOR(PREDEC);
2862         }
2863         else if (*s == '>') {
2864             s++;
2865             s = skipspace(s);
2866             if (isIDFIRST_lazy_if(s,UTF)) {
2867                 s = force_word(s,METHOD,FALSE,TRUE,FALSE);
2868                 TOKEN(ARROW);
2869             }
2870             else if (*s == '$')
2871                 OPERATOR(ARROW);
2872             else
2873                 TERM(ARROW);
2874         }
2875         if (PL_expect == XOPERATOR)
2876             Aop(OP_SUBTRACT);
2877         else {
2878             if (isSPACE(*s) || !isSPACE(*PL_bufptr))
2879                 check_uni();
2880             OPERATOR('-');              /* unary minus */
2881         }
2882
2883     case '+':
2884         tmp = *s++;
2885         if (*s == tmp) {
2886             s++;
2887             if (PL_expect == XOPERATOR)
2888                 TERM(POSTINC);
2889             else
2890                 OPERATOR(PREINC);
2891         }
2892         if (PL_expect == XOPERATOR)
2893             Aop(OP_ADD);
2894         else {
2895             if (isSPACE(*s) || !isSPACE(*PL_bufptr))
2896                 check_uni();
2897             OPERATOR('+');
2898         }
2899
2900     case '*':
2901         if (PL_expect != XOPERATOR) {
2902             s = scan_ident(s, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
2903             PL_expect = XOPERATOR;
2904             force_ident(PL_tokenbuf, '*');
2905             if (!*PL_tokenbuf)
2906                 PREREF('*');
2907             TERM('*');
2908         }
2909         s++;
2910         if (*s == '*') {
2911             s++;
2912             PWop(OP_POW);
2913         }
2914         Mop(OP_MULTIPLY);
2915
2916     case '%':
2917         if (PL_expect == XOPERATOR) {
2918             ++s;
2919             Mop(OP_MODULO);
2920         }
2921         PL_tokenbuf[0] = '%';
2922         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, TRUE);
2923         if (!PL_tokenbuf[1]) {
2924             if (s == PL_bufend)
2925                 yyerror("Final % should be \\% or %name");
2926             PREREF('%');
2927         }
2928         PL_pending_ident = '%';
2929         TERM('%');
2930
2931     case '^':
2932         s++;
2933         BOop(OP_BIT_XOR);
2934     case '[':
2935         PL_lex_brackets++;
2936         /* FALL THROUGH */
2937     case '~':
2938     case ',':
2939         tmp = *s++;
2940         OPERATOR(tmp);
2941     case ':':
2942         if (s[1] == ':') {
2943             len = 0;
2944             goto just_a_word;
2945         }
2946         s++;
2947         switch (PL_expect) {
2948             OP *attrs;
2949         case XOPERATOR:
2950             if (!PL_in_my || PL_lex_state != LEX_NORMAL)
2951                 break;
2952             PL_bufptr = s;      /* update in case we back off */
2953             goto grabattrs;
2954         case XATTRBLOCK:
2955             PL_expect = XBLOCK;
2956             goto grabattrs;
2957         case XATTRTERM:
2958             PL_expect = XTERMBLOCK;
2959          grabattrs:
2960             s = skipspace(s);
2961             attrs = Nullop;
2962             while (isIDFIRST_lazy_if(s,UTF)) {
2963                 d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
2964                 if (isLOWER(*s) && (tmp = keyword(PL_tokenbuf, len))) {
2965                     if (tmp < 0) tmp = -tmp;
2966                     switch (tmp) {
2967                     case KEY_or:
2968                     case KEY_and:
2969                     case KEY_for:
2970                     case KEY_unless:
2971                     case KEY_if:
2972                     case KEY_while:
2973                     case KEY_until:
2974                         goto got_attrs;
2975                     default:
2976                         break;
2977                     }
2978                 }
2979                 if (*d == '(') {
2980                     d = scan_str(d,TRUE,TRUE);
2981                     if (!d) {
2982                         /* MUST advance bufptr here to avoid bogus
2983                            "at end of line" context messages from yyerror().
2984                          */
2985                         PL_bufptr = s + len;
2986                         yyerror("Unterminated attribute parameter in attribute list");
2987                         if (attrs)
2988                             op_free(attrs);
2989                         return 0;       /* EOF indicator */
2990                     }
2991                 }
2992                 if (PL_lex_stuff) {
2993                     SV *sv = newSVpvn(s, len);
2994                     sv_catsv(sv, PL_lex_stuff);
2995                     attrs = append_elem(OP_LIST, attrs,
2996                                         newSVOP(OP_CONST, 0, sv));
2997                     SvREFCNT_dec(PL_lex_stuff);
2998                     PL_lex_stuff = Nullsv;
2999                 }
3000                 else {
3001                     /* NOTE: any CV attrs applied here need to be part of
3002                        the CVf_BUILTIN_ATTRS define in cv.h! */
3003                     if (!PL_in_my && len == 6 && strnEQ(s, "lvalue", len))
3004                         CvLVALUE_on(PL_compcv);
3005                     else if (!PL_in_my && len == 6 && strnEQ(s, "locked", len))
3006                         CvLOCKED_on(PL_compcv);
3007                     else if (!PL_in_my && len == 6 && strnEQ(s, "method", len))
3008                         CvMETHOD_on(PL_compcv);
3009 #ifdef USE_ITHREADS
3010                     else if (PL_in_my == KEY_our && len == 6 &&
3011                              strnEQ(s, "unique", len))
3012                         GvUNIQUE_on(cGVOPx_gv(yylval.opval));
3013 #endif
3014                     /* After we've set the flags, it could be argued that
3015                        we don't need to do the attributes.pm-based setting
3016                        process, and shouldn't bother appending recognized
3017                        flags.  To experiment with that, uncomment the
3018                        following "else".  (Note that's already been
3019                        uncommented.  That keeps the above-applied built-in
3020                        attributes from being intercepted (and possibly
3021                        rejected) by a package's attribute routines, but is
3022                        justified by the performance win for the common case
3023                        of applying only built-in attributes.) */
3024                     else
3025                         attrs = append_elem(OP_LIST, attrs,
3026                                             newSVOP(OP_CONST, 0,
3027                                                     newSVpvn(s, len)));
3028                 }
3029                 s = skipspace(d);
3030                 if (*s == ':' && s[1] != ':')
3031                     s = skipspace(s+1);
3032                 else if (s == d)
3033                     break;      /* require real whitespace or :'s */
3034             }
3035             tmp = (PL_expect == XOPERATOR ? '=' : '{'); /*'}(' for vi */
3036             if (*s != ';' && *s != tmp && (tmp != '=' || *s != ')')) {
3037                 char q = ((*s == '\'') ? '"' : '\'');
3038                 /* If here for an expression, and parsed no attrs, back off. */
3039                 if (tmp == '=' && !attrs) {
3040                     s = PL_bufptr;
3041                     break;
3042                 }
3043                 /* MUST advance bufptr here to avoid bogus "at end of line"
3044                    context messages from yyerror().
3045                  */
3046                 PL_bufptr = s;
3047                 if (!*s)
3048                     yyerror("Unterminated attribute list");
3049                 else
3050                     yyerror(Perl_form(aTHX_ "Invalid separator character %c%c%c in attribute list",
3051                                       q, *s, q));
3052                 if (attrs)
3053                     op_free(attrs);
3054                 OPERATOR(':');
3055             }
3056         got_attrs:
3057             if (attrs) {
3058                 PL_nextval[PL_nexttoke].opval = attrs;
3059                 force_next(THING);
3060             }
3061             TOKEN(COLONATTR);
3062         }
3063         OPERATOR(':');
3064     case '(':
3065         s++;
3066         if (PL_last_lop == PL_oldoldbufptr || PL_last_uni == PL_oldoldbufptr)
3067             PL_oldbufptr = PL_oldoldbufptr;             /* allow print(STDOUT 123) */
3068         else
3069             PL_expect = XTERM;
3070         TOKEN('(');
3071     case ';':
3072         CLINE;
3073         tmp = *s++;
3074         OPERATOR(tmp);
3075     case ')':
3076         tmp = *s++;
3077         s = skipspace(s);
3078         if (*s == '{')
3079             PREBLOCK(tmp);
3080         TERM(tmp);
3081     case ']':
3082         s++;
3083         if (PL_lex_brackets <= 0)
3084             yyerror("Unmatched right square bracket");
3085         else
3086             --PL_lex_brackets;
3087         if (PL_lex_state == LEX_INTERPNORMAL) {
3088             if (PL_lex_brackets == 0) {
3089                 if (*s != '[' && *s != '{' && (*s != '-' || s[1] != '>'))
3090                     PL_lex_state = LEX_INTERPEND;
3091             }
3092         }
3093         TERM(']');
3094     case '{':
3095       leftbracket:
3096         s++;
3097         if (PL_lex_brackets > 100) {
3098             char* newlb = Renew(PL_lex_brackstack, PL_lex_brackets + 1, char);
3099             if (newlb != PL_lex_brackstack) {
3100                 SAVEFREEPV(newlb);
3101                 PL_lex_brackstack = newlb;
3102             }
3103         }
3104         switch (PL_expect) {
3105         case XTERM:
3106             if (PL_lex_formbrack) {
3107                 s--;
3108                 PRETERMBLOCK(DO);
3109             }
3110             if (PL_oldoldbufptr == PL_last_lop)
3111                 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
3112             else
3113                 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
3114             OPERATOR(HASHBRACK);
3115         case XOPERATOR:
3116             while (s < PL_bufend && SPACE_OR_TAB(*s))
3117                 s++;
3118             d = s;
3119             PL_tokenbuf[0] = '\0';
3120             if (d < PL_bufend && *d == '-') {
3121                 PL_tokenbuf[0] = '-';
3122                 d++;
3123                 while (d < PL_bufend && SPACE_OR_TAB(*d))
3124                     d++;
3125             }
3126             if (d < PL_bufend && isIDFIRST_lazy_if(d,UTF)) {
3127                 d = scan_word(d, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
3128                               FALSE, &len);
3129                 while (d < PL_bufend && SPACE_OR_TAB(*d))
3130                     d++;
3131                 if (*d == '}') {
3132                     char minus = (PL_tokenbuf[0] == '-');
3133                     s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
3134                     if (minus)
3135                         force_next('-');
3136                 }
3137             }
3138             /* FALL THROUGH */
3139         case XATTRBLOCK:
3140         case XBLOCK:
3141             PL_lex_brackstack[PL_lex_brackets++] = XSTATE;
3142             PL_expect = XSTATE;
3143             break;
3144         case XATTRTERM:
3145         case XTERMBLOCK:
3146             PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
3147             PL_expect = XSTATE;
3148             break;
3149         default: {
3150                 char *t;
3151                 if (PL_oldoldbufptr == PL_last_lop)
3152                     PL_lex_brackstack[PL_lex_brackets++] = XTERM;
3153                 else
3154                     PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
3155                 s = skipspace(s);
3156                 if (*s == '}') {
3157                     if (PL_expect == XREF && PL_lex_state == LEX_INTERPNORMAL) {
3158                         PL_expect = XTERM;
3159                         /* This hack is to get the ${} in the message. */
3160                         PL_bufptr = s+1;
3161                         yyerror("syntax error");
3162                         break;
3163                     }
3164                     OPERATOR(HASHBRACK);
3165                 }
3166                 /* This hack serves to disambiguate a pair of curlies
3167                  * as being a block or an anon hash.  Normally, expectation
3168                  * determines that, but in cases where we're not in a
3169                  * position to expect anything in particular (like inside
3170                  * eval"") we have to resolve the ambiguity.  This code
3171                  * covers the case where the first term in the curlies is a
3172                  * quoted string.  Most other cases need to be explicitly
3173                  * disambiguated by prepending a `+' before the opening
3174                  * curly in order to force resolution as an anon hash.
3175                  *
3176                  * XXX should probably propagate the outer expectation
3177                  * into eval"" to rely less on this hack, but that could
3178                  * potentially break current behavior of eval"".
3179                  * GSAR 97-07-21
3180                  */
3181                 t = s;
3182                 if (*s == '\'' || *s == '"' || *s == '`') {
3183                     /* common case: get past first string, handling escapes */
3184                     for (t++; t < PL_bufend && *t != *s;)
3185                         if (*t++ == '\\' && (*t == '\\' || *t == *s))
3186                             t++;
3187                     t++;
3188                 }
3189                 else if (*s == 'q') {
3190                     if (++t < PL_bufend
3191                         && (!isALNUM(*t)
3192                             || ((*t == 'q' || *t == 'x') && ++t < PL_bufend
3193                                 && !isALNUM(*t))))
3194                     {
3195                         char *tmps;
3196                         char open, close, term;
3197                         I32 brackets = 1;
3198
3199                         while (t < PL_bufend && isSPACE(*t))
3200                             t++;
3201                         term = *t;
3202                         open = term;
3203                         if (term && (tmps = strchr("([{< )]}> )]}>",term)))
3204                             term = tmps[5];
3205                         close = term;
3206                         if (open == close)
3207                             for (t++; t < PL_bufend; t++) {
3208                                 if (*t == '\\' && t+1 < PL_bufend && open != '\\')
3209                                     t++;
3210                                 else if (*t == open)
3211                                     break;
3212                             }
3213                         else
3214                             for (t++; t < PL_bufend; t++) {
3215                                 if (*t == '\\' && t+1 < PL_bufend)
3216                                     t++;
3217                                 else if (*t == close && --brackets <= 0)
3218                                     break;
3219                                 else if (*t == open)
3220                                     brackets++;
3221                             }
3222                     }
3223                     t++;
3224                 }
3225                 else if (isALNUM_lazy_if(t,UTF)) {
3226                     t += UTF8SKIP(t);
3227                     while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
3228                          t += UTF8SKIP(t);
3229                 }
3230                 while (t < PL_bufend && isSPACE(*t))
3231                     t++;
3232                 /* if comma follows first term, call it an anon hash */
3233                 /* XXX it could be a comma expression with loop modifiers */
3234                 if (t < PL_bufend && ((*t == ',' && (*s == 'q' || !isLOWER(*s)))
3235                                    || (*t == '=' && t[1] == '>')))
3236                     OPERATOR(HASHBRACK);
3237                 if (PL_expect == XREF)
3238                     PL_expect = XTERM;
3239                 else {
3240                     PL_lex_brackstack[PL_lex_brackets-1] = XSTATE;
3241                     PL_expect = XSTATE;
3242                 }
3243             }
3244             break;
3245         }
3246         yylval.ival = CopLINE(PL_curcop);
3247         if (isSPACE(*s) || *s == '#')
3248             PL_copline = NOLINE;   /* invalidate current command line number */
3249         TOKEN('{');
3250     case '}':
3251       rightbracket:
3252         s++;
3253         if (PL_lex_brackets <= 0)
3254             yyerror("Unmatched right curly bracket");
3255         else
3256             PL_expect = (expectation)PL_lex_brackstack[--PL_lex_brackets];
3257         if (PL_lex_brackets < PL_lex_formbrack && PL_lex_state != LEX_INTERPNORMAL)
3258             PL_lex_formbrack = 0;
3259         if (PL_lex_state == LEX_INTERPNORMAL) {
3260             if (PL_lex_brackets == 0) {
3261                 if (PL_expect & XFAKEBRACK) {
3262                     PL_expect &= XENUMMASK;
3263                     PL_lex_state = LEX_INTERPEND;
3264                     PL_bufptr = s;
3265                     return yylex();     /* ignore fake brackets */
3266                 }
3267                 if (*s == '-' && s[1] == '>')
3268                     PL_lex_state = LEX_INTERPENDMAYBE;
3269                 else if (*s != '[' && *s != '{')
3270                     PL_lex_state = LEX_INTERPEND;
3271             }
3272         }
3273         if (PL_expect & XFAKEBRACK) {
3274             PL_expect &= XENUMMASK;
3275             PL_bufptr = s;
3276             return yylex();             /* ignore fake brackets */
3277         }
3278         force_next('}');
3279         TOKEN(';');
3280     case '&':
3281         s++;
3282         tmp = *s++;
3283         if (tmp == '&')
3284             AOPERATOR(ANDAND);
3285         s--;
3286         if (PL_expect == XOPERATOR) {
3287             if (ckWARN(WARN_SEMICOLON)
3288                 && isIDFIRST_lazy_if(s,UTF) && PL_bufptr == PL_linestart)
3289             {
3290                 CopLINE_dec(PL_curcop);
3291                 Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), PL_warn_nosemi);
3292                 CopLINE_inc(PL_curcop);
3293             }
3294             BAop(OP_BIT_AND);
3295         }
3296
3297         s = scan_ident(s - 1, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
3298         if (*PL_tokenbuf) {
3299             PL_expect = XOPERATOR;
3300             force_ident(PL_tokenbuf, '&');
3301         }
3302         else
3303             PREREF('&');
3304         yylval.ival = (OPpENTERSUB_AMPER<<8);
3305         TERM('&');
3306
3307     case '|':
3308         s++;
3309         tmp = *s++;
3310         if (tmp == '|')
3311             AOPERATOR(OROR);
3312         s--;
3313         BOop(OP_BIT_OR);
3314     case '=':
3315         s++;
3316         tmp = *s++;
3317         if (tmp == '=')
3318             Eop(OP_EQ);
3319         if (tmp == '>')
3320             OPERATOR(',');
3321         if (tmp == '~')
3322             PMop(OP_MATCH);
3323         if (ckWARN(WARN_SYNTAX) && tmp && isSPACE(*s) && strchr("+-*/%.^&|<",tmp))
3324             Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Reversed %c= operator",(int)tmp);
3325         s--;
3326         if (PL_expect == XSTATE && isALPHA(tmp) &&
3327                 (s == PL_linestart+1 || s[-2] == '\n') )
3328         {
3329             if (PL_in_eval && !PL_rsfp) {
3330                 d = PL_bufend;
3331                 while (s < d) {
3332                     if (*s++ == '\n') {
3333                         incline(s);
3334                         if (strnEQ(s,"=cut",4)) {
3335                             s = strchr(s,'\n');
3336                             if (s)
3337                                 s++;
3338                             else
3339                                 s = d;
3340                             incline(s);
3341                             goto retry;
3342                         }
3343                     }
3344                 }
3345                 goto retry;
3346             }
3347             s = PL_bufend;
3348             PL_doextract = TRUE;
3349             goto retry;
3350         }
3351         if (PL_lex_brackets < PL_lex_formbrack) {
3352             char *t;
3353 #ifdef PERL_STRICT_CR
3354             for (t = s; SPACE_OR_TAB(*t); t++) ;
3355 #else
3356             for (t = s; SPACE_OR_TAB(*t) || *t == '\r'; t++) ;
3357 #endif
3358             if (*t == '\n' || *t == '#') {
3359                 s--;
3360                 PL_expect = XBLOCK;
3361                 goto leftbracket;
3362             }
3363         }
3364         yylval.ival = 0;
3365         OPERATOR(ASSIGNOP);
3366     case '!':
3367         s++;
3368         tmp = *s++;
3369         if (tmp == '=')
3370             Eop(OP_NE);
3371         if (tmp == '~')
3372             PMop(OP_NOT);
3373         s--;
3374         OPERATOR('!');
3375     case '<':
3376         if (PL_expect != XOPERATOR) {
3377             if (s[1] != '<' && !strchr(s,'>'))
3378                 check_uni();
3379             if (s[1] == '<')
3380                 s = scan_heredoc(s);
3381             else
3382                 s = scan_inputsymbol(s);
3383             TERM(sublex_start());
3384         }
3385         s++;
3386         tmp = *s++;
3387         if (tmp == '<')
3388             SHop(OP_LEFT_SHIFT);
3389         if (tmp == '=') {
3390             tmp = *s++;
3391             if (tmp == '>')
3392                 Eop(OP_NCMP);
3393             s--;
3394             Rop(OP_LE);
3395         }
3396         s--;
3397         Rop(OP_LT);
3398     case '>':
3399         s++;
3400         tmp = *s++;
3401         if (tmp == '>')
3402             SHop(OP_RIGHT_SHIFT);
3403         if (tmp == '=')
3404             Rop(OP_GE);
3405         s--;
3406         Rop(OP_GT);
3407
3408     case '$':
3409         CLINE;
3410
3411         if (PL_expect == XOPERATOR) {
3412             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3413                 PL_expect = XTERM;
3414                 depcom();
3415                 return ','; /* grandfather non-comma-format format */
3416             }
3417         }
3418
3419         if (s[1] == '#' && (isIDFIRST_lazy_if(s+2,UTF) || strchr("{$:+-", s[2]))) {
3420             PL_tokenbuf[0] = '@';
3421             s = scan_ident(s + 1, PL_bufend, PL_tokenbuf + 1,
3422                            sizeof PL_tokenbuf - 1, FALSE);
3423             if (PL_expect == XOPERATOR)
3424                 no_op("Array length", s);
3425             if (!PL_tokenbuf[1])
3426                 PREREF(DOLSHARP);
3427             PL_expect = XOPERATOR;
3428             PL_pending_ident = '#';
3429             TOKEN(DOLSHARP);
3430         }
3431
3432         PL_tokenbuf[0] = '$';
3433         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
3434                        sizeof PL_tokenbuf - 1, FALSE);
3435         if (PL_expect == XOPERATOR)
3436             no_op("Scalar", s);
3437         if (!PL_tokenbuf[1]) {
3438             if (s == PL_bufend)
3439                 yyerror("Final $ should be \\$ or $name");
3440             PREREF('$');
3441         }
3442
3443         /* This kludge not intended to be bulletproof. */
3444         if (PL_tokenbuf[1] == '[' && !PL_tokenbuf[2]) {
3445             yylval.opval = newSVOP(OP_CONST, 0,
3446                                    newSViv(PL_compiling.cop_arybase));
3447             yylval.opval->op_private = OPpCONST_ARYBASE;
3448             TERM(THING);
3449         }
3450
3451         d = s;
3452         tmp = (I32)*s;
3453         if (PL_lex_state == LEX_NORMAL)
3454             s = skipspace(s);
3455
3456         if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
3457             char *t;
3458             if (*s == '[') {
3459                 PL_tokenbuf[0] = '@';
3460                 if (ckWARN(WARN_SYNTAX)) {
3461                     for(t = s + 1;
3462                         isSPACE(*t) || isALNUM_lazy_if(t,UTF) || *t == '$';
3463                         t++) ;
3464                     if (*t++ == ',') {
3465                         PL_bufptr = skipspace(PL_bufptr);
3466                         while (t < PL_bufend && *t != ']')
3467                             t++;
3468                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
3469                                 "Multidimensional syntax %.*s not supported",
3470                                 (t - PL_bufptr) + 1, PL_bufptr);
3471                     }
3472                 }
3473             }
3474             else if (*s == '{') {
3475                 PL_tokenbuf[0] = '%';
3476                 if (ckWARN(WARN_SYNTAX) && strEQ(PL_tokenbuf+1, "SIG") &&
3477                     (t = strchr(s, '}')) && (t = strchr(t, '=')))
3478                 {
3479                     char tmpbuf[sizeof PL_tokenbuf];
3480                     STRLEN len;
3481                     for (t++; isSPACE(*t); t++) ;
3482                     if (isIDFIRST_lazy_if(t,UTF)) {
3483                         t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE, &len);
3484                         for (; isSPACE(*t); t++) ;
3485                         if (*t == ';' && get_cv(tmpbuf, FALSE))
3486                             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
3487                                 "You need to quote \"%s\"", tmpbuf);
3488                     }
3489                 }
3490             }
3491         }
3492
3493         PL_expect = XOPERATOR;
3494         if (PL_lex_state == LEX_NORMAL && isSPACE((char)tmp)) {
3495             bool islop = (PL_last_lop == PL_oldoldbufptr);
3496             if (!islop || PL_last_lop_op == OP_GREPSTART)
3497                 PL_expect = XOPERATOR;
3498             else if (strchr("$@\"'`q", *s))
3499                 PL_expect = XTERM;              /* e.g. print $fh "foo" */
3500             else if (strchr("&*<%", *s) && isIDFIRST_lazy_if(s+1,UTF))
3501                 PL_expect = XTERM;              /* e.g. print $fh &sub */
3502             else if (isIDFIRST_lazy_if(s,UTF)) {
3503                 char tmpbuf[sizeof PL_tokenbuf];
3504                 scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
3505                 if ((tmp = keyword(tmpbuf, len))) {
3506                     /* binary operators exclude handle interpretations */
3507                     switch (tmp) {
3508                     case -KEY_x:
3509                     case -KEY_eq:
3510                     case -KEY_ne:
3511                     case -KEY_gt:
3512                     case -KEY_lt:
3513                     case -KEY_ge:
3514                     case -KEY_le:
3515                     case -KEY_cmp:
3516                         break;
3517                     default:
3518                         PL_expect = XTERM;      /* e.g. print $fh length() */
3519                         break;
3520                     }
3521                 }
3522                 else {
3523                     GV *gv = gv_fetchpv(tmpbuf, FALSE, SVt_PVCV);
3524                     if (gv && GvCVu(gv))
3525                         PL_expect = XTERM;      /* e.g. print $fh subr() */
3526                 }
3527             }
3528             else if (isDIGIT(*s))
3529                 PL_expect = XTERM;              /* e.g. print $fh 3 */
3530             else if (*s == '.' && isDIGIT(s[1]))
3531                 PL_expect = XTERM;              /* e.g. print $fh .3 */
3532             else if (strchr("/?-+", *s) && !isSPACE(s[1]) && s[1] != '=')
3533                 PL_expect = XTERM;              /* e.g. print $fh -1 */
3534             else if (*s == '<' && s[1] == '<' && !isSPACE(s[2]) && s[2] != '=')
3535                 PL_expect = XTERM;              /* print $fh <<"EOF" */
3536         }
3537         PL_pending_ident = '$';
3538         TOKEN('$');
3539
3540     case '@':
3541         if (PL_expect == XOPERATOR)
3542             no_op("Array", s);
3543         PL_tokenbuf[0] = '@';
3544         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, FALSE);
3545         if (!PL_tokenbuf[1]) {
3546             if (s == PL_bufend)
3547                 yyerror("Final @ should be \\@ or @name");
3548             PREREF('@');
3549         }
3550         if (PL_lex_state == LEX_NORMAL)
3551             s = skipspace(s);
3552         if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
3553             if (*s == '{')
3554                 PL_tokenbuf[0] = '%';
3555
3556             /* Warn about @ where they meant $. */
3557             if (ckWARN(WARN_SYNTAX)) {
3558                 if (*s == '[' || *s == '{') {
3559                     char *t = s + 1;
3560                     while (*t && (isALNUM_lazy_if(t,UTF) || strchr(" \t$#+-'\"", *t)))
3561                         t++;
3562                     if (*t == '}' || *t == ']') {
3563                         t++;
3564                         PL_bufptr = skipspace(PL_bufptr);
3565                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
3566                             "Scalar value %.*s better written as $%.*s",
3567                             t-PL_bufptr, PL_bufptr, t-PL_bufptr-1, PL_bufptr+1);
3568                     }
3569                 }
3570             }
3571         }
3572         PL_pending_ident = '@';
3573         TERM('@');
3574
3575     case '/':                   /* may either be division or pattern */
3576     case '?':                   /* may either be conditional or pattern */
3577         if (PL_expect != XOPERATOR) {
3578             /* Disable warning on "study /blah/" */
3579             if (PL_oldoldbufptr == PL_last_uni
3580                 && (*PL_last_uni != 's' || s - PL_last_uni < 5
3581                     || memNE(PL_last_uni, "study", 5)
3582                     || isALNUM_lazy_if(PL_last_uni+5,UTF)))
3583                 check_uni();
3584             s = scan_pat(s,OP_MATCH);
3585             TERM(sublex_start());
3586         }
3587         tmp = *s++;
3588         if (tmp == '/')
3589             Mop(OP_DIVIDE);
3590         OPERATOR(tmp);
3591
3592     case '.':
3593         if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack
3594 #ifdef PERL_STRICT_CR
3595             && s[1] == '\n'
3596 #else
3597             && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n'))
3598 #endif
3599             && (s == PL_linestart || s[-1] == '\n') )
3600         {
3601             PL_lex_formbrack = 0;
3602             PL_expect = XSTATE;
3603             goto rightbracket;
3604         }
3605         if (PL_expect == XOPERATOR || !isDIGIT(s[1])) {
3606             tmp = *s++;
3607             if (*s == tmp) {
3608                 s++;
3609                 if (*s == tmp) {
3610                     s++;
3611                     yylval.ival = OPf_SPECIAL;
3612                 }
3613                 else
3614                     yylval.ival = 0;
3615                 OPERATOR(DOTDOT);
3616             }
3617             if (PL_expect != XOPERATOR)
3618                 check_uni();
3619             Aop(OP_CONCAT);
3620         }
3621         /* FALL THROUGH */
3622     case '0': case '1': case '2': case '3': case '4':
3623     case '5': case '6': case '7': case '8': case '9':
3624         s = scan_num(s, &yylval);
3625         DEBUG_T( { PerlIO_printf(Perl_debug_log,
3626                     "### Saw number in '%s'\n", s);
3627         } );
3628         if (PL_expect == XOPERATOR)
3629             no_op("Number",s);
3630         TERM(THING);
3631
3632     case '\'':
3633         s = scan_str(s,FALSE,FALSE);
3634         DEBUG_T( { PerlIO_printf(Perl_debug_log,
3635                     "### Saw string before '%s'\n", s);
3636         } );
3637         if (PL_expect == XOPERATOR) {
3638             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3639                 PL_expect = XTERM;
3640                 depcom();
3641                 return ',';     /* grandfather non-comma-format format */
3642             }
3643             else
3644                 no_op("String",s);
3645         }
3646         if (!s)
3647             missingterm((char*)0);
3648         yylval.ival = OP_CONST;
3649         TERM(sublex_start());
3650
3651     case '"':
3652         s = scan_str(s,FALSE,FALSE);
3653         DEBUG_T( { PerlIO_printf(Perl_debug_log,
3654                     "### Saw string before '%s'\n", s);
3655         } );
3656         if (PL_expect == XOPERATOR) {
3657             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3658                 PL_expect = XTERM;
3659                 depcom();
3660                 return ',';     /* grandfather non-comma-format format */
3661             }
3662             else
3663                 no_op("String",s);
3664         }
3665         if (!s)
3666             missingterm((char*)0);
3667         yylval.ival = OP_CONST;
3668         for (d = SvPV(PL_lex_stuff, len); len; len--, d++) {
3669             if (*d == '$' || *d == '@' || *d == '\\' || !UTF8_IS_INVARIANT((U8)*d)) {
3670                 yylval.ival = OP_STRINGIFY;
3671                 break;
3672             }
3673         }
3674         TERM(sublex_start());
3675
3676     case '`':
3677         s = scan_str(s,FALSE,FALSE);
3678         DEBUG_T( { PerlIO_printf(Perl_debug_log,
3679                     "### Saw backtick string before '%s'\n", s);
3680         } );
3681         if (PL_expect == XOPERATOR)
3682             no_op("Backticks",s);
3683         if (!s)
3684             missingterm((char*)0);
3685         yylval.ival = OP_BACKTICK;
3686         set_csh();
3687         TERM(sublex_start());
3688
3689     case '\\':
3690         s++;
3691         if (ckWARN(WARN_SYNTAX) && PL_lex_inwhat && isDIGIT(*s))
3692             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),"Can't use \\%c to mean $%c in expression",
3693                         *s, *s);
3694         if (PL_expect == XOPERATOR)
3695             no_op("Backslash",s);
3696         OPERATOR(REFGEN);
3697
3698     case 'v':
3699         if (isDIGIT(s[1]) && PL_expect != XOPERATOR) {
3700             char *start = s;
3701             start++;
3702             start++;
3703             while (isDIGIT(*start) || *start == '_')
3704                 start++;
3705             if (*start == '.' && isDIGIT(start[1])) {
3706                 s = scan_num(s, &yylval);
3707                 TERM(THING);
3708             }
3709             /* avoid v123abc() or $h{v1}, allow C<print v10;> */
3710             else if (!isALPHA(*start) && (PL_expect == XTERM || PL_expect == XREF || PL_expect == XSTATE)) {
3711                 char c = *start;
3712                 GV *gv;
3713                 *start = '\0';
3714                 gv = gv_fetchpv(s, FALSE, SVt_PVCV);
3715                 *start = c;
3716                 if (!gv) {
3717                     s = scan_num(s, &yylval);
3718                     TERM(THING);
3719                 }
3720             }
3721         }
3722         goto keylookup;
3723     case 'x':
3724         if (isDIGIT(s[1]) && PL_expect == XOPERATOR) {
3725             s++;
3726             Mop(OP_REPEAT);
3727         }
3728         goto keylookup;
3729
3730     case '_':
3731     case 'a': case 'A':
3732     case 'b': case 'B':
3733     case 'c': case 'C':
3734     case 'd': case 'D':
3735     case 'e': case 'E':
3736     case 'f': case 'F':
3737     case 'g': case 'G':
3738     case 'h': case 'H':
3739     case 'i': case 'I':
3740     case 'j': case 'J':
3741     case 'k': case 'K':
3742     case 'l': case 'L':
3743     case 'm': case 'M':
3744     case 'n': case 'N':
3745     case 'o': case 'O':
3746     case 'p': case 'P':
3747     case 'q': case 'Q':
3748     case 'r': case 'R':
3749     case 's': case 'S':
3750     case 't': case 'T':
3751     case 'u': case 'U':
3752               case 'V':
3753     case 'w': case 'W':
3754               case 'X':
3755     case 'y': case 'Y':
3756     case 'z': case 'Z':
3757
3758       keylookup: {
3759         gv = Nullgv;
3760         gvp = 0;
3761
3762         PL_bufptr = s;
3763         s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
3764
3765         /* Some keywords can be followed by any delimiter, including ':' */
3766         tmp = ((len == 1 && strchr("msyq", PL_tokenbuf[0])) ||
3767                (len == 2 && ((PL_tokenbuf[0] == 't' && PL_tokenbuf[1] == 'r') ||
3768                              (PL_tokenbuf[0] == 'q' &&
3769                               strchr("qwxr", PL_tokenbuf[1])))));
3770
3771         /* x::* is just a word, unless x is "CORE" */
3772         if (!tmp && *s == ':' && s[1] == ':' && strNE(PL_tokenbuf, "CORE"))
3773             goto just_a_word;
3774
3775         d = s;
3776         while (d < PL_bufend && isSPACE(*d))
3777                 d++;    /* no comments skipped here, or s### is misparsed */
3778
3779         /* Is this a label? */
3780         if (!tmp && PL_expect == XSTATE
3781               && d < PL_bufend && *d == ':' && *(d + 1) != ':') {
3782             s = d + 1;
3783             yylval.pval = savepv(PL_tokenbuf);
3784             CLINE;
3785             TOKEN(LABEL);
3786         }
3787
3788         /* Check for keywords */
3789         tmp = keyword(PL_tokenbuf, len);
3790
3791         /* Is this a word before a => operator? */
3792         if (*d == '=' && d[1] == '>') {
3793             CLINE;
3794             yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(PL_tokenbuf,0));
3795             yylval.opval->op_private = OPpCONST_BARE;
3796             if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
3797               SvUTF8_on(((SVOP*)yylval.opval)->op_sv);
3798             TERM(WORD);
3799         }
3800
3801         if (tmp < 0) {                  /* second-class keyword? */
3802             GV *ogv = Nullgv;   /* override (winner) */
3803             GV *hgv = Nullgv;   /* hidden (loser) */
3804             if (PL_expect != XOPERATOR && (*s != ':' || s[1] != ':')) {
3805                 CV *cv;
3806                 if ((gv = gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVCV)) &&
3807                     (cv = GvCVu(gv)))
3808                 {
3809                     if (GvIMPORTED_CV(gv))
3810                         ogv = gv;
3811                     else if (! CvMETHOD(cv))
3812                         hgv = gv;
3813                 }
3814                 if (!ogv &&
3815                     (gvp = (GV**)hv_fetch(PL_globalstash,PL_tokenbuf,len,FALSE)) &&
3816                     (gv = *gvp) != (GV*)&PL_sv_undef &&
3817                     GvCVu(gv) && GvIMPORTED_CV(gv))
3818                 {
3819                     ogv = gv;
3820                 }
3821             }
3822             if (ogv) {
3823                 tmp = 0;                /* overridden by import or by GLOBAL */
3824             }
3825             else if (gv && !gvp
3826                      && -tmp==KEY_lock  /* XXX generalizable kludge */
3827                      && GvCVu(gv)
3828                      && !hv_fetch(GvHVn(PL_incgv), "Thread.pm", 9, FALSE))
3829             {
3830                 tmp = 0;                /* any sub overrides "weak" keyword */
3831             }
3832             else {                      /* no override */
3833                 tmp = -tmp;
3834                 if (tmp == KEY_dump && ckWARN(WARN_MISC)) {
3835                     Perl_warner(aTHX_ packWARN(WARN_MISC),
3836                             "dump() better written as CORE::dump()");
3837                 }
3838                 gv = Nullgv;
3839                 gvp = 0;
3840                 if (ckWARN(WARN_AMBIGUOUS) && hgv
3841                     && tmp != KEY_x && tmp != KEY_CORE) /* never ambiguous */
3842                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
3843                         "Ambiguous call resolved as CORE::%s(), %s",
3844                          GvENAME(hgv), "qualify as such or use &");
3845             }
3846         }
3847
3848       reserved_word:
3849         switch (tmp) {
3850
3851         default:                        /* not a keyword */
3852           just_a_word: {
3853                 SV *sv;
3854                 int pkgname = 0;
3855                 char lastchar = (PL_bufptr == PL_oldoldbufptr ? 0 : PL_bufptr[-1]);
3856
3857                 /* Get the rest if it looks like a package qualifier */
3858
3859                 if (*s == '\'' || (*s == ':' && s[1] == ':')) {
3860                     STRLEN morelen;
3861                     s = scan_word(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len,
3862                                   TRUE, &morelen);
3863                     if (!morelen)
3864                         Perl_croak(aTHX_ "Bad name after %s%s", PL_tokenbuf,
3865                                 *s == '\'' ? "'" : "::");
3866                     len += morelen;
3867                     pkgname = 1;
3868                 }
3869
3870                 if (PL_expect == XOPERATOR) {
3871                     if (PL_bufptr == PL_linestart) {
3872                         CopLINE_dec(PL_curcop);
3873                         Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), PL_warn_nosemi);
3874                         CopLINE_inc(PL_curcop);
3875                     }
3876                     else
3877                         no_op("Bareword",s);
3878                 }
3879
3880                 /* Look for a subroutine with this name in current package,
3881                    unless name is "Foo::", in which case Foo is a bearword
3882                    (and a package name). */
3883
3884                 if (len > 2 &&
3885                     PL_tokenbuf[len - 2] == ':' && PL_tokenbuf[len - 1] == ':')
3886                 {
3887                     if (ckWARN(WARN_BAREWORD) && ! gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVHV))
3888                         Perl_warner(aTHX_ packWARN(WARN_BAREWORD),
3889                             "Bareword \"%s\" refers to nonexistent package",
3890                              PL_tokenbuf);
3891                     len -= 2;
3892                     PL_tokenbuf[len] = '\0';
3893                     gv = Nullgv;
3894                     gvp = 0;
3895                 }
3896                 else {
3897                     len = 0;
3898                     if (!gv)
3899                         gv = gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVCV);
3900                 }
3901
3902                 /* if we saw a global override before, get the right name */
3903
3904                 if (gvp) {
3905                     sv = newSVpvn("CORE::GLOBAL::",14);
3906                     sv_catpv(sv,PL_tokenbuf);
3907                 }
3908                 else
3909                     sv = newSVpv(PL_tokenbuf,0);
3910
3911                 /* Presume this is going to be a bareword of some sort. */
3912
3913                 CLINE;
3914                 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
3915                 yylval.opval->op_private = OPpCONST_BARE;
3916
3917                 /* And if "Foo::", then that's what it certainly is. */
3918
3919                 if (len)
3920                     goto safe_bareword;
3921
3922                 /* See if it's the indirect object for a list operator. */
3923
3924                 if (PL_oldoldbufptr &&
3925                     PL_oldoldbufptr < PL_bufptr &&
3926                     (PL_oldoldbufptr == PL_last_lop
3927                      || PL_oldoldbufptr == PL_last_uni) &&
3928                     /* NO SKIPSPACE BEFORE HERE! */
3929                     (PL_expect == XREF ||
3930                      ((PL_opargs[PL_last_lop_op] >> OASHIFT)& 7) == OA_FILEREF))
3931                 {
3932                     bool immediate_paren = *s == '(';
3933
3934                     /* (Now we can afford to cross potential line boundary.) */
3935                     s = skipspace(s);
3936
3937                     /* Two barewords in a row may indicate method call. */
3938
3939                     if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') && (tmp=intuit_method(s,gv)))
3940                         return tmp;
3941
3942                     /* If not a declared subroutine, it's an indirect object. */
3943                     /* (But it's an indir obj regardless for sort.) */
3944
3945                     if ( !immediate_paren && (PL_last_lop_op == OP_SORT ||
3946                          ((!gv || !GvCVu(gv)) &&
3947                         (PL_last_lop_op != OP_MAPSTART &&
3948                          PL_last_lop_op != OP_GREPSTART))))
3949                     {
3950                         PL_expect = (PL_last_lop == PL_oldoldbufptr) ? XTERM : XOPERATOR;
3951                         goto bareword;
3952                     }
3953                 }
3954
3955                 PL_expect = XOPERATOR;
3956                 s = skipspace(s);
3957
3958                 /* Is this a word before a => operator? */
3959                 if (*s == '=' && s[1] == '>' && !pkgname) {
3960                     CLINE;
3961                     sv_setpv(((SVOP*)yylval.opval)->op_sv, PL_tokenbuf);
3962                     if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
3963                       SvUTF8_on(((SVOP*)yylval.opval)->op_sv);
3964                     TERM(WORD);
3965                 }
3966
3967                 /* If followed by a paren, it's certainly a subroutine. */
3968                 if (*s == '(') {
3969                     CLINE;
3970                     if (gv && GvCVu(gv)) {
3971                         for (d = s + 1; SPACE_OR_TAB(*d); d++) ;
3972                         if (*d == ')' && (sv = cv_const_sv(GvCV(gv)))) {
3973                             s = d + 1;
3974                             goto its_constant;
3975                         }
3976                     }
3977                     PL_nextval[PL_nexttoke].opval = yylval.opval;
3978                     PL_expect = XOPERATOR;
3979                     force_next(WORD);
3980                     yylval.ival = 0;
3981                     TOKEN('&');
3982                 }
3983
3984                 /* If followed by var or block, call it a method (unless sub) */
3985
3986                 if ((*s == '$' || *s == '{') && (!gv || !GvCVu(gv))) {
3987                     PL_last_lop = PL_oldbufptr;
3988                     PL_last_lop_op = OP_METHOD;
3989                     PREBLOCK(METHOD);
3990                 }
3991
3992                 /* If followed by a bareword, see if it looks like indir obj. */
3993
3994                 if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') && (tmp = intuit_method(s,gv)))
3995                     return tmp;
3996
3997                 /* Not a method, so call it a subroutine (if defined) */
3998
3999                 if (gv && GvCVu(gv)) {
4000                     CV* cv;
4001                     if (lastchar == '-' && ckWARN_d(WARN_AMBIGUOUS))
4002                         Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
4003                                 "Ambiguous use of -%s resolved as -&%s()",
4004                                 PL_tokenbuf, PL_tokenbuf);
4005                     /* Check for a constant sub */
4006                     cv = GvCV(gv);
4007                     if ((sv = cv_const_sv(cv))) {
4008                   its_constant:
4009                         SvREFCNT_dec(((SVOP*)yylval.opval)->op_sv);
4010                         ((SVOP*)yylval.opval)->op_sv = SvREFCNT_inc(sv);
4011                         yylval.opval->op_private = 0;
4012                         TOKEN(WORD);
4013                     }
4014
4015                     /* Resolve to GV now. */
4016                     op_free(yylval.opval);
4017                     yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
4018                     yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
4019                     PL_last_lop = PL_oldbufptr;
4020                     PL_last_lop_op = OP_ENTERSUB;
4021                     /* Is there a prototype? */
4022                     if (SvPOK(cv)) {
4023                         STRLEN len;
4024                         char *proto = SvPV((SV*)cv, len);
4025                         if (!len)
4026                             TERM(FUNC0SUB);
4027                         if (strEQ(proto, "$"))
4028                             OPERATOR(UNIOPSUB);
4029                         if (*proto == '&' && *s == '{') {
4030                             sv_setpv(PL_subname, PL_curstash ? 
4031                                         "__ANON__" : "__ANON__::__ANON__");
4032                             PREBLOCK(LSTOPSUB);
4033                         }
4034                     }
4035                     PL_nextval[PL_nexttoke].opval = yylval.opval;
4036                     PL_expect = XTERM;
4037                     force_next(WORD);
4038                     TOKEN(NOAMP);
4039                 }
4040
4041                 /* Call it a bare word */
4042
4043                 if (PL_hints & HINT_STRICT_SUBS)
4044                     yylval.opval->op_private |= OPpCONST_STRICT;
4045                 else {
4046                 bareword:
4047                     if (ckWARN(WARN_RESERVED)) {
4048                         if (lastchar != '-') {
4049                             for (d = PL_tokenbuf; *d && isLOWER(*d); d++) ;
4050                             if (!*d && !gv_stashpv(PL_tokenbuf,FALSE))
4051                                 Perl_warner(aTHX_ packWARN(WARN_RESERVED), PL_warn_reserved,
4052                                        PL_tokenbuf);
4053                         }
4054                     }
4055                 }
4056
4057             safe_bareword:
4058                 if (lastchar && strchr("*%&", lastchar) && ckWARN_d(WARN_AMBIGUOUS)) {
4059                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
4060                         "Operator or semicolon missing before %c%s",
4061                         lastchar, PL_tokenbuf);
4062                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
4063                         "Ambiguous use of %c resolved as operator %c",
4064                         lastchar, lastchar);
4065                 }
4066                 TOKEN(WORD);
4067             }
4068
4069         case KEY___FILE__:
4070             yylval.opval = (OP*)newSVOP(OP_CONST, 0,
4071                                         newSVpv(CopFILE(PL_curcop),0));
4072             TERM(THING);
4073
4074         case KEY___LINE__:
4075             yylval.opval = (OP*)newSVOP(OP_CONST, 0,
4076                                     Perl_newSVpvf(aTHX_ "%"IVdf, (IV)CopLINE(PL_curcop)));
4077             TERM(THING);
4078
4079         case KEY___PACKAGE__:
4080             yylval.opval = (OP*)newSVOP(OP_CONST, 0,
4081                                         (PL_curstash
4082                                          ? newSVsv(PL_curstname)
4083                                          : &PL_sv_undef));
4084             TERM(THING);
4085
4086         case KEY___DATA__:
4087         case KEY___END__: {
4088             GV *gv;
4089
4090             /*SUPPRESS 560*/
4091             if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
4092                 char *pname = "main";
4093                 if (PL_tokenbuf[2] == 'D')
4094                     pname = HvNAME(PL_curstash ? PL_curstash : PL_defstash);
4095                 gv = gv_fetchpv(Perl_form(aTHX_ "%s::DATA", pname), TRUE, SVt_PVIO);
4096                 GvMULTI_on(gv);
4097                 if (!GvIO(gv))
4098                     GvIOp(gv) = newIO();
4099                 IoIFP(GvIOp(gv)) = PL_rsfp;
4100 #if defined(HAS_FCNTL) && defined(F_SETFD)
4101                 {
4102                     int fd = PerlIO_fileno(PL_rsfp);
4103                     fcntl(fd,F_SETFD,fd >= 3);
4104                 }
4105 #endif
4106                 /* Mark this internal pseudo-handle as clean */
4107                 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
4108                 if (PL_preprocess)
4109                     IoTYPE(GvIOp(gv)) = IoTYPE_PIPE;
4110                 else if ((PerlIO*)PL_rsfp == PerlIO_stdin())
4111                     IoTYPE(GvIOp(gv)) = IoTYPE_STD;
4112                 else
4113                     IoTYPE(GvIOp(gv)) = IoTYPE_RDONLY;
4114 #if defined(WIN32) && !defined(PERL_TEXTMODE_SCRIPTS)
4115                 /* if the script was opened in binmode, we need to revert
4116                  * it to text mode for compatibility; but only iff it has CRs
4117                  * XXX this is a questionable hack at best. */
4118                 if (PL_bufend-PL_bufptr > 2
4119                     && PL_bufend[-1] == '\n' && PL_bufend[-2] == '\r')
4120                 {
4121                     Off_t loc = 0;
4122                     if (IoTYPE(GvIOp(gv)) == IoTYPE_RDONLY) {
4123                         loc = PerlIO_tell(PL_rsfp);
4124                         (void)PerlIO_seek(PL_rsfp, 0L, 0);
4125                     }
4126 #ifdef NETWARE
4127                         if (PerlLIO_setmode(PL_rsfp, O_TEXT) != -1) {
4128 #else
4129                     if (PerlLIO_setmode(PerlIO_fileno(PL_rsfp), O_TEXT) != -1) {
4130 #endif  /* NETWARE */
4131 #ifdef PERLIO_IS_STDIO /* really? */
4132 #  if defined(__BORLANDC__)
4133                         /* XXX see note in do_binmode() */
4134                         ((FILE*)PL_rsfp)->flags &= ~_F_BIN;
4135 #  endif
4136 #endif
4137                         if (loc > 0)
4138                             PerlIO_seek(PL_rsfp, loc, 0);
4139                     }
4140                 }
4141 #endif
4142 #ifdef PERLIO_LAYERS
4143                 if (UTF && !IN_BYTES)
4144                     PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, ":utf8");
4145 #endif
4146                 PL_rsfp = Nullfp;
4147             }
4148             goto fake_eof;
4149         }
4150
4151         case KEY_AUTOLOAD:
4152         case KEY_DESTROY:
4153         case KEY_BEGIN:
4154         case KEY_CHECK:
4155         case KEY_INIT:
4156         case KEY_END:
4157             if (PL_expect == XSTATE) {
4158                 s = PL_bufptr;
4159                 goto really_sub;
4160             }
4161             goto just_a_word;
4162
4163         case KEY_CORE:
4164             if (*s == ':' && s[1] == ':') {
4165                 s += 2;
4166                 d = s;
4167                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
4168                 if (!(tmp = keyword(PL_tokenbuf, len)))
4169                     Perl_croak(aTHX_ "CORE::%s is not a keyword", PL_tokenbuf);
4170                 if (tmp < 0)
4171                     tmp = -tmp;
4172                 goto reserved_word;
4173             }
4174             goto just_a_word;
4175
4176         case KEY_abs:
4177             UNI(OP_ABS);
4178
4179         case KEY_alarm:
4180             UNI(OP_ALARM);
4181
4182         case KEY_accept:
4183             LOP(OP_ACCEPT,XTERM);
4184
4185         case KEY_and:
4186             OPERATOR(ANDOP);
4187
4188         case KEY_atan2:
4189             LOP(OP_ATAN2,XTERM);
4190
4191         case KEY_bind:
4192             LOP(OP_BIND,XTERM);
4193
4194         case KEY_binmode:
4195             LOP(OP_BINMODE,XTERM);
4196
4197         case KEY_bless:
4198             LOP(OP_BLESS,XTERM);
4199
4200         case KEY_chop:
4201             UNI(OP_CHOP);
4202
4203         case KEY_continue:
4204             PREBLOCK(CONTINUE);
4205
4206         case KEY_chdir:
4207             (void)gv_fetchpv("ENV",TRUE, SVt_PVHV);     /* may use HOME */
4208             UNI(OP_CHDIR);
4209
4210         case KEY_close:
4211             UNI(OP_CLOSE);
4212
4213         case KEY_closedir:
4214             UNI(OP_CLOSEDIR);
4215
4216         case KEY_cmp:
4217             Eop(OP_SCMP);
4218
4219         case KEY_caller:
4220             UNI(OP_CALLER);
4221
4222         case KEY_crypt:
4223 #ifdef FCRYPT
4224             if (!PL_cryptseen) {
4225                 PL_cryptseen = TRUE;
4226                 init_des();
4227             }
4228 #endif
4229             LOP(OP_CRYPT,XTERM);
4230
4231         case KEY_chmod:
4232             LOP(OP_CHMOD,XTERM);
4233
4234         case KEY_chown:
4235             LOP(OP_CHOWN,XTERM);
4236
4237         case KEY_connect:
4238             LOP(OP_CONNECT,XTERM);
4239
4240         case KEY_chr:
4241             UNI(OP_CHR);
4242
4243         case KEY_cos:
4244             UNI(OP_COS);
4245
4246         case KEY_chroot:
4247             UNI(OP_CHROOT);
4248
4249         case KEY_do:
4250             s = skipspace(s);
4251             if (*s == '{')
4252                 PRETERMBLOCK(DO);
4253             if (*s != '\'')
4254                 s = force_word(s,WORD,TRUE,TRUE,FALSE);
4255             OPERATOR(DO);
4256
4257         case KEY_die:
4258             PL_hints |= HINT_BLOCK_SCOPE;
4259             LOP(OP_DIE,XTERM);
4260
4261         case KEY_defined:
4262             UNI(OP_DEFINED);
4263
4264         case KEY_delete:
4265             UNI(OP_DELETE);
4266
4267         case KEY_dbmopen:
4268             gv_fetchpv("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
4269             LOP(OP_DBMOPEN,XTERM);
4270
4271         case KEY_dbmclose:
4272             UNI(OP_DBMCLOSE);
4273
4274         case KEY_dump:
4275             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4276             LOOPX(OP_DUMP);
4277
4278         case KEY_else:
4279             PREBLOCK(ELSE);
4280
4281         case KEY_elsif:
4282             yylval.ival = CopLINE(PL_curcop);
4283             OPERATOR(ELSIF);
4284
4285         case KEY_eq:
4286             Eop(OP_SEQ);
4287
4288         case KEY_exists:
4289             UNI(OP_EXISTS);
4290         
4291         case KEY_exit:
4292             UNI(OP_EXIT);
4293
4294         case KEY_eval:
4295             s = skipspace(s);
4296             PL_expect = (*s == '{') ? XTERMBLOCK : XTERM;
4297             UNIBRACK(OP_ENTEREVAL);
4298
4299         case KEY_eof:
4300             UNI(OP_EOF);
4301
4302         case KEY_exp:
4303             UNI(OP_EXP);
4304
4305         case KEY_each:
4306             UNI(OP_EACH);
4307
4308         case KEY_exec:
4309             set_csh();
4310             LOP(OP_EXEC,XREF);
4311
4312         case KEY_endhostent:
4313             FUN0(OP_EHOSTENT);
4314
4315         case KEY_endnetent:
4316             FUN0(OP_ENETENT);
4317
4318         case KEY_endservent:
4319             FUN0(OP_ESERVENT);
4320
4321         case KEY_endprotoent:
4322             FUN0(OP_EPROTOENT);
4323
4324         case KEY_endpwent:
4325             FUN0(OP_EPWENT);
4326
4327         case KEY_endgrent:
4328             FUN0(OP_EGRENT);
4329
4330         case KEY_for:
4331         case KEY_foreach:
4332             yylval.ival = CopLINE(PL_curcop);
4333             s = skipspace(s);
4334             if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) {
4335                 char *p = s;
4336                 if ((PL_bufend - p) >= 3 &&
4337                     strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
4338                     p += 2;
4339                 else if ((PL_bufend - p) >= 4 &&
4340                     strnEQ(p, "our", 3) && isSPACE(*(p + 3)))
4341                     p += 3;
4342                 p = skipspace(p);
4343                 if (isIDFIRST_lazy_if(p,UTF)) {
4344                     p = scan_ident(p, PL_bufend,
4345                         PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
4346                     p = skipspace(p);
4347                 }
4348                 if (*p != '$')
4349                     Perl_croak(aTHX_ "Missing $ on loop variable");
4350             }
4351             OPERATOR(FOR);
4352
4353         case KEY_formline:
4354             LOP(OP_FORMLINE,XTERM);
4355
4356         case KEY_fork:
4357             FUN0(OP_FORK);
4358
4359         case KEY_fcntl:
4360             LOP(OP_FCNTL,XTERM);
4361
4362         case KEY_fileno:
4363             UNI(OP_FILENO);
4364
4365         case KEY_flock:
4366             LOP(OP_FLOCK,XTERM);
4367
4368         case KEY_gt:
4369             Rop(OP_SGT);
4370
4371         case KEY_ge:
4372             Rop(OP_SGE);
4373
4374         case KEY_grep:
4375             LOP(OP_GREPSTART, XREF);
4376
4377         case KEY_goto:
4378             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4379             LOOPX(OP_GOTO);
4380
4381         case KEY_gmtime:
4382             UNI(OP_GMTIME);
4383
4384         case KEY_getc:
4385             UNI(OP_GETC);
4386
4387         case KEY_getppid:
4388             FUN0(OP_GETPPID);
4389
4390         case KEY_getpgrp:
4391             UNI(OP_GETPGRP);
4392
4393         case KEY_getpriority:
4394             LOP(OP_GETPRIORITY,XTERM);
4395
4396         case KEY_getprotobyname:
4397             UNI(OP_GPBYNAME);
4398
4399         case KEY_getprotobynumber:
4400             LOP(OP_GPBYNUMBER,XTERM);
4401
4402         case KEY_getprotoent:
4403             FUN0(OP_GPROTOENT);
4404
4405         case KEY_getpwent:
4406             FUN0(OP_GPWENT);
4407
4408         case KEY_getpwnam:
4409             UNI(OP_GPWNAM);
4410
4411         case KEY_getpwuid:
4412             UNI(OP_GPWUID);
4413
4414         case KEY_getpeername:
4415             UNI(OP_GETPEERNAME);
4416
4417         case KEY_gethostbyname:
4418             UNI(OP_GHBYNAME);
4419
4420         case KEY_gethostbyaddr:
4421             LOP(OP_GHBYADDR,XTERM);
4422
4423         case KEY_gethostent:
4424             FUN0(OP_GHOSTENT);
4425
4426         case KEY_getnetbyname:
4427             UNI(OP_GNBYNAME);
4428
4429         case KEY_getnetbyaddr:
4430             LOP(OP_GNBYADDR,XTERM);
4431
4432         case KEY_getnetent:
4433             FUN0(OP_GNETENT);
4434
4435         case KEY_getservbyname:
4436             LOP(OP_GSBYNAME,XTERM);
4437
4438         case KEY_getservbyport:
4439             LOP(OP_GSBYPORT,XTERM);
4440
4441         case KEY_getservent:
4442             FUN0(OP_GSERVENT);
4443
4444         case KEY_getsockname:
4445             UNI(OP_GETSOCKNAME);
4446
4447         case KEY_getsockopt:
4448             LOP(OP_GSOCKOPT,XTERM);
4449
4450         case KEY_getgrent:
4451             FUN0(OP_GGRENT);
4452
4453         case KEY_getgrnam:
4454             UNI(OP_GGRNAM);
4455
4456         case KEY_getgrgid:
4457             UNI(OP_GGRGID);
4458
4459         case KEY_getlogin:
4460             FUN0(OP_GETLOGIN);
4461
4462         case KEY_glob:
4463             set_csh();
4464             LOP(OP_GLOB,XTERM);
4465
4466         case KEY_hex:
4467             UNI(OP_HEX);
4468
4469         case KEY_if:
4470             yylval.ival = CopLINE(PL_curcop);
4471             OPERATOR(IF);
4472
4473         case KEY_index:
4474             LOP(OP_INDEX,XTERM);
4475
4476         case KEY_int:
4477             UNI(OP_INT);
4478
4479         case KEY_ioctl:
4480             LOP(OP_IOCTL,XTERM);
4481
4482         case KEY_join:
4483             LOP(OP_JOIN,XTERM);
4484
4485         case KEY_keys:
4486             UNI(OP_KEYS);
4487
4488         case KEY_kill:
4489             LOP(OP_KILL,XTERM);
4490
4491         case KEY_last:
4492             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4493             LOOPX(OP_LAST);
4494         
4495         case KEY_lc:
4496             UNI(OP_LC);
4497
4498         case KEY_lcfirst:
4499             UNI(OP_LCFIRST);
4500
4501         case KEY_local:
4502             yylval.ival = 0;
4503             OPERATOR(LOCAL);
4504
4505         case KEY_length:
4506             UNI(OP_LENGTH);
4507
4508         case KEY_lt:
4509             Rop(OP_SLT);
4510
4511         case KEY_le:
4512             Rop(OP_SLE);
4513
4514         case KEY_localtime:
4515             UNI(OP_LOCALTIME);
4516
4517         case KEY_log:
4518             UNI(OP_LOG);
4519
4520         case KEY_link:
4521             LOP(OP_LINK,XTERM);
4522
4523         case KEY_listen:
4524             LOP(OP_LISTEN,XTERM);
4525
4526         case KEY_lock:
4527             UNI(OP_LOCK);
4528
4529         case KEY_lstat:
4530             UNI(OP_LSTAT);
4531
4532         case KEY_m:
4533             s = scan_pat(s,OP_MATCH);
4534             TERM(sublex_start());
4535
4536         case KEY_map:
4537             LOP(OP_MAPSTART, XREF);
4538
4539         case KEY_mkdir:
4540             LOP(OP_MKDIR,XTERM);
4541
4542         case KEY_msgctl:
4543             LOP(OP_MSGCTL,XTERM);
4544
4545         case KEY_msgget:
4546             LOP(OP_MSGGET,XTERM);
4547
4548         case KEY_msgrcv:
4549             LOP(OP_MSGRCV,XTERM);
4550
4551         case KEY_msgsnd:
4552             LOP(OP_MSGSND,XTERM);
4553
4554         case KEY_our:
4555         case KEY_my:
4556             PL_in_my = tmp;
4557             s = skipspace(s);
4558             if (isIDFIRST_lazy_if(s,UTF)) {
4559                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
4560                 if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
4561                     goto really_sub;
4562                 PL_in_my_stash = find_in_my_stash(PL_tokenbuf, len);
4563                 if (!PL_in_my_stash) {
4564                     char tmpbuf[1024];
4565                     PL_bufptr = s;
4566                     sprintf(tmpbuf, "No such class %.1000s", PL_tokenbuf);
4567                     yyerror(tmpbuf);
4568                 }
4569             }
4570             yylval.ival = 1;
4571             OPERATOR(MY);
4572
4573         case KEY_next:
4574             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4575             LOOPX(OP_NEXT);
4576
4577         case KEY_ne:
4578             Eop(OP_SNE);
4579
4580         case KEY_no:
4581             if (PL_expect != XSTATE)
4582                 yyerror("\"no\" not allowed in expression");
4583             s = force_word(s,WORD,FALSE,TRUE,FALSE);
4584             s = force_version(s, FALSE);
4585             yylval.ival = 0;
4586             OPERATOR(USE);
4587
4588         case KEY_not:
4589             if (*s == '(' || (s = skipspace(s), *s == '('))
4590                 FUN1(OP_NOT);
4591             else
4592                 OPERATOR(NOTOP);
4593
4594         case KEY_open:
4595             s = skipspace(s);
4596             if (isIDFIRST_lazy_if(s,UTF)) {
4597                 char *t;
4598                 for (d = s; isALNUM_lazy_if(d,UTF); d++) ;
4599                 t = skipspace(d);
4600                 if (strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE))
4601                     Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE),
4602                            "Precedence problem: open %.*s should be open(%.*s)",
4603                             d-s,s, d-s,s);
4604             }
4605             LOP(OP_OPEN,XTERM);
4606
4607         case KEY_or:
4608             yylval.ival = OP_OR;
4609             OPERATOR(OROP);
4610
4611         case KEY_ord:
4612             UNI(OP_ORD);
4613
4614         case KEY_oct:
4615             UNI(OP_OCT);
4616
4617         case KEY_opendir:
4618             LOP(OP_OPEN_DIR,XTERM);
4619
4620         case KEY_print:
4621             checkcomma(s,PL_tokenbuf,"filehandle");
4622             LOP(OP_PRINT,XREF);
4623
4624         case KEY_printf:
4625             checkcomma(s,PL_tokenbuf,"filehandle");
4626             LOP(OP_PRTF,XREF);
4627
4628         case KEY_prototype:
4629             UNI(OP_PROTOTYPE);
4630
4631         case KEY_push:
4632             LOP(OP_PUSH,XTERM);
4633
4634         case KEY_pop:
4635             UNI(OP_POP);
4636
4637         case KEY_pos:
4638             UNI(OP_POS);
4639         
4640         case KEY_pack:
4641             LOP(OP_PACK,XTERM);
4642
4643         case KEY_package:
4644             s = force_word(s,WORD,FALSE,TRUE,FALSE);
4645             OPERATOR(PACKAGE);
4646
4647         case KEY_pipe:
4648             LOP(OP_PIPE_OP,XTERM);
4649
4650         case KEY_q:
4651             s = scan_str(s,FALSE,FALSE);
4652             if (!s)
4653                 missingterm((char*)0);
4654             yylval.ival = OP_CONST;
4655             TERM(sublex_start());
4656
4657         case KEY_quotemeta:
4658             UNI(OP_QUOTEMETA);
4659
4660         case KEY_qw:
4661             s = scan_str(s,FALSE,FALSE);
4662             if (!s)
4663                 missingterm((char*)0);
4664             force_next(')');
4665             if (SvCUR(PL_lex_stuff)) {
4666                 OP *words = Nullop;
4667                 int warned = 0;
4668                 d = SvPV_force(PL_lex_stuff, len);
4669                 while (len) {
4670                     SV *sv;
4671                     for (; isSPACE(*d) && len; --len, ++d) ;
4672                     if (len) {
4673                         char *b = d;
4674                         if (!warned && ckWARN(WARN_QW)) {
4675                             for (; !isSPACE(*d) && len; --len, ++d) {
4676                                 if (*d == ',') {
4677                                     Perl_warner(aTHX_ packWARN(WARN_QW),
4678                                         "Possible attempt to separate words with commas");
4679                                     ++warned;
4680                                 }
4681                                 else if (*d == '#') {
4682                                     Perl_warner(aTHX_ packWARN(WARN_QW),
4683                                         "Possible attempt to put comments in qw() list");
4684                                     ++warned;
4685                                 }
4686                             }
4687                         }
4688                         else {
4689                             for (; !isSPACE(*d) && len; --len, ++d) ;
4690                         }
4691                         sv = newSVpvn(b, d-b);
4692                         if (DO_UTF8(PL_lex_stuff))
4693                             SvUTF8_on(sv);
4694                         words = append_elem(OP_LIST, words,
4695                                             newSVOP(OP_CONST, 0, tokeq(sv)));
4696                     }
4697                 }
4698                 if (words) {
4699                     PL_nextval[PL_nexttoke].opval = words;
4700                     force_next(THING);
4701                 }
4702             }
4703             if (PL_lex_stuff) {
4704                 SvREFCNT_dec(PL_lex_stuff);
4705                 PL_lex_stuff = Nullsv;
4706             }
4707             PL_expect = XTERM;
4708             TOKEN('(');
4709
4710         case KEY_qq:
4711             s = scan_str(s,FALSE,FALSE);
4712             if (!s)
4713                 missingterm((char*)0);
4714             yylval.ival = OP_STRINGIFY;
4715             if (SvIVX(PL_lex_stuff) == '\'')
4716                 SvIVX(PL_lex_stuff) = 0;        /* qq'$foo' should intepolate */
4717             TERM(sublex_start());
4718
4719         case KEY_qr:
4720             s = scan_pat(s,OP_QR);
4721             TERM(sublex_start());
4722
4723         case KEY_qx:
4724             s = scan_str(s,FALSE,FALSE);
4725             if (!s)
4726                 missingterm((char*)0);
4727             yylval.ival = OP_BACKTICK;
4728             set_csh();
4729             TERM(sublex_start());
4730
4731         case KEY_return:
4732             OLDLOP(OP_RETURN);
4733
4734         case KEY_require:
4735             s = skipspace(s);
4736             if (isDIGIT(*s)) {
4737                 s = force_version(s, FALSE);
4738             }
4739             else if (*s != 'v' || !isDIGIT(s[1])
4740                     || (s = force_version(s, TRUE), *s == 'v'))
4741             {
4742                 *PL_tokenbuf = '\0';
4743                 s = force_word(s,WORD,TRUE,TRUE,FALSE);
4744                 if (isIDFIRST_lazy_if(PL_tokenbuf,UTF))
4745                     gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf), TRUE);
4746                 else if (*s == '<')
4747                     yyerror("<> should be quotes");
4748             }
4749             UNI(OP_REQUIRE);
4750
4751         case KEY_reset:
4752             UNI(OP_RESET);
4753
4754         case KEY_redo:
4755             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4756             LOOPX(OP_REDO);
4757
4758         case KEY_rename:
4759             LOP(OP_RENAME,XTERM);
4760
4761         case KEY_rand:
4762             UNI(OP_RAND);
4763
4764         case KEY_rmdir:
4765             UNI(OP_RMDIR);
4766
4767         case KEY_rindex:
4768             LOP(OP_RINDEX,XTERM);
4769
4770         case KEY_read:
4771             LOP(OP_READ,XTERM);
4772
4773         case KEY_readdir:
4774             UNI(OP_READDIR);
4775
4776         case KEY_readline:
4777             set_csh();
4778             UNI(OP_READLINE);
4779
4780         case KEY_readpipe:
4781             set_csh();
4782             UNI(OP_BACKTICK);
4783
4784         case KEY_rewinddir:
4785             UNI(OP_REWINDDIR);
4786
4787         case KEY_recv:
4788             LOP(OP_RECV,XTERM);
4789
4790         case KEY_reverse:
4791             LOP(OP_REVERSE,XTERM);
4792
4793         case KEY_readlink:
4794             UNI(OP_READLINK);
4795
4796         case KEY_ref:
4797             UNI(OP_REF);
4798
4799         case KEY_s:
4800             s = scan_subst(s);
4801             if (yylval.opval)
4802                 TERM(sublex_start());
4803             else
4804                 TOKEN(1);       /* force error */
4805
4806         case KEY_chomp:
4807             UNI(OP_CHOMP);
4808         
4809         case KEY_scalar:
4810             UNI(OP_SCALAR);
4811
4812         case KEY_select:
4813             LOP(OP_SELECT,XTERM);
4814
4815         case KEY_seek:
4816             LOP(OP_SEEK,XTERM);
4817
4818         case KEY_semctl:
4819             LOP(OP_SEMCTL,XTERM);
4820
4821         case KEY_semget:
4822             LOP(OP_SEMGET,XTERM);
4823
4824         case KEY_semop:
4825             LOP(OP_SEMOP,XTERM);
4826
4827         case KEY_send:
4828             LOP(OP_SEND,XTERM);
4829
4830         case KEY_setpgrp:
4831             LOP(OP_SETPGRP,XTERM);
4832
4833         case KEY_setpriority:
4834             LOP(OP_SETPRIORITY,XTERM);
4835
4836         case KEY_sethostent:
4837             UNI(OP_SHOSTENT);
4838
4839         case KEY_setnetent:
4840             UNI(OP_SNETENT);
4841
4842         case KEY_setservent:
4843             UNI(OP_SSERVENT);
4844
4845         case KEY_setprotoent:
4846             UNI(OP_SPROTOENT);
4847
4848         case KEY_setpwent:
4849             FUN0(OP_SPWENT);
4850
4851         case KEY_setgrent:
4852             FUN0(OP_SGRENT);
4853
4854         case KEY_seekdir:
4855             LOP(OP_SEEKDIR,XTERM);
4856
4857         case KEY_setsockopt:
4858             LOP(OP_SSOCKOPT,XTERM);
4859
4860         case KEY_shift:
4861             UNI(OP_SHIFT);
4862
4863         case KEY_shmctl:
4864             LOP(OP_SHMCTL,XTERM);
4865
4866         case KEY_shmget:
4867             LOP(OP_SHMGET,XTERM);
4868
4869         case KEY_shmread:
4870             LOP(OP_SHMREAD,XTERM);
4871
4872         case KEY_shmwrite:
4873             LOP(OP_SHMWRITE,XTERM);
4874
4875         case KEY_shutdown:
4876             LOP(OP_SHUTDOWN,XTERM);
4877
4878         case KEY_sin:
4879             UNI(OP_SIN);
4880
4881         case KEY_sleep:
4882             UNI(OP_SLEEP);
4883
4884         case KEY_socket:
4885             LOP(OP_SOCKET,XTERM);
4886
4887         case KEY_socketpair:
4888             LOP(OP_SOCKPAIR,XTERM);
4889
4890         case KEY_sort:
4891             checkcomma(s,PL_tokenbuf,"subroutine name");
4892             s = skipspace(s);
4893             if (*s == ';' || *s == ')')         /* probably a close */
4894                 Perl_croak(aTHX_ "sort is now a reserved word");
4895             PL_expect = XTERM;
4896             s = force_word(s,WORD,TRUE,TRUE,FALSE);
4897             LOP(OP_SORT,XREF);
4898
4899         case KEY_split:
4900             LOP(OP_SPLIT,XTERM);
4901
4902         case KEY_sprintf:
4903             LOP(OP_SPRINTF,XTERM);
4904
4905         case KEY_splice:
4906             LOP(OP_SPLICE,XTERM);
4907
4908         case KEY_sqrt:
4909             UNI(OP_SQRT);
4910
4911         case KEY_srand:
4912             UNI(OP_SRAND);
4913
4914         case KEY_stat:
4915             UNI(OP_STAT);
4916
4917         case KEY_study:
4918             UNI(OP_STUDY);
4919
4920         case KEY_substr:
4921             LOP(OP_SUBSTR,XTERM);
4922
4923         case KEY_format:
4924         case KEY_sub:
4925           really_sub:
4926             {
4927                 char tmpbuf[sizeof PL_tokenbuf];
4928                 SSize_t tboffset = 0;
4929                 expectation attrful;
4930                 bool have_name, have_proto, bad_proto;
4931                 int key = tmp;
4932
4933                 s = skipspace(s);
4934
4935                 if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' ||
4936                     (*s == ':' && s[1] == ':'))
4937                 {
4938                     PL_expect = XBLOCK;
4939                     attrful = XATTRBLOCK;
4940                     /* remember buffer pos'n for later force_word */
4941                     tboffset = s - PL_oldbufptr;
4942                     d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
4943                     if (strchr(tmpbuf, ':'))
4944                         sv_setpv(PL_subname, tmpbuf);
4945                     else {
4946                         sv_setsv(PL_subname,PL_curstname);
4947                         sv_catpvn(PL_subname,"::",2);
4948                         sv_catpvn(PL_subname,tmpbuf,len);
4949                     }
4950                     s = skipspace(d);
4951                     have_name = TRUE;
4952                 }
4953                 else {
4954                     if (key == KEY_my)
4955                         Perl_croak(aTHX_ "Missing name in \"my sub\"");
4956                     PL_expect = XTERMBLOCK;
4957                     attrful = XATTRTERM;
4958                     sv_setpv(PL_subname,"?");
4959                     have_name = FALSE;
4960                 }
4961
4962                 if (key == KEY_format) {
4963                     if (*s == '=')
4964                         PL_lex_formbrack = PL_lex_brackets + 1;
4965                     if (have_name)
4966                         (void) force_word(PL_oldbufptr + tboffset, WORD,
4967                                           FALSE, TRUE, TRUE);
4968                     OPERATOR(FORMAT);
4969                 }
4970
4971                 /* Look for a prototype */
4972                 if (*s == '(') {
4973                     char *p;
4974
4975                     s = scan_str(s,FALSE,FALSE);
4976                     if (!s)
4977                         Perl_croak(aTHX_ "Prototype not terminated");
4978                     /* strip spaces and check for bad characters */
4979                     d = SvPVX(PL_lex_stuff);
4980                     tmp = 0;
4981                     bad_proto = FALSE;
4982                     for (p = d; *p; ++p) {
4983                         if (!isSPACE(*p)) {
4984                             d[tmp++] = *p;
4985                             if (!strchr("$@%*;[]&\\", *p))
4986                                 bad_proto = TRUE;
4987                         }
4988                     }
4989                     d[tmp] = '\0';
4990                     if (bad_proto && ckWARN(WARN_SYNTAX))
4991                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
4992                                     "Illegal character in prototype for %s : %s",
4993                                     SvPVX(PL_subname), d);
4994                     SvCUR(PL_lex_stuff) = tmp;
4995                     have_proto = TRUE;
4996
4997                     s = skipspace(s);
4998                 }
4999                 else
5000                     have_proto = FALSE;
5001
5002                 if (*s == ':' && s[1] != ':')
5003                     PL_expect = attrful;
5004
5005                 if (have_proto) {
5006                     PL_nextval[PL_nexttoke].opval =
5007                         (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
5008                     PL_lex_stuff = Nullsv;
5009                     force_next(THING);
5010                 }
5011                 if (!have_name) {
5012                     sv_setpv(PL_subname,
5013                         PL_curstash ? "__ANON__" : "__ANON__::__ANON__");
5014                     TOKEN(ANONSUB);
5015                 }
5016                 (void) force_word(PL_oldbufptr + tboffset, WORD,
5017                                   FALSE, TRUE, TRUE);
5018                 if (key == KEY_my)
5019                     TOKEN(MYSUB);
5020                 TOKEN(SUB);
5021             }
5022
5023         case KEY_system:
5024             set_csh();
5025             LOP(OP_SYSTEM,XREF);
5026
5027         case KEY_symlink:
5028             LOP(OP_SYMLINK,XTERM);
5029
5030         case KEY_syscall:
5031             LOP(OP_SYSCALL,XTERM);
5032
5033         case KEY_sysopen:
5034             LOP(OP_SYSOPEN,XTERM);
5035
5036         case KEY_sysseek:
5037             LOP(OP_SYSSEEK,XTERM);
5038
5039         case KEY_sysread:
5040             LOP(OP_SYSREAD,XTERM);
5041
5042         case KEY_syswrite:
5043             LOP(OP_SYSWRITE,XTERM);
5044
5045         case KEY_tr:
5046             s = scan_trans(s);
5047             TERM(sublex_start());
5048
5049         case KEY_tell:
5050             UNI(OP_TELL);
5051
5052         case KEY_telldir:
5053             UNI(OP_TELLDIR);
5054
5055         case KEY_tie:
5056             LOP(OP_TIE,XTERM);
5057
5058         case KEY_tied:
5059             UNI(OP_TIED);
5060
5061         case KEY_time:
5062             FUN0(OP_TIME);
5063
5064         case KEY_times:
5065             FUN0(OP_TMS);
5066
5067         case KEY_truncate:
5068             LOP(OP_TRUNCATE,XTERM);
5069
5070         case KEY_uc:
5071             UNI(OP_UC);
5072
5073         case KEY_ucfirst:
5074             UNI(OP_UCFIRST);
5075
5076         case KEY_untie:
5077             UNI(OP_UNTIE);
5078
5079         case KEY_until:
5080             yylval.ival = CopLINE(PL_curcop);
5081             OPERATOR(UNTIL);
5082
5083         case KEY_unless:
5084             yylval.ival = CopLINE(PL_curcop);
5085             OPERATOR(UNLESS);
5086
5087         case KEY_unlink:
5088             LOP(OP_UNLINK,XTERM);
5089
5090         case KEY_undef:
5091             UNI(OP_UNDEF);
5092
5093         case KEY_unpack:
5094             LOP(OP_UNPACK,XTERM);
5095
5096         case KEY_utime:
5097             LOP(OP_UTIME,XTERM);
5098
5099         case KEY_umask:
5100             UNI(OP_UMASK);
5101
5102         case KEY_unshift:
5103             LOP(OP_UNSHIFT,XTERM);
5104
5105         case KEY_use:
5106             if (PL_expect != XSTATE)
5107                 yyerror("\"use\" not allowed in expression");
5108             s = skipspace(s);
5109             if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
5110                 s = force_version(s, TRUE);
5111                 if (*s == ';' || (s = skipspace(s), *s == ';')) {
5112                     PL_nextval[PL_nexttoke].opval = Nullop;
5113                     force_next(WORD);
5114                 }
5115                 else if (*s == 'v') {
5116                     s = force_word(s,WORD,FALSE,TRUE,FALSE);
5117                     s = force_version(s, FALSE);
5118                 }
5119             }
5120             else {
5121                 s = force_word(s,WORD,FALSE,TRUE,FALSE);
5122                 s = force_version(s, FALSE);
5123             }
5124             yylval.ival = 1;
5125             OPERATOR(USE);
5126
5127         case KEY_values:
5128             UNI(OP_VALUES);
5129
5130         case KEY_vec:
5131             LOP(OP_VEC,XTERM);
5132
5133         case KEY_while:
5134             yylval.ival = CopLINE(PL_curcop);
5135             OPERATOR(WHILE);
5136
5137         case KEY_warn:
5138             PL_hints |= HINT_BLOCK_SCOPE;
5139             LOP(OP_WARN,XTERM);
5140
5141         case KEY_wait:
5142             FUN0(OP_WAIT);
5143
5144         case KEY_waitpid:
5145             LOP(OP_WAITPID,XTERM);
5146
5147         case KEY_wantarray:
5148             FUN0(OP_WANTARRAY);
5149
5150         case KEY_write:
5151 #ifdef EBCDIC
5152         {
5153             char ctl_l[2];
5154             ctl_l[0] = toCTRL('L');
5155             ctl_l[1] = '\0';
5156             gv_fetchpv(ctl_l,TRUE, SVt_PV);
5157         }
5158 #else
5159             gv_fetchpv("\f",TRUE, SVt_PV);      /* Make sure $^L is defined */
5160 #endif
5161             UNI(OP_ENTERWRITE);
5162
5163         case KEY_x:
5164             if (PL_expect == XOPERATOR)
5165                 Mop(OP_REPEAT);
5166             check_uni();
5167             goto just_a_word;
5168
5169         case KEY_xor:
5170             yylval.ival = OP_XOR;
5171             OPERATOR(OROP);
5172
5173         case KEY_y:
5174             s = scan_trans(s);
5175             TERM(sublex_start());
5176         }
5177     }}
5178 }
5179 #ifdef __SC__
5180 #pragma segment Main
5181 #endif
5182
5183 static int
5184 S_pending_ident(pTHX)
5185 {
5186     register char *d;
5187     register I32 tmp;
5188     /* pit holds the identifier we read and pending_ident is reset */
5189     char pit = PL_pending_ident;
5190     PL_pending_ident = 0;
5191
5192     DEBUG_T({ PerlIO_printf(Perl_debug_log,
5193           "### Tokener saw identifier '%s'\n", PL_tokenbuf); });
5194
5195     /* if we're in a my(), we can't allow dynamics here.
5196        $foo'bar has already been turned into $foo::bar, so
5197        just check for colons.
5198
5199        if it's a legal name, the OP is a PADANY.
5200     */
5201     if (PL_in_my) {
5202         if (PL_in_my == KEY_our) {      /* "our" is merely analogous to "my" */
5203             if (strchr(PL_tokenbuf,':'))
5204                 yyerror(Perl_form(aTHX_ "No package name allowed for "
5205                                   "variable %s in \"our\"",
5206                                   PL_tokenbuf));
5207             tmp = pad_allocmy(PL_tokenbuf);
5208         }
5209         else {
5210             if (strchr(PL_tokenbuf,':'))
5211                 yyerror(Perl_form(aTHX_ PL_no_myglob,PL_tokenbuf));
5212
5213             yylval.opval = newOP(OP_PADANY, 0);
5214             yylval.opval->op_targ = pad_allocmy(PL_tokenbuf);
5215             return PRIVATEREF;
5216         }
5217     }
5218
5219     /*
5220        build the ops for accesses to a my() variable.
5221
5222        Deny my($a) or my($b) in a sort block, *if* $a or $b is
5223        then used in a comparison.  This catches most, but not
5224        all cases.  For instance, it catches
5225            sort { my($a); $a <=> $b }
5226        but not
5227            sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
5228        (although why you'd do that is anyone's guess).
5229     */
5230
5231     if (!strchr(PL_tokenbuf,':')) {
5232 #ifdef USE_5005THREADS
5233         /* Check for single character per-thread SVs */
5234         if (PL_tokenbuf[0] == '$' && PL_tokenbuf[2] == '\0'
5235             && !isALPHA(PL_tokenbuf[1]) /* Rule out obvious non-threadsvs */
5236             && (tmp = find_threadsv(&PL_tokenbuf[1])) != NOT_IN_PAD)
5237         {
5238             yylval.opval = newOP(OP_THREADSV, 0);
5239             yylval.opval->op_targ = tmp;
5240             return PRIVATEREF;
5241         }
5242 #endif /* USE_5005THREADS */
5243         if ((tmp = pad_findmy(PL_tokenbuf)) != NOT_IN_PAD) {
5244             SV *namesv = AvARRAY(PL_comppad_name)[tmp];
5245             /* might be an "our" variable" */
5246             if (SvFLAGS(namesv) & SVpad_OUR) {
5247                 /* build ops for a bareword */
5248                 SV *sym = newSVpv(HvNAME(GvSTASH(namesv)),0);
5249                 sv_catpvn(sym, "::", 2);
5250                 sv_catpv(sym, PL_tokenbuf+1);
5251                 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
5252                 yylval.opval->op_private = OPpCONST_ENTERED;
5253                 gv_fetchpv(SvPVX(sym),
5254                     (PL_in_eval
5255                         ? (GV_ADDMULTI | GV_ADDINEVAL)
5256                         : GV_ADDMULTI
5257                     ),
5258                     ((PL_tokenbuf[0] == '$') ? SVt_PV
5259                      : (PL_tokenbuf[0] == '@') ? SVt_PVAV
5260                      : SVt_PVHV));
5261                 return WORD;
5262             }
5263
5264             /* if it's a sort block and they're naming $a or $b */
5265             if (PL_last_lop_op == OP_SORT &&
5266                 PL_tokenbuf[0] == '$' &&
5267                 (PL_tokenbuf[1] == 'a' || PL_tokenbuf[1] == 'b')
5268                 && !PL_tokenbuf[2])
5269             {
5270                 for (d = PL_in_eval ? PL_oldoldbufptr : PL_linestart;
5271                      d < PL_bufend && *d != '\n';
5272                      d++)
5273                 {
5274                     if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
5275                         Perl_croak(aTHX_ "Can't use \"my %s\" in sort comparison",
5276                               PL_tokenbuf);
5277                     }
5278                 }
5279             }
5280
5281             yylval.opval = newOP(OP_PADANY, 0);
5282             yylval.opval->op_targ = tmp;
5283             return PRIVATEREF;
5284         }
5285     }
5286
5287     /*
5288        Whine if they've said @foo in a doublequoted string,
5289        and @foo isn't a variable we can find in the symbol
5290        table.
5291     */
5292     if (pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
5293         GV *gv = gv_fetchpv(PL_tokenbuf+1, FALSE, SVt_PVAV);
5294         if ((!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
5295              && ckWARN(WARN_AMBIGUOUS))
5296         {
5297             /* Downgraded from fatal to warning 20000522 mjd */
5298             Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
5299                         "Possible unintended interpolation of %s in string",
5300                          PL_tokenbuf);
5301         }
5302     }
5303
5304     /* build ops for a bareword */
5305     yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(PL_tokenbuf+1, 0));
5306     yylval.opval->op_private = OPpCONST_ENTERED;
5307     gv_fetchpv(PL_tokenbuf+1, PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : TRUE,
5308                ((PL_tokenbuf[0] == '$') ? SVt_PV
5309                 : (PL_tokenbuf[0] == '@') ? SVt_PVAV
5310                 : SVt_PVHV));
5311     return WORD;
5312 }
5313
5314 I32
5315 Perl_keyword(pTHX_ register char *d, I32 len)
5316 {
5317     switch (*d) {
5318     case '_':
5319         if (d[1] == '_') {
5320             if (strEQ(d,"__FILE__"))            return -KEY___FILE__;
5321             if (strEQ(d,"__LINE__"))            return -KEY___LINE__;
5322             if (strEQ(d,"__PACKAGE__"))         return -KEY___PACKAGE__;
5323             if (strEQ(d,"__DATA__"))            return KEY___DATA__;
5324             if (strEQ(d,"__END__"))             return KEY___END__;
5325         }
5326         break;
5327     case 'A':
5328         if (strEQ(d,"AUTOLOAD"))                return KEY_AUTOLOAD;
5329         break;
5330     case 'a':
5331         switch (len) {
5332         case 3:
5333             if (strEQ(d,"and"))                 return -KEY_and;
5334             if (strEQ(d,"abs"))                 return -KEY_abs;
5335             break;
5336         case 5:
5337             if (strEQ(d,"alarm"))               return -KEY_alarm;
5338             if (strEQ(d,"atan2"))               return -KEY_atan2;
5339             break;
5340         case 6:
5341             if (strEQ(d,"accept"))              return -KEY_accept;
5342             break;
5343         }
5344         break;
5345     case 'B':
5346         if (strEQ(d,"BEGIN"))                   return KEY_BEGIN;
5347         break;
5348     case 'b':
5349         if (strEQ(d,"bless"))                   return -KEY_bless;
5350         if (strEQ(d,"bind"))                    return -KEY_bind;
5351         if (strEQ(d,"binmode"))                 return -KEY_binmode;
5352         break;
5353     case 'C':
5354         if (strEQ(d,"CORE"))                    return -KEY_CORE;
5355         if (strEQ(d,"CHECK"))                   return KEY_CHECK;
5356         break;
5357     case 'c':
5358         switch (len) {
5359         case 3:
5360             if (strEQ(d,"cmp"))                 return -KEY_cmp;
5361             if (strEQ(d,"chr"))                 return -KEY_chr;
5362             if (strEQ(d,"cos"))                 return -KEY_cos;
5363             break;
5364         case 4:
5365             if (strEQ(d,"chop"))                return -KEY_chop;
5366             break;
5367         case 5:
5368             if (strEQ(d,"close"))               return -KEY_close;
5369             if (strEQ(d,"chdir"))               return -KEY_chdir;
5370             if (strEQ(d,"chomp"))               return -KEY_chomp;
5371             if (strEQ(d,"chmod"))               return -KEY_chmod;
5372             if (strEQ(d,"chown"))               return -KEY_chown;
5373             if (strEQ(d,"crypt"))               return -KEY_crypt;
5374             break;
5375         case 6:
5376             if (strEQ(d,"chroot"))              return -KEY_chroot;
5377             if (strEQ(d,"caller"))              return -KEY_caller;
5378             break;
5379         case 7:
5380             if (strEQ(d,"connect"))             return -KEY_connect;
5381             break;
5382         case 8:
5383             if (strEQ(d,"closedir"))            return -KEY_closedir;
5384             if (strEQ(d,"continue"))            return -KEY_continue;
5385             break;
5386         }
5387         break;
5388     case 'D':
5389         if (strEQ(d,"DESTROY"))                 return KEY_DESTROY;
5390         break;
5391     case 'd':
5392         switch (len) {
5393         case 2:
5394             if (strEQ(d,"do"))                  return KEY_do;
5395             break;
5396         case 3:
5397             if (strEQ(d,"die"))                 return -KEY_die;
5398             break;
5399         case 4:
5400             if (strEQ(d,"dump"))                return -KEY_dump;
5401             break;
5402         case 6:
5403             if (strEQ(d,"delete"))              return KEY_delete;
5404             break;
5405         case 7:
5406             if (strEQ(d,"defined"))             return KEY_defined;
5407             if (strEQ(d,"dbmopen"))             return -KEY_dbmopen;
5408             break;
5409         case 8:
5410             if (strEQ(d,"dbmclose"))            return -KEY_dbmclose;
5411             break;
5412         }
5413         break;
5414     case 'E':
5415         if (strEQ(d,"END"))                     return KEY_END;
5416         break;
5417     case 'e':
5418         switch (len) {
5419         case 2:
5420             if (strEQ(d,"eq"))                  return -KEY_eq;
5421             break;
5422         case 3:
5423             if (strEQ(d,"eof"))                 return -KEY_eof;
5424             if (strEQ(d,"exp"))                 return -KEY_exp;
5425             break;
5426         case 4:
5427             if (strEQ(d,"else"))                return KEY_else;
5428             if (strEQ(d,"exit"))                return -KEY_exit;
5429             if (strEQ(d,"eval"))                return KEY_eval;
5430             if (strEQ(d,"exec"))                return -KEY_exec;
5431            if (strEQ(d,"each"))                return -KEY_each;
5432             break;
5433         case 5:
5434             if (strEQ(d,"elsif"))               return KEY_elsif;
5435             break;
5436         case 6:
5437             if (strEQ(d,"exists"))              return KEY_exists;
5438             if (strEQ(d,"elseif")) Perl_warn(aTHX_ "elseif should be elsif");
5439             break;
5440         case 8:
5441             if (strEQ(d,"endgrent"))            return -KEY_endgrent;
5442             if (strEQ(d,"endpwent"))            return -KEY_endpwent;
5443             break;
5444         case 9:
5445             if (strEQ(d,"endnetent"))           return -KEY_endnetent;
5446             break;
5447         case 10:
5448             if (strEQ(d,"endhostent"))          return -KEY_endhostent;
5449             if (strEQ(d,"endservent"))          return -KEY_endservent;
5450             break;
5451         case 11:
5452             if (strEQ(d,"endprotoent"))         return -KEY_endprotoent;
5453             break;
5454         }
5455         break;
5456     case 'f':
5457         switch (len) {
5458         case 3:
5459             if (strEQ(d,"for"))                 return KEY_for;
5460             break;
5461         case 4:
5462             if (strEQ(d,"fork"))                return -KEY_fork;
5463             break;
5464         case 5:
5465             if (strEQ(d,"fcntl"))               return -KEY_fcntl;
5466             if (strEQ(d,"flock"))               return -KEY_flock;
5467             break;
5468         case 6:
5469             if (strEQ(d,"format"))              return KEY_format;
5470             if (strEQ(d,"fileno"))              return -KEY_fileno;
5471             break;
5472         case 7:
5473             if (strEQ(d,"foreach"))             return KEY_foreach;
5474             break;
5475         case 8:
5476             if (strEQ(d,"formline"))            return -KEY_formline;
5477             break;
5478         }
5479         break;
5480     case 'g':
5481         if (strnEQ(d,"get",3)) {
5482             d += 3;
5483             if (*d == 'p') {
5484                 switch (len) {
5485                 case 7:
5486                     if (strEQ(d,"ppid"))        return -KEY_getppid;
5487                     if (strEQ(d,"pgrp"))        return -KEY_getpgrp;
5488                     break;
5489                 case 8:
5490                     if (strEQ(d,"pwent"))       return -KEY_getpwent;
5491                     if (strEQ(d,"pwnam"))       return -KEY_getpwnam;
5492                     if (strEQ(d,"pwuid"))       return -KEY_getpwuid;
5493                     break;
5494                 case 11:
5495                     if (strEQ(d,"peername"))    return -KEY_getpeername;
5496                     if (strEQ(d,"protoent"))    return -KEY_getprotoent;
5497                     if (strEQ(d,"priority"))    return -KEY_getpriority;
5498                     break;
5499                 case 14:
5500                     if (strEQ(d,"protobyname")) return -KEY_getprotobyname;
5501                     break;
5502                 case 16:
5503                     if (strEQ(d,"protobynumber"))return -KEY_getprotobynumber;
5504                     break;
5505                 }
5506             }
5507             else if (*d == 'h') {
5508                 if (strEQ(d,"hostbyname"))      return -KEY_gethostbyname;
5509                 if (strEQ(d,"hostbyaddr"))      return -KEY_gethostbyaddr;
5510                 if (strEQ(d,"hostent"))         return -KEY_gethostent;
5511             }
5512             else if (*d == 'n') {
5513                 if (strEQ(d,"netbyname"))       return -KEY_getnetbyname;
5514                 if (strEQ(d,"netbyaddr"))       return -KEY_getnetbyaddr;
5515                 if (strEQ(d,"netent"))          return -KEY_getnetent;
5516             }
5517             else if (*d == 's') {
5518                 if (strEQ(d,"servbyname"))      return -KEY_getservbyname;
5519                 if (strEQ(d,"servbyport"))      return -KEY_getservbyport;
5520                 if (strEQ(d,"servent"))         return -KEY_getservent;
5521                 if (strEQ(d,"sockname"))        return -KEY_getsockname;
5522                 if (strEQ(d,"sockopt"))         return -KEY_getsockopt;
5523             }
5524             else if (*d == 'g') {
5525                 if (strEQ(d,"grent"))           return -KEY_getgrent;
5526                 if (strEQ(d,"grnam"))           return -KEY_getgrnam;
5527                 if (strEQ(d,"grgid"))           return -KEY_getgrgid;
5528             }
5529             else if (*d == 'l') {
5530                 if (strEQ(d,"login"))           return -KEY_getlogin;
5531             }
5532             else if (strEQ(d,"c"))              return -KEY_getc;
5533             break;
5534         }
5535         switch (len) {
5536         case 2:
5537             if (strEQ(d,"gt"))                  return -KEY_gt;
5538             if (strEQ(d,"ge"))                  return -KEY_ge;
5539             break;
5540         case 4:
5541             if (strEQ(d,"grep"))                return KEY_grep;
5542             if (strEQ(d,"goto"))                return KEY_goto;
5543             if (strEQ(d,"glob"))                return KEY_glob;
5544             break;
5545         case 6:
5546             if (strEQ(d,"gmtime"))              return -KEY_gmtime;
5547             break;
5548         }
5549         break;
5550     case 'h':
5551         if (strEQ(d,"hex"))                     return -KEY_hex;
5552         break;
5553     case 'I':
5554         if (strEQ(d,"INIT"))                    return KEY_INIT;
5555         break;
5556     case 'i':
5557         switch (len) {
5558         case 2:
5559             if (strEQ(d,"if"))                  return KEY_if;
5560             break;
5561         case 3:
5562             if (strEQ(d,"int"))                 return -KEY_int;
5563             break;
5564         case 5:
5565             if (strEQ(d,"index"))               return -KEY_index;
5566             if (strEQ(d,"ioctl"))               return -KEY_ioctl;
5567             break;
5568         }
5569         break;
5570     case 'j':
5571         if (strEQ(d,"join"))                    return -KEY_join;
5572         break;
5573     case 'k':
5574         if (len == 4) {
5575            if (strEQ(d,"keys"))                return -KEY_keys;
5576             if (strEQ(d,"kill"))                return -KEY_kill;
5577         }
5578         break;
5579     case 'l':
5580         switch (len) {
5581         case 2:
5582             if (strEQ(d,"lt"))                  return -KEY_lt;
5583             if (strEQ(d,"le"))                  return -KEY_le;
5584             if (strEQ(d,"lc"))                  return -KEY_lc;
5585             break;
5586         case 3:
5587             if (strEQ(d,"log"))                 return -KEY_log;
5588             break;
5589         case 4:
5590             if (strEQ(d,"last"))                return KEY_last;
5591             if (strEQ(d,"link"))                return -KEY_link;
5592             if (strEQ(d,"lock"))                return -KEY_lock;
5593             break;
5594         case 5:
5595             if (strEQ(d,"local"))               return KEY_local;
5596             if (strEQ(d,"lstat"))               return -KEY_lstat;
5597             break;
5598         case 6:
5599             if (strEQ(d,"length"))              return -KEY_length;
5600             if (strEQ(d,"listen"))              return -KEY_listen;
5601             break;
5602         case 7:
5603             if (strEQ(d,"lcfirst"))             return -KEY_lcfirst;
5604             break;
5605         case 9:
5606             if (strEQ(d,"localtime"))           return -KEY_localtime;
5607             break;
5608         }
5609         break;
5610     case 'm':
5611         switch (len) {
5612         case 1:                                 return KEY_m;
5613         case 2:
5614             if (strEQ(d,"my"))                  return KEY_my;
5615             break;
5616         case 3:
5617             if (strEQ(d,"map"))                 return KEY_map;
5618             break;
5619         case 5:
5620             if (strEQ(d,"mkdir"))               return -KEY_mkdir;
5621             break;
5622         case 6:
5623             if (strEQ(d,"msgctl"))              return -KEY_msgctl;
5624             if (strEQ(d,"msgget"))              return -KEY_msgget;
5625             if (strEQ(d,"msgrcv"))              return -KEY_msgrcv;
5626             if (strEQ(d,"msgsnd"))              return -KEY_msgsnd;
5627             break;
5628         }
5629         break;
5630     case 'n':
5631         if (strEQ(d,"next"))                    return KEY_next;
5632         if (strEQ(d,"ne"))                      return -KEY_ne;
5633         if (strEQ(d,"not"))                     return -KEY_not;
5634         if (strEQ(d,"no"))                      return KEY_no;
5635         break;
5636     case 'o':
5637         switch (len) {
5638         case 2:
5639             if (strEQ(d,"or"))                  return -KEY_or;
5640             break;
5641         case 3:
5642             if (strEQ(d,"ord"))                 return -KEY_ord;
5643             if (strEQ(d,"oct"))                 return -KEY_oct;
5644             if (strEQ(d,"our"))                 return KEY_our;
5645             break;
5646         case 4:
5647             if (strEQ(d,"open"))                return -KEY_open;
5648             break;
5649         case 7:
5650             if (strEQ(d,"opendir"))             return -KEY_opendir;
5651             break;
5652         }
5653         break;
5654     case 'p':
5655         switch (len) {
5656         case 3:
5657            if (strEQ(d,"pop"))                 return -KEY_pop;
5658             if (strEQ(d,"pos"))                 return KEY_pos;
5659             break;
5660         case 4:
5661            if (strEQ(d,"push"))                return -KEY_push;
5662             if (strEQ(d,"pack"))                return -KEY_pack;
5663             if (strEQ(d,"pipe"))                return -KEY_pipe;
5664             break;
5665         case 5:
5666             if (strEQ(d,"print"))               return KEY_print;
5667             break;
5668         case 6:
5669             if (strEQ(d,"printf"))              return KEY_printf;
5670             break;
5671         case 7:
5672             if (strEQ(d,"package"))             return KEY_package;
5673             break;
5674         case 9:
5675             if (strEQ(d,"prototype"))           return KEY_prototype;
5676         }
5677         break;
5678     case 'q':
5679         if (len <= 2) {
5680             if (strEQ(d,"q"))                   return KEY_q;
5681             if (strEQ(d,"qr"))                  return KEY_qr;
5682             if (strEQ(d,"qq"))                  return KEY_qq;
5683             if (strEQ(d,"qw"))                  return KEY_qw;
5684             if (strEQ(d,"qx"))                  return KEY_qx;
5685         }
5686         else if (strEQ(d,"quotemeta"))          return -KEY_quotemeta;
5687         break;
5688     case 'r':
5689         switch (len) {
5690         case 3:
5691             if (strEQ(d,"ref"))                 return -KEY_ref;
5692             break;
5693         case 4:
5694             if (strEQ(d,"read"))                return -KEY_read;
5695             if (strEQ(d,"rand"))                return -KEY_rand;
5696             if (strEQ(d,"recv"))                return -KEY_recv;
5697             if (strEQ(d,"redo"))                return KEY_redo;
5698             break;
5699         case 5:
5700             if (strEQ(d,"rmdir"))               return -KEY_rmdir;
5701             if (strEQ(d,"reset"))               return -KEY_reset;
5702             break;
5703         case 6:
5704             if (strEQ(d,"return"))              return KEY_return;
5705             if (strEQ(d,"rename"))              return -KEY_rename;
5706             if (strEQ(d,"rindex"))              return -KEY_rindex;
5707             break;
5708         case 7:
5709             if (strEQ(d,"require"))             return KEY_require;
5710             if (strEQ(d,"reverse"))             return -KEY_reverse;
5711             if (strEQ(d,"readdir"))             return -KEY_readdir;
5712             break;
5713         case 8:
5714             if (strEQ(d,"readlink"))            return -KEY_readlink;
5715             if (strEQ(d,"readline"))            return -KEY_readline;
5716             if (strEQ(d,"readpipe"))            return -KEY_readpipe;
5717             break;
5718         case 9:
5719             if (strEQ(d,"rewinddir"))           return -KEY_rewinddir;
5720             break;
5721         }
5722         break;
5723     case 's':
5724         switch (d[1]) {
5725         case 0:                                 return KEY_s;
5726         case 'c':
5727             if (strEQ(d,"scalar"))              return KEY_scalar;
5728             break;
5729         case 'e':
5730             switch (len) {
5731             case 4:
5732                 if (strEQ(d,"seek"))            return -KEY_seek;
5733                 if (strEQ(d,"send"))            return -KEY_send;
5734                 break;
5735             case 5:
5736                 if (strEQ(d,"semop"))           return -KEY_semop;
5737                 break;
5738             case 6:
5739                 if (strEQ(d,"select"))          return -KEY_select;
5740                 if (strEQ(d,"semctl"))          return -KEY_semctl;
5741                 if (strEQ(d,"semget"))          return -KEY_semget;
5742                 break;
5743             case 7:
5744                 if (strEQ(d,"setpgrp"))         return -KEY_setpgrp;
5745                 if (strEQ(d,"seekdir"))         return -KEY_seekdir;
5746                 break;
5747             case 8:
5748                 if (strEQ(d,"setpwent"))        return -KEY_setpwent;
5749                 if (strEQ(d,"setgrent"))        return -KEY_setgrent;
5750                 break;
5751             case 9:
5752                 if (strEQ(d,"setnetent"))       return -KEY_setnetent;
5753                 break;
5754             case 10:
5755                 if (strEQ(d,"setsockopt"))      return -KEY_setsockopt;
5756                 if (strEQ(d,"sethostent"))      return -KEY_sethostent;
5757                 if (strEQ(d,"setservent"))      return -KEY_setservent;
5758                 break;
5759             case 11:
5760                 if (strEQ(d,"setpriority"))     return -KEY_setpriority;
5761                 if (strEQ(d,"setprotoent"))     return -KEY_setprotoent;
5762                 break;
5763             }
5764             break;
5765         case 'h':
5766             switch (len) {
5767             case 5:
5768                if (strEQ(d,"shift"))           return -KEY_shift;
5769                 break;
5770             case 6:
5771                 if (strEQ(d,"shmctl"))          return -KEY_shmctl;
5772                 if (strEQ(d,"shmget"))          return -KEY_shmget;
5773                 break;
5774             case 7:
5775                 if (strEQ(d,"shmread"))         return -KEY_shmread;
5776                 break;
5777             case 8:
5778                 if (strEQ(d,"shmwrite"))        return -KEY_shmwrite;
5779                 if (strEQ(d,"shutdown"))        return -KEY_shutdown;
5780                 break;
5781             }
5782             break;
5783         case 'i':
5784             if (strEQ(d,"sin"))                 return -KEY_sin;
5785             break;
5786         case 'l':
5787             if (strEQ(d,"sleep"))               return -KEY_sleep;
5788             break;
5789         case 'o':
5790             if (strEQ(d,"sort"))                return KEY_sort;
5791             if (strEQ(d,"socket"))              return -KEY_socket;
5792             if (strEQ(d,"socketpair"))          return -KEY_socketpair;
5793             break;
5794         case 'p':
5795             if (strEQ(d,"split"))               return KEY_split;
5796             if (strEQ(d,"sprintf"))             return -KEY_sprintf;
5797            if (strEQ(d,"splice"))              return -KEY_splice;
5798             break;
5799         case 'q':
5800             if (strEQ(d,"sqrt"))                return -KEY_sqrt;
5801             break;
5802         case 'r':
5803             if (strEQ(d,"srand"))               return -KEY_srand;
5804             break;
5805         case 't':
5806             if (strEQ(d,"stat"))                return -KEY_stat;
5807             if (strEQ(d,"study"))               return KEY_study;
5808             break;
5809         case 'u':
5810             if (strEQ(d,"substr"))              return -KEY_substr;
5811             if (strEQ(d,"sub"))                 return KEY_sub;
5812             break;
5813         case 'y':
5814             switch (len) {
5815             case 6:
5816                 if (strEQ(d,"system"))          return -KEY_system;
5817                 break;
5818             case 7:
5819                 if (strEQ(d,"symlink"))         return -KEY_symlink;
5820                 if (strEQ(d,"syscall"))         return -KEY_syscall;
5821                 if (strEQ(d,"sysopen"))         return -KEY_sysopen;
5822                 if (strEQ(d,"sysread"))         return -KEY_sysread;
5823                 if (strEQ(d,"sysseek"))         return -KEY_sysseek;
5824                 break;
5825             case 8:
5826                 if (strEQ(d,"syswrite"))        return -KEY_syswrite;
5827                 break;
5828             }
5829             break;
5830         }
5831         break;
5832     case 't':
5833         switch (len) {
5834         case 2:
5835             if (strEQ(d,"tr"))                  return KEY_tr;
5836             break;
5837         case 3:
5838             if (strEQ(d,"tie"))                 return KEY_tie;
5839             break;
5840         case 4:
5841             if (strEQ(d,"tell"))                return -KEY_tell;
5842             if (strEQ(d,"tied"))                return KEY_tied;
5843             if (strEQ(d,"time"))                return -KEY_time;
5844             break;
5845         case 5:
5846             if (strEQ(d,"times"))               return -KEY_times;
5847             break;
5848         case 7:
5849             if (strEQ(d,"telldir"))             return -KEY_telldir;
5850             break;
5851         case 8:
5852             if (strEQ(d,"truncate"))            return -KEY_truncate;
5853             break;
5854         }
5855         break;
5856     case 'u':
5857         switch (len) {
5858         case 2:
5859             if (strEQ(d,"uc"))                  return -KEY_uc;
5860             break;
5861         case 3:
5862             if (strEQ(d,"use"))                 return KEY_use;
5863             break;
5864         case 5:
5865             if (strEQ(d,"undef"))               return KEY_undef;
5866             if (strEQ(d,"until"))               return KEY_until;
5867             if (strEQ(d,"untie"))               return KEY_untie;
5868             if (strEQ(d,"utime"))               return -KEY_utime;
5869             if (strEQ(d,"umask"))               return -KEY_umask;
5870             break;
5871         case 6:
5872             if (strEQ(d,"unless"))              return KEY_unless;
5873             if (strEQ(d,"unpack"))              return -KEY_unpack;
5874             if (strEQ(d,"unlink"))              return -KEY_unlink;
5875             break;
5876         case 7:
5877            if (strEQ(d,"unshift"))             return -KEY_unshift;
5878             if (strEQ(d,"ucfirst"))             return -KEY_ucfirst;
5879             break;
5880         }
5881         break;
5882     case 'v':
5883         if (strEQ(d,"values"))                  return -KEY_values;
5884         if (strEQ(d,"vec"))                     return -KEY_vec;
5885         break;
5886     case 'w':
5887         switch (len) {
5888         case 4:
5889             if (strEQ(d,"warn"))                return -KEY_warn;
5890             if (strEQ(d,"wait"))                return -KEY_wait;
5891             break;
5892         case 5:
5893             if (strEQ(d,"while"))               return KEY_while;
5894             if (strEQ(d,"write"))               return -KEY_write;
5895             break;
5896         case 7:
5897             if (strEQ(d,"waitpid"))             return -KEY_waitpid;
5898             break;
5899         case 9:
5900             if (strEQ(d,"wantarray"))           return -KEY_wantarray;
5901             break;
5902         }
5903         break;
5904     case 'x':
5905         if (len == 1)                           return -KEY_x;
5906         if (strEQ(d,"xor"))                     return -KEY_xor;
5907         break;
5908     case 'y':
5909         if (len == 1)                           return KEY_y;
5910         break;
5911     case 'z':
5912         break;
5913     }
5914     return 0;
5915 }
5916
5917 STATIC void
5918 S_checkcomma(pTHX_ register char *s, char *name, char *what)
5919 {
5920     char *w;
5921
5922     if (*s == ' ' && s[1] == '(') {     /* XXX gotta be a better way */
5923         if (ckWARN(WARN_SYNTAX)) {
5924             int level = 1;
5925             for (w = s+2; *w && level; w++) {
5926                 if (*w == '(')
5927                     ++level;
5928                 else if (*w == ')')
5929                     --level;
5930             }
5931             if (*w)
5932                 for (; *w && isSPACE(*w); w++) ;
5933             if (!*w || !strchr(";|})]oaiuw!=", *w))     /* an advisory hack only... */
5934                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5935                             "%s (...) interpreted as function",name);
5936         }
5937     }
5938     while (s < PL_bufend && isSPACE(*s))
5939         s++;
5940     if (*s == '(')
5941         s++;
5942     while (s < PL_bufend && isSPACE(*s))
5943         s++;
5944     if (isIDFIRST_lazy_if(s,UTF)) {
5945         w = s++;
5946         while (isALNUM_lazy_if(s,UTF))
5947             s++;
5948         while (s < PL_bufend && isSPACE(*s))
5949             s++;
5950         if (*s == ',') {
5951             int kw;
5952             *s = '\0';
5953             kw = keyword(w, s - w) || get_cv(w, FALSE) != 0;
5954             *s = ',';
5955             if (kw)
5956                 return;
5957             Perl_croak(aTHX_ "No comma allowed after %s", what);
5958         }
5959     }
5960 }
5961
5962 /* Either returns sv, or mortalizes sv and returns a new SV*.
5963    Best used as sv=new_constant(..., sv, ...).
5964    If s, pv are NULL, calls subroutine with one argument,
5965    and type is used with error messages only. */
5966
5967 STATIC SV *
5968 S_new_constant(pTHX_ char *s, STRLEN len, const char *key, SV *sv, SV *pv,
5969                const char *type)
5970 {
5971     dSP;
5972     HV *table = GvHV(PL_hintgv);                 /* ^H */
5973     SV *res;
5974     SV **cvp;
5975     SV *cv, *typesv;
5976     const char *why1, *why2, *why3;
5977
5978     if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
5979         SV *msg;
5980         
5981         why2 = strEQ(key,"charnames")
5982                ? "(possibly a missing \"use charnames ...\")"
5983                : "";
5984         msg = Perl_newSVpvf(aTHX_ "Constant(%s) unknown: %s",
5985                             (type ? type: "undef"), why2);
5986
5987         /* This is convoluted and evil ("goto considered harmful")
5988          * but I do not understand the intricacies of all the different
5989          * failure modes of %^H in here.  The goal here is to make
5990          * the most probable error message user-friendly. --jhi */
5991
5992         goto msgdone;
5993
5994     report:
5995         msg = Perl_newSVpvf(aTHX_ "Constant(%s): %s%s%s",
5996                             (type ? type: "undef"), why1, why2, why3);
5997     msgdone:
5998         yyerror(SvPVX(msg));
5999         SvREFCNT_dec(msg);
6000         return sv;
6001     }
6002     cvp = hv_fetch(table, key, strlen(key), FALSE);
6003     if (!cvp || !SvOK(*cvp)) {
6004         why1 = "$^H{";
6005         why2 = key;
6006         why3 = "} is not defined";
6007         goto report;
6008     }
6009     sv_2mortal(sv);                     /* Parent created it permanently */
6010     cv = *cvp;
6011     if (!pv && s)
6012         pv = sv_2mortal(newSVpvn(s, len));
6013     if (type && pv)
6014         typesv = sv_2mortal(newSVpv(type, 0));
6015     else
6016         typesv = &PL_sv_undef;
6017
6018     PUSHSTACKi(PERLSI_OVERLOAD);
6019     ENTER ;
6020     SAVETMPS;
6021
6022     PUSHMARK(SP) ;
6023     EXTEND(sp, 3);
6024     if (pv)
6025         PUSHs(pv);
6026     PUSHs(sv);
6027     if (pv)
6028         PUSHs(typesv);
6029     PUTBACK;
6030     call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
6031
6032     SPAGAIN ;
6033
6034     /* Check the eval first */
6035     if (!PL_in_eval && SvTRUE(ERRSV)) {
6036         STRLEN n_a;
6037         sv_catpv(ERRSV, "Propagated");
6038         yyerror(SvPV(ERRSV, n_a)); /* Duplicates the message inside eval */
6039         (void)POPs;
6040         res = SvREFCNT_inc(sv);
6041     }
6042     else {
6043         res = POPs;
6044         (void)SvREFCNT_inc(res);
6045     }
6046
6047     PUTBACK ;
6048     FREETMPS ;
6049     LEAVE ;
6050     POPSTACK;
6051
6052     if (!SvOK(res)) {
6053         why1 = "Call to &{$^H{";
6054         why2 = key;
6055         why3 = "}} did not return a defined value";
6056         sv = res;
6057         goto report;
6058     }
6059
6060     return res;
6061 }
6062
6063 STATIC char *
6064 S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
6065 {
6066     register char *d = dest;
6067     register char *e = d + destlen - 3;  /* two-character token, ending NUL */
6068     for (;;) {
6069         if (d >= e)
6070             Perl_croak(aTHX_ ident_too_long);
6071         if (isALNUM(*s))        /* UTF handled below */
6072             *d++ = *s++;
6073         else if (*s == '\'' && allow_package && isIDFIRST_lazy_if(s+1,UTF)) {
6074             *d++ = ':';
6075             *d++ = ':';
6076             s++;
6077         }
6078         else if (*s == ':' && s[1] == ':' && allow_package && s[2] != '$') {
6079             *d++ = *s++;
6080             *d++ = *s++;
6081         }
6082         else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
6083             char *t = s + UTF8SKIP(s);
6084             while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
6085                 t += UTF8SKIP(t);
6086             if (d + (t - s) > e)
6087                 Perl_croak(aTHX_ ident_too_long);
6088             Copy(s, d, t - s, char);
6089             d += t - s;
6090             s = t;
6091         }
6092         else {
6093             *d = '\0';
6094             *slp = d - dest;
6095             return s;
6096         }
6097     }
6098 }
6099
6100 STATIC char *
6101 S_scan_ident(pTHX_ register char *s, register char *send, char *dest, STRLEN destlen, I32 ck_uni)
6102 {
6103     register char *d;
6104     register char *e;
6105     char *bracket = 0;
6106     char funny = *s++;
6107
6108     if (isSPACE(*s))
6109         s = skipspace(s);
6110     d = dest;
6111     e = d + destlen - 3;        /* two-character token, ending NUL */
6112     if (isDIGIT(*s)) {
6113         while (isDIGIT(*s)) {
6114             if (d >= e)
6115                 Perl_croak(aTHX_ ident_too_long);
6116             *d++ = *s++;
6117         }
6118     }
6119     else {
6120         for (;;) {
6121             if (d >= e)
6122                 Perl_croak(aTHX_ ident_too_long);
6123             if (isALNUM(*s))    /* UTF handled below */
6124                 *d++ = *s++;
6125             else if (*s == '\'' && isIDFIRST_lazy_if(s+1,UTF)) {
6126                 *d++ = ':';
6127                 *d++ = ':';
6128                 s++;
6129             }
6130             else if (*s == ':' && s[1] == ':') {
6131                 *d++ = *s++;
6132                 *d++ = *s++;
6133             }
6134             else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
6135                 char *t = s + UTF8SKIP(s);
6136                 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
6137                     t += UTF8SKIP(t);
6138                 if (d + (t - s) > e)
6139                     Perl_croak(aTHX_ ident_too_long);
6140                 Copy(s, d, t - s, char);
6141                 d += t - s;
6142                 s = t;
6143             }
6144             else
6145                 break;
6146         }
6147     }
6148     *d = '\0';
6149     d = dest;
6150     if (*d) {
6151         if (PL_lex_state != LEX_NORMAL)
6152             PL_lex_state = LEX_INTERPENDMAYBE;
6153         return s;
6154     }
6155     if (*s == '$' && s[1] &&
6156         (isALNUM_lazy_if(s+1,UTF) || strchr("${", s[1]) || strnEQ(s+1,"::",2)) )
6157     {
6158         return s;
6159     }
6160     if (*s == '{') {
6161         bracket = s;
6162         s++;
6163     }
6164     else if (ck_uni)
6165         check_uni();
6166     if (s < send)
6167         *d = *s++;
6168     d[1] = '\0';
6169     if (*d == '^' && *s && isCONTROLVAR(*s)) {
6170         *d = toCTRL(*s);
6171         s++;
6172     }
6173     if (bracket) {
6174         if (isSPACE(s[-1])) {
6175             while (s < send) {
6176                 char ch = *s++;
6177                 if (!SPACE_OR_TAB(ch)) {
6178                     *d = ch;
6179                     break;
6180                 }
6181             }
6182         }
6183         if (isIDFIRST_lazy_if(d,UTF)) {
6184             d++;
6185             if (UTF) {
6186                 e = s;
6187                 while ((e < send && isALNUM_lazy_if(e,UTF)) || *e == ':') {
6188                     e += UTF8SKIP(e);
6189                     while (e < send && UTF8_IS_CONTINUED(*e) && is_utf8_mark((U8*)e))
6190                         e += UTF8SKIP(e);
6191                 }
6192                 Copy(s, d, e - s, char);
6193                 d += e - s;
6194                 s = e;
6195             }
6196             else {
6197                 while ((isALNUM(*s) || *s == ':') && d < e)
6198                     *d++ = *s++;
6199                 if (d >= e)
6200                     Perl_croak(aTHX_ ident_too_long);
6201             }
6202             *d = '\0';
6203             while (s < send && SPACE_OR_TAB(*s)) s++;
6204             if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
6205                 if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest)) {
6206                     const char *brack = *s == '[' ? "[...]" : "{...}";
6207                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
6208                         "Ambiguous use of %c{%s%s} resolved to %c%s%s",
6209                         funny, dest, brack, funny, dest, brack);
6210                 }
6211                 bracket++;
6212                 PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
6213                 return s;
6214             }
6215         }
6216         /* Handle extended ${^Foo} variables
6217          * 1999-02-27 mjd-perl-patch@plover.com */
6218         else if (!isALNUM(*d) && !isPRINT(*d) /* isCTRL(d) */
6219                  && isALNUM(*s))
6220         {
6221             d++;
6222             while (isALNUM(*s) && d < e) {
6223                 *d++ = *s++;
6224             }
6225             if (d >= e)
6226                 Perl_croak(aTHX_ ident_too_long);
6227             *d = '\0';
6228         }
6229         if (*s == '}') {
6230             s++;
6231             if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets)
6232                 PL_lex_state = LEX_INTERPEND;
6233             if (funny == '#')
6234                 funny = '@';
6235             if (PL_lex_state == LEX_NORMAL) {
6236                 if (ckWARN(WARN_AMBIGUOUS) &&
6237                     (keyword(dest, d - dest) || get_cv(dest, FALSE)))
6238                 {
6239                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
6240                         "Ambiguous use of %c{%s} resolved to %c%s",
6241                         funny, dest, funny, dest);
6242                 }
6243             }
6244         }
6245         else {
6246             s = bracket;                /* let the parser handle it */
6247             *dest = '\0';
6248         }
6249     }
6250     else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
6251         PL_lex_state = LEX_INTERPEND;
6252     return s;
6253 }
6254
6255 void
6256 Perl_pmflag(pTHX_ U32* pmfl, int ch)
6257 {
6258     if (ch == 'i')
6259         *pmfl |= PMf_FOLD;
6260     else if (ch == 'g')
6261         *pmfl |= PMf_GLOBAL;
6262     else if (ch == 'c')
6263         *pmfl |= PMf_CONTINUE;
6264     else if (ch == 'o')
6265         *pmfl |= PMf_KEEP;
6266     else if (ch == 'm')
6267         *pmfl |= PMf_MULTILINE;
6268     else if (ch == 's')
6269         *pmfl |= PMf_SINGLELINE;
6270     else if (ch == 'x')
6271         *pmfl |= PMf_EXTENDED;
6272 }
6273
6274 STATIC char *
6275 S_scan_pat(pTHX_ char *start, I32 type)
6276 {
6277     PMOP *pm;
6278     char *s;
6279
6280     s = scan_str(start,FALSE,FALSE);
6281     if (!s)
6282         Perl_croak(aTHX_ "Search pattern not terminated");
6283
6284     pm = (PMOP*)newPMOP(type, 0);
6285     if (PL_multi_open == '?')
6286         pm->op_pmflags |= PMf_ONCE;
6287     if(type == OP_QR) {
6288         while (*s && strchr("iomsx", *s))
6289             pmflag(&pm->op_pmflags,*s++);
6290     }
6291     else {
6292         while (*s && strchr("iogcmsx", *s))
6293             pmflag(&pm->op_pmflags,*s++);
6294     }
6295     /* issue a warning if /c is specified,but /g is not */
6296     if (ckWARN(WARN_REGEXP) && 
6297         (pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL))
6298     {
6299         Perl_warner(aTHX_ packWARN(WARN_REGEXP), c_without_g);
6300     }
6301
6302     pm->op_pmpermflags = pm->op_pmflags;
6303
6304     PL_lex_op = (OP*)pm;
6305     yylval.ival = OP_MATCH;
6306     return s;
6307 }
6308
6309 STATIC char *
6310 S_scan_subst(pTHX_ char *start)
6311 {
6312     register char *s;
6313     register PMOP *pm;
6314     I32 first_start;
6315     I32 es = 0;
6316
6317     yylval.ival = OP_NULL;
6318
6319     s = scan_str(start,FALSE,FALSE);
6320
6321     if (!s)
6322         Perl_croak(aTHX_ "Substitution pattern not terminated");
6323
6324     if (s[-1] == PL_multi_open)
6325         s--;
6326
6327     first_start = PL_multi_start;
6328     s = scan_str(s,FALSE,FALSE);
6329     if (!s) {
6330         if (PL_lex_stuff) {
6331             SvREFCNT_dec(PL_lex_stuff);
6332             PL_lex_stuff = Nullsv;
6333         }
6334         Perl_croak(aTHX_ "Substitution replacement not terminated");
6335     }
6336     PL_multi_start = first_start;       /* so whole substitution is taken together */
6337
6338     pm = (PMOP*)newPMOP(OP_SUBST, 0);
6339     while (*s) {
6340         if (*s == 'e') {
6341             s++;
6342             es++;
6343         }
6344         else if (strchr("iogcmsx", *s))
6345             pmflag(&pm->op_pmflags,*s++);
6346         else
6347             break;
6348     }
6349
6350     /* /c is not meaningful with s/// */
6351     if (ckWARN(WARN_REGEXP) && (pm->op_pmflags & PMf_CONTINUE))
6352     {
6353         Perl_warner(aTHX_ packWARN(WARN_REGEXP), c_in_subst);
6354     }
6355
6356     if (es) {
6357         SV *repl;
6358         PL_sublex_info.super_bufptr = s;
6359         PL_sublex_info.super_bufend = PL_bufend;
6360         PL_multi_end = 0;
6361         pm->op_pmflags |= PMf_EVAL;
6362         repl = newSVpvn("",0);
6363         while (es-- > 0)
6364             sv_catpv(repl, es ? "eval " : "do ");
6365         sv_catpvn(repl, "{ ", 2);
6366         sv_catsv(repl, PL_lex_repl);
6367         sv_catpvn(repl, " };", 2);
6368         SvEVALED_on(repl);
6369         SvREFCNT_dec(PL_lex_repl);
6370         PL_lex_repl = repl;
6371     }
6372
6373     pm->op_pmpermflags = pm->op_pmflags;
6374     PL_lex_op = (OP*)pm;
6375     yylval.ival = OP_SUBST;
6376     return s;
6377 }
6378
6379 STATIC char *
6380 S_scan_trans(pTHX_ char *start)
6381 {
6382     register char* s;
6383     OP *o;
6384     short *tbl;
6385     I32 squash;
6386     I32 del;
6387     I32 complement;
6388
6389     yylval.ival = OP_NULL;
6390
6391     s = scan_str(start,FALSE,FALSE);
6392     if (!s)
6393         Perl_croak(aTHX_ "Transliteration pattern not terminated");
6394     if (s[-1] == PL_multi_open)
6395         s--;
6396
6397     s = scan_str(s,FALSE,FALSE);
6398     if (!s) {
6399         if (PL_lex_stuff) {
6400             SvREFCNT_dec(PL_lex_stuff);
6401             PL_lex_stuff = Nullsv;
6402         }
6403         Perl_croak(aTHX_ "Transliteration replacement not terminated");
6404     }
6405
6406     complement = del = squash = 0;
6407     while (strchr("cds", *s)) {
6408         if (*s == 'c')
6409             complement = OPpTRANS_COMPLEMENT;
6410         else if (*s == 'd')
6411             del = OPpTRANS_DELETE;
6412         else if (*s == 's')
6413             squash = OPpTRANS_SQUASH;
6414         s++;
6415     }
6416
6417     New(803, tbl, complement&&!del?258:256, short);
6418     o = newPVOP(OP_TRANS, 0, (char*)tbl);
6419     o->op_private = del|squash|complement|
6420       (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
6421       (DO_UTF8(PL_lex_repl) ? OPpTRANS_TO_UTF   : 0);
6422
6423     PL_lex_op = o;
6424     yylval.ival = OP_TRANS;
6425     return s;
6426 }
6427
6428 STATIC char *
6429 S_scan_heredoc(pTHX_ register char *s)
6430 {
6431     SV *herewas;
6432     I32 op_type = OP_SCALAR;
6433     I32 len;
6434     SV *tmpstr;
6435     char term;
6436     register char *d;
6437     register char *e;
6438     char *peek;
6439     int outer = (PL_rsfp && !(PL_lex_inwhat == OP_SCALAR));
6440
6441     s += 2;
6442     d = PL_tokenbuf;
6443     e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
6444     if (!outer)
6445         *d++ = '\n';
6446     for (peek = s; SPACE_OR_TAB(*peek); peek++) ;
6447     if (*peek && strchr("`'\"",*peek)) {
6448         s = peek;
6449         term = *s++;
6450         s = delimcpy(d, e, s, PL_bufend, term, &len);
6451         d += len;
6452         if (s < PL_bufend)
6453             s++;
6454     }
6455     else {
6456         if (*s == '\\')
6457             s++, term = '\'';
6458         else
6459             term = '"';
6460         if (!isALNUM_lazy_if(s,UTF))
6461             deprecate_old("bare << to mean <<\"\"");
6462         for (; isALNUM_lazy_if(s,UTF); s++) {
6463             if (d < e)
6464                 *d++ = *s;
6465         }
6466     }
6467     if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
6468         Perl_croak(aTHX_ "Delimiter for here document is too long");
6469     *d++ = '\n';
6470     *d = '\0';
6471     len = d - PL_tokenbuf;
6472 #ifndef PERL_STRICT_CR
6473     d = strchr(s, '\r');
6474     if (d) {
6475         char *olds = s;
6476         s = d;
6477         while (s < PL_bufend) {
6478             if (*s == '\r') {
6479                 *d++ = '\n';
6480                 if (*++s == '\n')
6481                     s++;
6482             }
6483             else if (*s == '\n' && s[1] == '\r') {      /* \015\013 on a mac? */
6484                 *d++ = *s++;
6485                 s++;
6486             }
6487             else
6488                 *d++ = *s++;
6489         }
6490         *d = '\0';
6491         PL_bufend = d;
6492         SvCUR_set(PL_linestr, PL_bufend - SvPVX(PL_linestr));
6493         s = olds;
6494     }
6495 #endif
6496     d = "\n";
6497     if (outer || !(d=ninstr(s,PL_bufend,d,d+1)))
6498         herewas = newSVpvn(s,PL_bufend-s);
6499     else
6500         s--, herewas = newSVpvn(s,d-s);
6501     s += SvCUR(herewas);
6502
6503     tmpstr = NEWSV(87,79);
6504     sv_upgrade(tmpstr, SVt_PVIV);
6505     if (term == '\'') {
6506         op_type = OP_CONST;
6507         SvIVX(tmpstr) = -1;
6508     }
6509     else if (term == '`') {
6510         op_type = OP_BACKTICK;
6511         SvIVX(tmpstr) = '\\';
6512     }
6513
6514     CLINE;
6515     PL_multi_start = CopLINE(PL_curcop);
6516     PL_multi_open = PL_multi_close = '<';
6517     term = *PL_tokenbuf;
6518     if (PL_lex_inwhat == OP_SUBST && PL_in_eval && !PL_rsfp) {
6519         char *bufptr = PL_sublex_info.super_bufptr;
6520         char *bufend = PL_sublex_info.super_bufend;
6521         char *olds = s - SvCUR(herewas);
6522         s = strchr(bufptr, '\n');
6523         if (!s)
6524             s = bufend;
6525         d = s;
6526         while (s < bufend &&
6527           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
6528             if (*s++ == '\n')
6529                 CopLINE_inc(PL_curcop);
6530         }
6531         if (s >= bufend) {
6532             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
6533             missingterm(PL_tokenbuf);
6534         }
6535         sv_setpvn(herewas,bufptr,d-bufptr+1);
6536         sv_setpvn(tmpstr,d+1,s-d);
6537         s += len - 1;
6538         sv_catpvn(herewas,s,bufend-s);
6539         (void)strcpy(bufptr,SvPVX(herewas));
6540
6541         s = olds;
6542         goto retval;
6543     }
6544     else if (!outer) {
6545         d = s;
6546         while (s < PL_bufend &&
6547           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
6548             if (*s++ == '\n')
6549                 CopLINE_inc(PL_curcop);
6550         }
6551         if (s >= PL_bufend) {
6552             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
6553             missingterm(PL_tokenbuf);
6554         }
6555         sv_setpvn(tmpstr,d+1,s-d);
6556         s += len - 1;
6557         CopLINE_inc(PL_curcop); /* the preceding stmt passes a newline */
6558
6559         sv_catpvn(herewas,s,PL_bufend-s);
6560         sv_setsv(PL_linestr,herewas);
6561         PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
6562         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
6563         PL_last_lop = PL_last_uni = Nullch;
6564     }
6565     else
6566         sv_setpvn(tmpstr,"",0);   /* avoid "uninitialized" warning */
6567     while (s >= PL_bufend) {    /* multiple line string? */
6568         if (!outer ||
6569          !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
6570             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
6571             missingterm(PL_tokenbuf);
6572         }
6573         CopLINE_inc(PL_curcop);
6574         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
6575         PL_last_lop = PL_last_uni = Nullch;
6576 #ifndef PERL_STRICT_CR
6577         if (PL_bufend - PL_linestart >= 2) {
6578             if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
6579                 (PL_bufend[-2] == '\n' && PL_bufend[-1] == '\r'))
6580             {
6581                 PL_bufend[-2] = '\n';
6582                 PL_bufend--;
6583                 SvCUR_set(PL_linestr, PL_bufend - SvPVX(PL_linestr));
6584             }
6585             else if (PL_bufend[-1] == '\r')
6586                 PL_bufend[-1] = '\n';
6587         }
6588         else if (PL_bufend - PL_linestart == 1 && PL_bufend[-1] == '\r')
6589             PL_bufend[-1] = '\n';
6590 #endif
6591         if (PERLDB_LINE && PL_curstash != PL_debstash) {
6592             SV *sv = NEWSV(88,0);
6593
6594             sv_upgrade(sv, SVt_PVMG);
6595             sv_setsv(sv,PL_linestr);
6596             (void)SvIOK_on(sv);
6597             SvIVX(sv) = 0;
6598             av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop),sv);
6599         }
6600         if (*s == term && memEQ(s,PL_tokenbuf,len)) {
6601             s = PL_bufend - 1;
6602             *s = ' ';
6603             sv_catsv(PL_linestr,herewas);
6604             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
6605         }
6606         else {
6607             s = PL_bufend;
6608             sv_catsv(tmpstr,PL_linestr);
6609         }
6610     }
6611     s++;
6612 retval:
6613     PL_multi_end = CopLINE(PL_curcop);
6614     if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
6615         SvLEN_set(tmpstr, SvCUR(tmpstr) + 1);
6616         Renew(SvPVX(tmpstr), SvLEN(tmpstr), char);
6617     }
6618     SvREFCNT_dec(herewas);
6619     if (UTF && !IN_BYTES && is_utf8_string((U8*)SvPVX(tmpstr), SvCUR(tmpstr)))
6620         SvUTF8_on(tmpstr);
6621     PL_lex_stuff = tmpstr;
6622     yylval.ival = op_type;
6623     return s;
6624 }
6625
6626 /* scan_inputsymbol
6627    takes: current position in input buffer
6628    returns: new position in input buffer
6629    side-effects: yylval and lex_op are set.
6630
6631    This code handles:
6632
6633    <>           read from ARGV
6634    <FH>         read from filehandle
6635    <pkg::FH>    read from package qualified filehandle
6636    <pkg'FH>     read from package qualified filehandle
6637    <$fh>        read from filehandle in $fh
6638    <*.h>        filename glob
6639
6640 */
6641
6642 STATIC char *
6643 S_scan_inputsymbol(pTHX_ char *start)
6644 {
6645     register char *s = start;           /* current position in buffer */
6646     register char *d;
6647     register char *e;
6648     char *end;
6649     I32 len;
6650
6651     d = PL_tokenbuf;                    /* start of temp holding space */
6652     e = PL_tokenbuf + sizeof PL_tokenbuf;       /* end of temp holding space */
6653     end = strchr(s, '\n');
6654     if (!end)
6655         end = PL_bufend;
6656     s = delimcpy(d, e, s + 1, end, '>', &len);  /* extract until > */
6657
6658     /* die if we didn't have space for the contents of the <>,
6659        or if it didn't end, or if we see a newline
6660     */
6661
6662     if (len >= sizeof PL_tokenbuf)
6663         Perl_croak(aTHX_ "Excessively long <> operator");
6664     if (s >= end)
6665         Perl_croak(aTHX_ "Unterminated <> operator");
6666
6667     s++;
6668
6669     /* check for <$fh>
6670        Remember, only scalar variables are interpreted as filehandles by
6671        this code.  Anything more complex (e.g., <$fh{$num}>) will be
6672        treated as a glob() call.
6673        This code makes use of the fact that except for the $ at the front,
6674        a scalar variable and a filehandle look the same.
6675     */
6676     if (*d == '$' && d[1]) d++;
6677
6678     /* allow <Pkg'VALUE> or <Pkg::VALUE> */
6679     while (*d && (isALNUM_lazy_if(d,UTF) || *d == '\'' || *d == ':'))
6680         d++;
6681
6682     /* If we've tried to read what we allow filehandles to look like, and
6683        there's still text left, then it must be a glob() and not a getline.
6684        Use scan_str to pull out the stuff between the <> and treat it
6685        as nothing more than a string.
6686     */
6687
6688     if (d - PL_tokenbuf != len) {
6689         yylval.ival = OP_GLOB;
6690         set_csh();
6691         s = scan_str(start,FALSE,FALSE);
6692         if (!s)
6693            Perl_croak(aTHX_ "Glob not terminated");
6694         return s;
6695     }
6696     else {
6697         bool readline_overriden = FALSE;
6698         GV *gv_readline = Nullgv;
6699         GV **gvp;
6700         /* we're in a filehandle read situation */
6701         d = PL_tokenbuf;
6702
6703         /* turn <> into <ARGV> */
6704         if (!len)
6705             (void)strcpy(d,"ARGV");
6706
6707         /* Check whether readline() is overriden */
6708         if (((gv_readline = gv_fetchpv("readline", FALSE, SVt_PVCV))
6709                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline))
6710                 ||
6711                 ((gvp = (GV**)hv_fetch(PL_globalstash, "readline", 8, FALSE))
6712                 && (gv_readline = *gvp) != (GV*)&PL_sv_undef
6713                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline)))
6714             readline_overriden = TRUE;
6715
6716         /* if <$fh>, create the ops to turn the variable into a
6717            filehandle
6718         */
6719         if (*d == '$') {
6720             I32 tmp;
6721
6722             /* try to find it in the pad for this block, otherwise find
6723                add symbol table ops
6724             */
6725             if ((tmp = pad_findmy(d)) != NOT_IN_PAD) {
6726                 SV *namesv = AvARRAY(PL_comppad_name)[tmp];
6727                 if (SvFLAGS(namesv) & SVpad_OUR) {
6728                     SV *sym = sv_2mortal(newSVpv(HvNAME(GvSTASH(namesv)),0));
6729                     sv_catpvn(sym, "::", 2);
6730                     sv_catpv(sym, d+1);
6731                     d = SvPVX(sym);
6732                     goto intro_sym;
6733                 }
6734                 else {
6735                     OP *o = newOP(OP_PADSV, 0);
6736                     o->op_targ = tmp;
6737                     PL_lex_op = readline_overriden
6738                         ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
6739                                 append_elem(OP_LIST, o,
6740                                     newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
6741                         : (OP*)newUNOP(OP_READLINE, 0, o);
6742                 }
6743             }
6744             else {
6745                 GV *gv;
6746                 ++d;
6747 intro_sym:
6748                 gv = gv_fetchpv(d,
6749                                 (PL_in_eval
6750                                  ? (GV_ADDMULTI | GV_ADDINEVAL)
6751                                  : GV_ADDMULTI),
6752                                 SVt_PV);
6753                 PL_lex_op = readline_overriden
6754                     ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
6755                             append_elem(OP_LIST,
6756                                 newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
6757                                 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
6758                     : (OP*)newUNOP(OP_READLINE, 0,
6759                             newUNOP(OP_RV2SV, 0,
6760                                 newGVOP(OP_GV, 0, gv)));
6761             }
6762             if (!readline_overriden)
6763                 PL_lex_op->op_flags |= OPf_SPECIAL;
6764             /* we created the ops in PL_lex_op, so make yylval.ival a null op */
6765             yylval.ival = OP_NULL;
6766         }
6767
6768         /* If it's none of the above, it must be a literal filehandle
6769            (<Foo::BAR> or <FOO>) so build a simple readline OP */
6770         else {
6771             GV *gv = gv_fetchpv(d,TRUE, SVt_PVIO);
6772             PL_lex_op = readline_overriden
6773                 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
6774                         append_elem(OP_LIST,
6775                             newGVOP(OP_GV, 0, gv),
6776                             newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
6777                 : (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
6778             yylval.ival = OP_NULL;
6779         }
6780     }
6781
6782     return s;
6783 }
6784
6785
6786 /* scan_str
6787    takes: start position in buffer
6788           keep_quoted preserve \ on the embedded delimiter(s)
6789           keep_delims preserve the delimiters around the string
6790    returns: position to continue reading from buffer
6791    side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
6792         updates the read buffer.
6793
6794    This subroutine pulls a string out of the input.  It is called for:
6795         q               single quotes           q(literal text)
6796         '               single quotes           'literal text'
6797         qq              double quotes           qq(interpolate $here please)
6798         "               double quotes           "interpolate $here please"
6799         qx              backticks               qx(/bin/ls -l)
6800         `               backticks               `/bin/ls -l`
6801         qw              quote words             @EXPORT_OK = qw( func() $spam )
6802         m//             regexp match            m/this/
6803         s///            regexp substitute       s/this/that/
6804         tr///           string transliterate    tr/this/that/
6805         y///            string transliterate    y/this/that/
6806         ($*@)           sub prototypes          sub foo ($)
6807         (stuff)         sub attr parameters     sub foo : attr(stuff)
6808         <>              readline or globs       <FOO>, <>, <$fh>, or <*.c>
6809         
6810    In most of these cases (all but <>, patterns and transliterate)
6811    yylex() calls scan_str().  m// makes yylex() call scan_pat() which
6812    calls scan_str().  s/// makes yylex() call scan_subst() which calls
6813    scan_str().  tr/// and y/// make yylex() call scan_trans() which
6814    calls scan_str().
6815
6816    It skips whitespace before the string starts, and treats the first
6817    character as the delimiter.  If the delimiter is one of ([{< then
6818    the corresponding "close" character )]}> is used as the closing
6819    delimiter.  It allows quoting of delimiters, and if the string has
6820    balanced delimiters ([{<>}]) it allows nesting.
6821
6822    On success, the SV with the resulting string is put into lex_stuff or,
6823    if that is already non-NULL, into lex_repl. The second case occurs only
6824    when parsing the RHS of the special constructs s/// and tr/// (y///).
6825    For convenience, the terminating delimiter character is stuffed into
6826    SvIVX of the SV.
6827 */
6828
6829 STATIC char *
6830 S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
6831 {
6832     SV *sv;                             /* scalar value: string */
6833     char *tmps;                         /* temp string, used for delimiter matching */
6834     register char *s = start;           /* current position in the buffer */
6835     register char term;                 /* terminating character */
6836     register char *to;                  /* current position in the sv's data */
6837     I32 brackets = 1;                   /* bracket nesting level */
6838     bool has_utf8 = FALSE;              /* is there any utf8 content? */
6839
6840     /* skip space before the delimiter */
6841     if (isSPACE(*s))
6842         s = skipspace(s);
6843
6844     /* mark where we are, in case we need to report errors */
6845     CLINE;
6846
6847     /* after skipping whitespace, the next character is the terminator */
6848     term = *s;
6849     if (!UTF8_IS_INVARIANT((U8)term) && UTF)
6850         has_utf8 = TRUE;
6851
6852     /* mark where we are */
6853     PL_multi_start = CopLINE(PL_curcop);
6854     PL_multi_open = term;
6855
6856     /* find corresponding closing delimiter */
6857     if (term && (tmps = strchr("([{< )]}> )]}>",term)))
6858         term = tmps[5];
6859     PL_multi_close = term;
6860
6861     /* create a new SV to hold the contents.  87 is leak category, I'm
6862        assuming.  79 is the SV's initial length.  What a random number. */
6863     sv = NEWSV(87,79);
6864     sv_upgrade(sv, SVt_PVIV);
6865     SvIVX(sv) = term;
6866     (void)SvPOK_only(sv);               /* validate pointer */
6867
6868     /* move past delimiter and try to read a complete string */
6869     if (keep_delims)
6870         sv_catpvn(sv, s, 1);
6871     s++;
6872     for (;;) {
6873         /* extend sv if need be */
6874         SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
6875         /* set 'to' to the next character in the sv's string */
6876         to = SvPVX(sv)+SvCUR(sv);
6877
6878         /* if open delimiter is the close delimiter read unbridle */
6879         if (PL_multi_open == PL_multi_close) {
6880             for (; s < PL_bufend; s++,to++) {
6881                 /* embedded newlines increment the current line number */
6882                 if (*s == '\n' && !PL_rsfp)
6883                     CopLINE_inc(PL_curcop);
6884                 /* handle quoted delimiters */
6885                 if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
6886                     if (!keep_quoted && s[1] == term)
6887                         s++;
6888                 /* any other quotes are simply copied straight through */
6889                     else
6890                         *to++ = *s++;
6891                 }
6892                 /* terminate when run out of buffer (the for() condition), or
6893                    have found the terminator */
6894                 else if (*s == term)
6895                     break;
6896                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
6897                     has_utf8 = TRUE;
6898                 *to = *s;
6899             }
6900         }
6901         
6902         /* if the terminator isn't the same as the start character (e.g.,
6903            matched brackets), we have to allow more in the quoting, and
6904            be prepared for nested brackets.
6905         */
6906         else {
6907             /* read until we run out of string, or we find the terminator */
6908             for (; s < PL_bufend; s++,to++) {
6909                 /* embedded newlines increment the line count */
6910                 if (*s == '\n' && !PL_rsfp)
6911                     CopLINE_inc(PL_curcop);
6912                 /* backslashes can escape the open or closing characters */
6913                 if (*s == '\\' && s+1 < PL_bufend) {
6914                     if (!keep_quoted &&
6915                         ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
6916                         s++;
6917                     else
6918                         *to++ = *s++;
6919                 }
6920                 /* allow nested opens and closes */
6921                 else if (*s == PL_multi_close && --brackets <= 0)
6922                     break;
6923                 else if (*s == PL_multi_open)
6924                     brackets++;
6925                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
6926                     has_utf8 = TRUE;
6927                 *to = *s;
6928             }
6929         }
6930         /* terminate the copied string and update the sv's end-of-string */
6931         *to = '\0';
6932         SvCUR_set(sv, to - SvPVX(sv));
6933
6934         /*
6935          * this next chunk reads more into the buffer if we're not done yet
6936          */
6937
6938         if (s < PL_bufend)
6939             break;              /* handle case where we are done yet :-) */
6940
6941 #ifndef PERL_STRICT_CR
6942         if (to - SvPVX(sv) >= 2) {
6943             if ((to[-2] == '\r' && to[-1] == '\n') ||
6944                 (to[-2] == '\n' && to[-1] == '\r'))
6945             {
6946                 to[-2] = '\n';
6947                 to--;
6948                 SvCUR_set(sv, to - SvPVX(sv));
6949             }
6950             else if (to[-1] == '\r')
6951                 to[-1] = '\n';
6952         }
6953         else if (to - SvPVX(sv) == 1 && to[-1] == '\r')
6954             to[-1] = '\n';
6955 #endif
6956         
6957         /* if we're out of file, or a read fails, bail and reset the current
6958            line marker so we can report where the unterminated string began
6959         */
6960         if (!PL_rsfp ||
6961          !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
6962             sv_free(sv);
6963             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
6964             return Nullch;
6965         }
6966         /* we read a line, so increment our line counter */
6967         CopLINE_inc(PL_curcop);
6968
6969         /* update debugger info */
6970         if (PERLDB_LINE && PL_curstash != PL_debstash) {
6971             SV *sv = NEWSV(88,0);
6972
6973             sv_upgrade(sv, SVt_PVMG);
6974             sv_setsv(sv,PL_linestr);
6975             (void)SvIOK_on(sv);
6976             SvIVX(sv) = 0;
6977             av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop), sv);
6978         }
6979
6980         /* having changed the buffer, we must update PL_bufend */
6981         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
6982         PL_last_lop = PL_last_uni = Nullch;
6983     }
6984
6985     /* at this point, we have successfully read the delimited string */
6986
6987     if (keep_delims)
6988         sv_catpvn(sv, s, 1);
6989     if (has_utf8)
6990         SvUTF8_on(sv);
6991     PL_multi_end = CopLINE(PL_curcop);
6992     s++;
6993
6994     /* if we allocated too much space, give some back */
6995     if (SvCUR(sv) + 5 < SvLEN(sv)) {
6996         SvLEN_set(sv, SvCUR(sv) + 1);
6997         Renew(SvPVX(sv), SvLEN(sv), char);
6998     }
6999
7000     /* decide whether this is the first or second quoted string we've read
7001        for this op
7002     */
7003
7004     if (PL_lex_stuff)
7005         PL_lex_repl = sv;
7006     else
7007         PL_lex_stuff = sv;
7008     return s;
7009 }
7010
7011 /*
7012   scan_num
7013   takes: pointer to position in buffer
7014   returns: pointer to new position in buffer
7015   side-effects: builds ops for the constant in yylval.op
7016
7017   Read a number in any of the formats that Perl accepts:
7018
7019   \d(_?\d)*(\.(\d(_?\d)*)?)?[Ee][\+\-]?(\d(_?\d)*)      12 12.34 12.
7020   \.\d(_?\d)*[Ee][\+\-]?(\d(_?\d)*)                     .34
7021   0b[01](_?[01])*
7022   0[0-7](_?[0-7])*
7023   0x[0-9A-Fa-f](_?[0-9A-Fa-f])*
7024
7025   Like most scan_ routines, it uses the PL_tokenbuf buffer to hold the
7026   thing it reads.
7027
7028   If it reads a number without a decimal point or an exponent, it will
7029   try converting the number to an integer and see if it can do so
7030   without loss of precision.
7031 */
7032
7033 char *
7034 Perl_scan_num(pTHX_ char *start, YYSTYPE* lvalp)
7035 {
7036     register char *s = start;           /* current position in buffer */
7037     register char *d;                   /* destination in temp buffer */
7038     register char *e;                   /* end of temp buffer */
7039     NV nv;                              /* number read, as a double */
7040     SV *sv = Nullsv;                    /* place to put the converted number */
7041     bool floatit;                       /* boolean: int or float? */
7042     char *lastub = 0;                   /* position of last underbar */
7043     static char number_too_long[] = "Number too long";
7044
7045     /* We use the first character to decide what type of number this is */
7046
7047     switch (*s) {
7048     default:
7049       Perl_croak(aTHX_ "panic: scan_num");
7050
7051     /* if it starts with a 0, it could be an octal number, a decimal in
7052        0.13 disguise, or a hexadecimal number, or a binary number. */
7053     case '0':
7054         {
7055           /* variables:
7056              u          holds the "number so far"
7057              shift      the power of 2 of the base
7058                         (hex == 4, octal == 3, binary == 1)
7059              overflowed was the number more than we can hold?
7060
7061              Shift is used when we add a digit.  It also serves as an "are
7062              we in octal/hex/binary?" indicator to disallow hex characters
7063              when in octal mode.
7064            */
7065             NV n = 0.0;
7066             UV u = 0;
7067             I32 shift;
7068             bool overflowed = FALSE;
7069             static NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
7070             static char* bases[5] = { "", "binary", "", "octal",
7071                                       "hexadecimal" };
7072             static char* Bases[5] = { "", "Binary", "", "Octal",
7073                                       "Hexadecimal" };
7074             static char *maxima[5] = { "",
7075                                        "0b11111111111111111111111111111111",
7076                                        "",
7077                                        "037777777777",
7078                                        "0xffffffff" };
7079             char *base, *Base, *max;
7080
7081             /* check for hex */
7082             if (s[1] == 'x') {
7083                 shift = 4;
7084                 s += 2;
7085             } else if (s[1] == 'b') {
7086                 shift = 1;
7087                 s += 2;
7088             }
7089             /* check for a decimal in disguise */
7090             else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
7091                 goto decimal;
7092             /* so it must be octal */
7093             else {
7094                 shift = 3;
7095                 s++;
7096             }
7097
7098             if (*s == '_') {
7099                if (ckWARN(WARN_SYNTAX))
7100                    Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7101                                "Misplaced _ in number");
7102                lastub = s++;
7103             }
7104
7105             base = bases[shift];
7106             Base = Bases[shift];
7107             max  = maxima[shift];
7108
7109             /* read the rest of the number */
7110             for (;;) {
7111                 /* x is used in the overflow test,
7112                    b is the digit we're adding on. */
7113                 UV x, b;
7114
7115                 switch (*s) {
7116
7117                 /* if we don't mention it, we're done */
7118                 default:
7119                     goto out;
7120
7121                 /* _ are ignored -- but warned about if consecutive */
7122                 case '_':
7123                     if (ckWARN(WARN_SYNTAX) && lastub && s == lastub + 1)
7124                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7125                                     "Misplaced _ in number");
7126                     lastub = s++;
7127                     break;
7128
7129                 /* 8 and 9 are not octal */
7130                 case '8': case '9':
7131                     if (shift == 3)
7132                         yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
7133                     /* FALL THROUGH */
7134
7135                 /* octal digits */
7136                 case '2': case '3': case '4':
7137                 case '5': case '6': case '7':
7138                     if (shift == 1)
7139                         yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
7140                     /* FALL THROUGH */
7141
7142                 case '0': case '1':
7143                     b = *s++ & 15;              /* ASCII digit -> value of digit */
7144                     goto digit;
7145
7146                 /* hex digits */
7147                 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
7148                 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
7149                     /* make sure they said 0x */
7150                     if (shift != 4)
7151                         goto out;
7152                     b = (*s++ & 7) + 9;
7153
7154                     /* Prepare to put the digit we have onto the end
7155                        of the number so far.  We check for overflows.
7156                     */
7157
7158                   digit:
7159                     if (!overflowed) {
7160                         x = u << shift; /* make room for the digit */
7161
7162                         if ((x >> shift) != u
7163                             && !(PL_hints & HINT_NEW_BINARY)) {
7164                             overflowed = TRUE;
7165                             n = (NV) u;
7166                             if (ckWARN_d(WARN_OVERFLOW))
7167                                 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
7168                                             "Integer overflow in %s number",
7169                                             base);
7170                         } else
7171                             u = x | b;          /* add the digit to the end */
7172                     }
7173                     if (overflowed) {
7174                         n *= nvshift[shift];
7175                         /* If an NV has not enough bits in its
7176                          * mantissa to represent an UV this summing of
7177                          * small low-order numbers is a waste of time
7178                          * (because the NV cannot preserve the
7179                          * low-order bits anyway): we could just
7180                          * remember when did we overflow and in the
7181                          * end just multiply n by the right
7182                          * amount. */
7183                         n += (NV) b;
7184                     }
7185                     break;
7186                 }
7187             }
7188
7189           /* if we get here, we had success: make a scalar value from
7190              the number.
7191           */
7192           out:
7193
7194             /* final misplaced underbar check */
7195             if (s[-1] == '_') {
7196                 if (ckWARN(WARN_SYNTAX))
7197                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
7198             }
7199
7200             sv = NEWSV(92,0);
7201             if (overflowed) {
7202                 if (ckWARN(WARN_PORTABLE) && n > 4294967295.0)
7203                     Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
7204                                 "%s number > %s non-portable",
7205                                 Base, max);
7206                 sv_setnv(sv, n);
7207             }
7208             else {
7209 #if UVSIZE > 4
7210                 if (ckWARN(WARN_PORTABLE) && u > 0xffffffff)
7211                     Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
7212                                 "%s number > %s non-portable",
7213                                 Base, max);
7214 #endif
7215                 sv_setuv(sv, u);
7216             }
7217             if (PL_hints & HINT_NEW_BINARY)
7218                 sv = new_constant(start, s - start, "binary", sv, Nullsv, NULL);
7219         }
7220         break;
7221
7222     /*
7223       handle decimal numbers.
7224       we're also sent here when we read a 0 as the first digit
7225     */
7226     case '1': case '2': case '3': case '4': case '5':
7227     case '6': case '7': case '8': case '9': case '.':
7228       decimal:
7229         d = PL_tokenbuf;
7230         e = PL_tokenbuf + sizeof PL_tokenbuf - 6; /* room for various punctuation */
7231         floatit = FALSE;
7232
7233         /* read next group of digits and _ and copy into d */
7234         while (isDIGIT(*s) || *s == '_') {
7235             /* skip underscores, checking for misplaced ones
7236                if -w is on
7237             */
7238             if (*s == '_') {
7239                 if (ckWARN(WARN_SYNTAX) && lastub && s == lastub + 1)
7240                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7241                                 "Misplaced _ in number");
7242                 lastub = s++;
7243             }
7244             else {
7245                 /* check for end of fixed-length buffer */
7246                 if (d >= e)
7247                     Perl_croak(aTHX_ number_too_long);
7248                 /* if we're ok, copy the character */
7249                 *d++ = *s++;
7250             }
7251         }
7252
7253         /* final misplaced underbar check */
7254         if (lastub && s == lastub + 1) {
7255             if (ckWARN(WARN_SYNTAX))
7256                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
7257         }
7258
7259         /* read a decimal portion if there is one.  avoid
7260            3..5 being interpreted as the number 3. followed
7261            by .5
7262         */
7263         if (*s == '.' && s[1] != '.') {
7264             floatit = TRUE;
7265             *d++ = *s++;
7266
7267             if (*s == '_') {
7268                 if (ckWARN(WARN_SYNTAX))
7269                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7270                                 "Misplaced _ in number");
7271                 lastub = s;
7272             }
7273
7274             /* copy, ignoring underbars, until we run out of digits.
7275             */
7276             for (; isDIGIT(*s) || *s == '_'; s++) {
7277                 /* fixed length buffer check */
7278                 if (d >= e)
7279                     Perl_croak(aTHX_ number_too_long);
7280                 if (*s == '_') {
7281                    if (ckWARN(WARN_SYNTAX) && lastub && s == lastub + 1)
7282                        Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7283                                    "Misplaced _ in number");
7284                    lastub = s;
7285                 }
7286                 else
7287                     *d++ = *s;
7288             }
7289             /* fractional part ending in underbar? */
7290             if (s[-1] == '_') {
7291                 if (ckWARN(WARN_SYNTAX))
7292                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7293                                 "Misplaced _ in number");
7294             }
7295             if (*s == '.' && isDIGIT(s[1])) {
7296                 /* oops, it's really a v-string, but without the "v" */
7297                 s = start;
7298                 goto vstring;
7299             }
7300         }
7301
7302         /* read exponent part, if present */
7303         if (*s && strchr("eE",*s) && strchr("+-0123456789_", s[1])) {
7304             floatit = TRUE;
7305             s++;
7306
7307             /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
7308             *d++ = 'e';         /* At least some Mach atof()s don't grok 'E' */
7309
7310             /* stray preinitial _ */
7311             if (*s == '_') {
7312                 if (ckWARN(WARN_SYNTAX))
7313                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7314                                 "Misplaced _ in number");
7315                 lastub = s++;
7316             }
7317
7318             /* allow positive or negative exponent */
7319             if (*s == '+' || *s == '-')
7320                 *d++ = *s++;
7321
7322             /* stray initial _ */
7323             if (*s == '_') {
7324                 if (ckWARN(WARN_SYNTAX))
7325                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7326                                 "Misplaced _ in number");
7327                 lastub = s++;
7328             }
7329
7330             /* read digits of exponent */
7331             while (isDIGIT(*s) || *s == '_') {
7332                 if (isDIGIT(*s)) {
7333                     if (d >= e)
7334                         Perl_croak(aTHX_ number_too_long);
7335                     *d++ = *s++;
7336                 }
7337                 else {
7338                    if (ckWARN(WARN_SYNTAX) &&
7339                        ((lastub && s == lastub + 1) ||
7340                         (!isDIGIT(s[1]) && s[1] != '_')))
7341                        Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7342                                    "Misplaced _ in number");
7343                    lastub = s++;
7344                 }
7345             }
7346         }
7347
7348
7349         /* make an sv from the string */
7350         sv = NEWSV(92,0);
7351
7352         /*
7353            We try to do an integer conversion first if no characters
7354            indicating "float" have been found.
7355          */
7356
7357         if (!floatit) {
7358             UV uv;
7359             int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
7360
7361             if (flags == IS_NUMBER_IN_UV) {
7362               if (uv <= IV_MAX)
7363                 sv_setiv(sv, uv); /* Prefer IVs over UVs. */
7364               else
7365                 sv_setuv(sv, uv);
7366             } else if (flags == (IS_NUMBER_IN_UV | IS_NUMBER_NEG)) {
7367               if (uv <= (UV) IV_MIN)
7368                 sv_setiv(sv, -(IV)uv);
7369               else
7370                 floatit = TRUE;
7371             } else
7372               floatit = TRUE;
7373         }
7374         if (floatit) {
7375             /* terminate the string */
7376             *d = '\0';
7377             nv = Atof(PL_tokenbuf);
7378             sv_setnv(sv, nv);
7379         }
7380
7381         if ( floatit ? (PL_hints & HINT_NEW_FLOAT) :
7382                        (PL_hints & HINT_NEW_INTEGER) )
7383             sv = new_constant(PL_tokenbuf, d - PL_tokenbuf,
7384                               (floatit ? "float" : "integer"),
7385                               sv, Nullsv, NULL);
7386         break;
7387
7388     /* if it starts with a v, it could be a v-string */
7389     case 'v':
7390 vstring:
7391                 sv = NEWSV(92,5); /* preallocate storage space */
7392                 s = new_vstring(s,sv);
7393         break;
7394     }
7395
7396     /* make the op for the constant and return */
7397
7398     if (sv)
7399         lvalp->opval = newSVOP(OP_CONST, 0, sv);
7400     else
7401         lvalp->opval = Nullop;
7402
7403     return s;
7404 }
7405
7406 STATIC char *
7407 S_scan_formline(pTHX_ register char *s)
7408 {
7409     register char *eol;
7410     register char *t;
7411     SV *stuff = newSVpvn("",0);
7412     bool needargs = FALSE;
7413
7414     while (!needargs) {
7415         if (*s == '.' || *s == /*{*/'}') {
7416             /*SUPPRESS 530*/
7417 #ifdef PERL_STRICT_CR
7418             for (t = s+1;SPACE_OR_TAB(*t); t++) ;
7419 #else
7420             for (t = s+1;SPACE_OR_TAB(*t) || *t == '\r'; t++) ;
7421 #endif
7422             if (*t == '\n' || t == PL_bufend)
7423                 break;
7424         }
7425         if (PL_in_eval && !PL_rsfp) {
7426             eol = strchr(s,'\n');
7427             if (!eol++)
7428                 eol = PL_bufend;
7429         }
7430         else
7431             eol = PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
7432         if (*s != '#') {
7433             for (t = s; t < eol; t++) {
7434                 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
7435                     needargs = FALSE;
7436                     goto enough;        /* ~~ must be first line in formline */
7437                 }
7438                 if (*t == '@' || *t == '^')
7439                     needargs = TRUE;
7440             }
7441             if (eol > s) {
7442                 sv_catpvn(stuff, s, eol-s);
7443 #ifndef PERL_STRICT_CR
7444                 if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
7445                     char *end = SvPVX(stuff) + SvCUR(stuff);
7446                     end[-2] = '\n';
7447                     end[-1] = '\0';
7448                     SvCUR(stuff)--;
7449                 }
7450 #endif
7451             }
7452             else
7453               break;
7454         }
7455         s = eol;
7456         if (PL_rsfp) {
7457             s = filter_gets(PL_linestr, PL_rsfp, 0);
7458             PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
7459             PL_bufend = PL_bufptr + SvCUR(PL_linestr);
7460             PL_last_lop = PL_last_uni = Nullch;
7461             if (!s) {
7462                 s = PL_bufptr;
7463                 yyerror("Format not terminated");
7464                 break;
7465             }
7466         }
7467         incline(s);
7468     }
7469   enough:
7470     if (SvCUR(stuff)) {
7471         PL_expect = XTERM;
7472         if (needargs) {
7473             PL_lex_state = LEX_NORMAL;
7474             PL_nextval[PL_nexttoke].ival = 0;
7475             force_next(',');
7476         }
7477         else
7478             PL_lex_state = LEX_FORMLINE;
7479         PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, stuff);
7480         force_next(THING);
7481         PL_nextval[PL_nexttoke].ival = OP_FORMLINE;
7482         force_next(LSTOP);
7483     }
7484     else {
7485         SvREFCNT_dec(stuff);
7486         PL_lex_formbrack = 0;
7487         PL_bufptr = s;
7488     }
7489     return s;
7490 }
7491
7492 STATIC void
7493 S_set_csh(pTHX)
7494 {
7495 #ifdef CSH
7496     if (!PL_cshlen)
7497         PL_cshlen = strlen(PL_cshname);
7498 #endif
7499 }
7500
7501 I32
7502 Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
7503 {
7504     I32 oldsavestack_ix = PL_savestack_ix;
7505     CV* outsidecv = PL_compcv;
7506     AV* comppadlist;
7507
7508     if (PL_compcv) {
7509         assert(SvTYPE(PL_compcv) == SVt_PVCV);
7510     }
7511     SAVEI32(PL_subline);
7512     save_item(PL_subname);
7513     SAVEI32(PL_padix);
7514     SAVECOMPPAD();
7515     SAVESPTR(PL_comppad_name);
7516     SAVESPTR(PL_compcv);
7517     SAVEI32(PL_comppad_name_fill);
7518     SAVEI32(PL_min_intro_pending);
7519     SAVEI32(PL_max_intro_pending);
7520     SAVEI32(PL_pad_reset_pending);
7521
7522     PL_compcv = (CV*)NEWSV(1104,0);
7523     sv_upgrade((SV *)PL_compcv, is_format ? SVt_PVFM : SVt_PVCV);
7524     CvFLAGS(PL_compcv) |= flags;
7525
7526     PL_comppad = newAV();
7527     av_push(PL_comppad, Nullsv);
7528     PL_curpad = AvARRAY(PL_comppad);
7529     PL_comppad_name = newAV();
7530     PL_comppad_name_fill = 0;
7531     PL_min_intro_pending = 0;
7532     PL_padix = 0;
7533     PL_subline = CopLINE(PL_curcop);
7534 #ifdef USE_5005THREADS
7535     av_store(PL_comppad_name, 0, newSVpvn("@_", 2));
7536     PL_curpad[0] = (SV*)newAV();
7537     SvPADMY_on(PL_curpad[0]);   /* XXX Needed? */
7538 #endif /* USE_5005THREADS */
7539
7540     comppadlist = newAV();
7541     AvREAL_off(comppadlist);
7542     av_store(comppadlist, 0, (SV*)PL_comppad_name);
7543     av_store(comppadlist, 1, (SV*)PL_comppad);
7544
7545     CvPADLIST(PL_compcv) = comppadlist;
7546     CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc(outsidecv);
7547 #ifdef USE_5005THREADS
7548     CvOWNER(PL_compcv) = 0;
7549     New(666, CvMUTEXP(PL_compcv), 1, perl_mutex);
7550     MUTEX_INIT(CvMUTEXP(PL_compcv));
7551 #endif /* USE_5005THREADS */
7552
7553     return oldsavestack_ix;
7554 }
7555
7556 #ifdef __SC__
7557 #pragma segment Perl_yylex
7558 #endif
7559 int
7560 Perl_yywarn(pTHX_ char *s)
7561 {
7562     PL_in_eval |= EVAL_WARNONLY;
7563     yyerror(s);
7564     PL_in_eval &= ~EVAL_WARNONLY;
7565     return 0;
7566 }
7567
7568 int
7569 Perl_yyerror(pTHX_ char *s)
7570 {
7571     char *where = NULL;
7572     char *context = NULL;
7573     int contlen = -1;
7574     SV *msg;
7575
7576     if (!yychar || (yychar == ';' && !PL_rsfp))
7577         where = "at EOF";
7578     else if (PL_bufptr > PL_oldoldbufptr && PL_bufptr - PL_oldoldbufptr < 200 &&
7579       PL_oldoldbufptr != PL_oldbufptr && PL_oldbufptr != PL_bufptr) {
7580         /*
7581                 Only for NetWare:
7582                 The code below is removed for NetWare because it abends/crashes on NetWare
7583                 when the script has error such as not having the closing quotes like:
7584                     if ($var eq "value)
7585                 Checking of white spaces is anyway done in NetWare code.
7586         */
7587 #ifndef NETWARE
7588         while (isSPACE(*PL_oldoldbufptr))
7589             PL_oldoldbufptr++;
7590 #endif
7591         context = PL_oldoldbufptr;
7592         contlen = PL_bufptr - PL_oldoldbufptr;
7593     }
7594     else if (PL_bufptr > PL_oldbufptr && PL_bufptr - PL_oldbufptr < 200 &&
7595       PL_oldbufptr != PL_bufptr) {
7596         /*
7597                 Only for NetWare:
7598                 The code below is removed for NetWare because it abends/crashes on NetWare
7599                 when the script has error such as not having the closing quotes like:
7600                     if ($var eq "value)
7601                 Checking of white spaces is anyway done in NetWare code.
7602         */
7603 #ifndef NETWARE
7604         while (isSPACE(*PL_oldbufptr))
7605             PL_oldbufptr++;
7606 #endif
7607         context = PL_oldbufptr;
7608         contlen = PL_bufptr - PL_oldbufptr;
7609     }
7610     else if (yychar > 255)
7611         where = "next token ???";
7612 #ifdef USE_PURE_BISON
7613 /*  GNU Bison sets the value -2 */
7614     else if (yychar == -2) {
7615 #else
7616     else if ((yychar & 127) == 127) {
7617 #endif
7618         if (PL_lex_state == LEX_NORMAL ||
7619            (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
7620             where = "at end of line";
7621         else if (PL_lex_inpat)
7622             where = "within pattern";
7623         else
7624             where = "within string";
7625     }
7626     else {
7627         SV *where_sv = sv_2mortal(newSVpvn("next char ", 10));
7628         if (yychar < 32)
7629             Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
7630         else if (isPRINT_LC(yychar))
7631             Perl_sv_catpvf(aTHX_ where_sv, "%c", yychar);
7632         else
7633             Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
7634         where = SvPVX(where_sv);
7635     }
7636     msg = sv_2mortal(newSVpv(s, 0));
7637     Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
7638         OutCopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
7639     if (context)
7640         Perl_sv_catpvf(aTHX_ msg, "near \"%.*s\"\n", contlen, context);
7641     else
7642         Perl_sv_catpvf(aTHX_ msg, "%s\n", where);
7643     if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
7644         Perl_sv_catpvf(aTHX_ msg,
7645         "  (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
7646                 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
7647         PL_multi_end = 0;
7648     }
7649     if (PL_in_eval & EVAL_WARNONLY)
7650         Perl_warn(aTHX_ "%"SVf, msg);
7651     else
7652         qerror(msg);
7653     if (PL_error_count >= 10) {
7654         if (PL_in_eval && SvCUR(ERRSV))
7655             Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
7656             ERRSV, OutCopFILE(PL_curcop));
7657         else
7658             Perl_croak(aTHX_ "%s has too many errors.\n",
7659             OutCopFILE(PL_curcop));
7660     }
7661     PL_in_my = 0;
7662     PL_in_my_stash = Nullhv;
7663     return 0;
7664 }
7665 #ifdef __SC__
7666 #pragma segment Main
7667 #endif
7668
7669 STATIC char*
7670 S_swallow_bom(pTHX_ U8 *s)
7671 {
7672     STRLEN slen;
7673     slen = SvCUR(PL_linestr);
7674     switch (*s) {
7675     case 0xFF:
7676         if (s[1] == 0xFE) {
7677             /* UTF-16 little-endian */
7678             if (s[2] == 0 && s[3] == 0)  /* UTF-32 little-endian */
7679                 Perl_croak(aTHX_ "Unsupported script encoding");
7680 #ifndef PERL_NO_UTF16_FILTER
7681             DEBUG_p(PerlIO_printf(Perl_debug_log, "UTF-LE script encoding\n"));
7682             s += 2;
7683             if (PL_bufend > (char*)s) {
7684                 U8 *news;
7685                 I32 newlen;
7686
7687                 filter_add(utf16rev_textfilter, NULL);
7688                 New(898, news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
7689                 PL_bufend = (char*)utf16_to_utf8_reversed(s, news,
7690                                                  PL_bufend - (char*)s - 1,
7691                                                  &newlen);
7692                 Copy(news, s, newlen, U8);
7693                 SvCUR_set(PL_linestr, newlen);
7694                 PL_bufend = SvPVX(PL_linestr) + newlen;
7695                 news[newlen++] = '\0';
7696                 Safefree(news);
7697             }
7698 #else
7699             Perl_croak(aTHX_ "Unsupported script encoding");
7700 #endif
7701         }
7702         break;
7703     case 0xFE:
7704         if (s[1] == 0xFF) {   /* UTF-16 big-endian */
7705 #ifndef PERL_NO_UTF16_FILTER
7706             DEBUG_p(PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding\n"));
7707             s += 2;
7708             if (PL_bufend > (char *)s) {
7709                 U8 *news;
7710                 I32 newlen;
7711
7712                 filter_add(utf16_textfilter, NULL);
7713                 New(898, news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
7714                 PL_bufend = (char*)utf16_to_utf8(s, news,
7715                                                  PL_bufend - (char*)s,
7716                                                  &newlen);
7717                 Copy(news, s, newlen, U8);
7718                 SvCUR_set(PL_linestr, newlen);
7719                 PL_bufend = SvPVX(PL_linestr) + newlen;
7720                 news[newlen++] = '\0';
7721                 Safefree(news);
7722             }
7723 #else
7724             Perl_croak(aTHX_ "Unsupported script encoding");
7725 #endif
7726         }
7727         break;
7728     case 0xEF:
7729         if (slen > 2 && s[1] == 0xBB && s[2] == 0xBF) {
7730             DEBUG_p(PerlIO_printf(Perl_debug_log, "UTF-8 script encoding\n"));
7731             s += 3;                      /* UTF-8 */
7732         }
7733         break;
7734     case 0:
7735         if (slen > 3 && s[1] == 0 &&  /* UTF-32 big-endian */
7736             s[2] == 0xFE && s[3] == 0xFF)
7737         {
7738             Perl_croak(aTHX_ "Unsupported script encoding");
7739         }
7740     }
7741     return (char*)s;
7742 }
7743
7744 /*
7745  * restore_rsfp
7746  * Restore a source filter.
7747  */
7748
7749 static void
7750 restore_rsfp(pTHX_ void *f)
7751 {
7752     PerlIO *fp = (PerlIO*)f;
7753
7754     if (PL_rsfp == PerlIO_stdin())
7755         PerlIO_clearerr(PL_rsfp);
7756     else if (PL_rsfp && (PL_rsfp != fp))
7757         PerlIO_close(PL_rsfp);
7758     PL_rsfp = fp;
7759 }
7760
7761 #ifndef PERL_NO_UTF16_FILTER
7762 static I32
7763 utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
7764 {
7765     I32 count = FILTER_READ(idx+1, sv, maxlen);
7766     if (count) {
7767         U8* tmps;
7768         U8* tend;
7769         I32 newlen;
7770         New(898, tmps, SvCUR(sv) * 3 / 2 + 1, U8);
7771         if (!*SvPV_nolen(sv))
7772         /* Game over, but don't feed an odd-length string to utf16_to_utf8 */
7773         return count;
7774
7775         tend = utf16_to_utf8((U8*)SvPVX(sv), tmps, SvCUR(sv), &newlen);
7776         sv_usepvn(sv, (char*)tmps, tend - tmps);
7777     }
7778     return count;
7779 }
7780
7781 static I32
7782 utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen)
7783 {
7784     I32 count = FILTER_READ(idx+1, sv, maxlen);
7785     if (count) {
7786         U8* tmps;
7787         U8* tend;
7788         I32 newlen;
7789         if (!*SvPV_nolen(sv))
7790         /* Game over, but don't feed an odd-length string to utf16_to_utf8 */
7791         return count;
7792
7793         New(898, tmps, SvCUR(sv) * 3 / 2 + 1, U8);
7794         tend = utf16_to_utf8_reversed((U8*)SvPVX(sv), tmps, SvCUR(sv), &newlen);
7795         sv_usepvn(sv, (char*)tmps, tend - tmps);
7796     }
7797     return count;
7798 }
7799 #endif
7800