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