source: trunk/third/perl/toke.c @ 14545

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