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