3 * Copyright (c) 1991-1997, Larry Wall
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.
11 * "It all comes from here, the stench and the peril." --Frodo
17 #define yychar PL_yychar
18 #define yylval PL_yylval
21 static void check_uni _((void));
22 static void force_next _((I32 type));
23 static char *force_version _((char *start));
24 static char *force_word _((char *start, int token, int check_keyword, int allow_pack, int allow_tick));
25 static SV *tokeq _((SV *sv));
26 static char *scan_const _((char *start));
27 static char *scan_formline _((char *s));
28 static char *scan_heredoc _((char *s));
29 static char *scan_ident _((char *s, char *send, char *dest, STRLEN destlen,
31 static char *scan_inputsymbol _((char *start));
32 static char *scan_pat _((char *start, I32 type));
33 static char *scan_str _((char *start));
34 static char *scan_subst _((char *start));
35 static char *scan_trans _((char *start));
36 static char *scan_word _((char *s, char *dest, STRLEN destlen,
37 int allow_package, STRLEN *slp));
38 static char *skipspace _((char *s));
39 static void checkcomma _((char *s, char *name, char *what));
40 static void force_ident _((char *s, int kind));
41 static void incline _((char *s));
42 static int intuit_method _((char *s, GV *gv));
43 static int intuit_more _((char *s));
44 static I32 lop _((I32 f, expectation x, char *s));
45 static void missingterm _((char *s));
46 static void no_op _((char *what, char *s));
47 static void set_csh _((void));
48 static I32 sublex_done _((void));
49 static I32 sublex_push _((void));
50 static I32 sublex_start _((void));
52 static int uni _((I32 f, char *s));
54 static char * filter_gets _((SV *sv, PerlIO *fp, STRLEN append));
55 static void restore_rsfp _((void *f));
56 static SV *new_constant _((char *s, STRLEN len, char *key, SV *sv, SV *pv, char *type));
57 static void restore_expect _((void *e));
58 static void restore_lex_expect _((void *e));
59 #endif /* PERL_OBJECT */
61 static char ident_too_long[] = "Identifier too long";
63 #define UTF (PL_hints & HINT_UTF8)
65 * Note: we try to be careful never to call the isXXX_utf8() functions
66 * unless we're pretty sure we've seen the beginning of a UTF-8 character
67 * (that is, the two high bits are set). Otherwise we risk loading in the
68 * heavy-duty SWASHINIT and SWASHGET routines unnecessarily.
70 #define isIDFIRST_lazy(p) ((!UTF || (*((U8*)p) < 0xc0)) \
72 : isIDFIRST_utf8((U8*)p))
73 #define isALNUM_lazy(p) ((!UTF || (*((U8*)p) < 0xc0)) \
75 : isALNUM_utf8((U8*)p))
77 /* The following are arranged oddly so that the guard on the switch statement
78 * can get by with a single comparison (if the compiler is smart enough).
81 /* #define LEX_NOTPARSING 11 is done in perl.h. */
84 #define LEX_INTERPNORMAL 9
85 #define LEX_INTERPCASEMOD 8
86 #define LEX_INTERPPUSH 7
87 #define LEX_INTERPSTART 6
88 #define LEX_INTERPEND 5
89 #define LEX_INTERPENDMAYBE 4
90 #define LEX_INTERPCONCAT 3
91 #define LEX_INTERPCONST 2
92 #define LEX_FORMLINE 1
93 #define LEX_KNOWNEXT 0
102 /* XXX If this causes problems, set i_unistd=undef in the hint file. */
104 # include <unistd.h> /* Needed for execv() */
112 #ifdef USE_PURE_BISON
113 YYSTYPE* yylval_pointer = NULL;
114 int* yychar_pointer = NULL;
117 # define yylval (*yylval_pointer)
118 # define yychar (*yychar_pointer)
119 # define PERL_YYLEX_PARAM yylval_pointer,yychar_pointer
121 # define PERL_YYLEX_PARAM
124 #include "keywords.h"
129 #define CLINE (PL_copline = (PL_curcop->cop_line < PL_copline ? PL_curcop->cop_line : PL_copline))
131 #define TOKEN(retval) return (PL_bufptr = s,(int)retval)
132 #define OPERATOR(retval) return (PL_expect = XTERM,PL_bufptr = s,(int)retval)
133 #define AOPERATOR(retval) return ao((PL_expect = XTERM,PL_bufptr = s,(int)retval))
134 #define PREBLOCK(retval) return (PL_expect = XBLOCK,PL_bufptr = s,(int)retval)
135 #define PRETERMBLOCK(retval) return (PL_expect = XTERMBLOCK,PL_bufptr = s,(int)retval)
136 #define PREREF(retval) return (PL_expect = XREF,PL_bufptr = s,(int)retval)
137 #define TERM(retval) return (CLINE, PL_expect = XOPERATOR,PL_bufptr = s,(int)retval)
138 #define LOOPX(f) return(yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)LOOPEX)
139 #define FTST(f) return(yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)UNIOP)
140 #define FUN0(f) return(yylval.ival = f,PL_expect = XOPERATOR,PL_bufptr = s,(int)FUNC0)
141 #define FUN1(f) return(yylval.ival = f,PL_expect = XOPERATOR,PL_bufptr = s,(int)FUNC1)
142 #define BOop(f) return ao((yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)BITOROP))
143 #define BAop(f) return ao((yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)BITANDOP))
144 #define SHop(f) return ao((yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)SHIFTOP))
145 #define PWop(f) return ao((yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)POWOP))
146 #define PMop(f) return(yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)MATCHOP)
147 #define Aop(f) return ao((yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)ADDOP))
148 #define Mop(f) return ao((yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)MULOP))
149 #define Eop(f) return(yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)EQOP)
150 #define Rop(f) return(yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)RELOP)
152 /* This bit of chicanery makes a unary function followed by
153 * a parenthesis into a function with one argument, highest precedence.
155 #define UNI(f) return(yylval.ival = f, \
158 PL_last_uni = PL_oldbufptr, \
159 PL_last_lop_op = f, \
160 (*s == '(' || (s = skipspace(s), *s == '(') ? (int)FUNC1 : (int)UNIOP) )
162 #define UNIBRACK(f) return(yylval.ival = f, \
164 PL_last_uni = PL_oldbufptr, \
165 (*s == '(' || (s = skipspace(s), *s == '(') ? (int)FUNC1 : (int)UNIOP) )
167 /* grandfather return to old style */
168 #define OLDLOP(f) return(yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)LSTOP)
173 if (*PL_bufptr == '=') {
175 if (toketype == ANDAND)
176 yylval.ival = OP_ANDASSIGN;
177 else if (toketype == OROR)
178 yylval.ival = OP_ORASSIGN;
185 no_op(char *what, char *s)
187 char *oldbp = PL_bufptr;
188 bool is_first = (PL_oldbufptr == PL_linestart);
191 yywarn(form("%s found where operator expected", what));
193 warn("\t(Missing semicolon on previous line?)\n");
194 else if (PL_oldoldbufptr && isIDFIRST_lazy(PL_oldoldbufptr)) {
196 for (t = PL_oldoldbufptr; *t && (isALNUM_lazy(t) || *t == ':'); t++) ;
197 if (t < PL_bufptr && isSPACE(*t))
198 warn("\t(Do you need to predeclare %.*s?)\n",
199 t - PL_oldoldbufptr, PL_oldoldbufptr);
203 warn("\t(Missing operator before end of line?)\n");
205 warn("\t(Missing operator before %.*s?)\n", s - oldbp, oldbp);
215 char *nl = strrchr(s,'\n');
221 iscntrl(PL_multi_close)
223 PL_multi_close < 32 || PL_multi_close == 127
227 tmpbuf[1] = toCTRL(PL_multi_close);
233 *tmpbuf = PL_multi_close;
237 q = strchr(s,'"') ? '\'' : '"';
238 croak("Can't find string terminator %c%s%c anywhere before EOF",q,s,q);
245 if (ckWARN(WARN_DEPRECATED))
246 warner(WARN_DEPRECATED, "Use of %s is deprecated", s);
252 deprecate("comma-less variable list");
258 win32_textfilter(int idx, SV *sv, int maxlen)
260 I32 count = FILTER_READ(idx+1, sv, maxlen);
261 if (count > 0 && !maxlen)
262 win32_strip_return(sv);
270 utf16_textfilter(int idx, SV *sv, int maxlen)
272 I32 count = FILTER_READ(idx+1, sv, maxlen);
276 New(898, tmps, SvCUR(sv) * 3 / 2 + 1, U8);
277 tend = utf16_to_utf8((U16*)SvPVX(sv), tmps, SvCUR(sv));
278 sv_usepvn(sv, (char*)tmps, tend - tmps);
285 utf16rev_textfilter(int idx, SV *sv, int maxlen)
287 I32 count = FILTER_READ(idx+1, sv, maxlen);
291 New(898, tmps, SvCUR(sv) * 3 / 2 + 1, U8);
292 tend = utf16_to_utf8_reversed((U16*)SvPVX(sv), tmps, SvCUR(sv));
293 sv_usepvn(sv, (char*)tmps, tend - tmps);
308 SAVEI32(PL_lex_dojoin);
309 SAVEI32(PL_lex_brackets);
310 SAVEI32(PL_lex_fakebrack);
311 SAVEI32(PL_lex_casemods);
312 SAVEI32(PL_lex_starts);
313 SAVEI32(PL_lex_state);
314 SAVESPTR(PL_lex_inpat);
315 SAVEI32(PL_lex_inwhat);
316 SAVEI16(PL_curcop->cop_line);
319 SAVEPPTR(PL_oldbufptr);
320 SAVEPPTR(PL_oldoldbufptr);
321 SAVEPPTR(PL_linestart);
322 SAVESPTR(PL_linestr);
323 SAVEPPTR(PL_lex_brackstack);
324 SAVEPPTR(PL_lex_casestack);
325 SAVEDESTRUCTOR(restore_rsfp, PL_rsfp);
326 SAVESPTR(PL_lex_stuff);
327 SAVEI32(PL_lex_defer);
328 SAVESPTR(PL_lex_repl);
329 SAVEDESTRUCTOR(restore_expect, PL_tokenbuf + PL_expect); /* encode as pointer */
330 SAVEDESTRUCTOR(restore_lex_expect, PL_tokenbuf + PL_expect);
332 PL_lex_state = LEX_NORMAL;
336 PL_lex_fakebrack = 0;
337 New(899, PL_lex_brackstack, 120, char);
338 New(899, PL_lex_casestack, 12, char);
339 SAVEFREEPV(PL_lex_brackstack);
340 SAVEFREEPV(PL_lex_casestack);
342 *PL_lex_casestack = '\0';
345 PL_lex_stuff = Nullsv;
346 PL_lex_repl = Nullsv;
350 if (SvREADONLY(PL_linestr))
351 PL_linestr = sv_2mortal(newSVsv(PL_linestr));
352 s = SvPV(PL_linestr, len);
353 if (len && s[len-1] != ';') {
354 if (!(SvFLAGS(PL_linestr) & SVs_TEMP))
355 PL_linestr = sv_2mortal(newSVsv(PL_linestr));
356 sv_catpvn(PL_linestr, "\n;", 2);
358 SvTEMP_off(PL_linestr);
359 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
360 PL_bufend = PL_bufptr + SvCUR(PL_linestr);
362 PL_rs = newSVpv("\n", 1);
369 PL_doextract = FALSE;
373 restore_rsfp(void *f)
375 PerlIO *fp = (PerlIO*)f;
377 if (PL_rsfp == PerlIO_stdin())
378 PerlIO_clearerr(PL_rsfp);
379 else if (PL_rsfp && (PL_rsfp != fp))
380 PerlIO_close(PL_rsfp);
385 restore_expect(void *e)
387 /* a safe way to store a small integer in a pointer */
388 PL_expect = (expectation)((char *)e - PL_tokenbuf);
392 restore_lex_expect(void *e)
394 /* a safe way to store a small integer in a pointer */
395 PL_lex_expect = (expectation)((char *)e - PL_tokenbuf);
407 PL_curcop->cop_line++;
410 while (*s == ' ' || *s == '\t') s++;
411 if (strnEQ(s, "line ", 5)) {
420 while (*s == ' ' || *s == '\t')
422 if (*s == '"' && (t = strchr(s+1, '"')))
426 return; /* false alarm */
427 for (t = s; !isSPACE(*t); t++) ;
432 PL_curcop->cop_filegv = gv_fetchfile(s);
434 PL_curcop->cop_filegv = gv_fetchfile(PL_origfilename);
436 PL_curcop->cop_line = atoi(n)-1;
440 skipspace(register char *s)
443 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
444 while (s < PL_bufend && (*s == ' ' || *s == '\t'))
450 while (s < PL_bufend && isSPACE(*s)) {
451 if (*s++ == '\n' && PL_in_eval && !PL_rsfp)
454 if (s < PL_bufend && *s == '#') {
455 while (s < PL_bufend && *s != '\n')
459 if (PL_in_eval && !PL_rsfp) {
465 if (s < PL_bufend || !PL_rsfp || PL_lex_state != LEX_NORMAL)
467 if ((s = filter_gets(PL_linestr, PL_rsfp, (prevlen = SvCUR(PL_linestr)))) == Nullch) {
468 if (PL_minus_n || PL_minus_p) {
469 sv_setpv(PL_linestr,PL_minus_p ?
470 ";}continue{print or die qq(-p destination: $!\\n)" :
472 sv_catpv(PL_linestr,";}");
473 PL_minus_n = PL_minus_p = 0;
476 sv_setpv(PL_linestr,";");
477 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
478 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
479 if (PL_preprocess && !PL_in_eval)
480 (void)PerlProc_pclose(PL_rsfp);
481 else if ((PerlIO*)PL_rsfp == PerlIO_stdin())
482 PerlIO_clearerr(PL_rsfp);
484 (void)PerlIO_close(PL_rsfp);
488 PL_linestart = PL_bufptr = s + prevlen;
489 PL_bufend = s + SvCUR(PL_linestr);
492 if (PERLDB_LINE && PL_curstash != PL_debstash) {
493 SV *sv = NEWSV(85,0);
495 sv_upgrade(sv, SVt_PVMG);
496 sv_setpvn(sv,PL_bufptr,PL_bufend-PL_bufptr);
497 av_store(GvAV(PL_curcop->cop_filegv),(I32)PL_curcop->cop_line,sv);
508 if (PL_oldoldbufptr != PL_last_uni)
510 while (isSPACE(*PL_last_uni))
512 for (s = PL_last_uni; isALNUM_lazy(s) || *s == '-'; s++) ;
513 if ((t = strchr(s, '(')) && t < PL_bufptr)
517 warn("Warning: Use of \"%s\" without parens is ambiguous", PL_last_uni);
524 #define UNI(f) return uni(f,s)
532 PL_last_uni = PL_oldbufptr;
543 #endif /* CRIPPLED_CC */
545 #define LOP(f,x) return lop(f,x,s)
548 lop(I32 f, expectation x, char *s)
555 PL_last_lop = PL_oldbufptr;
571 PL_nexttype[PL_nexttoke] = type;
573 if (PL_lex_state != LEX_KNOWNEXT) {
574 PL_lex_defer = PL_lex_state;
575 PL_lex_expect = PL_expect;
576 PL_lex_state = LEX_KNOWNEXT;
581 force_word(register char *start, int token, int check_keyword, int allow_pack, int allow_initial_tick)
586 start = skipspace(start);
588 if (isIDFIRST_lazy(s) ||
589 (allow_pack && *s == ':') ||
590 (allow_initial_tick && *s == '\'') )
592 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, allow_pack, &len);
593 if (check_keyword && keyword(PL_tokenbuf, len))
595 if (token == METHOD) {
600 PL_expect = XOPERATOR;
605 PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST,0, newSVpv(PL_tokenbuf,0));
606 PL_nextval[PL_nexttoke].opval->op_private |= OPpCONST_BARE;
613 force_ident(register char *s, int kind)
616 OP* o = (OP*)newSVOP(OP_CONST, 0, newSVpv(s,0));
617 PL_nextval[PL_nexttoke].opval = o;
620 dTHR; /* just for in_eval */
621 o->op_private = OPpCONST_ENTERED;
622 /* XXX see note in pp_entereval() for why we forgo typo
623 warnings if the symbol must be introduced in an eval.
625 gv_fetchpv(s, PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : TRUE,
626 kind == '$' ? SVt_PV :
627 kind == '@' ? SVt_PVAV :
628 kind == '%' ? SVt_PVHV :
636 force_version(char *s)
638 OP *version = Nullop;
642 /* default VERSION number -- GBARR */
647 for( d=s, c = 1; isDIGIT(*d) || *d == '_' || (*d == '.' && c--); d++);
648 if((*d == ';' || isSPACE(*d)) && *(skipspace(d)) != ',') {
650 /* real VERSION number -- GBARR */
651 version = yylval.opval;
655 /* NOTE: The parser sees the package name and the VERSION swapped */
656 PL_nextval[PL_nexttoke].opval = version;
674 s = SvPV_force(sv, len);
678 while (s < send && *s != '\\')
683 if ( PL_hints & HINT_NEW_STRING )
684 pv = sv_2mortal(newSVpv(SvPVX(pv), len));
687 if (s + 1 < send && (s[1] == '\\'))
688 s++; /* all that, just for this */
693 SvCUR_set(sv, d - SvPVX(sv));
695 if ( PL_hints & HINT_NEW_STRING )
696 return new_constant(NULL, 0, "q", sv, pv, "q");
703 register I32 op_type = yylval.ival;
705 if (op_type == OP_NULL) {
706 yylval.opval = PL_lex_op;
710 if (op_type == OP_CONST || op_type == OP_READLINE) {
711 SV *sv = tokeq(PL_lex_stuff);
713 if (SvTYPE(sv) == SVt_PVIV) {
714 /* Overloaded constants, nothing fancy: Convert to SVt_PV: */
720 nsv = newSVpv(p, len);
724 yylval.opval = (OP*)newSVOP(op_type, 0, sv);
725 PL_lex_stuff = Nullsv;
729 PL_sublex_info.super_state = PL_lex_state;
730 PL_sublex_info.sub_inwhat = op_type;
731 PL_sublex_info.sub_op = PL_lex_op;
732 PL_lex_state = LEX_INTERPPUSH;
736 yylval.opval = PL_lex_op;
750 PL_lex_state = PL_sublex_info.super_state;
751 SAVEI32(PL_lex_dojoin);
752 SAVEI32(PL_lex_brackets);
753 SAVEI32(PL_lex_fakebrack);
754 SAVEI32(PL_lex_casemods);
755 SAVEI32(PL_lex_starts);
756 SAVEI32(PL_lex_state);
757 SAVESPTR(PL_lex_inpat);
758 SAVEI32(PL_lex_inwhat);
759 SAVEI16(PL_curcop->cop_line);
761 SAVEPPTR(PL_oldbufptr);
762 SAVEPPTR(PL_oldoldbufptr);
763 SAVEPPTR(PL_linestart);
764 SAVESPTR(PL_linestr);
765 SAVEPPTR(PL_lex_brackstack);
766 SAVEPPTR(PL_lex_casestack);
768 PL_linestr = PL_lex_stuff;
769 PL_lex_stuff = Nullsv;
771 PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
772 PL_bufend += SvCUR(PL_linestr);
773 SAVEFREESV(PL_linestr);
775 PL_lex_dojoin = FALSE;
777 PL_lex_fakebrack = 0;
778 New(899, PL_lex_brackstack, 120, char);
779 New(899, PL_lex_casestack, 12, char);
780 SAVEFREEPV(PL_lex_brackstack);
781 SAVEFREEPV(PL_lex_casestack);
783 *PL_lex_casestack = '\0';
785 PL_lex_state = LEX_INTERPCONCAT;
786 PL_curcop->cop_line = PL_multi_start;
788 PL_lex_inwhat = PL_sublex_info.sub_inwhat;
789 if (PL_lex_inwhat == OP_MATCH || PL_lex_inwhat == OP_QR || PL_lex_inwhat == OP_SUBST)
790 PL_lex_inpat = PL_sublex_info.sub_op;
792 PL_lex_inpat = Nullop;
800 if (!PL_lex_starts++) {
801 PL_expect = XOPERATOR;
802 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv("",0));
806 if (PL_lex_casemods) { /* oops, we've got some unbalanced parens */
807 PL_lex_state = LEX_INTERPCASEMOD;
808 return yylex(PERL_YYLEX_PARAM);
811 /* Is there a right-hand side to take care of? */
812 if (PL_lex_repl && (PL_lex_inwhat == OP_SUBST || PL_lex_inwhat == OP_TRANS)) {
813 PL_linestr = PL_lex_repl;
815 PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
816 PL_bufend += SvCUR(PL_linestr);
817 SAVEFREESV(PL_linestr);
818 PL_lex_dojoin = FALSE;
820 PL_lex_fakebrack = 0;
822 *PL_lex_casestack = '\0';
824 if (SvCOMPILED(PL_lex_repl)) {
825 PL_lex_state = LEX_INTERPNORMAL;
827 /* we don't clear PL_lex_repl here, so that we can check later
828 whether this is an evalled subst; that means we rely on the
829 logic to ensure sublex_done() is called again only via the
830 branch (in yylex()) that clears PL_lex_repl, else we'll loop */
833 PL_lex_state = LEX_INTERPCONCAT;
834 PL_lex_repl = Nullsv;
840 PL_bufend = SvPVX(PL_linestr);
841 PL_bufend += SvCUR(PL_linestr);
842 PL_expect = XOPERATOR;
850 Extracts a pattern, double-quoted string, or transliteration. This
853 It looks at lex_inwhat and PL_lex_inpat to find out whether it's
854 processing a pattern (PL_lex_inpat is true), a transliteration
855 (lex_inwhat & OP_TRANS is true), or a double-quoted string.
857 Returns a pointer to the character scanned up to. Iff this is
858 advanced from the start pointer supplied (ie if anything was
859 successfully parsed), will leave an OP for the substring scanned
860 in yylval. Caller must intuit reason for not parsing further
861 by looking at the next characters herself.
865 double-quoted style: \r and \n
866 regexp special ones: \D \s
868 backrefs: \1 (deprecated in substitution replacements)
869 case and quoting: \U \Q \E
870 stops on @ and $, but not for $ as tail anchor
873 characters are VERY literal, except for - not at the start or end
874 of the string, which indicates a range. scan_const expands the
875 range to the full set of intermediate characters.
877 In double-quoted strings:
879 double-quoted style: \r and \n
881 backrefs: \1 (deprecated)
882 case and quoting: \U \Q \E
885 scan_const does *not* construct ops to handle interpolated strings.
886 It stops processing as soon as it finds an embedded $ or @ variable
887 and leaves it to the caller to work out what's going on.
889 @ in pattern could be: @foo, @{foo}, @$foo, @'foo, @:foo.
891 $ in pattern could be $foo or could be tail anchor. Assumption:
892 it's a tail anchor if $ is the last thing in the string, or if it's
893 followed by one of ")| \n\t"
895 \1 (backreferences) are turned into $1
897 The structure of the code is
898 while (there's a character to process) {
899 handle transliteration ranges
901 skip # initiated comments in //x patterns
902 check for embedded @foo
903 check for embedded scalars
905 leave intact backslashes from leave (below)
906 deprecate \1 in strings and sub replacements
907 handle string-changing backslashes \l \U \Q \E, etc.
908 switch (what was escaped) {
909 handle - in a transliteration (becomes a literal -)
910 handle \132 octal characters
911 handle 0x15 hex characters
912 handle \cV (control V)
913 handle printf backslashes (\f, \r, \n, etc)
916 } (end while character to read)
921 scan_const(char *start)
923 register char *send = PL_bufend; /* end of the constant */
924 SV *sv = NEWSV(93, send - start); /* sv for the constant */
925 register char *s = start; /* start of the constant */
926 register char *d = SvPVX(sv); /* destination for copies */
927 bool dorange = FALSE; /* are we in a translit range? */
929 I32 utf = PL_lex_inwhat == OP_TRANS
930 ? (PL_sublex_info.sub_op->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF))
932 I32 thisutf = PL_lex_inwhat == OP_TRANS
933 ? (PL_sublex_info.sub_op->op_private & (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF))
936 /* leaveit is the set of acceptably-backslashed characters */
939 ? "\\.^$@AGZdDwWsSbBpPXC+*?|()-nrtfeaxcz0123456789[{]} \t\n\r\f\v#"
942 while (s < send || dorange) {
943 /* get transliterations out of the way (they're most literal) */
944 if (PL_lex_inwhat == OP_TRANS) {
945 /* expand a range A-Z to the full set of characters. AIE! */
947 I32 i; /* current expanded character */
948 I32 min; /* first character in range */
949 I32 max; /* last character in range */
951 i = d - SvPVX(sv); /* remember current offset */
952 SvGROW(sv, SvLEN(sv) + 256); /* expand the sv -- there'll never be more'n 256 chars in a range for it to grow by */
953 d = SvPVX(sv) + i; /* restore d after the grow potentially has changed the ptr */
954 d -= 2; /* eat the first char and the - */
956 min = (U8)*d; /* first char in range */
957 max = (U8)d[1]; /* last char in range */
960 if ((isLOWER(min) && isLOWER(max)) ||
961 (isUPPER(min) && isUPPER(max))) {
963 for (i = min; i <= max; i++)
967 for (i = min; i <= max; i++)
974 for (i = min; i <= max; i++)
977 /* mark the range as done, and continue */
982 /* range begins (ignore - as first or last char) */
983 else if (*s == '-' && s+1 < send && s != start) {
985 *d++ = (char)0xff; /* use illegal utf8 byte--see pmtrans */
994 /* if we get here, we're not doing a transliteration */
996 /* skip for regexp comments /(?#comment)/ and code /(?{code})/,
997 except for the last char, which will be done separately. */
998 else if (*s == '(' && PL_lex_inpat && s[1] == '?') {
1000 while (s < send && *s != ')')
1002 } else if (s[2] == '{'
1003 || s[2] == 'p' && s[3] == '{') { /* This should march regcomp.c */
1005 char *regparse = s + (s[2] == '{' ? 3 : 4);
1008 while (count && (c = *regparse)) {
1009 if (c == '\\' && regparse[1])
1017 if (*regparse != ')') {
1018 regparse--; /* Leave one char for continuation. */
1019 yyerror("Sequence (?{...}) not terminated or not {}-balanced");
1021 while (s < regparse)
1026 /* likewise skip #-initiated comments in //x patterns */
1027 else if (*s == '#' && PL_lex_inpat &&
1028 ((PMOP*)PL_lex_inpat)->op_pmflags & PMf_EXTENDED) {
1029 while (s+1 < send && *s != '\n')
1033 /* check for embedded arrays (@foo, @:foo, @'foo, @{foo}, @$foo) */
1034 else if (*s == '@' && s[1] && (isALNUM_lazy(s+1) || strchr(":'{$", s[1])))
1037 /* check for embedded scalars. only stop if we're sure it's a
1040 else if (*s == '$') {
1041 if (!PL_lex_inpat) /* not a regexp, so $ must be var */
1043 if (s + 1 < send && !strchr("()| \n\t", s[1]))
1044 break; /* in regexp, $ might be tail anchor */
1047 /* (now in tr/// code again) */
1049 if (*s & 0x80 && thisutf) {
1050 dTHR; /* only for ckWARN */
1051 if (ckWARN(WARN_UTF8)) {
1052 (void)utf8_to_uv((U8*)s, &len); /* could cvt latin-1 to utf8 here... */
1062 if (*s == '\\' && s+1 < send) {
1065 /* some backslashes we leave behind */
1066 if (*leaveit && *s && strchr(leaveit, *s)) {
1072 /* deprecate \1 in strings and substitution replacements */
1073 if (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat &&
1074 isDIGIT(*s) && *s != '0' && !isDIGIT(s[1]))
1076 dTHR; /* only for ckWARN */
1077 if (ckWARN(WARN_SYNTAX))
1078 warner(WARN_SYNTAX, "\\%c better written as $%c", *s, *s);
1083 /* string-change backslash escapes */
1084 if (PL_lex_inwhat != OP_TRANS && *s && strchr("lLuUEQ", *s)) {
1089 /* if we get here, it's either a quoted -, or a digit */
1092 /* quoted - in transliterations */
1094 if (PL_lex_inwhat == OP_TRANS) {
1102 if (ckWARN(WARN_UNSAFE) && isALPHA(*s))
1104 "Unrecognized escape \\%c passed through",
1106 /* default action is to copy the quoted character */
1111 /* \132 indicates an octal constant */
1112 case '0': case '1': case '2': case '3':
1113 case '4': case '5': case '6': case '7':
1114 *d++ = scan_oct(s, 3, &len);
1118 /* \x24 indicates a hex constant */
1122 char* e = strchr(s, '}');
1125 yyerror("Missing right brace on \\x{}");
1130 if (ckWARN(WARN_UTF8))
1132 "Use of \\x{} without utf8 declaration");
1134 /* note: utf always shorter than hex */
1135 d = (char*)uv_to_utf8((U8*)d,
1136 scan_hex(s + 1, e - s - 1, &len));
1141 UV uv = (UV)scan_hex(s, 2, &len);
1142 if (utf && PL_lex_inwhat == OP_TRANS &&
1143 utf != (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF))
1145 d = (char*)uv_to_utf8((U8*)d, uv); /* doing a CU or UC */
1148 if (uv >= 127 && UTF) {
1150 if (ckWARN(WARN_UTF8))
1152 "\\x%.*s will produce malformed UTF-8 character; use \\x{%.*s} for that",
1161 /* \c is a control character */
1175 /* printf-style backslashes, formfeeds, newlines, etc */
1201 } /* end if (backslash) */
1204 } /* while loop to process each character */
1206 /* terminate the string and set up the sv */
1208 SvCUR_set(sv, d - SvPVX(sv));
1211 /* shrink the sv if we allocated more than we used */
1212 if (SvCUR(sv) + 5 < SvLEN(sv)) {
1213 SvLEN_set(sv, SvCUR(sv) + 1);
1214 Renew(SvPVX(sv), SvLEN(sv), char);
1217 /* return the substring (via yylval) only if we parsed anything */
1218 if (s > PL_bufptr) {
1219 if ( PL_hints & ( PL_lex_inpat ? HINT_NEW_RE : HINT_NEW_STRING ) )
1220 sv = new_constant(start, s - start, (PL_lex_inpat ? "qr" : "q"),
1222 ( PL_lex_inwhat == OP_TRANS
1224 : ( (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat)
1227 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
1233 /* This is the one truly awful dwimmer necessary to conflate C and sed. */
1235 intuit_more(register char *s)
1237 if (PL_lex_brackets)
1239 if (*s == '-' && s[1] == '>' && (s[2] == '[' || s[2] == '{'))
1241 if (*s != '{' && *s != '[')
1246 /* In a pattern, so maybe we have {n,m}. */
1263 /* On the other hand, maybe we have a character class */
1266 if (*s == ']' || *s == '^')
1269 int weight = 2; /* let's weigh the evidence */
1271 unsigned char un_char = 255, last_un_char;
1272 char *send = strchr(s,']');
1273 char tmpbuf[sizeof PL_tokenbuf * 4];
1275 if (!send) /* has to be an expression */
1278 Zero(seen,256,char);
1281 else if (isDIGIT(*s)) {
1283 if (isDIGIT(s[1]) && s[2] == ']')
1289 for (; s < send; s++) {
1290 last_un_char = un_char;
1291 un_char = (unsigned char)*s;
1296 weight -= seen[un_char] * 10;
1297 if (isALNUM_lazy(s+1)) {
1298 scan_ident(s, send, tmpbuf, sizeof tmpbuf, FALSE);
1299 if ((int)strlen(tmpbuf) > 1 && gv_fetchpv(tmpbuf,FALSE, SVt_PV))
1304 else if (*s == '$' && s[1] &&
1305 strchr("[#!%*<>()-=",s[1])) {
1306 if (/*{*/ strchr("])} =",s[2]))
1315 if (strchr("wds]",s[1]))
1317 else if (seen['\''] || seen['"'])
1319 else if (strchr("rnftbxcav",s[1]))
1321 else if (isDIGIT(s[1])) {
1323 while (s[1] && isDIGIT(s[1]))
1333 if (strchr("aA01! ",last_un_char))
1335 if (strchr("zZ79~",s[1]))
1337 if (last_un_char == 255 && (isDIGIT(s[1]) || s[1] == '$'))
1338 weight -= 5; /* cope with negative subscript */
1341 if (!isALNUM(last_un_char) && !strchr("$@&",last_un_char) &&
1342 isALPHA(*s) && s[1] && isALPHA(s[1])) {
1347 if (keyword(tmpbuf, d - tmpbuf))
1350 if (un_char == last_un_char + 1)
1352 weight -= seen[un_char];
1357 if (weight >= 0) /* probably a character class */
1365 intuit_method(char *start, GV *gv)
1367 char *s = start + (*start == '$');
1368 char tmpbuf[sizeof PL_tokenbuf];
1376 if ((cv = GvCVu(gv))) {
1377 char *proto = SvPVX(cv);
1387 s = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
1388 if (*start == '$') {
1389 if (gv || PL_last_lop_op == OP_PRINT || isUPPER(*PL_tokenbuf))
1394 return *s == '(' ? FUNCMETH : METHOD;
1396 if (!keyword(tmpbuf, len)) {
1397 if (len > 2 && tmpbuf[len - 2] == ':' && tmpbuf[len - 1] == ':') {
1402 indirgv = gv_fetchpv(tmpbuf, FALSE, SVt_PVCV);
1403 if (indirgv && GvCVu(indirgv))
1405 /* filehandle or package name makes it a method */
1406 if (!gv || GvIO(indirgv) || gv_stashpvn(tmpbuf, len, FALSE)) {
1408 if ((PL_bufend - s) >= 2 && *s == '=' && *(s+1) == '>')
1409 return 0; /* no assumptions -- "=>" quotes bearword */
1411 PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST, 0,
1413 PL_nextval[PL_nexttoke].opval->op_private = OPpCONST_BARE;
1417 return *s == '(' ? FUNCMETH : METHOD;
1427 char *pdb = PerlEnv_getenv("PERL5DB");
1431 SETERRNO(0,SS$_NORMAL);
1432 return "BEGIN { require 'perl5db.pl' }";
1438 /* Encoded script support. filter_add() effectively inserts a
1439 * 'pre-processing' function into the current source input stream.
1440 * Note that the filter function only applies to the current source file
1441 * (e.g., it will not affect files 'require'd or 'use'd by this one).
1443 * The datasv parameter (which may be NULL) can be used to pass
1444 * private data to this instance of the filter. The filter function
1445 * can recover the SV using the FILTER_DATA macro and use it to
1446 * store private buffers and state information.
1448 * The supplied datasv parameter is upgraded to a PVIO type
1449 * and the IoDIRP field is used to store the function pointer.
1450 * Note that IoTOP_NAME, IoFMT_NAME, IoBOTTOM_NAME, if set for
1451 * private use must be set using malloc'd pointers.
1453 static int filter_debug = 0;
1456 filter_add(filter_t funcp, SV *datasv)
1458 if (!funcp){ /* temporary handy debugging hack to be deleted */
1459 filter_debug = atoi((char*)datasv);
1462 if (!PL_rsfp_filters)
1463 PL_rsfp_filters = newAV();
1465 datasv = NEWSV(255,0);
1466 if (!SvUPGRADE(datasv, SVt_PVIO))
1467 die("Can't upgrade filter_add data to SVt_PVIO");
1468 IoDIRP(datasv) = (DIR*)funcp; /* stash funcp into spare field */
1471 warn("filter_add func %p (%s)", funcp, SvPV(datasv, n_a));
1473 av_unshift(PL_rsfp_filters, 1);
1474 av_store(PL_rsfp_filters, 0, datasv) ;
1479 /* Delete most recently added instance of this filter function. */
1481 filter_del(filter_t funcp)
1484 warn("filter_del func %p", funcp);
1485 if (!PL_rsfp_filters || AvFILLp(PL_rsfp_filters)<0)
1487 /* if filter is on top of stack (usual case) just pop it off */
1488 if (IoDIRP(FILTER_DATA(AvFILLp(PL_rsfp_filters))) == (DIR*)funcp){
1489 sv_free(av_pop(PL_rsfp_filters));
1493 /* we need to search for the correct entry and clear it */
1494 die("filter_del can only delete in reverse order (currently)");
1498 /* Invoke the n'th filter function for the current rsfp. */
1500 filter_read(int idx, SV *buf_sv, int maxlen)
1503 /* 0 = read one text line */
1508 if (!PL_rsfp_filters)
1510 if (idx > AvFILLp(PL_rsfp_filters)){ /* Any more filters? */
1511 /* Provide a default input filter to make life easy. */
1512 /* Note that we append to the line. This is handy. */
1514 warn("filter_read %d: from rsfp\n", idx);
1518 int old_len = SvCUR(buf_sv) ;
1520 /* ensure buf_sv is large enough */
1521 SvGROW(buf_sv, old_len + maxlen) ;
1522 if ((len = PerlIO_read(PL_rsfp, SvPVX(buf_sv) + old_len, maxlen)) <= 0){
1523 if (PerlIO_error(PL_rsfp))
1524 return -1; /* error */
1526 return 0 ; /* end of file */
1528 SvCUR_set(buf_sv, old_len + len) ;
1531 if (sv_gets(buf_sv, PL_rsfp, SvCUR(buf_sv)) == NULL) {
1532 if (PerlIO_error(PL_rsfp))
1533 return -1; /* error */
1535 return 0 ; /* end of file */
1538 return SvCUR(buf_sv);
1540 /* Skip this filter slot if filter has been deleted */
1541 if ( (datasv = FILTER_DATA(idx)) == &PL_sv_undef){
1543 warn("filter_read %d: skipped (filter deleted)\n", idx);
1544 return FILTER_READ(idx+1, buf_sv, maxlen); /* recurse */
1546 /* Get function pointer hidden within datasv */
1547 funcp = (filter_t)IoDIRP(datasv);
1550 warn("filter_read %d: via function %p (%s)\n",
1551 idx, funcp, SvPV(datasv,n_a));
1553 /* Call function. The function is expected to */
1554 /* call "FILTER_READ(idx+1, buf_sv)" first. */
1555 /* Return: <0:error, =0:eof, >0:not eof */
1556 return (*funcp)(PERL_OBJECT_THIS_ idx, buf_sv, maxlen);
1560 filter_gets(register SV *sv, register PerlIO *fp, STRLEN append)
1563 if (!PL_rsfp_filters) {
1564 filter_add(win32_textfilter,NULL);
1567 if (PL_rsfp_filters) {
1570 SvCUR_set(sv, 0); /* start with empty line */
1571 if (FILTER_READ(0, sv, 0) > 0)
1572 return ( SvPVX(sv) ) ;
1577 return (sv_gets(sv, fp, append));
1582 static char* exp_name[] =
1583 { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "TERMBLOCK" };
1589 Works out what to call the token just pulled out of the input
1590 stream. The yacc parser takes care of taking the ops we return and
1591 stitching them into a tree.
1597 if read an identifier
1598 if we're in a my declaration
1599 croak if they tried to say my($foo::bar)
1600 build the ops for a my() declaration
1601 if it's an access to a my() variable
1602 are we in a sort block?
1603 croak if my($a); $a <=> $b
1604 build ops for access to a my() variable
1605 if in a dq string, and they've said @foo and we can't find @foo
1607 build ops for a bareword
1608 if we already built the token before, use it.
1611 int yylex(PERL_YYLEX_PARAM_DECL)
1621 #ifdef USE_PURE_BISON
1622 yylval_pointer = lvalp;
1623 yychar_pointer = lcharp;
1626 /* check if there's an identifier for us to look at */
1627 if (PL_pending_ident) {
1628 /* pit holds the identifier we read and pending_ident is reset */
1629 char pit = PL_pending_ident;
1630 PL_pending_ident = 0;
1632 /* if we're in a my(), we can't allow dynamics here.
1633 $foo'bar has already been turned into $foo::bar, so
1634 just check for colons.
1636 if it's a legal name, the OP is a PADANY.
1639 if (strchr(PL_tokenbuf,':'))
1640 croak(PL_no_myglob,PL_tokenbuf);
1642 yylval.opval = newOP(OP_PADANY, 0);
1643 yylval.opval->op_targ = pad_allocmy(PL_tokenbuf);
1648 build the ops for accesses to a my() variable.
1650 Deny my($a) or my($b) in a sort block, *if* $a or $b is
1651 then used in a comparison. This catches most, but not
1652 all cases. For instance, it catches
1653 sort { my($a); $a <=> $b }
1655 sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
1656 (although why you'd do that is anyone's guess).
1659 if (!strchr(PL_tokenbuf,':')) {
1661 /* Check for single character per-thread SVs */
1662 if (PL_tokenbuf[0] == '$' && PL_tokenbuf[2] == '\0'
1663 && !isALPHA(PL_tokenbuf[1]) /* Rule out obvious non-threadsvs */
1664 && (tmp = find_threadsv(&PL_tokenbuf[1])) != NOT_IN_PAD)
1666 yylval.opval = newOP(OP_THREADSV, 0);
1667 yylval.opval->op_targ = tmp;
1670 #endif /* USE_THREADS */
1671 if ((tmp = pad_findmy(PL_tokenbuf)) != NOT_IN_PAD) {
1672 /* if it's a sort block and they're naming $a or $b */
1673 if (PL_last_lop_op == OP_SORT &&
1674 PL_tokenbuf[0] == '$' &&
1675 (PL_tokenbuf[1] == 'a' || PL_tokenbuf[1] == 'b')
1678 for (d = PL_in_eval ? PL_oldoldbufptr : PL_linestart;
1679 d < PL_bufend && *d != '\n';
1682 if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
1683 croak("Can't use \"my %s\" in sort comparison",
1689 yylval.opval = newOP(OP_PADANY, 0);
1690 yylval.opval->op_targ = tmp;
1696 Whine if they've said @foo in a doublequoted string,
1697 and @foo isn't a variable we can find in the symbol
1700 if (pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
1701 GV *gv = gv_fetchpv(PL_tokenbuf+1, FALSE, SVt_PVAV);
1702 if (!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
1703 yyerror(form("In string, %s now must be written as \\%s",
1704 PL_tokenbuf, PL_tokenbuf));
1707 /* build ops for a bareword */
1708 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(PL_tokenbuf+1, 0));
1709 yylval.opval->op_private = OPpCONST_ENTERED;
1710 gv_fetchpv(PL_tokenbuf+1, PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : TRUE,
1711 ((PL_tokenbuf[0] == '$') ? SVt_PV
1712 : (PL_tokenbuf[0] == '@') ? SVt_PVAV
1717 /* no identifier pending identification */
1719 switch (PL_lex_state) {
1721 case LEX_NORMAL: /* Some compilers will produce faster */
1722 case LEX_INTERPNORMAL: /* code if we comment these out. */
1726 /* when we're already built the next token, just pull it out the queue */
1729 yylval = PL_nextval[PL_nexttoke];
1731 PL_lex_state = PL_lex_defer;
1732 PL_expect = PL_lex_expect;
1733 PL_lex_defer = LEX_NORMAL;
1735 return(PL_nexttype[PL_nexttoke]);
1737 /* interpolated case modifiers like \L \U, including \Q and \E.
1738 when we get here, PL_bufptr is at the \
1740 case LEX_INTERPCASEMOD:
1742 if (PL_bufptr != PL_bufend && *PL_bufptr != '\\')
1743 croak("panic: INTERPCASEMOD");
1745 /* handle \E or end of string */
1746 if (PL_bufptr == PL_bufend || PL_bufptr[1] == 'E') {
1750 if (PL_lex_casemods) {
1751 oldmod = PL_lex_casestack[--PL_lex_casemods];
1752 PL_lex_casestack[PL_lex_casemods] = '\0';
1754 if (PL_bufptr != PL_bufend && strchr("LUQ", oldmod)) {
1756 PL_lex_state = LEX_INTERPCONCAT;
1760 if (PL_bufptr != PL_bufend)
1762 PL_lex_state = LEX_INTERPCONCAT;
1763 return yylex(PERL_YYLEX_PARAM);
1767 if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
1768 tmp = *s, *s = s[2], s[2] = tmp; /* misordered... */
1769 if (strchr("LU", *s) &&
1770 (strchr(PL_lex_casestack, 'L') || strchr(PL_lex_casestack, 'U')))
1772 PL_lex_casestack[--PL_lex_casemods] = '\0';
1775 if (PL_lex_casemods > 10) {
1776 char* newlb = Renew(PL_lex_casestack, PL_lex_casemods + 2, char);
1777 if (newlb != PL_lex_casestack) {
1779 PL_lex_casestack = newlb;
1782 PL_lex_casestack[PL_lex_casemods++] = *s;
1783 PL_lex_casestack[PL_lex_casemods] = '\0';
1784 PL_lex_state = LEX_INTERPCONCAT;
1785 PL_nextval[PL_nexttoke].ival = 0;
1788 PL_nextval[PL_nexttoke].ival = OP_LCFIRST;
1790 PL_nextval[PL_nexttoke].ival = OP_UCFIRST;
1792 PL_nextval[PL_nexttoke].ival = OP_LC;
1794 PL_nextval[PL_nexttoke].ival = OP_UC;
1796 PL_nextval[PL_nexttoke].ival = OP_QUOTEMETA;
1798 croak("panic: yylex");
1801 if (PL_lex_starts) {
1807 return yylex(PERL_YYLEX_PARAM);
1810 case LEX_INTERPPUSH:
1811 return sublex_push();
1813 case LEX_INTERPSTART:
1814 if (PL_bufptr == PL_bufend)
1815 return sublex_done();
1817 PL_lex_dojoin = (*PL_bufptr == '@');
1818 PL_lex_state = LEX_INTERPNORMAL;
1819 if (PL_lex_dojoin) {
1820 PL_nextval[PL_nexttoke].ival = 0;
1823 PL_nextval[PL_nexttoke].opval = newOP(OP_THREADSV, 0);
1824 PL_nextval[PL_nexttoke].opval->op_targ = find_threadsv("\"");
1825 force_next(PRIVATEREF);
1827 force_ident("\"", '$');
1828 #endif /* USE_THREADS */
1829 PL_nextval[PL_nexttoke].ival = 0;
1831 PL_nextval[PL_nexttoke].ival = 0;
1833 PL_nextval[PL_nexttoke].ival = OP_JOIN; /* emulate join($", ...) */
1836 if (PL_lex_starts++) {
1840 return yylex(PERL_YYLEX_PARAM);
1842 case LEX_INTERPENDMAYBE:
1843 if (intuit_more(PL_bufptr)) {
1844 PL_lex_state = LEX_INTERPNORMAL; /* false alarm, more expr */
1850 if (PL_lex_dojoin) {
1851 PL_lex_dojoin = FALSE;
1852 PL_lex_state = LEX_INTERPCONCAT;
1855 if (PL_lex_inwhat == OP_SUBST && PL_lex_repl && SvCOMPILED(PL_lex_repl)) {
1856 if (PL_bufptr != PL_bufend)
1857 croak("Bad evalled substitution pattern");
1858 PL_lex_repl = Nullsv;
1861 case LEX_INTERPCONCAT:
1863 if (PL_lex_brackets)
1864 croak("panic: INTERPCONCAT");
1866 if (PL_bufptr == PL_bufend)
1867 return sublex_done();
1869 if (SvIVX(PL_linestr) == '\'') {
1870 SV *sv = newSVsv(PL_linestr);
1873 else if ( PL_hints & HINT_NEW_RE )
1874 sv = new_constant(NULL, 0, "qr", sv, sv, "q");
1875 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
1879 s = scan_const(PL_bufptr);
1881 PL_lex_state = LEX_INTERPCASEMOD;
1883 PL_lex_state = LEX_INTERPSTART;
1886 if (s != PL_bufptr) {
1887 PL_nextval[PL_nexttoke] = yylval;
1890 if (PL_lex_starts++)
1894 return yylex(PERL_YYLEX_PARAM);
1898 return yylex(PERL_YYLEX_PARAM);
1900 PL_lex_state = LEX_NORMAL;
1901 s = scan_formline(PL_bufptr);
1902 if (!PL_lex_formbrack)
1908 PL_oldoldbufptr = PL_oldbufptr;
1911 PerlIO_printf(PerlIO_stderr(), "### Tokener expecting %s at %s\n", exp_name[PL_expect], s);
1917 if (isIDFIRST_lazy(s))
1919 croak("Unrecognized character \\x%02X", *s & 255);
1922 goto fake_eof; /* emulate EOF on ^D or ^Z */
1927 if (PL_lex_brackets)
1928 yyerror("Missing right bracket");
1931 if (s++ < PL_bufend)
1932 goto retry; /* ignore stray nulls */
1935 if (!PL_in_eval && !PL_preambled) {
1936 PL_preambled = TRUE;
1937 sv_setpv(PL_linestr,incl_perldb());
1938 if (SvCUR(PL_linestr))
1939 sv_catpv(PL_linestr,";");
1941 while(AvFILLp(PL_preambleav) >= 0) {
1942 SV *tmpsv = av_shift(PL_preambleav);
1943 sv_catsv(PL_linestr, tmpsv);
1944 sv_catpv(PL_linestr, ";");
1947 sv_free((SV*)PL_preambleav);
1948 PL_preambleav = NULL;
1950 if (PL_minus_n || PL_minus_p) {
1951 sv_catpv(PL_linestr, "LINE: while (<>) {");
1953 sv_catpv(PL_linestr,"chomp;");
1955 GV* gv = gv_fetchpv("::F", TRUE, SVt_PVAV);
1957 GvIMPORTED_AV_on(gv);
1959 if (strchr("/'\"", *PL_splitstr)
1960 && strchr(PL_splitstr + 1, *PL_splitstr))
1961 sv_catpvf(PL_linestr, "@F=split(%s);", PL_splitstr);
1964 s = "'~#\200\1'"; /* surely one char is unused...*/
1965 while (s[1] && strchr(PL_splitstr, *s)) s++;
1967 sv_catpvf(PL_linestr, "@F=split(%s%c",
1968 "q" + (delim == '\''), delim);
1969 for (s = PL_splitstr; *s; s++) {
1971 sv_catpvn(PL_linestr, "\\", 1);
1972 sv_catpvn(PL_linestr, s, 1);
1974 sv_catpvf(PL_linestr, "%c);", delim);
1978 sv_catpv(PL_linestr,"@F=split(' ');");
1981 sv_catpv(PL_linestr, "\n");
1982 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
1983 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
1984 if (PERLDB_LINE && PL_curstash != PL_debstash) {
1985 SV *sv = NEWSV(85,0);
1987 sv_upgrade(sv, SVt_PVMG);
1988 sv_setsv(sv,PL_linestr);
1989 av_store(GvAV(PL_curcop->cop_filegv),(I32)PL_curcop->cop_line,sv);
1994 if ((s = filter_gets(PL_linestr, PL_rsfp, 0)) == Nullch) {
1997 if (PL_preprocess && !PL_in_eval)
1998 (void)PerlProc_pclose(PL_rsfp);
1999 else if ((PerlIO *)PL_rsfp == PerlIO_stdin())
2000 PerlIO_clearerr(PL_rsfp);
2002 (void)PerlIO_close(PL_rsfp);
2004 PL_doextract = FALSE;
2006 if (!PL_in_eval && (PL_minus_n || PL_minus_p)) {
2007 sv_setpv(PL_linestr,PL_minus_p ? ";}continue{print" : "");
2008 sv_catpv(PL_linestr,";}");
2009 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2010 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
2011 PL_minus_n = PL_minus_p = 0;
2014 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2015 sv_setpv(PL_linestr,"");
2016 TOKEN(';'); /* not infinite loop because rsfp is NULL now */
2019 if (*s == '#' && s[1] == '!' && instr(s,"perl"))
2020 PL_doextract = FALSE;
2022 /* Incest with pod. */
2023 if (*s == '=' && strnEQ(s, "=cut", 4)) {
2024 sv_setpv(PL_linestr, "");
2025 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2026 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
2027 PL_doextract = FALSE;
2031 } while (PL_doextract);
2032 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = s;
2033 if (PERLDB_LINE && PL_curstash != PL_debstash) {
2034 SV *sv = NEWSV(85,0);
2036 sv_upgrade(sv, SVt_PVMG);
2037 sv_setsv(sv,PL_linestr);
2038 av_store(GvAV(PL_curcop->cop_filegv),(I32)PL_curcop->cop_line,sv);
2040 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
2041 if (PL_curcop->cop_line == 1) {
2042 while (s < PL_bufend && isSPACE(*s))
2044 if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
2048 if (*s == '#' && *(s+1) == '!')
2050 #ifdef ALTERNATE_SHEBANG
2052 static char as[] = ALTERNATE_SHEBANG;
2053 if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
2054 d = s + (sizeof(as) - 1);
2056 #endif /* ALTERNATE_SHEBANG */
2065 while (*d && !isSPACE(*d))
2069 #ifdef ARG_ZERO_IS_SCRIPT
2070 if (ipathend > ipath) {
2072 * HP-UX (at least) sets argv[0] to the script name,
2073 * which makes $^X incorrect. And Digital UNIX and Linux,
2074 * at least, set argv[0] to the basename of the Perl
2075 * interpreter. So, having found "#!", we'll set it right.
2077 SV *x = GvSV(gv_fetchpv("\030", TRUE, SVt_PV));
2078 assert(SvPOK(x) || SvGMAGICAL(x));
2079 if (sv_eq(x, GvSV(PL_curcop->cop_filegv))) {
2080 sv_setpvn(x, ipath, ipathend - ipath);
2083 TAINT_NOT; /* $^X is always tainted, but that's OK */
2085 #endif /* ARG_ZERO_IS_SCRIPT */
2090 d = instr(s,"perl -");
2092 d = instr(s,"perl");
2093 #ifdef ALTERNATE_SHEBANG
2095 * If the ALTERNATE_SHEBANG on this system starts with a
2096 * character that can be part of a Perl expression, then if
2097 * we see it but not "perl", we're probably looking at the
2098 * start of Perl code, not a request to hand off to some
2099 * other interpreter. Similarly, if "perl" is there, but
2100 * not in the first 'word' of the line, we assume the line
2101 * contains the start of the Perl program.
2103 if (d && *s != '#') {
2105 while (*c && !strchr("; \t\r\n\f\v#", *c))
2108 d = Nullch; /* "perl" not in first word; ignore */
2110 *s = '#'; /* Don't try to parse shebang line */
2112 #endif /* ALTERNATE_SHEBANG */
2117 !instr(s,"indir") &&
2118 instr(PL_origargv[0],"perl"))
2124 while (s < PL_bufend && isSPACE(*s))
2126 if (s < PL_bufend) {
2127 Newz(899,newargv,PL_origargc+3,char*);
2129 while (s < PL_bufend && !isSPACE(*s))
2132 Copy(PL_origargv+1, newargv+2, PL_origargc+1, char*);
2135 newargv = PL_origargv;
2137 execv(ipath, newargv);
2138 croak("Can't exec %s", ipath);
2141 U32 oldpdb = PL_perldb;
2142 bool oldn = PL_minus_n;
2143 bool oldp = PL_minus_p;
2145 while (*d && !isSPACE(*d)) d++;
2146 while (*d == ' ' || *d == '\t') d++;
2150 if (*d == 'M' || *d == 'm') {
2152 while (*d && !isSPACE(*d)) d++;
2153 croak("Too late for \"-%.*s\" option",
2156 d = moreswitches(d);
2158 if (PERLDB_LINE && !oldpdb ||
2159 ( PL_minus_n || PL_minus_p ) && !(oldn || oldp) )
2160 /* if we have already added "LINE: while (<>) {",
2161 we must not do it again */
2163 sv_setpv(PL_linestr, "");
2164 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2165 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
2166 PL_preambled = FALSE;
2168 (void)gv_fetchfile(PL_origfilename);
2175 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
2177 PL_lex_state = LEX_FORMLINE;
2178 return yylex(PERL_YYLEX_PARAM);
2182 #ifdef PERL_STRICT_CR
2183 warn("Illegal character \\%03o (carriage return)", '\r');
2185 "(Maybe you didn't strip carriage returns after a network transfer?)\n");
2187 case ' ': case '\t': case '\f': case 013:
2192 if (PL_lex_state != LEX_NORMAL || (PL_in_eval && !PL_rsfp)) {
2194 while (s < d && *s != '\n')
2199 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
2201 PL_lex_state = LEX_FORMLINE;
2202 return yylex(PERL_YYLEX_PARAM);
2211 if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
2216 while (s < PL_bufend && (*s == ' ' || *s == '\t'))
2219 if (strnEQ(s,"=>",2)) {
2220 s = force_word(PL_bufptr,WORD,FALSE,FALSE,FALSE);
2221 OPERATOR('-'); /* unary minus */
2223 PL_last_uni = PL_oldbufptr;
2224 PL_last_lop_op = OP_FTEREAD; /* good enough */
2226 case 'r': FTST(OP_FTEREAD);
2227 case 'w': FTST(OP_FTEWRITE);
2228 case 'x': FTST(OP_FTEEXEC);
2229 case 'o': FTST(OP_FTEOWNED);
2230 case 'R': FTST(OP_FTRREAD);
2231 case 'W': FTST(OP_FTRWRITE);
2232 case 'X': FTST(OP_FTREXEC);
2233 case 'O': FTST(OP_FTROWNED);
2234 case 'e': FTST(OP_FTIS);
2235 case 'z': FTST(OP_FTZERO);
2236 case 's': FTST(OP_FTSIZE);
2237 case 'f': FTST(OP_FTFILE);
2238 case 'd': FTST(OP_FTDIR);
2239 case 'l': FTST(OP_FTLINK);
2240 case 'p': FTST(OP_FTPIPE);
2241 case 'S': FTST(OP_FTSOCK);
2242 case 'u': FTST(OP_FTSUID);
2243 case 'g': FTST(OP_FTSGID);
2244 case 'k': FTST(OP_FTSVTX);
2245 case 'b': FTST(OP_FTBLK);
2246 case 'c': FTST(OP_FTCHR);
2247 case 't': FTST(OP_FTTTY);
2248 case 'T': FTST(OP_FTTEXT);
2249 case 'B': FTST(OP_FTBINARY);
2250 case 'M': gv_fetchpv("\024",TRUE, SVt_PV); FTST(OP_FTMTIME);
2251 case 'A': gv_fetchpv("\024",TRUE, SVt_PV); FTST(OP_FTATIME);
2252 case 'C': gv_fetchpv("\024",TRUE, SVt_PV); FTST(OP_FTCTIME);
2254 croak("Unrecognized file test: -%c", (int)tmp);
2261 if (PL_expect == XOPERATOR)
2266 else if (*s == '>') {
2269 if (isIDFIRST_lazy(s)) {
2270 s = force_word(s,METHOD,FALSE,TRUE,FALSE);
2278 if (PL_expect == XOPERATOR)
2281 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
2283 OPERATOR('-'); /* unary minus */
2290 if (PL_expect == XOPERATOR)
2295 if (PL_expect == XOPERATOR)
2298 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
2304 if (PL_expect != XOPERATOR) {
2305 s = scan_ident(s, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
2306 PL_expect = XOPERATOR;
2307 force_ident(PL_tokenbuf, '*');
2320 if (PL_expect == XOPERATOR) {
2324 PL_tokenbuf[0] = '%';
2325 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, TRUE);
2326 if (!PL_tokenbuf[1]) {
2328 yyerror("Final % should be \\% or %name");
2331 PL_pending_ident = '%';
2353 if (PL_last_lop == PL_oldoldbufptr || PL_last_uni == PL_oldoldbufptr)
2354 PL_oldbufptr = PL_oldoldbufptr; /* allow print(STDOUT 123) */
2359 if (PL_curcop->cop_line < PL_copline)
2360 PL_copline = PL_curcop->cop_line;
2371 if (PL_lex_brackets <= 0)
2372 yyerror("Unmatched right bracket");
2375 if (PL_lex_state == LEX_INTERPNORMAL) {
2376 if (PL_lex_brackets == 0) {
2377 if (*s != '[' && *s != '{' && (*s != '-' || s[1] != '>'))
2378 PL_lex_state = LEX_INTERPEND;
2385 if (PL_lex_brackets > 100) {
2386 char* newlb = Renew(PL_lex_brackstack, PL_lex_brackets + 1, char);
2387 if (newlb != PL_lex_brackstack) {
2389 PL_lex_brackstack = newlb;
2392 switch (PL_expect) {
2394 if (PL_lex_formbrack) {
2398 if (PL_oldoldbufptr == PL_last_lop)
2399 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
2401 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
2402 OPERATOR(HASHBRACK);
2404 while (s < PL_bufend && (*s == ' ' || *s == '\t'))
2407 PL_tokenbuf[0] = '\0';
2408 if (d < PL_bufend && *d == '-') {
2409 PL_tokenbuf[0] = '-';
2411 while (d < PL_bufend && (*d == ' ' || *d == '\t'))
2414 if (d < PL_bufend && isIDFIRST_lazy(d)) {
2415 d = scan_word(d, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
2417 while (d < PL_bufend && (*d == ' ' || *d == '\t'))
2420 char minus = (PL_tokenbuf[0] == '-');
2421 s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
2428 PL_lex_brackstack[PL_lex_brackets++] = XSTATE;
2432 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
2437 if (PL_oldoldbufptr == PL_last_lop)
2438 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
2440 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
2443 OPERATOR(HASHBRACK);
2444 /* This hack serves to disambiguate a pair of curlies
2445 * as being a block or an anon hash. Normally, expectation
2446 * determines that, but in cases where we're not in a
2447 * position to expect anything in particular (like inside
2448 * eval"") we have to resolve the ambiguity. This code
2449 * covers the case where the first term in the curlies is a
2450 * quoted string. Most other cases need to be explicitly
2451 * disambiguated by prepending a `+' before the opening
2452 * curly in order to force resolution as an anon hash.
2454 * XXX should probably propagate the outer expectation
2455 * into eval"" to rely less on this hack, but that could
2456 * potentially break current behavior of eval"".
2460 if (*s == '\'' || *s == '"' || *s == '`') {
2461 /* common case: get past first string, handling escapes */
2462 for (t++; t < PL_bufend && *t != *s;)
2463 if (*t++ == '\\' && (*t == '\\' || *t == *s))
2467 else if (*s == 'q') {
2470 || ((*t == 'q' || *t == 'x') && ++t < PL_bufend
2471 && !isALNUM(*t)))) {
2473 char open, close, term;
2476 while (t < PL_bufend && isSPACE(*t))
2480 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
2484 for (t++; t < PL_bufend; t++) {
2485 if (*t == '\\' && t+1 < PL_bufend && open != '\\')
2487 else if (*t == open)
2491 for (t++; t < PL_bufend; t++) {
2492 if (*t == '\\' && t+1 < PL_bufend)
2494 else if (*t == close && --brackets <= 0)
2496 else if (*t == open)
2502 else if (isIDFIRST_lazy(s)) {
2503 for (t++; t < PL_bufend && isALNUM_lazy(t); t++) ;
2505 while (t < PL_bufend && isSPACE(*t))
2507 /* if comma follows first term, call it an anon hash */
2508 /* XXX it could be a comma expression with loop modifiers */
2509 if (t < PL_bufend && ((*t == ',' && (*s == 'q' || !isLOWER(*s)))
2510 || (*t == '=' && t[1] == '>')))
2511 OPERATOR(HASHBRACK);
2512 if (PL_expect == XREF)
2513 PL_expect = XSTATE; /* was XTERM, trying XSTATE */
2515 PL_lex_brackstack[PL_lex_brackets-1] = XSTATE;
2521 yylval.ival = PL_curcop->cop_line;
2522 if (isSPACE(*s) || *s == '#')
2523 PL_copline = NOLINE; /* invalidate current command line number */
2528 if (PL_lex_brackets <= 0)
2529 yyerror("Unmatched right bracket");
2531 PL_expect = (expectation)PL_lex_brackstack[--PL_lex_brackets];
2532 if (PL_lex_brackets < PL_lex_formbrack)
2533 PL_lex_formbrack = 0;
2534 if (PL_lex_state == LEX_INTERPNORMAL) {
2535 if (PL_lex_brackets == 0) {
2536 if (PL_lex_fakebrack) {
2537 PL_lex_state = LEX_INTERPEND;
2539 return yylex(PERL_YYLEX_PARAM); /* ignore fake brackets */
2541 if (*s == '-' && s[1] == '>')
2542 PL_lex_state = LEX_INTERPENDMAYBE;
2543 else if (*s != '[' && *s != '{')
2544 PL_lex_state = LEX_INTERPEND;
2547 if (PL_lex_brackets < PL_lex_fakebrack) {
2549 PL_lex_fakebrack = 0;
2550 return yylex(PERL_YYLEX_PARAM); /* ignore fake brackets */
2560 if (PL_expect == XOPERATOR) {
2561 if (ckWARN(WARN_SEMICOLON) && isIDFIRST_lazy(s) && PL_bufptr == PL_linestart) {
2562 PL_curcop->cop_line--;
2563 warner(WARN_SEMICOLON, PL_warn_nosemi);
2564 PL_curcop->cop_line++;
2569 s = scan_ident(s - 1, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
2571 PL_expect = XOPERATOR;
2572 force_ident(PL_tokenbuf, '&');
2576 yylval.ival = (OPpENTERSUB_AMPER<<8);
2595 if (ckWARN(WARN_SYNTAX) && tmp && isSPACE(*s) && strchr("+-*/%.^&|<",tmp))
2596 warner(WARN_SYNTAX, "Reversed %c= operator",(int)tmp);
2598 if (PL_expect == XSTATE && isALPHA(tmp) &&
2599 (s == PL_linestart+1 || s[-2] == '\n') )
2601 if (PL_in_eval && !PL_rsfp) {
2606 if (strnEQ(s,"=cut",4)) {
2620 PL_doextract = TRUE;
2623 if (PL_lex_brackets < PL_lex_formbrack) {
2625 #ifdef PERL_STRICT_CR
2626 for (t = s; *t == ' ' || *t == '\t'; t++) ;
2628 for (t = s; *t == ' ' || *t == '\t' || *t == '\r'; t++) ;
2630 if (*t == '\n' || *t == '#') {
2648 if (PL_expect != XOPERATOR) {
2649 if (s[1] != '<' && !strchr(s,'>'))
2652 s = scan_heredoc(s);
2654 s = scan_inputsymbol(s);
2655 TERM(sublex_start());
2660 SHop(OP_LEFT_SHIFT);
2674 SHop(OP_RIGHT_SHIFT);
2683 if (PL_expect == XOPERATOR) {
2684 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
2687 return ','; /* grandfather non-comma-format format */
2691 if (s[1] == '#' && (isIDFIRST_lazy(s+2) || strchr("{$:+-", s[2]))) {
2692 if (PL_expect == XOPERATOR)
2693 no_op("Array length", PL_bufptr);
2694 PL_tokenbuf[0] = '@';
2695 s = scan_ident(s + 1, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
2697 if (!PL_tokenbuf[1])
2699 PL_expect = XOPERATOR;
2700 PL_pending_ident = '#';
2704 if (PL_expect == XOPERATOR)
2705 no_op("Scalar", PL_bufptr);
2706 PL_tokenbuf[0] = '$';
2707 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, FALSE);
2708 if (!PL_tokenbuf[1]) {
2710 yyerror("Final $ should be \\$ or $name");
2714 /* This kludge not intended to be bulletproof. */
2715 if (PL_tokenbuf[1] == '[' && !PL_tokenbuf[2]) {
2716 yylval.opval = newSVOP(OP_CONST, 0,
2717 newSViv((IV)PL_compiling.cop_arybase));
2718 yylval.opval->op_private = OPpCONST_ARYBASE;
2723 if (PL_lex_state == LEX_NORMAL)
2726 if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
2729 PL_tokenbuf[0] = '@';
2730 if (ckWARN(WARN_SYNTAX)) {
2732 isSPACE(*t) || isALNUM_lazy(t) || *t == '$';
2735 PL_bufptr = skipspace(PL_bufptr);
2736 while (t < PL_bufend && *t != ']')
2739 "Multidimensional syntax %.*s not supported",
2740 (t - PL_bufptr) + 1, PL_bufptr);
2744 else if (*s == '{') {
2745 PL_tokenbuf[0] = '%';
2746 if (ckWARN(WARN_SYNTAX) && strEQ(PL_tokenbuf+1, "SIG") &&
2747 (t = strchr(s, '}')) && (t = strchr(t, '=')))
2749 char tmpbuf[sizeof PL_tokenbuf];
2751 for (t++; isSPACE(*t); t++) ;
2752 if (isIDFIRST_lazy(t)) {
2753 t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE, &len);
2754 for (; isSPACE(*t); t++) ;
2755 if (*t == ';' && perl_get_cv(tmpbuf, FALSE))
2757 "You need to quote \"%s\"", tmpbuf);
2763 PL_expect = XOPERATOR;
2764 if (PL_lex_state == LEX_NORMAL && isSPACE(*d)) {
2765 bool islop = (PL_last_lop == PL_oldoldbufptr);
2766 if (!islop || PL_last_lop_op == OP_GREPSTART)
2767 PL_expect = XOPERATOR;
2768 else if (strchr("$@\"'`q", *s))
2769 PL_expect = XTERM; /* e.g. print $fh "foo" */
2770 else if (strchr("&*<%", *s) && isIDFIRST_lazy(s+1))
2771 PL_expect = XTERM; /* e.g. print $fh &sub */
2772 else if (isIDFIRST_lazy(s)) {
2773 char tmpbuf[sizeof PL_tokenbuf];
2774 scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
2775 if (tmp = keyword(tmpbuf, len)) {
2776 /* binary operators exclude handle interpretations */
2788 PL_expect = XTERM; /* e.g. print $fh length() */
2793 GV *gv = gv_fetchpv(tmpbuf, FALSE, SVt_PVCV);
2794 if (gv && GvCVu(gv))
2795 PL_expect = XTERM; /* e.g. print $fh subr() */
2798 else if (isDIGIT(*s))
2799 PL_expect = XTERM; /* e.g. print $fh 3 */
2800 else if (*s == '.' && isDIGIT(s[1]))
2801 PL_expect = XTERM; /* e.g. print $fh .3 */
2802 else if (strchr("/?-+", *s) && !isSPACE(s[1]) && s[1] != '=')
2803 PL_expect = XTERM; /* e.g. print $fh -1 */
2804 else if (*s == '<' && s[1] == '<' && !isSPACE(s[2]) && s[2] != '=')
2805 PL_expect = XTERM; /* print $fh <<"EOF" */
2807 PL_pending_ident = '$';
2811 if (PL_expect == XOPERATOR)
2813 PL_tokenbuf[0] = '@';
2814 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, FALSE);
2815 if (!PL_tokenbuf[1]) {
2817 yyerror("Final @ should be \\@ or @name");
2820 if (PL_lex_state == LEX_NORMAL)
2822 if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
2824 PL_tokenbuf[0] = '%';
2826 /* Warn about @ where they meant $. */
2827 if (ckWARN(WARN_SYNTAX)) {
2828 if (*s == '[' || *s == '{') {
2830 while (*t && (isALNUM_lazy(t) || strchr(" \t$#+-'\"", *t)))
2832 if (*t == '}' || *t == ']') {
2834 PL_bufptr = skipspace(PL_bufptr);
2836 "Scalar value %.*s better written as $%.*s",
2837 t-PL_bufptr, PL_bufptr, t-PL_bufptr-1, PL_bufptr+1);
2842 PL_pending_ident = '@';
2845 case '/': /* may either be division or pattern */
2846 case '?': /* may either be conditional or pattern */
2847 if (PL_expect != XOPERATOR) {
2848 /* Disable warning on "study /blah/" */
2849 if (PL_oldoldbufptr == PL_last_uni
2850 && (*PL_last_uni != 's' || s - PL_last_uni < 5
2851 || memNE(PL_last_uni, "study", 5) || isALNUM_lazy(PL_last_uni+5)))
2853 s = scan_pat(s,OP_MATCH);
2854 TERM(sublex_start());
2862 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack
2863 #ifdef PERL_STRICT_CR
2866 && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n'))
2868 && (s == PL_linestart || s[-1] == '\n') )
2870 PL_lex_formbrack = 0;
2874 if (PL_expect == XOPERATOR || !isDIGIT(s[1])) {
2880 yylval.ival = OPf_SPECIAL;
2886 if (PL_expect != XOPERATOR)
2891 case '0': case '1': case '2': case '3': case '4':
2892 case '5': case '6': case '7': case '8': case '9':
2894 if (PL_expect == XOPERATOR)
2900 if (PL_expect == XOPERATOR) {
2901 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
2904 return ','; /* grandfather non-comma-format format */
2910 missingterm((char*)0);
2911 yylval.ival = OP_CONST;
2912 TERM(sublex_start());
2916 if (PL_expect == XOPERATOR) {
2917 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
2920 return ','; /* grandfather non-comma-format format */
2926 missingterm((char*)0);
2927 yylval.ival = OP_CONST;
2928 for (d = SvPV(PL_lex_stuff, len); len; len--, d++) {
2929 if (*d == '$' || *d == '@' || *d == '\\' || *d & 0x80) {
2930 yylval.ival = OP_STRINGIFY;
2934 TERM(sublex_start());
2938 if (PL_expect == XOPERATOR)
2939 no_op("Backticks",s);
2941 missingterm((char*)0);
2942 yylval.ival = OP_BACKTICK;
2944 TERM(sublex_start());
2948 if (ckWARN(WARN_SYNTAX) && PL_lex_inwhat && isDIGIT(*s))
2949 warner(WARN_SYNTAX,"Can't use \\%c to mean $%c in expression",
2951 if (PL_expect == XOPERATOR)
2952 no_op("Backslash",s);
2956 if (isDIGIT(s[1]) && PL_expect == XOPERATOR) {
2996 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
2998 /* Some keywords can be followed by any delimiter, including ':' */
2999 tmp = (len == 1 && strchr("msyq", PL_tokenbuf[0]) ||
3000 len == 2 && ((PL_tokenbuf[0] == 't' && PL_tokenbuf[1] == 'r') ||
3001 (PL_tokenbuf[0] == 'q' &&
3002 strchr("qwxr", PL_tokenbuf[1]))));
3004 /* x::* is just a word, unless x is "CORE" */
3005 if (!tmp && *s == ':' && s[1] == ':' && strNE(PL_tokenbuf, "CORE"))
3009 while (d < PL_bufend && isSPACE(*d))
3010 d++; /* no comments skipped here, or s### is misparsed */
3012 /* Is this a label? */
3013 if (!tmp && PL_expect == XSTATE
3014 && d < PL_bufend && *d == ':' && *(d + 1) != ':') {
3016 yylval.pval = savepv(PL_tokenbuf);
3021 /* Check for keywords */
3022 tmp = keyword(PL_tokenbuf, len);
3024 /* Is this a word before a => operator? */
3025 if (strnEQ(d,"=>",2)) {
3027 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(PL_tokenbuf,0));
3028 yylval.opval->op_private = OPpCONST_BARE;
3032 if (tmp < 0) { /* second-class keyword? */
3033 GV *ogv = Nullgv; /* override (winner) */
3034 GV *hgv = Nullgv; /* hidden (loser) */
3035 if (PL_expect != XOPERATOR && (*s != ':' || s[1] != ':')) {
3037 if ((gv = gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVCV)) &&
3040 if (GvIMPORTED_CV(gv))
3042 else if (! CvMETHOD(cv))
3046 (gvp = (GV**)hv_fetch(PL_globalstash,PL_tokenbuf,len,FALSE)) &&
3047 (gv = *gvp) != (GV*)&PL_sv_undef &&
3048 GvCVu(gv) && GvIMPORTED_CV(gv))
3054 tmp = 0; /* overridden by import or by GLOBAL */
3057 && -tmp==KEY_lock /* XXX generalizable kludge */
3058 && !hv_fetch(GvHVn(PL_incgv), "Thread.pm", 9, FALSE))
3060 tmp = 0; /* any sub overrides "weak" keyword */
3062 else { /* no override */
3066 if (ckWARN(WARN_AMBIGUOUS) && hgv
3067 && tmp != KEY_x && tmp != KEY_CORE) /* never ambiguous */
3068 warner(WARN_AMBIGUOUS,
3069 "Ambiguous call resolved as CORE::%s(), %s",
3070 GvENAME(hgv), "qualify as such or use &");
3077 default: /* not a keyword */
3080 char lastchar = (PL_bufptr == PL_oldoldbufptr ? 0 : PL_bufptr[-1]);
3082 /* Get the rest if it looks like a package qualifier */
3084 if (*s == '\'' || *s == ':' && s[1] == ':') {
3086 s = scan_word(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len,
3089 croak("Bad name after %s%s", PL_tokenbuf,
3090 *s == '\'' ? "'" : "::");
3094 if (PL_expect == XOPERATOR) {
3095 if (PL_bufptr == PL_linestart) {
3096 PL_curcop->cop_line--;
3097 warner(WARN_SEMICOLON, PL_warn_nosemi);
3098 PL_curcop->cop_line++;
3101 no_op("Bareword",s);
3104 /* Look for a subroutine with this name in current package,
3105 unless name is "Foo::", in which case Foo is a bearword
3106 (and a package name). */
3109 PL_tokenbuf[len - 2] == ':' && PL_tokenbuf[len - 1] == ':')
3111 if (ckWARN(WARN_UNSAFE) && ! gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVHV))
3113 "Bareword \"%s\" refers to nonexistent package",
3116 PL_tokenbuf[len] = '\0';
3123 gv = gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVCV);
3126 /* if we saw a global override before, get the right name */
3129 sv = newSVpv("CORE::GLOBAL::",14);
3130 sv_catpv(sv,PL_tokenbuf);
3133 sv = newSVpv(PL_tokenbuf,0);
3135 /* Presume this is going to be a bareword of some sort. */
3138 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
3139 yylval.opval->op_private = OPpCONST_BARE;
3141 /* And if "Foo::", then that's what it certainly is. */
3146 /* See if it's the indirect object for a list operator. */
3148 if (PL_oldoldbufptr &&
3149 PL_oldoldbufptr < PL_bufptr &&
3150 (PL_oldoldbufptr == PL_last_lop || PL_oldoldbufptr == PL_last_uni) &&
3151 /* NO SKIPSPACE BEFORE HERE! */
3153 || ((PL_opargs[PL_last_lop_op] >> OASHIFT)& 7) == OA_FILEREF
3154 || (PL_last_lop_op == OP_ENTERSUB
3156 && PL_last_proto[PL_last_proto[0] == ';' ? 1 : 0] == '*')) )
3158 bool immediate_paren = *s == '(';
3160 /* (Now we can afford to cross potential line boundary.) */
3163 /* Two barewords in a row may indicate method call. */
3165 if ((isIDFIRST_lazy(s) || *s == '$') && (tmp=intuit_method(s,gv)))
3168 /* If not a declared subroutine, it's an indirect object. */
3169 /* (But it's an indir obj regardless for sort.) */
3171 if ((PL_last_lop_op == OP_SORT ||
3172 (!immediate_paren && (!gv || !GvCVu(gv))) ) &&
3173 (PL_last_lop_op != OP_MAPSTART && PL_last_lop_op != OP_GREPSTART)){
3174 PL_expect = (PL_last_lop == PL_oldoldbufptr) ? XTERM : XOPERATOR;
3179 /* If followed by a paren, it's certainly a subroutine. */
3181 PL_expect = XOPERATOR;
3185 if (gv && GvCVu(gv)) {
3187 if ((cv = GvCV(gv)) && SvPOK(cv))
3188 PL_last_proto = SvPV((SV*)cv, n_a);
3189 for (d = s + 1; *d == ' ' || *d == '\t'; d++) ;
3190 if (*d == ')' && (sv = cv_const_sv(cv))) {
3195 PL_nextval[PL_nexttoke].opval = yylval.opval;
3196 PL_expect = XOPERATOR;
3199 PL_last_lop_op = OP_ENTERSUB;
3203 /* If followed by var or block, call it a method (unless sub) */
3205 if ((*s == '$' || *s == '{') && (!gv || !GvCVu(gv))) {
3206 PL_last_lop = PL_oldbufptr;
3207 PL_last_lop_op = OP_METHOD;
3211 /* If followed by a bareword, see if it looks like indir obj. */
3213 if ((isIDFIRST_lazy(s) || *s == '$') && (tmp = intuit_method(s,gv)))
3216 /* Not a method, so call it a subroutine (if defined) */
3218 if (gv && GvCVu(gv)) {
3220 if (lastchar == '-')
3221 warn("Ambiguous use of -%s resolved as -&%s()",
3222 PL_tokenbuf, PL_tokenbuf);
3223 PL_last_lop = PL_oldbufptr;
3224 PL_last_lop_op = OP_ENTERSUB;
3225 /* Check for a constant sub */
3227 if ((sv = cv_const_sv(cv))) {
3229 SvREFCNT_dec(((SVOP*)yylval.opval)->op_sv);
3230 ((SVOP*)yylval.opval)->op_sv = SvREFCNT_inc(sv);
3231 yylval.opval->op_private = 0;
3235 /* Resolve to GV now. */
3236 op_free(yylval.opval);
3237 yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
3238 PL_last_lop_op = OP_ENTERSUB;
3239 /* Is there a prototype? */
3242 PL_last_proto = SvPV((SV*)cv, len);
3245 if (strEQ(PL_last_proto, "$"))
3247 if (*PL_last_proto == '&' && *s == '{') {
3248 sv_setpv(PL_subname,"__ANON__");
3252 PL_last_proto = NULL;
3253 PL_nextval[PL_nexttoke].opval = yylval.opval;
3259 if (PL_hints & HINT_STRICT_SUBS &&
3262 PL_last_lop_op != OP_TRUNCATE && /* S/F prototype in opcode.pl */
3263 PL_last_lop_op != OP_ACCEPT &&
3264 PL_last_lop_op != OP_PIPE_OP &&
3265 PL_last_lop_op != OP_SOCKPAIR &&
3266 !(PL_last_lop_op == OP_ENTERSUB
3268 && PL_last_proto[PL_last_proto[0] == ';' ? 1 : 0] == '*'))
3271 "Bareword \"%s\" not allowed while \"strict subs\" in use",
3276 /* Call it a bare word */
3279 if (ckWARN(WARN_RESERVED)) {
3280 if (lastchar != '-') {
3281 for (d = PL_tokenbuf; *d && isLOWER(*d); d++) ;
3283 warner(WARN_RESERVED, PL_warn_reserved, PL_tokenbuf);
3288 if (lastchar && strchr("*%&", lastchar)) {
3289 warn("Operator or semicolon missing before %c%s",
3290 lastchar, PL_tokenbuf);
3291 warn("Ambiguous use of %c resolved as operator %c",
3292 lastchar, lastchar);
3298 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
3299 newSVsv(GvSV(PL_curcop->cop_filegv)));
3303 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
3304 newSVpvf("%ld", (long)PL_curcop->cop_line));
3307 case KEY___PACKAGE__:
3308 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
3310 ? newSVsv(PL_curstname)
3319 if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
3320 char *pname = "main";
3321 if (PL_tokenbuf[2] == 'D')
3322 pname = HvNAME(PL_curstash ? PL_curstash : PL_defstash);
3323 gv = gv_fetchpv(form("%s::DATA", pname), TRUE, SVt_PVIO);
3326 GvIOp(gv) = newIO();
3327 IoIFP(GvIOp(gv)) = PL_rsfp;
3328 #if defined(HAS_FCNTL) && defined(F_SETFD)
3330 int fd = PerlIO_fileno(PL_rsfp);
3331 fcntl(fd,F_SETFD,fd >= 3);
3334 /* Mark this internal pseudo-handle as clean */
3335 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
3337 IoTYPE(GvIOp(gv)) = '|';
3338 else if ((PerlIO*)PL_rsfp == PerlIO_stdin())
3339 IoTYPE(GvIOp(gv)) = '-';
3341 IoTYPE(GvIOp(gv)) = '<';
3352 if (PL_expect == XSTATE) {
3359 if (*s == ':' && s[1] == ':') {
3362 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
3363 tmp = keyword(PL_tokenbuf, len);
3377 LOP(OP_ACCEPT,XTERM);
3383 LOP(OP_ATAN2,XTERM);
3392 LOP(OP_BLESS,XTERM);
3401 (void)gv_fetchpv("ENV",TRUE, SVt_PVHV); /* may use HOME */
3418 if (!PL_cryptseen++)
3421 LOP(OP_CRYPT,XTERM);
3424 if (ckWARN(WARN_OCTAL)) {
3425 for (d = s; d < PL_bufend && (isSPACE(*d) || *d == '('); d++) ;
3426 if (*d != '0' && isDIGIT(*d))
3427 yywarn("chmod: mode argument is missing initial 0");
3429 LOP(OP_CHMOD,XTERM);
3432 LOP(OP_CHOWN,XTERM);
3435 LOP(OP_CONNECT,XTERM);
3451 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3455 PL_hints |= HINT_BLOCK_SCOPE;
3465 gv_fetchpv("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
3466 LOP(OP_DBMOPEN,XTERM);
3472 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3479 yylval.ival = PL_curcop->cop_line;
3493 PL_expect = (*s == '{') ? XTERMBLOCK : XTERM;
3494 UNIBRACK(OP_ENTEREVAL);
3509 case KEY_endhostent:
3515 case KEY_endservent:
3518 case KEY_endprotoent:
3529 yylval.ival = PL_curcop->cop_line;
3531 if (PL_expect == XSTATE && isIDFIRST_lazy(s)) {
3533 if ((PL_bufend - p) >= 3 &&
3534 strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
3537 if (isIDFIRST_lazy(p))
3538 croak("Missing $ on loop variable");
3543 LOP(OP_FORMLINE,XTERM);
3549 LOP(OP_FCNTL,XTERM);
3555 LOP(OP_FLOCK,XTERM);
3564 LOP(OP_GREPSTART, *s == '(' ? XTERM : XREF);
3567 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3582 case KEY_getpriority:
3583 LOP(OP_GETPRIORITY,XTERM);
3585 case KEY_getprotobyname:
3588 case KEY_getprotobynumber:
3589 LOP(OP_GPBYNUMBER,XTERM);
3591 case KEY_getprotoent:
3603 case KEY_getpeername:
3604 UNI(OP_GETPEERNAME);
3606 case KEY_gethostbyname:
3609 case KEY_gethostbyaddr:
3610 LOP(OP_GHBYADDR,XTERM);
3612 case KEY_gethostent:
3615 case KEY_getnetbyname:
3618 case KEY_getnetbyaddr:
3619 LOP(OP_GNBYADDR,XTERM);
3624 case KEY_getservbyname:
3625 LOP(OP_GSBYNAME,XTERM);
3627 case KEY_getservbyport:
3628 LOP(OP_GSBYPORT,XTERM);
3630 case KEY_getservent:
3633 case KEY_getsockname:
3634 UNI(OP_GETSOCKNAME);
3636 case KEY_getsockopt:
3637 LOP(OP_GSOCKOPT,XTERM);
3659 yylval.ival = PL_curcop->cop_line;
3663 LOP(OP_INDEX,XTERM);
3669 LOP(OP_IOCTL,XTERM);
3681 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3712 LOP(OP_LISTEN,XTERM);
3721 s = scan_pat(s,OP_MATCH);
3722 TERM(sublex_start());
3725 LOP(OP_MAPSTART, XREF);
3728 LOP(OP_MKDIR,XTERM);
3731 LOP(OP_MSGCTL,XTERM);
3734 LOP(OP_MSGGET,XTERM);
3737 LOP(OP_MSGRCV,XTERM);
3740 LOP(OP_MSGSND,XTERM);
3745 if (isIDFIRST_lazy(s)) {
3746 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
3747 PL_in_my_stash = gv_stashpv(PL_tokenbuf, FALSE);
3748 if (!PL_in_my_stash) {
3751 sprintf(tmpbuf, "No such class %.1000s", PL_tokenbuf);
3758 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3765 if (PL_expect != XSTATE)
3766 yyerror("\"no\" not allowed in expression");
3767 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3768 s = force_version(s);
3777 if (isIDFIRST_lazy(s)) {
3779 for (d = s; isALNUM_lazy(d); d++) ;
3781 if (strchr("|&*+-=!?:.", *t))
3782 warn("Precedence problem: open %.*s should be open(%.*s)",
3788 yylval.ival = OP_OR;
3798 LOP(OP_OPEN_DIR,XTERM);
3801 checkcomma(s,PL_tokenbuf,"filehandle");
3805 checkcomma(s,PL_tokenbuf,"filehandle");
3824 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3828 LOP(OP_PIPE_OP,XTERM);
3833 missingterm((char*)0);
3834 yylval.ival = OP_CONST;
3835 TERM(sublex_start());
3843 missingterm((char*)0);
3844 if (ckWARN(WARN_SYNTAX) && SvLEN(PL_lex_stuff)) {
3845 d = SvPV_force(PL_lex_stuff, len);
3846 for (; len; --len, ++d) {
3849 "Possible attempt to separate words with commas");
3854 "Possible attempt to put comments in qw() list");
3860 PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, tokeq(PL_lex_stuff));
3861 PL_lex_stuff = Nullsv;
3864 PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(" ",1));
3867 yylval.ival = OP_SPLIT;
3871 PL_last_lop = PL_oldbufptr;
3872 PL_last_lop_op = OP_SPLIT;
3878 missingterm((char*)0);
3879 yylval.ival = OP_STRINGIFY;
3880 if (SvIVX(PL_lex_stuff) == '\'')
3881 SvIVX(PL_lex_stuff) = 0; /* qq'$foo' should intepolate */
3882 TERM(sublex_start());
3885 s = scan_pat(s,OP_QR);
3886 TERM(sublex_start());
3891 missingterm((char*)0);
3892 yylval.ival = OP_BACKTICK;
3894 TERM(sublex_start());
3900 *PL_tokenbuf = '\0';
3901 s = force_word(s,WORD,TRUE,TRUE,FALSE);
3902 if (isIDFIRST_lazy(PL_tokenbuf))
3903 gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf), TRUE);
3905 yyerror("<> should be quotes");
3912 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3916 LOP(OP_RENAME,XTERM);
3925 LOP(OP_RINDEX,XTERM);
3948 LOP(OP_REVERSE,XTERM);
3959 TERM(sublex_start());
3961 TOKEN(1); /* force error */
3970 LOP(OP_SELECT,XTERM);
3976 LOP(OP_SEMCTL,XTERM);
3979 LOP(OP_SEMGET,XTERM);
3982 LOP(OP_SEMOP,XTERM);
3988 LOP(OP_SETPGRP,XTERM);
3990 case KEY_setpriority:
3991 LOP(OP_SETPRIORITY,XTERM);
3993 case KEY_sethostent:
3999 case KEY_setservent:
4002 case KEY_setprotoent:
4012 LOP(OP_SEEKDIR,XTERM);
4014 case KEY_setsockopt:
4015 LOP(OP_SSOCKOPT,XTERM);
4021 LOP(OP_SHMCTL,XTERM);
4024 LOP(OP_SHMGET,XTERM);
4027 LOP(OP_SHMREAD,XTERM);
4030 LOP(OP_SHMWRITE,XTERM);
4033 LOP(OP_SHUTDOWN,XTERM);
4042 LOP(OP_SOCKET,XTERM);
4044 case KEY_socketpair:
4045 LOP(OP_SOCKPAIR,XTERM);
4048 checkcomma(s,PL_tokenbuf,"subroutine name");
4050 if (*s == ';' || *s == ')') /* probably a close */
4051 croak("sort is now a reserved word");
4053 s = force_word(s,WORD,TRUE,TRUE,FALSE);
4057 LOP(OP_SPLIT,XTERM);
4060 LOP(OP_SPRINTF,XTERM);
4063 LOP(OP_SPLICE,XTERM);
4079 LOP(OP_SUBSTR,XTERM);
4086 if (isIDFIRST_lazy(s) || *s == '\'' || *s == ':') {
4087 char tmpbuf[sizeof PL_tokenbuf];
4089 d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
4090 if (strchr(tmpbuf, ':'))
4091 sv_setpv(PL_subname, tmpbuf);
4093 sv_setsv(PL_subname,PL_curstname);
4094 sv_catpvn(PL_subname,"::",2);
4095 sv_catpvn(PL_subname,tmpbuf,len);
4097 s = force_word(s,WORD,FALSE,TRUE,TRUE);
4101 PL_expect = XTERMBLOCK;
4102 sv_setpv(PL_subname,"?");
4105 if (tmp == KEY_format) {
4108 PL_lex_formbrack = PL_lex_brackets + 1;
4112 /* Look for a prototype */
4119 SvREFCNT_dec(PL_lex_stuff);
4120 PL_lex_stuff = Nullsv;
4121 croak("Prototype not terminated");
4124 d = SvPVX(PL_lex_stuff);
4126 for (p = d; *p; ++p) {
4131 SvCUR(PL_lex_stuff) = tmp;
4134 PL_nextval[1] = PL_nextval[0];
4135 PL_nexttype[1] = PL_nexttype[0];
4136 PL_nextval[0].opval = (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
4137 PL_nexttype[0] = THING;
4138 if (PL_nexttoke == 1) {
4139 PL_lex_defer = PL_lex_state;
4140 PL_lex_expect = PL_expect;
4141 PL_lex_state = LEX_KNOWNEXT;
4143 PL_lex_stuff = Nullsv;
4146 if (*SvPV(PL_subname,n_a) == '?') {
4147 sv_setpv(PL_subname,"__ANON__");
4154 LOP(OP_SYSTEM,XREF);
4157 LOP(OP_SYMLINK,XTERM);
4160 LOP(OP_SYSCALL,XTERM);
4163 LOP(OP_SYSOPEN,XTERM);
4166 LOP(OP_SYSSEEK,XTERM);
4169 LOP(OP_SYSREAD,XTERM);
4172 LOP(OP_SYSWRITE,XTERM);
4176 TERM(sublex_start());
4197 LOP(OP_TRUNCATE,XTERM);
4209 yylval.ival = PL_curcop->cop_line;
4213 yylval.ival = PL_curcop->cop_line;
4217 LOP(OP_UNLINK,XTERM);
4223 LOP(OP_UNPACK,XTERM);
4226 LOP(OP_UTIME,XTERM);
4229 if (ckWARN(WARN_OCTAL)) {
4230 for (d = s; d < PL_bufend && (isSPACE(*d) || *d == '('); d++) ;
4231 if (*d != '0' && isDIGIT(*d))
4232 yywarn("umask: argument is missing initial 0");
4237 LOP(OP_UNSHIFT,XTERM);
4240 if (PL_expect != XSTATE)
4241 yyerror("\"use\" not allowed in expression");
4244 s = force_version(s);
4245 if(*s == ';' || (s = skipspace(s), *s == ';')) {
4246 PL_nextval[PL_nexttoke].opval = Nullop;
4251 s = force_word(s,WORD,FALSE,TRUE,FALSE);
4252 s = force_version(s);
4265 yylval.ival = PL_curcop->cop_line;
4269 PL_hints |= HINT_BLOCK_SCOPE;
4276 LOP(OP_WAITPID,XTERM);
4284 static char ctl_l[2];
4286 if (ctl_l[0] == '\0')
4287 ctl_l[0] = toCTRL('L');
4288 gv_fetchpv(ctl_l,TRUE, SVt_PV);
4291 gv_fetchpv("\f",TRUE, SVt_PV); /* Make sure $^L is defined */
4296 if (PL_expect == XOPERATOR)
4302 yylval.ival = OP_XOR;
4307 TERM(sublex_start());
4313 keyword(register char *d, I32 len)
4318 if (strEQ(d,"__FILE__")) return -KEY___FILE__;
4319 if (strEQ(d,"__LINE__")) return -KEY___LINE__;
4320 if (strEQ(d,"__PACKAGE__")) return -KEY___PACKAGE__;
4321 if (strEQ(d,"__DATA__")) return KEY___DATA__;
4322 if (strEQ(d,"__END__")) return KEY___END__;
4326 if (strEQ(d,"AUTOLOAD")) return KEY_AUTOLOAD;
4331 if (strEQ(d,"and")) return -KEY_and;
4332 if (strEQ(d,"abs")) return -KEY_abs;
4335 if (strEQ(d,"alarm")) return -KEY_alarm;
4336 if (strEQ(d,"atan2")) return -KEY_atan2;
4339 if (strEQ(d,"accept")) return -KEY_accept;
4344 if (strEQ(d,"BEGIN")) return KEY_BEGIN;
4347 if (strEQ(d,"bless")) return -KEY_bless;
4348 if (strEQ(d,"bind")) return -KEY_bind;
4349 if (strEQ(d,"binmode")) return -KEY_binmode;
4352 if (strEQ(d,"CORE")) return -KEY_CORE;
4357 if (strEQ(d,"cmp")) return -KEY_cmp;
4358 if (strEQ(d,"chr")) return -KEY_chr;
4359 if (strEQ(d,"cos")) return -KEY_cos;
4362 if (strEQ(d,"chop")) return KEY_chop;
4365 if (strEQ(d,"close")) return -KEY_close;
4366 if (strEQ(d,"chdir")) return -KEY_chdir;
4367 if (strEQ(d,"chomp")) return KEY_chomp;
4368 if (strEQ(d,"chmod")) return -KEY_chmod;
4369 if (strEQ(d,"chown")) return -KEY_chown;
4370 if (strEQ(d,"crypt")) return -KEY_crypt;
4373 if (strEQ(d,"chroot")) return -KEY_chroot;
4374 if (strEQ(d,"caller")) return -KEY_caller;
4377 if (strEQ(d,"connect")) return -KEY_connect;
4380 if (strEQ(d,"closedir")) return -KEY_closedir;
4381 if (strEQ(d,"continue")) return -KEY_continue;
4386 if (strEQ(d,"DESTROY")) return KEY_DESTROY;
4391 if (strEQ(d,"do")) return KEY_do;
4394 if (strEQ(d,"die")) return -KEY_die;
4397 if (strEQ(d,"dump")) return -KEY_dump;
4400 if (strEQ(d,"delete")) return KEY_delete;
4403 if (strEQ(d,"defined")) return KEY_defined;
4404 if (strEQ(d,"dbmopen")) return -KEY_dbmopen;
4407 if (strEQ(d,"dbmclose")) return -KEY_dbmclose;
4412 if (strEQ(d,"EQ")) { deprecate(d); return -KEY_eq;}
4413 if (strEQ(d,"END")) return KEY_END;
4418 if (strEQ(d,"eq")) return -KEY_eq;
4421 if (strEQ(d,"eof")) return -KEY_eof;
4422 if (strEQ(d,"exp")) return -KEY_exp;
4425 if (strEQ(d,"else")) return KEY_else;
4426 if (strEQ(d,"exit")) return -KEY_exit;
4427 if (strEQ(d,"eval")) return KEY_eval;
4428 if (strEQ(d,"exec")) return -KEY_exec;
4429 if (strEQ(d,"each")) return KEY_each;
4432 if (strEQ(d,"elsif")) return KEY_elsif;
4435 if (strEQ(d,"exists")) return KEY_exists;
4436 if (strEQ(d,"elseif")) warn("elseif should be elsif");
4439 if (strEQ(d,"endgrent")) return -KEY_endgrent;
4440 if (strEQ(d,"endpwent")) return -KEY_endpwent;
4443 if (strEQ(d,"endnetent")) return -KEY_endnetent;
4446 if (strEQ(d,"endhostent")) return -KEY_endhostent;
4447 if (strEQ(d,"endservent")) return -KEY_endservent;
4450 if (strEQ(d,"endprotoent")) return -KEY_endprotoent;
4457 if (strEQ(d,"for")) return KEY_for;
4460 if (strEQ(d,"fork")) return -KEY_fork;