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