This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Use PerlMemShared for CopSTASHPV and CopFILE. MUCH harder than it sounds!
[perl5.git] / toke.c
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
28 static char ident_too_long[] = "Identifier too long";
29
30 static void restore_rsfp(pTHX_ void *f);
31 #ifndef PERL_NO_UTF16_FILTER
32 static I32 utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen);
33 static I32 utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen);
34 #endif
35
36 #define XFAKEBRACK 128
37 #define XENUMMASK 127
38
39 #ifdef USE_UTF8_SCRIPTS
40 #   define UTF (!IN_BYTES)
41 #else
42 #   ifdef EBCDIC /* For now 'use utf8' does not affect tokenizer on EBCDIC */
43 #       define UTF (PL_linestr && DO_UTF8(PL_linestr))
44 #   else
45 #       define UTF ((PL_linestr && DO_UTF8(PL_linestr)) || (PL_hints & HINT_UTF8))
46 #   endif
47 #endif
48
49 /* In variables named $^X, these are the legal values for X.
50  * 1999-02-27 mjd-perl-patch@plover.com */
51 #define isCONTROLVAR(x) (isUPPER(x) || strchr("[\\]^_?", (x)))
52
53 /* On MacOS, respect nonbreaking spaces */
54 #ifdef MACOS_TRADITIONAL
55 #define SPACE_OR_TAB(c) ((c)==' '||(c)=='\312'||(c)=='\t')
56 #else
57 #define SPACE_OR_TAB(c) ((c)==' '||(c)=='\t')
58 #endif
59
60 /* LEX_* are values for PL_lex_state, the state of the lexer.
61  * They are arranged oddly so that the guard on the switch statement
62  * can get by with a single comparison (if the compiler is smart enough).
63  */
64
65 /* #define LEX_NOTPARSING               11 is done in perl.h. */
66
67 #define LEX_NORMAL              10
68 #define LEX_INTERPNORMAL         9
69 #define LEX_INTERPCASEMOD        8
70 #define LEX_INTERPPUSH           7
71 #define LEX_INTERPSTART          6
72 #define LEX_INTERPEND            5
73 #define LEX_INTERPENDMAYBE       4
74 #define LEX_INTERPCONCAT         3
75 #define LEX_INTERPCONST          2
76 #define LEX_FORMLINE             1
77 #define LEX_KNOWNEXT             0
78
79 #ifdef ff_next
80 #undef ff_next
81 #endif
82
83 #ifdef USE_PURE_BISON
84 #  ifndef YYMAXLEVEL
85 #    define YYMAXLEVEL 100
86 #  endif
87 YYSTYPE* yylval_pointer[YYMAXLEVEL];
88 int* yychar_pointer[YYMAXLEVEL];
89 int yyactlevel = -1;
90 #  undef yylval
91 #  undef yychar
92 #  define yylval (*yylval_pointer[yyactlevel])
93 #  define yychar (*yychar_pointer[yyactlevel])
94 #  define PERL_YYLEX_PARAM yylval_pointer[yyactlevel],yychar_pointer[yyactlevel]
95 #  undef yylex
96 #  define yylex()      Perl_yylex_r(aTHX_ yylval_pointer[yyactlevel],yychar_pointer[yyactlevel])
97 #endif
98
99 #include "keywords.h"
100
101 /* CLINE is a macro that ensures PL_copline has a sane value */
102
103 #ifdef CLINE
104 #undef CLINE
105 #endif
106 #define CLINE (PL_copline = (CopLINE(PL_curcop) < PL_copline ? CopLINE(PL_curcop) : PL_copline))
107
108 /*
109  * Convenience functions to return different tokens and prime the
110  * lexer for the next token.  They all take an argument.
111  *
112  * TOKEN        : generic token (used for '(', DOLSHARP, etc)
113  * OPERATOR     : generic operator
114  * AOPERATOR    : assignment operator
115  * PREBLOCK     : beginning the block after an if, while, foreach, ...
116  * PRETERMBLOCK : beginning a non-code-defining {} block (eg, hash ref)
117  * PREREF       : *EXPR where EXPR is not a simple identifier
118  * TERM         : expression term
119  * LOOPX        : loop exiting command (goto, last, dump, etc)
120  * FTST         : file test operator
121  * FUN0         : zero-argument function
122  * FUN1         : not used, except for not, which isn't a UNIOP
123  * BOop         : bitwise or or xor
124  * BAop         : bitwise and
125  * SHop         : shift operator
126  * PWop         : power operator
127  * PMop         : pattern-matching operator
128  * Aop          : addition-level operator
129  * Mop          : multiplication-level operator
130  * Eop          : equality-testing operator
131  * Rop          : relational operator <= != gt
132  *
133  * Also see LOP and lop() below.
134  */
135
136 /* Note that REPORT() and REPORT2() will be expressions that supply
137  * their own trailing comma, not suitable for statements as such. */
138 #ifdef DEBUGGING /* Serve -DT. */
139 #   define REPORT(x,retval) tokereport(x,s,(int)retval),
140 #   define REPORT2(x,retval) tokereport(x,s, yylval.ival),
141 #else
142 #   define REPORT(x,retval)
143 #   define REPORT2(x,retval)
144 #endif
145
146 #define TOKEN(retval) return (REPORT2("token",retval) PL_bufptr = s,(int)retval)
147 #define OPERATOR(retval) return (REPORT2("operator",retval) PL_expect = XTERM, PL_bufptr = s,(int)retval)
148 #define AOPERATOR(retval) return ao((REPORT2("aop",retval) PL_expect = XTERM, PL_bufptr = s,(int)retval))
149 #define PREBLOCK(retval) return (REPORT2("preblock",retval) PL_expect = XBLOCK,PL_bufptr = s,(int)retval)
150 #define PRETERMBLOCK(retval) return (REPORT2("pretermblock",retval) PL_expect = XTERMBLOCK,PL_bufptr = s,(int)retval)
151 #define PREREF(retval) return (REPORT2("preref",retval) PL_expect = XREF,PL_bufptr = s,(int)retval)
152 #define TERM(retval) return (CLINE, REPORT2("term",retval) PL_expect = XOPERATOR, PL_bufptr = s,(int)retval)
153 #define LOOPX(f) return(yylval.ival=f, REPORT("loopx",f) PL_expect = XTERM,PL_bufptr = s,(int)LOOPEX)
154 #define FTST(f) return(yylval.ival=f, REPORT("ftst",f) PL_expect = XTERM,PL_bufptr = s,(int)UNIOP)
155 #define FUN0(f) return(yylval.ival = f, REPORT("fun0",f) PL_expect = XOPERATOR,PL_bufptr = s,(int)FUNC0)
156 #define FUN1(f) return(yylval.ival = f, REPORT("fun1",f) PL_expect = XOPERATOR,PL_bufptr = s,(int)FUNC1)
157 #define BOop(f) return ao((yylval.ival=f, REPORT("bitorop",f) PL_expect = XTERM,PL_bufptr = s,(int)BITOROP))
158 #define BAop(f) return ao((yylval.ival=f, REPORT("bitandop",f) PL_expect = XTERM,PL_bufptr = s,(int)BITANDOP))
159 #define SHop(f) return ao((yylval.ival=f, REPORT("shiftop",f) PL_expect = XTERM,PL_bufptr = s,(int)SHIFTOP))
160 #define PWop(f) return ao((yylval.ival=f, REPORT("powop",f) PL_expect = XTERM,PL_bufptr = s,(int)POWOP))
161 #define PMop(f) return(yylval.ival=f, REPORT("matchop",f) PL_expect = XTERM,PL_bufptr = s,(int)MATCHOP)
162 #define Aop(f) return ao((yylval.ival=f, REPORT("add",f) PL_expect = XTERM,PL_bufptr = s,(int)ADDOP))
163 #define Mop(f) return ao((yylval.ival=f, REPORT("mul",f) PL_expect = XTERM,PL_bufptr = s,(int)MULOP))
164 #define Eop(f) return(yylval.ival=f, REPORT("eq",f) PL_expect = XTERM,PL_bufptr = s,(int)EQOP)
165 #define Rop(f) return(yylval.ival=f, REPORT("rel",f) PL_expect = XTERM,PL_bufptr = s,(int)RELOP)
166
167 /* This bit of chicanery makes a unary function followed by
168  * a parenthesis into a function with one argument, highest precedence.
169  */
170 #define UNI(f) return(yylval.ival = f, \
171         REPORT("uni",f) \
172         PL_expect = XTERM, \
173         PL_bufptr = s, \
174         PL_last_uni = PL_oldbufptr, \
175         PL_last_lop_op = f, \
176         (*s == '(' || (s = skipspace(s), *s == '(') ? (int)FUNC1 : (int)UNIOP) )
177
178 #define UNIBRACK(f) return(yylval.ival = f, \
179         REPORT("uni",f) \
180         PL_bufptr = s, \
181         PL_last_uni = PL_oldbufptr, \
182         (*s == '(' || (s = skipspace(s), *s == '(') ? (int)FUNC1 : (int)UNIOP) )
183
184 /* grandfather return to old style */
185 #define OLDLOP(f) return(yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)LSTOP)
186
187 #ifdef DEBUGGING
188
189 STATIC void
190 S_tokereport(pTHX_ char *thing, char* s, I32 rv)
191 {
192     DEBUG_T({
193         SV* report = newSVpv(thing, 0);
194         Perl_sv_catpvf(aTHX_ report, ":line %d:%"IVdf":", CopLINE(PL_curcop),
195                 (IV)rv);
196
197         if (s - PL_bufptr > 0)
198             sv_catpvn(report, PL_bufptr, s - PL_bufptr);
199         else {
200             if (PL_oldbufptr && *PL_oldbufptr)
201                 sv_catpv(report, PL_tokenbuf);
202         }
203         PerlIO_printf(Perl_debug_log, "### %s\n", SvPV_nolen(report));
204     });
205 }
206
207 #endif
208
209 /*
210  * S_ao
211  *
212  * This subroutine detects &&= and ||= and turns an ANDAND or OROR
213  * into an OP_ANDASSIGN or OP_ORASSIGN
214  */
215
216 STATIC int
217 S_ao(pTHX_ int toketype)
218 {
219     if (*PL_bufptr == '=') {
220         PL_bufptr++;
221         if (toketype == ANDAND)
222             yylval.ival = OP_ANDASSIGN;
223         else if (toketype == OROR)
224             yylval.ival = OP_ORASSIGN;
225         toketype = ASSIGNOP;
226     }
227     return toketype;
228 }
229
230 /*
231  * S_no_op
232  * When Perl expects an operator and finds something else, no_op
233  * prints the warning.  It always prints "<something> found where
234  * operator expected.  It prints "Missing semicolon on previous line?"
235  * if the surprise occurs at the start of the line.  "do you need to
236  * predeclare ..." is printed out for code like "sub bar; foo bar $x"
237  * where the compiler doesn't know if foo is a method call or a function.
238  * It prints "Missing operator before end of line" if there's nothing
239  * after the missing operator, or "... before <...>" if there is something
240  * after the missing operator.
241  */
242
243 STATIC void
244 S_no_op(pTHX_ char *what, char *s)
245 {
246     char *oldbp = PL_bufptr;
247     bool is_first = (PL_oldbufptr == PL_linestart);
248
249     if (!s)
250         s = oldbp;
251     else
252         PL_bufptr = s;
253     yywarn(Perl_form(aTHX_ "%s found where operator expected", what));
254     if (is_first)
255         Perl_warn(aTHX_ "\t(Missing semicolon on previous line?)\n");
256     else if (PL_oldoldbufptr && isIDFIRST_lazy_if(PL_oldoldbufptr,UTF)) {
257         char *t;
258         for (t = PL_oldoldbufptr; *t && (isALNUM_lazy_if(t,UTF) || *t == ':'); t++) ;
259         if (t < PL_bufptr && isSPACE(*t))
260             Perl_warn(aTHX_ "\t(Do you need to predeclare %.*s?)\n",
261                 t - PL_oldoldbufptr, PL_oldoldbufptr);
262     }
263     else {
264         assert(s >= oldbp);
265         Perl_warn(aTHX_ "\t(Missing operator before %.*s?)\n", s - oldbp, oldbp);
266     }
267     PL_bufptr = oldbp;
268 }
269
270 /*
271  * S_missingterm
272  * Complain about missing quote/regexp/heredoc terminator.
273  * If it's called with (char *)NULL then it cauterizes the line buffer.
274  * If we're in a delimited string and the delimiter is a control
275  * character, it's reformatted into a two-char sequence like ^C.
276  * This is fatal.
277  */
278
279 STATIC void
280 S_missingterm(pTHX_ char *s)
281 {
282     char tmpbuf[3];
283     char q;
284     if (s) {
285         char *nl = strrchr(s,'\n');
286         if (nl)
287             *nl = '\0';
288     }
289     else if (
290 #ifdef EBCDIC
291         iscntrl(PL_multi_close)
292 #else
293         PL_multi_close < 32 || PL_multi_close == 127
294 #endif
295         ) {
296         *tmpbuf = '^';
297         tmpbuf[1] = toCTRL(PL_multi_close);
298         s = "\\n";
299         tmpbuf[2] = '\0';
300         s = tmpbuf;
301     }
302     else {
303         *tmpbuf = PL_multi_close;
304         tmpbuf[1] = '\0';
305         s = tmpbuf;
306     }
307     q = strchr(s,'"') ? '\'' : '"';
308     Perl_croak(aTHX_ "Can't find string terminator %c%s%c anywhere before EOF",q,s,q);
309 }
310
311 /*
312  * Perl_deprecate
313  */
314
315 void
316 Perl_deprecate(pTHX_ char *s)
317 {
318     if (ckWARN(WARN_DEPRECATED))
319         Perl_warner(aTHX_ WARN_DEPRECATED, "Use of %s is deprecated", s);
320 }
321
322 /*
323  * depcom
324  * Deprecate a comma-less variable list.
325  */
326
327 STATIC void
328 S_depcom(pTHX)
329 {
330     deprecate("comma-less variable list");
331 }
332
333 /*
334  * experimental text filters for win32 carriage-returns, utf16-to-utf8 and
335  * utf16-to-utf8-reversed.
336  */
337
338 #ifdef PERL_CR_FILTER
339 static void
340 strip_return(SV *sv)
341 {
342     register char *s = SvPVX(sv);
343     register char *e = s + SvCUR(sv);
344     /* outer loop optimized to do nothing if there are no CR-LFs */
345     while (s < e) {
346         if (*s++ == '\r' && *s == '\n') {
347             /* hit a CR-LF, need to copy the rest */
348             register char *d = s - 1;
349             *d++ = *s++;
350             while (s < e) {
351                 if (*s == '\r' && s[1] == '\n')
352                     s++;
353                 *d++ = *s++;
354             }
355             SvCUR(sv) -= s - d;
356             return;
357         }
358     }
359 }
360
361 STATIC I32
362 S_cr_textfilter(pTHX_ int idx, SV *sv, int maxlen)
363 {
364     I32 count = FILTER_READ(idx+1, sv, maxlen);
365     if (count > 0 && !maxlen)
366         strip_return(sv);
367     return count;
368 }
369 #endif
370
371 /*
372  * Perl_lex_start
373  * Initialize variables.  Uses the Perl save_stack to save its state (for
374  * recursive calls to the parser).
375  */
376
377 void
378 Perl_lex_start(pTHX_ SV *line)
379 {
380     char *s;
381     STRLEN len;
382
383     SAVEI32(PL_lex_dojoin);
384     SAVEI32(PL_lex_brackets);
385     SAVEI32(PL_lex_casemods);
386     SAVEI32(PL_lex_starts);
387     SAVEI32(PL_lex_state);
388     SAVEVPTR(PL_lex_inpat);
389     SAVEI32(PL_lex_inwhat);
390     if (PL_lex_state == LEX_KNOWNEXT) {
391         I32 toke = PL_nexttoke;
392         while (--toke >= 0) {
393             SAVEI32(PL_nexttype[toke]);
394             SAVEVPTR(PL_nextval[toke]);
395         }
396         SAVEI32(PL_nexttoke);
397     }
398     SAVECOPLINE(PL_curcop);
399     SAVEPPTR(PL_bufptr);
400     SAVEPPTR(PL_bufend);
401     SAVEPPTR(PL_oldbufptr);
402     SAVEPPTR(PL_oldoldbufptr);
403     SAVEPPTR(PL_last_lop);
404     SAVEPPTR(PL_last_uni);
405     SAVEPPTR(PL_linestart);
406     SAVESPTR(PL_linestr);
407     SAVEPPTR(PL_lex_brackstack);
408     SAVEPPTR(PL_lex_casestack);
409     SAVEDESTRUCTOR_X(restore_rsfp, PL_rsfp);
410     SAVESPTR(PL_lex_stuff);
411     SAVEI32(PL_lex_defer);
412     SAVEI32(PL_sublex_info.sub_inwhat);
413     SAVESPTR(PL_lex_repl);
414     SAVEINT(PL_expect);
415     SAVEINT(PL_lex_expect);
416
417     PL_lex_state = LEX_NORMAL;
418     PL_lex_defer = 0;
419     PL_expect = XSTATE;
420     PL_lex_brackets = 0;
421     New(899, PL_lex_brackstack, 120, char);
422     New(899, PL_lex_casestack, 12, char);
423     SAVEFREEPV(PL_lex_brackstack);
424     SAVEFREEPV(PL_lex_casestack);
425     PL_lex_casemods = 0;
426     *PL_lex_casestack = '\0';
427     PL_lex_dojoin = 0;
428     PL_lex_starts = 0;
429     PL_lex_stuff = Nullsv;
430     PL_lex_repl = Nullsv;
431     PL_lex_inpat = 0;
432     PL_nexttoke = 0;
433     PL_lex_inwhat = 0;
434     PL_sublex_info.sub_inwhat = 0;
435     PL_linestr = line;
436     if (SvREADONLY(PL_linestr))
437         PL_linestr = sv_2mortal(newSVsv(PL_linestr));
438     s = SvPV(PL_linestr, len);
439     if (len && s[len-1] != ';') {
440         if (!(SvFLAGS(PL_linestr) & SVs_TEMP))
441             PL_linestr = sv_2mortal(newSVsv(PL_linestr));
442         sv_catpvn(PL_linestr, "\n;", 2);
443     }
444     SvTEMP_off(PL_linestr);
445     PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
446     PL_bufend = PL_bufptr + SvCUR(PL_linestr);
447     PL_last_lop = PL_last_uni = Nullch;
448     PL_rsfp = 0;
449 }
450
451 /*
452  * Perl_lex_end
453  * Finalizer for lexing operations.  Must be called when the parser is
454  * done with the lexer.
455  */
456
457 void
458 Perl_lex_end(pTHX)
459 {
460     PL_doextract = FALSE;
461 }
462
463 /*
464  * S_incline
465  * This subroutine has nothing to do with tilting, whether at windmills
466  * or pinball tables.  Its name is short for "increment line".  It
467  * increments the current line number in CopLINE(PL_curcop) and checks
468  * to see whether the line starts with a comment of the form
469  *    # line 500 "foo.pm"
470  * If so, it sets the current line number and file to the values in the comment.
471  */
472
473 STATIC void
474 S_incline(pTHX_ char *s)
475 {
476     char *t;
477     char *n;
478     char *e;
479     char ch;
480
481     CopLINE_inc(PL_curcop);
482     if (*s++ != '#')
483         return;
484     while (SPACE_OR_TAB(*s)) s++;
485     if (strnEQ(s, "line", 4))
486         s += 4;
487     else
488         return;
489     if (SPACE_OR_TAB(*s))
490         s++;
491     else
492         return;
493     while (SPACE_OR_TAB(*s)) s++;
494     if (!isDIGIT(*s))
495         return;
496     n = s;
497     while (isDIGIT(*s))
498         s++;
499     while (SPACE_OR_TAB(*s))
500         s++;
501     if (*s == '"' && (t = strchr(s+1, '"'))) {
502         s++;
503         e = t + 1;
504     }
505     else {
506         for (t = s; !isSPACE(*t); t++) ;
507         e = t;
508     }
509     while (SPACE_OR_TAB(*e) || *e == '\r' || *e == '\f')
510         e++;
511     if (*e != '\n' && *e != '\0')
512         return;         /* false alarm */
513
514     ch = *t;
515     *t = '\0';
516     if (t - s > 0) {
517         CopFILE_free(PL_curcop);
518         CopFILE_set(PL_curcop, s);
519     }
520     *t = ch;
521     CopLINE_set(PL_curcop, atoi(n)-1);
522 }
523
524 /*
525  * S_skipspace
526  * Called to gobble the appropriate amount and type of whitespace.
527  * Skips comments as well.
528  */
529
530 STATIC char *
531 S_skipspace(pTHX_ register char *s)
532 {
533     if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
534         while (s < PL_bufend && SPACE_OR_TAB(*s))
535             s++;
536         return s;
537     }
538     for (;;) {
539         STRLEN prevlen;
540         SSize_t oldprevlen, oldoldprevlen;
541         SSize_t oldloplen = 0, oldunilen = 0;
542         while (s < PL_bufend && isSPACE(*s)) {
543             if (*s++ == '\n' && PL_in_eval && !PL_rsfp)
544                 incline(s);
545         }
546
547         /* comment */
548         if (s < PL_bufend && *s == '#') {
549             while (s < PL_bufend && *s != '\n')
550                 s++;
551             if (s < PL_bufend) {
552                 s++;
553                 if (PL_in_eval && !PL_rsfp) {
554                     incline(s);
555                     continue;
556                 }
557             }
558         }
559
560         /* only continue to recharge the buffer if we're at the end
561          * of the buffer, we're not reading from a source filter, and
562          * we're in normal lexing mode
563          */
564         if (s < PL_bufend || !PL_rsfp || PL_sublex_info.sub_inwhat ||
565                 PL_lex_state == LEX_FORMLINE)
566             return s;
567
568         /* try to recharge the buffer */
569         if ((s = filter_gets(PL_linestr, PL_rsfp,
570                              (prevlen = SvCUR(PL_linestr)))) == Nullch)
571         {
572             /* end of file.  Add on the -p or -n magic */
573             if (PL_minus_n || PL_minus_p) {
574                 sv_setpv(PL_linestr,PL_minus_p ?
575                          ";}continue{print or die qq(-p destination: $!\\n)" :
576                          "");
577                 sv_catpv(PL_linestr,";}");
578                 PL_minus_n = PL_minus_p = 0;
579             }
580             else
581                 sv_setpv(PL_linestr,";");
582
583             /* reset variables for next time we lex */
584             PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart
585                 = SvPVX(PL_linestr);
586             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
587             PL_last_lop = PL_last_uni = Nullch;
588
589             /* Close the filehandle.  Could be from -P preprocessor,
590              * STDIN, or a regular file.  If we were reading code from
591              * STDIN (because the commandline held no -e or filename)
592              * then we don't close it, we reset it so the code can
593              * read from STDIN too.
594              */
595
596             if (PL_preprocess && !PL_in_eval)
597                 (void)PerlProc_pclose(PL_rsfp);
598             else if ((PerlIO*)PL_rsfp == PerlIO_stdin())
599                 PerlIO_clearerr(PL_rsfp);
600             else
601                 (void)PerlIO_close(PL_rsfp);
602             PL_rsfp = Nullfp;
603             return s;
604         }
605
606         /* not at end of file, so we only read another line */
607         /* make corresponding updates to old pointers, for yyerror() */
608         oldprevlen = PL_oldbufptr - PL_bufend;
609         oldoldprevlen = PL_oldoldbufptr - PL_bufend;
610         if (PL_last_uni)
611             oldunilen = PL_last_uni - PL_bufend;
612         if (PL_last_lop)
613             oldloplen = PL_last_lop - PL_bufend;
614         PL_linestart = PL_bufptr = s + prevlen;
615         PL_bufend = s + SvCUR(PL_linestr);
616         s = PL_bufptr;
617         PL_oldbufptr = s + oldprevlen;
618         PL_oldoldbufptr = s + oldoldprevlen;
619         if (PL_last_uni)
620             PL_last_uni = s + oldunilen;
621         if (PL_last_lop)
622             PL_last_lop = s + oldloplen;
623         incline(s);
624
625         /* debugger active and we're not compiling the debugger code,
626          * so store the line into the debugger's array of lines
627          */
628         if (PERLDB_LINE && PL_curstash != PL_debstash) {
629             SV *sv = NEWSV(85,0);
630
631             sv_upgrade(sv, SVt_PVMG);
632             sv_setpvn(sv,PL_bufptr,PL_bufend-PL_bufptr);
633             (void)SvIOK_on(sv);
634             SvIVX(sv) = 0;
635             av_store(CopFILEAV(PL_curcop),(I32)CopLINE(PL_curcop),sv);
636         }
637     }
638 }
639
640 /*
641  * S_check_uni
642  * Check the unary operators to ensure there's no ambiguity in how they're
643  * used.  An ambiguous piece of code would be:
644  *     rand + 5
645  * This doesn't mean rand() + 5.  Because rand() is a unary operator,
646  * the +5 is its argument.
647  */
648
649 STATIC void
650 S_check_uni(pTHX)
651 {
652     char *s;
653     char *t;
654
655     if (PL_oldoldbufptr != PL_last_uni)
656         return;
657     while (isSPACE(*PL_last_uni))
658         PL_last_uni++;
659     for (s = PL_last_uni; isALNUM_lazy_if(s,UTF) || *s == '-'; s++) ;
660     if ((t = strchr(s, '(')) && t < PL_bufptr)
661         return;
662     if (ckWARN_d(WARN_AMBIGUOUS)){
663         char ch = *s;
664         *s = '\0';
665         Perl_warner(aTHX_ WARN_AMBIGUOUS,
666                    "Warning: Use of \"%s\" without parens is ambiguous",
667                    PL_last_uni);
668         *s = ch;
669     }
670 }
671
672 /* workaround to replace the UNI() macro with a function.  Only the
673  * hints/uts.sh file mentions this.  Other comments elsewhere in the
674  * source indicate Microport Unix might need it too.
675  */
676
677 #ifdef CRIPPLED_CC
678
679 #undef UNI
680 #define UNI(f) return uni(f,s)
681
682 STATIC int
683 S_uni(pTHX_ I32 f, char *s)
684 {
685     yylval.ival = f;
686     PL_expect = XTERM;
687     PL_bufptr = s;
688     PL_last_uni = PL_oldbufptr;
689     PL_last_lop_op = f;
690     if (*s == '(')
691         return FUNC1;
692     s = skipspace(s);
693     if (*s == '(')
694         return FUNC1;
695     else
696         return UNIOP;
697 }
698
699 #endif /* CRIPPLED_CC */
700
701 /*
702  * LOP : macro to build a list operator.  Its behaviour has been replaced
703  * with a subroutine, S_lop() for which LOP is just another name.
704  */
705
706 #define LOP(f,x) return lop(f,x,s)
707
708 /*
709  * S_lop
710  * Build a list operator (or something that might be one).  The rules:
711  *  - if we have a next token, then it's a list operator [why?]
712  *  - if the next thing is an opening paren, then it's a function
713  *  - else it's a list operator
714  */
715
716 STATIC I32
717 S_lop(pTHX_ I32 f, int x, char *s)
718 {
719     yylval.ival = f;
720     CLINE;
721     REPORT("lop", f)
722     PL_expect = x;
723     PL_bufptr = s;
724     PL_last_lop = PL_oldbufptr;
725     PL_last_lop_op = f;
726     if (PL_nexttoke)
727         return LSTOP;
728     if (*s == '(')
729         return FUNC;
730     s = skipspace(s);
731     if (*s == '(')
732         return FUNC;
733     else
734         return LSTOP;
735 }
736
737 /*
738  * S_force_next
739  * When the lexer realizes it knows the next token (for instance,
740  * it is reordering tokens for the parser) then it can call S_force_next
741  * to know what token to return the next time the lexer is called.  Caller
742  * will need to set PL_nextval[], and possibly PL_expect to ensure the lexer
743  * handles the token correctly.
744  */
745
746 STATIC void
747 S_force_next(pTHX_ I32 type)
748 {
749     PL_nexttype[PL_nexttoke] = type;
750     PL_nexttoke++;
751     if (PL_lex_state != LEX_KNOWNEXT) {
752         PL_lex_defer = PL_lex_state;
753         PL_lex_expect = PL_expect;
754         PL_lex_state = LEX_KNOWNEXT;
755     }
756 }
757
758 /*
759  * S_force_word
760  * When the lexer knows the next thing is a word (for instance, it has
761  * just seen -> and it knows that the next char is a word char, then
762  * it calls S_force_word to stick the next word into the PL_next lookahead.
763  *
764  * Arguments:
765  *   char *start : buffer position (must be within PL_linestr)
766  *   int token   : PL_next will be this type of bare word (e.g., METHOD,WORD)
767  *   int check_keyword : if true, Perl checks to make sure the word isn't
768  *       a keyword (do this if the word is a label, e.g. goto FOO)
769  *   int allow_pack : if true, : characters will also be allowed (require,
770  *       use, etc. do this)
771  *   int allow_initial_tick : used by the "sub" lexer only.
772  */
773
774 STATIC char *
775 S_force_word(pTHX_ register char *start, int token, int check_keyword, int allow_pack, int allow_initial_tick)
776 {
777     register char *s;
778     STRLEN len;
779
780     start = skipspace(start);
781     s = start;
782     if (isIDFIRST_lazy_if(s,UTF) ||
783         (allow_pack && *s == ':') ||
784         (allow_initial_tick && *s == '\'') )
785     {
786         s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, allow_pack, &len);
787         if (check_keyword && keyword(PL_tokenbuf, len))
788             return start;
789         if (token == METHOD) {
790             s = skipspace(s);
791             if (*s == '(')
792                 PL_expect = XTERM;
793             else {
794                 PL_expect = XOPERATOR;
795             }
796         }
797         PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST,0, newSVpv(PL_tokenbuf,0));
798         PL_nextval[PL_nexttoke].opval->op_private |= OPpCONST_BARE;
799         force_next(token);
800     }
801     return s;
802 }
803
804 /*
805  * S_force_ident
806  * Called when the lexer wants $foo *foo &foo etc, but the program
807  * text only contains the "foo" portion.  The first argument is a pointer
808  * to the "foo", and the second argument is the type symbol to prefix.
809  * Forces the next token to be a "WORD".
810  * Creates the symbol if it didn't already exist (via gv_fetchpv()).
811  */
812
813 STATIC void
814 S_force_ident(pTHX_ register char *s, int kind)
815 {
816     if (s && *s) {
817         OP* o = (OP*)newSVOP(OP_CONST, 0, newSVpv(s,0));
818         PL_nextval[PL_nexttoke].opval = o;
819         force_next(WORD);
820         if (kind) {
821             o->op_private = OPpCONST_ENTERED;
822             /* XXX see note in pp_entereval() for why we forgo typo
823                warnings if the symbol must be introduced in an eval.
824                GSAR 96-10-12 */
825             gv_fetchpv(s, PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : TRUE,
826                 kind == '$' ? SVt_PV :
827                 kind == '@' ? SVt_PVAV :
828                 kind == '%' ? SVt_PVHV :
829                               SVt_PVGV
830                 );
831         }
832     }
833 }
834
835 NV
836 Perl_str_to_version(pTHX_ SV *sv)
837 {
838     NV retval = 0.0;
839     NV nshift = 1.0;
840     STRLEN len;
841     char *start = SvPVx(sv,len);
842     bool utf = SvUTF8(sv) ? TRUE : FALSE;
843     char *end = start + len;
844     while (start < end) {
845         STRLEN skip;
846         UV n;
847         if (utf)
848             n = utf8n_to_uvchr((U8*)start, len, &skip, 0);
849         else {
850             n = *(U8*)start;
851             skip = 1;
852         }
853         retval += ((NV)n)/nshift;
854         start += skip;
855         nshift *= 1000;
856     }
857     return retval;
858 }
859
860 /*
861  * S_force_version
862  * Forces the next token to be a version number.
863  * If the next token appears to be an invalid version number, (e.g. "v2b"),
864  * and if "guessing" is TRUE, then no new token is created (and the caller
865  * must use an alternative parsing method).
866  */
867
868 STATIC char *
869 S_force_version(pTHX_ char *s, int guessing)
870 {
871     OP *version = Nullop;
872     char *d;
873
874     s = skipspace(s);
875
876     d = s;
877     if (*d == 'v')
878         d++;
879     if (isDIGIT(*d)) {
880         while (isDIGIT(*d) || *d == '_' || *d == '.')
881             d++;
882         if (*d == ';' || isSPACE(*d) || *d == '}' || !*d) {
883             SV *ver;
884             s = scan_num(s, &yylval);
885             version = yylval.opval;
886             ver = cSVOPx(version)->op_sv;
887             if (SvPOK(ver) && !SvNIOK(ver)) {
888                 (void)SvUPGRADE(ver, SVt_PVNV);
889                 SvNVX(ver) = str_to_version(ver);
890                 SvNOK_on(ver);          /* hint that it is a version */
891             }
892         }
893         else if (guessing)
894             return s;
895     }
896
897     /* NOTE: The parser sees the package name and the VERSION swapped */
898     PL_nextval[PL_nexttoke].opval = version;
899     force_next(WORD);
900
901     return s;
902 }
903
904 /*
905  * S_tokeq
906  * Tokenize a quoted string passed in as an SV.  It finds the next
907  * chunk, up to end of string or a backslash.  It may make a new
908  * SV containing that chunk (if HINT_NEW_STRING is on).  It also
909  * turns \\ into \.
910  */
911
912 STATIC SV *
913 S_tokeq(pTHX_ SV *sv)
914 {
915     register char *s;
916     register char *send;
917     register char *d;
918     STRLEN len = 0;
919     SV *pv = sv;
920
921     if (!SvLEN(sv))
922         goto finish;
923
924     s = SvPV_force(sv, len);
925     if (SvTYPE(sv) >= SVt_PVIV && SvIVX(sv) == -1)
926         goto finish;
927     send = s + len;
928     while (s < send && *s != '\\')
929         s++;
930     if (s == send)
931         goto finish;
932     d = s;
933     if ( PL_hints & HINT_NEW_STRING ) {
934         pv = sv_2mortal(newSVpvn(SvPVX(pv), len));
935         if (SvUTF8(sv))
936             SvUTF8_on(pv);
937     }
938     while (s < send) {
939         if (*s == '\\') {
940             if (s + 1 < send && (s[1] == '\\'))
941                 s++;            /* all that, just for this */
942         }
943         *d++ = *s++;
944     }
945     *d = '\0';
946     SvCUR_set(sv, d - SvPVX(sv));
947   finish:
948     if ( PL_hints & HINT_NEW_STRING )
949        return new_constant(NULL, 0, "q", sv, pv, "q");
950     return sv;
951 }
952
953 /*
954  * Now come three functions related to double-quote context,
955  * S_sublex_start, S_sublex_push, and S_sublex_done.  They're used when
956  * converting things like "\u\Lgnat" into ucfirst(lc("gnat")).  They
957  * interact with PL_lex_state, and create fake ( ... ) argument lists
958  * to handle functions and concatenation.
959  * They assume that whoever calls them will be setting up a fake
960  * join call, because each subthing puts a ',' after it.  This lets
961  *   "lower \luPpEr"
962  * become
963  *  join($, , 'lower ', lcfirst( 'uPpEr', ) ,)
964  *
965  * (I'm not sure whether the spurious commas at the end of lcfirst's
966  * arguments and join's arguments are created or not).
967  */
968
969 /*
970  * S_sublex_start
971  * Assumes that yylval.ival is the op we're creating (e.g. OP_LCFIRST).
972  *
973  * Pattern matching will set PL_lex_op to the pattern-matching op to
974  * make (we return THING if yylval.ival is OP_NULL, PMFUNC otherwise).
975  *
976  * OP_CONST and OP_READLINE are easy--just make the new op and return.
977  *
978  * Everything else becomes a FUNC.
979  *
980  * Sets PL_lex_state to LEX_INTERPPUSH unless (ival was OP_NULL or we
981  * had an OP_CONST or OP_READLINE).  This just sets us up for a
982  * call to S_sublex_push().
983  */
984
985 STATIC I32
986 S_sublex_start(pTHX)
987 {
988     register I32 op_type = yylval.ival;
989
990     if (op_type == OP_NULL) {
991         yylval.opval = PL_lex_op;
992         PL_lex_op = Nullop;
993         return THING;
994     }
995     if (op_type == OP_CONST || op_type == OP_READLINE) {
996         SV *sv = tokeq(PL_lex_stuff);
997
998         if (SvTYPE(sv) == SVt_PVIV) {
999             /* Overloaded constants, nothing fancy: Convert to SVt_PV: */
1000             STRLEN len;
1001             char *p;
1002             SV *nsv;
1003
1004             p = SvPV(sv, len);
1005             nsv = newSVpvn(p, len);
1006             if (SvUTF8(sv))
1007                 SvUTF8_on(nsv);
1008             SvREFCNT_dec(sv);
1009             sv = nsv;
1010         }
1011         yylval.opval = (OP*)newSVOP(op_type, 0, sv);
1012         PL_lex_stuff = Nullsv;
1013         return THING;
1014     }
1015
1016     PL_sublex_info.super_state = PL_lex_state;
1017     PL_sublex_info.sub_inwhat = op_type;
1018     PL_sublex_info.sub_op = PL_lex_op;
1019     PL_lex_state = LEX_INTERPPUSH;
1020
1021     PL_expect = XTERM;
1022     if (PL_lex_op) {
1023         yylval.opval = PL_lex_op;
1024         PL_lex_op = Nullop;
1025         return PMFUNC;
1026     }
1027     else
1028         return FUNC;
1029 }
1030
1031 /*
1032  * S_sublex_push
1033  * Create a new scope to save the lexing state.  The scope will be
1034  * ended in S_sublex_done.  Returns a '(', starting the function arguments
1035  * to the uc, lc, etc. found before.
1036  * Sets PL_lex_state to LEX_INTERPCONCAT.
1037  */
1038
1039 STATIC I32
1040 S_sublex_push(pTHX)
1041 {
1042     ENTER;
1043
1044     PL_lex_state = PL_sublex_info.super_state;
1045     SAVEI32(PL_lex_dojoin);
1046     SAVEI32(PL_lex_brackets);
1047     SAVEI32(PL_lex_casemods);
1048     SAVEI32(PL_lex_starts);
1049     SAVEI32(PL_lex_state);
1050     SAVEVPTR(PL_lex_inpat);
1051     SAVEI32(PL_lex_inwhat);
1052     SAVECOPLINE(PL_curcop);
1053     SAVEPPTR(PL_bufptr);
1054     SAVEPPTR(PL_bufend);
1055     SAVEPPTR(PL_oldbufptr);
1056     SAVEPPTR(PL_oldoldbufptr);
1057     SAVEPPTR(PL_last_lop);
1058     SAVEPPTR(PL_last_uni);
1059     SAVEPPTR(PL_linestart);
1060     SAVESPTR(PL_linestr);
1061     SAVEPPTR(PL_lex_brackstack);
1062     SAVEPPTR(PL_lex_casestack);
1063
1064     PL_linestr = PL_lex_stuff;
1065     PL_lex_stuff = Nullsv;
1066
1067     PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart
1068         = SvPVX(PL_linestr);
1069     PL_bufend += SvCUR(PL_linestr);
1070     PL_last_lop = PL_last_uni = Nullch;
1071     SAVEFREESV(PL_linestr);
1072
1073     PL_lex_dojoin = FALSE;
1074     PL_lex_brackets = 0;
1075     New(899, PL_lex_brackstack, 120, char);
1076     New(899, PL_lex_casestack, 12, char);
1077     SAVEFREEPV(PL_lex_brackstack);
1078     SAVEFREEPV(PL_lex_casestack);
1079     PL_lex_casemods = 0;
1080     *PL_lex_casestack = '\0';
1081     PL_lex_starts = 0;
1082     PL_lex_state = LEX_INTERPCONCAT;
1083     CopLINE_set(PL_curcop, PL_multi_start);
1084
1085     PL_lex_inwhat = PL_sublex_info.sub_inwhat;
1086     if (PL_lex_inwhat == OP_MATCH || PL_lex_inwhat == OP_QR || PL_lex_inwhat == OP_SUBST)
1087         PL_lex_inpat = PL_sublex_info.sub_op;
1088     else
1089         PL_lex_inpat = Nullop;
1090
1091     return '(';
1092 }
1093
1094 /*
1095  * S_sublex_done
1096  * Restores lexer state after a S_sublex_push.
1097  */
1098
1099 STATIC I32
1100 S_sublex_done(pTHX)
1101 {
1102     if (!PL_lex_starts++) {
1103         SV *sv = newSVpvn("",0);
1104         if (SvUTF8(PL_linestr))
1105             SvUTF8_on(sv);
1106         PL_expect = XOPERATOR;
1107         yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
1108         return THING;
1109     }
1110
1111     if (PL_lex_casemods) {              /* oops, we've got some unbalanced parens */
1112         PL_lex_state = LEX_INTERPCASEMOD;
1113         return yylex();
1114     }
1115
1116     /* Is there a right-hand side to take care of? (s//RHS/ or tr//RHS/) */
1117     if (PL_lex_repl && (PL_lex_inwhat == OP_SUBST || PL_lex_inwhat == OP_TRANS)) {
1118         PL_linestr = PL_lex_repl;
1119         PL_lex_inpat = 0;
1120         PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
1121         PL_bufend += SvCUR(PL_linestr);
1122         PL_last_lop = PL_last_uni = Nullch;
1123         SAVEFREESV(PL_linestr);
1124         PL_lex_dojoin = FALSE;
1125         PL_lex_brackets = 0;
1126         PL_lex_casemods = 0;
1127         *PL_lex_casestack = '\0';
1128         PL_lex_starts = 0;
1129         if (SvEVALED(PL_lex_repl)) {
1130             PL_lex_state = LEX_INTERPNORMAL;
1131             PL_lex_starts++;
1132             /*  we don't clear PL_lex_repl here, so that we can check later
1133                 whether this is an evalled subst; that means we rely on the
1134                 logic to ensure sublex_done() is called again only via the
1135                 branch (in yylex()) that clears PL_lex_repl, else we'll loop */
1136         }
1137         else {
1138             PL_lex_state = LEX_INTERPCONCAT;
1139             PL_lex_repl = Nullsv;
1140         }
1141         return ',';
1142     }
1143     else {
1144         LEAVE;
1145         PL_bufend = SvPVX(PL_linestr);
1146         PL_bufend += SvCUR(PL_linestr);
1147         PL_expect = XOPERATOR;
1148         PL_sublex_info.sub_inwhat = 0;
1149         return ')';
1150     }
1151 }
1152
1153 /*
1154   scan_const
1155
1156   Extracts a pattern, double-quoted string, or transliteration.  This
1157   is terrifying code.
1158
1159   It looks at lex_inwhat and PL_lex_inpat to find out whether it's
1160   processing a pattern (PL_lex_inpat is true), a transliteration
1161   (lex_inwhat & OP_TRANS is true), or a double-quoted string.
1162
1163   Returns a pointer to the character scanned up to. Iff this is
1164   advanced from the start pointer supplied (ie if anything was
1165   successfully parsed), will leave an OP for the substring scanned
1166   in yylval. Caller must intuit reason for not parsing further
1167   by looking at the next characters herself.
1168
1169   In patterns:
1170     backslashes:
1171       double-quoted style: \r and \n
1172       regexp special ones: \D \s
1173       constants: \x3
1174       backrefs: \1 (deprecated in substitution replacements)
1175       case and quoting: \U \Q \E
1176     stops on @ and $, but not for $ as tail anchor
1177
1178   In transliterations:
1179     characters are VERY literal, except for - not at the start or end
1180     of the string, which indicates a range.  scan_const expands the
1181     range to the full set of intermediate characters.
1182
1183   In double-quoted strings:
1184     backslashes:
1185       double-quoted style: \r and \n
1186       constants: \x3
1187       backrefs: \1 (deprecated)
1188       case and quoting: \U \Q \E
1189     stops on @ and $
1190
1191   scan_const does *not* construct ops to handle interpolated strings.
1192   It stops processing as soon as it finds an embedded $ or @ variable
1193   and leaves it to the caller to work out what's going on.
1194
1195   @ in pattern could be: @foo, @{foo}, @$foo, @'foo, @:foo.
1196
1197   $ in pattern could be $foo or could be tail anchor.  Assumption:
1198   it's a tail anchor if $ is the last thing in the string, or if it's
1199   followed by one of ")| \n\t"
1200
1201   \1 (backreferences) are turned into $1
1202
1203   The structure of the code is
1204       while (there's a character to process) {
1205           handle transliteration ranges
1206           skip regexp comments
1207           skip # initiated comments in //x patterns
1208           check for embedded @foo
1209           check for embedded scalars
1210           if (backslash) {
1211               leave intact backslashes from leave (below)
1212               deprecate \1 in strings and sub replacements
1213               handle string-changing backslashes \l \U \Q \E, etc.
1214               switch (what was escaped) {
1215                   handle - in a transliteration (becomes a literal -)
1216                   handle \132 octal characters
1217                   handle 0x15 hex characters
1218                   handle \cV (control V)
1219                   handle printf backslashes (\f, \r, \n, etc)
1220               } (end switch)
1221           } (end if backslash)
1222     } (end while character to read)
1223                 
1224 */
1225
1226 STATIC char *
1227 S_scan_const(pTHX_ char *start)
1228 {
1229     register char *send = PL_bufend;            /* end of the constant */
1230     SV *sv = NEWSV(93, send - start);           /* sv for the constant */
1231     register char *s = start;                   /* start of the constant */
1232     register char *d = SvPVX(sv);               /* destination for copies */
1233     bool dorange = FALSE;                       /* are we in a translit range? */
1234     bool didrange = FALSE;                      /* did we just finish a range? */
1235     I32  has_utf8 = FALSE;                      /* Output constant is UTF8 */
1236     I32  this_utf8 = UTF;                       /* The source string is assumed to be UTF8 */
1237     UV uv;
1238
1239     const char *leaveit =       /* set of acceptably-backslashed characters */
1240         PL_lex_inpat
1241             ? "\\.^$@AGZdDwWsSbBpPXC+*?|()-nrtfeaxcz0123456789[{]} \t\n\r\f\v#"
1242             : "";
1243
1244     if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
1245         /* If we are doing a trans and we know we want UTF8 set expectation */
1246         has_utf8   = PL_sublex_info.sub_op->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF);
1247         this_utf8  = PL_sublex_info.sub_op->op_private & (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
1248     }
1249
1250
1251     while (s < send || dorange) {
1252         /* get transliterations out of the way (they're most literal) */
1253         if (PL_lex_inwhat == OP_TRANS) {
1254             /* expand a range A-Z to the full set of characters.  AIE! */
1255             if (dorange) {
1256                 I32 i;                          /* current expanded character */
1257                 I32 min;                        /* first character in range */
1258                 I32 max;                        /* last character in range */
1259
1260                 if (has_utf8) {
1261                     char *c = (char*)utf8_hop((U8*)d, -1);
1262                     char *e = d++;
1263                     while (e-- > c)
1264                         *(e + 1) = *e;
1265                     *c = (char)UTF_TO_NATIVE(0xff);
1266                     /* mark the range as done, and continue */
1267                     dorange = FALSE;
1268                     didrange = TRUE;
1269                     continue;
1270                 }
1271
1272                 i = d - SvPVX(sv);              /* remember current offset */
1273                 SvGROW(sv, SvLEN(sv) + 256);    /* never more than 256 chars in a range */
1274                 d = SvPVX(sv) + i;              /* refresh d after realloc */
1275                 d -= 2;                         /* eat the first char and the - */
1276
1277                 min = (U8)*d;                   /* first char in range */
1278                 max = (U8)d[1];                 /* last char in range  */
1279
1280                 if (min > max) {
1281                     Perl_croak(aTHX_
1282                                "Invalid [] range \"%c-%c\" in transliteration operator",
1283                                (char)min, (char)max);
1284                 }
1285
1286 #ifdef EBCDIC
1287                 if ((isLOWER(min) && isLOWER(max)) ||
1288                     (isUPPER(min) && isUPPER(max))) {
1289                     if (isLOWER(min)) {
1290                         for (i = min; i <= max; i++)
1291                             if (isLOWER(i))
1292                                 *d++ = NATIVE_TO_NEED(has_utf8,i);
1293                     } else {
1294                         for (i = min; i <= max; i++)
1295                             if (isUPPER(i))
1296                                 *d++ = NATIVE_TO_NEED(has_utf8,i);
1297                     }
1298                 }
1299                 else
1300 #endif
1301                     for (i = min; i <= max; i++)
1302                         *d++ = i;
1303
1304                 /* mark the range as done, and continue */
1305                 dorange = FALSE;
1306                 didrange = TRUE;
1307                 continue;
1308             }
1309
1310             /* range begins (ignore - as first or last char) */
1311             else if (*s == '-' && s+1 < send  && s != start) {
1312                 if (didrange) {
1313                     Perl_croak(aTHX_ "Ambiguous range in transliteration operator");
1314                 }
1315                 if (has_utf8) {
1316                     *d++ = (char)UTF_TO_NATIVE(0xff);   /* use illegal utf8 byte--see pmtrans */
1317                     s++;
1318                     continue;
1319                 }
1320                 dorange = TRUE;
1321                 s++;
1322             }
1323             else {
1324                 didrange = FALSE;
1325             }
1326         }
1327
1328         /* if we get here, we're not doing a transliteration */
1329
1330         /* skip for regexp comments /(?#comment)/ and code /(?{code})/,
1331            except for the last char, which will be done separately. */
1332         else if (*s == '(' && PL_lex_inpat && s[1] == '?') {
1333             if (s[2] == '#') {
1334                 while (s < send && *s != ')')
1335                     *d++ = NATIVE_TO_NEED(has_utf8,*s++);
1336             }
1337             else if (s[2] == '{' /* This should match regcomp.c */
1338                      || ((s[2] == 'p' || s[2] == '?') && s[3] == '{'))
1339             {
1340                 I32 count = 1;
1341                 char *regparse = s + (s[2] == '{' ? 3 : 4);
1342                 char c;
1343
1344                 while (count && (c = *regparse)) {
1345                     if (c == '\\' && regparse[1])
1346                         regparse++;
1347                     else if (c == '{')
1348                         count++;
1349                     else if (c == '}')
1350                         count--;
1351                     regparse++;
1352                 }
1353                 if (*regparse != ')') {
1354                     regparse--;         /* Leave one char for continuation. */
1355                     yyerror("Sequence (?{...}) not terminated or not {}-balanced");
1356                 }
1357                 while (s < regparse)
1358                     *d++ = NATIVE_TO_NEED(has_utf8,*s++);
1359             }
1360         }
1361
1362         /* likewise skip #-initiated comments in //x patterns */
1363         else if (*s == '#' && PL_lex_inpat &&
1364           ((PMOP*)PL_lex_inpat)->op_pmflags & PMf_EXTENDED) {
1365             while (s+1 < send && *s != '\n')
1366                 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
1367         }
1368
1369         /* check for embedded arrays
1370            (@foo, @:foo, @'foo, @{foo}, @$foo, @+, @-)
1371            */
1372         else if (*s == '@' && s[1]
1373                  && (isALNUM_lazy_if(s+1,UTF) || strchr(":'{$+-", s[1])))
1374             break;
1375
1376         /* check for embedded scalars.  only stop if we're sure it's a
1377            variable.
1378         */
1379         else if (*s == '$') {
1380             if (!PL_lex_inpat)  /* not a regexp, so $ must be var */
1381                 break;
1382             if (s + 1 < send && !strchr("()| \r\n\t", s[1]))
1383                 break;          /* in regexp, $ might be tail anchor */
1384         }
1385
1386         /* End of else if chain - OP_TRANS rejoin rest */
1387
1388         /* backslashes */
1389         if (*s == '\\' && s+1 < send) {
1390             s++;
1391
1392             /* some backslashes we leave behind */
1393             if (*leaveit && *s && strchr(leaveit, *s)) {
1394                 *d++ = NATIVE_TO_NEED(has_utf8,'\\');
1395                 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
1396                 continue;
1397             }
1398
1399             /* deprecate \1 in strings and substitution replacements */
1400             if (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat &&
1401                 isDIGIT(*s) && *s != '0' && !isDIGIT(s[1]))
1402             {
1403                 if (ckWARN(WARN_SYNTAX))
1404                     Perl_warner(aTHX_ WARN_SYNTAX, "\\%c better written as $%c", *s, *s);
1405                 *--s = '$';
1406                 break;
1407             }
1408
1409             /* string-change backslash escapes */
1410             if (PL_lex_inwhat != OP_TRANS && *s && strchr("lLuUEQ", *s)) {
1411                 --s;
1412                 break;
1413             }
1414
1415             /* if we get here, it's either a quoted -, or a digit */
1416             switch (*s) {
1417
1418             /* quoted - in transliterations */
1419             case '-':
1420                 if (PL_lex_inwhat == OP_TRANS) {
1421                     *d++ = *s++;
1422                     continue;
1423                 }
1424                 /* FALL THROUGH */
1425             default:
1426                 {
1427                     if (ckWARN(WARN_MISC) && isALNUM(*s))
1428                         Perl_warner(aTHX_ WARN_MISC,
1429                                "Unrecognized escape \\%c passed through",
1430                                *s);
1431                     /* default action is to copy the quoted character */
1432                     goto default_action;
1433                 }
1434
1435             /* \132 indicates an octal constant */
1436             case '0': case '1': case '2': case '3':
1437             case '4': case '5': case '6': case '7':
1438                 {
1439                     I32 flags = 0;
1440                     STRLEN len = 3;
1441                     uv = grok_oct(s, &len, &flags, NULL);
1442                     s += len;
1443                 }
1444                 goto NUM_ESCAPE_INSERT;
1445
1446             /* \x24 indicates a hex constant */
1447             case 'x':
1448                 ++s;
1449                 if (*s == '{') {
1450                     char* e = strchr(s, '}');
1451                     I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
1452                       PERL_SCAN_DISALLOW_PREFIX;
1453                     STRLEN len;
1454
1455                     ++s;
1456                     if (!e) {
1457                         yyerror("Missing right brace on \\x{}");
1458                         continue;
1459                     }
1460                     len = e - s;
1461                     uv = grok_hex(s, &len, &flags, NULL);
1462                     s = e + 1;
1463                 }
1464                 else {
1465                     {
1466                         STRLEN len = 2;
1467                         I32 flags = PERL_SCAN_DISALLOW_PREFIX;
1468                         uv = grok_hex(s, &len, &flags, NULL);
1469                         s += len;
1470                     }
1471                 }
1472
1473               NUM_ESCAPE_INSERT:
1474                 /* Insert oct or hex escaped character.
1475                  * There will always enough room in sv since such
1476                  * escapes will be longer than any UTF-8 sequence
1477                  * they can end up as. */
1478                 
1479                 /* We need to map to chars to ASCII before doing the tests
1480                    to cover EBCDIC
1481                 */
1482                 if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(uv))) {
1483                     if (!has_utf8 && uv > 255) {
1484                         /* Might need to recode whatever we have
1485                          * accumulated so far if it contains any
1486                          * hibit chars.
1487                          *
1488                          * (Can't we keep track of that and avoid
1489                          *  this rescan? --jhi)
1490                          */
1491                         int hicount = 0;
1492                         U8 *c;
1493                         for (c = (U8 *) SvPVX(sv); c < (U8 *)d; c++) {
1494                             if (!NATIVE_IS_INVARIANT(*c)) {
1495                                 hicount++;
1496                             }
1497                         }
1498                         if (hicount) {
1499                             STRLEN offset = d - SvPVX(sv);
1500                             U8 *src, *dst;
1501                             d = SvGROW(sv, SvLEN(sv) + hicount + 1) + offset;
1502                             src = (U8 *)d - 1;
1503                             dst = src+hicount;
1504                             d  += hicount;
1505                             while (src >= (U8 *)SvPVX(sv)) {
1506                                 if (!NATIVE_IS_INVARIANT(*src)) {
1507                                     U8 ch = NATIVE_TO_ASCII(*src);
1508                                     *dst-- = UTF8_EIGHT_BIT_LO(ch);
1509                                     *dst-- = UTF8_EIGHT_BIT_HI(ch);
1510                                 }
1511                                 else {
1512                                     *dst-- = *src;
1513                                 }
1514                                 src--;
1515                             }
1516                         }
1517                     }
1518
1519                     if (has_utf8 || uv > 255) {
1520                         d = (char*)uvchr_to_utf8((U8*)d, uv);
1521                         has_utf8 = TRUE;
1522                         if (PL_lex_inwhat == OP_TRANS &&
1523                             PL_sublex_info.sub_op) {
1524                             PL_sublex_info.sub_op->op_private |=
1525                                 (PL_lex_repl ? OPpTRANS_FROM_UTF
1526                                              : OPpTRANS_TO_UTF);
1527                         }
1528                     }
1529                     else {
1530                         *d++ = (char)uv;
1531                     }
1532                 }
1533                 else {
1534                     *d++ = (char) uv;
1535                 }
1536                 continue;
1537
1538             /* \N{LATIN SMALL LETTER A} is a named character */
1539             case 'N':
1540                 ++s;
1541                 if (*s == '{') {
1542                     char* e = strchr(s, '}');
1543                     SV *res;
1544                     STRLEN len;
1545                     char *str;
1546
1547                     if (!e) {
1548                         yyerror("Missing right brace on \\N{}");
1549                         e = s - 1;
1550                         goto cont_scan;
1551                     }
1552                     res = newSVpvn(s + 1, e - s - 1);
1553                     res = new_constant( Nullch, 0, "charnames",
1554                                         res, Nullsv, "\\N{...}" );
1555                     if (has_utf8)
1556                         sv_utf8_upgrade(res);
1557                     str = SvPV(res,len);
1558                     if (!has_utf8 && SvUTF8(res)) {
1559                         char *ostart = SvPVX(sv);
1560                         SvCUR_set(sv, d - ostart);
1561                         SvPOK_on(sv);
1562                         *d = '\0';
1563                         sv_utf8_upgrade(sv);
1564                         /* this just broke our allocation above... */
1565                         SvGROW(sv, send - start);
1566                         d = SvPVX(sv) + SvCUR(sv);
1567                         has_utf8 = TRUE;
1568                     }
1569                     if (len > e - s + 4) { /* I _guess_ 4 is \N{} --jhi */
1570                         char *odest = SvPVX(sv);
1571
1572                         SvGROW(sv, (SvLEN(sv) + len - (e - s + 4)));
1573                         d = SvPVX(sv) + (d - odest);
1574                     }
1575                     Copy(str, d, len, char);
1576                     d += len;
1577                     SvREFCNT_dec(res);
1578                   cont_scan:
1579                     s = e + 1;
1580                 }
1581                 else
1582                     yyerror("Missing braces on \\N{}");
1583                 continue;
1584
1585             /* \c is a control character */
1586             case 'c':
1587                 s++;
1588                 {
1589                     U8 c = *s++;
1590 #ifdef EBCDIC
1591                     if (isLOWER(c))
1592                         c = toUPPER(c);
1593 #endif
1594                     *d++ = NATIVE_TO_NEED(has_utf8,toCTRL(c));
1595                 }
1596                 continue;
1597
1598             /* printf-style backslashes, formfeeds, newlines, etc */
1599             case 'b':
1600                 *d++ = NATIVE_TO_NEED(has_utf8,'\b');
1601                 break;
1602             case 'n':
1603                 *d++ = NATIVE_TO_NEED(has_utf8,'\n');
1604                 break;
1605             case 'r':
1606                 *d++ = NATIVE_TO_NEED(has_utf8,'\r');
1607                 break;
1608             case 'f':
1609                 *d++ = NATIVE_TO_NEED(has_utf8,'\f');
1610                 break;
1611             case 't':
1612                 *d++ = NATIVE_TO_NEED(has_utf8,'\t');
1613                 break;
1614             case 'e':
1615                 *d++ = ASCII_TO_NEED(has_utf8,'\033');
1616                 break;
1617             case 'a':
1618                 *d++ = ASCII_TO_NEED(has_utf8,'\007');
1619                 break;
1620             } /* end switch */
1621
1622             s++;
1623             continue;
1624         } /* end if (backslash) */
1625
1626     default_action:
1627         /* If we started with encoded form, or already know we want it
1628            and then encode the next character */
1629         if ((has_utf8 || this_utf8) && !NATIVE_IS_INVARIANT((U8)(*s))) {
1630             STRLEN len  = 1;
1631             UV uv       = (this_utf8) ? utf8n_to_uvchr((U8*)s, send - s, &len, 0) : (UV) ((U8) *s);
1632             STRLEN need = UNISKIP(NATIVE_TO_UNI(uv));
1633             s += len;
1634             if (need > len) {
1635                 /* encoded value larger than old, need extra space (NOTE: SvCUR() not set here) */
1636                 STRLEN off = d - SvPVX(sv);
1637                 d = SvGROW(sv, SvLEN(sv) + (need-len)) + off;
1638             }
1639             d = (char*)uvchr_to_utf8((U8*)d, uv);
1640             has_utf8 = TRUE;
1641         }
1642         else {
1643             *d++ = NATIVE_TO_NEED(has_utf8,*s++);
1644         }
1645     } /* while loop to process each character */
1646
1647     /* terminate the string and set up the sv */
1648     *d = '\0';
1649     SvCUR_set(sv, d - SvPVX(sv));
1650     if (SvCUR(sv) >= SvLEN(sv))
1651       Perl_croak(aTHX_ "panic: constant overflowed allocated space");
1652
1653     SvPOK_on(sv);
1654     if (PL_encoding && !has_utf8) {
1655         Perl_sv_recode_to_utf8(aTHX_ sv, PL_encoding);
1656         has_utf8 = TRUE;
1657     }
1658     if (has_utf8) {
1659         SvUTF8_on(sv);
1660         if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
1661                 PL_sublex_info.sub_op->op_private |=
1662                     (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
1663         }
1664     }
1665
1666     /* shrink the sv if we allocated more than we used */
1667     if (SvCUR(sv) + 5 < SvLEN(sv)) {
1668         SvLEN_set(sv, SvCUR(sv) + 1);
1669         Renew(SvPVX(sv), SvLEN(sv), char);
1670     }
1671
1672     /* return the substring (via yylval) only if we parsed anything */
1673     if (s > PL_bufptr) {
1674         if ( PL_hints & ( PL_lex_inpat ? HINT_NEW_RE : HINT_NEW_STRING ) )
1675             sv = new_constant(start, s - start, (PL_lex_inpat ? "qr" : "q"),
1676                               sv, Nullsv,
1677                               ( PL_lex_inwhat == OP_TRANS
1678                                 ? "tr"
1679                                 : ( (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat)
1680                                     ? "s"
1681                                     : "qq")));
1682         yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
1683     } else
1684         SvREFCNT_dec(sv);
1685     return s;
1686 }
1687
1688 /* S_intuit_more
1689  * Returns TRUE if there's more to the expression (e.g., a subscript),
1690  * FALSE otherwise.
1691  *
1692  * It deals with "$foo[3]" and /$foo[3]/ and /$foo[0123456789$]+/
1693  *
1694  * ->[ and ->{ return TRUE
1695  * { and [ outside a pattern are always subscripts, so return TRUE
1696  * if we're outside a pattern and it's not { or [, then return FALSE
1697  * if we're in a pattern and the first char is a {
1698  *   {4,5} (any digits around the comma) returns FALSE
1699  * if we're in a pattern and the first char is a [
1700  *   [] returns FALSE
1701  *   [SOMETHING] has a funky algorithm to decide whether it's a
1702  *      character class or not.  It has to deal with things like
1703  *      /$foo[-3]/ and /$foo[$bar]/ as well as /$foo[$\d]+/
1704  * anything else returns TRUE
1705  */
1706
1707 /* This is the one truly awful dwimmer necessary to conflate C and sed. */
1708
1709 STATIC int
1710 S_intuit_more(pTHX_ register char *s)
1711 {
1712     if (PL_lex_brackets)
1713         return TRUE;
1714     if (*s == '-' && s[1] == '>' && (s[2] == '[' || s[2] == '{'))
1715         return TRUE;
1716     if (*s != '{' && *s != '[')
1717         return FALSE;
1718     if (!PL_lex_inpat)
1719         return TRUE;
1720
1721     /* In a pattern, so maybe we have {n,m}. */
1722     if (*s == '{') {
1723         s++;
1724         if (!isDIGIT(*s))
1725             return TRUE;
1726         while (isDIGIT(*s))
1727             s++;
1728         if (*s == ',')
1729             s++;
1730         while (isDIGIT(*s))
1731             s++;
1732         if (*s == '}')
1733             return FALSE;
1734         return TRUE;
1735         
1736     }
1737
1738     /* On the other hand, maybe we have a character class */
1739
1740     s++;
1741     if (*s == ']' || *s == '^')
1742         return FALSE;
1743     else {
1744         /* this is terrifying, and it works */
1745         int weight = 2;         /* let's weigh the evidence */
1746         char seen[256];
1747         unsigned char un_char = 255, last_un_char;
1748         char *send = strchr(s,']');
1749         char tmpbuf[sizeof PL_tokenbuf * 4];
1750
1751         if (!send)              /* has to be an expression */
1752             return TRUE;
1753
1754         Zero(seen,256,char);
1755         if (*s == '$')
1756             weight -= 3;
1757         else if (isDIGIT(*s)) {
1758             if (s[1] != ']') {
1759                 if (isDIGIT(s[1]) && s[2] == ']')
1760                     weight -= 10;
1761             }
1762             else
1763                 weight -= 100;
1764         }
1765         for (; s < send; s++) {
1766             last_un_char = un_char;
1767             un_char = (unsigned char)*s;
1768             switch (*s) {
1769             case '@':
1770             case '&':
1771             case '$':
1772                 weight -= seen[un_char] * 10;
1773                 if (isALNUM_lazy_if(s+1,UTF)) {
1774                     scan_ident(s, send, tmpbuf, sizeof tmpbuf, FALSE);
1775                     if ((int)strlen(tmpbuf) > 1 && gv_fetchpv(tmpbuf,FALSE, SVt_PV))
1776                         weight -= 100;
1777                     else
1778                         weight -= 10;
1779                 }
1780                 else if (*s == '$' && s[1] &&
1781                   strchr("[#!%*<>()-=",s[1])) {
1782                     if (/*{*/ strchr("])} =",s[2]))
1783                         weight -= 10;
1784                     else
1785                         weight -= 1;
1786                 }
1787                 break;
1788             case '\\':
1789                 un_char = 254;
1790                 if (s[1]) {
1791                     if (strchr("wds]",s[1]))
1792                         weight += 100;
1793                     else if (seen['\''] || seen['"'])
1794                         weight += 1;
1795                     else if (strchr("rnftbxcav",s[1]))
1796                         weight += 40;
1797                     else if (isDIGIT(s[1])) {
1798                         weight += 40;
1799                         while (s[1] && isDIGIT(s[1]))
1800                             s++;
1801                     }
1802                 }
1803                 else
1804                     weight += 100;
1805                 break;
1806             case '-':
1807                 if (s[1] == '\\')
1808                     weight += 50;
1809                 if (strchr("aA01! ",last_un_char))
1810                     weight += 30;
1811                 if (strchr("zZ79~",s[1]))
1812                     weight += 30;
1813                 if (last_un_char == 255 && (isDIGIT(s[1]) || s[1] == '$'))
1814                     weight -= 5;        /* cope with negative subscript */
1815                 break;
1816             default:
1817                 if (!isALNUM(last_un_char) && !strchr("$@&",last_un_char) &&
1818                         isALPHA(*s) && s[1] && isALPHA(s[1])) {
1819                     char *d = tmpbuf;
1820                     while (isALPHA(*s))
1821                         *d++ = *s++;
1822                     *d = '\0';
1823                     if (keyword(tmpbuf, d - tmpbuf))
1824                         weight -= 150;
1825                 }
1826                 if (un_char == last_un_char + 1)
1827                     weight += 5;
1828                 weight -= seen[un_char];
1829                 break;
1830             }
1831             seen[un_char]++;
1832         }
1833         if (weight >= 0)        /* probably a character class */
1834             return FALSE;
1835     }
1836
1837     return TRUE;
1838 }
1839
1840 /*
1841  * S_intuit_method
1842  *
1843  * Does all the checking to disambiguate
1844  *   foo bar
1845  * between foo(bar) and bar->foo.  Returns 0 if not a method, otherwise
1846  * FUNCMETH (bar->foo(args)) or METHOD (bar->foo args).
1847  *
1848  * First argument is the stuff after the first token, e.g. "bar".
1849  *
1850  * Not a method if bar is a filehandle.
1851  * Not a method if foo is a subroutine prototyped to take a filehandle.
1852  * Not a method if it's really "Foo $bar"
1853  * Method if it's "foo $bar"
1854  * Not a method if it's really "print foo $bar"
1855  * Method if it's really "foo package::" (interpreted as package->foo)
1856  * Not a method if bar is known to be a subroutne ("sub bar; foo bar")
1857  * Not a method if bar is a filehandle or package, but is quoted with
1858  *   =>
1859  */
1860
1861 STATIC int
1862 S_intuit_method(pTHX_ char *start, GV *gv)
1863 {
1864     char *s = start + (*start == '$');
1865     char tmpbuf[sizeof PL_tokenbuf];
1866     STRLEN len;
1867     GV* indirgv;
1868
1869     if (gv) {
1870         CV *cv;
1871         if (GvIO(gv))
1872             return 0;
1873         if ((cv = GvCVu(gv))) {
1874             char *proto = SvPVX(cv);
1875             if (proto) {
1876                 if (*proto == ';')
1877                     proto++;
1878                 if (*proto == '*')
1879                     return 0;
1880             }
1881         } else
1882             gv = 0;
1883     }
1884     s = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
1885     /* start is the beginning of the possible filehandle/object,
1886      * and s is the end of it
1887      * tmpbuf is a copy of it
1888      */
1889
1890     if (*start == '$') {
1891         if (gv || PL_last_lop_op == OP_PRINT || isUPPER(*PL_tokenbuf))
1892             return 0;
1893         s = skipspace(s);
1894         PL_bufptr = start;
1895         PL_expect = XREF;
1896         return *s == '(' ? FUNCMETH : METHOD;
1897     }
1898     if (!keyword(tmpbuf, len)) {
1899         if (len > 2 && tmpbuf[len - 2] == ':' && tmpbuf[len - 1] == ':') {
1900             len -= 2;
1901             tmpbuf[len] = '\0';
1902             goto bare_package;
1903         }
1904         indirgv = gv_fetchpv(tmpbuf, FALSE, SVt_PVCV);
1905         if (indirgv && GvCVu(indirgv))
1906             return 0;
1907         /* filehandle or package name makes it a method */
1908         if (!gv || GvIO(indirgv) || gv_stashpvn(tmpbuf, len, FALSE)) {
1909             s = skipspace(s);
1910             if ((PL_bufend - s) >= 2 && *s == '=' && *(s+1) == '>')
1911                 return 0;       /* no assumptions -- "=>" quotes bearword */
1912       bare_package:
1913             PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST, 0,
1914                                                    newSVpvn(tmpbuf,len));
1915             PL_nextval[PL_nexttoke].opval->op_private = OPpCONST_BARE;
1916             PL_expect = XTERM;
1917             force_next(WORD);
1918             PL_bufptr = s;
1919             return *s == '(' ? FUNCMETH : METHOD;
1920         }
1921     }
1922     return 0;
1923 }
1924
1925 /*
1926  * S_incl_perldb
1927  * Return a string of Perl code to load the debugger.  If PERL5DB
1928  * is set, it will return the contents of that, otherwise a
1929  * compile-time require of perl5db.pl.
1930  */
1931
1932 STATIC char*
1933 S_incl_perldb(pTHX)
1934 {
1935     if (PL_perldb) {
1936         char *pdb = PerlEnv_getenv("PERL5DB");
1937
1938         if (pdb)
1939             return pdb;
1940         SETERRNO(0,SS$_NORMAL);
1941         return "BEGIN { require 'perl5db.pl' }";
1942     }
1943     return "";
1944 }
1945
1946
1947 /* Encoded script support. filter_add() effectively inserts a
1948  * 'pre-processing' function into the current source input stream.
1949  * Note that the filter function only applies to the current source file
1950  * (e.g., it will not affect files 'require'd or 'use'd by this one).
1951  *
1952  * The datasv parameter (which may be NULL) can be used to pass
1953  * private data to this instance of the filter. The filter function
1954  * can recover the SV using the FILTER_DATA macro and use it to
1955  * store private buffers and state information.
1956  *
1957  * The supplied datasv parameter is upgraded to a PVIO type
1958  * and the IoDIRP/IoANY field is used to store the function pointer,
1959  * and IOf_FAKE_DIRP is enabled on datasv to mark this as such.
1960  * Note that IoTOP_NAME, IoFMT_NAME, IoBOTTOM_NAME, if set for
1961  * private use must be set using malloc'd pointers.
1962  */
1963
1964 SV *
1965 Perl_filter_add(pTHX_ filter_t funcp, SV *datasv)
1966 {
1967     if (!funcp)
1968         return Nullsv;
1969
1970     if (!PL_rsfp_filters)
1971         PL_rsfp_filters = newAV();
1972     if (!datasv)
1973         datasv = NEWSV(255,0);
1974     if (!SvUPGRADE(datasv, SVt_PVIO))
1975         Perl_die(aTHX_ "Can't upgrade filter_add data to SVt_PVIO");
1976     IoANY(datasv) = (void *)funcp; /* stash funcp into spare field */
1977     IoFLAGS(datasv) |= IOf_FAKE_DIRP;
1978     DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_add func %p (%s)\n",
1979                           (void*)funcp, SvPV_nolen(datasv)));
1980     av_unshift(PL_rsfp_filters, 1);
1981     av_store(PL_rsfp_filters, 0, datasv) ;
1982     return(datasv);
1983 }
1984
1985
1986 /* Delete most recently added instance of this filter function. */
1987 void
1988 Perl_filter_del(pTHX_ filter_t funcp)
1989 {
1990     SV *datasv;
1991     DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_del func %p", (void*)funcp));
1992     if (!PL_rsfp_filters || AvFILLp(PL_rsfp_filters)<0)
1993         return;
1994     /* if filter is on top of stack (usual case) just pop it off */
1995     datasv = FILTER_DATA(AvFILLp(PL_rsfp_filters));
1996     if (IoANY(datasv) == (void *)funcp) {
1997         IoFLAGS(datasv) &= ~IOf_FAKE_DIRP;
1998         IoANY(datasv) = (void *)NULL;
1999         sv_free(av_pop(PL_rsfp_filters));
2000
2001         return;
2002     }
2003     /* we need to search for the correct entry and clear it     */
2004     Perl_die(aTHX_ "filter_del can only delete in reverse order (currently)");
2005 }
2006
2007
2008 /* Invoke the n'th filter function for the current rsfp.         */
2009 I32
2010 Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
2011
2012
2013                         /* 0 = read one text line */
2014 {
2015     filter_t funcp;
2016     SV *datasv = NULL;
2017
2018     if (!PL_rsfp_filters)
2019         return -1;
2020     if (idx > AvFILLp(PL_rsfp_filters)){       /* Any more filters?     */
2021         /* Provide a default input filter to make life easy.    */
2022         /* Note that we append to the line. This is handy.      */
2023         DEBUG_P(PerlIO_printf(Perl_debug_log,
2024                               "filter_read %d: from rsfp\n", idx));
2025         if (maxlen) {
2026             /* Want a block */
2027             int len ;
2028             int old_len = SvCUR(buf_sv) ;
2029
2030             /* ensure buf_sv is large enough */
2031             SvGROW(buf_sv, old_len + maxlen) ;
2032             if ((len = PerlIO_read(PL_rsfp, SvPVX(buf_sv) + old_len, maxlen)) <= 0){
2033                 if (PerlIO_error(PL_rsfp))
2034                     return -1;          /* error */
2035                 else
2036                     return 0 ;          /* end of file */
2037             }
2038             SvCUR_set(buf_sv, old_len + len) ;
2039         } else {
2040             /* Want a line */
2041             if (sv_gets(buf_sv, PL_rsfp, SvCUR(buf_sv)) == NULL) {
2042                 if (PerlIO_error(PL_rsfp))
2043                     return -1;          /* error */
2044                 else
2045                     return 0 ;          /* end of file */
2046             }
2047         }
2048         return SvCUR(buf_sv);
2049     }
2050     /* Skip this filter slot if filter has been deleted */
2051     if ( (datasv = FILTER_DATA(idx)) == &PL_sv_undef){
2052         DEBUG_P(PerlIO_printf(Perl_debug_log,
2053                               "filter_read %d: skipped (filter deleted)\n",
2054                               idx));
2055         return FILTER_READ(idx+1, buf_sv, maxlen); /* recurse */
2056     }
2057     /* Get function pointer hidden within datasv        */
2058     funcp = (filter_t)IoANY(datasv);
2059     DEBUG_P(PerlIO_printf(Perl_debug_log,
2060                           "filter_read %d: via function %p (%s)\n",
2061                           idx, (void*)funcp, SvPV_nolen(datasv)));
2062     /* Call function. The function is expected to       */
2063     /* call "FILTER_READ(idx+1, buf_sv)" first.         */
2064     /* Return: <0:error, =0:eof, >0:not eof             */
2065     return (*funcp)(aTHX_ idx, buf_sv, maxlen);
2066 }
2067
2068 STATIC char *
2069 S_filter_gets(pTHX_ register SV *sv, register PerlIO *fp, STRLEN append)
2070 {
2071 #ifdef PERL_CR_FILTER
2072     if (!PL_rsfp_filters) {
2073         filter_add(S_cr_textfilter,NULL);
2074     }
2075 #endif
2076     if (PL_rsfp_filters) {
2077
2078         if (!append)
2079             SvCUR_set(sv, 0);   /* start with empty line        */
2080         if (FILTER_READ(0, sv, 0) > 0)
2081             return ( SvPVX(sv) ) ;
2082         else
2083             return Nullch ;
2084     }
2085     else
2086         return (sv_gets(sv, fp, append));
2087 }
2088
2089 STATIC HV *
2090 S_find_in_my_stash(pTHX_ char *pkgname, I32 len)
2091 {
2092     GV *gv;
2093
2094     if (len == 11 && *pkgname == '_' && strEQ(pkgname, "__PACKAGE__"))
2095         return PL_curstash;
2096
2097     if (len > 2 &&
2098         (pkgname[len - 2] == ':' && pkgname[len - 1] == ':') &&
2099         (gv = gv_fetchpv(pkgname, FALSE, SVt_PVHV)))
2100     {
2101         return GvHV(gv);                        /* Foo:: */
2102     }
2103
2104     /* use constant CLASS => 'MyClass' */
2105     if ((gv = gv_fetchpv(pkgname, FALSE, SVt_PVCV))) {
2106         SV *sv;
2107         if (GvCV(gv) && (sv = cv_const_sv(GvCV(gv)))) {
2108             pkgname = SvPV_nolen(sv);
2109         }
2110     }
2111
2112     return gv_stashpv(pkgname, FALSE);
2113 }
2114
2115 #ifdef DEBUGGING
2116     static char* exp_name[] =
2117         { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "ATTRBLOCK",
2118           "ATTRTERM", "TERMBLOCK"
2119         };
2120 #endif
2121
2122 /*
2123   yylex
2124
2125   Works out what to call the token just pulled out of the input
2126   stream.  The yacc parser takes care of taking the ops we return and
2127   stitching them into a tree.
2128
2129   Returns:
2130     PRIVATEREF
2131
2132   Structure:
2133       if read an identifier
2134           if we're in a my declaration
2135               croak if they tried to say my($foo::bar)
2136               build the ops for a my() declaration
2137           if it's an access to a my() variable
2138               are we in a sort block?
2139                   croak if my($a); $a <=> $b
2140               build ops for access to a my() variable
2141           if in a dq string, and they've said @foo and we can't find @foo
2142               croak
2143           build ops for a bareword
2144       if we already built the token before, use it.
2145 */
2146
2147 #ifdef USE_PURE_BISON
2148 int
2149 Perl_yylex_r(pTHX_ YYSTYPE *lvalp, int *lcharp)
2150 {
2151     int r;
2152
2153     yyactlevel++;
2154     yylval_pointer[yyactlevel] = lvalp;
2155     yychar_pointer[yyactlevel] = lcharp;
2156     if (yyactlevel >= YYMAXLEVEL)
2157         Perl_croak(aTHX_ "panic: YYMAXLEVEL");
2158
2159     r = Perl_yylex(aTHX);
2160
2161     if (yyactlevel > 0)
2162        yyactlevel--;
2163
2164     return r;
2165 }
2166 #endif
2167
2168 #ifdef __SC__
2169 #pragma segment Perl_yylex
2170 #endif
2171 int
2172 Perl_yylex(pTHX)
2173 {
2174     register char *s;
2175     register char *d;
2176     register I32 tmp;
2177     STRLEN len;
2178     GV *gv = Nullgv;
2179     GV **gvp = 0;
2180     bool bof = FALSE;
2181
2182     /* check if there's an identifier for us to look at */
2183     if (PL_pending_ident) 
2184         return S_pending_ident(aTHX);
2185
2186     /* no identifier pending identification */
2187
2188     switch (PL_lex_state) {
2189 #ifdef COMMENTARY
2190     case LEX_NORMAL:            /* Some compilers will produce faster */
2191     case LEX_INTERPNORMAL:      /* code if we comment these out. */
2192         break;
2193 #endif
2194
2195     /* when we've already built the next token, just pull it out of the queue */
2196     case LEX_KNOWNEXT:
2197         PL_nexttoke--;
2198         yylval = PL_nextval[PL_nexttoke];
2199         if (!PL_nexttoke) {
2200             PL_lex_state = PL_lex_defer;
2201             PL_expect = PL_lex_expect;
2202             PL_lex_defer = LEX_NORMAL;
2203         }
2204         DEBUG_T({ PerlIO_printf(Perl_debug_log,
2205               "### Next token after '%s' was known, type %"IVdf"\n", PL_bufptr,
2206               (IV)PL_nexttype[PL_nexttoke]); });
2207
2208         return(PL_nexttype[PL_nexttoke]);
2209
2210     /* interpolated case modifiers like \L \U, including \Q and \E.
2211        when we get here, PL_bufptr is at the \
2212     */
2213     case LEX_INTERPCASEMOD:
2214 #ifdef DEBUGGING
2215         if (PL_bufptr != PL_bufend && *PL_bufptr != '\\')
2216             Perl_croak(aTHX_ "panic: INTERPCASEMOD");
2217 #endif
2218         /* handle \E or end of string */
2219         if (PL_bufptr == PL_bufend || PL_bufptr[1] == 'E') {
2220             char oldmod;
2221
2222             /* if at a \E */
2223             if (PL_lex_casemods) {
2224                 oldmod = PL_lex_casestack[--PL_lex_casemods];
2225                 PL_lex_casestack[PL_lex_casemods] = '\0';
2226
2227                 if (PL_bufptr != PL_bufend && strchr("LUQ", oldmod)) {
2228                     PL_bufptr += 2;
2229                     PL_lex_state = LEX_INTERPCONCAT;
2230                 }
2231                 return ')';
2232             }
2233             if (PL_bufptr != PL_bufend)
2234                 PL_bufptr += 2;
2235             PL_lex_state = LEX_INTERPCONCAT;
2236             return yylex();
2237         }
2238         else {
2239             DEBUG_T({ PerlIO_printf(Perl_debug_log,
2240               "### Saw case modifier at '%s'\n", PL_bufptr); });
2241             s = PL_bufptr + 1;
2242             if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
2243                 tmp = *s, *s = s[2], s[2] = tmp;        /* misordered... */
2244             if (strchr("LU", *s) &&
2245                 (strchr(PL_lex_casestack, 'L') || strchr(PL_lex_casestack, 'U')))
2246             {
2247                 PL_lex_casestack[--PL_lex_casemods] = '\0';
2248                 return ')';
2249             }
2250             if (PL_lex_casemods > 10) {
2251                 char* newlb = Renew(PL_lex_casestack, PL_lex_casemods + 2, char);
2252                 if (newlb != PL_lex_casestack) {
2253                     SAVEFREEPV(newlb);
2254                     PL_lex_casestack = newlb;
2255                 }
2256             }
2257             PL_lex_casestack[PL_lex_casemods++] = *s;
2258             PL_lex_casestack[PL_lex_casemods] = '\0';
2259             PL_lex_state = LEX_INTERPCONCAT;
2260             PL_nextval[PL_nexttoke].ival = 0;
2261             force_next('(');
2262             if (*s == 'l')
2263                 PL_nextval[PL_nexttoke].ival = OP_LCFIRST;
2264             else if (*s == 'u')
2265                 PL_nextval[PL_nexttoke].ival = OP_UCFIRST;
2266             else if (*s == 'L')
2267                 PL_nextval[PL_nexttoke].ival = OP_LC;
2268             else if (*s == 'U')
2269                 PL_nextval[PL_nexttoke].ival = OP_UC;
2270             else if (*s == 'Q')
2271                 PL_nextval[PL_nexttoke].ival = OP_QUOTEMETA;
2272             else
2273                 Perl_croak(aTHX_ "panic: yylex");
2274             PL_bufptr = s + 1;
2275             force_next(FUNC);
2276             if (PL_lex_starts) {
2277                 s = PL_bufptr;
2278                 PL_lex_starts = 0;
2279                 Aop(OP_CONCAT);
2280             }
2281             else
2282                 return yylex();
2283         }
2284
2285     case LEX_INTERPPUSH:
2286         return sublex_push();
2287
2288     case LEX_INTERPSTART:
2289         if (PL_bufptr == PL_bufend)
2290             return sublex_done();
2291         DEBUG_T({ PerlIO_printf(Perl_debug_log,
2292               "### Interpolated variable at '%s'\n", PL_bufptr); });
2293         PL_expect = XTERM;
2294         PL_lex_dojoin = (*PL_bufptr == '@');
2295         PL_lex_state = LEX_INTERPNORMAL;
2296         if (PL_lex_dojoin) {
2297             PL_nextval[PL_nexttoke].ival = 0;
2298             force_next(',');
2299 #ifdef USE_5005THREADS
2300             PL_nextval[PL_nexttoke].opval = newOP(OP_THREADSV, 0);
2301             PL_nextval[PL_nexttoke].opval->op_targ = find_threadsv("\"");
2302             force_next(PRIVATEREF);
2303 #else
2304             force_ident("\"", '$');
2305 #endif /* USE_5005THREADS */
2306             PL_nextval[PL_nexttoke].ival = 0;
2307             force_next('$');
2308             PL_nextval[PL_nexttoke].ival = 0;
2309             force_next('(');
2310             PL_nextval[PL_nexttoke].ival = OP_JOIN;     /* emulate join($", ...) */
2311             force_next(FUNC);
2312         }
2313         if (PL_lex_starts++) {
2314             s = PL_bufptr;
2315             Aop(OP_CONCAT);
2316         }
2317         return yylex();
2318
2319     case LEX_INTERPENDMAYBE:
2320         if (intuit_more(PL_bufptr)) {
2321             PL_lex_state = LEX_INTERPNORMAL;    /* false alarm, more expr */
2322             break;
2323         }
2324         /* FALL THROUGH */
2325
2326     case LEX_INTERPEND:
2327         if (PL_lex_dojoin) {
2328             PL_lex_dojoin = FALSE;
2329             PL_lex_state = LEX_INTERPCONCAT;
2330             return ')';
2331         }
2332         if (PL_lex_inwhat == OP_SUBST && PL_linestr == PL_lex_repl
2333             && SvEVALED(PL_lex_repl))
2334         {
2335             if (PL_bufptr != PL_bufend)
2336                 Perl_croak(aTHX_ "Bad evalled substitution pattern");
2337             PL_lex_repl = Nullsv;
2338         }
2339         /* FALLTHROUGH */
2340     case LEX_INTERPCONCAT:
2341 #ifdef DEBUGGING
2342         if (PL_lex_brackets)
2343             Perl_croak(aTHX_ "panic: INTERPCONCAT");
2344 #endif
2345         if (PL_bufptr == PL_bufend)
2346             return sublex_done();
2347
2348         if (SvIVX(PL_linestr) == '\'') {
2349             SV *sv = newSVsv(PL_linestr);
2350             if (!PL_lex_inpat)
2351                 sv = tokeq(sv);
2352             else if ( PL_hints & HINT_NEW_RE )
2353                 sv = new_constant(NULL, 0, "qr", sv, sv, "q");
2354             yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
2355             s = PL_bufend;
2356         }
2357         else {
2358             s = scan_const(PL_bufptr);
2359             if (*s == '\\')
2360                 PL_lex_state = LEX_INTERPCASEMOD;
2361             else
2362                 PL_lex_state = LEX_INTERPSTART;
2363         }
2364
2365         if (s != PL_bufptr) {
2366             PL_nextval[PL_nexttoke] = yylval;
2367             PL_expect = XTERM;
2368             force_next(THING);
2369             if (PL_lex_starts++)
2370                 Aop(OP_CONCAT);
2371             else {
2372                 PL_bufptr = s;
2373                 return yylex();
2374             }
2375         }
2376
2377         return yylex();
2378     case LEX_FORMLINE:
2379         PL_lex_state = LEX_NORMAL;
2380         s = scan_formline(PL_bufptr);
2381         if (!PL_lex_formbrack)
2382             goto rightbracket;
2383         OPERATOR(';');
2384     }
2385
2386     s = PL_bufptr;
2387     PL_oldoldbufptr = PL_oldbufptr;
2388     PL_oldbufptr = s;
2389     DEBUG_T( {
2390         PerlIO_printf(Perl_debug_log, "### Tokener expecting %s at %s\n",
2391                       exp_name[PL_expect], s);
2392     } );
2393
2394   retry:
2395     switch (*s) {
2396     default:
2397         if (isIDFIRST_lazy_if(s,UTF))
2398             goto keylookup;
2399         Perl_croak(aTHX_ "Unrecognized character \\x%02X", *s & 255);
2400     case 4:
2401     case 26:
2402         goto fake_eof;                  /* emulate EOF on ^D or ^Z */
2403     case 0:
2404         if (!PL_rsfp) {
2405             PL_last_uni = 0;
2406             PL_last_lop = 0;
2407             if (PL_lex_brackets)
2408                 yyerror("Missing right curly or square bracket");
2409             DEBUG_T( { PerlIO_printf(Perl_debug_log,
2410                         "### Tokener got EOF\n");
2411             } );
2412             TOKEN(0);
2413         }
2414         if (s++ < PL_bufend)
2415             goto retry;                 /* ignore stray nulls */
2416         PL_last_uni = 0;
2417         PL_last_lop = 0;
2418         if (!PL_in_eval && !PL_preambled) {
2419             PL_preambled = TRUE;
2420             sv_setpv(PL_linestr,incl_perldb());
2421             if (SvCUR(PL_linestr))
2422                 sv_catpv(PL_linestr,";");
2423             if (PL_preambleav){
2424                 while(AvFILLp(PL_preambleav) >= 0) {
2425                     SV *tmpsv = av_shift(PL_preambleav);
2426                     sv_catsv(PL_linestr, tmpsv);
2427                     sv_catpv(PL_linestr, ";");
2428                     sv_free(tmpsv);
2429                 }
2430                 sv_free((SV*)PL_preambleav);
2431                 PL_preambleav = NULL;
2432             }
2433             if (PL_minus_n || PL_minus_p) {
2434                 sv_catpv(PL_linestr, "LINE: while (<>) {");
2435                 if (PL_minus_l)
2436                     sv_catpv(PL_linestr,"chomp;");
2437                 if (PL_minus_a) {
2438                     if (PL_minus_F) {
2439                         if (strchr("/'\"", *PL_splitstr)
2440                               && strchr(PL_splitstr + 1, *PL_splitstr))
2441                             Perl_sv_catpvf(aTHX_ PL_linestr, "our @F=split(%s);", PL_splitstr);
2442                         else {
2443                             char delim;
2444                             s = "'~#\200\1'"; /* surely one char is unused...*/
2445                             while (s[1] && strchr(PL_splitstr, *s))  s++;
2446                             delim = *s;
2447                             Perl_sv_catpvf(aTHX_ PL_linestr, "our @F=split(%s%c",
2448                                       "q" + (delim == '\''), delim);
2449                             for (s = PL_splitstr; *s; s++) {
2450                                 if (*s == '\\')
2451                                     sv_catpvn(PL_linestr, "\\", 1);
2452                                 sv_catpvn(PL_linestr, s, 1);
2453                             }
2454                             Perl_sv_catpvf(aTHX_ PL_linestr, "%c);", delim);
2455                         }
2456                     }
2457                     else
2458                         sv_catpv(PL_linestr,"our @F=split(' ');");
2459                 }
2460             }
2461             sv_catpv(PL_linestr, "\n");
2462             PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2463             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
2464             PL_last_lop = PL_last_uni = Nullch;
2465             if (PERLDB_LINE && PL_curstash != PL_debstash) {
2466                 SV *sv = NEWSV(85,0);
2467
2468                 sv_upgrade(sv, SVt_PVMG);
2469                 sv_setsv(sv,PL_linestr);
2470                 (void)SvIOK_on(sv);
2471                 SvIVX(sv) = 0;
2472                 av_store(CopFILEAV(PL_curcop),(I32)CopLINE(PL_curcop),sv);
2473             }
2474             goto retry;
2475         }
2476         do {
2477             bof = PL_rsfp ? TRUE : FALSE;
2478             if ((s = filter_gets(PL_linestr, PL_rsfp, 0)) == Nullch) {
2479               fake_eof:
2480                 if (PL_rsfp) {
2481                     if (PL_preprocess && !PL_in_eval)
2482                         (void)PerlProc_pclose(PL_rsfp);
2483                     else if ((PerlIO *)PL_rsfp == PerlIO_stdin())
2484                         PerlIO_clearerr(PL_rsfp);
2485                     else
2486                         (void)PerlIO_close(PL_rsfp);
2487                     PL_rsfp = Nullfp;
2488                     PL_doextract = FALSE;
2489                 }
2490                 if (!PL_in_eval && (PL_minus_n || PL_minus_p)) {
2491                     sv_setpv(PL_linestr,PL_minus_p ? ";}continue{print" : "");
2492                     sv_catpv(PL_linestr,";}");
2493                     PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2494                     PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
2495                     PL_last_lop = PL_last_uni = Nullch;
2496                     PL_minus_n = PL_minus_p = 0;
2497                     goto retry;
2498                 }
2499                 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2500                 PL_last_lop = PL_last_uni = Nullch;
2501                 sv_setpv(PL_linestr,"");
2502                 TOKEN(';');     /* not infinite loop because rsfp is NULL now */
2503             }
2504             /* if it looks like the start of a BOM, check if it in fact is */
2505             else if (bof && (!*s || *(U8*)s == 0xEF || *(U8*)s >= 0xFE)) {
2506 #ifdef PERLIO_IS_STDIO
2507 #  ifdef __GNU_LIBRARY__
2508 #    if __GNU_LIBRARY__ == 1 /* Linux glibc5 */
2509 #      define FTELL_FOR_PIPE_IS_BROKEN
2510 #    endif
2511 #  else
2512 #    ifdef __GLIBC__
2513 #      if __GLIBC__ == 1 /* maybe some glibc5 release had it like this? */
2514 #        define FTELL_FOR_PIPE_IS_BROKEN
2515 #      endif
2516 #    endif
2517 #  endif
2518 #endif
2519 #ifdef FTELL_FOR_PIPE_IS_BROKEN
2520                 /* This loses the possibility to detect the bof
2521                  * situation on perl -P when the libc5 is being used.
2522                  * Workaround?  Maybe attach some extra state to PL_rsfp?
2523                  */
2524                 if (!PL_preprocess)
2525                     bof = PerlIO_tell(PL_rsfp) == SvCUR(PL_linestr);
2526 #else
2527                 bof = PerlIO_tell(PL_rsfp) == SvCUR(PL_linestr);
2528 #endif
2529                 if (bof) {
2530                     PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
2531                     s = swallow_bom((U8*)s);
2532                 }
2533             }
2534             if (PL_doextract) {
2535                 if (*s == '#' && s[1] == '!' && instr(s,"perl"))
2536                     PL_doextract = FALSE;
2537
2538                 /* Incest with pod. */
2539                 if (*s == '=' && strnEQ(s, "=cut", 4)) {
2540                     sv_setpv(PL_linestr, "");
2541                     PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2542                     PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
2543                     PL_last_lop = PL_last_uni = Nullch;
2544                     PL_doextract = FALSE;
2545                 }
2546             }
2547             incline(s);
2548         } while (PL_doextract);
2549         PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = s;
2550         if (PERLDB_LINE && PL_curstash != PL_debstash) {
2551             SV *sv = NEWSV(85,0);
2552
2553             sv_upgrade(sv, SVt_PVMG);
2554             sv_setsv(sv,PL_linestr);
2555             (void)SvIOK_on(sv);
2556             SvIVX(sv) = 0;
2557             av_store(CopFILEAV(PL_curcop),(I32)CopLINE(PL_curcop),sv);
2558         }
2559         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
2560         PL_last_lop = PL_last_uni = Nullch;
2561         if (CopLINE(PL_curcop) == 1) {
2562             while (s < PL_bufend && isSPACE(*s))
2563                 s++;
2564             if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
2565                 s++;
2566             d = Nullch;
2567             if (!PL_in_eval) {
2568                 if (*s == '#' && *(s+1) == '!')
2569                     d = s + 2;
2570 #ifdef ALTERNATE_SHEBANG
2571                 else {
2572                     static char as[] = ALTERNATE_SHEBANG;
2573                     if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
2574                         d = s + (sizeof(as) - 1);
2575                 }
2576 #endif /* ALTERNATE_SHEBANG */
2577             }
2578             if (d) {
2579                 char *ipath;
2580                 char *ipathend;
2581
2582                 while (isSPACE(*d))
2583                     d++;
2584                 ipath = d;
2585                 while (*d && !isSPACE(*d))
2586                     d++;
2587                 ipathend = d;
2588
2589 #ifdef ARG_ZERO_IS_SCRIPT
2590                 if (ipathend > ipath) {
2591                     /*
2592                      * HP-UX (at least) sets argv[0] to the script name,
2593                      * which makes $^X incorrect.  And Digital UNIX and Linux,
2594                      * at least, set argv[0] to the basename of the Perl
2595                      * interpreter. So, having found "#!", we'll set it right.
2596                      */
2597                     SV *x = GvSV(gv_fetchpv("\030", TRUE, SVt_PV)); /* $^X */
2598                     assert(SvPOK(x) || SvGMAGICAL(x));
2599                     if (sv_eq(x, CopFILESV(PL_curcop))) {
2600                         sv_setpvn(x, ipath, ipathend - ipath);
2601                         SvSETMAGIC(x);
2602                     }
2603                     TAINT_NOT;  /* $^X is always tainted, but that's OK */
2604                 }
2605 #endif /* ARG_ZERO_IS_SCRIPT */
2606
2607                 /*
2608                  * Look for options.
2609                  */
2610                 d = instr(s,"perl -");
2611                 if (!d) {
2612                     d = instr(s,"perl");
2613 #if defined(DOSISH)
2614                     /* avoid getting into infinite loops when shebang
2615                      * line contains "Perl" rather than "perl" */
2616                     if (!d) {
2617                         for (d = ipathend-4; d >= ipath; --d) {
2618                             if ((*d == 'p' || *d == 'P')
2619                                 && !ibcmp(d, "perl", 4))
2620                             {
2621                                 break;
2622                             }
2623                         }
2624                         if (d < ipath)
2625                             d = Nullch;
2626                     }
2627 #endif
2628                 }
2629 #ifdef ALTERNATE_SHEBANG
2630                 /*
2631                  * If the ALTERNATE_SHEBANG on this system starts with a
2632                  * character that can be part of a Perl expression, then if
2633                  * we see it but not "perl", we're probably looking at the
2634                  * start of Perl code, not a request to hand off to some
2635                  * other interpreter.  Similarly, if "perl" is there, but
2636                  * not in the first 'word' of the line, we assume the line
2637                  * contains the start of the Perl program.
2638                  */
2639                 if (d && *s != '#') {
2640                     char *c = ipath;
2641                     while (*c && !strchr("; \t\r\n\f\v#", *c))
2642                         c++;
2643                     if (c < d)
2644                         d = Nullch;     /* "perl" not in first word; ignore */
2645                     else
2646                         *s = '#';       /* Don't try to parse shebang line */
2647                 }
2648 #endif /* ALTERNATE_SHEBANG */
2649 #ifndef MACOS_TRADITIONAL
2650                 if (!d &&
2651                     *s == '#' &&
2652                     ipathend > ipath &&
2653                     !PL_minus_c &&
2654                     !instr(s,"indir") &&
2655                     instr(PL_origargv[0],"perl"))
2656                 {
2657                     char **newargv;
2658
2659                     *ipathend = '\0';
2660                     s = ipathend + 1;
2661                     while (s < PL_bufend && isSPACE(*s))
2662                         s++;
2663                     if (s < PL_bufend) {
2664                         Newz(899,newargv,PL_origargc+3,char*);
2665                         newargv[1] = s;
2666                         while (s < PL_bufend && !isSPACE(*s))
2667                             s++;
2668                         *s = '\0';
2669                         Copy(PL_origargv+1, newargv+2, PL_origargc+1, char*);
2670                     }
2671                     else
2672                         newargv = PL_origargv;
2673                     newargv[0] = ipath;
2674                     PerlProc_execv(ipath, EXEC_ARGV_CAST(newargv));
2675                     Perl_croak(aTHX_ "Can't exec %s", ipath);
2676                 }
2677 #endif
2678                 if (d) {
2679                     U32 oldpdb = PL_perldb;
2680                     bool oldn = PL_minus_n;
2681                     bool oldp = PL_minus_p;
2682
2683                     while (*d && !isSPACE(*d)) d++;
2684                     while (SPACE_OR_TAB(*d)) d++;
2685
2686                     if (*d++ == '-') {
2687                         bool switches_done = PL_doswitches;
2688                         do {
2689                             if (*d == 'M' || *d == 'm') {
2690                                 char *m = d;
2691                                 while (*d && !isSPACE(*d)) d++;
2692                                 Perl_croak(aTHX_ "Too late for \"-%.*s\" option",
2693                                       (int)(d - m), m);
2694                             }
2695                             d = moreswitches(d);
2696                         } while (d);
2697                         if ((PERLDB_LINE && !oldpdb) ||
2698                             ((PL_minus_n || PL_minus_p) && !(oldn || oldp)))
2699                               /* if we have already added "LINE: while (<>) {",
2700                                  we must not do it again */
2701                         {
2702                             sv_setpv(PL_linestr, "");
2703                             PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2704                             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
2705                             PL_last_lop = PL_last_uni = Nullch;
2706                             PL_preambled = FALSE;
2707                             if (PERLDB_LINE)
2708                                 (void)gv_fetchfile(PL_origfilename);
2709                             goto retry;
2710                         }
2711                         if (PL_doswitches && !switches_done) {
2712                             int argc = PL_origargc;
2713                             char **argv = PL_origargv;
2714                             do {
2715                                 argc--,argv++;
2716                             } while (argc && argv[0][0] == '-' && argv[0][1]);
2717                             init_argv_symbols(argc,argv);
2718                         }
2719                     }
2720                 }
2721             }
2722         }
2723         if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
2724             PL_bufptr = s;
2725             PL_lex_state = LEX_FORMLINE;
2726             return yylex();
2727         }
2728         goto retry;
2729     case '\r':
2730 #ifdef PERL_STRICT_CR
2731         Perl_warn(aTHX_ "Illegal character \\%03o (carriage return)", '\r');
2732         Perl_croak(aTHX_
2733       "\t(Maybe you didn't strip carriage returns after a network transfer?)\n");
2734 #endif
2735     case ' ': case '\t': case '\f': case 013:
2736 #ifdef MACOS_TRADITIONAL
2737     case '\312':
2738 #endif
2739         s++;
2740         goto retry;
2741     case '#':
2742     case '\n':
2743         if (PL_lex_state != LEX_NORMAL || (PL_in_eval && !PL_rsfp)) {
2744             if (*s == '#' && s == PL_linestart && PL_in_eval && !PL_rsfp) {
2745                 /* handle eval qq[#line 1 "foo"\n ...] */
2746                 CopLINE_dec(PL_curcop);
2747                 incline(s);
2748             }
2749             d = PL_bufend;
2750             while (s < d && *s != '\n')
2751                 s++;
2752             if (s < d)
2753                 s++;
2754             else if (s > d) /* Found by Ilya: feed random input to Perl. */
2755               Perl_croak(aTHX_ "panic: input overflow");
2756             incline(s);
2757             if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
2758                 PL_bufptr = s;
2759                 PL_lex_state = LEX_FORMLINE;
2760                 return yylex();
2761             }
2762         }
2763         else {
2764             *s = '\0';
2765             PL_bufend = s;
2766         }
2767         goto retry;
2768     case '-':
2769         if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
2770             I32 ftst = 0;
2771
2772             s++;
2773             PL_bufptr = s;
2774             tmp = *s++;
2775
2776             while (s < PL_bufend && SPACE_OR_TAB(*s))
2777                 s++;
2778
2779             if (strnEQ(s,"=>",2)) {
2780                 s = force_word(PL_bufptr,WORD,FALSE,FALSE,FALSE);
2781                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
2782                             "### Saw unary minus before =>, forcing word '%s'\n", s);
2783                 } );
2784                 OPERATOR('-');          /* unary minus */
2785             }
2786             PL_last_uni = PL_oldbufptr;
2787             switch (tmp) {
2788             case 'r': ftst = OP_FTEREAD;        break;
2789             case 'w': ftst = OP_FTEWRITE;       break;
2790             case 'x': ftst = OP_FTEEXEC;        break;
2791             case 'o': ftst = OP_FTEOWNED;       break;
2792             case 'R': ftst = OP_FTRREAD;        break;
2793             case 'W': ftst = OP_FTRWRITE;       break;
2794             case 'X': ftst = OP_FTREXEC;        break;
2795             case 'O': ftst = OP_FTROWNED;       break;
2796             case 'e': ftst = OP_FTIS;           break;
2797             case 'z': ftst = OP_FTZERO;         break;
2798             case 's': ftst = OP_FTSIZE;         break;
2799             case 'f': ftst = OP_FTFILE;         break;
2800             case 'd': ftst = OP_FTDIR;          break;
2801             case 'l': ftst = OP_FTLINK;         break;
2802             case 'p': ftst = OP_FTPIPE;         break;
2803             case 'S': ftst = OP_FTSOCK;         break;
2804             case 'u': ftst = OP_FTSUID;         break;
2805             case 'g': ftst = OP_FTSGID;         break;
2806             case 'k': ftst = OP_FTSVTX;         break;
2807             case 'b': ftst = OP_FTBLK;          break;
2808             case 'c': ftst = OP_FTCHR;          break;
2809             case 't': ftst = OP_FTTTY;          break;
2810             case 'T': ftst = OP_FTTEXT;         break;
2811             case 'B': ftst = OP_FTBINARY;       break;
2812             case 'M': case 'A': case 'C':
2813                 gv_fetchpv("\024",TRUE, SVt_PV);
2814                 switch (tmp) {
2815                 case 'M': ftst = OP_FTMTIME;    break;
2816                 case 'A': ftst = OP_FTATIME;    break;
2817                 case 'C': ftst = OP_FTCTIME;    break;
2818                 default:                        break;
2819                 }
2820                 break;
2821             default:
2822                 break;
2823             }
2824             if (ftst) {
2825                 PL_last_lop_op = ftst;
2826                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
2827                         "### Saw file test %c\n", (int)ftst);
2828                 } );
2829                 FTST(ftst);
2830             }
2831             else {
2832                 /* Assume it was a minus followed by a one-letter named
2833                  * subroutine call (or a -bareword), then. */
2834                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
2835                         "### %c looked like a file test but was not\n",
2836                         (int)ftst);
2837                 } );
2838                 s -= 2;
2839             }
2840         }
2841         tmp = *s++;
2842         if (*s == tmp) {
2843             s++;
2844             if (PL_expect == XOPERATOR)
2845                 TERM(POSTDEC);
2846             else
2847                 OPERATOR(PREDEC);
2848         }
2849         else if (*s == '>') {
2850             s++;
2851             s = skipspace(s);
2852             if (isIDFIRST_lazy_if(s,UTF)) {
2853                 s = force_word(s,METHOD,FALSE,TRUE,FALSE);
2854                 TOKEN(ARROW);
2855             }
2856             else if (*s == '$')
2857                 OPERATOR(ARROW);
2858             else
2859                 TERM(ARROW);
2860         }
2861         if (PL_expect == XOPERATOR)
2862             Aop(OP_SUBTRACT);
2863         else {
2864             if (isSPACE(*s) || !isSPACE(*PL_bufptr))
2865                 check_uni();
2866             OPERATOR('-');              /* unary minus */
2867         }
2868
2869     case '+':
2870         tmp = *s++;
2871         if (*s == tmp) {
2872             s++;
2873             if (PL_expect == XOPERATOR)
2874                 TERM(POSTINC);
2875             else
2876                 OPERATOR(PREINC);
2877         }
2878         if (PL_expect == XOPERATOR)
2879             Aop(OP_ADD);
2880         else {
2881             if (isSPACE(*s) || !isSPACE(*PL_bufptr))
2882                 check_uni();
2883             OPERATOR('+');
2884         }
2885
2886     case '*':
2887         if (PL_expect != XOPERATOR) {
2888             s = scan_ident(s, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
2889             PL_expect = XOPERATOR;
2890             force_ident(PL_tokenbuf, '*');
2891             if (!*PL_tokenbuf)
2892                 PREREF('*');
2893             TERM('*');
2894         }
2895         s++;
2896         if (*s == '*') {
2897             s++;
2898             PWop(OP_POW);
2899         }
2900         Mop(OP_MULTIPLY);
2901
2902     case '%':
2903         if (PL_expect == XOPERATOR) {
2904             ++s;
2905             Mop(OP_MODULO);
2906         }
2907         PL_tokenbuf[0] = '%';
2908         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, TRUE);
2909         if (!PL_tokenbuf[1]) {
2910             if (s == PL_bufend)
2911                 yyerror("Final % should be \\% or %name");
2912             PREREF('%');
2913         }
2914         PL_pending_ident = '%';
2915         TERM('%');
2916
2917     case '^':
2918         s++;
2919         BOop(OP_BIT_XOR);
2920     case '[':
2921         PL_lex_brackets++;
2922         /* FALL THROUGH */
2923     case '~':
2924     case ',':
2925         tmp = *s++;
2926         OPERATOR(tmp);
2927     case ':':
2928         if (s[1] == ':') {
2929             len = 0;
2930             goto just_a_word;
2931         }
2932         s++;
2933         switch (PL_expect) {
2934             OP *attrs;
2935         case XOPERATOR:
2936             if (!PL_in_my || PL_lex_state != LEX_NORMAL)
2937                 break;
2938             PL_bufptr = s;      /* update in case we back off */
2939             goto grabattrs;
2940         case XATTRBLOCK:
2941             PL_expect = XBLOCK;
2942             goto grabattrs;
2943         case XATTRTERM:
2944             PL_expect = XTERMBLOCK;
2945          grabattrs:
2946             s = skipspace(s);
2947             attrs = Nullop;
2948             while (isIDFIRST_lazy_if(s,UTF)) {
2949                 d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
2950                 if (isLOWER(*s) && (tmp = keyword(PL_tokenbuf, len))) {
2951                     if (tmp < 0) tmp = -tmp;
2952                     switch (tmp) {
2953                     case KEY_or:
2954                     case KEY_and:
2955                     case KEY_for:
2956                     case KEY_unless:
2957                     case KEY_if:
2958                     case KEY_while:
2959                     case KEY_until:
2960                         goto got_attrs;
2961                     default:
2962                         break;
2963                     }
2964                 }
2965                 if (*d == '(') {
2966                     d = scan_str(d,TRUE,TRUE);
2967                     if (!d) {
2968                         /* MUST advance bufptr here to avoid bogus
2969                            "at end of line" context messages from yyerror().
2970                          */
2971                         PL_bufptr = s + len;
2972                         yyerror("Unterminated attribute parameter in attribute list");
2973                         if (attrs)
2974                             op_free(attrs);
2975                         return 0;       /* EOF indicator */
2976                     }
2977                 }
2978                 if (PL_lex_stuff) {
2979                     SV *sv = newSVpvn(s, len);
2980                     sv_catsv(sv, PL_lex_stuff);
2981                     attrs = append_elem(OP_LIST, attrs,
2982                                         newSVOP(OP_CONST, 0, sv));
2983                     SvREFCNT_dec(PL_lex_stuff);
2984                     PL_lex_stuff = Nullsv;
2985                 }
2986                 else {
2987                     if (!PL_in_my && len == 6 && strnEQ(s, "lvalue", len))
2988                         CvLVALUE_on(PL_compcv);
2989                     else if (!PL_in_my && len == 6 && strnEQ(s, "locked", len))
2990                         CvLOCKED_on(PL_compcv);
2991                     else if (!PL_in_my && len == 6 && strnEQ(s, "method", len))
2992                         CvMETHOD_on(PL_compcv);
2993 #ifdef USE_ITHREADS
2994       else if (PL_in_my == KEY_our && len == 6 && strnEQ(s, "unique", len))
2995                         GvUNIQUE_on(cGVOPx_gv(yylval.opval));
2996 #endif
2997                     /* After we've set the flags, it could be argued that
2998                        we don't need to do the attributes.pm-based setting
2999                        process, and shouldn't bother appending recognized
3000                        flags. To experiment with that, uncomment the
3001                        following "else": */
3002                     else
3003                         attrs = append_elem(OP_LIST, attrs,
3004                                             newSVOP(OP_CONST, 0,
3005                                                     newSVpvn(s, len)));
3006                 }
3007                 s = skipspace(d);
3008                 if (*s == ':' && s[1] != ':')
3009                     s = skipspace(s+1);
3010                 else if (s == d)
3011                     break;      /* require real whitespace or :'s */
3012             }
3013             tmp = (PL_expect == XOPERATOR ? '=' : '{'); /*'}(' for vi */
3014             if (*s != ';' && *s != tmp && (tmp != '=' || *s != ')')) {
3015                 char q = ((*s == '\'') ? '"' : '\'');
3016                 /* If here for an expression, and parsed no attrs, back off. */
3017                 if (tmp == '=' && !attrs) {
3018                     s = PL_bufptr;
3019                     break;
3020                 }
3021                 /* MUST advance bufptr here to avoid bogus "at end of line"
3022                    context messages from yyerror().
3023                  */
3024                 PL_bufptr = s;
3025                 if (!*s)
3026                     yyerror("Unterminated attribute list");
3027                 else
3028                     yyerror(Perl_form(aTHX_ "Invalid separator character %c%c%c in attribute list",
3029                                       q, *s, q));
3030                 if (attrs)
3031                     op_free(attrs);
3032                 OPERATOR(':');
3033             }
3034         got_attrs:
3035             if (attrs) {
3036                 PL_nextval[PL_nexttoke].opval = attrs;
3037                 force_next(THING);
3038             }
3039             TOKEN(COLONATTR);
3040         }
3041         OPERATOR(':');
3042     case '(':
3043         s++;
3044         if (PL_last_lop == PL_oldoldbufptr || PL_last_uni == PL_oldoldbufptr)
3045             PL_oldbufptr = PL_oldoldbufptr;             /* allow print(STDOUT 123) */
3046         else
3047             PL_expect = XTERM;
3048         TOKEN('(');
3049     case ';':
3050         CLINE;
3051         tmp = *s++;
3052         OPERATOR(tmp);
3053     case ')':
3054         tmp = *s++;
3055         s = skipspace(s);
3056         if (*s == '{')
3057             PREBLOCK(tmp);
3058         TERM(tmp);
3059     case ']':
3060         s++;
3061         if (PL_lex_brackets <= 0)
3062             yyerror("Unmatched right square bracket");
3063         else
3064             --PL_lex_brackets;
3065         if (PL_lex_state == LEX_INTERPNORMAL) {
3066             if (PL_lex_brackets == 0) {
3067                 if (*s != '[' && *s != '{' && (*s != '-' || s[1] != '>'))
3068                     PL_lex_state = LEX_INTERPEND;
3069             }
3070         }
3071         TERM(']');
3072     case '{':
3073       leftbracket:
3074         s++;
3075         if (PL_lex_brackets > 100) {
3076             char* newlb = Renew(PL_lex_brackstack, PL_lex_brackets + 1, char);
3077             if (newlb != PL_lex_brackstack) {
3078                 SAVEFREEPV(newlb);
3079                 PL_lex_brackstack = newlb;
3080             }
3081         }
3082         switch (PL_expect) {
3083         case XTERM:
3084             if (PL_lex_formbrack) {
3085                 s--;
3086                 PRETERMBLOCK(DO);
3087             }
3088             if (PL_oldoldbufptr == PL_last_lop)
3089                 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
3090             else
3091                 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
3092             OPERATOR(HASHBRACK);
3093         case XOPERATOR:
3094             while (s < PL_bufend && SPACE_OR_TAB(*s))
3095                 s++;
3096             d = s;
3097             PL_tokenbuf[0] = '\0';
3098             if (d < PL_bufend && *d == '-') {
3099                 PL_tokenbuf[0] = '-';
3100                 d++;
3101                 while (d < PL_bufend && SPACE_OR_TAB(*d))
3102                     d++;
3103             }
3104             if (d < PL_bufend && isIDFIRST_lazy_if(d,UTF)) {
3105                 d = scan_word(d, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
3106                               FALSE, &len);
3107                 while (d < PL_bufend && SPACE_OR_TAB(*d))
3108                     d++;
3109                 if (*d == '}') {
3110                     char minus = (PL_tokenbuf[0] == '-');
3111                     s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
3112                     if (minus)
3113                         force_next('-');
3114                 }
3115             }
3116             /* FALL THROUGH */
3117         case XATTRBLOCK:
3118         case XBLOCK:
3119             PL_lex_brackstack[PL_lex_brackets++] = XSTATE;
3120             PL_expect = XSTATE;
3121             break;
3122         case XATTRTERM:
3123         case XTERMBLOCK:
3124             PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
3125             PL_expect = XSTATE;
3126             break;
3127         default: {
3128                 char *t;
3129                 if (PL_oldoldbufptr == PL_last_lop)
3130                     PL_lex_brackstack[PL_lex_brackets++] = XTERM;
3131                 else
3132                     PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
3133                 s = skipspace(s);
3134                 if (*s == '}') {
3135                     if (PL_expect == XREF && PL_lex_state == LEX_INTERPNORMAL) {
3136                         PL_expect = XTERM;
3137                         /* This hack is to get the ${} in the message. */
3138                         PL_bufptr = s+1;
3139                         yyerror("syntax error");
3140                         break;
3141                     }
3142                     OPERATOR(HASHBRACK);
3143                 }
3144                 /* This hack serves to disambiguate a pair of curlies
3145                  * as being a block or an anon hash.  Normally, expectation
3146                  * determines that, but in cases where we're not in a
3147                  * position to expect anything in particular (like inside
3148                  * eval"") we have to resolve the ambiguity.  This code
3149                  * covers the case where the first term in the curlies is a
3150                  * quoted string.  Most other cases need to be explicitly
3151                  * disambiguated by prepending a `+' before the opening
3152                  * curly in order to force resolution as an anon hash.
3153                  *
3154                  * XXX should probably propagate the outer expectation
3155                  * into eval"" to rely less on this hack, but that could
3156                  * potentially break current behavior of eval"".
3157                  * GSAR 97-07-21
3158                  */
3159                 t = s;
3160                 if (*s == '\'' || *s == '"' || *s == '`') {
3161                     /* common case: get past first string, handling escapes */
3162                     for (t++; t < PL_bufend && *t != *s;)
3163                         if (*t++ == '\\' && (*t == '\\' || *t == *s))
3164                             t++;
3165                     t++;
3166                 }
3167                 else if (*s == 'q') {
3168                     if (++t < PL_bufend
3169                         && (!isALNUM(*t)
3170                             || ((*t == 'q' || *t == 'x') && ++t < PL_bufend
3171                                 && !isALNUM(*t))))
3172                     {
3173                         char *tmps;
3174                         char open, close, term;
3175                         I32 brackets = 1;
3176
3177                         while (t < PL_bufend && isSPACE(*t))
3178                             t++;
3179                         term = *t;
3180                         open = term;
3181                         if (term && (tmps = strchr("([{< )]}> )]}>",term)))
3182                             term = tmps[5];
3183                         close = term;
3184                         if (open == close)
3185                             for (t++; t < PL_bufend; t++) {
3186                                 if (*t == '\\' && t+1 < PL_bufend && open != '\\')
3187                                     t++;
3188                                 else if (*t == open)
3189                                     break;
3190                             }
3191                         else
3192                             for (t++; t < PL_bufend; t++) {
3193                                 if (*t == '\\' && t+1 < PL_bufend)
3194                                     t++;
3195                                 else if (*t == close && --brackets <= 0)
3196                                     break;
3197                                 else if (*t == open)
3198                                     brackets++;
3199                             }
3200                     }
3201                     t++;
3202                 }
3203                 else if (isALNUM_lazy_if(t,UTF)) {
3204                     t += UTF8SKIP(t);
3205                     while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
3206                          t += UTF8SKIP(t);
3207                 }
3208                 while (t < PL_bufend && isSPACE(*t))
3209                     t++;
3210                 /* if comma follows first term, call it an anon hash */
3211                 /* XXX it could be a comma expression with loop modifiers */
3212                 if (t < PL_bufend && ((*t == ',' && (*s == 'q' || !isLOWER(*s)))
3213                                    || (*t == '=' && t[1] == '>')))
3214                     OPERATOR(HASHBRACK);
3215                 if (PL_expect == XREF)
3216                     PL_expect = XTERM;
3217                 else {
3218                     PL_lex_brackstack[PL_lex_brackets-1] = XSTATE;
3219                     PL_expect = XSTATE;
3220                 }
3221             }
3222             break;
3223         }
3224         yylval.ival = CopLINE(PL_curcop);
3225         if (isSPACE(*s) || *s == '#')
3226             PL_copline = NOLINE;   /* invalidate current command line number */
3227         TOKEN('{');
3228     case '}':
3229       rightbracket:
3230         s++;
3231         if (PL_lex_brackets <= 0)
3232             yyerror("Unmatched right curly bracket");
3233         else
3234             PL_expect = (expectation)PL_lex_brackstack[--PL_lex_brackets];
3235         if (PL_lex_brackets < PL_lex_formbrack && PL_lex_state != LEX_INTERPNORMAL)
3236             PL_lex_formbrack = 0;
3237         if (PL_lex_state == LEX_INTERPNORMAL) {
3238             if (PL_lex_brackets == 0) {
3239                 if (PL_expect & XFAKEBRACK) {
3240                     PL_expect &= XENUMMASK;
3241                     PL_lex_state = LEX_INTERPEND;
3242                     PL_bufptr = s;
3243                     return yylex();     /* ignore fake brackets */
3244                 }
3245                 if (*s == '-' && s[1] == '>')
3246                     PL_lex_state = LEX_INTERPENDMAYBE;
3247                 else if (*s != '[' && *s != '{')
3248                     PL_lex_state = LEX_INTERPEND;
3249             }
3250         }
3251         if (PL_expect & XFAKEBRACK) {
3252             PL_expect &= XENUMMASK;
3253             PL_bufptr = s;
3254             return yylex();             /* ignore fake brackets */
3255         }
3256         force_next('}');
3257         TOKEN(';');
3258     case '&':
3259         s++;
3260         tmp = *s++;
3261         if (tmp == '&')
3262             AOPERATOR(ANDAND);
3263         s--;
3264         if (PL_expect == XOPERATOR) {
3265             if (ckWARN(WARN_SEMICOLON)
3266                 && isIDFIRST_lazy_if(s,UTF) && PL_bufptr == PL_linestart)
3267             {
3268                 CopLINE_dec(PL_curcop);
3269                 Perl_warner(aTHX_ WARN_SEMICOLON, PL_warn_nosemi);
3270                 CopLINE_inc(PL_curcop);
3271             }
3272             BAop(OP_BIT_AND);
3273         }
3274
3275         s = scan_ident(s - 1, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
3276         if (*PL_tokenbuf) {
3277             PL_expect = XOPERATOR;
3278             force_ident(PL_tokenbuf, '&');
3279         }
3280         else
3281             PREREF('&');
3282         yylval.ival = (OPpENTERSUB_AMPER<<8);
3283         TERM('&');
3284
3285     case '|':
3286         s++;
3287         tmp = *s++;
3288         if (tmp == '|')
3289             AOPERATOR(OROR);
3290         s--;
3291         BOop(OP_BIT_OR);
3292     case '=':
3293         s++;
3294         tmp = *s++;
3295         if (tmp == '=')
3296             Eop(OP_EQ);
3297         if (tmp == '>')
3298             OPERATOR(',');
3299         if (tmp == '~')
3300             PMop(OP_MATCH);
3301         if (ckWARN(WARN_SYNTAX) && tmp && isSPACE(*s) && strchr("+-*/%.^&|<",tmp))
3302             Perl_warner(aTHX_ WARN_SYNTAX, "Reversed %c= operator",(int)tmp);
3303         s--;
3304         if (PL_expect == XSTATE && isALPHA(tmp) &&
3305                 (s == PL_linestart+1 || s[-2] == '\n') )
3306         {
3307             if (PL_in_eval && !PL_rsfp) {
3308                 d = PL_bufend;
3309                 while (s < d) {
3310                     if (*s++ == '\n') {
3311                         incline(s);
3312                         if (strnEQ(s,"=cut",4)) {
3313                             s = strchr(s,'\n');
3314                             if (s)
3315                                 s++;
3316                             else
3317                                 s = d;
3318                             incline(s);
3319                             goto retry;
3320                         }
3321                     }
3322                 }
3323                 goto retry;
3324             }
3325             s = PL_bufend;
3326             PL_doextract = TRUE;
3327             goto retry;
3328         }
3329         if (PL_lex_brackets < PL_lex_formbrack) {
3330             char *t;
3331 #ifdef PERL_STRICT_CR
3332             for (t = s; SPACE_OR_TAB(*t); t++) ;
3333 #else
3334             for (t = s; SPACE_OR_TAB(*t) || *t == '\r'; t++) ;
3335 #endif
3336             if (*t == '\n' || *t == '#') {
3337                 s--;
3338                 PL_expect = XBLOCK;
3339                 goto leftbracket;
3340             }
3341         }
3342         yylval.ival = 0;
3343         OPERATOR(ASSIGNOP);
3344     case '!':
3345         s++;
3346         tmp = *s++;
3347         if (tmp == '=')
3348             Eop(OP_NE);
3349         if (tmp == '~')
3350             PMop(OP_NOT);
3351         s--;
3352         OPERATOR('!');
3353     case '<':
3354         if (PL_expect != XOPERATOR) {
3355             if (s[1] != '<' && !strchr(s,'>'))
3356                 check_uni();
3357             if (s[1] == '<')
3358                 s = scan_heredoc(s);
3359             else
3360                 s = scan_inputsymbol(s);
3361             TERM(sublex_start());
3362         }
3363         s++;
3364         tmp = *s++;
3365         if (tmp == '<')
3366             SHop(OP_LEFT_SHIFT);
3367         if (tmp == '=') {
3368             tmp = *s++;
3369             if (tmp == '>')
3370                 Eop(OP_NCMP);
3371             s--;
3372             Rop(OP_LE);
3373         }
3374         s--;
3375         Rop(OP_LT);
3376     case '>':
3377         s++;
3378         tmp = *s++;
3379         if (tmp == '>')
3380             SHop(OP_RIGHT_SHIFT);
3381         if (tmp == '=')
3382             Rop(OP_GE);
3383         s--;
3384         Rop(OP_GT);
3385
3386     case '$':
3387         CLINE;
3388
3389         if (PL_expect == XOPERATOR) {
3390             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3391                 PL_expect = XTERM;
3392                 depcom();
3393                 return ','; /* grandfather non-comma-format format */
3394             }
3395         }
3396
3397         if (s[1] == '#' && (isIDFIRST_lazy_if(s+2,UTF) || strchr("{$:+-", s[2]))) {
3398             PL_tokenbuf[0] = '@';
3399             s = scan_ident(s + 1, PL_bufend, PL_tokenbuf + 1,
3400                            sizeof PL_tokenbuf - 1, FALSE);
3401             if (PL_expect == XOPERATOR)
3402                 no_op("Array length", s);
3403             if (!PL_tokenbuf[1])
3404                 PREREF(DOLSHARP);
3405             PL_expect = XOPERATOR;
3406             PL_pending_ident = '#';
3407             TOKEN(DOLSHARP);
3408         }
3409
3410         PL_tokenbuf[0] = '$';
3411         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
3412                        sizeof PL_tokenbuf - 1, FALSE);
3413         if (PL_expect == XOPERATOR)
3414             no_op("Scalar", s);
3415         if (!PL_tokenbuf[1]) {
3416             if (s == PL_bufend)
3417                 yyerror("Final $ should be \\$ or $name");
3418             PREREF('$');
3419         }
3420
3421         /* This kludge not intended to be bulletproof. */
3422         if (PL_tokenbuf[1] == '[' && !PL_tokenbuf[2]) {
3423             yylval.opval = newSVOP(OP_CONST, 0,
3424                                    newSViv(PL_compiling.cop_arybase));
3425             yylval.opval->op_private = OPpCONST_ARYBASE;
3426             TERM(THING);
3427         }
3428
3429         d = s;
3430         tmp = (I32)*s;
3431         if (PL_lex_state == LEX_NORMAL)
3432             s = skipspace(s);
3433
3434         if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
3435             char *t;
3436             if (*s == '[') {
3437                 PL_tokenbuf[0] = '@';
3438                 if (ckWARN(WARN_SYNTAX)) {
3439                     for(t = s + 1;
3440                         isSPACE(*t) || isALNUM_lazy_if(t,UTF) || *t == '$';
3441                         t++) ;
3442                     if (*t++ == ',') {
3443                         PL_bufptr = skipspace(PL_bufptr);
3444                         while (t < PL_bufend && *t != ']')
3445                             t++;
3446                         Perl_warner(aTHX_ WARN_SYNTAX,
3447                                 "Multidimensional syntax %.*s not supported",
3448                                 (t - PL_bufptr) + 1, PL_bufptr);
3449                     }
3450                 }
3451             }
3452             else if (*s == '{') {
3453                 PL_tokenbuf[0] = '%';
3454                 if (ckWARN(WARN_SYNTAX) && strEQ(PL_tokenbuf+1, "SIG") &&
3455                     (t = strchr(s, '}')) && (t = strchr(t, '=')))
3456                 {
3457                     char tmpbuf[sizeof PL_tokenbuf];
3458                     STRLEN len;
3459                     for (t++; isSPACE(*t); t++) ;
3460                     if (isIDFIRST_lazy_if(t,UTF)) {
3461                         t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE, &len);
3462                         for (; isSPACE(*t); t++) ;
3463                         if (*t == ';' && get_cv(tmpbuf, FALSE))
3464                             Perl_warner(aTHX_ WARN_SYNTAX,
3465                                 "You need to quote \"%s\"", tmpbuf);
3466                     }
3467                 }
3468             }
3469         }
3470
3471         PL_expect = XOPERATOR;
3472         if (PL_lex_state == LEX_NORMAL && isSPACE((char)tmp)) {
3473             bool islop = (PL_last_lop == PL_oldoldbufptr);
3474             if (!islop || PL_last_lop_op == OP_GREPSTART)
3475                 PL_expect = XOPERATOR;
3476             else if (strchr("$@\"'`q", *s))
3477                 PL_expect = XTERM;              /* e.g. print $fh "foo" */
3478             else if (strchr("&*<%", *s) && isIDFIRST_lazy_if(s+1,UTF))
3479                 PL_expect = XTERM;              /* e.g. print $fh &sub */
3480             else if (isIDFIRST_lazy_if(s,UTF)) {
3481                 char tmpbuf[sizeof PL_tokenbuf];
3482                 scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
3483                 if ((tmp = keyword(tmpbuf, len))) {
3484                     /* binary operators exclude handle interpretations */
3485                     switch (tmp) {
3486                     case -KEY_x:
3487                     case -KEY_eq:
3488                     case -KEY_ne:
3489                     case -KEY_gt:
3490                     case -KEY_lt:
3491                     case -KEY_ge:
3492                     case -KEY_le:
3493                     case -KEY_cmp:
3494                         break;
3495                     default:
3496                         PL_expect = XTERM;      /* e.g. print $fh length() */
3497                         break;
3498                     }
3499                 }
3500                 else {
3501                     GV *gv = gv_fetchpv(tmpbuf, FALSE, SVt_PVCV);
3502                     if (gv && GvCVu(gv))
3503                         PL_expect = XTERM;      /* e.g. print $fh subr() */
3504                 }
3505             }
3506             else if (isDIGIT(*s))
3507                 PL_expect = XTERM;              /* e.g. print $fh 3 */
3508             else if (*s == '.' && isDIGIT(s[1]))
3509                 PL_expect = XTERM;              /* e.g. print $fh .3 */
3510             else if (strchr("/?-+", *s) && !isSPACE(s[1]) && s[1] != '=')
3511                 PL_expect = XTERM;              /* e.g. print $fh -1 */
3512             else if (*s == '<' && s[1] == '<' && !isSPACE(s[2]) && s[2] != '=')
3513                 PL_expect = XTERM;              /* print $fh <<"EOF" */
3514         }
3515         PL_pending_ident = '$';
3516         TOKEN('$');
3517
3518     case '@':
3519         if (PL_expect == XOPERATOR)
3520             no_op("Array", s);
3521         PL_tokenbuf[0] = '@';
3522         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, FALSE);
3523         if (!PL_tokenbuf[1]) {
3524             if (s == PL_bufend)
3525                 yyerror("Final @ should be \\@ or @name");
3526             PREREF('@');
3527         }
3528         if (PL_lex_state == LEX_NORMAL)
3529             s = skipspace(s);
3530         if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
3531             if (*s == '{')
3532                 PL_tokenbuf[0] = '%';
3533
3534             /* Warn about @ where they meant $. */
3535             if (ckWARN(WARN_SYNTAX)) {
3536                 if (*s == '[' || *s == '{') {
3537                     char *t = s + 1;
3538                     while (*t && (isALNUM_lazy_if(t,UTF) || strchr(" \t$#+-'\"", *t)))
3539                         t++;
3540                     if (*t == '}' || *t == ']') {
3541                         t++;
3542                         PL_bufptr = skipspace(PL_bufptr);
3543                         Perl_warner(aTHX_ WARN_SYNTAX,
3544                             "Scalar value %.*s better written as $%.*s",
3545                             t-PL_bufptr, PL_bufptr, t-PL_bufptr-1, PL_bufptr+1);
3546                     }
3547                 }
3548             }
3549         }
3550         PL_pending_ident = '@';
3551         TERM('@');
3552
3553     case '/':                   /* may either be division or pattern */
3554     case '?':                   /* may either be conditional or pattern */
3555         if (PL_expect != XOPERATOR) {
3556             /* Disable warning on "study /blah/" */
3557             if (PL_oldoldbufptr == PL_last_uni
3558                 && (*PL_last_uni != 's' || s - PL_last_uni < 5
3559                     || memNE(PL_last_uni, "study", 5)
3560                     || isALNUM_lazy_if(PL_last_uni+5,UTF)))
3561                 check_uni();
3562             s = scan_pat(s,OP_MATCH);
3563             TERM(sublex_start());
3564         }
3565         tmp = *s++;
3566         if (tmp == '/')
3567             Mop(OP_DIVIDE);
3568         OPERATOR(tmp);
3569
3570     case '.':
3571         if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack
3572 #ifdef PERL_STRICT_CR
3573             && s[1] == '\n'
3574 #else
3575             && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n'))
3576 #endif
3577             && (s == PL_linestart || s[-1] == '\n') )
3578         {
3579             PL_lex_formbrack = 0;
3580             PL_expect = XSTATE;
3581             goto rightbracket;
3582         }
3583         if (PL_expect == XOPERATOR || !isDIGIT(s[1])) {
3584             tmp = *s++;
3585             if (*s == tmp) {
3586                 s++;
3587                 if (*s == tmp) {
3588                     s++;
3589                     yylval.ival = OPf_SPECIAL;
3590                 }
3591                 else
3592                     yylval.ival = 0;
3593                 OPERATOR(DOTDOT);
3594             }
3595             if (PL_expect != XOPERATOR)
3596                 check_uni();
3597             Aop(OP_CONCAT);
3598         }
3599         /* FALL THROUGH */
3600     case '0': case '1': case '2': case '3': case '4':
3601     case '5': case '6': case '7': case '8': case '9':
3602         s = scan_num(s, &yylval);
3603         DEBUG_T( { PerlIO_printf(Perl_debug_log,
3604                     "### Saw number in '%s'\n", s);
3605         } );
3606         if (PL_expect == XOPERATOR)
3607             no_op("Number",s);
3608         TERM(THING);
3609
3610     case '\'':
3611         s = scan_str(s,FALSE,FALSE);
3612         DEBUG_T( { PerlIO_printf(Perl_debug_log,
3613                     "### Saw string before '%s'\n", s);
3614         } );
3615         if (PL_expect == XOPERATOR) {
3616             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3617                 PL_expect = XTERM;
3618                 depcom();
3619                 return ',';     /* grandfather non-comma-format format */
3620             }
3621             else
3622                 no_op("String",s);
3623         }
3624         if (!s)
3625             missingterm((char*)0);
3626         yylval.ival = OP_CONST;
3627         TERM(sublex_start());
3628
3629     case '"':
3630         s = scan_str(s,FALSE,FALSE);
3631         DEBUG_T( { PerlIO_printf(Perl_debug_log,
3632                     "### Saw string before '%s'\n", s);
3633         } );
3634         if (PL_expect == XOPERATOR) {
3635             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3636                 PL_expect = XTERM;
3637                 depcom();
3638                 return ',';     /* grandfather non-comma-format format */
3639             }
3640             else
3641                 no_op("String",s);
3642         }
3643         if (!s)
3644             missingterm((char*)0);
3645         yylval.ival = OP_CONST;
3646         for (d = SvPV(PL_lex_stuff, len); len; len--, d++) {
3647             if (*d == '$' || *d == '@' || *d == '\\' || !UTF8_IS_INVARIANT((U8)*d)) {
3648                 yylval.ival = OP_STRINGIFY;
3649                 break;
3650             }
3651         }
3652         TERM(sublex_start());
3653
3654     case '`':
3655         s = scan_str(s,FALSE,FALSE);
3656         DEBUG_T( { PerlIO_printf(Perl_debug_log,
3657                     "### Saw backtick string before '%s'\n", s);
3658         } );
3659         if (PL_expect == XOPERATOR)
3660             no_op("Backticks",s);
3661         if (!s)
3662             missingterm((char*)0);
3663         yylval.ival = OP_BACKTICK;
3664         set_csh();
3665         TERM(sublex_start());
3666
3667     case '\\':
3668         s++;
3669         if (ckWARN(WARN_SYNTAX) && PL_lex_inwhat && isDIGIT(*s))
3670             Perl_warner(aTHX_ WARN_SYNTAX,"Can't use \\%c to mean $%c in expression",
3671                         *s, *s);
3672         if (PL_expect == XOPERATOR)
3673             no_op("Backslash",s);
3674         OPERATOR(REFGEN);
3675
3676     case 'v':
3677         if (isDIGIT(s[1]) && PL_expect != XOPERATOR) {
3678             char *start = s;
3679             start++;
3680             start++;
3681             while (isDIGIT(*start) || *start == '_')
3682                 start++;
3683             if (*start == '.' && isDIGIT(start[1])) {
3684                 s = scan_num(s, &yylval);
3685                 TERM(THING);
3686             }
3687             /* avoid v123abc() or $h{v1}, allow C<print v10;> */
3688             else if (!isALPHA(*start) && (PL_expect == XTERM || PL_expect == XREF || PL_expect == XSTATE)) {
3689                 char c = *start;
3690                 GV *gv;
3691                 *start = '\0';
3692                 gv = gv_fetchpv(s, FALSE, SVt_PVCV);
3693                 *start = c;
3694                 if (!gv) {
3695                     s = scan_num(s, &yylval);
3696                     TERM(THING);
3697                 }
3698             }
3699         }
3700         goto keylookup;
3701     case 'x':
3702         if (isDIGIT(s[1]) && PL_expect == XOPERATOR) {
3703             s++;
3704             Mop(OP_REPEAT);
3705         }
3706         goto keylookup;
3707
3708     case '_':
3709     case 'a': case 'A':
3710     case 'b': case 'B':
3711     case 'c': case 'C':
3712     case 'd': case 'D':
3713     case 'e': case 'E':
3714     case 'f': case 'F':
3715     case 'g': case 'G':
3716     case 'h': case 'H':
3717     case 'i': case 'I':
3718     case 'j': case 'J':
3719     case 'k': case 'K':
3720     case 'l': case 'L':
3721     case 'm': case 'M':
3722     case 'n': case 'N':
3723     case 'o': case 'O':
3724     case 'p': case 'P':
3725     case 'q': case 'Q':
3726     case 'r': case 'R':
3727     case 's': case 'S':
3728     case 't': case 'T':
3729     case 'u': case 'U':
3730               case 'V':
3731     case 'w': case 'W':
3732               case 'X':
3733     case 'y': case 'Y':
3734     case 'z': case 'Z':
3735
3736       keylookup: {
3737         gv = Nullgv;
3738         gvp = 0;
3739
3740         PL_bufptr = s;
3741         s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
3742
3743         /* Some keywords can be followed by any delimiter, including ':' */
3744         tmp = ((len == 1 && strchr("msyq", PL_tokenbuf[0])) ||
3745                (len == 2 && ((PL_tokenbuf[0] == 't' && PL_tokenbuf[1] == 'r') ||
3746                              (PL_tokenbuf[0] == 'q' &&
3747                               strchr("qwxr", PL_tokenbuf[1])))));
3748
3749         /* x::* is just a word, unless x is "CORE" */
3750         if (!tmp && *s == ':' && s[1] == ':' && strNE(PL_tokenbuf, "CORE"))
3751             goto just_a_word;
3752
3753         d = s;
3754         while (d < PL_bufend && isSPACE(*d))
3755                 d++;    /* no comments skipped here, or s### is misparsed */
3756
3757         /* Is this a label? */
3758         if (!tmp && PL_expect == XSTATE
3759               && d < PL_bufend && *d == ':' && *(d + 1) != ':') {
3760             s = d + 1;
3761             yylval.pval = savepv(PL_tokenbuf);
3762             CLINE;
3763             TOKEN(LABEL);
3764         }
3765
3766         /* Check for keywords */
3767         tmp = keyword(PL_tokenbuf, len);
3768
3769         /* Is this a word before a => operator? */
3770         if (*d == '=' && d[1] == '>') {
3771             CLINE;
3772             yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(PL_tokenbuf,0));
3773             yylval.opval->op_private = OPpCONST_BARE;
3774             if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
3775               SvUTF8_on(((SVOP*)yylval.opval)->op_sv);
3776             TERM(WORD);
3777         }
3778
3779         if (tmp < 0) {                  /* second-class keyword? */
3780             GV *ogv = Nullgv;   /* override (winner) */
3781             GV *hgv = Nullgv;   /* hidden (loser) */
3782             if (PL_expect != XOPERATOR && (*s != ':' || s[1] != ':')) {
3783                 CV *cv;
3784                 if ((gv = gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVCV)) &&
3785                     (cv = GvCVu(gv)))
3786                 {
3787                     if (GvIMPORTED_CV(gv))
3788                         ogv = gv;
3789                     else if (! CvMETHOD(cv))
3790                         hgv = gv;
3791                 }
3792                 if (!ogv &&
3793                     (gvp = (GV**)hv_fetch(PL_globalstash,PL_tokenbuf,len,FALSE)) &&
3794                     (gv = *gvp) != (GV*)&PL_sv_undef &&
3795                     GvCVu(gv) && GvIMPORTED_CV(gv))
3796                 {
3797                     ogv = gv;
3798                 }
3799             }
3800             if (ogv) {
3801                 tmp = 0;                /* overridden by import or by GLOBAL */
3802             }
3803             else if (gv && !gvp
3804                      && -tmp==KEY_lock  /* XXX generalizable kludge */
3805                      && GvCVu(gv)
3806                      && !hv_fetch(GvHVn(PL_incgv), "Thread.pm", 9, FALSE))
3807             {
3808                 tmp = 0;                /* any sub overrides "weak" keyword */
3809             }
3810             else {                      /* no override */
3811                 tmp = -tmp;
3812                 if (tmp == KEY_dump && ckWARN(WARN_MISC)) {
3813                     Perl_warner(aTHX_ WARN_MISC,
3814                             "dump() better written as CORE::dump()");
3815                 }
3816                 gv = Nullgv;
3817                 gvp = 0;
3818                 if (ckWARN(WARN_AMBIGUOUS) && hgv
3819                     && tmp != KEY_x && tmp != KEY_CORE) /* never ambiguous */
3820                     Perl_warner(aTHX_ WARN_AMBIGUOUS,
3821                         "Ambiguous call resolved as CORE::%s(), %s",
3822                          GvENAME(hgv), "qualify as such or use &");
3823             }
3824         }
3825
3826       reserved_word:
3827         switch (tmp) {
3828
3829         default:                        /* not a keyword */
3830           just_a_word: {
3831                 SV *sv;
3832                 int pkgname = 0;
3833                 char lastchar = (PL_bufptr == PL_oldoldbufptr ? 0 : PL_bufptr[-1]);
3834
3835                 /* Get the rest if it looks like a package qualifier */
3836
3837                 if (*s == '\'' || (*s == ':' && s[1] == ':')) {
3838                     STRLEN morelen;
3839                     s = scan_word(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len,
3840                                   TRUE, &morelen);
3841                     if (!morelen)
3842                         Perl_croak(aTHX_ "Bad name after %s%s", PL_tokenbuf,
3843                                 *s == '\'' ? "'" : "::");
3844                     len += morelen;
3845                     pkgname = 1;
3846                 }
3847
3848                 if (PL_expect == XOPERATOR) {
3849                     if (PL_bufptr == PL_linestart) {
3850                         CopLINE_dec(PL_curcop);
3851                         Perl_warner(aTHX_ WARN_SEMICOLON, PL_warn_nosemi);
3852                         CopLINE_inc(PL_curcop);
3853                     }
3854                     else
3855                         no_op("Bareword",s);
3856                 }
3857
3858                 /* Look for a subroutine with this name in current package,
3859                    unless name is "Foo::", in which case Foo is a bearword
3860                    (and a package name). */
3861
3862                 if (len > 2 &&
3863                     PL_tokenbuf[len - 2] == ':' && PL_tokenbuf[len - 1] == ':')
3864                 {
3865                     if (ckWARN(WARN_BAREWORD) && ! gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVHV))
3866                         Perl_warner(aTHX_ WARN_BAREWORD,
3867                             "Bareword \"%s\" refers to nonexistent package",
3868                              PL_tokenbuf);
3869                     len -= 2;
3870                     PL_tokenbuf[len] = '\0';
3871                     gv = Nullgv;
3872                     gvp = 0;
3873                 }
3874                 else {
3875                     len = 0;
3876                     if (!gv)
3877                         gv = gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVCV);
3878                 }
3879
3880                 /* if we saw a global override before, get the right name */
3881
3882                 if (gvp) {
3883                     sv = newSVpvn("CORE::GLOBAL::",14);
3884                     sv_catpv(sv,PL_tokenbuf);
3885                 }
3886                 else
3887                     sv = newSVpv(PL_tokenbuf,0);
3888
3889                 /* Presume this is going to be a bareword of some sort. */
3890
3891                 CLINE;
3892                 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
3893                 yylval.opval->op_private = OPpCONST_BARE;
3894
3895                 /* And if "Foo::", then that's what it certainly is. */
3896
3897                 if (len)
3898                     goto safe_bareword;
3899
3900                 /* See if it's the indirect object for a list operator. */
3901
3902                 if (PL_oldoldbufptr &&
3903                     PL_oldoldbufptr < PL_bufptr &&
3904                     (PL_oldoldbufptr == PL_last_lop
3905                      || PL_oldoldbufptr == PL_last_uni) &&
3906                     /* NO SKIPSPACE BEFORE HERE! */
3907                     (PL_expect == XREF ||
3908                      ((PL_opargs[PL_last_lop_op] >> OASHIFT)& 7) == OA_FILEREF))
3909                 {
3910                     bool immediate_paren = *s == '(';
3911
3912                     /* (Now we can afford to cross potential line boundary.) */
3913                     s = skipspace(s);
3914
3915                     /* Two barewords in a row may indicate method call. */
3916
3917                     if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') && (tmp=intuit_method(s,gv)))
3918                         return tmp;
3919
3920                     /* If not a declared subroutine, it's an indirect object. */
3921                     /* (But it's an indir obj regardless for sort.) */
3922
3923                     if ( !immediate_paren && (PL_last_lop_op == OP_SORT ||
3924                          ((!gv || !GvCVu(gv)) &&
3925                         (PL_last_lop_op != OP_MAPSTART &&
3926                          PL_last_lop_op != OP_GREPSTART))))
3927                     {
3928                         PL_expect = (PL_last_lop == PL_oldoldbufptr) ? XTERM : XOPERATOR;
3929                         goto bareword;
3930                     }
3931                 }
3932
3933                 PL_expect = XOPERATOR;
3934                 s = skipspace(s);
3935
3936                 /* Is this a word before a => operator? */
3937                 if (*s == '=' && s[1] == '>' && !pkgname) {
3938                     CLINE;
3939                     sv_setpv(((SVOP*)yylval.opval)->op_sv, PL_tokenbuf);
3940                     if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
3941                       SvUTF8_on(((SVOP*)yylval.opval)->op_sv);
3942                     TERM(WORD);
3943                 }
3944
3945                 /* If followed by a paren, it's certainly a subroutine. */
3946                 if (*s == '(') {
3947                     CLINE;
3948                     if (gv && GvCVu(gv)) {
3949                         for (d = s + 1; SPACE_OR_TAB(*d); d++) ;
3950                         if (*d == ')' && (sv = cv_const_sv(GvCV(gv)))) {
3951                             s = d + 1;
3952                             goto its_constant;
3953                         }
3954                     }
3955                     PL_nextval[PL_nexttoke].opval = yylval.opval;
3956                     PL_expect = XOPERATOR;
3957                     force_next(WORD);
3958                     yylval.ival = 0;
3959                     TOKEN('&');
3960                 }
3961
3962                 /* If followed by var or block, call it a method (unless sub) */
3963
3964                 if ((*s == '$' || *s == '{') && (!gv || !GvCVu(gv))) {
3965                     PL_last_lop = PL_oldbufptr;
3966                     PL_last_lop_op = OP_METHOD;
3967                     PREBLOCK(METHOD);
3968                 }
3969
3970                 /* If followed by a bareword, see if it looks like indir obj. */
3971
3972                 if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') && (tmp = intuit_method(s,gv)))
3973                     return tmp;
3974
3975                 /* Not a method, so call it a subroutine (if defined) */
3976
3977                 if (gv && GvCVu(gv)) {
3978                     CV* cv;
3979                     if (lastchar == '-' && ckWARN_d(WARN_AMBIGUOUS))
3980                         Perl_warner(aTHX_ WARN_AMBIGUOUS,
3981                                 "Ambiguous use of -%s resolved as -&%s()",
3982                                 PL_tokenbuf, PL_tokenbuf);
3983                     /* Check for a constant sub */
3984                     cv = GvCV(gv);
3985                     if ((sv = cv_const_sv(cv))) {
3986                   its_constant:
3987                         SvREFCNT_dec(((SVOP*)yylval.opval)->op_sv);
3988                         ((SVOP*)yylval.opval)->op_sv = SvREFCNT_inc(sv);
3989                         yylval.opval->op_private = 0;
3990                         TOKEN(WORD);
3991                     }
3992
3993                     /* Resolve to GV now. */
3994                     op_free(yylval.opval);
3995                     yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
3996                     yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
3997                     PL_last_lop = PL_oldbufptr;
3998                     PL_last_lop_op = OP_ENTERSUB;
3999                     /* Is there a prototype? */
4000                     if (SvPOK(cv)) {
4001                         STRLEN len;
4002                         char *proto = SvPV((SV*)cv, len);
4003                         if (!len)
4004                             TERM(FUNC0SUB);
4005                         if (strEQ(proto, "$"))
4006                             OPERATOR(UNIOPSUB);
4007                         if (*proto == '&' && *s == '{') {
4008                             sv_setpv(PL_subname,"__ANON__");
4009                             PREBLOCK(LSTOPSUB);
4010                         }
4011                     }
4012                     PL_nextval[PL_nexttoke].opval = yylval.opval;
4013                     PL_expect = XTERM;
4014                     force_next(WORD);
4015                     TOKEN(NOAMP);
4016                 }
4017
4018                 /* Call it a bare word */
4019
4020                 if (PL_hints & HINT_STRICT_SUBS)
4021                     yylval.opval->op_private |= OPpCONST_STRICT;
4022                 else {
4023                 bareword:
4024                     if (ckWARN(WARN_RESERVED)) {
4025                         if (lastchar != '-') {
4026                             for (d = PL_tokenbuf; *d && isLOWER(*d); d++) ;
4027                             if (!*d && strNE(PL_tokenbuf,"main"))
4028                                 Perl_warner(aTHX_ WARN_RESERVED, PL_warn_reserved,
4029                                        PL_tokenbuf);
4030                         }
4031                     }
4032                 }
4033
4034             safe_bareword:
4035                 if (lastchar && strchr("*%&", lastchar) && ckWARN_d(WARN_AMBIGUOUS)) {
4036                     Perl_warner(aTHX_ WARN_AMBIGUOUS,
4037                         "Operator or semicolon missing before %c%s",
4038                         lastchar, PL_tokenbuf);
4039                     Perl_warner(aTHX_ WARN_AMBIGUOUS,
4040                         "Ambiguous use of %c resolved as operator %c",
4041                         lastchar, lastchar);
4042                 }
4043                 TOKEN(WORD);
4044             }
4045
4046         case KEY___FILE__:
4047             yylval.opval = (OP*)newSVOP(OP_CONST, 0,
4048                                         newSVpv(CopFILE(PL_curcop),0));
4049             TERM(THING);
4050
4051         case KEY___LINE__:
4052             yylval.opval = (OP*)newSVOP(OP_CONST, 0,
4053                                     Perl_newSVpvf(aTHX_ "%"IVdf, (IV)CopLINE(PL_curcop)));
4054             TERM(THING);
4055
4056         case KEY___PACKAGE__:
4057             yylval.opval = (OP*)newSVOP(OP_CONST, 0,
4058                                         (PL_curstash
4059                                          ? newSVsv(PL_curstname)
4060                                          : &PL_sv_undef));
4061             TERM(THING);
4062
4063         case KEY___DATA__:
4064         case KEY___END__: {
4065             GV *gv;
4066
4067             /*SUPPRESS 560*/
4068             if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
4069                 char *pname = "main";
4070                 if (PL_tokenbuf[2] == 'D')
4071                     pname = HvNAME(PL_curstash ? PL_curstash : PL_defstash);
4072                 gv = gv_fetchpv(Perl_form(aTHX_ "%s::DATA", pname), TRUE, SVt_PVIO);
4073                 GvMULTI_on(gv);
4074                 if (!GvIO(gv))
4075                     GvIOp(gv) = newIO();
4076                 IoIFP(GvIOp(gv)) = PL_rsfp;
4077 #if defined(HAS_FCNTL) && defined(F_SETFD)
4078                 {
4079                     int fd = PerlIO_fileno(PL_rsfp);
4080                     fcntl(fd,F_SETFD,fd >= 3);
4081                 }
4082 #endif
4083                 /* Mark this internal pseudo-handle as clean */
4084                 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
4085                 if (PL_preprocess)
4086                     IoTYPE(GvIOp(gv)) = IoTYPE_PIPE;
4087                 else if ((PerlIO*)PL_rsfp == PerlIO_stdin())
4088                     IoTYPE(GvIOp(gv)) = IoTYPE_STD;
4089                 else
4090                     IoTYPE(GvIOp(gv)) = IoTYPE_RDONLY;
4091 #if defined(WIN32) && !defined(PERL_TEXTMODE_SCRIPTS)
4092                 /* if the script was opened in binmode, we need to revert
4093                  * it to text mode for compatibility; but only iff it has CRs
4094                  * XXX this is a questionable hack at best. */
4095                 if (PL_bufend-PL_bufptr > 2
4096                     && PL_bufend[-1] == '\n' && PL_bufend[-2] == '\r')
4097                 {
4098                     Off_t loc = 0;
4099                     if (IoTYPE(GvIOp(gv)) == IoTYPE_RDONLY) {
4100                         loc = PerlIO_tell(PL_rsfp);
4101                         (void)PerlIO_seek(PL_rsfp, 0L, 0);
4102                     }
4103 #ifdef NETWARE
4104                         if (PerlLIO_setmode(PL_rsfp, O_TEXT) != -1) {
4105 #else
4106                     if (PerlLIO_setmode(PerlIO_fileno(PL_rsfp), O_TEXT) != -1) {
4107 #endif  /* NETWARE */
4108 #ifdef PERLIO_IS_STDIO /* really? */
4109 #  if defined(__BORLANDC__)
4110                         /* XXX see note in do_binmode() */
4111                         ((FILE*)PL_rsfp)->flags &= ~_F_BIN;
4112 #  endif
4113 #endif
4114                         if (loc > 0)
4115                             PerlIO_seek(PL_rsfp, loc, 0);
4116                     }
4117                 }
4118 #endif
4119 #ifdef PERLIO_LAYERS
4120                 if (UTF && !IN_BYTES)
4121                     PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, ":utf8");
4122 #endif
4123                 PL_rsfp = Nullfp;
4124             }
4125             goto fake_eof;
4126         }
4127
4128         case KEY_AUTOLOAD:
4129         case KEY_DESTROY:
4130         case KEY_BEGIN:
4131         case KEY_CHECK:
4132         case KEY_INIT:
4133         case KEY_END:
4134             if (PL_expect == XSTATE) {
4135                 s = PL_bufptr;
4136                 goto really_sub;
4137             }
4138             goto just_a_word;
4139
4140         case KEY_CORE:
4141             if (*s == ':' && s[1] == ':') {
4142                 s += 2;
4143                 d = s;
4144                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
4145                 if (!(tmp = keyword(PL_tokenbuf, len)))
4146                     Perl_croak(aTHX_ "CORE::%s is not a keyword", PL_tokenbuf);
4147                 if (tmp < 0)
4148                     tmp = -tmp;
4149                 goto reserved_word;
4150             }
4151             goto just_a_word;
4152
4153         case KEY_abs:
4154             UNI(OP_ABS);
4155
4156         case KEY_alarm:
4157             UNI(OP_ALARM);
4158
4159         case KEY_accept:
4160             LOP(OP_ACCEPT,XTERM);
4161
4162         case KEY_and:
4163             OPERATOR(ANDOP);
4164
4165         case KEY_atan2:
4166             LOP(OP_ATAN2,XTERM);
4167
4168         case KEY_bind:
4169             LOP(OP_BIND,XTERM);
4170
4171         case KEY_binmode:
4172             LOP(OP_BINMODE,XTERM);
4173
4174         case KEY_bless:
4175             LOP(OP_BLESS,XTERM);
4176
4177         case KEY_chop:
4178             UNI(OP_CHOP);
4179
4180         case KEY_continue:
4181             PREBLOCK(CONTINUE);
4182
4183         case KEY_chdir:
4184             (void)gv_fetchpv("ENV",TRUE, SVt_PVHV);     /* may use HOME */
4185             UNI(OP_CHDIR);
4186
4187         case KEY_close:
4188             UNI(OP_CLOSE);
4189
4190         case KEY_closedir:
4191             UNI(OP_CLOSEDIR);
4192
4193         case KEY_cmp:
4194             Eop(OP_SCMP);
4195
4196         case KEY_caller:
4197             UNI(OP_CALLER);
4198
4199         case KEY_crypt:
4200 #ifdef FCRYPT
4201             if (!PL_cryptseen) {
4202                 PL_cryptseen = TRUE;
4203                 init_des();
4204             }
4205 #endif
4206             LOP(OP_CRYPT,XTERM);
4207
4208         case KEY_chmod:
4209             LOP(OP_CHMOD,XTERM);
4210
4211         case KEY_chown:
4212             LOP(OP_CHOWN,XTERM);
4213
4214         case KEY_connect:
4215             LOP(OP_CONNECT,XTERM);
4216
4217         case KEY_chr:
4218             UNI(OP_CHR);
4219
4220         case KEY_cos:
4221             UNI(OP_COS);
4222
4223         case KEY_chroot:
4224             UNI(OP_CHROOT);
4225
4226         case KEY_do:
4227             s = skipspace(s);
4228             if (*s == '{')
4229                 PRETERMBLOCK(DO);
4230             if (*s != '\'')
4231                 s = force_word(s,WORD,TRUE,TRUE,FALSE);
4232             OPERATOR(DO);
4233
4234         case KEY_die:
4235             PL_hints |= HINT_BLOCK_SCOPE;
4236             LOP(OP_DIE,XTERM);
4237
4238         case KEY_defined:
4239             UNI(OP_DEFINED);
4240
4241         case KEY_delete:
4242             UNI(OP_DELETE);
4243
4244         case KEY_dbmopen:
4245             gv_fetchpv("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
4246             LOP(OP_DBMOPEN,XTERM);
4247
4248         case KEY_dbmclose:
4249             UNI(OP_DBMCLOSE);
4250
4251         case KEY_dump:
4252             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4253             LOOPX(OP_DUMP);
4254
4255         case KEY_else:
4256             PREBLOCK(ELSE);
4257
4258         case KEY_elsif:
4259             yylval.ival = CopLINE(PL_curcop);
4260             OPERATOR(ELSIF);
4261
4262         case KEY_eq:
4263             Eop(OP_SEQ);
4264
4265         case KEY_exists:
4266             UNI(OP_EXISTS);
4267         
4268         case KEY_exit:
4269             UNI(OP_EXIT);
4270
4271         case KEY_eval:
4272             s = skipspace(s);
4273             PL_expect = (*s == '{') ? XTERMBLOCK : XTERM;
4274             UNIBRACK(OP_ENTEREVAL);
4275
4276         case KEY_eof:
4277             UNI(OP_EOF);
4278
4279         case KEY_exp:
4280             UNI(OP_EXP);
4281
4282         case KEY_each:
4283             UNI(OP_EACH);
4284
4285         case KEY_exec:
4286             set_csh();
4287             LOP(OP_EXEC,XREF);
4288
4289         case KEY_endhostent:
4290             FUN0(OP_EHOSTENT);
4291
4292         case KEY_endnetent:
4293             FUN0(OP_ENETENT);
4294
4295         case KEY_endservent:
4296             FUN0(OP_ESERVENT);
4297
4298         case KEY_endprotoent:
4299             FUN0(OP_EPROTOENT);
4300
4301         case KEY_endpwent:
4302             FUN0(OP_EPWENT);
4303
4304         case KEY_endgrent:
4305             FUN0(OP_EGRENT);
4306
4307         case KEY_for:
4308         case KEY_foreach:
4309             yylval.ival = CopLINE(PL_curcop);
4310             s = skipspace(s);
4311             if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) {
4312                 char *p = s;
4313                 if ((PL_bufend - p) >= 3 &&
4314                     strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
4315                     p += 2;
4316                 else if ((PL_bufend - p) >= 4 &&
4317                     strnEQ(p, "our", 3) && isSPACE(*(p + 3)))
4318                     p += 3;
4319                 p = skipspace(p);
4320                 if (isIDFIRST_lazy_if(p,UTF)) {
4321                     p = scan_ident(p, PL_bufend,
4322                         PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
4323                     p = skipspace(p);
4324                 }
4325                 if (*p != '$')
4326                     Perl_croak(aTHX_ "Missing $ on loop variable");
4327             }
4328             OPERATOR(FOR);
4329
4330         case KEY_formline:
4331             LOP(OP_FORMLINE,XTERM);
4332
4333         case KEY_fork:
4334             FUN0(OP_FORK);
4335
4336         case KEY_fcntl:
4337             LOP(OP_FCNTL,XTERM);
4338
4339         case KEY_fileno:
4340             UNI(OP_FILENO);
4341
4342         case KEY_flock:
4343             LOP(OP_FLOCK,XTERM);
4344
4345         case KEY_gt:
4346             Rop(OP_SGT);
4347
4348         case KEY_ge:
4349             Rop(OP_SGE);
4350
4351         case KEY_grep:
4352             LOP(OP_GREPSTART, XREF);
4353
4354         case KEY_goto:
4355             s = force_word(s,WORD,TRUE,FALSE,FALSE);
4356             LOOPX(OP_GOTO);