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 static void check_uni _((void));
18 static void force_next _((I32 type));
19 static char *force_version _((char *start));
20 static char *force_word _((char *start, int token, int check_keyword, int allow_pack, int allow_tick));
21 static SV *q _((SV *sv));
22 static char *scan_const _((char *start));
23 static char *scan_formline _((char *s));
24 static char *scan_heredoc _((char *s));
25 static char *scan_ident _((char *s, char *send, char *dest, STRLEN destlen,
27 static char *scan_inputsymbol _((char *start));
28 static char *scan_pat _((char *start));
29 static char *scan_str _((char *start));
30 static char *scan_subst _((char *start));
31 static char *scan_trans _((char *start));
32 static char *scan_word _((char *s, char *dest, STRLEN destlen,
33 int allow_package, STRLEN *slp));
34 static char *skipspace _((char *s));
35 static void checkcomma _((char *s, char *name, char *what));
36 static void force_ident _((char *s, int kind));
37 static void incline _((char *s));
38 static int intuit_method _((char *s, GV *gv));
39 static int intuit_more _((char *s));
40 static I32 lop _((I32 f, expectation x, char *s));
41 static void missingterm _((char *s));
42 static void no_op _((char *what, char *s));
43 static void set_csh _((void));
44 static I32 sublex_done _((void));
45 static I32 sublex_push _((void));
46 static I32 sublex_start _((void));
48 static int uni _((I32 f, char *s));
50 static char * filter_gets _((SV *sv, PerlIO *fp, STRLEN append));
51 static void restore_rsfp _((void *f));
52 static void restore_expect _((void *e));
53 static void restore_lex_expect _((void *e));
55 static char ident_too_long[] = "Identifier too long";
57 static char *linestart; /* beg. of most recently read line */
59 static char pending_ident; /* pending identifier lookup */
62 I32 super_state; /* lexer state to save */
63 I32 sub_inwhat; /* "lex_inwhat" to use */
64 OP *sub_op; /* "lex_op" to use */
67 /* The following are arranged oddly so that the guard on the switch statement
68 * can get by with a single comparison (if the compiler is smart enough).
71 /* #define LEX_NOTPARSING 11 is done in perl.h. */
74 #define LEX_INTERPNORMAL 9
75 #define LEX_INTERPCASEMOD 8
76 #define LEX_INTERPPUSH 7
77 #define LEX_INTERPSTART 6
78 #define LEX_INTERPEND 5
79 #define LEX_INTERPENDMAYBE 4
80 #define LEX_INTERPCONCAT 3
81 #define LEX_INTERPCONST 2
82 #define LEX_FORMLINE 1
83 #define LEX_KNOWNEXT 0
92 /* XXX If this causes problems, set i_unistd=undef in the hint file. */
94 # include <unistd.h> /* Needed for execv() */
102 #include "keywords.h"
107 #define CLINE (copline = (curcop->cop_line < copline ? curcop->cop_line : copline))
109 #define TOKEN(retval) return (bufptr = s,(int)retval)
110 #define OPERATOR(retval) return (expect = XTERM,bufptr = s,(int)retval)
111 #define AOPERATOR(retval) return ao((expect = XTERM,bufptr = s,(int)retval))
112 #define PREBLOCK(retval) return (expect = XBLOCK,bufptr = s,(int)retval)
113 #define PRETERMBLOCK(retval) return (expect = XTERMBLOCK,bufptr = s,(int)retval)
114 #define PREREF(retval) return (expect = XREF,bufptr = s,(int)retval)
115 #define TERM(retval) return (CLINE, expect = XOPERATOR,bufptr = s,(int)retval)
116 #define LOOPX(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)LOOPEX)
117 #define FTST(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)UNIOP)
118 #define FUN0(f) return(yylval.ival = f,expect = XOPERATOR,bufptr = s,(int)FUNC0)
119 #define FUN1(f) return(yylval.ival = f,expect = XOPERATOR,bufptr = s,(int)FUNC1)
120 #define BOop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)BITOROP))
121 #define BAop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)BITANDOP))
122 #define SHop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)SHIFTOP))
123 #define PWop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)POWOP))
124 #define PMop(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)MATCHOP)
125 #define Aop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)ADDOP))
126 #define Mop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)MULOP))
127 #define Eop(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)EQOP)
128 #define Rop(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)RELOP)
130 /* This bit of chicanery makes a unary function followed by
131 * a parenthesis into a function with one argument, highest precedence.
133 #define UNI(f) return(yylval.ival = f, \
136 last_uni = oldbufptr, \
138 (*s == '(' || (s = skipspace(s), *s == '(') ? (int)FUNC1 : (int)UNIOP) )
140 #define UNIBRACK(f) return(yylval.ival = f, \
142 last_uni = oldbufptr, \
143 (*s == '(' || (s = skipspace(s), *s == '(') ? (int)FUNC1 : (int)UNIOP) )
145 /* grandfather return to old style */
146 #define OLDLOP(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)LSTOP)
151 if (*bufptr == '=') {
153 if (toketype == ANDAND)
154 yylval.ival = OP_ANDASSIGN;
155 else if (toketype == OROR)
156 yylval.ival = OP_ORASSIGN;
163 no_op(char *what, char *s)
165 char *oldbp = bufptr;
166 bool is_first = (oldbufptr == linestart);
169 yywarn(form("%s found where operator expected", what));
171 warn("\t(Missing semicolon on previous line?)\n");
172 else if (oldoldbufptr && isIDFIRST(*oldoldbufptr)) {
174 for (t = oldoldbufptr; *t && (isALNUM(*t) || *t == ':'); t++) ;
175 if (t < bufptr && isSPACE(*t))
176 warn("\t(Do you need to predeclare %.*s?)\n",
177 t - oldoldbufptr, oldoldbufptr);
181 warn("\t(Missing operator before %.*s?)\n", s - oldbp, oldbp);
191 char *nl = strrchr(s,'\n');
195 else if (multi_close < 32 || multi_close == 127) {
197 tmpbuf[1] = toCTRL(multi_close);
203 *tmpbuf = multi_close;
207 q = strchr(s,'"') ? '\'' : '"';
208 croak("Can't find string terminator %c%s%c anywhere before EOF",q,s,q);
215 warn("Use of %s is deprecated", s);
221 deprecate("comma-less variable list");
227 win32_textfilter(int idx, SV *sv, int maxlen)
229 I32 count = FILTER_READ(idx+1, sv, maxlen);
230 if (count > 0 && !maxlen)
231 win32_strip_return(sv);
245 SAVEI32(lex_brackets);
246 SAVEI32(lex_fakebrack);
247 SAVEI32(lex_casemods);
252 SAVEI16(curcop->cop_line);
256 SAVEPPTR(oldoldbufptr);
259 SAVEPPTR(lex_brackstack);
260 SAVEPPTR(lex_casestack);
261 SAVEDESTRUCTOR(restore_rsfp, rsfp);
265 SAVEDESTRUCTOR(restore_expect, tokenbuf + expect); /* encode as pointer */
266 SAVEDESTRUCTOR(restore_lex_expect, tokenbuf + expect);
268 lex_state = LEX_NORMAL;
273 New(899, lex_brackstack, 120, char);
274 New(899, lex_casestack, 12, char);
275 SAVEFREEPV(lex_brackstack);
276 SAVEFREEPV(lex_casestack);
278 *lex_casestack = '\0';
286 if (SvREADONLY(linestr))
287 linestr = sv_2mortal(newSVsv(linestr));
288 s = SvPV(linestr, len);
289 if (len && s[len-1] != ';') {
290 if (!(SvFLAGS(linestr) & SVs_TEMP))
291 linestr = sv_2mortal(newSVsv(linestr));
292 sv_catpvn(linestr, "\n;", 2);
295 oldoldbufptr = oldbufptr = bufptr = linestart = SvPVX(linestr);
296 bufend = bufptr + SvCUR(linestr);
298 rs = newSVpv("\n", 1);
309 restore_rsfp(void *f)
311 PerlIO *fp = (PerlIO*)f;
313 if (rsfp == PerlIO_stdin())
314 PerlIO_clearerr(rsfp);
315 else if (rsfp && (rsfp != fp))
321 restore_expect(void *e)
323 /* a safe way to store a small integer in a pointer */
324 expect = (expectation)((char *)e - tokenbuf);
328 restore_lex_expect(void *e)
330 /* a safe way to store a small integer in a pointer */
331 lex_expect = (expectation)((char *)e - tokenbuf);
346 while (*s == ' ' || *s == '\t') s++;
347 if (strnEQ(s, "line ", 5)) {
356 while (*s == ' ' || *s == '\t')
358 if (*s == '"' && (t = strchr(s+1, '"')))
362 return; /* false alarm */
363 for (t = s; !isSPACE(*t); t++) ;
368 curcop->cop_filegv = gv_fetchfile(s);
370 curcop->cop_filegv = gv_fetchfile(origfilename);
372 curcop->cop_line = atoi(n)-1;
376 skipspace(register char *s)
379 if (lex_formbrack && lex_brackets <= lex_formbrack) {
380 while (s < bufend && (*s == ' ' || *s == '\t'))
386 while (s < bufend && isSPACE(*s))
388 if (s < bufend && *s == '#') {
389 while (s < bufend && *s != '\n')
394 if (s < bufend || !rsfp || lex_state != LEX_NORMAL)
396 if ((s = filter_gets(linestr, rsfp, (prevlen = SvCUR(linestr)))) == Nullch) {
397 if (minus_n || minus_p) {
398 sv_setpv(linestr,minus_p ?
399 ";}continue{print or die qq(-p destination: $!\\n)" :
401 sv_catpv(linestr,";}");
402 minus_n = minus_p = 0;
405 sv_setpv(linestr,";");
406 oldoldbufptr = oldbufptr = bufptr = s = linestart = SvPVX(linestr);
407 bufend = SvPVX(linestr) + SvCUR(linestr);
408 if (preprocess && !in_eval)
409 (void)PerlProc_pclose(rsfp);
410 else if ((PerlIO*)rsfp == PerlIO_stdin())
411 PerlIO_clearerr(rsfp);
413 (void)PerlIO_close(rsfp);
417 linestart = bufptr = s + prevlen;
418 bufend = s + SvCUR(linestr);
421 if (PERLDB_LINE && curstash != debstash) {
422 SV *sv = NEWSV(85,0);
424 sv_upgrade(sv, SVt_PVMG);
425 sv_setpvn(sv,bufptr,bufend-bufptr);
426 av_store(GvAV(curcop->cop_filegv),(I32)curcop->cop_line,sv);
437 if (oldoldbufptr != last_uni)
439 while (isSPACE(*last_uni))
441 for (s = last_uni; isALNUM(*s) || *s == '-'; s++) ;
442 if ((t = strchr(s, '(')) && t < bufptr)
446 warn("Warning: Use of \"%s\" without parens is ambiguous", last_uni);
453 #define UNI(f) return uni(f,s)
461 last_uni = oldbufptr;
472 #endif /* CRIPPLED_CC */
474 #define LOP(f,x) return lop(f,x,s)
477 lop(I32 f, expectation x, char *s)
484 last_lop = oldbufptr;
500 nexttype[nexttoke] = type;
502 if (lex_state != LEX_KNOWNEXT) {
503 lex_defer = lex_state;
505 lex_state = LEX_KNOWNEXT;
510 force_word(register char *start, int token, int check_keyword, int allow_pack, int allow_initial_tick)
515 start = skipspace(start);
518 (allow_pack && *s == ':') ||
519 (allow_initial_tick && *s == '\'') )
521 s = scan_word(s, tokenbuf, sizeof tokenbuf, allow_pack, &len);
522 if (check_keyword && keyword(tokenbuf, len))
524 if (token == METHOD) {
534 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST,0, newSVpv(tokenbuf,0));
535 nextval[nexttoke].opval->op_private |= OPpCONST_BARE;
542 force_ident(register char *s, int kind)
545 OP* o = (OP*)newSVOP(OP_CONST, 0, newSVpv(s,0));
546 nextval[nexttoke].opval = o;
549 dTHR; /* just for in_eval */
550 o->op_private = OPpCONST_ENTERED;
551 /* XXX see note in pp_entereval() for why we forgo typo
552 warnings if the symbol must be introduced in an eval.
554 gv_fetchpv(s, in_eval ? (GV_ADDMULTI | 8) : TRUE,
555 kind == '$' ? SVt_PV :
556 kind == '@' ? SVt_PVAV :
557 kind == '%' ? SVt_PVHV :
565 force_version(char *s)
567 OP *version = Nullop;
571 /* default VERSION number -- GBARR */
576 for( d=s, c = 1; isDIGIT(*d) || *d == '_' || (*d == '.' && c--); d++);
577 if((*d == ';' || isSPACE(*d)) && *(skipspace(d)) != ',') {
579 /* real VERSION number -- GBARR */
580 version = yylval.opval;
584 /* NOTE: The parser sees the package name and the VERSION swapped */
585 nextval[nexttoke].opval = version;
602 s = SvPV_force(sv, len);
606 while (s < send && *s != '\\')
613 if (s + 1 < send && (s[1] == '\\'))
614 s++; /* all that, just for this */
619 SvCUR_set(sv, d - SvPVX(sv));
627 register I32 op_type = yylval.ival;
629 if (op_type == OP_NULL) {
630 yylval.opval = lex_op;
634 if (op_type == OP_CONST || op_type == OP_READLINE) {
635 SV *sv = q(lex_stuff);
637 char *p = SvPV(sv, len);
638 yylval.opval = (OP*)newSVOP(op_type, 0, newSVpv(p, len));
644 sublex_info.super_state = lex_state;
645 sublex_info.sub_inwhat = op_type;
646 sublex_info.sub_op = lex_op;
647 lex_state = LEX_INTERPPUSH;
651 yylval.opval = lex_op;
665 lex_state = sublex_info.super_state;
667 SAVEI32(lex_brackets);
668 SAVEI32(lex_fakebrack);
669 SAVEI32(lex_casemods);
674 SAVEI16(curcop->cop_line);
677 SAVEPPTR(oldoldbufptr);
680 SAVEPPTR(lex_brackstack);
681 SAVEPPTR(lex_casestack);
686 bufend = bufptr = oldbufptr = oldoldbufptr = linestart = SvPVX(linestr);
687 bufend += SvCUR(linestr);
693 New(899, lex_brackstack, 120, char);
694 New(899, lex_casestack, 12, char);
695 SAVEFREEPV(lex_brackstack);
696 SAVEFREEPV(lex_casestack);
698 *lex_casestack = '\0';
700 lex_state = LEX_INTERPCONCAT;
701 curcop->cop_line = multi_start;
703 lex_inwhat = sublex_info.sub_inwhat;
704 if (lex_inwhat == OP_MATCH || lex_inwhat == OP_SUBST)
705 lex_inpat = sublex_info.sub_op;
717 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv("",0));
721 if (lex_casemods) { /* oops, we've got some unbalanced parens */
722 lex_state = LEX_INTERPCASEMOD;
726 /* Is there a right-hand side to take care of? */
727 if (lex_repl && (lex_inwhat == OP_SUBST || lex_inwhat == OP_TRANS)) {
730 bufend = bufptr = oldbufptr = oldoldbufptr = linestart = SvPVX(linestr);
731 bufend += SvCUR(linestr);
737 *lex_casestack = '\0';
739 if (SvCOMPILED(lex_repl)) {
740 lex_state = LEX_INTERPNORMAL;
744 lex_state = LEX_INTERPCONCAT;
750 bufend = SvPVX(linestr);
751 bufend += SvCUR(linestr);
760 Extracts a pattern, double-quoted string, or transliteration. This
763 It looks at lex_inwhat and lex_inpat to find out whether it's
764 processing a pattern (lex_inpat is true), a transliteration
765 (lex_inwhat & OP_TRANS is true), or a double-quoted string.
767 Returns a pointer to the character scanned up to. Iff this is
768 advanced from the start pointer supplied (ie if anything was
769 successfully parsed), will leave an OP for the substring scanned
770 in yylval. Caller must intuit reason for not parsing further
771 by looking at the next characters herself.
775 double-quoted style: \r and \n
776 regexp special ones: \D \s
778 backrefs: \1 (deprecated in substitution replacements)
779 case and quoting: \U \Q \E
780 stops on @ and $, but not for $ as tail anchor
783 characters are VERY literal, except for - not at the start or end
784 of the string, which indicates a range. scan_const expands the
785 range to the full set of intermediate characters.
787 In double-quoted strings:
789 double-quoted style: \r and \n
791 backrefs: \1 (deprecated)
792 case and quoting: \U \Q \E
795 scan_const does *not* construct ops to handle interpolated strings.
796 It stops processing as soon as it finds an embedded $ or @ variable
797 and leaves it to the caller to work out what's going on.
799 @ in pattern could be: @foo, @{foo}, @$foo, @'foo, @:foo.
801 $ in pattern could be $foo or could be tail anchor. Assumption:
802 it's a tail anchor if $ is the last thing in the string, or if it's
803 followed by one of ")| \n\t"
805 \1 (backreferences) are turned into $1
807 The structure of the code is
808 while (there's a character to process) {
809 handle transliteration ranges
811 skip # initiated comments in //x patterns
812 check for embedded @foo
813 check for embedded scalars
815 leave intact backslashes from leave (below)
816 deprecate \1 in strings and sub replacements
817 handle string-changing backslashes \l \U \Q \E, etc.
818 switch (what was escaped) {
819 handle - in a transliteration (becomes a literal -)
820 handle \132 octal characters
821 handle 0x15 hex characters
822 handle \cV (control V)
823 handle printf backslashes (\f, \r, \n, etc)
826 } (end while character to read)
831 scan_const(char *start)
833 register char *send = bufend; /* end of the constant */
834 SV *sv = NEWSV(93, send - start); /* sv for the constant */
835 register char *s = start; /* start of the constant */
836 register char *d = SvPVX(sv); /* destination for copies */
837 bool dorange = FALSE; /* are we in a translit range? */
840 /* leaveit is the set of acceptably-backslashed characters */
843 ? "\\.^$@AGZdDwWsSbB+*?|()-nrtfeaxc0123456789[{]} \t\n\r\f\v#"
846 while (s < send || dorange) {
847 /* get transliterations out of the way (they're most literal) */
848 if (lex_inwhat == OP_TRANS) {
849 /* expand a range A-Z to the full set of characters. AIE! */
851 I32 i; /* current expanded character */
852 I32 max; /* last character in range */
854 i = d - SvPVX(sv); /* remember current offset */
855 SvGROW(sv, SvLEN(sv) + 256); /* expand the sv -- there'll never be more'n 256 chars in a range for it to grow by */
856 d = SvPVX(sv) + i; /* restore d after the grow potentially has changed the ptr */
857 d -= 2; /* eat the first char and the - */
859 max = (U8)d[1]; /* last char in range */
861 for (i = (U8)*d; i <= max; i++)
864 /* mark the range as done, and continue */
869 /* range begins (ignore - as first or last char) */
870 else if (*s == '-' && s+1 < send && s != start) {
876 /* if we get here, we're not doing a transliteration */
878 /* skip for regexp comments /(?#comment)/ */
879 else if (*s == '(' && lex_inpat && s[1] == '?') {
881 while (s < send && *s != ')')
883 } else if (s[2] == '{') { /* This should march regcomp.c */
885 char *regparse = s + 3;
888 while (count && (c = *regparse)) {
889 if (c == '\\' && regparse[1])
897 if (*regparse == ')')
900 yyerror("Sequence (?{...}) not terminated or not {}-balanced");
901 while (s < regparse && *s != ')')
906 /* likewise skip #-initiated comments in //x patterns */
907 else if (*s == '#' && lex_inpat &&
908 ((PMOP*)lex_inpat)->op_pmflags & PMf_EXTENDED) {
909 while (s+1 < send && *s != '\n')
913 /* check for embedded arrays (@foo, @:foo, @'foo, @{foo}, @$foo) */
914 else if (*s == '@' && s[1] && (isALNUM(s[1]) || strchr(":'{$", s[1])))
917 /* check for embedded scalars. only stop if we're sure it's a
920 else if (*s == '$') {
921 if (!lex_inpat) /* not a regexp, so $ must be var */
923 if (s + 1 < send && !strchr("()| \n\t", s[1]))
924 break; /* in regexp, $ might be tail anchor */
928 if (*s == '\\' && s+1 < send) {
931 /* some backslashes we leave behind */
932 if (*s && strchr(leaveit, *s)) {
938 /* deprecate \1 in strings and substitution replacements */
939 if (lex_inwhat == OP_SUBST && !lex_inpat &&
940 isDIGIT(*s) && *s != '0' && !isDIGIT(s[1]))
943 warn("\\%c better written as $%c", *s, *s);
948 /* string-change backslash escapes */
949 if (lex_inwhat != OP_TRANS && *s && strchr("lLuUEQ", *s)) {
954 /* if we get here, it's either a quoted -, or a digit */
957 /* quoted - in transliterations */
959 if (lex_inwhat == OP_TRANS) {
964 /* default action is to copy the quoted character */
969 /* \132 indicates an octal constant */
970 case '0': case '1': case '2': case '3':
971 case '4': case '5': case '6': case '7':
972 *d++ = scan_oct(s, 3, &len);
976 /* \x24 indicates a hex constant */
978 *d++ = scan_hex(++s, 2, &len);
982 /* \c is a control character */
989 /* printf-style backslashes, formfeeds, newlines, etc */
1015 } /* end if (backslash) */
1018 } /* while loop to process each character */
1020 /* terminate the string and set up the sv */
1022 SvCUR_set(sv, d - SvPVX(sv));
1025 /* shrink the sv if we allocated more than we used */
1026 if (SvCUR(sv) + 5 < SvLEN(sv)) {
1027 SvLEN_set(sv, SvCUR(sv) + 1);
1028 Renew(SvPVX(sv), SvLEN(sv), char);
1031 /* return the substring (via yylval) only if we parsed anything */
1033 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
1039 /* This is the one truly awful dwimmer necessary to conflate C and sed. */
1041 intuit_more(register char *s)
1045 if (*s == '-' && s[1] == '>' && (s[2] == '[' || s[2] == '{'))
1047 if (*s != '{' && *s != '[')
1052 /* In a pattern, so maybe we have {n,m}. */
1069 /* On the other hand, maybe we have a character class */
1072 if (*s == ']' || *s == '^')
1075 int weight = 2; /* let's weigh the evidence */
1077 unsigned char un_char = 255, last_un_char;
1078 char *send = strchr(s,']');
1079 char tmpbuf[sizeof tokenbuf * 4];
1081 if (!send) /* has to be an expression */
1084 Zero(seen,256,char);
1087 else if (isDIGIT(*s)) {
1089 if (isDIGIT(s[1]) && s[2] == ']')
1095 for (; s < send; s++) {
1096 last_un_char = un_char;
1097 un_char = (unsigned char)*s;
1102 weight -= seen[un_char] * 10;
1103 if (isALNUM(s[1])) {
1104 scan_ident(s, send, tmpbuf, sizeof tmpbuf, FALSE);
1105 if ((int)strlen(tmpbuf) > 1 && gv_fetchpv(tmpbuf,FALSE, SVt_PV))
1110 else if (*s == '$' && s[1] &&
1111 strchr("[#!%*<>()-=",s[1])) {
1112 if (/*{*/ strchr("])} =",s[2]))
1121 if (strchr("wds]",s[1]))
1123 else if (seen['\''] || seen['"'])
1125 else if (strchr("rnftbxcav",s[1]))
1127 else if (isDIGIT(s[1])) {
1129 while (s[1] && isDIGIT(s[1]))
1139 if (strchr("aA01! ",last_un_char))
1141 if (strchr("zZ79~",s[1]))
1143 if (last_un_char == 255 && (isDIGIT(s[1]) || s[1] == '$'))
1144 weight -= 5; /* cope with negative subscript */
1147 if (!isALNUM(last_un_char) && !strchr("$@&",last_un_char) &&
1148 isALPHA(*s) && s[1] && isALPHA(s[1])) {
1153 if (keyword(tmpbuf, d - tmpbuf))
1156 if (un_char == last_un_char + 1)
1158 weight -= seen[un_char];
1163 if (weight >= 0) /* probably a character class */
1171 intuit_method(char *start, GV *gv)
1173 char *s = start + (*start == '$');
1174 char tmpbuf[sizeof tokenbuf];
1182 if ((cv = GvCVu(gv))) {
1183 char *proto = SvPVX(cv);
1193 s = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
1194 if (*start == '$') {
1195 if (gv || last_lop_op == OP_PRINT || isUPPER(*tokenbuf))
1200 return *s == '(' ? FUNCMETH : METHOD;
1202 if (!keyword(tmpbuf, len)) {
1203 if (len > 2 && tmpbuf[len - 2] == ':' && tmpbuf[len - 1] == ':') {
1208 indirgv = gv_fetchpv(tmpbuf, FALSE, SVt_PVCV);
1209 if (indirgv && GvCVu(indirgv))
1211 /* filehandle or package name makes it a method */
1212 if (!gv || GvIO(indirgv) || gv_stashpvn(tmpbuf, len, FALSE)) {
1214 if ((bufend - s) >= 2 && *s == '=' && *(s+1) == '>')
1215 return 0; /* no assumptions -- "=>" quotes bearword */
1217 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST, 0,
1219 nextval[nexttoke].opval->op_private = OPpCONST_BARE;
1223 return *s == '(' ? FUNCMETH : METHOD;
1233 char *pdb = PerlEnv_getenv("PERL5DB");
1237 SETERRNO(0,SS$_NORMAL);
1238 return "BEGIN { require 'perl5db.pl' }";
1244 /* Encoded script support. filter_add() effectively inserts a
1245 * 'pre-processing' function into the current source input stream.
1246 * Note that the filter function only applies to the current source file
1247 * (e.g., it will not affect files 'require'd or 'use'd by this one).
1249 * The datasv parameter (which may be NULL) can be used to pass
1250 * private data to this instance of the filter. The filter function
1251 * can recover the SV using the FILTER_DATA macro and use it to
1252 * store private buffers and state information.
1254 * The supplied datasv parameter is upgraded to a PVIO type
1255 * and the IoDIRP field is used to store the function pointer.
1256 * Note that IoTOP_NAME, IoFMT_NAME, IoBOTTOM_NAME, if set for
1257 * private use must be set using malloc'd pointers.
1259 static int filter_debug = 0;
1262 filter_add(filter_t funcp, SV *datasv)
1264 if (!funcp){ /* temporary handy debugging hack to be deleted */
1265 filter_debug = atoi((char*)datasv);
1269 rsfp_filters = newAV();
1271 datasv = NEWSV(255,0);
1272 if (!SvUPGRADE(datasv, SVt_PVIO))
1273 die("Can't upgrade filter_add data to SVt_PVIO");
1274 IoDIRP(datasv) = (DIR*)funcp; /* stash funcp into spare field */
1276 warn("filter_add func %p (%s)", funcp, SvPV(datasv,na));
1277 av_unshift(rsfp_filters, 1);
1278 av_store(rsfp_filters, 0, datasv) ;
1283 /* Delete most recently added instance of this filter function. */
1285 filter_del(filter_t funcp)
1288 warn("filter_del func %p", funcp);
1289 if (!rsfp_filters || AvFILLp(rsfp_filters)<0)
1291 /* if filter is on top of stack (usual case) just pop it off */
1292 if (IoDIRP(FILTER_DATA(AvFILLp(rsfp_filters))) == (void*)funcp){
1293 sv_free(av_pop(rsfp_filters));
1297 /* we need to search for the correct entry and clear it */
1298 die("filter_del can only delete in reverse order (currently)");
1302 /* Invoke the n'th filter function for the current rsfp. */
1304 filter_read(int idx, SV *buf_sv, int maxlen)
1307 /* 0 = read one text line */
1314 if (idx > AvFILLp(rsfp_filters)){ /* Any more filters? */
1315 /* Provide a default input filter to make life easy. */
1316 /* Note that we append to the line. This is handy. */
1318 warn("filter_read %d: from rsfp\n", idx);
1322 int old_len = SvCUR(buf_sv) ;
1324 /* ensure buf_sv is large enough */
1325 SvGROW(buf_sv, old_len + maxlen) ;
1326 if ((len = PerlIO_read(rsfp, SvPVX(buf_sv) + old_len, maxlen)) <= 0){
1327 if (PerlIO_error(rsfp))
1328 return -1; /* error */
1330 return 0 ; /* end of file */
1332 SvCUR_set(buf_sv, old_len + len) ;
1335 if (sv_gets(buf_sv, rsfp, SvCUR(buf_sv)) == NULL) {
1336 if (PerlIO_error(rsfp))
1337 return -1; /* error */
1339 return 0 ; /* end of file */
1342 return SvCUR(buf_sv);
1344 /* Skip this filter slot if filter has been deleted */
1345 if ( (datasv = FILTER_DATA(idx)) == &sv_undef){
1347 warn("filter_read %d: skipped (filter deleted)\n", idx);
1348 return FILTER_READ(idx+1, buf_sv, maxlen); /* recurse */
1350 /* Get function pointer hidden within datasv */
1351 funcp = (filter_t)IoDIRP(datasv);
1353 warn("filter_read %d: via function %p (%s)\n",
1354 idx, funcp, SvPV(datasv,na));
1355 /* Call function. The function is expected to */
1356 /* call "FILTER_READ(idx+1, buf_sv)" first. */
1357 /* Return: <0:error, =0:eof, >0:not eof */
1358 return (*funcp)(idx, buf_sv, maxlen);
1362 filter_gets(register SV *sv, register PerlIO *fp, STRLEN append)
1365 if (!rsfp_filters) {
1366 filter_add(win32_textfilter,NULL);
1372 SvCUR_set(sv, 0); /* start with empty line */
1373 if (FILTER_READ(0, sv, 0) > 0)
1374 return ( SvPVX(sv) ) ;
1379 return (sv_gets(sv, fp, append));
1384 static char* exp_name[] =
1385 { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "TERMBLOCK" };
1388 EXT int yychar; /* last token */
1393 Works out what to call the token just pulled out of the input
1394 stream. The yacc parser takes care of taking the ops we return and
1395 stitching them into a tree.
1401 if read an identifier
1402 if we're in a my declaration
1403 croak if they tried to say my($foo::bar)
1404 build the ops for a my() declaration
1405 if it's an access to a my() variable
1406 are we in a sort block?
1407 croak if my($a); $a <=> $b
1408 build ops for access to a my() variable
1409 if in a dq string, and they've said @foo and we can't find @foo
1411 build ops for a bareword
1412 if we already built the token before, use it.
1426 /* check if there's an identifier for us to look at */
1427 if (pending_ident) {
1428 /* pit holds the identifier we read and pending_ident is reset */
1429 char pit = pending_ident;
1432 /* if we're in a my(), we can't allow dynamics here.
1433 $foo'bar has already been turned into $foo::bar, so
1434 just check for colons.
1436 if it's a legal name, the OP is a PADANY.
1439 if (strchr(tokenbuf,':'))
1440 croak(no_myglob,tokenbuf);
1442 yylval.opval = newOP(OP_PADANY, 0);
1443 yylval.opval->op_targ = pad_allocmy(tokenbuf);
1448 build the ops for accesses to a my() variable.
1450 Deny my($a) or my($b) in a sort block, *if* $a or $b is
1451 then used in a comparison. This catches most, but not
1452 all cases. For instance, it catches
1453 sort { my($a); $a <=> $b }
1455 sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
1456 (although why you'd do that is anyone's guess).
1459 if (!strchr(tokenbuf,':')) {
1461 /* Check for single character per-thread SVs */
1462 if (tokenbuf[0] == '$' && tokenbuf[2] == '\0'
1463 && !isALPHA(tokenbuf[1]) /* Rule out obvious non-threadsvs */
1464 && (tmp = find_threadsv(&tokenbuf[1])) != NOT_IN_PAD)
1466 yylval.opval = newOP(OP_THREADSV, 0);
1467 yylval.opval->op_targ = tmp;
1470 #endif /* USE_THREADS */
1471 if ((tmp = pad_findmy(tokenbuf)) != NOT_IN_PAD) {
1472 /* if it's a sort block and they're naming $a or $b */
1473 if (last_lop_op == OP_SORT &&
1474 tokenbuf[0] == '$' &&
1475 (tokenbuf[1] == 'a' || tokenbuf[1] == 'b')
1478 for (d = in_eval ? oldoldbufptr : linestart;
1479 d < bufend && *d != '\n';
1482 if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
1483 croak("Can't use \"my %s\" in sort comparison",
1489 yylval.opval = newOP(OP_PADANY, 0);
1490 yylval.opval->op_targ = tmp;
1496 Whine if they've said @foo in a doublequoted string,
1497 and @foo isn't a variable we can find in the symbol
1500 if (pit == '@' && lex_state != LEX_NORMAL && !lex_brackets) {
1501 GV *gv = gv_fetchpv(tokenbuf+1, FALSE, SVt_PVAV);
1502 if (!gv || ((tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
1503 yyerror(form("In string, %s now must be written as \\%s",
1504 tokenbuf, tokenbuf));
1507 /* build ops for a bareword */
1508 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(tokenbuf+1, 0));
1509 yylval.opval->op_private = OPpCONST_ENTERED;
1510 gv_fetchpv(tokenbuf+1, in_eval ? (GV_ADDMULTI | 8) : TRUE,
1511 ((tokenbuf[0] == '$') ? SVt_PV
1512 : (tokenbuf[0] == '@') ? SVt_PVAV
1517 /* no identifier pending identification */
1519 switch (lex_state) {
1521 case LEX_NORMAL: /* Some compilers will produce faster */
1522 case LEX_INTERPNORMAL: /* code if we comment these out. */
1526 /* when we're already built the next token, just pull it out the queue */
1529 yylval = nextval[nexttoke];
1531 lex_state = lex_defer;
1532 expect = lex_expect;
1533 lex_defer = LEX_NORMAL;
1535 return(nexttype[nexttoke]);
1537 /* interpolated case modifiers like \L \U, including \Q and \E.
1538 when we get here, bufptr is at the \
1540 case LEX_INTERPCASEMOD:
1542 if (bufptr != bufend && *bufptr != '\\')
1543 croak("panic: INTERPCASEMOD");
1545 /* handle \E or end of string */
1546 if (bufptr == bufend || bufptr[1] == 'E') {
1551 oldmod = lex_casestack[--lex_casemods];
1552 lex_casestack[lex_casemods] = '\0';
1554 if (bufptr != bufend && strchr("LUQ", oldmod)) {
1556 lex_state = LEX_INTERPCONCAT;
1560 if (bufptr != bufend)
1562 lex_state = LEX_INTERPCONCAT;
1567 if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
1568 tmp = *s, *s = s[2], s[2] = tmp; /* misordered... */
1569 if (strchr("LU", *s) &&
1570 (strchr(lex_casestack, 'L') || strchr(lex_casestack, 'U')))
1572 lex_casestack[--lex_casemods] = '\0';
1575 if (lex_casemods > 10) {
1576 char* newlb = Renew(lex_casestack, lex_casemods + 2, char);
1577 if (newlb != lex_casestack) {
1579 lex_casestack = newlb;
1582 lex_casestack[lex_casemods++] = *s;
1583 lex_casestack[lex_casemods] = '\0';
1584 lex_state = LEX_INTERPCONCAT;
1585 nextval[nexttoke].ival = 0;
1588 nextval[nexttoke].ival = OP_LCFIRST;
1590 nextval[nexttoke].ival = OP_UCFIRST;
1592 nextval[nexttoke].ival = OP_LC;
1594 nextval[nexttoke].ival = OP_UC;
1596 nextval[nexttoke].ival = OP_QUOTEMETA;
1598 croak("panic: yylex");
1610 case LEX_INTERPPUSH:
1611 return sublex_push();
1613 case LEX_INTERPSTART:
1614 if (bufptr == bufend)
1615 return sublex_done();
1617 lex_dojoin = (*bufptr == '@');
1618 lex_state = LEX_INTERPNORMAL;
1620 nextval[nexttoke].ival = 0;
1623 nextval[nexttoke].opval = newOP(OP_THREADSV, 0);
1624 nextval[nexttoke].opval->op_targ = find_threadsv("\"");
1625 force_next(PRIVATEREF);
1627 force_ident("\"", '$');
1628 #endif /* USE_THREADS */
1629 nextval[nexttoke].ival = 0;
1631 nextval[nexttoke].ival = 0;
1633 nextval[nexttoke].ival = OP_JOIN; /* emulate join($", ...) */
1642 case LEX_INTERPENDMAYBE:
1643 if (intuit_more(bufptr)) {
1644 lex_state = LEX_INTERPNORMAL; /* false alarm, more expr */
1652 lex_state = LEX_INTERPCONCAT;
1656 case LEX_INTERPCONCAT:
1659 croak("panic: INTERPCONCAT");
1661 if (bufptr == bufend)
1662 return sublex_done();
1664 if (SvIVX(linestr) == '\'') {
1665 SV *sv = newSVsv(linestr);
1668 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
1672 s = scan_const(bufptr);
1674 lex_state = LEX_INTERPCASEMOD;
1676 lex_state = LEX_INTERPSTART;
1680 nextval[nexttoke] = yylval;
1693 lex_state = LEX_NORMAL;
1694 s = scan_formline(bufptr);
1701 oldoldbufptr = oldbufptr;
1704 PerlIO_printf(PerlIO_stderr(), "### Tokener expecting %s at %s\n", exp_name[expect], s);
1710 croak("Unrecognized character \\%03o", *s & 255);
1713 goto fake_eof; /* emulate EOF on ^D or ^Z */
1719 yyerror("Missing right bracket");
1723 goto retry; /* ignore stray nulls */
1726 if (!in_eval && !preambled) {
1728 sv_setpv(linestr,incl_perldb());
1730 sv_catpv(linestr,";");
1732 while(AvFILLp(preambleav) >= 0) {
1733 SV *tmpsv = av_shift(preambleav);
1734 sv_catsv(linestr, tmpsv);
1735 sv_catpv(linestr, ";");
1738 sv_free((SV*)preambleav);
1741 if (minus_n || minus_p) {
1742 sv_catpv(linestr, "LINE: while (<>) {");
1744 sv_catpv(linestr,"chomp;");
1746 GV* gv = gv_fetchpv("::F", TRUE, SVt_PVAV);
1748 GvIMPORTED_AV_on(gv);
1750 if (strchr("/'\"", *splitstr)
1751 && strchr(splitstr + 1, *splitstr))
1752 sv_catpvf(linestr, "@F=split(%s);", splitstr);
1755 s = "'~#\200\1'"; /* surely one char is unused...*/
1756 while (s[1] && strchr(splitstr, *s)) s++;
1758 sv_catpvf(linestr, "@F=split(%s%c",
1759 "q" + (delim == '\''), delim);
1760 for (s = splitstr; *s; s++) {
1762 sv_catpvn(linestr, "\\", 1);
1763 sv_catpvn(linestr, s, 1);
1765 sv_catpvf(linestr, "%c);", delim);
1769 sv_catpv(linestr,"@F=split(' ');");
1772 sv_catpv(linestr, "\n");
1773 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
1774 bufend = SvPVX(linestr) + SvCUR(linestr);
1775 if (PERLDB_LINE && curstash != debstash) {
1776 SV *sv = NEWSV(85,0);
1778 sv_upgrade(sv, SVt_PVMG);
1779 sv_setsv(sv,linestr);
1780 av_store(GvAV(curcop->cop_filegv),(I32)curcop->cop_line,sv);
1785 if ((s = filter_gets(linestr, rsfp, 0)) == Nullch) {
1788 if (preprocess && !in_eval)
1789 (void)PerlProc_pclose(rsfp);
1790 else if ((PerlIO *)rsfp == PerlIO_stdin())
1791 PerlIO_clearerr(rsfp);
1793 (void)PerlIO_close(rsfp);
1796 if (!in_eval && (minus_n || minus_p)) {
1797 sv_setpv(linestr,minus_p ? ";}continue{print" : "");
1798 sv_catpv(linestr,";}");
1799 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
1800 bufend = SvPVX(linestr) + SvCUR(linestr);
1801 minus_n = minus_p = 0;
1804 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
1805 sv_setpv(linestr,"");
1806 TOKEN(';'); /* not infinite loop because rsfp is NULL now */
1809 if (*s == '#' && s[1] == '!' && instr(s,"perl"))
1812 /* Incest with pod. */
1813 if (*s == '=' && strnEQ(s, "=cut", 4)) {
1814 sv_setpv(linestr, "");
1815 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
1816 bufend = SvPVX(linestr) + SvCUR(linestr);
1821 } while (doextract);
1822 oldoldbufptr = oldbufptr = bufptr = linestart = s;
1823 if (PERLDB_LINE && curstash != debstash) {
1824 SV *sv = NEWSV(85,0);
1826 sv_upgrade(sv, SVt_PVMG);
1827 sv_setsv(sv,linestr);
1828 av_store(GvAV(curcop->cop_filegv),(I32)curcop->cop_line,sv);
1830 bufend = SvPVX(linestr) + SvCUR(linestr);
1831 if (curcop->cop_line == 1) {
1832 while (s < bufend && isSPACE(*s))
1834 if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
1838 if (*s == '#' && *(s+1) == '!')
1840 #ifdef ALTERNATE_SHEBANG
1842 static char as[] = ALTERNATE_SHEBANG;
1843 if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
1844 d = s + (sizeof(as) - 1);
1846 #endif /* ALTERNATE_SHEBANG */
1855 while (*d && !isSPACE(*d))
1859 #ifdef ARG_ZERO_IS_SCRIPT
1860 if (ipathend > ipath) {
1862 * HP-UX (at least) sets argv[0] to the script name,
1863 * which makes $^X incorrect. And Digital UNIX and Linux,
1864 * at least, set argv[0] to the basename of the Perl
1865 * interpreter. So, having found "#!", we'll set it right.
1867 SV *x = GvSV(gv_fetchpv("\030", TRUE, SVt_PV));
1868 assert(SvPOK(x) || SvGMAGICAL(x));
1869 if (sv_eq(x, GvSV(curcop->cop_filegv))) {
1870 sv_setpvn(x, ipath, ipathend - ipath);
1873 TAINT_NOT; /* $^X is always tainted, but that's OK */
1875 #endif /* ARG_ZERO_IS_SCRIPT */
1880 d = instr(s,"perl -");
1882 d = instr(s,"perl");
1883 #ifdef ALTERNATE_SHEBANG
1885 * If the ALTERNATE_SHEBANG on this system starts with a
1886 * character that can be part of a Perl expression, then if
1887 * we see it but not "perl", we're probably looking at the
1888 * start of Perl code, not a request to hand off to some
1889 * other interpreter. Similarly, if "perl" is there, but
1890 * not in the first 'word' of the line, we assume the line
1891 * contains the start of the Perl program.
1893 if (d && *s != '#') {
1895 while (*c && !strchr("; \t\r\n\f\v#", *c))
1898 d = Nullch; /* "perl" not in first word; ignore */
1900 *s = '#'; /* Don't try to parse shebang line */
1902 #endif /* ALTERNATE_SHEBANG */
1907 !instr(s,"indir") &&
1908 instr(origargv[0],"perl"))
1914 while (s < bufend && isSPACE(*s))
1917 Newz(899,newargv,origargc+3,char*);
1919 while (s < bufend && !isSPACE(*s))
1922 Copy(origargv+1, newargv+2, origargc+1, char*);
1927 execv(ipath, newargv);
1928 croak("Can't exec %s", ipath);
1931 U32 oldpdb = perldb;
1932 bool oldn = minus_n;
1933 bool oldp = minus_p;
1935 while (*d && !isSPACE(*d)) d++;
1936 while (*d == ' ' || *d == '\t') d++;
1940 if (*d == 'M' || *d == 'm') {
1942 while (*d && !isSPACE(*d)) d++;
1943 croak("Too late for \"-%.*s\" option",
1946 d = moreswitches(d);
1948 if (PERLDB_LINE && !oldpdb ||
1949 ( minus_n || minus_p ) && !(oldn || oldp) )
1950 /* if we have already added "LINE: while (<>) {",
1951 we must not do it again */
1953 sv_setpv(linestr, "");
1954 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
1955 bufend = SvPVX(linestr) + SvCUR(linestr);
1958 (void)gv_fetchfile(origfilename);
1965 if (lex_formbrack && lex_brackets <= lex_formbrack) {
1967 lex_state = LEX_FORMLINE;
1973 warn("Illegal character \\%03o (carriage return)", '\r');
1975 "(Maybe you didn't strip carriage returns after a network transfer?)\n");
1977 case ' ': case '\t': case '\f': case 013:
1982 if (lex_state != LEX_NORMAL || (in_eval && !rsfp)) {
1984 while (s < d && *s != '\n')
1989 if (lex_formbrack && lex_brackets <= lex_formbrack) {
1991 lex_state = LEX_FORMLINE;
2001 if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
2006 while (s < bufend && (*s == ' ' || *s == '\t'))
2009 if (strnEQ(s,"=>",2)) {
2010 s = force_word(bufptr,WORD,FALSE,FALSE,FALSE);
2011 OPERATOR('-'); /* unary minus */
2013 last_uni = oldbufptr;
2014 last_lop_op = OP_FTEREAD; /* good enough */
2016 case 'r': FTST(OP_FTEREAD);
2017 case 'w': FTST(OP_FTEWRITE);
2018 case 'x': FTST(OP_FTEEXEC);
2019 case 'o': FTST(OP_FTEOWNED);
2020 case 'R': FTST(OP_FTRREAD);
2021 case 'W': FTST(OP_FTRWRITE);
2022 case 'X': FTST(OP_FTREXEC);
2023 case 'O': FTST(OP_FTROWNED);
2024 case 'e': FTST(OP_FTIS);
2025 case 'z': FTST(OP_FTZERO);
2026 case 's': FTST(OP_FTSIZE);
2027 case 'f': FTST(OP_FTFILE);
2028 case 'd': FTST(OP_FTDIR);
2029 case 'l': FTST(OP_FTLINK);
2030 case 'p': FTST(OP_FTPIPE);
2031 case 'S': FTST(OP_FTSOCK);
2032 case 'u': FTST(OP_FTSUID);
2033 case 'g': FTST(OP_FTSGID);
2034 case 'k': FTST(OP_FTSVTX);
2035 case 'b': FTST(OP_FTBLK);
2036 case 'c': FTST(OP_FTCHR);
2037 case 't': FTST(OP_FTTTY);
2038 case 'T': FTST(OP_FTTEXT);
2039 case 'B': FTST(OP_FTBINARY);
2040 case 'M': gv_fetchpv("\024",TRUE, SVt_PV); FTST(OP_FTMTIME);
2041 case 'A': gv_fetchpv("\024",TRUE, SVt_PV); FTST(OP_FTATIME);
2042 case 'C': gv_fetchpv("\024",TRUE, SVt_PV); FTST(OP_FTCTIME);
2044 croak("Unrecognized file test: -%c", (int)tmp);
2051 if (expect == XOPERATOR)
2056 else if (*s == '>') {
2059 if (isIDFIRST(*s)) {
2060 s = force_word(s,METHOD,FALSE,TRUE,FALSE);
2068 if (expect == XOPERATOR)
2071 if (isSPACE(*s) || !isSPACE(*bufptr))
2073 OPERATOR('-'); /* unary minus */
2080 if (expect == XOPERATOR)
2085 if (expect == XOPERATOR)
2088 if (isSPACE(*s) || !isSPACE(*bufptr))
2094 if (expect != XOPERATOR) {
2095 s = scan_ident(s, bufend, tokenbuf, sizeof tokenbuf, TRUE);
2097 force_ident(tokenbuf, '*');
2110 if (expect == XOPERATOR) {
2115 s = scan_ident(s, bufend, tokenbuf + 1, sizeof tokenbuf - 1, TRUE);
2118 yyerror("Final % should be \\% or %name");
2121 pending_ident = '%';
2143 if (last_lop == oldoldbufptr || last_uni == oldoldbufptr)
2144 oldbufptr = oldoldbufptr; /* allow print(STDOUT 123) */
2149 if (curcop->cop_line < copline)
2150 copline = curcop->cop_line;
2161 if (lex_brackets <= 0)
2162 yyerror("Unmatched right bracket");
2165 if (lex_state == LEX_INTERPNORMAL) {
2166 if (lex_brackets == 0) {
2167 if (*s != '[' && *s != '{' && (*s != '-' || s[1] != '>'))
2168 lex_state = LEX_INTERPEND;
2175 if (lex_brackets > 100) {
2176 char* newlb = Renew(lex_brackstack, lex_brackets + 1, char);
2177 if (newlb != lex_brackstack) {
2179 lex_brackstack = newlb;
2184 if (lex_formbrack) {
2188 if (oldoldbufptr == last_lop)
2189 lex_brackstack[lex_brackets++] = XTERM;
2191 lex_brackstack[lex_brackets++] = XOPERATOR;
2192 OPERATOR(HASHBRACK);
2194 while (s < bufend && (*s == ' ' || *s == '\t'))
2198 if (d < bufend && *d == '-') {
2201 while (d < bufend && (*d == ' ' || *d == '\t'))
2204 if (d < bufend && isIDFIRST(*d)) {
2205 d = scan_word(d, tokenbuf + 1, sizeof tokenbuf - 1,
2207 while (d < bufend && (*d == ' ' || *d == '\t'))
2210 char minus = (tokenbuf[0] == '-');
2211 s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
2218 lex_brackstack[lex_brackets++] = XSTATE;
2222 lex_brackstack[lex_brackets++] = XOPERATOR;
2227 if (oldoldbufptr == last_lop)
2228 lex_brackstack[lex_brackets++] = XTERM;
2230 lex_brackstack[lex_brackets++] = XOPERATOR;
2233 if (expect == XSTATE) {
2234 lex_brackstack[lex_brackets-1] = XSTATE;
2237 OPERATOR(HASHBRACK);
2239 /* This hack serves to disambiguate a pair of curlies
2240 * as being a block or an anon hash. Normally, expectation
2241 * determines that, but in cases where we're not in a
2242 * position to expect anything in particular (like inside
2243 * eval"") we have to resolve the ambiguity. This code
2244 * covers the case where the first term in the curlies is a
2245 * quoted string. Most other cases need to be explicitly
2246 * disambiguated by prepending a `+' before the opening
2247 * curly in order to force resolution as an anon hash.
2249 * XXX should probably propagate the outer expectation
2250 * into eval"" to rely less on this hack, but that could
2251 * potentially break current behavior of eval"".
2255 if (*s == '\'' || *s == '"' || *s == '`') {
2256 /* common case: get past first string, handling escapes */
2257 for (t++; t < bufend && *t != *s;)
2258 if (*t++ == '\\' && (*t == '\\' || *t == *s))
2262 else if (*s == 'q') {
2265 || ((*t == 'q' || *t == 'x') && ++t < bufend
2266 && !isALNUM(*t)))) {
2268 char open, close, term;
2271 while (t < bufend && isSPACE(*t))
2275 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
2279 for (t++; t < bufend; t++) {
2280 if (*t == '\\' && t+1 < bufend && open != '\\')
2282 else if (*t == open)
2286 for (t++; t < bufend; t++) {
2287 if (*t == '\\' && t+1 < bufend)
2289 else if (*t == close && --brackets <= 0)
2291 else if (*t == open)
2297 else if (isALPHA(*s)) {
2298 for (t++; t < bufend && isALNUM(*t); t++) ;
2300 while (t < bufend && isSPACE(*t))
2302 /* if comma follows first term, call it an anon hash */
2303 /* XXX it could be a comma expression with loop modifiers */
2304 if (t < bufend && ((*t == ',' && (*s == 'q' || !isLOWER(*s)))
2305 || (*t == '=' && t[1] == '>')))
2306 OPERATOR(HASHBRACK);
2310 lex_brackstack[lex_brackets-1] = XSTATE;
2316 yylval.ival = curcop->cop_line;
2317 if (isSPACE(*s) || *s == '#')
2318 copline = NOLINE; /* invalidate current command line number */
2323 if (lex_brackets <= 0)
2324 yyerror("Unmatched right bracket");
2326 expect = (expectation)lex_brackstack[--lex_brackets];
2327 if (lex_brackets < lex_formbrack)
2329 if (lex_state == LEX_INTERPNORMAL) {
2330 if (lex_brackets == 0) {
2331 if (lex_fakebrack) {
2332 lex_state = LEX_INTERPEND;
2334 return yylex(); /* ignore fake brackets */
2336 if (*s == '-' && s[1] == '>')
2337 lex_state = LEX_INTERPENDMAYBE;
2338 else if (*s != '[' && *s != '{')
2339 lex_state = LEX_INTERPEND;
2342 if (lex_brackets < lex_fakebrack) {
2345 return yylex(); /* ignore fake brackets */
2355 if (expect == XOPERATOR) {
2356 if (dowarn && isALPHA(*s) && bufptr == linestart) {
2364 s = scan_ident(s - 1, bufend, tokenbuf, sizeof tokenbuf, TRUE);
2367 force_ident(tokenbuf, '&');
2371 yylval.ival = (OPpENTERSUB_AMPER<<8);
2390 if (dowarn && tmp && isSPACE(*s) && strchr("+-*/%.^&|<",tmp))
2391 warn("Reversed %c= operator",(int)tmp);
2393 if (expect == XSTATE && isALPHA(tmp) &&
2394 (s == linestart+1 || s[-2] == '\n') )
2396 if (in_eval && !rsfp) {
2401 if (strnEQ(s,"=cut",4)) {
2418 if (lex_brackets < lex_formbrack) {
2420 for (t = s; *t == ' ' || *t == '\t'; t++) ;
2421 if (*t == '\n' || *t == '#') {
2439 if (expect != XOPERATOR) {
2440 if (s[1] != '<' && !strchr(s,'>'))
2443 s = scan_heredoc(s);
2445 s = scan_inputsymbol(s);
2446 TERM(sublex_start());
2451 SHop(OP_LEFT_SHIFT);
2465 SHop(OP_RIGHT_SHIFT);
2474 if (expect == XOPERATOR) {
2475 if (lex_formbrack && lex_brackets == lex_formbrack) {
2478 return ','; /* grandfather non-comma-format format */
2482 if (s[1] == '#' && (isALPHA(s[2]) || strchr("_{$:", s[2]))) {
2483 if (expect == XOPERATOR)
2484 no_op("Array length", bufptr);
2486 s = scan_ident(s + 1, bufend, tokenbuf + 1, sizeof tokenbuf - 1,
2491 pending_ident = '#';
2495 if (expect == XOPERATOR)
2496 no_op("Scalar", bufptr);
2498 s = scan_ident(s, bufend, tokenbuf + 1, sizeof tokenbuf - 1, FALSE);
2501 yyerror("Final $ should be \\$ or $name");
2505 /* This kludge not intended to be bulletproof. */
2506 if (tokenbuf[1] == '[' && !tokenbuf[2]) {
2507 yylval.opval = newSVOP(OP_CONST, 0,
2508 newSViv((IV)compiling.cop_arybase));
2509 yylval.opval->op_private = OPpCONST_ARYBASE;
2514 if (lex_state == LEX_NORMAL)
2517 if ((expect != XREF || oldoldbufptr == last_lop) && intuit_more(s)) {
2523 isSPACE(*t) || isALNUM(*t) || *t == '$';
2526 bufptr = skipspace(bufptr);
2527 while (t < bufend && *t != ']')
2529 warn("Multidimensional syntax %.*s not supported",
2530 (t - bufptr) + 1, bufptr);
2534 else if (*s == '{') {
2536 if (dowarn && strEQ(tokenbuf+1, "SIG") &&
2537 (t = strchr(s, '}')) && (t = strchr(t, '=')))
2539 char tmpbuf[sizeof tokenbuf];
2541 for (t++; isSPACE(*t); t++) ;
2542 if (isIDFIRST(*t)) {
2543 t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE, &len);
2544 if (*t != '(' && perl_get_cv(tmpbuf, FALSE))
2545 warn("You need to quote \"%s\"", tmpbuf);
2552 if (lex_state == LEX_NORMAL && isSPACE(*d)) {
2553 bool islop = (last_lop == oldoldbufptr);
2554 if (!islop || last_lop_op == OP_GREPSTART)
2556 else if (strchr("$@\"'`q", *s))
2557 expect = XTERM; /* e.g. print $fh "foo" */
2558 else if (strchr("&*<%", *s) && isIDFIRST(s[1]))
2559 expect = XTERM; /* e.g. print $fh &sub */
2560 else if (isIDFIRST(*s)) {
2561 char tmpbuf[sizeof tokenbuf];
2562 scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
2563 if (tmp = keyword(tmpbuf, len)) {
2564 /* binary operators exclude handle interpretations */
2576 expect = XTERM; /* e.g. print $fh length() */
2581 GV *gv = gv_fetchpv(tmpbuf, FALSE, SVt_PVCV);
2582 if (gv && GvCVu(gv))
2583 expect = XTERM; /* e.g. print $fh subr() */
2586 else if (isDIGIT(*s))
2587 expect = XTERM; /* e.g. print $fh 3 */
2588 else if (*s == '.' && isDIGIT(s[1]))
2589 expect = XTERM; /* e.g. print $fh .3 */
2590 else if (strchr("/?-+", *s) && !isSPACE(s[1]))
2591 expect = XTERM; /* e.g. print $fh -1 */
2592 else if (*s == '<' && s[1] == '<' && !isSPACE(s[2]))
2593 expect = XTERM; /* print $fh <<"EOF" */
2595 pending_ident = '$';
2599 if (expect == XOPERATOR)
2602 s = scan_ident(s, bufend, tokenbuf + 1, sizeof tokenbuf - 1, FALSE);
2605 yyerror("Final @ should be \\@ or @name");
2608 if (lex_state == LEX_NORMAL)
2610 if ((expect != XREF || oldoldbufptr == last_lop) && intuit_more(s)) {
2614 /* Warn about @ where they meant $. */
2616 if (*s == '[' || *s == '{') {
2618 while (*t && (isALNUM(*t) || strchr(" \t$#+-'\"", *t)))
2620 if (*t == '}' || *t == ']') {
2622 bufptr = skipspace(bufptr);
2623 warn("Scalar value %.*s better written as $%.*s",
2624 t-bufptr, bufptr, t-bufptr-1, bufptr+1);
2629 pending_ident = '@';
2632 case '/': /* may either be division or pattern */
2633 case '?': /* may either be conditional or pattern */
2634 if (expect != XOPERATOR) {
2635 /* Disable warning on "study /blah/" */
2636 if (oldoldbufptr == last_uni
2637 && (*last_uni != 's' || s - last_uni < 5
2638 || memNE(last_uni, "study", 5) || isALNUM(last_uni[5])))
2641 TERM(sublex_start());
2649 if (lex_formbrack && lex_brackets == lex_formbrack && s[1] == '\n' &&
2650 (s == linestart || s[-1] == '\n') ) {
2655 if (expect == XOPERATOR || !isDIGIT(s[1])) {
2661 yylval.ival = OPf_SPECIAL;
2667 if (expect != XOPERATOR)
2672 case '0': case '1': case '2': case '3': case '4':
2673 case '5': case '6': case '7': case '8': case '9':
2675 if (expect == XOPERATOR)
2681 if (expect == XOPERATOR) {
2682 if (lex_formbrack && lex_brackets == lex_formbrack) {
2685 return ','; /* grandfather non-comma-format format */
2691 missingterm((char*)0);
2692 yylval.ival = OP_CONST;
2693 TERM(sublex_start());
2697 if (expect == XOPERATOR) {
2698 if (lex_formbrack && lex_brackets == lex_formbrack) {
2701 return ','; /* grandfather non-comma-format format */
2707 missingterm((char*)0);
2708 yylval.ival = OP_CONST;
2709 for (d = SvPV(lex_stuff, len); len; len--, d++) {
2710 if (*d == '$' || *d == '@' || *d == '\\') {
2711 yylval.ival = OP_STRINGIFY;
2715 TERM(sublex_start());
2719 if (expect == XOPERATOR)
2720 no_op("Backticks",s);
2722 missingterm((char*)0);
2723 yylval.ival = OP_BACKTICK;
2725 TERM(sublex_start());
2729 if (dowarn && lex_inwhat && isDIGIT(*s))
2730 warn("Can't use \\%c to mean $%c in expression", *s, *s);
2731 if (expect == XOPERATOR)
2732 no_op("Backslash",s);
2736 if (isDIGIT(s[1]) && expect == XOPERATOR) {
2775 s = scan_word(s, tokenbuf, sizeof tokenbuf, FALSE, &len);
2777 /* Some keywords can be followed by any delimiter, including ':' */
2778 tmp = (len == 1 && strchr("msyq", tokenbuf[0]) ||
2779 len == 2 && ((tokenbuf[0] == 't' && tokenbuf[1] == 'r') ||
2780 (tokenbuf[0] == 'q' &&
2781 strchr("qwx", tokenbuf[1]))));
2783 /* x::* is just a word, unless x is "CORE" */
2784 if (!tmp && *s == ':' && s[1] == ':' && strNE(tokenbuf, "CORE"))
2788 while (d < bufend && isSPACE(*d))
2789 d++; /* no comments skipped here, or s### is misparsed */
2791 /* Is this a label? */
2792 if (!tmp && expect == XSTATE
2793 && d < bufend && *d == ':' && *(d + 1) != ':') {
2795 yylval.pval = savepv(tokenbuf);
2800 /* Check for keywords */
2801 tmp = keyword(tokenbuf, len);
2803 /* Is this a word before a => operator? */
2804 if (strnEQ(d,"=>",2)) {
2806 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(tokenbuf,0));
2807 yylval.opval->op_private = OPpCONST_BARE;
2811 if (tmp < 0) { /* second-class keyword? */
2812 if (expect != XOPERATOR && (*s != ':' || s[1] != ':') &&
2813 (((gv = gv_fetchpv(tokenbuf, FALSE, SVt_PVCV)) &&
2814 GvCVu(gv) && GvIMPORTED_CV(gv)) ||
2815 ((gvp = (GV**)hv_fetch(globalstash,tokenbuf,len,FALSE)) &&
2816 (gv = *gvp) != (GV*)&sv_undef &&
2817 GvCVu(gv) && GvIMPORTED_CV(gv))))
2819 tmp = 0; /* overridden by importation */
2822 && -tmp==KEY_lock /* XXX generalizable kludge */
2823 && !hv_fetch(GvHVn(incgv), "Thread.pm", 9, FALSE))
2825 tmp = 0; /* any sub overrides "weak" keyword */
2828 tmp = -tmp; gv = Nullgv; gvp = 0;
2835 default: /* not a keyword */
2838 char lastchar = (bufptr == oldoldbufptr ? 0 : bufptr[-1]);
2840 /* Get the rest if it looks like a package qualifier */
2842 if (*s == '\'' || *s == ':' && s[1] == ':') {
2844 s = scan_word(s, tokenbuf + len, sizeof tokenbuf - len,
2847 croak("Bad name after %s%s", tokenbuf,
2848 *s == '\'' ? "'" : "::");
2852 if (expect == XOPERATOR) {
2853 if (bufptr == linestart) {
2859 no_op("Bareword",s);
2862 /* Look for a subroutine with this name in current package,
2863 unless name is "Foo::", in which case Foo is a bearword
2864 (and a package name). */
2867 tokenbuf[len - 2] == ':' && tokenbuf[len - 1] == ':')
2869 if (dowarn && ! gv_fetchpv(tokenbuf, FALSE, SVt_PVHV))
2870 warn("Bareword \"%s\" refers to nonexistent package",
2873 tokenbuf[len] = '\0';
2880 gv = gv_fetchpv(tokenbuf, FALSE, SVt_PVCV);
2883 /* if we saw a global override before, get the right name */
2886 sv = newSVpv("CORE::GLOBAL::",14);
2887 sv_catpv(sv,tokenbuf);
2890 sv = newSVpv(tokenbuf,0);
2892 /* Presume this is going to be a bareword of some sort. */
2895 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
2896 yylval.opval->op_private = OPpCONST_BARE;
2898 /* And if "Foo::", then that's what it certainly is. */
2903 /* See if it's the indirect object for a list operator. */
2906 oldoldbufptr < bufptr &&
2907 (oldoldbufptr == last_lop || oldoldbufptr == last_uni) &&
2908 /* NO SKIPSPACE BEFORE HERE! */
2910 ((opargs[last_lop_op] >> OASHIFT)& 7) == OA_FILEREF) )
2912 bool immediate_paren = *s == '(';
2914 /* (Now we can afford to cross potential line boundary.) */
2917 /* Two barewords in a row may indicate method call. */
2919 if ((isALPHA(*s) || *s == '$') && (tmp=intuit_method(s,gv)))
2922 /* If not a declared subroutine, it's an indirect object. */
2923 /* (But it's an indir obj regardless for sort.) */
2925 if ((last_lop_op == OP_SORT ||
2926 (!immediate_paren && (!gv || !GvCVu(gv))) ) &&
2927 (last_lop_op != OP_MAPSTART && last_lop_op != OP_GREPSTART)){
2928 expect = (last_lop == oldoldbufptr) ? XTERM : XOPERATOR;
2933 /* If followed by a paren, it's certainly a subroutine. */
2939 if (gv && GvCVu(gv)) {
2940 for (d = s + 1; *d == ' ' || *d == '\t'; d++) ;
2941 if (*d == ')' && (sv = cv_const_sv(GvCV(gv)))) {
2946 nextval[nexttoke].opval = yylval.opval;
2953 /* If followed by var or block, call it a method (unless sub) */
2955 if ((*s == '$' || *s == '{') && (!gv || !GvCVu(gv))) {
2956 last_lop = oldbufptr;
2957 last_lop_op = OP_METHOD;
2961 /* If followed by a bareword, see if it looks like indir obj. */
2963 if ((isALPHA(*s) || *s == '$') && (tmp = intuit_method(s,gv)))
2966 /* Not a method, so call it a subroutine (if defined) */
2968 if (gv && GvCVu(gv)) {
2970 if (lastchar == '-')
2971 warn("Ambiguous use of -%s resolved as -&%s()",
2972 tokenbuf, tokenbuf);
2973 last_lop = oldbufptr;
2974 last_lop_op = OP_ENTERSUB;
2975 /* Check for a constant sub */
2977 if ((sv = cv_const_sv(cv))) {
2979 SvREFCNT_dec(((SVOP*)yylval.opval)->op_sv);
2980 ((SVOP*)yylval.opval)->op_sv = SvREFCNT_inc(sv);
2981 yylval.opval->op_private = 0;
2985 /* Resolve to GV now. */
2986 op_free(yylval.opval);
2987 yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
2988 /* Is there a prototype? */
2991 char *proto = SvPV((SV*)cv, len);
2994 if (strEQ(proto, "$"))
2996 if (*proto == '&' && *s == '{') {
2997 sv_setpv(subname,"__ANON__");
3001 nextval[nexttoke].opval = yylval.opval;
3007 if (hints & HINT_STRICT_SUBS &&
3010 last_lop_op != OP_TRUNCATE && /* S/F prototype in opcode.pl */
3011 last_lop_op != OP_ACCEPT &&
3012 last_lop_op != OP_PIPE_OP &&
3013 last_lop_op != OP_SOCKPAIR)
3016 "Bareword \"%s\" not allowed while \"strict subs\" in use",
3021 /* Call it a bare word */
3025 if (lastchar != '-') {
3026 for (d = tokenbuf; *d && isLOWER(*d); d++) ;
3028 warn(warn_reserved, tokenbuf);
3033 if (lastchar && strchr("*%&", lastchar)) {
3034 warn("Operator or semicolon missing before %c%s",
3035 lastchar, tokenbuf);
3036 warn("Ambiguous use of %c resolved as operator %c",
3037 lastchar, lastchar);
3043 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
3044 newSVsv(GvSV(curcop->cop_filegv)));
3048 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
3049 newSVpvf("%ld", (long)curcop->cop_line));
3052 case KEY___PACKAGE__:
3053 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
3055 ? newSVsv(curstname)
3064 if (rsfp && (!in_eval || tokenbuf[2] == 'D')) {
3065 char *pname = "main";
3066 if (tokenbuf[2] == 'D')
3067 pname = HvNAME(curstash ? curstash : defstash);
3068 gv = gv_fetchpv(form("%s::DATA", pname), TRUE, SVt_PVIO);
3071 GvIOp(gv) = newIO();
3072 IoIFP(GvIOp(gv)) = rsfp;
3073 #if defined(HAS_FCNTL) && defined(F_SETFD)
3075 int fd = PerlIO_fileno(rsfp);
3076 fcntl(fd,F_SETFD,fd >= 3);
3079 /* Mark this internal pseudo-handle as clean */
3080 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
3082 IoTYPE(GvIOp(gv)) = '|';
3083 else if ((PerlIO*)rsfp == PerlIO_stdin())
3084 IoTYPE(GvIOp(gv)) = '-';
3086 IoTYPE(GvIOp(gv)) = '<';
3097 if (expect == XSTATE) {
3104 if (*s == ':' && s[1] == ':') {
3107 s = scan_word(s, tokenbuf, sizeof tokenbuf, FALSE, &len);
3108 tmp = keyword(tokenbuf, len);
3122 LOP(OP_ACCEPT,XTERM);
3128 LOP(OP_ATAN2,XTERM);
3137 LOP(OP_BLESS,XTERM);
3146 (void)gv_fetchpv("ENV",TRUE, SVt_PVHV); /* may use HOME */
3166 LOP(OP_CRYPT,XTERM);
3170 for (d = s; d < bufend && (isSPACE(*d) || *d == '('); d++) ;
3171 if (*d != '0' && isDIGIT(*d))
3172 yywarn("chmod: mode argument is missing initial 0");
3174 LOP(OP_CHMOD,XTERM);
3177 LOP(OP_CHOWN,XTERM);
3180 LOP(OP_CONNECT,XTERM);
3196 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3200 hints |= HINT_BLOCK_SCOPE;
3210 gv_fetchpv("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
3211 LOP(OP_DBMOPEN,XTERM);
3217 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3224 yylval.ival = curcop->cop_line;
3238 expect = (*s == '{') ? XTERMBLOCK : XTERM;
3239 UNIBRACK(OP_ENTEREVAL);
3254 case KEY_endhostent:
3260 case KEY_endservent:
3263 case KEY_endprotoent:
3274 yylval.ival = curcop->cop_line;
3276 if (expect == XSTATE && isIDFIRST(*s)) {
3278 if ((bufend - p) >= 3 &&
3279 strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
3283 croak("Missing $ on loop variable");
3288 LOP(OP_FORMLINE,XTERM);
3294 LOP(OP_FCNTL,XTERM);
3300 LOP(OP_FLOCK,XTERM);
3309 LOP(OP_GREPSTART, *s == '(' ? XTERM : XREF);
3312 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3327 case KEY_getpriority:
3328 LOP(OP_GETPRIORITY,XTERM);
3330 case KEY_getprotobyname:
3333 case KEY_getprotobynumber:
3334 LOP(OP_GPBYNUMBER,XTERM);
3336 case KEY_getprotoent:
3348 case KEY_getpeername:
3349 UNI(OP_GETPEERNAME);
3351 case KEY_gethostbyname:
3354 case KEY_gethostbyaddr:
3355 LOP(OP_GHBYADDR,XTERM);
3357 case KEY_gethostent:
3360 case KEY_getnetbyname:
3363 case KEY_getnetbyaddr:
3364 LOP(OP_GNBYADDR,XTERM);
3369 case KEY_getservbyname:
3370 LOP(OP_GSBYNAME,XTERM);
3372 case KEY_getservbyport:
3373 LOP(OP_GSBYPORT,XTERM);
3375 case KEY_getservent:
3378 case KEY_getsockname:
3379 UNI(OP_GETSOCKNAME);
3381 case KEY_getsockopt:
3382 LOP(OP_GSOCKOPT,XTERM);
3404 yylval.ival = curcop->cop_line;
3408 LOP(OP_INDEX,XTERM);
3414 LOP(OP_IOCTL,XTERM);
3426 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3457 LOP(OP_LISTEN,XTERM);
3467 TERM(sublex_start());
3470 LOP(OP_MAPSTART,XREF);
3473 LOP(OP_MKDIR,XTERM);
3476 LOP(OP_MSGCTL,XTERM);
3479 LOP(OP_MSGGET,XTERM);
3482 LOP(OP_MSGRCV,XTERM);
3485 LOP(OP_MSGSND,XTERM);
3490 if (isIDFIRST(*s)) {
3491 s = scan_word(s, tokenbuf, sizeof tokenbuf, TRUE, &len);
3492 in_my_stash = gv_stashpv(tokenbuf, FALSE);
3496 sprintf(tmpbuf, "No such class %.1000s", tokenbuf);
3503 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3510 if (expect != XSTATE)
3511 yyerror("\"no\" not allowed in expression");
3512 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3513 s = force_version(s);
3522 if (isIDFIRST(*s)) {
3524 for (d = s; isALNUM(*d); d++) ;
3526 if (strchr("|&*+-=!?:.", *t))
3527 warn("Precedence problem: open %.*s should be open(%.*s)",
3533 yylval.ival = OP_OR;
3543 LOP(OP_OPEN_DIR,XTERM);
3546 checkcomma(s,tokenbuf,"filehandle");
3550 checkcomma(s,tokenbuf,"filehandle");
3569 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3573 LOP(OP_PIPE_OP,XTERM);
3578 missingterm((char*)0);
3579 yylval.ival = OP_CONST;
3580 TERM(sublex_start());
3588 missingterm((char*)0);
3589 if (dowarn && SvLEN(lex_stuff)) {
3590 d = SvPV_force(lex_stuff, len);
3591 for (; len; --len, ++d) {
3593 warn("Possible attempt to separate words with commas");
3597 warn("Possible attempt to put comments in qw() list");
3603 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, q(lex_stuff));
3607 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(" ",1));
3610 yylval.ival = OP_SPLIT;
3614 last_lop = oldbufptr;
3615 last_lop_op = OP_SPLIT;
3621 missingterm((char*)0);
3622 yylval.ival = OP_STRINGIFY;
3623 if (SvIVX(lex_stuff) == '\'')
3624 SvIVX(lex_stuff) = 0; /* qq'$foo' should intepolate */
3625 TERM(sublex_start());
3630 missingterm((char*)0);
3631 yylval.ival = OP_BACKTICK;
3633 TERM(sublex_start());
3640 s = force_word(s,WORD,TRUE,TRUE,FALSE);
3641 if (isIDFIRST(*tokenbuf))
3642 gv_stashpvn(tokenbuf, strlen(tokenbuf), TRUE);
3644 yyerror("<> should be quotes");
3651 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3655 LOP(OP_RENAME,XTERM);
3664 LOP(OP_RINDEX,XTERM);
3687 LOP(OP_REVERSE,XTERM);
3698 TERM(sublex_start());
3700 TOKEN(1); /* force error */
3709 LOP(OP_SELECT,XTERM);
3715 LOP(OP_SEMCTL,XTERM);
3718 LOP(OP_SEMGET,XTERM);
3721 LOP(OP_SEMOP,XTERM);
3727 LOP(OP_SETPGRP,XTERM);
3729 case KEY_setpriority:
3730 LOP(OP_SETPRIORITY,XTERM);
3732 case KEY_sethostent:
3738 case KEY_setservent:
3741 case KEY_setprotoent:
3751 LOP(OP_SEEKDIR,XTERM);
3753 case KEY_setsockopt:
3754 LOP(OP_SSOCKOPT,XTERM);
3760 LOP(OP_SHMCTL,XTERM);
3763 LOP(OP_SHMGET,XTERM);
3766 LOP(OP_SHMREAD,XTERM);
3769 LOP(OP_SHMWRITE,XTERM);
3772 LOP(OP_SHUTDOWN,XTERM);
3781 LOP(OP_SOCKET,XTERM);
3783 case KEY_socketpair:
3784 LOP(OP_SOCKPAIR,XTERM);
3787 checkcomma(s,tokenbuf,"subroutine name");
3789 if (*s == ';' || *s == ')') /* probably a close */
3790 croak("sort is now a reserved word");
3792 s = force_word(s,WORD,TRUE,TRUE,FALSE);
3796 LOP(OP_SPLIT,XTERM);
3799 LOP(OP_SPRINTF,XTERM);
3802 LOP(OP_SPLICE,XTERM);
3818 LOP(OP_SUBSTR,XTERM);
3825 if (isIDFIRST(*s) || *s == '\'' || *s == ':') {
3826 char tmpbuf[sizeof tokenbuf];
3828 d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
3829 if (strchr(tmpbuf, ':'))
3830 sv_setpv(subname, tmpbuf);
3832 sv_setsv(subname,curstname);
3833 sv_catpvn(subname,"::",2);
3834 sv_catpvn(subname,tmpbuf,len);
3836 s = force_word(s,WORD,FALSE,TRUE,TRUE);
3840 expect = XTERMBLOCK;
3841 sv_setpv(subname,"?");
3844 if (tmp == KEY_format) {
3847 lex_formbrack = lex_brackets + 1;
3851 /* Look for a prototype */
3858 SvREFCNT_dec(lex_stuff);
3860 croak("Prototype not terminated");
3863 d = SvPVX(lex_stuff);
3865 for (p = d; *p; ++p) {
3870 SvCUR(lex_stuff) = tmp;
3873 nextval[1] = nextval[0];
3874 nexttype[1] = nexttype[0];
3875 nextval[0].opval = (OP*)newSVOP(OP_CONST, 0, lex_stuff);
3876 nexttype[0] = THING;
3877 if (nexttoke == 1) {
3878 lex_defer = lex_state;
3879 lex_expect = expect;
3880 lex_state = LEX_KNOWNEXT;
3885 if (*SvPV(subname,na) == '?') {
3886 sv_setpv(subname,"__ANON__");
3893 LOP(OP_SYSTEM,XREF);
3896 LOP(OP_SYMLINK,XTERM);
3899 LOP(OP_SYSCALL,XTERM);
3902 LOP(OP_SYSOPEN,XTERM);
3905 LOP(OP_SYSSEEK,XTERM);
3908 LOP(OP_SYSREAD,XTERM);
3911 LOP(OP_SYSWRITE,XTERM);
3915 TERM(sublex_start());
3936 LOP(OP_TRUNCATE,XTERM);
3948 yylval.ival = curcop->cop_line;
3952 yylval.ival = curcop->cop_line;
3956 LOP(OP_UNLINK,XTERM);
3962 LOP(OP_UNPACK,XTERM);
3965 LOP(OP_UTIME,XTERM);
3969 for (d = s; d < bufend && (isSPACE(*d) || *d == '('); d++) ;
3970 if (*d != '0' && isDIGIT(*d))
3971 yywarn("umask: argument is missing initial 0");
3976 LOP(OP_UNSHIFT,XTERM);
3979 if (expect != XSTATE)
3980 yyerror("\"use\" not allowed in expression");
3983 s = force_version(s);
3984 if(*s == ';' || (s = skipspace(s), *s == ';')) {
3985 nextval[nexttoke].opval = Nullop;
3990 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3991 s = force_version(s);
4004 yylval.ival = curcop->cop_line;
4008 hints |= HINT_BLOCK_SCOPE;
4015 LOP(OP_WAITPID,XTERM);
4021 gv_fetchpv("\f",TRUE, SVt_PV); /* Make sure $^L is defined */
4025 if (expect == XOPERATOR)
4031 yylval.ival = OP_XOR;
4036 TERM(sublex_start());
4042 keyword(register char *d, I32 len)
4047 if (strEQ(d,"__FILE__")) return -KEY___FILE__;
4048 if (strEQ(d,"__LINE__")) return -KEY___LINE__;
4049 if (strEQ(d,"__PACKAGE__")) return -KEY___PACKAGE__;
4050 if (strEQ(d,"__DATA__")) return KEY___DATA__;
4051 if (strEQ(d,"__END__")) return KEY___END__;
4055 if (strEQ(d,"AUTOLOAD")) return KEY_AUTOLOAD;
4060 if (strEQ(d,"and")) return -KEY_and;
4061 if (strEQ(d,"abs")) return -KEY_abs;
4064 if (strEQ(d,"alarm")) return -KEY_alarm;
4065 if (strEQ(d,"atan2")) return -KEY_atan2;
4068 if (strEQ(d,"accept")) return -KEY_accept;
4073 if (strEQ(d,"BEGIN")) return KEY_BEGIN;
4076 if (strEQ(d,"bless")) return -KEY_bless;
4077 if (strEQ(d,"bind")) return -KEY_bind;
4078 if (strEQ(d,"binmode")) return -KEY_binmode;
4081 if (strEQ(d,"CORE")) return -KEY_CORE;
4086 if (strEQ(d,"cmp")) return -KEY_cmp;
4087 if (strEQ(d,"chr")) return -KEY_chr;
4088 if (strEQ(d,"cos")) return -KEY_cos;
4091 if (strEQ(d,"chop")) return KEY_chop;
4094 if (strEQ(d,"close")) return -KEY_close;
4095 if (strEQ(d,"chdir")) return -KEY_chdir;
4096 if (strEQ(d,"chomp")) return KEY_chomp;
4097 if (strEQ(d,"chmod")) return -KEY_chmod;
4098 if (strEQ(d,"chown")) return -KEY_chown;
4099 if (strEQ(d,"crypt")) return -KEY_crypt;
4102 if (strEQ(d,"chroot")) return -KEY_chroot;
4103 if (strEQ(d,"caller")) return -KEY_caller;
4106 if (strEQ(d,"connect")) return -KEY_connect;
4109 if (strEQ(d,"closedir")) return -KEY_closedir;
4110 if (strEQ(d,"continue")) return -KEY_continue;
4115 if (strEQ(d,"DESTROY")) return KEY_DESTROY;
4120 if (strEQ(d,"do")) return KEY_do;
4123 if (strEQ(d,"die")) return -KEY_die;
4126 if (strEQ(d,"dump")) return -KEY_dump;
4129 if (strEQ(d,"delete")) return KEY_delete;
4132 if (strEQ(d,"defined")) return KEY_defined;
4133 if (strEQ(d,"dbmopen")) return -KEY_dbmopen;
4136 if (strEQ(d,"dbmclose")) return -KEY_dbmclose;
4141 if (strEQ(d,"EQ")) { deprecate(d); return -KEY_eq;}
4142 if (strEQ(d,"END")) return KEY_END;
4147 if (strEQ(d,"eq")) return -KEY_eq;
4150 if (strEQ(d,"eof")) return -KEY_eof;
4151 if (strEQ(d,"exp")) return -KEY_exp;
4154 if (strEQ(d,"else")) return KEY_else;
4155 if (strEQ(d,"exit")) return -KEY_exit;
4156 if (strEQ(d,"eval")) return KEY_eval;
4157 if (strEQ(d,"exec")) return -KEY_exec;
4158 if (strEQ(d,"each")) return KEY_each;
4161 if (strEQ(d,"elsif")) return KEY_elsif;
4164 if (strEQ(d,"exists")) return KEY_exists;
4165 if (strEQ(d,"elseif")) warn("elseif should be elsif");
4168 if (strEQ(d,"endgrent")) return -KEY_endgrent;
4169 if (strEQ(d,"endpwent")) return -KEY_endpwent;
4172 if (strEQ(d,"endnetent")) return -KEY_endnetent;
4175 if (strEQ(d,"endhostent")) return -KEY_endhostent;
4176 if (strEQ(d,"endservent")) return -KEY_endservent;
4179 if (strEQ(d,"endprotoent")) return -KEY_endprotoent;
4186 if (strEQ(d,"for")) return KEY_for;
4189 if (strEQ(d,"fork")) return -KEY_fork;
4192 if (strEQ(d,"fcntl")) return -KEY_fcntl;
4193 if (strEQ(d,"flock")) return -KEY_flock;
4196 if (strEQ(d,"format")) return KEY_format;
4197 if (strEQ(d,"fileno")) return -KEY_fileno;
4200 if (strEQ(d,"foreach")) return KEY_foreach;
4203 if (strEQ(d,"formline")) return -KEY_formline;
4209 if (strEQ(d,"GT")) { deprecate(d); return -KEY_gt;}
4210 if (strEQ(d,"GE")) { deprecate(d); return -KEY_ge;}
4214 if (strnEQ(d,"get",3)) {
4219 if (strEQ(d,"ppid")) return -KEY_getppid;
4220 if (strEQ(d,"pgrp")) return -KEY_getpgrp;
4223 if (strEQ(d,"pwent")) return -KEY_getpwent;
4224 if (strEQ(d,"pwnam")) return -KEY_getpwnam;
4225 if (strEQ(d,"pwuid")) return -KEY_getpwuid;
4228 if (strEQ(d,"peername")) return -KEY_getpeername;
4229 if (strEQ(d,"protoent")) return -KEY_getprotoent;
4230 if (strEQ(d,"priority")) return -KEY_getpriority;
4233 if (strEQ(d,"protobyname")) return -KEY_getprotobyname;
4236 if (strEQ(d,"protobynumber"))return -KEY_getprotobynumber;
4240 else if (*d == 'h') {
4241 if (strEQ(d,"hostbyname")) return -KEY_gethostbyname;
4242 if (strEQ(d,"hostbyaddr")) return -KEY_gethostbyaddr;
4243 if (strEQ(d,"hostent")) return -KEY_gethostent;
4245 else if (*d == 'n') {
4246 if (strEQ(d,"netbyname")) return -KEY_getnetbyname;
4247 if (strEQ(d,"netbyaddr")) return -KEY_getnetbyaddr;
4248 if (strEQ(d,"netent")) return -KEY_getnetent;
4250 else if (*d == 's') {
4251 if (strEQ(d,"servbyname")) return -KEY_getservbyname;
4252 if (strEQ(d,"servbyport")) return -KEY_getservbyport;
4253 if (strEQ(d,"servent")) return -KEY_getservent;
4254 if (strEQ(d,"sockname")) return -KEY_getsockname;
4255 if (strEQ(d,"sockopt")) return -KEY_getsockopt;
4257 else if (*d == 'g') {
4258 if (strEQ(d,"grent")) return -KEY_getgrent;
4259 if (strEQ(d,"grnam")) return -KEY_getgrnam;
4260 if (strEQ(d,"grgid")) return -KEY_getgrgid;
4262 else if (*d == 'l') {
4263 if (strEQ(d,"login")) return -KEY_getlogin;
4265 else if (strEQ(d,"c")) return -KEY_getc;
4270 if (strEQ(d,"gt")) return -KEY_gt;
4271 if (strEQ(d,"ge")) return -KEY_ge;
4274 if (strEQ(d,"grep")) return KEY_grep;
4275 if (strEQ(d,"goto")) return KEY_goto;
4276 if (strEQ(d,"glob")) return KEY_glob;
4279 if (strEQ(d,"gmtime")) return -KEY_gmtime;
4284 if (strEQ(d,"hex")) return -KEY_hex;
4287 if (strEQ(d,"INIT")) return KEY_INIT;
4292 if (strEQ(d,"if")) return KEY_if;
4295 if (strEQ(d,"int")) return -KEY_int;
4298 if (strEQ(d,"index")) return -KEY_index;
4299 if (strEQ(d,"ioctl")) return -KEY_ioctl;
4304 if (strEQ(d,"join")) return -KEY_join;
4308 if (strEQ(d,"keys")) return KEY_keys;
4309 if (strEQ(d,"kill")) return -KEY_kill;
4314 if (strEQ(d,"LT")) { deprecate(d); return -KEY_lt;}
4315 if (strEQ(d,"LE")) { deprecate(d); return -KEY_le;}
4321 if (strEQ(d,"lt")) return -KEY_lt;
4322 if (strEQ(d,"le")) return -KEY_le;
4323 if (strEQ(d,"lc")) return -KEY_lc;
4326 if (strEQ(d,"log")) return -KEY_log;
4329 if (strEQ(d,"last")) return KEY_last;
4330 if (strEQ(d,"link")) return -KEY_link;
4331 if (strEQ(d,"lock")) return -KEY_lock;
4334 if (strEQ(d,"local")) return KEY_local;
4335 if (strEQ(d,"lstat")) return -KEY_lstat;
4338 if (strEQ(d,"length")) return -KEY_length;
4339 if (strEQ(d,"listen")) return -KEY_listen;
4342 if (strEQ(d,"lcfirst")) return -KEY_lcfirst;
4345 if (strEQ(d,"localtime")) return -KEY_localtime;
4351 case 1: return KEY_m;
4353 if (strEQ(d,"my")) return KEY_my;
4356 if (strEQ(d,"map")) return KEY_map;
4359 if (strEQ(d,"mkdir")) return -KEY_mkdir;
4362 if (strEQ(d,"msgctl")) return -KEY_msgctl;
4363 if (strEQ(d,"msgget")) return -KEY_msgget;
4364 if (strEQ(d,"msgrcv")) return -KEY_msgrcv;
4365 if (strEQ(d,"msgsnd")) return -KEY_msgsnd;
4370 if (strEQ(d,"NE")) { deprecate(d); return -KEY_ne;}
4373 if (strEQ(d,"next")) return KEY_next;
4374 if (strEQ(d,"ne")) return -KEY_ne;
4375 if (strEQ(d,"not")) return -KEY_not;
4376 if (strEQ(d,"no")) return KEY_no;
4381 if (strEQ(d,"or")) return -KEY_or;
4384 if (strEQ(d,"ord")) return -KEY_ord;
4385 if (strEQ(d,"oct")) return -KEY_oct;
4388 if (strEQ(d,"open")) return -KEY_open;
4391 if (strEQ(d,"opendir")) return -KEY_opendir;
4398 if (strEQ(d,"pop")) return KEY_pop;
4399 if (strEQ(d,"pos")) return KEY_pos;
4402 if (strEQ(d,"push")) return KEY_push;
4403 if (strEQ(d,"pack")) return -KEY_pack;
4404 if (strEQ(d,"pipe")) return -KEY_pipe;
4407 if (strEQ(d,"print")) return KEY_print;
4410 if (strEQ(d,"printf")) return KEY_printf;
4413 if (strEQ(d,"package")) return KEY_package;
4416 if (strEQ(d,"prototype")) return KEY_prototype;
4421 if (strEQ(d,"q")) return KEY_q;
4422 if (strEQ(d,"qq")) return KEY_qq;
4423 if (strEQ(d,"qw")) return KEY_qw;
4424 if (strEQ(d,"qx")) return KEY_qx;
4426 else if (strEQ(d,"quotemeta")) return -KEY_quotemeta;
4431 if (strEQ(d,"ref")) return -KEY_ref;
4434 if (strEQ(d,"read")) return -KEY_read;
4435 if (strEQ(d,"rand")) return -KEY_rand;
4436 if (strEQ(d,"recv")) return -KEY_recv;
4437 if (strEQ(d,"redo")) return KEY_redo;
4440 if (strEQ(d,"rmdir")) return -KEY_rmdir;
4441 if (strEQ(d,"reset")) return -KEY_reset;
4444 if (strEQ(d,"return")) return KEY_return;
4445 if (strEQ(d,"rename")) return -KEY_rename;
4446 if (strEQ(d,"rindex")) return -KEY_rindex;
4449 if (strEQ(d,"require")) return -KEY_require;
4450 if (strEQ(d,"reverse")) return -KEY_reverse;
4451 if (strEQ(d,"readdir")) return -KEY_readdir;
4454 if (strEQ(d,"readlink")) return -KEY_readlink;
4455 if (strEQ(d,"readline")) return -KEY_readline;
4456 if (strEQ(d,"readpipe")) return -KEY_readpipe;
4459 if (strEQ(d,"rewinddir")) return -KEY_rewinddir;
4465 case 0: return KEY_s;
4467 if (strEQ(d,"scalar")) return KEY_scalar;
4472 if (strEQ(d,"seek")) return -KEY_seek;
4473 if (strEQ(d,"send")) return -KEY_send;
4476 if (strEQ(d,"semop")) return -KEY_semop;
4479 if (strEQ(d,"select")) return -KEY_select;
4480 if (strEQ(d,"semctl")) return -KEY_semctl;
4481 if (strEQ(d,"semget")) return -KEY_semget;
4484 if (strEQ(d,"setpgrp")) return -KEY_setpgrp;
4485 if (strEQ(d,"seekdir")) return -KEY_seekdir;
4488 if (strEQ(d,"setpwent")) return -KEY_setpwent;
4489 if (strEQ(d,"setgrent")) return -KEY_setgrent;
4492 if (strEQ(d,"setnetent")) return -KEY_setnetent;
4495 if (strEQ(d,"setsockopt")) return -KEY_setsockopt;
4496 if (strEQ(d,"sethostent")) return -KEY_sethostent;
4497 if (strEQ(d,"setservent")) return -KEY_setservent;
4500 if (strEQ(d,"setpriority")) return -KEY_setpriority;
4501 if (strEQ(d,"setprotoent")) return -KEY_setprotoent;
4508 if (strEQ(d,"shift")) return KEY_shift;
4511 if (strEQ(d,"shmctl")) return -KEY_shmctl;
4512 if (strEQ(d,"shmget")) return -KEY_shmget;
4515 if (strEQ(d,"shmread")) return -KEY_shmread;
4518 if (strEQ(d,"shmwrite")) return -KEY_shmwrite;
4519 if (strEQ(d,"shutdown")) return -KEY_shutdown;
4524 if (strEQ(d,"sin")) return -KEY_sin;
4527 if (strEQ(d,"sleep")) return -KEY_sleep;
4530 if (strEQ(d,"sort")) return KEY_sort;
4531 if (strEQ(d,"socket")) return -KEY_socket;
4532 if (strEQ(d,"socketpair")) return -KEY_socketpair;
4535 if (strEQ(d,"split")) return KEY_split;
4536 if (strEQ(d,"sprintf")) return -KEY_sprintf;
4537 if (strEQ(d,"splice")) return KEY_splice;
4540 if (strEQ(d,"sqrt")) return -KEY_sqrt;
4543 if (strEQ(d,"srand")) return -KEY_srand;
4546 if (strEQ(d,"stat")) return -KEY_stat;
4547 if (strEQ(d,"study")) return KEY_study;
4550 if (strEQ(d,"substr")) return -KEY_substr;
4551 if (strEQ(d,"sub")) return KEY_sub;
4556 if (strEQ(d,"system")) return -KEY_system;
4559 if (strEQ(d,"symlink")) return -KEY_symlink;
4560 if (strEQ(d,"syscall")) return -KEY_syscall;
4561 if (strEQ(d,"sysopen")) return -KEY_sysopen;
4562 if (strEQ(d,"sysread")) return -KEY_sysread;
4563 if (strEQ(d,"sysseek")) return -KEY_sysseek;
4566 if (strEQ(d,"syswrite")) return -KEY_syswrite;
4575 if (strEQ(d,"tr")) return KEY_tr;
4578 if (strEQ(d,"tie")) return KEY_tie;
4581 if (strEQ(d,"tell")) return -KEY_tell;
4582 if (strEQ(d,"tied")) return KEY_tied;
4583 if (strEQ(d,"time")) return -KEY_time;
4586 if (strEQ(d,"times")) return -KEY_times;
4589 if (strEQ(d,"telldir")) return -KEY_telldir;
4592 if (strEQ(d,"truncate")) return -KEY_truncate;
4599 if (strEQ(d,"uc")) return -KEY_uc;
4602 if (strEQ(d,"use")) return KEY_use;
4605 if (strEQ(d,"undef")) return KEY_undef;
4606 if (strEQ(d,"until")) return KEY_until;
4607 if (strEQ(d,"untie")) return KEY_untie;
4608 if (strEQ(d,"utime")) return -KEY_utime;
4609 if (strEQ(d,"umask")) return -KEY_umask;
4612 if (strEQ(d,"unless")) return KEY_unless;
4613 if (strEQ(d,"unpack")) return -KEY_unpack;
4614 if (strEQ(d,"unlink")) return -KEY_unlink;
4617 if (strEQ(d,"unshift")) return KEY_unshift;
4618 if (strEQ(d,"ucfirst")) return -KEY_ucfirst;
4623 if (strEQ(d,"values")) return -KEY_values;
4624 if (strEQ(d,"vec")) return -KEY_vec;
4629 if (strEQ(d,"warn")) return -KEY_warn;
4630 if (strEQ(d,"wait")) return -KEY_wait;
4633 if (strEQ(d,"while")) return KEY_while;
4634 if (strEQ(d,"write")) return -KEY_write;
4637 if (strEQ(d,"waitpid")) return -KEY_waitpid;
4640 if (strEQ(d,"wantarray")) return -KEY_wantarray;
4645 if (len == 1) return -KEY_x;
4646 if (strEQ(d,"xor")) return -KEY_xor;
4649 if (len == 1) return KEY_y;
4658 checkcomma(register char *s, char *name, char *what)
4662 if (dowarn && *s == ' ' && s[1] == '(') { /* XXX gotta be a better way */
4664 for (w = s+2; *w && level; w++) {
4671 for (; *w && isSPACE(*w); w++) ;
4672 if (!*w || !strchr(";|})]oaiuw!=", *w)) /* an advisory hack only... */
4673 warn("%s (...) interpreted as function",name);
4675 while (s < bufend && isSPACE(*s))
4679 while (s < bufend && isSPACE(*s))
4681 if (isIDFIRST(*s)) {
4685 while (s < bufend && isSPACE(*s))
4690 kw = keyword(w, s - w) || perl_get_cv(w, FALSE) != 0;
4694 croak("No comma allowed after %s", what);
4700 scan_word(register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
4702 register char *d = dest;
4703 register char *e = d + destlen - 3; /* two-character token, ending NUL */
4706 croak(ident_too_long);
4709 else if (*s == '\'' && allow_package && isIDFIRST(s[1])) {
4714 else if (*s == ':' && s[1] == ':' && allow_package && s[2] != '$') {
4727 scan_ident(register char *s, register char *send, char *dest, STRLEN destlen, I32 ck_uni)
4734 if (lex_brackets == 0)
4739 e = d + destlen - 3; /* two-character token, ending NUL */
4741 while (isDIGIT(*s)) {
4743 croak(ident_too_long);
4750 croak(ident_too_long);
4753 else if (*s == '\'' && isIDFIRST(s[1])) {
4758 else if (*s == ':' && s[1] == ':') {
4769 if (lex_state != LEX_NORMAL)
4770 lex_state = LEX_INTERPENDMAYBE;
4773 if (*s == '$' && s[1] &&
4774 (isALNUM(s[1]) || strchr("${", s[1]) || strnEQ(s+1,"::",2)) )
4776 if (isDIGIT(s[1]) && lex_state == LEX_INTERPNORMAL)
4777 deprecate("\"$$<digit>\" to mean \"${$}<digit>\"");
4790 if (*d == '^' && *s && (isUPPER(*s) || strchr("[\\]^_?", *s))) {
4795 if (isSPACE(s[-1])) {
4798 if (ch != ' ' && ch != '\t') {
4804 if (isIDFIRST(*d)) {
4806 while (isALNUM(*s) || *s == ':')
4809 while (s < send && (*s == ' ' || *s == '\t')) s++;
4810 if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
4811 if (dowarn && keyword(dest, d - dest)) {
4812 char *brack = *s == '[' ? "[...]" : "{...}";
4813 warn("Ambiguous use of %c{%s%s} resolved to %c%s%s",
4814 funny, dest, brack, funny, dest, brack);
4816 lex_fakebrack = lex_brackets+1;
4818 lex_brackstack[lex_brackets++] = XOPERATOR;
4824 if (lex_state == LEX_INTERPNORMAL && !lex_brackets)
4825 lex_state = LEX_INTERPEND;
4828 if (dowarn && lex_state == LEX_NORMAL &&
4829 (keyword(dest, d - dest) || perl_get_cv(dest, FALSE)))
4830 warn("Ambiguous use of %c{%s} resolved to %c%s",
4831 funny, dest, funny, dest);
4834 s = bracket; /* let the parser handle it */
4838 else if (lex_state == LEX_INTERPNORMAL && !lex_brackets && !intuit_more(s))
4839 lex_state = LEX_INTERPEND;
4843 void pmflag(U16 *pmfl, int ch)
4848 *pmfl |= PMf_GLOBAL;
4850 *pmfl |= PMf_CONTINUE;
4854 *pmfl |= PMf_MULTILINE;
4856 *pmfl |= PMf_SINGLELINE;
4858 *pmfl |= PMf_TAINTMEM;
4860 *pmfl |= PMf_EXTENDED;
4864 scan_pat(char *start)
4869 s = scan_str(start);
4872 SvREFCNT_dec(lex_stuff);
4874 croak("Search pattern not terminated");
4877 pm = (PMOP*)newPMOP(OP_MATCH, 0);
4878 if (multi_open == '?')
4879 pm->op_pmflags |= PMf_ONCE;
4880 while (*s && strchr("iogcmstx", *s))
4881 pmflag(&pm->op_pmflags,*s++);
4882 pm->op_pmpermflags = pm->op_pmflags;
4885 yylval.ival = OP_MATCH;
4890 scan_subst(char *start)
4897 yylval.ival = OP_NULL;
4899 s = scan_str(start);
4903 SvREFCNT_dec(lex_stuff);
4905 croak("Substitution pattern not terminated");
4908 if (s[-1] == multi_open)
4911 first_start = multi_start;
4915 SvREFCNT_dec(lex_stuff);
4918 SvREFCNT_dec(lex_repl);
4920 croak("Substitution replacement not terminated");
4922 multi_start = first_start; /* so whole substitution is taken together */
4924 pm = (PMOP*)newPMOP(OP_SUBST, 0);
4930 else if (strchr("iogcmstx", *s))
4931 pmflag(&pm->op_pmflags,*s++);
4938 pm->op_pmflags |= PMf_EVAL;
4939 repl = newSVpv("",0);
4941 sv_catpv(repl, es ? "eval " : "do ");
4942 sv_catpvn(repl, "{ ", 2);
4943 sv_catsv(repl, lex_repl);
4944 sv_catpvn(repl, " };", 2);
4945 SvCOMPILED_on(repl);
4946 SvREFCNT_dec(lex_repl);
4950 pm->op_pmpermflags = pm->op_pmflags;
4952 yylval.ival = OP_SUBST;
4957 scan_trans(char *start)
4966 yylval.ival = OP_NULL;
4968 s = scan_str(start);
4971 SvREFCNT_dec(lex_stuff);
4973 croak("Transliteration pattern not terminated");
4975 if (s[-1] == multi_open)
4981 SvREFCNT_dec(lex_stuff);
4984 SvREFCNT_dec(lex_repl);
4986 croak("Transliteration replacement not terminated");
4989 New(803,tbl,256,short);
4990 o = newPVOP(OP_TRANS, 0, (char*)tbl);
4992 complement = Delete = squash = 0;
4993 while (*s == 'c' || *s == 'd' || *s == 's') {
4995 complement = OPpTRANS_COMPLEMENT;
4997 Delete = OPpTRANS_DELETE;
4999 squash = OPpTRANS_SQUASH;
5002 o->op_private = Delete|squash|complement;
5005 yylval.ival = OP_TRANS;
5010 scan_heredoc(register char *s)
5014 I32 op_type = OP_SCALAR;
5021 int outer = (rsfp && !(lex_inwhat == OP_SCALAR));
5025 e = tokenbuf + sizeof tokenbuf - 1;
5028 for (peek = s; *peek == ' ' || *peek == '\t'; peek++) ;
5029 if (*peek && strchr("`'\"",*peek)) {
5032 s = delimcpy(d, e, s, bufend, term, &len);
5043 deprecate("bare << to mean <<\"\"");
5044 for (; isALNUM(*s); s++) {
5049 if (d >= tokenbuf + sizeof tokenbuf - 1)
5050 croak("Delimiter for here document is too long");
5055 if (outer || !(d=ninstr(s,bufend,d,d+1)))
5056 herewas = newSVpv(s,bufend-s);
5058 s--, herewas = newSVpv(s,d-s);
5059 s += SvCUR(herewas);
5061 tmpstr = NEWSV(87,80);
5062 sv_upgrade(tmpstr, SVt_PVIV);
5067 else if (term == '`') {
5068 op_type = OP_BACKTICK;
5069 SvIVX(tmpstr) = '\\';
5073 multi_start = curcop->cop_line;
5074 multi_open = multi_close = '<';
5078 while (s < bufend &&
5079 (*s != term || memNE(s,tokenbuf,len)) ) {
5084 curcop->cop_line = multi_start;
5085 missingterm(tokenbuf);
5087 sv_setpvn(tmpstr,d+1,s-d);
5089 curcop->cop_line++; /* the preceding stmt passes a newline */
5091 sv_catpvn(herewas,s,bufend-s);
5092 sv_setsv(linestr,herewas);
5093 oldoldbufptr = oldbufptr = bufptr = s = linestart = SvPVX(linestr);
5094 bufend = SvPVX(linestr) + SvCUR(linestr);
5097 sv_setpvn(tmpstr,"",0); /* avoid "uninitialized" warning */
5098 while (s >= bufend) { /* multiple line string? */
5100 !(oldoldbufptr = oldbufptr = s = linestart = filter_gets(linestr, rsfp, 0))) {
5101 curcop->cop_line = multi_start;
5102 missingterm(tokenbuf);
5105 if (PERLDB_LINE && curstash != debstash) {
5106 SV *sv = NEWSV(88,0);
5108 sv_upgrade(sv, SVt_PVMG);
5109 sv_setsv(sv,linestr);
5110 av_store(GvAV(curcop->cop_filegv),
5111 (I32)curcop->cop_line,sv);
5113 bufend = SvPVX(linestr) + SvCUR(linestr);
5114 if (*s == term && memEQ(s,tokenbuf,len)) {
5117 sv_catsv(linestr,herewas);
5118 bufend = SvPVX(linestr) + SvCUR(linestr);
5122 sv_catsv(tmpstr,linestr);
5125 multi_end = curcop->cop_line;
5127 if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
5128 SvLEN_set(tmpstr, SvCUR(tmpstr) + 1);
5129 Renew(SvPVX(tmpstr), SvLEN(tmpstr), char);
5131 SvREFCNT_dec(herewas);
5133 yylval.ival = op_type;
5138 takes: current position in input buffer
5139 returns: new position in input buffer
5140 side-effects: yylval and lex_op are set.
5145 <FH> read from filehandle
5146 <pkg::FH> read from package qualified filehandle
5147 <pkg'FH> read from package qualified filehandle
5148 <$fh> read from filehandle in $fh
5154 scan_inputsymbol(char *start)
5156 register char *s = start; /* current position in buffer */
5161 d = tokenbuf; /* start of temp holding space */
5162 e = tokenbuf + sizeof tokenbuf; /* end of temp holding space */
5163 s = delimcpy(d, e, s + 1, bufend, '>', &len); /* extract until > */
5165 /* die if we didn't have space for the contents of the <>,
5169 if (len >= sizeof tokenbuf)
5170 croak("Excessively long <> operator");
5172 croak("Unterminated <> operator");
5177 Remember, only scalar variables are interpreted as filehandles by
5178 this code. Anything more complex (e.g., <$fh{$num}>) will be
5179 treated as a glob() call.
5180 This code makes use of the fact that except for the $ at the front,
5181 a scalar variable and a filehandle look the same.
5183 if (*d == '$' && d[1]) d++;
5185 /* allow <Pkg'VALUE> or <Pkg::VALUE> */
5186 while (*d && (isALNUM(*d) || *d == '\'' || *d == ':'))
5189 /* If we've tried to read what we allow filehandles to look like, and
5190 there's still text left, then it must be a glob() and not a getline.
5191 Use scan_str to pull out the stuff between the <> and treat it
5192 as nothing more than a string.
5195 if (d - tokenbuf != len) {
5196 yylval.ival = OP_GLOB;
5198 s = scan_str(start);
5200 croak("Glob not terminated");
5204 /* we're in a filehandle read situation */
5207 /* turn <> into <ARGV> */
5209 (void)strcpy(d,"ARGV");
5211 /* if <$fh>, create the ops to turn the variable into a
5217 /* try to find it in the pad for this block, otherwise find
5218 add symbol table ops
5220 if ((tmp = pad_findmy(d)) != NOT_IN_PAD) {
5221 OP *o = newOP(OP_PADSV, 0);
5223 lex_op = (OP*)newUNOP(OP_READLINE, 0, newUNOP(OP_RV2GV, 0, o));
5226 GV *gv = gv_fetchpv(d+1,TRUE, SVt_PV);
5227 lex_op = (OP*)newUNOP(OP_READLINE, 0,
5228 newUNOP(OP_RV2GV, 0,
5229 newUNOP(OP_RV2SV, 0,
5230 newGVOP(OP_GV, 0, gv))));
5232 /* we created the ops in lex_op, so make yylval.ival a null op */
5233 yylval.ival = OP_NULL;
5236 /* If it's none of the above, it must be a literal filehandle
5237 (<Foo::BAR> or <FOO>) so build a simple readline OP */
5239 GV *gv = gv_fetchpv(d,TRUE, SVt_PVIO);
5240 lex_op = (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
5241 yylval.ival = OP_NULL;
5250 takes: start position in buffer
5251 returns: position to continue reading from buffer
5252 side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
5253 updates the read buffer.
5255 This subroutine pulls a string out of the input. It is called for:
5256 q single quotes q(literal text)
5257 ' single quotes 'literal text'
5258 qq double quotes qq(interpolate $here please)
5259 " double quotes "interpolate $here please"
5260 qx backticks qx(/bin/ls -l)
5261 ` backticks `/bin/ls -l`
5262 qw quote words @EXPORT_OK = qw( func() $spam )
5263 m// regexp match m/this/
5264 s/// regexp substitute s/this/that/
5265 tr/// string transliterate tr/this/that/
5266 y/// string transliterate y/this/that/
5267 ($*@) sub prototypes sub foo ($)
5268 <> readline or globs <FOO>, <>, <$fh>, or <*.c>
5270 In most of these cases (all but <>, patterns and transliterate)
5271 yylex() calls scan_str(). m// makes yylex() call scan_pat() which
5272 calls scan_str(). s/// makes yylex() call scan_subst() which calls
5273 scan_str(). tr/// and y/// make yylex() call scan_trans() which
5276 It skips whitespace before the string starts, and treats the first
5277 character as the delimiter. If the delimiter is one of ([{< then
5278 the corresponding "close" character )]}> is used as the closing
5279 delimiter. It allows quoting of delimiters, and if the string has
5280 balanced delimiters ([{<>}]) it allows nesting.
5282 The lexer always reads these strings into lex_stuff, except in the
5283 case of the operators which take *two* arguments (s/// and tr///)
5284 when it checks to see if lex_stuff is full (presumably with the 1st
5285 arg to s or tr) and if so puts the string into lex_repl.
5290 scan_str(char *start)
5293 SV *sv; /* scalar value: string */
5294 char *tmps; /* temp string, used for delimiter matching */
5295 register char *s = start; /* current position in the buffer */
5296 register char term; /* terminating character */
5297 register char *to; /* current position in the sv's data */
5298 I32 brackets = 1; /* bracket nesting level */
5300 /* skip space before the delimiter */
5304 /* mark where we are, in case we need to report errors */
5307 /* after skipping whitespace, the next character is the terminator */
5309 /* mark where we are */
5310 multi_start = curcop->cop_line;
5313 /* find corresponding closing delimiter */
5314 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
5318 /* create a new SV to hold the contents. 87 is leak category, I'm
5319 assuming. 80 is the SV's initial length. What a random number. */
5321 sv_upgrade(sv, SVt_PVIV);
5323 (void)SvPOK_only(sv); /* validate pointer */
5325 /* move past delimiter and try to read a complete string */
5328 /* extend sv if need be */
5329 SvGROW(sv, SvCUR(sv) + (bufend - s) + 1);
5330 /* set 'to' to the next character in the sv's string */
5331 to = SvPVX(sv)+SvCUR(sv);
5333 /* if open delimiter is the close delimiter read unbridle */
5334 if (multi_open == multi_close) {
5335 for (; s < bufend; s++,to++) {
5336 /* embedded newlines increment the current line number */
5337 if (*s == '\n' && !rsfp)
5339 /* handle quoted delimiters */
5340 if (*s == '\\' && s+1 < bufend && term != '\\') {
5343 /* any other quotes are simply copied straight through */
5347 /* terminate when run out of buffer (the for() condition), or
5348 have found the terminator */
5349 else if (*s == term)
5355 /* if the terminator isn't the same as the start character (e.g.,
5356 matched brackets), we have to allow more in the quoting, and
5357 be prepared for nested brackets.
5360 /* read until we run out of string, or we find the terminator */
5361 for (; s < bufend; s++,to++) {
5362 /* embedded newlines increment the line count */
5363 if (*s == '\n' && !rsfp)
5365 /* backslashes can escape the open or closing characters */
5366 if (*s == '\\' && s+1 < bufend) {
5367 if ((s[1] == multi_open) || (s[1] == multi_close))
5372 /* allow nested opens and closes */
5373 else if (*s == multi_close && --brackets <= 0)
5375 else if (*s == multi_open)
5380 /* terminate the copied string and update the sv's end-of-string */
5382 SvCUR_set(sv, to - SvPVX(sv));
5385 * this next chunk reads more into the buffer if we're not done yet
5388 if (s < bufend) break; /* handle case where we are done yet :-) */
5390 /* if we're out of file, or a read fails, bail and reset the current
5391 line marker so we can report where the unterminated string began
5394 !(oldoldbufptr = oldbufptr = s = linestart = filter_gets(linestr, rsfp, 0))) {
5396 curcop->cop_line = multi_start;
5399 /* we read a line, so increment our line counter */
5402 /* update debugger info */
5403 if (PERLDB_LINE && curstash != debstash) {
5404 SV *sv = NEWSV(88,0);
5406 sv_upgrade(sv, SVt_PVMG);
5407 sv_setsv(sv,linestr);
5408 av_store(GvAV(curcop->cop_filegv),
5409 (I32)curcop->cop_line, sv);
5412 /* having changed the buffer, we must update bufend */
5413 bufend = SvPVX(linestr) + SvCUR(linestr);
5416 /* at this point, we have successfully read the delimited string */
5418 multi_end = curcop->cop_line;
5421 /* if we allocated too much space, give some back */
5422 if (SvCUR(sv) + 5 < SvLEN(sv)) {
5423 SvLEN_set(sv, SvCUR(sv) + 1);
5424 Renew(SvPVX(sv), SvLEN(sv), char);
5427 /* decide whether this is the first or second quoted string we've read
5440 takes: pointer to position in buffer
5441 returns: pointer to new position in buffer
5442 side-effects: builds ops for the constant in yylval.op
5444 Read a number in any of the formats that Perl accepts:
5446 0(x[0-7A-F]+)|([0-7]+)
5447 [\d_]+(\.[\d_]*)?[Ee](\d+)
5449 Underbars (_) are allowed in decimal numbers. If -w is on,
5450 underbars before a decimal point must be at three digit intervals.
5452 Like most scan_ routines, it uses the tokenbuf buffer to hold the
5455 If it reads a number without a decimal point or an exponent, it will
5456 try converting the number to an integer and see if it can do so
5457 without loss of precision.
5461 scan_num(char *start)
5463 register char *s = start; /* current position in buffer */
5464 register char *d; /* destination in temp buffer */
5465 register char *e; /* end of temp buffer */
5466 I32 tryiv; /* used to see if it can be an int */
5467 double value; /* number read, as a double */
5468 SV *sv; /* place to put the converted number */
5469 I32 floatit; /* boolean: int or float? */
5470 char *lastub = 0; /* position of last underbar */
5471 static char number_too_long[] = "Number too long";
5473 /* We use the first character to decide what type of number this is */
5477 croak("panic: scan_num");
5479 /* if it starts with a 0, it could be an octal number, a decimal in
5480 0.13 disguise, or a hexadecimal number.
5485 u holds the "number so far"
5486 shift the power of 2 of the base (hex == 4, octal == 3)
5487 overflowed was the number more than we can hold?
5489 Shift is used when we add a digit. It also serves as an "are
5490 we in octal or hex?" indicator to disallow hex characters when
5495 bool overflowed = FALSE;
5502 /* check for a decimal in disguise */
5503 else if (s[1] == '.')
5505 /* so it must be octal */
5510 /* read the rest of the octal number */
5512 UV n, b; /* n is used in the overflow test, b is the digit we're adding on */
5516 /* if we don't mention it, we're done */
5525 /* 8 and 9 are not octal */
5528 yyerror("Illegal octal digit");
5532 case '0': case '1': case '2': case '3': case '4':
5533 case '5': case '6': case '7':
5534 b = *s++ & 15; /* ASCII digit -> value of digit */
5538 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
5539 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
5540 /* make sure they said 0x */
5545 /* Prepare to put the digit we have onto the end
5546 of the number so far. We check for overflows.
5550 n = u << shift; /* make room for the digit */
5551 if (!overflowed && (n >> shift) != u) {
5552 warn("Integer overflow in %s number",
5553 (shift == 4) ? "hex" : "octal");
5556 u = n | b; /* add the digit to the end */
5561 /* if we get here, we had success: make a scalar value from
5571 handle decimal numbers.
5572 we're also sent here when we read a 0 as the first digit
5574 case '1': case '2': case '3': case '4': case '5':
5575 case '6': case '7': case '8': case '9': case '.':
5578 e = tokenbuf + sizeof tokenbuf - 6; /* room for various punctuation */
5581 /* read next group of digits and _ and copy into d */
5582 while (isDIGIT(*s) || *s == '_') {
5583 /* skip underscores, checking for misplaced ones
5587 if (dowarn && lastub && s - lastub != 3)
5588 warn("Misplaced _ in number");
5592 /* check for end of fixed-length buffer */
5594 croak(number_too_long);
5595 /* if we're ok, copy the character */
5600 /* final misplaced underbar check */
5601 if (dowarn && lastub && s - lastub != 3)
5602 warn("Misplaced _ in number");
5604 /* read a decimal portion if there is one. avoid
5605 3..5 being interpreted as the number 3. followed
5608 if (*s == '.' && s[1] != '.') {
5612 /* copy, ignoring underbars, until we run out of
5613 digits. Note: no misplaced underbar checks!
5615 for (; isDIGIT(*s) || *s == '_'; s++) {
5616 /* fixed length buffer check */
5618 croak(number_too_long);
5624 /* read exponent part, if present */
5625 if (*s && strchr("eE",*s) && strchr("+-0123456789",s[1])) {
5629 /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
5630 *d++ = 'e'; /* At least some Mach atof()s don't grok 'E' */
5632 /* allow positive or negative exponent */
5633 if (*s == '+' || *s == '-')
5636 /* read digits of exponent (no underbars :-) */
5637 while (isDIGIT(*s)) {
5639 croak(number_too_long);
5644 /* terminate the string */
5647 /* make an sv from the string */
5649 /* reset numeric locale in case we were earlier left in Swaziland */
5650 SET_NUMERIC_STANDARD();
5651 value = atof(tokenbuf);
5654 See if we can make do with an integer value without loss of
5655 precision. We use I_V to cast to an int, because some
5656 compilers have issues. Then we try casting it back and see
5657 if it was the same. We only do this if we know we
5658 specifically read an integer.
5660 Note: if floatit is true, then we don't need to do the
5664 if (!floatit && (double)tryiv == value)
5665 sv_setiv(sv, tryiv);
5667 sv_setnv(sv, value);
5671 /* make the op for the constant and return */
5673 yylval.opval = newSVOP(OP_CONST, 0, sv);
5679 scan_formline(register char *s)
5684 SV *stuff = newSVpv("",0);
5685 bool needargs = FALSE;
5688 if (*s == '.' || *s == '}') {
5690 for (t = s+1; *t == ' ' || *t == '\t'; t++) ;
5694 if (in_eval && !rsfp) {
5695 eol = strchr(s,'\n');
5700 eol = bufend = SvPVX(linestr) + SvCUR(linestr);
5702 for (t = s; t < eol; t++) {
5703 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
5705 goto enough; /* ~~ must be first line in formline */
5707 if (*t == '@' || *t == '^')
5710 sv_catpvn(stuff, s, eol-s);
5714 s = filter_gets(linestr, rsfp, 0);
5715 oldoldbufptr = oldbufptr = bufptr = linestart = SvPVX(linestr);
5716 bufend = bufptr + SvCUR(linestr);
5719 yyerror("Format not terminated");
5729 lex_state = LEX_NORMAL;
5730 nextval[nexttoke].ival = 0;
5734 lex_state = LEX_FORMLINE;
5735 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, stuff);
5737 nextval[nexttoke].ival = OP_FORMLINE;
5741 SvREFCNT_dec(stuff);
5753 cshlen = strlen(cshname);
5758 start_subparse(I32 is_format, U32 flags)
5761 I32 oldsavestack_ix = savestack_ix;
5762 CV* outsidecv = compcv;
5766 assert(SvTYPE(compcv) == SVt_PVCV);
5773 SAVESPTR(comppad_name);
5775 SAVEI32(comppad_name_fill);
5776 SAVEI32(min_intro_pending);
5777 SAVEI32(max_intro_pending);
5778 SAVEI32(pad_reset_pending);
5780 compcv = (CV*)NEWSV(1104,0);
5781 sv_upgrade((SV *)compcv, is_format ? SVt_PVFM : SVt_PVCV);
5782 CvFLAGS(compcv) |= flags;
5785 av_push(comppad, Nullsv);
5786 curpad = AvARRAY(comppad);
5787 comppad_name = newAV();
5788 comppad_name_fill = 0;
5789 min_intro_pending = 0;
5791 subline = curcop->cop_line;
5793 av_store(comppad_name, 0, newSVpv("@_", 2));
5794 curpad[0] = (SV*)newAV();
5795 SvPADMY_on(curpad[0]); /* XXX Needed? */
5796 CvOWNER(compcv) = 0;
5797 New(666, CvMUTEXP(compcv), 1, perl_mutex);
5798 MUTEX_INIT(CvMUTEXP(compcv));
5799 #endif /* USE_THREADS */
5801 comppadlist = newAV();
5802 AvREAL_off(comppadlist);
5803 av_store(comppadlist, 0, (SV*)comppad_name);
5804 av_store(comppadlist, 1, (SV*)comppad);
5806 CvPADLIST(compcv) = comppadlist;
5807 CvOUTSIDE(compcv) = (CV*)SvREFCNT_inc(outsidecv);
5809 CvOWNER(compcv) = 0;
5810 New(666, CvMUTEXP(compcv), 1, perl_mutex);
5811 MUTEX_INIT(CvMUTEXP(compcv));
5812 #endif /* USE_THREADS */
5814 return oldsavestack_ix;
5833 char *context = NULL;
5837 if (!yychar || (yychar == ';' && !rsfp))
5839 else if (bufptr > oldoldbufptr && bufptr - oldoldbufptr < 200 &&
5840 oldoldbufptr != oldbufptr && oldbufptr != bufptr) {
5841 while (isSPACE(*oldoldbufptr))
5843 context = oldoldbufptr;
5844 contlen = bufptr - oldoldbufptr;
5846 else if (bufptr > oldbufptr && bufptr - oldbufptr < 200 &&
5847 oldbufptr != bufptr) {
5848 while (isSPACE(*oldbufptr))
5850 context = oldbufptr;
5851 contlen = bufptr - oldbufptr;
5853 else if (yychar > 255)
5854 where = "next token ???";
5855 else if ((yychar & 127) == 127) {
5856 if (lex_state == LEX_NORMAL ||
5857 (lex_state == LEX_KNOWNEXT && lex_defer == LEX_NORMAL))
5858 where = "at end of line";
5860 where = "within pattern";
5862 where = "within string";
5865 SV *where_sv = sv_2mortal(newSVpv("next char ", 0));
5867 sv_catpvf(where_sv, "^%c", toCTRL(yychar));
5868 else if (isPRINT_LC(yychar))
5869 sv_catpvf(where_sv, "%c", yychar);
5871 sv_catpvf(where_sv, "\\%03o", yychar & 255);
5872 where = SvPVX(where_sv);
5874 msg = sv_2mortal(newSVpv(s, 0));
5875 sv_catpvf(msg, " at %_ line %ld, ",
5876 GvSV(curcop->cop_filegv), (long)curcop->cop_line);
5878 sv_catpvf(msg, "near \"%.*s\"\n", contlen, context);
5880 sv_catpvf(msg, "%s\n", where);
5881 if (multi_start < multi_end && (U32)(curcop->cop_line - multi_end) <= 1) {
5883 " (Might be a runaway multi-line %c%c string starting on line %ld)\n",
5884 (int)multi_open,(int)multi_close,(long)multi_start);
5890 sv_catsv(ERRSV, msg);
5892 PerlIO_write(PerlIO_stderr(), SvPVX(msg), SvCUR(msg));
5893 if (++error_count >= 10)
5894 croak("%_ has too many errors.\n", GvSV(curcop->cop_filegv));
5896 in_my_stash = Nullhv;