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