perl 5.0 alpha 3
authorLarry Wall <larry@netlabs.com>
Sun, 10 Oct 1993 00:00:00 +0000 (00:00 +0000)
committerLarry Wall <larry@netlabs.com>
Sun, 10 Oct 1993 00:00:00 +0000 (00:00 +0000)
[editor's note: the sparc executables have not been included,
and emacs backup files have been removed]

63 files changed:
Bugs/minmax [deleted file]
Bugs/misparse [deleted file]
Bugs/pagdir [new file with mode: 0644]
Bugs/replacecase [new file with mode: 0644]
Bugs/stuff [new file with mode: 0644]
Changes
Makefile
Todo
bar
config.sh
cop.h
doio.c
doop.c
dump.c
eg/uudecode [new file with mode: 0644]
embed.h
foo [new file with mode: 0755]
global.var
gv.c
hv.c
hv.h
interp.var
keywords.h
lib/ctime.pl
lib/open3.pl [new file with mode: 0644]
main.c
make.out
makefile
mg.c
op.c
op.h
opcode.h
opcode.pl
perl.c
perl.h
perly.c
perly.c.byacc [new file with mode: 0644]
perly.c.diff [new file with mode: 0644]
perly.c.yacc [new file with mode: 0644]
perly.fixer
perly.h
perly.h.yacc [new file with mode: 0644]
perly.y
pp.c
pp.h
predump [new file with mode: 0644]
proto.h
regcomp.c
scope.c
sv.c
sv.h
sv_append_till [new file with mode: 0644]
t/cmd/subval.t
t/foo [deleted file]
t/op/local.t
t/op/my.t [new file with mode: 0755]
t/op/ref.t
toke.c
usub/tus [new file with mode: 0755]
usub/tuv [new file with mode: 0755]
usub/typemap [new file with mode: 0644]
util.c
x2p/find2perl.SH

diff --git a/Bugs/minmax b/Bugs/minmax
deleted file mode 100644 (file)
index 4251f81..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#!./perl
-
-sub minmax {
-  eval '@_ = sort { $a '.shift().' $b } @_';
-  (shift, pop(@_));  
-}
-
-($x, $y) = &minmax('<=>', 2, 4, 1, 0, 3);
-print "x = $x, y = $y\n";
-($x, $y) = &minmax('cmp', "foo", "bar", "zot", "xyzzy");
-print "x = $x, y = $y\n";
-
diff --git a/Bugs/misparse b/Bugs/misparse
deleted file mode 100644 (file)
index a76710c..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-print STDERR "Can't open $mib_name: $!\n"
-&objviews'Exit;
diff --git a/Bugs/pagdir b/Bugs/pagdir
new file mode 100644 (file)
index 0000000..7cc76f2
--- /dev/null
@@ -0,0 +1,24 @@
+Article 433 of comp.os.386bsd.apps:
+Path: netlabs!news.cerf.net!usc!howland.reston.ans.net!spool.mu.edu!bloom-beacon.mit.edu!ai-lab!life.ai.mit.edu!mycroft
+From: mycroft@trinity.gnu.ai.mit.edu (Charles Hannum)
+Newsgroups: comp.os.386bsd.apps
+Subject: Re: Perl-4.036?
+Date: 06 Sep 1993 19:01:10 GMT
+Organization: MIT Artificial Intelligence Lab
+Lines: 9
+Message-ID: <MYCROFT.93Sep6150110@trinity.gnu.ai.mit.edu>
+References: <26fptu$1q1@terminator.rs.itd.umich.edu> <26fve4$ivf@homer.cs.mcgill.ca>
+NNTP-Posting-Host: trinity.gnu.ai.mit.edu
+In-reply-to: storm@cs.mcgill.ca's message of 6 Sep 1993 18:27:16 GMT
+
+
+   Perl 4.036 comipled without a single hitch under NetBSD 0.9 last
+   week.  It failed the db test, but I suspect that is due to the new
+   db stuff under NetBSD and the like...
+
+Yes.  The perl test seems to expect the database to be put in
+`foo.pag' and `foo.dir', which isn't the case any more.  I suspect
+lwall will fix this soon.
+
+
+
diff --git a/Bugs/replacecase b/Bugs/replacecase
new file mode 100644 (file)
index 0000000..795ea9d
--- /dev/null
@@ -0,0 +1 @@
+s/\w/[\u$&\l$&]/gi;
diff --git a/Bugs/stuff b/Bugs/stuff
new file mode 100644 (file)
index 0000000..3337af0
--- /dev/null
@@ -0,0 +1,64 @@
+Article 13355 of comp.lang.perl:
+Newsgroups: comp.lang.perl
+Path: netlabs!news.cerf.net!usc!cs.utexas.edu!uunet!fmrco!fmrco!asherman
+From: asherman@fmrco.com (Aaron Sherman)
+Subject: Re: perl 5a2 cannot "die" (plus current list o' bugs)
+In-Reply-To: wjm@feenix.metronet.com's message of Fri, 20 Aug 1993 21:32:10 GMT
+Message-ID: <ASHERMAN.93Aug23094250@uboat.fmrco.com>
+Sender: news@fmrco.uucp
+X-Quote: "...accepting is much harder than giving." -Mike Smith
+Reply-To: asherman@fmrco.COM
+Organization: I-Kinetics, 19 Bishop-Allen Dr., Cambridge, MA
+References: <ASHERMAN.93Aug20102959@uboat.fmrco.com> <CC2uHM.6Hq@feenix.metronet.com>
+Date: Mon, 23 Aug 1993 14:42:50 GMT
+Lines: 47
+
+
+>>>>> wjm@feenix.metronet.com (Bill Middleton) said:
+
+wjm> asherman@fmrco.COM writes:
+
+>An interesting pair of bugs can be seen in the following output:
+
+wjm> I dont think so.  Could be in the compilation or something.  Did it
+wjm> pass all tests?  Each of the following work fine here on this HP.
+
+I tried compiling with Sun's native CC and GCC. Both worked fine, but
+caused this problem. I'll try it with Larry's original version when I
+get a chance.
+
+wjm> perl5 -e 'die "hello $. \n";
+wjm> hello  
+
+Ah. But, note that the $. STILL isn't working. So only ONE of those
+bugs did not show.
+
+This is my current list of bugs (not complete, but what I've had time
+to note). Hope it helps:
+
+"perl -e die" will cause a seg-fault
+
+$. is not updated
+
+Memory leak for anonymous arrays:
+       while(1) { @a = (1, 2, 3, [4, 5], 6); @a = (); }
+       Will keep allocating and not freeing memory.
+
+"perl -e 'sub foo {print 1} foo'" should either complain or call foo,
+       but does neither. Or, did Larry not impliment the &-less
+       function calling that he was talking about?
+
+"perl -le 'sub foo {1} $a = \&foo; print &{$a}; print &{$a} + 1'" should
+       not fail to parse.
+
+
+                       -AJS
+
+--
+Aaron Sherman                  I-Kinetics, Inc.
+Systems Engineer                 "Open Systems Stepstones"
+Voice: (617)661-8181           19 Bishop Allen Dr.
+Fax:   (617)661-8625           Cambridge, MA 02139
+Pager: (508)545-0584           asherman@i-kinetics.com
+
+
diff --git a/Changes b/Changes
index 55bedde..b8fb52f 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,18 +1,75 @@
-
+Incompatibilities
+-----------------
     s'$lhs'$rhs' now does no interpolation on either side.  It used to
     interplolate $lhs but not $rhs.
 
     The second and third arguments of splice are now evaluated in scalar
     context (like the book says) rather than list context.
 
-    Saying shift @foo + 20 is now a semantic error.
+    Saying "shift @foo + 20" is now a semantic error because of precedence.
+
+    "open FOO || die" is now incorrect.  You need parens around the filehandle.
 
     The elements of argument lists for formats are now evaluated in list
-    context.
+    context.  This means you can interpolate list values now.
 
-    You can't do a goto into a block that is optimized away.
+    You can't do a goto into a block that is optimized away.  Darn.
 
     It is no longer syntactically legal to use whitespace as the name
     of a variable.
 
     Some error messages will be different.
+
+    The caller function now a false value in a scalar context if there is
+    no caller.  This lets library files determine if they're being required.
+
+    m//g now attaches its state to the searched string rather than the
+    regular expression.
+
+New things
+----------
+    The -w switch is much more informative.
+
+    References.  See t/op/ref.t for examples.
+
+    Objects.  See t/op/ref.t for examples.
+
+    => is now a synonym for comma.  This is useful as documentation for
+    arguments that come in pairs, such as initializers for associative arrays,
+    or named arguments to a subroutine.
+
+    All functions have been turned into list operators or unary operators,
+    meaning the parens are optional.  Even subroutines may be called as
+    list operators if they've already been declared.
+
+    More embeddible.  See main.c and embed_h.SH.
+
+    The interpreter is now flattened out.  Compare Perl 4's eval.c with
+    the perl 5's pp.c.  Compare Perl 4's 900 line interpreter loop in cmd.c
+    with Perl 5's 1 line interpreter loop in run.c.  Eventually we'll make
+    everything non-blocking so we can interface nicely with a scheduler.
+
+    eval is now treated more like a subroutine call.  Among other things,
+    this means you can return from it.
+
+    Format value lists may be spread over multiple lines by enclosing in
+    curlies.
+
+    You may now define BEGIN and END subroutines for each package.  The BEGIN
+    subroutine executes the moment it's parsed.  The END subroutine executes
+    just before exiting.
+
+    Flags on the #! line are interpreted even if the script wasn't
+    executed directly.  (And even if the script was located by "perl -x"!)
+
+    The ?: operator is now legal as an lvalue.
+
+    List context now propagates to the right side of && and ||, as well
+    as the 2nd and 3rd arguments to ?:.
+
+    The "defined" function can now take a general expression.
+
+    Lexical scoping available via "my".  eval can see the current lexical
+    variables.
+
+    Saying "package;" requires explicit package name on global symbols.
index c2ea485..867f56d 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -360,6 +360,7 @@ shlist:
 # AUTOMATICALLY GENERATED MAKE DEPENDENCIES--PUT NOTHING BELOW THIS LINE
 $(obj) hv.o:
        @ echo "You haven't done a "'"make depend" yet!'; exit 1
+
 makedepend: makedepend.SH
        /bin/sh $(shellflags) makedepend.SH
 
diff --git a/Todo b/Todo
index 86e2b17..3393a7f 100755 (executable)
--- a/Todo
+++ b/Todo
@@ -1,18 +1,31 @@
+POSIX compatibility
+hash binding
+pack(P)
+fix gv refcnts
+
+/\Afoo/ (beginning of string, or where previous g match left off)
+/foo\Z/ (end of string only)
+Make specialized allocators
+Optimize switch statements
+Optimize foreach on array
+Optimize foreach (1..1000000)
 Set KEEP on constant split
-Optimize foreach on array.
-Execute all BEGINs and ENDs.
-Make a good way to determine if *.pl is being executed directly.
-Make specialized allocators.
-Optimize switches.
-Do debugger
-Cache eval tree
-Implement eval once
-Cache m//g state
+Cache eval tree (unless lexical outer scope used (mark in &compiling?))
 rcatmaybe
-Fix length($&)
-eval {} coredump
+Cache method lookup
+Shrink opcode tables via multiple implementations selected in peep
+Straighten out the RS stuff in BEGIN
+Make yyparse recursion longjmp() proof.
 
+sub mysplice(@, $, $, ...)?
+pretty function?  (or is it, as I suspect, a lib routine?)
+perlex function?
+X Perl?  Motif Perl?
+give DOG $bone?
+Nested destructors?
 make tr/// return histogram in list context?
-Do anything with "hint"?
+Implement eval once?  (Unnecessary with cache?)
 When does split() go to @_?
 undef wantarray in void context?
+goto &coroutine?
+filehandle references?
diff --git a/bar b/bar
index 96bf8fa..65f17df 100755 (executable)
--- a/bar
+++ b/bar
@@ -1 +1,5 @@
-###############################################################################
+#!./perl
+
+sub foo;
+
+foo;
index f0fc456..896c10b 100644 (file)
--- a/config.sh
+++ b/config.sh
@@ -233,8 +233,8 @@ medium=''
 large=''
 huge=''
 optimize='-g'
-ccflags=' -I/usr/include/sun -I/usr/ucbinclude -DDEBUGGING'
-cppflags=' -I/usr/include/sun -I/usr/ucbinclude -DDEBUGGING'
+ccflags='-DDEBUGGING'
+cppflags='-DDEBUGGING'
 ldflags=''
 cc='cc'
 nativegcc=''
diff --git a/cop.h b/cop.h
index 9f07457..8e7a88d 100644 (file)
--- a/cop.h
+++ b/cop.h
@@ -49,6 +49,7 @@ struct cop {
        struct ccop ccop;       /* compound command */
        struct scop scop;       /* switch command */
     } uop;
+    U32                cop_seq;        /* parse sequence number */
     short      cop_slen;       /* len of cop_short, if not null */
     VOL short  cop_flags;      /* optimization flags--see above */
     HV *       cop_stash;      /* package line was compiled in */
@@ -70,6 +71,7 @@ struct block_sub {
     GV *       defgv;
     AV *       savearray;
     AV *       argarray;
+    AV *       comppad;
     U16                olddepth;
     U8         hasargs;
 };
diff --git a/doio.c b/doio.c
index ce0eae3..73d8535 100644 (file)
--- a/doio.c
+++ b/doio.c
@@ -236,7 +236,7 @@ I32 len;
        }
     }
     if (!fp) {
-       if (dowarn && io->type == '<' && index(name, '\n'))
+       if (dowarn && io->type == '<' && strchr(name, '\n'))
            warn(warn_nl, "open");
        Safefree(myname);
        goto say_false;
@@ -909,7 +909,7 @@ dARGS
        sv_setpv(statname,SvPVn(sv));
        laststype = OP_STAT;
        laststatval = stat(SvPVn(sv),&statcache);
-       if (laststatval < 0 && dowarn && index(SvPVn(sv), '\n'))
+       if (laststatval < 0 && dowarn && strchr(SvPVn(sv), '\n'))
            warn(warn_nl, "stat");
        return laststatval;
     }
@@ -941,7 +941,7 @@ dARGS
 #else
     laststatval = stat(SvPVn(sv),&statcache);
 #endif
-    if (laststatval < 0 && dowarn && index(SvPVn(sv), '\n'))
+    if (laststatval < 0 && dowarn && strchr(SvPVn(sv), '\n'))
        warn(warn_nl, "lstat");
     return laststatval;
 }
@@ -1033,7 +1033,7 @@ char *cmd;
     if (*s == '=')
        goto doshell;
     for (s = cmd; *s; s++) {
-       if (*s != ' ' && !isALPHA(*s) && index("$&*(){}[]'\";\\|?<>~`\n",*s)) {
+       if (*s != ' ' && !isALPHA(*s) && strchr("$&*(){}[]'\";\\|?<>~`\n",*s)) {
            if (*s == '\n' && !s[1]) {
                *s = '\0';
                break;
diff --git a/doop.c b/doop.c
index b881548..d4cb84a 100644 (file)
--- a/doop.c
+++ b/doop.c
@@ -89,7 +89,7 @@ OP *arg;
 
     tbl = (short*) cPVOP->op_pv;
     s = SvPVn(sv);
-    send = s + SvCUR(sv);
+    send = s + SvCUROK(sv);
     if (!tbl || !s)
        fatal("panic: do_trans");
     DEBUG_t( deb("2.TBL\n"));
@@ -139,7 +139,7 @@ register SV **sp;
     register I32 items = sp - mark;
     register char *delim = SvPVn(del);
     register STRLEN len;
-    I32 delimlen = SvCUR(del);
+    I32 delimlen = SvCUROK(del);
 
     mark++;
     len = (items > 0 ? (delimlen * (items - 1) ) : 0);
@@ -207,7 +207,7 @@ register SV **sarg;
     sv_setpv(sv,"");
     len--;                     /* don't count pattern string */
     t = s = SvPVn(*sarg);
-    send = s + SvCUR(*sarg);
+    send = s + SvCUROK(*sarg);
     sarg++;
     for ( ; ; len--) {
 
@@ -316,7 +316,7 @@ register SV **sarg;
                    break;              /* so handle simple cases */
                }
                else if (f[1] == '-') {
-                   char *mp = index(f, '.');
+                   char *mp = strchr(f, '.');
                    I32 min = atoi(f+2);
 
                    if (mp) {
@@ -330,7 +330,7 @@ register SV **sarg;
                    break;
                }
                else if (isDIGIT(f[1])) {
-                   char *mp = index(f, '.');
+                   char *mp = strchr(f, '.');
                    I32 min = atoi(f+1);
 
                    if (mp) {
@@ -438,7 +438,7 @@ register SV *sv;
        return;
     }
     tmps = SvPVn(sv);
-    if (tmps && SvCUR(sv)) {
+    if (tmps && SvCUROK(sv)) {
        tmps += SvCUR(sv) - 1;
        sv_setpvn(astr,tmps,1); /* remember last char */
        *tmps = '\0';                           /* wipe it out */
@@ -466,10 +466,10 @@ SV *right;
     register char *lc = SvPVn(left);
     register char *rc = SvPVn(right);
     register I32 len;
+    I32 leftlen = SvCUROK(left);
+    I32 rightlen = SvCUROK(right);
 
-    len = SvCUR(left);
-    if (len > SvCUR(right))
-       len = SvCUR(right);
+    len = leftlen < rightlen ? leftlen : rightlen;
     if (SvTYPE(sv) < SVt_PV)
        sv_upgrade(sv, SVt_PV);
     if (SvCUR(sv) > len)
@@ -545,10 +545,10 @@ SV *right;
            *dc++ = *lc++ | *rc++;
       mop_up:
        len = SvCUR(sv);
-       if (SvCUR(right) > len)
-           sv_catpvn(sv,SvPV(right)+len,SvCUR(right) - len);
-       else if (SvCUR(left) > len)
-           sv_catpvn(sv,SvPV(left)+len,SvCUR(left) - len);
+       if (rightlen > len)
+           sv_catpvn(sv, SvPV(right) + len, rightlen - len);
+       else if (leftlen > len)
+           sv_catpvn(sv, SvPV(left) + len, leftlen - len);
        break;
     }
 }
diff --git a/dump.c b/dump.c
index ea2e134..a6b4b17 100644 (file)
--- a/dump.c
+++ b/dump.c
 static void dump();
 
 void
-dump_sequence(op)
-register OP *op;
+dump_all()
 {
-    extern I32 op_seq;
+    register I32 i;
+    register HE *entry;
 
-    for (; op; op = op->op_next) {
-       if (op->op_seq)
-           return;
-       op->op_seq = ++op_seq;
+    setlinebuf(stderr);
+    if (main_root)
+       dump_op(main_root);
+    for (i = 0; i <= 127; i++) {
+       for (entry = HvARRAY(defstash)[i]; entry; entry = entry->hent_next)
+           dump_sub((GV*)entry->hent_val);
     }
 }
 
 void
-dump_all()
+dump_sub(gv)
+GV* gv;
 {
-    register I32 i;
-    register GV *gv;
-    register HE *entry;
     SV *sv = sv_mortalcopy(&sv_undef);
-
-    setlinebuf(stderr);
-    dump_sequence(main_start);
-    dump_op(main_root);
-    for (i = 0; i <= 127; i++) {
-       for (entry = HvARRAY(defstash)[i]; entry; entry = entry->hent_next) {
-           gv = (GV*)entry->hent_val;
-           if (GvCV(gv)) {
-               gv_fullname(sv,gv);
-               dump("\nSUB %s = ", SvPV(sv));
-               if (CvUSERSUB(GvCV(gv)))
-                   dump("(usersub 0x%x %d)\n",
-                       (long)CvUSERSUB(GvCV(gv)),
-                       CvUSERINDEX(GvCV(gv)));
-               else {
-                   dump_sequence(CvSTART(GvCV(gv)));
-                   dump_op(CvROOT(GvCV(gv)));
-               }
-           }
-       }
+    if (GvCV(gv)) {
+       gv_fullname(sv,gv);
+       dump("\nSUB %s = ", SvPV(sv));
+       if (CvUSERSUB(GvCV(gv)))
+           dump("(usersub 0x%x %d)\n",
+               (long)CvUSERSUB(GvCV(gv)),
+               CvUSERINDEX(GvCV(gv)));
+       else if (CvROOT(GvCV(gv)))
+           dump_op(CvROOT(GvCV(gv)));
+       else
+           dump("<undef>\n");
     }
 }
 
@@ -78,7 +69,6 @@ dump_eval()
     register GV *gv;
     register HE *entry;
 
-    dump_sequence(eval_start);
     dump_op(eval_root);
 }
 
@@ -88,13 +78,18 @@ register OP *op;
 {
     SV *tmpsv;
 
-    if (!op->op_seq)
-       dump_sequence(op);
     dump("{\n");
-    fprintf(stderr, "%-4d", op->op_seq);
+    if (op->op_seq)
+       fprintf(stderr, "%-4d", op->op_seq);
+    else
+       fprintf(stderr, "    ");
     dump("TYPE = %s  ===> ", op_name[op->op_type]);
-    if (op->op_next)
-       fprintf(stderr, "%d\n", op->op_next->op_seq);
+    if (op->op_next) {
+       if (op->op_seq)
+           fprintf(stderr, "%d\n", op->op_next->op_seq);
+       else
+           fprintf(stderr, "(%d)\n", op->op_next->op_seq);
+    }
     else
        fprintf(stderr, "DONE\n");
     dumplvl++;
@@ -121,8 +116,8 @@ register OP *op;
            (void)strcat(buf,"STACKED,");
        if (op->op_flags & OPf_LVAL)
            (void)strcat(buf,"LVAL,");
-       if (op->op_flags & OPf_LOCAL)
-           (void)strcat(buf,"LOCAL,");
+       if (op->op_flags & OPf_INTRO)
+           (void)strcat(buf,"INTRO,");
        if (op->op_flags & OPf_SPECIAL)
            (void)strcat(buf,"SPECIAL,");
        if (*buf)
@@ -170,6 +165,7 @@ register OP *op;
     }
 
     switch (op->op_type) {
+    case OP_GVSV:
     case OP_GV:
        if (cGVOP->op_gv) {
            tmpsv = NEWSV(0,0);
@@ -183,7 +179,8 @@ register OP *op;
     case OP_CONST:
        dump("SV = %s\n", SvPEEK(cSVOP->op_sv));
        break;
-    case OP_CURCOP:
+    case OP_NEXTSTATE:
+    case OP_DBSTATE:
        if (cCOP->cop_line)
            dump("LINE = %d\n",cCOP->cop_line);
        if (cCOP->cop_label)
@@ -191,40 +188,30 @@ register OP *op;
        break;
     case OP_ENTERLOOP:
        dump("REDO ===> ");
-       if (cLOOP->op_redoop) {
-           dump_sequence(cLOOP->op_redoop);
+       if (cLOOP->op_redoop)
            fprintf(stderr, "%d\n", cLOOP->op_redoop->op_seq);
-       }
        else
            fprintf(stderr, "DONE\n");
        dump("NEXT ===> ");
-       if (cLOOP->op_nextop) {
-           dump_sequence(cLOOP->op_nextop);
+       if (cLOOP->op_nextop)
            fprintf(stderr, "%d\n", cLOOP->op_nextop->op_seq);
-       }
        else
            fprintf(stderr, "DONE\n");
        dump("LAST ===> ");
-       if (cLOOP->op_lastop) {
-           dump_sequence(cLOOP->op_lastop);
+       if (cLOOP->op_lastop)
            fprintf(stderr, "%d\n", cLOOP->op_lastop->op_seq);
-       }
        else
            fprintf(stderr, "DONE\n");
        break;
     case OP_COND_EXPR:
        dump("TRUE ===> ");
-       if (cCONDOP->op_true) {
-           dump_sequence(cCONDOP->op_true);
+       if (cCONDOP->op_true)
            fprintf(stderr, "%d\n", cCONDOP->op_true->op_seq);
-       }
        else
            fprintf(stderr, "DONE\n");
        dump("FALSE ===> ");
-       if (cCONDOP->op_false) {
-           dump_sequence(cCONDOP->op_false);
+       if (cCONDOP->op_false)
            fprintf(stderr, "%d\n", cCONDOP->op_false->op_seq);
-       }
        else
            fprintf(stderr, "DONE\n");
        break;
@@ -233,10 +220,8 @@ register OP *op;
     case OP_AND:
     case OP_METHOD:
        dump("OTHER ===> ");
-       if (cLOGOP->op_other) {
-           dump_sequence(cLOGOP->op_other);
+       if (cLOGOP->op_other)
            fprintf(stderr, "%d\n", cLOGOP->op_other->op_seq);
-       }
        else
            fprintf(stderr, "DONE\n");
        break;
diff --git a/eg/uudecode b/eg/uudecode
new file mode 100644 (file)
index 0000000..3b3cb60
--- /dev/null
@@ -0,0 +1,15 @@
+#!/usr/bin/perl
+while (<>) {
+    next unless ($mode,$file) = /^begin\s*(\d*)\s*(\S*)/;
+    open(OUT,"> $file") || die "Can't create $file: $!\n";
+    while (<>) {
+           last if /^end/;
+           next if /[a-z]/;
+           next unless int((((ord() - 32) & 077) + 2) / 3) ==
+                   int(length() / 4);
+           print OUT unpack("u", $_);
+    }
+    chmod oct($mode), $file;
+    eof() && die "Missing end: $file may be truncated.\n";
+}
+
diff --git a/embed.h b/embed.h
index 96d2eb7..bd1c7ba 100644 (file)
--- a/embed.h
+++ b/embed.h
@@ -49,7 +49,6 @@
 #define oldoldbufptr   PERLoldoldbufptr
 #define origalen       PERLorigalen
 #define origenviron    PERLorigenviron
-#define pad            PERLpad
 #define padix          PERLpadix
 #define patleave       PERLpatleave
 #define regbol         PERLregbol
 #define argvoutgv      (curinterp->Iargvoutgv)
 #define arybase                (curinterp->Iarybase)
 #define basetime       (curinterp->Ibasetime)
+#define beginav                (curinterp->Ibeginav)
 #define bodytarget     (curinterp->Ibodytarget)
 #define cddir          (curinterp->Icddir)
 #define chopset                (curinterp->Ichopset)
 #define dumplvl                (curinterp->Idumplvl)
 #define e_fp           (curinterp->Ie_fp)
 #define e_tmpname      (curinterp->Ie_tmpname)
+#define endav          (curinterp->Iendav)
 #define envgv          (curinterp->Ienvgv)
 #define eval_root      (curinterp->Ieval_root)
 #define eval_start     (curinterp->Ieval_start)
 #define formtarget     (curinterp->Iformtarget)
 #define freestrroot    (curinterp->Ifreestrroot)
 #define gensym         (curinterp->Igensym)
-#define hint           (curinterp->Ihint)
 #define in_eval                (curinterp->Iin_eval)
 #define incgv          (curinterp->Iincgv)
 #define inplace                (curinterp->Iinplace)
-#define last_elen      (curinterp->Ilast_elen)
-#define last_eval      (curinterp->Ilast_eval)
 #define last_in_gv     (curinterp->Ilast_in_gv)
-#define last_root      (curinterp->Ilast_root)
 #define lastfd         (curinterp->Ilastfd)
 #define lastretstr     (curinterp->Ilastretstr)
 #define lastscream     (curinterp->Ilastscream)
 #define origfilename   (curinterp->Iorigfilename)
 #define ors            (curinterp->Iors)
 #define orslen         (curinterp->Iorslen)
+#define pad            (curinterp->Ipad)
+#define padname                (curinterp->Ipadname)
 #define patchlevel     (curinterp->Ipatchlevel)
 #define perldb         (curinterp->Iperldb)
 #define pidstatus      (curinterp->Ipidstatus)
 #define Iargvoutgv     argvoutgv
 #define Iarybase       arybase
 #define Ibasetime      basetime
+#define Ibeginav       beginav
 #define Ibodytarget    bodytarget
 #define Icddir         cddir
 #define Ichopset       chopset
 #define Idumplvl       dumplvl
 #define Ie_fp          e_fp
 #define Ie_tmpname     e_tmpname
+#define Iendav         endav
 #define Ienvgv         envgv
 #define Ieval_root     eval_root
 #define Ieval_start    eval_start
 #define Iformtarget    formtarget
 #define Ifreestrroot   freestrroot
 #define Igensym                gensym
-#define Ihint          hint
 #define Iin_eval       in_eval
 #define Iincgv         incgv
 #define Iinplace       inplace
-#define Ilast_elen     last_elen
-#define Ilast_eval     last_eval
 #define Ilast_in_gv    last_in_gv
-#define Ilast_root     last_root
 #define Ilastfd                lastfd
 #define Ilastretstr    lastretstr
 #define Ilastscream    lastscream
 #define Iorigfilename  origfilename
 #define Iors           ors
 #define Iorslen                orslen
+#define Ipad           pad
+#define Ipadname       padname
 #define Ipatchlevel    patchlevel
 #define Iperldb                perldb
 #define Ipidstatus     pidstatus
diff --git a/foo b/foo
new file mode 100755 (executable)
index 0000000..b7de1fc
--- /dev/null
+++ b/foo
@@ -0,0 +1,4 @@
+#!./perl
+
+BEGIN { $/ = "" }
+print while <>;
index 5593ace..74dcac2 100644 (file)
@@ -43,7 +43,6 @@ oldbufptr
 oldoldbufptr
 origalen
 origenviron
-pad
 padix
 patleave
 regbol
diff --git a/gv.c b/gv.c
index 9e1f533..0d22007 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -43,6 +43,8 @@
 #include "EXTERN.h"
 #include "perl.h"
 
+extern char* rcsid;
+
 GV *
 gv_AVadd(gv)
 register GV *gv;
@@ -72,7 +74,7 @@ char *name;
     gv = gv_fetchpv(tmpbuf, TRUE);
     sv_setpv(GvSV(gv), name);
     if (perldb)
-       (void)gv_HVadd(gv_AVadd(gv));
+       hv_magic(GvHVn(gv_AVadd(gv)), gv, 'L');
     return gv;
 }
 
@@ -188,6 +190,8 @@ I32 add;
        name = sawquote+1;
        *sawquote = '\'';
     }
+    if (!stash)
+       fatal("Global symbol \"%s\" requires explicit package name", name);
     len = namend - name;
     gvp = (GV**)hv_fetch(stash,name,len,add);
     if (!gvp || *gvp == (GV*)&sv_undef)
@@ -197,26 +201,112 @@ I32 add;
        SvMULTI_on(gv);
        return gv;
     }
-    else {
-       sv_upgrade(gv, SVt_PVGV);
-       if (SvLEN(gv))
-           Safefree(SvPV(gv));
-       Newz(602,gp, 1, GP);
-       GvGP(gv) = gp;
-       GvREFCNT(gv) = 1;
-       GvSV(gv) = NEWSV(72,0);
-       GvLINE(gv) = curcop->cop_line;
-       GvEGV(gv) = gv;
-       sv_magic((SV*)gv, (SV*)gv, '*', name, len);
-       GvSTASH(gv) = stash;
-       GvNAME(gv) = nsavestr(name, len);
-       GvNAMELEN(gv) = len;
-       if (isDIGIT(*name) && *name != '0')
-           sv_magic(GvSV(gv), (SV*)gv, 0, name, len);
-       if (add & 2)
-           SvMULTI_on(gv);
-       return gv;
+
+    /* Adding a new symbol */
+
+    sv_upgrade(gv, SVt_PVGV);
+    if (SvLEN(gv))
+       Safefree(SvPV(gv));
+    Newz(602,gp, 1, GP);
+    GvGP(gv) = gp;
+    GvREFCNT(gv) = 1;
+    GvSV(gv) = NEWSV(72,0);
+    GvLINE(gv) = curcop->cop_line;
+    GvEGV(gv) = gv;
+    sv_magic((SV*)gv, (SV*)gv, '*', name, len);
+    GvSTASH(gv) = stash;
+    GvNAME(gv) = nsavestr(name, len);
+    GvNAMELEN(gv) = len;
+    if (isDIGIT(*name) && *name != '0')
+       sv_magic(GvSV(gv), (SV*)gv, 0, name, len);
+    if (add & 2)
+       SvMULTI_on(gv);
+
+    /* set up magic where warranted */
+    switch (*name) {
+    case 'S':
+       if (strEQ(name, "SIG")) {
+           HV *hv;
+           siggv = gv;
+           SvMULTI_on(siggv);
+           hv = GvHVn(siggv);
+           hv_magic(hv, siggv, 'S');
+
+           /* initialize signal stack */
+           signalstack = newAV();
+           av_store(signalstack, 32, Nullsv);
+           av_clear(signalstack);
+           AvREAL_off(signalstack);
+       }
+       break;
+
+    case '&':
+       ampergv = gv;
+       sawampersand = TRUE;
+       goto magicalize;
+
+    case '`':
+       leftgv = gv;
+       sawampersand = TRUE;
+       goto magicalize;
+
+    case '\'':
+       rightgv = gv;
+       sawampersand = TRUE;
+       goto magicalize;
+
+    case ':':
+       sv_setpv(GvSV(gv),chopset);
+       goto magicalize;
+
+    case '!':
+    case '#':
+    case '?':
+    case '^':
+    case '~':
+    case '=':
+    case '-':
+    case '%':
+    case '.':
+    case '+':
+    case '*':
+    case '(':
+    case ')':
+    case '<':
+    case '>':
+    case ',':
+    case '\\':
+    case '/':
+    case '[':
+    case '|':
+    case '\004':
+    case '\t':
+    case '\020':
+    case '\024':
+    case '\027':
+    case '\006':
+      magicalize:
+       sv_magic(GvSV(gv), (SV*)gv, 0, name, 1);
+       break;
+
+    case '\014':
+       sv_setpv(GvSV(gv),"\f");
+       formfeed = GvSV(gv);
+       break;
+    case ';':
+       sv_setpv(GvSV(gv),"\034");
+       break;
+    case ']': {
+           SV *sv;
+           sv = GvSV(gv);
+           sv_upgrade(sv, SVt_PVNV);
+           sv_setpv(sv,rcsid);
+           SvNV(sv) = atof(patchlevel);
+           SvNOK_on(sv);
+       }
+       break;
     }
+    return gv;
 }
 
 void
diff --git a/hv.c b/hv.c
index e62432d..669d154 100644 (file)
--- a/hv.c
+++ b/hv.c
@@ -119,7 +119,7 @@ HV *hv;
 char *key;
 U32 klen;
 SV *val;
-register I32 hash;
+register U32 hash;
 {
     register XPVHV* xhv;
     register char *s;
diff --git a/hv.h b/hv.h
index eb3c050..cdb4863 100644 (file)
--- a/hv.h
+++ b/hv.h
@@ -31,7 +31,7 @@ struct he {
     HE         *hent_next;
     char       *hent_key;
     SV         *hent_val;
-    I32                hent_hash;
+    U32                hent_hash;
     I32                hent_klen;
 };
 
index c819902..299e646 100644 (file)
@@ -12,6 +12,7 @@ argvgv
 argvoutgv
 arybase
 basetime
+beginav
 bodytarget
 cddir
 chopset
@@ -46,6 +47,7 @@ dowarn
 dumplvl
 e_fp
 e_tmpname
+endav
 envgv
 eval_root
 eval_start
@@ -57,14 +59,10 @@ formfeed
 formtarget
 freestrroot
 gensym
-hint
 in_eval
 incgv
 inplace
-last_elen
-last_eval
 last_in_gv
-last_root
 lastfd
 lastretstr
 lastscream
@@ -104,6 +102,8 @@ origargv
 origfilename
 ors
 orslen
+pad
+padname
 patchlevel
 perldb
 pidstatus
index fed561b..c659dc6 100644 (file)
 #define KEY_GT                 55
 #define KEY_ge                 56
 #define KEY_GE                 57
-#define KEY_grep               58
-#define KEY_goto               59
-#define KEY_gmtime             60
-#define KEY_getc               61
-#define KEY_getppid            62
-#define KEY_getpgrp            63
-#define KEY_getpriority                64
-#define KEY_getprotobyname     65
-#define KEY_getprotobynumber   66
-#define KEY_getprotoent                67
-#define KEY_getpwent           68
-#define KEY_getpwnam           69
-#define KEY_getpwuid           70
-#define KEY_getpeername                71
-#define KEY_gethostbyname      72
-#define KEY_gethostbyaddr      73
-#define KEY_gethostent         74
-#define KEY_getnetbyname       75
-#define KEY_getnetbyaddr       76
-#define KEY_getnetent          77
-#define KEY_getservbyname      78
-#define KEY_getservbyport      79
-#define KEY_getservent         80
-#define KEY_getsockname                81
-#define KEY_getsockopt         82
-#define KEY_getgrent           83
-#define KEY_getgrnam           84
-#define KEY_getgrgid           85
-#define KEY_getlogin           86
-#define KEY_hex                        87
-#define KEY_if                 88
-#define KEY_index              89
-#define KEY_int                        90
-#define KEY_ioctl              91
-#define KEY_join               92
-#define KEY_keys               93
-#define KEY_kill               94
-#define KEY_last               95
-#define KEY_lc                 96
-#define KEY_lcfirst            97
-#define KEY_local              98
-#define KEY_length             99
-#define KEY_lt                 100
-#define KEY_LT                 101
-#define KEY_le                 102
-#define KEY_LE                 103
-#define KEY_localtime          104
-#define KEY_log                        105
-#define KEY_link               106
-#define KEY_listen             107
-#define KEY_lstat              108
-#define KEY_m                  109
-#define KEY_mkdir              110
-#define KEY_msgctl             111
-#define KEY_msgget             112
-#define KEY_msgrcv             113
-#define KEY_msgsnd             114
-#define KEY_next               115
-#define KEY_ne                 116
-#define KEY_NE                 117
-#define KEY_open               118
-#define KEY_ord                        119
-#define KEY_oct                        120
-#define KEY_opendir            121
-#define KEY_print              122
-#define KEY_printf             123
-#define KEY_push               124
-#define KEY_pop                        125
-#define KEY_pack               126
-#define KEY_package            127
-#define KEY_pipe               128
-#define KEY_q                  129
-#define KEY_qq                 130
-#define KEY_qx                 131
-#define KEY_return             132
-#define KEY_require            133
-#define KEY_reset              134
-#define KEY_redo               135
-#define KEY_rename             136
-#define KEY_rand               137
-#define KEY_rmdir              138
-#define KEY_rindex             139
-#define KEY_ref                        140
-#define KEY_read               141
-#define KEY_readdir            142
-#define KEY_rewinddir          143
-#define KEY_recv               144
-#define KEY_reverse            145
-#define KEY_readlink           146
-#define KEY_s                  147
-#define KEY_scalar             148
-#define KEY_select             149
-#define KEY_seek               150
-#define KEY_semctl             151
-#define KEY_semget             152
-#define KEY_semop              153
-#define KEY_send               154
-#define KEY_setpgrp            155
-#define KEY_setpriority                156
-#define KEY_sethostent         157
-#define KEY_setnetent          158
-#define KEY_setservent         159
-#define KEY_setprotoent                160
-#define KEY_setpwent           161
-#define KEY_setgrent           162
-#define KEY_seekdir            163
-#define KEY_setsockopt         164
-#define KEY_shift              165
-#define KEY_shmctl             166
-#define KEY_shmget             167
-#define KEY_shmread            168
-#define KEY_shmwrite           169
-#define KEY_shutdown           170
-#define KEY_sin                        171
-#define KEY_sleep              172
-#define KEY_socket             173
-#define KEY_socketpair         174
-#define KEY_sort               175
-#define KEY_split              176
-#define KEY_sprintf            177
-#define KEY_splice             178
-#define KEY_sqrt               179
-#define KEY_srand              180
-#define KEY_stat               181
-#define KEY_study              182
-#define KEY_substr             183
-#define KEY_sub                        184
-#define KEY_system             185
-#define KEY_symlink            186
-#define KEY_syscall            187
-#define KEY_sysread            188
-#define KEY_syswrite           189
-#define KEY_tr                 190
-#define KEY_tell               191
-#define KEY_telldir            192
-#define KEY_time               193
-#define KEY_times              194
-#define KEY_truncate           195
-#define KEY_uc                 196
-#define KEY_ucfirst            197
-#define KEY_until              198
-#define KEY_unless             199
-#define KEY_unlink             200
-#define KEY_undef              201
-#define KEY_unpack             202
-#define KEY_utime              203
-#define KEY_umask              204
-#define KEY_unshift            205
-#define KEY_values             206
-#define KEY_vec                        207
-#define KEY_while              208
-#define KEY_warn               209
-#define KEY_wait               210
-#define KEY_waitpid            211
-#define KEY_wantarray          212
-#define KEY_write              213
-#define KEY_x                  214
-#define KEY_y                  215
-#define KEY_BEGIN              216
-#define KEY_END                        217
+#define KEY_glob               58
+#define KEY_grep               59
+#define KEY_goto               60
+#define KEY_gmtime             61
+#define KEY_getc               62
+#define KEY_getppid            63
+#define KEY_getpgrp            64
+#define KEY_getpriority                65
+#define KEY_getprotobyname     66
+#define KEY_getprotobynumber   67
+#define KEY_getprotoent                68
+#define KEY_getpwent           69
+#define KEY_getpwnam           70
+#define KEY_getpwuid           71
+#define KEY_getpeername                72
+#define KEY_gethostbyname      73
+#define KEY_gethostbyaddr      74
+#define KEY_gethostent         75
+#define KEY_getnetbyname       76
+#define KEY_getnetbyaddr       77
+#define KEY_getnetent          78
+#define KEY_getservbyname      79
+#define KEY_getservbyport      80
+#define KEY_getservent         81
+#define KEY_getsockname                82
+#define KEY_getsockopt         83
+#define KEY_getgrent           84
+#define KEY_getgrnam           85
+#define KEY_getgrgid           86
+#define KEY_getlogin           87
+#define KEY_hex                        88
+#define KEY_if                 89
+#define KEY_index              90
+#define KEY_int                        91
+#define KEY_ioctl              92
+#define KEY_join               93
+#define KEY_keys               94
+#define KEY_kill               95
+#define KEY_last               96
+#define KEY_lc                 97
+#define KEY_lcfirst            98
+#define KEY_local              99
+#define KEY_length             100
+#define KEY_lt                 101
+#define KEY_LT                 102
+#define KEY_le                 103
+#define KEY_LE                 104
+#define KEY_localtime          105
+#define KEY_log                        106
+#define KEY_link               107
+#define KEY_listen             108
+#define KEY_lstat              109
+#define KEY_m                  110
+#define KEY_mkdir              111
+#define KEY_msgctl             112
+#define KEY_msgget             113
+#define KEY_msgrcv             114
+#define KEY_msgsnd             115
+#define KEY_my                 116
+#define KEY_next               117
+#define KEY_ne                 118
+#define KEY_NE                 119
+#define KEY_open               120
+#define KEY_ord                        121
+#define KEY_oct                        122
+#define KEY_opendir            123
+#define KEY_print              124
+#define KEY_printf             125
+#define KEY_push               126
+#define KEY_pop                        127
+#define KEY_pack               128
+#define KEY_package            129
+#define KEY_pipe               130
+#define KEY_q                  131
+#define KEY_qq                 132
+#define KEY_qx                 133
+#define KEY_return             134
+#define KEY_require            135
+#define KEY_reset              136
+#define KEY_redo               137
+#define KEY_rename             138
+#define KEY_rand               139
+#define KEY_rmdir              140
+#define KEY_rindex             141
+#define KEY_ref                        142
+#define KEY_read               143
+#define KEY_readdir            144
+#define KEY_rewinddir          145
+#define KEY_recv               146
+#define KEY_reverse            147
+#define KEY_readline           148
+#define KEY_readlink           149
+#define KEY_readpipe           150
+#define KEY_s                  151
+#define KEY_scalar             152
+#define KEY_select             153
+#define KEY_seek               154
+#define KEY_semctl             155
+#define KEY_semget             156
+#define KEY_semop              157
+#define KEY_send               158
+#define KEY_setpgrp            159
+#define KEY_setpriority                160
+#define KEY_sethostent         161
+#define KEY_setnetent          162
+#define KEY_setservent         163
+#define KEY_setprotoent                164
+#define KEY_setpwent           165
+#define KEY_setgrent           166
+#define KEY_seekdir            167
+#define KEY_setsockopt         168
+#define KEY_shift              169
+#define KEY_shmctl             170
+#define KEY_shmget             171
+#define KEY_shmread            172
+#define KEY_shmwrite           173
+#define KEY_shutdown           174
+#define KEY_sin                        175
+#define KEY_sleep              176
+#define KEY_socket             177
+#define KEY_socketpair         178
+#define KEY_sort               179
+#define KEY_split              180
+#define KEY_sprintf            181
+#define KEY_splice             182
+#define KEY_sqrt               183
+#define KEY_srand              184
+#define KEY_stat               185
+#define KEY_study              186
+#define KEY_substr             187
+#define KEY_sub                        188
+#define KEY_system             189
+#define KEY_symlink            190
+#define KEY_syscall            191
+#define KEY_sysread            192
+#define KEY_syswrite           193
+#define KEY_tr                 194
+#define KEY_tell               195
+#define KEY_telldir            196
+#define KEY_time               197
+#define KEY_times              198
+#define KEY_truncate           199
+#define KEY_uc                 200
+#define KEY_ucfirst            201
+#define KEY_until              202
+#define KEY_unless             203
+#define KEY_unlink             204
+#define KEY_undef              205
+#define KEY_unpack             206
+#define KEY_utime              207
+#define KEY_umask              208
+#define KEY_unshift            209
+#define KEY_values             210
+#define KEY_vec                        211
+#define KEY_while              212
+#define KEY_warn               213
+#define KEY_wait               214
+#define KEY_waitpid            215
+#define KEY_wantarray          216
+#define KEY_write              217
+#define KEY_x                  218
+#define KEY_y                  219
+#define KEY_BEGIN              220
+#define KEY_END                        221
index 2d5ee65..14e122a 100644 (file)
@@ -44,7 +44,7 @@ sub ctime {
     }
     $TZ .= ' ' unless $TZ eq '';
 
-    $year += ($year < 70) ? 2000 : 1900;
+    $year += 1900;
     sprintf("%s %s %2d %2d:%02d:%02d %s%4d\n",
       $DoW[$wday], $MoY[$mon], $mday, $hour, $min, $sec, $TZ, $year);
 }
diff --git a/lib/open3.pl b/lib/open3.pl
new file mode 100644 (file)
index 0000000..f3d8138
--- /dev/null
@@ -0,0 +1,105 @@
+# &open3: Marc Horowitz <marc@mit.edu>
+# derived mostly from &open2 by tom christiansen, <tchrist@convex.com>
+#
+# usage: $pid = open3('wtr', 'rdr', 'err' 'some cmd and args', 'optarg', ...);
+#
+# spawn the given $cmd and connect rdr for
+# reading, wtr for writing, and err for errors.
+# if err is '', or the same as rdr, then stdout and
+# stderr of the child are on the same fh.  returns pid
+# of child, or 0 on failure.
+
+
+# if wtr begins with '>&', then wtr will be closed in the parent, and
+# the child will read from it directly.  if rdr or err begins with
+# '>&', then the child will send output directly to that fd.  In both
+# cases, there will be a dup() instead of a pipe() made.
+
+
+# WARNING: this is dangerous, as you may block forever
+# unless you are very careful.
+#
+# $wtr is left unbuffered.
+#
+# abort program if
+#   rdr or wtr are null
+#   pipe or fork or exec fails
+
+package open3;
+
+$fh = 'FHOPEN000';  # package static in case called more than once
+
+sub main'open3 {
+    local($kidpid);
+    local($dad_wtr, $dad_rdr, $dad_err, @cmd) = @_;
+    local($dup_wtr, $dup_rdr, $dup_err);
+
+    $dad_wtr                   || die "open3: wtr should not be null";
+    $dad_rdr                   || die "open3: rdr should not be null";
+    $dad_err = $dad_rdr if ($dad_err eq '');
+
+    $dup_wtr = ($dad_wtr =~ s/^\>\&//);
+    $dup_rdr = ($dad_rdr =~ s/^\>\&//);
+    $dup_err = ($dad_err =~ s/^\>\&//);
+
+    # force unqualified filehandles into callers' package
+    local($package) = caller;
+    $dad_wtr =~ s/^[^']+$/$package'$&/;
+    $dad_rdr =~ s/^[^']+$/$package'$&/;
+    $dad_err =~ s/^[^']+$/$package'$&/;
+
+    local($kid_rdr) = ++$fh;
+    local($kid_wtr) = ++$fh;
+    local($kid_err) = ++$fh;
+
+    if (!$dup_wtr) {
+       pipe($kid_rdr, $dad_wtr)    || die "open3: pipe 1 (stdin) failed: $!";
+    }
+    if (!$dup_rdr) {
+       pipe($dad_rdr, $kid_wtr)    || die "open3: pipe 2 (stdout) failed: $!";
+    }
+    if ($dad_err ne $dad_rdr && !$dup_err) {
+       pipe($dad_err, $kid_err)    || die "open3: pipe 3 (stderr) failed: $!";
+    }
+
+    if (($kidpid = fork) < 0) {
+        die "open2: fork failed: $!";
+    } elsif ($kidpid == 0) {
+       if ($dup_wtr) {
+           open(STDIN,  ">&$dad_wtr") if (fileno(STDIN) != fileno($dad_wtr));
+       } else {
+           close($dad_wtr);
+           open(STDIN,  ">&$kid_rdr");
+       }
+       if ($dup_rdr) {
+           open(STDOUT, ">&$dad_rdr") if (fileno(STDOUT) != fileno($dad_rdr));
+       } else {
+           close($dad_rdr);
+           open(STDOUT, ">&$kid_wtr");
+       }
+       if ($dad_rdr ne $dad_err) {
+           if ($dup_err) {
+               open(STDERR, ">&$dad_err")
+                   if (fileno(STDERR) != fileno($dad_err));
+           } else {
+               close($dad_err);
+               open(STDERR, ">&$kid_err");
+           }
+       } else {
+           open(STDERR, ">&STDOUT") if (fileno(STDERR) != fileno(STDOUT));
+       }
+       exec @cmd;
+
+       local($")=(" ");
+        die "open2: exec of @cmd failed";
+    }
+
+    close $kid_rdr; close $kid_wtr; close $kid_err;
+    if ($dup_wtr) {
+       close($dad_wtr);
+    }
+
+    select((select($dad_wtr), $| = 1)[0]); # unbuffer pipe
+    $kidpid;
+}
+1; # so require is happy
diff --git a/main.c b/main.c
index a6853a7..2a8f434 100644 (file)
--- a/main.c
+++ b/main.c
@@ -7,7 +7,7 @@ char **argv;
 char **env;
 {
     int exitstatus;
-    Interpreter *my_perl;
+    PerlInterpreter *my_perl;
 
     my_perl = perl_alloc();
     if (!my_perl)
index fd0adb0..ef34bed 100644 (file)
--- a/make.out
+++ b/make.out
@@ -1,6 +1,6 @@
 make: Warning: Both `makefile' and `Makefile' exists
-`sh  cflags perl.o` perl.c
-         CCCMD =  cc -c  -I/usr/include/sun -I/usr/ucbinclude -DDEBUGGING -g  
+`sh  cflags op.o` op.c
+         CCCMD =  cc -c -DDEBUGGING -g  
 cc -Bstatic   main.o perly.o perl.o av.o scope.o op.o doop.o doio.o dolist.o dump.o malloc.o mg.o pp.o regcomp.o regexec.o gv.o sv.o toke.o util.o deb.o run.o hv.o usersub.o -ldbm -lm -lposix -o perl
 echo "\a"
 \a
index 57e057b..85a584a 100644 (file)
--- a/makefile
+++ b/makefile
 # 
 # 
 
+# I now supply perly.c with the kits, so don't remake perly.c without byacc
+YACC = ../perl-byacc1.8.2/byacc
+
 CC = cc
-YACC = /bin/yacc
 bin = /usr/local/bin
 scriptdir = /usr/local/bin
 privlib = /usr/local/lib/perl
@@ -302,11 +304,11 @@ perly.h: perly.c
 embed.h: embed_h.SH global.var interp.var
        sh embed_h.SH
 
-perly.c: perly.y perly.fixer
+perly.c:
        @ \
 case "$(YACC)" in \
-    *bison*) echo 'Expect' 25 shift/reduce and 53 reduce/reduce conflicts;; \
-    *) echo 'Expect' 27 shift/reduce and 51 reduce/reduce conflicts;; \
+    *bison*) echo 'Expect' 19 shift/reduce and 58 reduce/reduce conflicts;; \
+    *) echo 'Expect' 21 shift/reduce and 56 reduce/reduce conflicts;; \
 esac
        $(YACC) -d perly.y
        sh $(shellflags) ./perly.fixer y.tab.c perly.c
@@ -1504,6 +1506,25 @@ usersub.o: sv.h
 usersub.o: unixish.h
 usersub.o: usersub.c
 usersub.o: util.h
+mg.o: EXTERN.h
+mg.o: av.h
+mg.o: config.h
+mg.o: cop.h
+mg.o: embed.h
+mg.o: form.h
+mg.o: gv.h
+mg.o: handy.h
+mg.o: mg.c
+mg.o: hv.h
+mg.o: op.h
+mg.o: opcode.h
+mg.o: perl.h
+mg.o: pp.h
+mg.o: proto.h
+mg.o: regexp.h
+mg.o: sv.h
+mg.o: unixish.h
+mg.o: util.h
 Makefile: Makefile.SH config.sh ; /bin/sh Makefile.SH
 makedepend: makedepend.SH config.sh ; /bin/sh makedepend.SH
 h2ph: h2ph.SH config.sh ; /bin/sh h2ph.SH
diff --git a/mg.c b/mg.c
index 00af4c4..a0c12e6 100644 (file)
--- a/mg.c
+++ b/mg.c
@@ -47,6 +47,7 @@ SV* sv;
        if (vtbl && vtbl->svt_len)
            return (*vtbl->svt_len)(sv, mg);
     }
+    mg_get(sv);
     if (!SvPOK(sv) && SvNIOK(sv))
        sv_2pv(sv);
     if (SvPOK(sv))
@@ -67,6 +68,20 @@ SV* sv;
     return 0;
 }
 
+MAGIC*
+mg_find(sv, type)
+SV* sv;
+char type;
+{
+    MAGIC* mg;
+    MAGIC** mgp = &SvMAGIC(sv);
+    for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
+       if (mg->mg_type == type)
+           return mg;
+    }
+    return 0;
+}
+
 int
 mg_free(sv, type)
 SV* sv;
@@ -80,7 +95,7 @@ char type;
            *mgp = mg->mg_moremagic;
            if (vtbl && vtbl->svt_free)
                (*vtbl->svt_free)(sv, mg);
-           if (mg->mg_ptr)
+           if (mg->mg_ptr && mg->mg_type != 'g')
                Safefree(mg->mg_ptr);
            Safefree(mg);
        }
@@ -101,7 +116,7 @@ SV* sv;
        moremagic = mg->mg_moremagic;
        if (vtbl && vtbl->svt_free)
            (*vtbl->svt_free)(sv, mg);
-       if (mg->mg_ptr)
+       if (mg->mg_ptr && mg->mg_type != 'g')
            Safefree(mg->mg_ptr);
        Safefree(mg);
     }
@@ -121,6 +136,77 @@ SV* sv;
 
 static handlertype sighandler();
 
+U32
+magic_len(sv, mg)
+SV *sv;
+MAGIC *mg;
+{
+    register I32 paren;
+    register char *s;
+    register I32 i;
+
+    switch (*mg->mg_ptr) {
+    case '1': case '2': case '3': case '4':
+    case '5': case '6': case '7': case '8': case '9': case '&':
+       if (curpm) {
+           paren = atoi(mg->mg_ptr);
+         getparen:
+           if (curpm->op_pmregexp &&
+             paren <= curpm->op_pmregexp->nparens &&
+             (s = curpm->op_pmregexp->startp[paren]) ) {
+               i = curpm->op_pmregexp->endp[paren] - s;
+               if (i >= 0)
+                   return i;
+               else
+                   return 0;
+           }
+           else
+               return 0;
+       }
+       break;
+    case '+':
+       if (curpm) {
+           paren = curpm->op_pmregexp->lastparen;
+           goto getparen;
+       }
+       break;
+    case '`':
+       if (curpm) {
+           if (curpm->op_pmregexp &&
+             (s = curpm->op_pmregexp->subbeg) ) {
+               i = curpm->op_pmregexp->startp[0] - s;
+               if (i >= 0)
+                   return i;
+               else
+                   return 0;
+           }
+           else
+               return 0;
+       }
+       break;
+    case '\'':
+       if (curpm) {
+           if (curpm->op_pmregexp &&
+             (s = curpm->op_pmregexp->endp[0]) ) {
+               return (STRLEN) (curpm->op_pmregexp->subend - s);
+           }
+           else
+               return 0;
+       }
+       break;
+    case ',':
+       return (STRLEN)ofslen;
+    case '\\':
+       return (STRLEN)orslen;
+    }
+    magic_get(sv,mg);
+    if (!SvPOK(sv) && SvNIOK(sv))
+       sv_2pv(sv);
+    if (SvPOK(sv))
+       return SvCUR(sv);
+    return 0;
+}
+
 int
 magic_get(sv, mg)
 SV *sv;
@@ -360,7 +446,7 @@ MAGIC* mg;
        (void)signal(i,SIG_DFL);
     else {
        (void)signal(i,sighandler);
-       if (!index(s,'\'')) {
+       if (!strchr(s,'\'')) {
            sprintf(tokenbuf, "main'%s",s);
            sv_setpv(sv,tokenbuf);
        }
@@ -391,12 +477,8 @@ MAGIC* mg;
     gv = DBline;
     i = SvTRUE(sv);
     svp = av_fetch(GvAV(gv),atoi(mg->mg_ptr), FALSE);
-    if (svp && SvMAGICAL(*svp) && (o = (OP*)SvMAGIC(*svp)->mg_ptr)) {
-#ifdef NOTDEF
-       cmd->cop_flags &= ~COPf_OPTIMIZE;
-       cmd->cop_flags |= i? COPo_D1 : COPo_D0;
-#endif
-    }
+    if (svp && SvIOK(*svp) && (o = (OP*)SvSTASH(*svp)))
+       o->op_private = i;
     else
        warn("Can't break at that line\n");
     return 0;
@@ -478,6 +560,16 @@ MAGIC* mg;
     return 0;
 }
 
+int
+magic_setmglob(sv,mg)
+SV* sv;
+MAGIC* mg;
+{
+    mg->mg_ptr = 0;
+    mg->mg_len = 0;
+    return 0;
+}
+
 int
 magic_setbm(sv,mg)
 SV* sv;
@@ -578,17 +670,17 @@ MAGIC* mg;
        break;
     case '/':
        if (SvPOK(sv)) {
-           rs = SvPV(sv);
-           rslen = SvCUR(sv);
+           nrs = rs = SvPV(sv);
+           nrslen = rslen = SvCUR(sv);
            if (rspara = !rslen) {
-               rs = "\n\n";
-               rslen = 2;
+               nrs = rs = "\n\n";
+               nrslen = rslen = 2;
            }
-           rschar = rs[rslen - 1];
+           nrschar = rschar = rs[rslen - 1];
        }
        else {
-           rschar = 0777;      /* fake a non-existent char */
-           rslen = 1;
+           nrschar = rschar = 0777;    /* fake a non-existent char */
+           nrslen = rslen = 1;
        }
        break;
     case '\\':
@@ -827,65 +919,3 @@ I32 sig;
 
     return;
 }
-
-#ifdef OLD
-    if (sv->sv_magic && !sv->sv_rare) {
-       GV *gv = sv->sv_magic->sv_u.sv_gv;
-
-       switch (*SvPV(gv->sv_magic)) {
-       case '1': case '2': case '3': case '4':
-       case '5': case '6': case '7': case '8': case '9': case '&':
-           if (curpm) {
-               paren = atoi(GvENAME(gv));
-             getparen:
-               if (curpm->op_pmregexp &&
-                 paren <= curpm->op_pmregexp->nparens &&
-                 (s = curpm->op_pmregexp->startp[paren]) ) {
-                   i = curpm->op_pmregexp->endp[paren] - s;
-                   if (i >= 0)
-                       return i;
-                   else
-                       return 0;
-               }
-               else
-                   return 0;
-           }
-           break;
-       case '+':
-           if (curpm) {
-               paren = curpm->op_pmregexp->lastparen;
-               goto getparen;
-           }
-           break;
-       case '`':
-           if (curpm) {
-               if (curpm->op_pmregexp &&
-                 (s = curpm->op_pmregexp->subbeg) ) {
-                   i = curpm->op_pmregexp->startp[0] - s;
-                   if (i >= 0)
-                       return i;
-                   else
-                       return 0;
-               }
-               else
-                   return 0;
-           }
-           break;
-       case '\'':
-           if (curpm) {
-               if (curpm->op_pmregexp &&
-                 (s = curpm->op_pmregexp->endp[0]) ) {
-                   return (STRLEN) (curpm->op_pmregexp->subend - s);
-               }
-               else
-                   return 0;
-           }
-           break;
-       case ',':
-           return (STRLEN)ofslen;
-       case '\\':
-           return (STRLEN)orslen;
-       }
-       sv = gv_str(sv);
-    }
-#endif
diff --git a/op.c b/op.c
index 600d3dd..9c522b1 100644 (file)
--- a/op.c
+++ b/op.c
@@ -32,8 +32,6 @@ extern int yychar;
 #define OA_SCALARREF 7
 #define OA_OPTIONAL 8
 
-I32 op_seq;
-
 void
 cpy7bit(d,s,l)
 register char *d;
@@ -123,6 +121,112 @@ OP *op;
 
 /* "register" allocation */
 
+PADOFFSET
+pad_allocmy(name)
+char *name;
+{
+    PADOFFSET off = pad_alloc(OP_PADSV, 'M');
+    SV *sv = NEWSV(0,0);
+    sv_upgrade(sv, SVt_PVNV);
+    sv_setpv(sv, name);
+    av_store(comppadname, off, sv);
+    SvNV(sv) = (double)cop_seq;
+    SvIV(sv) = 99999999;
+    if (*name == '@')
+       av_store(comppad, off, newAV());
+    else if (*name == '%')
+       av_store(comppad, off, newHV(COEFFSIZE));
+    return off;
+}
+
+PADOFFSET
+pad_findmy(name)
+char *name;
+{
+    I32 off;
+    SV *sv;
+    SV **svp = AvARRAY(comppadname);
+    register I32 i;
+    register CONTEXT *cx;
+    bool saweval;
+    AV *curlist;
+    AV *curname;
+    CV *cv;
+    I32 seq = cop_seq;
+
+    for (off = comppadnamefill; off > 0; off--) {
+       if ((sv = svp[off]) &&
+           seq <= SvIV(sv) &&
+           seq > (I32)SvNV(sv) &&
+           strEQ(SvPV(sv), name))
+       {
+           return (PADOFFSET)off;
+       }
+    }
+
+    /* Nothing in current lexical context--try eval's context, if any.
+     * This is necessary to let the perldb get at lexically scoped variables.
+     * XXX This will also probably interact badly with eval tree caching.
+     */
+
+    saweval = FALSE;
+    for (i = cxstack_ix; i >= 0; i--) {
+       cx = &cxstack[i];
+       switch (cx->cx_type) {
+       default:
+           break;
+       case CXt_EVAL:
+           saweval = TRUE;
+           break;
+       case CXt_SUB:
+           if (!saweval)
+               return 0;
+           cv = cx->blk_sub.cv;
+           if (debstash && CvSTASH(cv) == debstash)    /* ignore DB'* scope */
+               continue;
+           seq = cxstack[i+1].blk_oldcop->cop_seq;
+           curlist = CvPADLIST(cv);
+           curname = (AV*)*av_fetch(curlist, 0, FALSE);
+           svp = AvARRAY(curname);
+           for (off = AvFILL(curname); off > 0; off--) {
+               if ((sv = svp[off]) &&
+                   seq <= SvIV(sv) &&
+                   seq > (I32)SvNV(sv) &&
+                   strEQ(SvPV(sv), name))
+               {
+                   PADOFFSET newoff = pad_alloc(OP_PADSV, 'M');
+                   AV *oldpad = (AV*)*av_fetch(curlist, CvDEPTH(cv), FALSE);
+                   SV *oldsv = *av_fetch(oldpad, off, TRUE);
+                   SV *sv = NEWSV(0,0);
+                   sv_upgrade(sv, SVt_PVNV);
+                   sv_setpv(sv, name);
+                   av_store(comppadname, newoff, sv);
+                   SvNV(sv) = (double)curcop->cop_seq;
+                   SvIV(sv) = 99999999;
+                   av_store(comppad, newoff, sv_ref(oldsv));
+                   return newoff;
+               }
+           }
+           return 0;
+       }
+    }
+
+    return 0;
+}
+
+void
+pad_leavemy(fill)
+I32 fill;
+{
+    I32 off;
+    SV **svp = AvARRAY(comppadname);
+    SV *sv;
+    for (off = AvFILL(comppadname); off > fill; off--) {
+       if (sv = svp[off])
+           SvIV(sv) = cop_seq;
+    }
+}
+
 PADOFFSET
 pad_alloc(optype,tmptype)      
 I32 optype;
@@ -314,6 +418,7 @@ OP *op;
            else
                scalar(kid);
        }
+       curcop = &compiling;
        return op;
     case OP_LIST:
        op = prepend_elem(OP_LIST, newOP(OP_PUSHMARK, 0), op);
@@ -339,8 +444,14 @@ OP *op;
 
     switch (op->op_type) {
     default:
+       if (dowarn && (opargs[op->op_type] & OA_FOLDCONST))
+           warn("Useless use of %s", op_name[op->op_type]);
        return op;
 
+    case OP_NEXTSTATE:
+       curcop = ((COP*)op);            /* for warning above */
+       break;
+
     case OP_CONST:
        op->op_type = OP_NULL;          /* don't execute a constant */
        sv_free(cSVOP->op_sv);          /* don't even remember it */
@@ -442,6 +553,7 @@ OP *op;
            else
                list(kid);
        }
+       curcop = &compiling;
        break;
     }
     return op;
@@ -462,6 +574,7 @@ OP *op;
            if (kid->op_sibling)
                scalarvoid(kid);
        }
+       curcop = &compiling;
     }
     return op;
 }
@@ -496,10 +609,10 @@ I32 type;
     case OP_ENTERSUBR:
        if ((type == OP_DEFINED || type == OP_UNDEF || type == OP_REFGEN) &&
          !(op->op_flags & OPf_STACKED)) {
-           op->op_type = OP_NULL;                      /* disable entersubr */
-           op->op_ppaddr = ppaddr[OP_NULL];
-           cLISTOP->op_first->op_type = OP_NULL;       /* disable pushmark */
-           cLISTOP->op_first->op_ppaddr = ppaddr[OP_NULL];
+           op->op_type = OP_RV2CV;             /* entersubr => rv2cv */
+           op->op_ppaddr = ppaddr[OP_RV2CV];
+           cUNOP->op_first->op_type = OP_NULL; /* disable pushmark */
+           cUNOP->op_first->op_ppaddr = ppaddr[OP_NULL];
            break;
        }
        /* FALL THROUGH */
@@ -521,14 +634,18 @@ I32 type;
     case OP_RV2AV:
     case OP_RV2HV:
     case OP_RV2GV:
-       ref(cUNOP->op_first, type ? type : op->op_type);
+       ref(cUNOP->op_first, op->op_type);
        /* FALL THROUGH */
     case OP_AASSIGN:
     case OP_ASLICE:
     case OP_HSLICE:
-    case OP_CURCOP:
+    case OP_NEXTSTATE:
+    case OP_DBSTATE:
        refcount = 10000;
        break;
+    case OP_PADSV:
+    case OP_PADAV:
+    case OP_PADHV:
     case OP_UNDEF:
     case OP_GV:
     case OP_RV2SV:
@@ -559,7 +676,8 @@ I32 type;
     case OP_AELEM:
     case OP_HELEM:
        ref(cBINOP->op_first, type ? type : op->op_type);
-       op->op_private = type;
+       if (type == OP_RV2AV || type == OP_RV2HV)
+           op->op_private = type;
        break;
 
     case OP_LEAVE:
@@ -577,13 +695,42 @@ I32 type;
     op->op_flags |= OPf_LVAL;
     if (!type) {
        op->op_flags &= ~OPf_SPECIAL;
-       op->op_flags |= OPf_LOCAL;
+       op->op_flags |= OPf_INTRO;
     }
     else if (type == OP_AASSIGN || type == OP_SASSIGN)
        op->op_flags |= OPf_SPECIAL;
     return op;
 }
 
+OP *
+my(op)
+OP *op;
+{
+    OP *kid;
+    SV *sv;
+    I32 type;
+
+    if (!op)
+       return op;
+
+    type = op->op_type;
+    if (type == OP_LIST) {
+       for (kid = cLISTOP->op_first; kid; kid = kid->op_sibling)
+           my(kid);
+    }
+    else if (type != OP_PADSV &&
+            type != OP_PADAV &&
+            type != OP_PADHV &&
+            type != OP_PUSHMARK)
+    {
+       sprintf(tokenbuf, "Can't declare %s in my", op_name[op->op_type]);
+       yyerror(tokenbuf);
+       return op;
+    }
+    op->op_flags |= OPf_LVAL|OPf_INTRO;
+    return op;
+}
+
 OP *
 sawparens(o)
 OP *o;
@@ -659,14 +806,19 @@ OP **startp;
 }
 
 OP *
-localize(o)
+localize(o, lex)
 OP *o;
+I32 lex;
 {
     if (o->op_flags & OPf_PARENS)
        list(o);
     else
        scalar(o);
-    return ref(o, Nullop);     /* a bit kludgey */
+    in_my = FALSE;
+    if (lex)
+       return my(o);
+    else
+       return ref(o, OP_NULL);         /* a bit kludgey */
 }
 
 OP *
@@ -699,7 +851,10 @@ register OP *o;
        goto nope;
 
     for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) {
-       if (curop->op_type != OP_CONST && curop->op_type != OP_LIST) {
+       if (curop->op_type != OP_CONST &&
+               curop->op_type != OP_LIST &&
+               curop->op_type != OP_SCALAR &&
+               curop->op_type != OP_PUSHMARK) {
            goto nope;
        }
     }
@@ -956,6 +1111,9 @@ OP* first;
            return newBINOP(type, flags, newOP(OP_PUSHMARK, 0), first);
     }
 
+    if (!first)
+       first = newOP(OP_STUB, 0); 
+
     Newz(1101, unop, 1, UNOP);
     unop->op_type = type;
     unop->op_ppaddr = ppaddr[type];
@@ -1114,7 +1272,7 @@ OP *repl;
        SV *pat = ((SVOP*)expr)->op_sv;
        char *p = SvPVn(pat);
        if ((op->op_flags & OPf_SPECIAL) && strEQ(p, " ")) {
-           sv_setpv(pat, "\\s+", 3);
+           sv_setpvn(pat, "\\s+", 3);
            p = SvPVn(pat);
            pm->op_pmflags |= PMf_SKIPWHITE;
        }
@@ -1153,7 +1311,7 @@ OP *repl;
                if (opargs[curop->op_type] & OA_DANGEROUS) {
                    if (curop->op_type == OP_GV) {
                        GV *gv = ((GVOP*)curop)->op_gv;
-                       if (index("&`'123456789+", *GvENAME(gv)))
+                       if (strchr("&`'123456789+", *GvENAME(gv)))
                            break;
                    }
                    else if (curop->op_type == OP_RV2CV)
@@ -1285,21 +1443,29 @@ OP *op;
 {
     char tmpbuf[256];
     GV *tmpgv;
-    SV *sv = cSVOP->op_sv;
-    char *name = SvPVn(sv);
+    SV *sv;
+    char *name;
 
     save_hptr(&curstash);
     save_item(curstname);
-    sv_setpv(curstname,name);
-    sprintf(tmpbuf,"'_%s",name);
-    tmpgv = gv_fetchpv(tmpbuf,TRUE);
-    if (!GvHV(tmpgv))
-       GvHV(tmpgv) = newHV(0);
-    curstash = GvHV(tmpgv);
-    if (!HvNAME(curstash))
-       HvNAME(curstash) = savestr(name);
-    HvCOEFFSIZE(curstash) = 0;
-    op_free(op);
+    if (op) {
+       sv = cSVOP->op_sv;
+       name = SvPVn(sv);
+       sv_setpv(curstname,name);
+       sprintf(tmpbuf,"'_%s",name);
+       tmpgv = gv_fetchpv(tmpbuf,TRUE);
+       if (!GvHV(tmpgv))
+           GvHV(tmpgv) = newHV(0);
+       curstash = GvHV(tmpgv);
+       if (!HvNAME(curstash))
+           HvNAME(curstash) = savestr(name);
+       HvCOEFFSIZE(curstash) = 0;
+       op_free(op);
+    }
+    else {
+       sv_setpv(curstname,"<none>");
+       curstash = Nullhv;
+    }
     copline = NOLINE;
     expect = XBLOCK;
 }
@@ -1341,6 +1507,9 @@ register OP *op;
        op->op_type == OP_ASLICE || op->op_type == OP_HSLICE)
        return TRUE;
 
+    if (op->op_type == OP_PADAV || op->op_type == OP_PADHV)
+       return TRUE;
+
     if (op->op_type == OP_RV2SV)
        return FALSE;
 
@@ -1383,7 +1552,7 @@ OP *right;
                list(prepend_elem(OP_LIST, newOP(OP_PUSHMARK, 0), right)),
                list(prepend_elem(OP_LIST, newOP(OP_PUSHMARK, 0), left)) );
        op->op_private = 0;
-       if (!(left->op_flags & OPf_LOCAL)) {
+       if (!(left->op_flags & OPf_INTRO)) {
            static int generation = 0;
            OP *curop;
            OP *lastop = op;
@@ -1436,14 +1605,17 @@ OP *op;
 {
     register COP *cop;
 
+    comppadnamefill = AvFILL(comppadname);     /* introduce my variables */
+
     Newz(1101, cop, 1, COP);
-    cop->op_type = OP_CURCOP;
-    cop->op_ppaddr = ppaddr[OP_CURCOP];
+    cop->op_type = OP_NEXTSTATE;
+    cop->op_ppaddr = ppaddr[ perldb ? OP_DBSTATE : OP_NEXTSTATE ];
     cop->op_flags = flags;
     cop->op_private = 0;
     cop->op_next = (OP*)cop;
 
     cop->cop_label = label;
+    cop->cop_seq = cop_seq++;
 
     if (copline == NOLINE)
         cop->cop_line = curcop->cop_line;
@@ -1454,6 +1626,15 @@ OP *op;
     cop->cop_filegv = curcop->cop_filegv;
     cop->cop_stash = curstash;
 
+    if (perldb) {
+       SV **svp = av_fetch(GvAV(curcop->cop_filegv),(I32)cop->cop_line, FALSE);
+       if (svp && *svp != &sv_undef && !SvIOK(*svp)) {
+           SvIV(*svp) = 1;
+           SvIOK_on(*svp);
+           SvSTASH(*svp) = (HV*)cop;
+       }
+    }
+
     return prepend_elem(OP_LINESEQ, (OP*)cop, op);
 }
 
@@ -1484,6 +1665,8 @@ OP* other;
        }
     }
     if (first->op_type == OP_CONST) {
+       if (dowarn && (first->op_private & OPpCONST_BARE))
+           warn("Probable precedence problem on %s", op_name[type]);
        if ((type == OP_AND) == (SvTRUE(((SVOP*)first)->op_sv))) {
            op_free(first);
            return other;
@@ -1632,7 +1815,12 @@ OP *expr;
 OP *block;
 {
     OP* listop = append_elem(OP_LINESEQ, block, newOP(OP_UNSTACK, 0));
-    OP* op = newLOGOP(OP_AND, 0, expr, listop);
+    OP* op;
+
+    if (expr && (expr->op_type == OP_READLINE || expr->op_type == OP_GLOB))
+       expr = newASSIGNOP(0, newSVREF(newGVOP(OP_GV, 0, defgv)), expr);
+
+    op = newLOGOP(OP_AND, 0, expr, listop);
     ((LISTOP*)listop)->op_last->op_next = LINKLIST(op);
 
     if (block->op_flags & OPf_SPECIAL &&  /* skip conditional on do {} ? */
@@ -1736,7 +1924,7 @@ OP*cont;
            prepend_elem(OP_LIST, newOP(OP_PUSHMARK, 0), expr),
            scalar(sv))));
     return newSTATEOP(0, label, newWHILEOP(flags, 1,
-       loop, newOP(OP_ITER), block, cont));
+       loop, newOP(OP_ITER, 0), block, cont));
 }
 
 void
@@ -1776,7 +1964,7 @@ OP *block;
        if (CvDEPTH(cv))
            CvDELETED(cv) = TRUE;       /* probably an autoloader */
        else {
-           if (dowarn) {
+           if (dowarn && CvROOT(cv)) {
                line_t oldline = curcop->cop_line;
 
                curcop->cop_line = copline;
@@ -1793,15 +1981,56 @@ OP *block;
 
     av = newAV();
     AvREAL_off(av);
+    if (AvFILL(comppadname) < AvFILL(comppad))
+       av_store(comppadname, AvFILL(comppad), Nullsv);
+    av_store(av, 0, (SV*)comppadname);
     av_store(av, 1, (SV*)comppad);
     AvFILL(av) = 1;
     CvPADLIST(cv) = av;
+    comppadname = newAV();
 
+    if (!block) {
+       CvROOT(cv) = 0;
+       op_free(op);
+       copline = NOLINE;
+       leave_scope(floor);
+       return;
+    }
     CvROOT(cv) = newUNOP(OP_LEAVESUBR, 0, scalarseq(block));
     CvSTART(cv) = LINKLIST(CvROOT(cv));
     CvROOT(cv)->op_next = 0;
+    CvSTASH(cv) = curstash;
     peep(CvSTART(cv));
     CvDELETED(cv) = FALSE;
+    if (strEQ(name, "BEGIN")) {
+       line_t oldline = curcop->cop_line;
+       GV* oldfile = curcop->cop_filegv;
+
+       if (!beginav)
+           beginav = newAV();
+       av_push(beginav, sv_ref(gv));
+       DEBUG_x( dump_sub(gv) );
+       rs = nrs;
+       rslen = nrslen;
+       rschar = nrschar;
+       rspara = (nrslen == 2);
+       calllist(beginav);
+       cv_free(cv);
+       rs = "\n";
+       rslen = 1;
+       rschar = '\n';
+       rspara = 0;
+       GvCV(gv) = 0;
+       curcop = &compiling;
+       curcop->cop_line = oldline;     /* might have compiled something */
+       curcop->cop_filegv = oldfile;   /* recursively, clobbering these */
+    }
+    else if (strEQ(name, "END")) {
+       if (!endav)
+           endav = newAV();
+       av_unshift(endav, 1);
+       av_store(endav, 0, sv_ref(gv));
+    }
     if (perldb) {
        SV *sv;
        SV *tmpstr = sv_mortalcopy(&sv_undef);
@@ -1847,6 +2076,17 @@ char *filename;
     CvUSERSUB(cv) = subaddr;
     CvUSERINDEX(cv) = ix;
     CvDELETED(cv) = FALSE;
+    if (strEQ(name, "BEGIN")) {
+       if (!beginav)
+           beginav = newAV();
+       av_push(beginav, sv_ref(gv));
+    }
+    else if (strEQ(name, "END")) {
+       if (!endav)
+           endav = newAV();
+       av_unshift(endav, 1);
+       av_store(endav, 0, sv_ref(gv));
+    }
 }
 
 void
@@ -1919,20 +2159,24 @@ OP *
 newANONLIST(op)
 OP* op;
 {
-    return newUNOP(OP_REFGEN, 0, ref(list(convert(OP_ANONLIST, 0, op))));
+    return newUNOP(OP_REFGEN, 0,
+       ref(list(convert(OP_ANONLIST, 0, op)), OP_REFGEN));
 }
 
 OP *
 newANONHASH(op)
 OP* op;
 {
-    return newUNOP(OP_REFGEN, 0, ref(list(convert(OP_ANONHASH, 0, op))));
+    return newUNOP(OP_REFGEN, 0,
+       ref(list(convert(OP_ANONHASH, 0, op)), OP_REFGEN));
 }
 
 OP *
 oopsAV(o)
 OP *o;
 {
+    if (o->op_type == OP_PADAV)
+       return o;
     if (o->op_type == OP_RV2SV) {
        o->op_type = OP_RV2AV;
        o->op_ppaddr = ppaddr[OP_RV2AV];
@@ -1947,6 +2191,8 @@ OP *
 oopsHV(o)
 OP *o;
 {
+    if (o->op_type == OP_PADHV)
+       return o;
     if (o->op_type == OP_RV2SV || o->op_type == OP_RV2AV) {
        o->op_type = OP_RV2HV;
        o->op_ppaddr = ppaddr[OP_RV2HV];
@@ -1961,6 +2207,8 @@ OP *
 newAVREF(o)
 OP *o;
 {
+    if (o->op_type == OP_PADAV)
+       return o;
     return newUNOP(OP_RV2AV, 0, scalar(o));
 }
 
@@ -1975,6 +2223,8 @@ OP *
 newHVREF(o)
 OP *o;
 {
+    if (o->op_type == OP_PADHV)
+       return o;
     return newUNOP(OP_RV2HV, 0, scalar(o));
 }
 
@@ -1998,6 +2248,8 @@ OP *
 newSVREF(o)
 OP *o;
 {
+    if (o->op_type == OP_PADSV)
+       return o;
     return newUNOP(OP_RV2SV, 0, scalar(o));
 }
 
@@ -2063,11 +2315,10 @@ OP *op;
     if (op->op_flags & OPf_KIDS) {
        SVOP *kid = (SVOP*)cUNOP->op_first;
 
-       if (kid->op_type == OP_CONST) {
-#ifdef NOTDEF
-           op->op_type = OP_EVALONCE;
-           op->op_ppaddr = ppaddr[OP_EVALONCE];
-#endif
+       if (!kid) {
+           op->op_flags &= ~OPf_KIDS;
+           op->op_type = OP_NULL;
+           op->op_ppaddr = ppaddr[OP_NULL];
        }
        else if (kid->op_type == OP_LINESEQ) {
            LOGOP *enter;
@@ -2306,7 +2557,10 @@ OP *op;
     LOGOP *gwop;
     OP *kid;
 
-    op->op_flags &= ~OPf_STACKED;      /* XXX do we need to scope() it? */
+    if (op->op_flags & OPf_STACKED) {
+       op = ck_sort(op);
+       op->op_flags &= ~OPf_STACKED;
+    }
     op = ck_fun(op);
     if (error_count)
        return op;
@@ -2363,7 +2617,7 @@ OP *op;
     
     kid = cLISTOP->op_first;
     if (!kid) {
-       prepend_elem(op->op_type, newOP(OP_PUSHMARK), op);
+       prepend_elem(op->op_type, newOP(OP_PUSHMARK, 0), op);
        kid = cLISTOP->op_first;
     }
     if (kid->op_type == OP_PUSHMARK)
@@ -2545,7 +2799,16 @@ OP *
 ck_subr(op)
 OP *op;
 {
+    OP *o = ((cUNOP->op_first->op_sibling)
+            ? cUNOP : ((UNOP*)cUNOP->op_first))->op_first->op_sibling;
+
+    if (o->op_type == OP_RV2CV) {
+       o->op_type = OP_NULL;           /* disable rv2cv */
+       o->op_ppaddr = ppaddr[OP_NULL];
+    }
     op->op_private = 0;
+    if (perldb)
+       op->op_private |= OPpSUBR_DB;
     return op;
 }
 
@@ -2575,6 +2838,7 @@ register OP* op;
        switch (op->op_type) {
        case OP_NULL:
        case OP_SCALAR:
+       case OP_LINESEQ:
            if (oldop) {
                oldop->op_next = op->op_next;
                continue;
@@ -2586,7 +2850,7 @@ register OP* op;
            if (op->op_next->op_type == OP_RV2SV) {
                op->op_next->op_type = OP_NULL;
                op->op_next->op_ppaddr = ppaddr[OP_NULL];
-               op->op_flags |= op->op_next->op_flags & OPf_LOCAL;
+               op->op_flags |= op->op_next->op_flags & OPf_INTRO;
                op->op_next = op->op_next->op_next;
                op->op_type = OP_GVSV;
                op->op_ppaddr = ppaddr[OP_GVSV];
diff --git a/op.h b/op.h
index fe6b134..81c3a0d 100644 (file)
--- a/op.h
+++ b/op.h
@@ -51,7 +51,7 @@ typedef U16 PADOFFSET;
 #define OPf_PARENS     8       /* This operator was parenthesized. */
 #define OPf_STACKED    16      /* Some arg is arriving on the stack. */
 #define OPf_LVAL       32      /* Certified reference (lvalue). */
-#define OPf_LOCAL      64      /* Lvalue must be localized */
+#define OPf_INTRO      64      /* Lvalue must be localized */
 #define OPf_SPECIAL    128     /* Do something weird for this op: */
                                /*  On local LVAL, don't init local value. */
                                /*  On OP_SORT, subroutine is inlined. */
index 4416936..14d02a8 100644 (file)
--- a/opcode.h
+++ b/opcode.h
 typedef enum {
        OP_NULL,        /* 0 */
-       OP_SCALAR,      /* 1 */
-       OP_PUSHMARK,    /* 2 */
-       OP_WANTARRAY,   /* 3 */
-       OP_WORD,        /* 4 */
+       OP_STUB,        /* 1 */
+       OP_SCALAR,      /* 2 */
+       OP_PUSHMARK,    /* 3 */
+       OP_WANTARRAY,   /* 4 */
        OP_CONST,       /* 5 */
        OP_INTERP,      /* 6 */
        OP_GVSV,        /* 7 */
        OP_GV,          /* 8 */
-       OP_PUSHRE,      /* 9 */
-       OP_RV2GV,       /* 10 */
-       OP_SV2LEN,      /* 11 */
-       OP_RV2SV,       /* 12 */
-       OP_AV2ARYLEN,   /* 13 */
-       OP_RV2CV,       /* 14 */
-       OP_REFGEN,      /* 15 */
-       OP_REF,         /* 16 */
-       OP_BLESS,       /* 17 */
-       OP_BACKTICK,    /* 18 */
-       OP_GLOB,        /* 19 */
-       OP_READLINE,    /* 20 */
-       OP_RCATLINE,    /* 21 */
-       OP_REGCOMP,     /* 22 */
-       OP_MATCH,       /* 23 */
-       OP_SUBST,       /* 24 */
-       OP_SUBSTCONT,   /* 25 */
-       OP_TRANS,       /* 26 */
-       OP_SASSIGN,     /* 27 */
-       OP_AASSIGN,     /* 28 */
-       OP_SCHOP,       /* 29 */
-       OP_CHOP,        /* 30 */
-       OP_DEFINED,     /* 31 */
-       OP_UNDEF,       /* 32 */
-       OP_STUDY,       /* 33 */
-       OP_PREINC,      /* 34 */
-       OP_PREDEC,      /* 35 */
-       OP_POSTINC,     /* 36 */
-       OP_POSTDEC,     /* 37 */
-       OP_POW,         /* 38 */
-       OP_MULTIPLY,    /* 39 */
-       OP_DIVIDE,      /* 40 */
-       OP_MODULO,      /* 41 */
-       OP_REPEAT,      /* 42 */
-       OP_ADD,         /* 43 */
-       OP_INTADD,      /* 44 */
-       OP_SUBTRACT,    /* 45 */
-       OP_CONCAT,      /* 46 */
-       OP_LEFT_SHIFT,  /* 47 */
-       OP_RIGHT_SHIFT, /* 48 */
-       OP_LT,          /* 49 */
-       OP_GT,          /* 50 */
-       OP_LE,          /* 51 */
-       OP_GE,          /* 52 */
-       OP_EQ,          /* 53 */
-       OP_NE,          /* 54 */
-       OP_NCMP,        /* 55 */
-       OP_SLT,         /* 56 */
-       OP_SGT,         /* 57 */
-       OP_SLE,         /* 58 */
-       OP_SGE,         /* 59 */
-       OP_SEQ,         /* 60 */
-       OP_SNE,         /* 61 */
-       OP_SCMP,        /* 62 */
-       OP_BIT_AND,     /* 63 */
-       OP_XOR,         /* 64 */
-       OP_BIT_OR,      /* 65 */
-       OP_NEGATE,      /* 66 */
-       OP_NOT,         /* 67 */
-       OP_COMPLEMENT,  /* 68 */
-       OP_ATAN2,       /* 69 */
-       OP_SIN,         /* 70 */
-       OP_COS,         /* 71 */
-       OP_RAND,        /* 72 */
-       OP_SRAND,       /* 73 */
-       OP_EXP,         /* 74 */
-       OP_LOG,         /* 75 */
-       OP_SQRT,        /* 76 */
-       OP_INT,         /* 77 */
-       OP_HEX,         /* 78 */
-       OP_OCT,         /* 79 */
-       OP_LENGTH,      /* 80 */
-       OP_SUBSTR,      /* 81 */
-       OP_VEC,         /* 82 */
-       OP_INDEX,       /* 83 */
-       OP_RINDEX,      /* 84 */
-       OP_SPRINTF,     /* 85 */
-       OP_FORMLINE,    /* 86 */
-       OP_ORD,         /* 87 */
-       OP_CRYPT,       /* 88 */
-       OP_UCFIRST,     /* 89 */
-       OP_LCFIRST,     /* 90 */
-       OP_UC,          /* 91 */
-       OP_LC,          /* 92 */
-       OP_RV2AV,       /* 93 */
-       OP_AELEMFAST,   /* 94 */
-       OP_AELEM,       /* 95 */
-       OP_ASLICE,      /* 96 */
-       OP_EACH,        /* 97 */
-       OP_VALUES,      /* 98 */
-       OP_KEYS,        /* 99 */
-       OP_DELETE,      /* 100 */
-       OP_RV2HV,       /* 101 */
-       OP_HELEM,       /* 102 */
-       OP_HSLICE,      /* 103 */
-       OP_UNPACK,      /* 104 */
-       OP_PACK,        /* 105 */
-       OP_SPLIT,       /* 106 */
-       OP_JOIN,        /* 107 */
-       OP_LIST,        /* 108 */
-       OP_LSLICE,      /* 109 */
-       OP_ANONLIST,    /* 110 */
-       OP_ANONHASH,    /* 111 */
-       OP_SPLICE,      /* 112 */
-       OP_PUSH,        /* 113 */
-       OP_POP,         /* 114 */
-       OP_SHIFT,       /* 115 */
-       OP_UNSHIFT,     /* 116 */
-       OP_SORT,        /* 117 */
-       OP_REVERSE,     /* 118 */
-       OP_GREPSTART,   /* 119 */
-       OP_GREPWHILE,   /* 120 */
-       OP_RANGE,       /* 121 */
-       OP_FLIP,        /* 122 */
-       OP_FLOP,        /* 123 */
-       OP_AND,         /* 124 */
-       OP_OR,          /* 125 */
-       OP_COND_EXPR,   /* 126 */
-       OP_ANDASSIGN,   /* 127 */
-       OP_ORASSIGN,    /* 128 */
-       OP_METHOD,      /* 129 */
-       OP_ENTERSUBR,   /* 130 */
-       OP_LEAVESUBR,   /* 131 */
-       OP_CALLER,      /* 132 */
-       OP_WARN,        /* 133 */
-       OP_DIE,         /* 134 */
-       OP_RESET,       /* 135 */
-       OP_LINESEQ,     /* 136 */
-       OP_CURCOP,      /* 137 */
-       OP_UNSTACK,     /* 138 */
-       OP_ENTER,       /* 139 */
-       OP_LEAVE,       /* 140 */
-       OP_ENTERITER,   /* 141 */
-       OP_ITER,        /* 142 */
-       OP_ENTERLOOP,   /* 143 */
-       OP_LEAVELOOP,   /* 144 */
-       OP_RETURN,      /* 145 */
-       OP_LAST,        /* 146 */
-       OP_NEXT,        /* 147 */
-       OP_REDO,        /* 148 */
-       OP_DUMP,        /* 149 */
-       OP_GOTO,        /* 150 */
-       OP_EXIT,        /* 151 */
-       OP_NSWITCH,     /* 152 */
-       OP_CSWITCH,     /* 153 */
-       OP_OPEN,        /* 154 */
-       OP_CLOSE,       /* 155 */
-       OP_PIPE_OP,     /* 156 */
-       OP_FILENO,      /* 157 */
-       OP_UMASK,       /* 158 */
-       OP_BINMODE,     /* 159 */
-       OP_DBMOPEN,     /* 160 */
-       OP_DBMCLOSE,    /* 161 */
-       OP_SSELECT,     /* 162 */
-       OP_SELECT,      /* 163 */
-       OP_GETC,        /* 164 */
-       OP_READ,        /* 165 */
-       OP_ENTERWRITE,  /* 166 */
-       OP_LEAVEWRITE,  /* 167 */
-       OP_PRTF,        /* 168 */
-       OP_PRINT,       /* 169 */
-       OP_SYSREAD,     /* 170 */
-       OP_SYSWRITE,    /* 171 */
-       OP_SEND,        /* 172 */
-       OP_RECV,        /* 173 */
-       OP_EOF,         /* 174 */
-       OP_TELL,        /* 175 */
-       OP_SEEK,        /* 176 */
-       OP_TRUNCATE,    /* 177 */
-       OP_FCNTL,       /* 178 */
-       OP_IOCTL,       /* 179 */
-       OP_FLOCK,       /* 180 */
-       OP_SOCKET,      /* 181 */
-       OP_SOCKPAIR,    /* 182 */
-       OP_BIND,        /* 183 */
-       OP_CONNECT,     /* 184 */
-       OP_LISTEN,      /* 185 */
-       OP_ACCEPT,      /* 186 */
-       OP_SHUTDOWN,    /* 187 */
-       OP_GSOCKOPT,    /* 188 */
-       OP_SSOCKOPT,    /* 189 */
-       OP_GETSOCKNAME, /* 190 */
-       OP_GETPEERNAME, /* 191 */
-       OP_LSTAT,       /* 192 */
-       OP_STAT,        /* 193 */
-       OP_FTRREAD,     /* 194 */
-       OP_FTRWRITE,    /* 195 */
-       OP_FTREXEC,     /* 196 */
-       OP_FTEREAD,     /* 197 */
-       OP_FTEWRITE,    /* 198 */
-       OP_FTEEXEC,     /* 199 */
-       OP_FTIS,        /* 200 */
-       OP_FTEOWNED,    /* 201 */
-       OP_FTROWNED,    /* 202 */
-       OP_FTZERO,      /* 203 */
-       OP_FTSIZE,      /* 204 */
-       OP_FTMTIME,     /* 205 */
-       OP_FTATIME,     /* 206 */
-       OP_FTCTIME,     /* 207 */
-       OP_FTSOCK,      /* 208 */
-       OP_FTCHR,       /* 209 */
-       OP_FTBLK,       /* 210 */
-       OP_FTFILE,      /* 211 */
-       OP_FTDIR,       /* 212 */
-       OP_FTPIPE,      /* 213 */
-       OP_FTLINK,      /* 214 */
-       OP_FTSUID,      /* 215 */
-       OP_FTSGID,      /* 216 */
-       OP_FTSVTX,      /* 217 */
-       OP_FTTTY,       /* 218 */
-       OP_FTTEXT,      /* 219 */
-       OP_FTBINARY,    /* 220 */
-       OP_CHDIR,       /* 221 */
-       OP_CHOWN,       /* 222 */
-       OP_CHROOT,      /* 223 */
-       OP_UNLINK,      /* 224 */
-       OP_CHMOD,       /* 225 */
-       OP_UTIME,       /* 226 */
-       OP_RENAME,      /* 227 */
-       OP_LINK,        /* 228 */
-       OP_SYMLINK,     /* 229 */
-       OP_READLINK,    /* 230 */
-       OP_MKDIR,       /* 231 */
-       OP_RMDIR,       /* 232 */
-       OP_OPEN_DIR,    /* 233 */
-       OP_READDIR,     /* 234 */
-       OP_TELLDIR,     /* 235 */
-       OP_SEEKDIR,     /* 236 */
-       OP_REWINDDIR,   /* 237 */
-       OP_CLOSEDIR,    /* 238 */
-       OP_FORK,        /* 239 */
-       OP_WAIT,        /* 240 */
-       OP_WAITPID,     /* 241 */
-       OP_SYSTEM,      /* 242 */
-       OP_EXEC,        /* 243 */
-       OP_KILL,        /* 244 */
-       OP_GETPPID,     /* 245 */
-       OP_GETPGRP,     /* 246 */
-       OP_SETPGRP,     /* 247 */
-       OP_GETPRIORITY, /* 248 */
-       OP_SETPRIORITY, /* 249 */
-       OP_TIME,        /* 250 */
-       OP_TMS,         /* 251 */
-       OP_LOCALTIME,   /* 252 */
-       OP_GMTIME,      /* 253 */
-       OP_ALARM,       /* 254 */
-       OP_SLEEP,       /* 255 */
-       OP_SHMGET,      /* 256 */
-       OP_SHMCTL,      /* 257 */
-       OP_SHMREAD,     /* 258 */
-       OP_SHMWRITE,    /* 259 */
-       OP_MSGGET,      /* 260 */
-       OP_MSGCTL,      /* 261 */
-       OP_MSGSND,      /* 262 */
-       OP_MSGRCV,      /* 263 */
-       OP_SEMGET,      /* 264 */
-       OP_SEMCTL,      /* 265 */
-       OP_SEMOP,       /* 266 */
-       OP_REQUIRE,     /* 267 */
-       OP_DOFILE,      /* 268 */
-       OP_ENTEREVAL,   /* 269 */
-       OP_LEAVEEVAL,   /* 270 */
-       OP_EVALONCE,    /* 271 */
-       OP_ENTERTRY,    /* 272 */
-       OP_LEAVETRY,    /* 273 */
-       OP_GHBYNAME,    /* 274 */
-       OP_GHBYADDR,    /* 275 */
-       OP_GHOSTENT,    /* 276 */
-       OP_GNBYNAME,    /* 277 */
-       OP_GNBYADDR,    /* 278 */
-       OP_GNETENT,     /* 279 */
-       OP_GPBYNAME,    /* 280 */
-       OP_GPBYNUMBER,  /* 281 */
-       OP_GPROTOENT,   /* 282 */
-       OP_GSBYNAME,    /* 283 */
-       OP_GSBYPORT,    /* 284 */
-       OP_GSERVENT,    /* 285 */
-       OP_SHOSTENT,    /* 286 */
-       OP_SNETENT,     /* 287 */
-       OP_SPROTOENT,   /* 288 */
-       OP_SSERVENT,    /* 289 */
-       OP_EHOSTENT,    /* 290 */
-       OP_ENETENT,     /* 291 */
-       OP_EPROTOENT,   /* 292 */
-       OP_ESERVENT,    /* 293 */
-       OP_GPWNAM,      /* 294 */
-       OP_GPWUID,      /* 295 */
-       OP_GPWENT,      /* 296 */
-       OP_SPWENT,      /* 297 */
-       OP_EPWENT,      /* 298 */
-       OP_GGRNAM,      /* 299 */
-       OP_GGRGID,      /* 300 */
-       OP_GGRENT,      /* 301 */
-       OP_SGRENT,      /* 302 */
-       OP_EGRENT,      /* 303 */
-       OP_GETLOGIN,    /* 304 */
-       OP_SYSCALL,     /* 305 */
+       OP_PADSV,       /* 9 */
+       OP_PADAV,       /* 10 */
+       OP_PADHV,       /* 11 */
+       OP_PUSHRE,      /* 12 */
+       OP_RV2GV,       /* 13 */
+       OP_SV2LEN,      /* 14 */
+       OP_RV2SV,       /* 15 */
+       OP_AV2ARYLEN,   /* 16 */
+       OP_RV2CV,       /* 17 */
+       OP_REFGEN,      /* 18 */
+       OP_REF,         /* 19 */
+       OP_BLESS,       /* 20 */
+       OP_BACKTICK,    /* 21 */
+       OP_GLOB,        /* 22 */
+       OP_READLINE,    /* 23 */
+       OP_RCATLINE,    /* 24 */
+       OP_REGCOMP,     /* 25 */
+       OP_MATCH,       /* 26 */
+       OP_SUBST,       /* 27 */
+       OP_SUBSTCONT,   /* 28 */
+       OP_TRANS,       /* 29 */
+       OP_SASSIGN,     /* 30 */
+       OP_AASSIGN,     /* 31 */
+       OP_SCHOP,       /* 32 */
+       OP_CHOP,        /* 33 */
+       OP_DEFINED,     /* 34 */
+       OP_UNDEF,       /* 35 */
+       OP_STUDY,       /* 36 */
+       OP_PREINC,      /* 37 */
+       OP_PREDEC,      /* 38 */
+       OP_POSTINC,     /* 39 */
+       OP_POSTDEC,     /* 40 */
+       OP_POW,         /* 41 */
+       OP_MULTIPLY,    /* 42 */
+       OP_DIVIDE,      /* 43 */
+       OP_MODULO,      /* 44 */
+       OP_REPEAT,      /* 45 */
+       OP_ADD,         /* 46 */
+       OP_INTADD,      /* 47 */
+       OP_SUBTRACT,    /* 48 */
+       OP_CONCAT,      /* 49 */
+       OP_LEFT_SHIFT,  /* 50 */
+       OP_RIGHT_SHIFT, /* 51 */
+       OP_LT,          /* 52 */
+       OP_GT,          /* 53 */
+       OP_LE,          /* 54 */
+       OP_GE,          /* 55 */
+       OP_EQ,          /* 56 */
+       OP_NE,          /* 57 */
+       OP_NCMP,        /* 58 */
+       OP_SLT,         /* 59 */
+       OP_SGT,         /* 60 */
+       OP_SLE,         /* 61 */
+       OP_SGE,         /* 62 */
+       OP_SEQ,         /* 63 */
+       OP_SNE,         /* 64 */
+       OP_SCMP,        /* 65 */
+       OP_BIT_AND,     /* 66 */
+       OP_XOR,         /* 67 */
+       OP_BIT_OR,      /* 68 */
+       OP_NEGATE,      /* 69 */
+       OP_NOT,         /* 70 */
+       OP_COMPLEMENT,  /* 71 */
+       OP_ATAN2,       /* 72 */
+       OP_SIN,         /* 73 */
+       OP_COS,         /* 74 */
+       OP_RAND,        /* 75 */
+       OP_SRAND,       /* 76 */
+       OP_EXP,         /* 77 */
+       OP_LOG,         /* 78 */
+       OP_SQRT,        /* 79 */
+       OP_INT,         /* 80 */
+       OP_HEX,         /* 81 */
+       OP_OCT,         /* 82 */
+       OP_LENGTH,      /* 83 */
+       OP_SUBSTR,      /* 84 */
+       OP_VEC,         /* 85 */
+       OP_INDEX,       /* 86 */
+       OP_RINDEX,      /* 87 */
+       OP_SPRINTF,     /* 88 */
+       OP_FORMLINE,    /* 89 */
+       OP_ORD,         /* 90 */
+       OP_CRYPT,       /* 91 */
+       OP_UCFIRST,     /* 92 */
+       OP_LCFIRST,     /* 93 */
+       OP_UC,          /* 94 */
+       OP_LC,          /* 95 */
+       OP_RV2AV,       /* 96 */
+       OP_AELEMFAST,   /* 97 */
+       OP_AELEM,       /* 98 */
+       OP_ASLICE,      /* 99 */
+       OP_EACH,        /* 100 */
+       OP_VALUES,      /* 101 */
+       OP_KEYS,        /* 102 */
+       OP_DELETE,      /* 103 */
+       OP_RV2HV,       /* 104 */
+       OP_HELEM,       /* 105 */
+       OP_HSLICE,      /* 106 */
+       OP_UNPACK,      /* 107 */
+       OP_PACK,        /* 108 */
+       OP_SPLIT,       /* 109 */
+       OP_JOIN,        /* 110 */
+       OP_LIST,        /* 111 */
+       OP_LSLICE,      /* 112 */
+       OP_ANONLIST,    /* 113 */
+       OP_ANONHASH,    /* 114 */
+       OP_SPLICE,      /* 115 */
+       OP_PUSH,        /* 116 */
+       OP_POP,         /* 117 */
+       OP_SHIFT,       /* 118 */
+       OP_UNSHIFT,     /* 119 */
+       OP_SORT,        /* 120 */
+       OP_REVERSE,     /* 121 */
+       OP_GREPSTART,   /* 122 */
+       OP_GREPWHILE,   /* 123 */
+       OP_RANGE,       /* 124 */
+       OP_FLIP,        /* 125 */
+       OP_FLOP,        /* 126 */
+       OP_AND,         /* 127 */
+       OP_OR,          /* 128 */
+       OP_COND_EXPR,   /* 129 */
+       OP_ANDASSIGN,   /* 130 */
+       OP_ORASSIGN,    /* 131 */
+       OP_METHOD,      /* 132 */
+       OP_ENTERSUBR,   /* 133 */
+       OP_LEAVESUBR,   /* 134 */
+       OP_CALLER,      /* 135 */
+       OP_WARN,        /* 136 */
+       OP_DIE,         /* 137 */
+       OP_RESET,       /* 138 */
+       OP_LINESEQ,     /* 139 */
+       OP_NEXTSTATE,   /* 140 */
+       OP_DBSTATE,     /* 141 */
+       OP_UNSTACK,     /* 142 */
+       OP_ENTER,       /* 143 */
+       OP_LEAVE,       /* 144 */
+       OP_ENTERITER,   /* 145 */
+       OP_ITER,        /* 146 */
+       OP_ENTERLOOP,   /* 147 */
+       OP_LEAVELOOP,   /* 148 */
+       OP_RETURN,      /* 149 */
+       OP_LAST,        /* 150 */
+       OP_NEXT,        /* 151 */
+       OP_REDO,        /* 152 */
+       OP_DUMP,        /* 153 */
+       OP_GOTO,        /* 154 */
+       OP_EXIT,        /* 155 */
+       OP_NSWITCH,     /* 156 */
+       OP_CSWITCH,     /* 157 */
+       OP_OPEN,        /* 158 */
+       OP_CLOSE,       /* 159 */
+       OP_PIPE_OP,     /* 160 */
+       OP_FILENO,      /* 161 */
+       OP_UMASK,       /* 162 */
+       OP_BINMODE,     /* 163 */
+       OP_DBMOPEN,     /* 164 */
+       OP_DBMCLOSE,    /* 165 */
+       OP_SSELECT,     /* 166 */
+       OP_SELECT,      /* 167 */
+       OP_GETC,        /* 168 */
+       OP_READ,        /* 169 */
+       OP_ENTERWRITE,  /* 170 */
+       OP_LEAVEWRITE,  /* 171 */
+       OP_PRTF,        /* 172 */
+       OP_PRINT,       /* 173 */
+       OP_SYSREAD,     /* 174 */
+       OP_SYSWRITE,    /* 175 */
+       OP_SEND,        /* 176 */
+       OP_RECV,        /* 177 */
+       OP_EOF,         /* 178 */
+       OP_TELL,        /* 179 */
+       OP_SEEK,        /* 180 */
+       OP_TRUNCATE,    /* 181 */
+       OP_FCNTL,       /* 182 */
+       OP_IOCTL,       /* 183 */
+       OP_FLOCK,       /* 184 */
+       OP_SOCKET,      /* 185 */
+       OP_SOCKPAIR,    /* 186 */
+       OP_BIND,        /* 187 */
+       OP_CONNECT,     /* 188 */
+       OP_LISTEN,      /* 189 */
+       OP_ACCEPT,      /* 190 */
+       OP_SHUTDOWN,    /* 191 */
+       OP_GSOCKOPT,    /* 192 */
+       OP_SSOCKOPT,    /* 193 */
+       OP_GETSOCKNAME, /* 194 */
+       OP_GETPEERNAME, /* 195 */
+       OP_LSTAT,       /* 196 */
+       OP_STAT,        /* 197 */
+       OP_FTRREAD,     /* 198 */
+       OP_FTRWRITE,    /* 199 */
+       OP_FTREXEC,     /* 200 */
+       OP_FTEREAD,     /* 201 */
+       OP_FTEWRITE,    /* 202 */
+       OP_FTEEXEC,     /* 203 */
+       OP_FTIS,        /* 204 */
+       OP_FTEOWNED,    /* 205 */
+       OP_FTROWNED,    /* 206 */
+       OP_FTZERO,      /* 207 */
+       OP_FTSIZE,      /* 208 */
+       OP_FTMTIME,     /* 209 */
+       OP_FTATIME,     /* 210 */
+       OP_FTCTIME,     /* 211 */
+       OP_FTSOCK,      /* 212 */
+       OP_FTCHR,       /* 213 */
+       OP_FTBLK,       /* 214 */
+       OP_FTFILE,      /* 215 */
+       OP_FTDIR,       /* 216 */
+       OP_FTPIPE,      /* 217 */
+       OP_FTLINK,      /* 218 */
+       OP_FTSUID,      /* 219 */
+       OP_FTSGID,      /* 220 */
+       OP_FTSVTX,      /* 221 */
+       OP_FTTTY,       /* 222 */
+       OP_FTTEXT,      /* 223 */
+       OP_FTBINARY,    /* 224 */
+       OP_CHDIR,       /* 225 */
+       OP_CHOWN,       /* 226 */
+       OP_CHROOT,      /* 227 */
+       OP_UNLINK,      /* 228 */
+       OP_CHMOD,       /* 229 */
+       OP_UTIME,       /* 230 */
+       OP_RENAME,      /* 231 */
+       OP_LINK,        /* 232 */
+       OP_SYMLINK,     /* 233 */
+       OP_READLINK,    /* 234 */
+       OP_MKDIR,       /* 235 */
+       OP_RMDIR,       /* 236 */
+       OP_OPEN_DIR,    /* 237 */
+       OP_READDIR,     /* 238 */
+       OP_TELLDIR,     /* 239 */
+       OP_SEEKDIR,     /* 240 */
+       OP_REWINDDIR,   /* 241 */
+       OP_CLOSEDIR,    /* 242 */
+       OP_FORK,        /* 243 */
+       OP_WAIT,        /* 244 */
+       OP_WAITPID,     /* 245 */
+       OP_SYSTEM,      /* 246 */
+       OP_EXEC,        /* 247 */
+       OP_KILL,        /* 248 */
+       OP_GETPPID,     /* 249 */
+       OP_GETPGRP,     /* 250 */
+       OP_SETPGRP,     /* 251 */
+       OP_GETPRIORITY, /* 252 */
+       OP_SETPRIORITY, /* 253 */
+       OP_TIME,        /* 254 */
+       OP_TMS,         /* 255 */
+       OP_LOCALTIME,   /* 256 */
+       OP_GMTIME,      /* 257 */
+       OP_ALARM,       /* 258 */
+       OP_SLEEP,       /* 259 */
+       OP_SHMGET,      /* 260 */
+       OP_SHMCTL,      /* 261 */
+       OP_SHMREAD,     /* 262 */
+       OP_SHMWRITE,    /* 263 */
+       OP_MSGGET,      /* 264 */
+       OP_MSGCTL,      /* 265 */
+       OP_MSGSND,      /* 266 */
+       OP_MSGRCV,      /* 267 */
+       OP_SEMGET,      /* 268 */
+       OP_SEMCTL,      /* 269 */
+       OP_SEMOP,       /* 270 */
+       OP_REQUIRE,     /* 271 */
+       OP_DOFILE,      /* 272 */
+       OP_ENTEREVAL,   /* 273 */
+       OP_LEAVEEVAL,   /* 274 */
+       OP_EVALONCE,    /* 275 */
+       OP_ENTERTRY,    /* 276 */
+       OP_LEAVETRY,    /* 277 */
+       OP_GHBYNAME,    /* 278 */
+       OP_GHBYADDR,    /* 279 */
+       OP_GHOSTENT,    /* 280 */
+       OP_GNBYNAME,    /* 281 */
+       OP_GNBYADDR,    /* 282 */
+       OP_GNETENT,     /* 283 */
+       OP_GPBYNAME,    /* 284 */
+       OP_GPBYNUMBER,  /* 285 */
+       OP_GPROTOENT,   /* 286 */
+       OP_GSBYNAME,    /* 287 */
+       OP_GSBYPORT,    /* 288 */
+       OP_GSERVENT,    /* 289 */
+       OP_SHOSTENT,    /* 290 */
+       OP_SNETENT,     /* 291 */
+       OP_SPROTOENT,   /* 292 */
+       OP_SSERVENT,    /* 293 */
+       OP_EHOSTENT,    /* 294 */
+       OP_ENETENT,     /* 295 */
+       OP_EPROTOENT,   /* 296 */
+       OP_ESERVENT,    /* 297 */
+       OP_GPWNAM,      /* 298 */
+       OP_GPWUID,      /* 299 */
+       OP_GPWENT,      /* 300 */
+       OP_SPWENT,      /* 301 */
+       OP_EPWENT,      /* 302 */
+       OP_GGRNAM,      /* 303 */
+       OP_GGRGID,      /* 304 */
+       OP_GGRENT,      /* 305 */
+       OP_SGRENT,      /* 306 */
+       OP_EGRENT,      /* 307 */
+       OP_GETLOGIN,    /* 308 */
+       OP_SYSCALL,     /* 309 */
 } opcode;
 
-#define MAXO 306
+#define MAXO 310
 
 #ifndef DOINIT
 extern char *op_name[];
 #else
 char *op_name[] = {
        "null operation",
-       "null operation",
+       "stub",
+       "scalar",
        "pushmark",
        "wantarray",
-       "bare word",
        "constant item",
        "interpreted string",
        "scalar variable",
        "glob value",
+       "private variable",
+       "private array",
+       "private hash",
        "push regexp",
        "ref-to-glob cast",
        "scalar value length",
@@ -451,6 +458,7 @@ char *op_name[] = {
        "reset",
        "line sequence",
        "next statement",
+       "debug next statement",
        "unstack",
        "block entry",
        "block exit",
@@ -649,14 +657,17 @@ OP *      ck_subr         P((OP* op));
 OP *   ck_trunc        P((OP* op));
 
 OP *   pp_null         P((ARGSproto));
+OP *   pp_stub         P((ARGSproto));
 OP *   pp_scalar       P((ARGSproto));
 OP *   pp_pushmark     P((ARGSproto));
 OP *   pp_wantarray    P((ARGSproto));
-OP *   pp_word         P((ARGSproto));
 OP *   pp_const        P((ARGSproto));
 OP *   pp_interp       P((ARGSproto));
 OP *   pp_gvsv         P((ARGSproto));
 OP *   pp_gv           P((ARGSproto));
+OP *   pp_padsv        P((ARGSproto));
+OP *   pp_padav        P((ARGSproto));
+OP *   pp_padhv        P((ARGSproto));
 OP *   pp_pushre       P((ARGSproto));
 OP *   pp_rv2gv        P((ARGSproto));
 OP *   pp_sv2len       P((ARGSproto));
@@ -785,7 +796,8 @@ OP *        pp_warn         P((ARGSproto));
 OP *   pp_die          P((ARGSproto));
 OP *   pp_reset        P((ARGSproto));
 OP *   pp_lineseq      P((ARGSproto));
-OP *   pp_curcop       P((ARGSproto));
+OP *   pp_nextstate    P((ARGSproto));
+OP *   pp_dbstate      P((ARGSproto));
 OP *   pp_unstack      P((ARGSproto));
 OP *   pp_enter        P((ARGSproto));
 OP *   pp_leave        P((ARGSproto));
@@ -960,14 +972,17 @@ extern OP * (*ppaddr[])();
 #else
 OP * (*ppaddr[])() = {
        pp_null,
+       pp_stub,
        pp_scalar,
        pp_pushmark,
        pp_wantarray,
-       pp_word,
        pp_const,
        pp_interp,
        pp_gvsv,
        pp_gv,
+       pp_padsv,
+       pp_padav,
+       pp_padhv,
        pp_pushre,
        pp_rv2gv,
        pp_sv2len,
@@ -1096,7 +1111,8 @@ OP * (*ppaddr[])() = {
        pp_die,
        pp_reset,
        pp_lineseq,
-       pp_curcop,
+       pp_nextstate,
+       pp_dbstate,
        pp_unstack,
        pp_enter,
        pp_leave,
@@ -1273,14 +1289,17 @@ extern OP * (*check[])();
 #else
 OP * (*check[])() = {
        ck_null,        /* null */
-       ck_null,        /* scalar */
+       ck_null,        /* stub */
+       ck_fun,         /* scalar */
        ck_null,        /* pushmark */
        ck_null,        /* wantarray */
-       ck_null,        /* word */
        ck_null,        /* const */
        ck_null,        /* interp */
        ck_null,        /* gvsv */
        ck_null,        /* gv */
+       ck_null,        /* padsv */
+       ck_null,        /* padav */
+       ck_null,        /* padhv */
        ck_null,        /* pushre */
        ck_rvconst,     /* rv2gv */
        ck_null,        /* sv2len */
@@ -1409,7 +1428,8 @@ OP * (*check[])() = {
        ck_fun,         /* die */
        ck_fun,         /* reset */
        ck_null,        /* lineseq */
-       ck_null,        /* curcop */
+       ck_null,        /* nextstate */
+       ck_null,        /* dbstate */
        ck_null,        /* unstack */
        ck_null,        /* enter */
        ck_null,        /* leave */
@@ -1586,14 +1606,17 @@ EXT U32 opargs[];
 #else
 U32 opargs[] = {
        0x00000000,     /* null */
-       0x00000004,     /* scalar */
+       0x00000000,     /* stub */
+       0x00000104,     /* scalar */
        0x00000004,     /* pushmark */
        0x00000014,     /* wantarray */
-       0x00000004,     /* word */
        0x00000004,     /* const */
        0x00000000,     /* interp */
        0x00000044,     /* gvsv */
        0x00000044,     /* gv */
+       0x00000000,     /* padsv */
+       0x00000000,     /* padav */
+       0x00000000,     /* padhv */
        0x00000000,     /* pushre */
        0x00000044,     /* rv2gv */
        0x0000001c,     /* sv2len */
@@ -1722,7 +1745,8 @@ U32 opargs[] = {
        0x0000025d,     /* die */
        0x00000914,     /* reset */
        0x00000000,     /* lineseq */
-       0x00000004,     /* curcop */
+       0x00000004,     /* nextstate */
+       0x00000004,     /* dbstate */
        0x00000004,     /* unstack */
        0x00000000,     /* enter */
        0x00000000,     /* leave */
@@ -1871,14 +1895,14 @@ U32 opargs[] = {
        0x00001100,     /* gsbyname */
        0x00001100,     /* gsbyport */
        0x00000000,     /* gservent */
-       0x0000011c,     /* shostent */
-       0x0000011c,     /* snetent */
-       0x0000011c,     /* sprotoent */
-       0x0000011c,     /* sservent */
-       0x0000001c,     /* ehostent */
-       0x0000001c,     /* enetent */
-       0x0000001c,     /* eprotoent */
-       0x0000001c,     /* eservent */
+       0x00000114,     /* shostent */
+       0x00000114,     /* snetent */
+       0x00000114,     /* sprotoent */
+       0x00000114,     /* sservent */
+       0x00000014,     /* ehostent */
+       0x00000014,     /* enetent */
+       0x00000014,     /* eprotoent */
+       0x00000014,     /* eservent */
        0x00000100,     /* gpwnam */
        0x00000100,     /* gpwuid */
        0x00000000,     /* gpwent */
index 7f55b93..4ee2013 100755 (executable)
--- a/opcode.pl
+++ b/opcode.pl
@@ -155,19 +155,22 @@ __END__
 # Nothing.
 
 null           null operation          ck_null         0       
-scalar         null operation          ck_null         s       
+stub           stub                    ck_null         0
+scalar         scalar                  ck_fun          s       S
 
 # Pushy stuff.
 
 pushmark       pushmark                ck_null         s       
 wantarray      wantarray               ck_null         is      
 
-word           bare word               ck_null         s       
 const          constant item           ck_null         s       
 interp         interpreted string      ck_null         0       
 
 gvsv           scalar variable         ck_null         ds      
 gv             glob value              ck_null         ds      
+padsv          private variable        ck_null         0
+padav          private array           ck_null         0
+padhv          private hash            ck_null         0
 
 pushre         push regexp             ck_null         0
 
@@ -352,7 +355,8 @@ die         die                     ck_fun          dimst   L
 reset          reset                   ck_fun          is      S?
 
 lineseq                line sequence           ck_null         0       
-curcop         next statement          ck_null         s       
+nextstate      next statement          ck_null         s       
+dbstate                debug next statement    ck_null         s       
 unstack                unstack                 ck_null         s
 enter          block entry             ck_null         0       
 leave          block exit              ck_null         0       
@@ -550,14 +554,14 @@ gprotoent getprotoent             ck_null         0
 gsbyname       getservbyname           ck_fun          0       S S
 gsbyport       getservbyport           ck_fun          0       S S
 gservent       getservent              ck_null         0       
-shostent       sethostent              ck_fun          ist     S
-snetent                setnetent               ck_fun          ist     S
-sprotoent      setprotoent             ck_fun          ist     S
-sservent       setservent              ck_fun          ist     S
-ehostent       endhostent              ck_null         ist     
-enetent                endnetent               ck_null         ist     
-eprotoent      endprotoent             ck_null         ist     
-eservent       endservent              ck_null         ist     
+shostent       sethostent              ck_fun          is      S
+snetent                setnetent               ck_fun          is      S
+sprotoent      setprotoent             ck_fun          is      S
+sservent       setservent              ck_fun          is      S
+ehostent       endhostent              ck_null         is      
+enetent                endnetent               ck_null         is      
+eprotoent      endprotoent             ck_null         is      
+eservent       endservent              ck_null         is      
 gpwnam         getpwnam                ck_fun          0       S
 gpwuid         getpwuid                ck_fun          0       S
 gpwent         getpwent                ck_null         0       
diff --git a/perl.c b/perl.c
index 752121c..9838106 100644 (file)
--- a/perl.c
+++ b/perl.c
@@ -84,26 +84,26 @@ static void init_predump_symbols();
 static void init_postdump_symbols();
 static void init_perllib();
 
-Interpreter *
+PerlInterpreter *
 perl_alloc()
 {
-    Interpreter *sv_interp;
-    Interpreter junk;
+    PerlInterpreter *sv_interp;
+    PerlInterpreter junk;
 
     curinterp = &junk;
-    Zero(&junk, 1, Interpreter);
-    New(53, sv_interp, 1, Interpreter);
+    Zero(&junk, 1, PerlInterpreter);
+    New(53, sv_interp, 1, PerlInterpreter);
     return sv_interp;
 }
 
 void
 perl_construct( sv_interp )
-register Interpreter *sv_interp;
+register PerlInterpreter *sv_interp;
 {
     if (!(curinterp = sv_interp))
        return;
 
-    Zero(sv_interp, 1, Interpreter);
+    Zero(sv_interp, 1, PerlInterpreter);
 
     /* Init the real globals? */
     if (!linestr) {
@@ -158,9 +158,9 @@ register Interpreter *sv_interp;
     euid = (int)geteuid();
     gid = (int)getgid();
     egid = (int)getegid();
-    sprintf(patchlevel,"%3.3s%2.2d", index(rcsid,'4'), PATCHLEVEL);
+    sprintf(patchlevel,"%3.3s%2.2d", strchr(rcsid,'4'), PATCHLEVEL);
 
-    (void)sprintf(index(rcsid,'#'), "%d\n", PATCHLEVEL);
+    (void)sprintf(strchr(rcsid,'#'), "%d\n", PATCHLEVEL);
 
     fdpid = newAV();   /* for remembering popen pids by fd */
     pidstatus = newHV(COEFFSIZE);/* for remembering status of dead pids */
@@ -176,7 +176,7 @@ register Interpreter *sv_interp;
 
 void
 perl_destruct(sv_interp)
-register Interpreter *sv_interp;
+register PerlInterpreter *sv_interp;
 {
     if (!(curinterp = sv_interp))
        return;
@@ -184,15 +184,12 @@ register Interpreter *sv_interp;
     if (main_root)
        op_free(main_root);
     main_root = 0;
-    if (last_root)
-       op_free(last_root);
-    last_root = 0;
 #endif
 }
 
 void
 perl_free(sv_interp)
-Interpreter *sv_interp;
+PerlInterpreter *sv_interp;
 {
     if (!(curinterp = sv_interp))
        return;
@@ -201,7 +198,7 @@ Interpreter *sv_interp;
 
 int
 perl_parse(sv_interp, argc, argv, env)
-Interpreter *sv_interp;
+PerlInterpreter *sv_interp;
 register int argc;
 register char **argv;
 char **env;
@@ -227,9 +224,6 @@ setuid perl scripts securely.\n");
     if (main_root)
        op_free(main_root);
     main_root = 0;
-    if (last_root)
-       op_free(last_root);
-    last_root = 0;
 
     origargv = argv;
     origargc = argc;
@@ -388,10 +382,20 @@ setuid perl scripts securely.\n");
     comppad = pad;
     av_push(comppad, Nullsv);
     curpad = AvARRAY(comppad);
+    padname = newAV();
+    comppadname = padname;
+    comppadnamefill = -1;
     padix = 0;
 
     init_stack();
 
+    init_context_stack();
+
+    userinit();                /* in case linked C routines want magical variables */
+
+    allgvs = TRUE;
+    init_predump_symbols();
+
     init_lexer();
 
     /* now parse the script */
@@ -413,9 +417,13 @@ setuid perl scripts securely.\n");
        (void)UNLINK(e_tmpname);
     }
 
-    init_context_stack();
+    /* now that script is parsed, we can modify record separator */
 
-    init_predump_symbols();
+    rs = nrs;
+    rslen = nrslen;
+    rschar = nrschar;
+    rspara = (nrslen == 2);
+    sv_setpvn(GvSV(gv_fetchpv("/", TRUE)), rs, rslen);
 
     if (do_undump)
        my_unexec();
@@ -427,25 +435,21 @@ setuid perl scripts securely.\n");
 
 int
 perl_run(sv_interp)
-Interpreter *sv_interp;
+PerlInterpreter *sv_interp;
 {
     if (!(curinterp = sv_interp))
        return 255;
+    if (beginav)
+       calllist(beginav);
     switch (setjmp(top_env)) {
     case 1:
        cxstack_ix = -1;                /* start context stack again */
        break;
     case 2:
        curstash = defstash;
-       {
-           GV *gv = gv_fetchpv("END", FALSE);
-
-           if (gv && GvCV(gv)) {
-               if (!setjmp(top_env))
-                   perl_callback("END", 0, G_SCALAR, 0, 0);
-           }
-           return(statusvalue);                /* my_exit() was called */
-       }
+       if (endav)
+           calllist(endav);
+       return(statusvalue);            /* my_exit() was called */
     case 3:
        if (!restartop) {
            fprintf(stderr, "panic: restartop\n");
@@ -479,8 +483,6 @@ Interpreter *sv_interp;
        op = main_start;
        run();
     }
-    else
-       fatal("panic: perl_run");
 
     my_exit(0);
 }
@@ -508,10 +510,10 @@ I32 numargs;              /* how many args are pushed on the stack */
     ENTER;
     SAVESPTR(op);
     stack_base = AvARRAY(stack);
-    stack_sp = stack_base + sp - numargs;
+    stack_sp = stack_base + sp - numargs - 1;
     op = (OP*)&myop;
     pp_pushmark();     /* doesn't look at op, actually, except to return */
-    *stack_sp = (SV*)gv_fetchpv(subname, FALSE);
+    *++stack_sp = (SV*)gv_fetchpv(subname, FALSE);
     stack_sp += numargs;
 
     myop.op_last = hasargs ? (OP*)&myop : Nullop;
@@ -544,17 +546,6 @@ register char **argv;      /* null terminated arg list, NULL for no arglist */
     return perl_callback(subname, sp, gimme, hasargs, items);
 }
 
-void
-magicalize(list)
-register char *list;
-{
-    char sym[2];
-
-    sym[1] = '\0';
-    while (*sym = *list++)
-       magicname(sym, sym, 1);
-}
-
 void
 magicname(sym,name,namlen)
 char *sym;
@@ -590,7 +581,7 @@ char *p;
            /* (void)av_push(GvAVn(incgv), newSVpv(".", 1)); */
            p++;
        }
-       if ( (s = index(p, PERLLIB_SEP)) != Nullch ) {
+       if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
            (void)av_push(GvAVn(incgv), newSVpv(p, (I32)(s - p)));
            p = s + 1;
        } else {
@@ -649,7 +640,7 @@ char *s;
            static char debopts[] = "psltocPmfrxuLHX";
            char *d;
 
-           for (s++; *s && (d = index(debopts,*s)); s++)
+           for (s++; *s && (d = strchr(debopts,*s)); s++)
                debug |= 1 << (d - debopts);
        }
        else {
@@ -806,7 +797,7 @@ SV *sv;
     register char *s;
     I32 len;
 
-    if (dosearch && !index(scriptname, '/') && (s = getenv("PATH"))) {
+    if (dosearch && !strchr(scriptname, '/') && (s = getenv("PATH"))) {
 
        bufend = s + strlen(s);
        while (*s) {
@@ -950,6 +941,7 @@ static void
 validate_suid(validarg)
 char *validarg;
 {
+    char *s;
     /* do we need to emulate setuid on scripts? */
 
     /* This code is for those BSD systems that have setuid #! scripts disabled
@@ -1260,48 +1252,8 @@ init_context_stack()
 static void
 init_predump_symbols()
 {
-    SV *sv;
-    GV* tmpgv;
-
-    /* initialize everything that won't change if we undump */
+    GV *tmpgv;
 
-    if (siggv = gv_fetchpv("SIG",allgvs)) {
-       HV *hv;
-       SvMULTI_on(siggv);
-       hv = GvHVn(siggv);
-       hv_magic(hv, siggv, 'S');
-
-       /* initialize signal stack */
-        signalstack = newAV();
-        av_store(signalstack, 32, Nullsv);
-        av_clear(signalstack);
-        AvREAL_off(signalstack);
-    }
-
-    magicalize("!#?^~=-%.+&*()<>,\\/[|`':\004\t\020\024\027\006");
-    userinit();                /* in case linked C routines want magical variables */
-
-    ampergv = gv_fetchpv("&",allgvs);
-    leftgv = gv_fetchpv("`",allgvs);
-    rightgv = gv_fetchpv("'",allgvs);
-    sawampersand = (ampergv || leftgv || rightgv);
-    if (tmpgv = gv_fetchpv(":",allgvs))
-       sv_setpv(GvSV(tmpgv),chopset);
-
-    /* these aren't necessarily magical */
-    if (tmpgv = gv_fetchpv("\014",allgvs)) {
-       sv_setpv(GvSV(tmpgv),"\f");
-       formfeed = GvSV(tmpgv);
-    }
-    if (tmpgv = gv_fetchpv(";",allgvs))
-       sv_setpv(GvSV(tmpgv),"\034");
-    if (tmpgv = gv_fetchpv("]",allgvs)) {
-       sv = GvSV(tmpgv);
-       sv_upgrade(sv, SVt_PVNV);
-       sv_setpv(sv,rcsid);
-       SvNV(sv) = atof(patchlevel);
-       SvNOK_on(sv);
-    }
     sv_setpvn(GvSV(gv_fetchpv("\"", TRUE)), " ", 1);
 
     stdingv = gv_fetchpv("STDIN",TRUE);
@@ -1334,14 +1286,6 @@ init_predump_symbols()
     curoutgv = defoutgv;               /* switch back to STDOUT */
 
     statname = NEWSV(66,0);            /* last filename we did stat on */
-
-    /* now that script is parsed, we can modify record separator */
-
-    rs = nrs;
-    rslen = nrslen;
-    rschar = nrschar;
-    rspara = (nrslen == 2);
-    sv_setpvn(GvSV(gv_fetchpv("/", TRUE)), rs, rslen);
 }
 
 static void
@@ -1363,7 +1307,7 @@ register char **env;
                argc--,argv++;
                break;
            }
-           if (s = index(argv[0], '=')) {
+           if (s = strchr(argv[0], '=')) {
                *s++ = '\0';
                sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE)),s);
            }
@@ -1410,7 +1354,7 @@ register char **env;
        if (env != environ)
            environ[0] = Nullch;
        for (; *env; env++) {
-           if (!(s = index(*env,'=')))
+           if (!(s = strchr(*env,'=')))
                continue;
            *s++ = '\0';
            sv = newSVpv(s--,0);
@@ -1443,3 +1387,38 @@ init_perllib()
     incpush(PRIVLIB);
     (void)av_push(GvAVn(incgv),newSVpv(".",1));
 }
+
+void
+calllist(list)
+AV* list;
+{
+    I32 i;
+    I32 fill = AvFILL(list);
+    jmp_buf oldtop;
+    I32 sp = stack_sp - stack_base;
+
+    av_store(stack, ++sp, Nullsv);     /* reserve spot for 1st return arg */
+    Copy(top_env, oldtop, 1, jmp_buf);
+
+    for (i = 0; i <= fill; i++)
+    {
+       GV *gv = (GV*)av_shift(list);
+       SV* tmpsv = NEWSV(0,0);
+
+       if (gv && GvCV(gv)) {
+           gv_efullname(tmpsv, gv);
+           if (setjmp(top_env)) {
+               if (list == beginav)
+                   exit(1);
+           }
+           else {
+               perl_callback(SvPV(tmpsv), sp, G_SCALAR, 0, 0);
+           }
+       }
+       sv_free(tmpsv);
+       sv_free(gv);
+    }
+
+    Copy(oldtop, top_env, 1, jmp_buf);
+}
+
diff --git a/perl.h b/perl.h
index a8fb8bf..a697a33 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -575,7 +575,7 @@ typedef struct loop LOOP;
 
 typedef struct Outrec Outrec;
 typedef struct lstring Lstring;
-typedef struct interpreter Interpreter;
+typedef struct interpreter PerlInterpreter;
 typedef struct ff FF;
 typedef struct io IO;
 typedef struct sv SV;
@@ -784,7 +784,7 @@ double atof P((const char*));
 /* All of these are in stdlib.h or time.h for ANSI C */
 long time();
 struct tm *gmtime(), *localtime();
-char *index(), *rindex();
+char *strchr(), *strrchr();
 char *strcpy(), *strcat();
 #endif /* ! STANDARD_C */
 
@@ -849,7 +849,7 @@ int unlnk P((char*));
 /****************/
 
 /* global state */
-EXT Interpreter *curinterp;    /* currently running interpreter */
+EXT PerlInterpreter *curinterp;        /* currently running interpreter */
 extern char ** environ;        /* environment variables supplied via exec */
 EXT int                uid;            /* current real user id */
 EXT int                euid;           /* current effective user id */
@@ -857,6 +857,8 @@ EXT int             gid;            /* current real group id */
 EXT int                egid;           /* current effective group id */
 EXT bool       nomemok;        /* let malloc context handle nomem */
 EXT U32                an;             /* malloc sequence number */
+EXT U32                cop_seq;        /* statement sequence number */
+EXT U32                op_seq;         /* op sequence number */
 EXT char **    origenviron;
 EXT U32                origalen;
 
@@ -906,18 +908,30 @@ EXT char *        dc;
 EXT char *     Yes INIT("1");
 EXT char *     No INIT("");
 EXT char *     hexdigit INIT("0123456789abcdef0123456789ABCDEFx");
-EXT char *     warn_nl INIT("Unsuccessful %s on filename containing newline");
-EXT char       no_modify[] INIT("Modification of a read-only value attempted");
-EXT char       no_mem[] INIT("Out of memory!\n");
-EXT char       no_security[] INIT("Insecure dependency in %s");
-EXT char       no_sock_func[]
-                       INIT("Unsupported socket function \"%s\" called");
-EXT char       no_dir_func[]
-                       INIT("Unsupported directory function \"%s\" called");
-EXT char       no_func[] INIT("The %s function is unimplemented");
 EXT char *     patleave INIT("\\.^$@dDwWsSbB+*?|()-nrtfeaxc0123456789[{]}");
 EXT char *     vert INIT("|");
 
+EXT char *     warn_nl
+  INIT("Unsuccessful %s on filename containing newline");
+EXT char       no_usym[]
+  INIT("Can't use an undefined value to create a symbol");
+EXT char       no_aelem[]
+  INIT("Modification of non-creatable array value attempted, subscript %d");
+EXT char       no_helem[]
+  INIT("Modification of non-creatable hash value attempted, subscript \"%s\"");
+EXT char       no_modify[]
+  INIT("Modification of a read-only value attempted");
+EXT char       no_mem[]
+  INIT("Out of memory!\n");
+EXT char       no_security[]
+  INIT("Insecure dependency in %s");
+EXT char       no_sock_func[]
+  INIT("Unsupported socket function \"%s\" called");
+EXT char       no_dir_func[]
+  INIT("Unsupported directory function \"%s\" called");
+EXT char       no_func[]
+  INIT("The %s function is unimplemented");
+
 EXT SV         sv_undef;
 EXT SV         sv_no;
 EXT SV         sv_yes;
@@ -1055,8 +1069,9 @@ EXT I32           error_count;    /* how many errors so far, max 10 */
 EXT I32                subline;        /* line this subroutine began on */
 EXT SV *       subname;        /* name of current subroutine */
 
-EXT AV *       pad;            /* storage for lexically scoped temporaries */
-EXT AV *       comppad;        /* same for currently compiling routine */
+EXT AV *       comppad;        /* storage for lexically scoped temporaries */
+EXT AV *       comppadname;    /* variable names for "my" variables */
+EXT I32                comppadnamefill;/* last "introduced" variable offset */
 EXT I32                padix;          /* max used index in current "register" pad */
 EXT COP                compiling;
 
@@ -1065,6 +1080,7 @@ EXT I32           thisexpr;       /* name id for nothing_in_common() */
 EXT char *     last_uni;       /* position of last named-unary operator */
 EXT char *     last_lop;       /* position of last list operator */
 EXT bool       in_format;      /* we're compiling a run_format */
+EXT bool       in_my;          /* we're compiling a "my" declaration */
 #ifdef FCRYPT
 EXT I32                cryptseen;      /* has fast crypt() been initialized? */
 #endif
@@ -1180,7 +1196,6 @@ IEXT GV * Ileftgv;
 IEXT GV *      Iampergv;
 IEXT GV *      Irightgv;
 IEXT PMOP *    Icurpm;         /* what to do \ interps from */
-IEXT char *    Ihint;          /* hint from cop_exec to do_match et al */
 IEXT I32 *     Iscreamfirst;
 IEXT I32 *     Iscreamnext;
 IEXT I32       Imaxscream IINIT(-1);
@@ -1201,6 +1216,10 @@ IEXT HV *        Idefstash;      /* main symbol table */
 IEXT HV *      Icurstash;      /* symbol table for current package */
 IEXT HV *      Idebstash;      /* symbol table for perldb package */
 IEXT SV *      Icurstname;     /* name of current package */
+IEXT AV *      Ibeginav;       /* names of BEGIN subroutines */
+IEXT AV *      Iendav;         /* names of END subroutines */
+IEXT AV *      Ipad;           /* storage for lexically scoped temporaries */
+IEXT AV *      Ipadname;       /* variable names for "my" variables */
 
 /* memory management */
 IEXT SV *      Ifreestrroot;
@@ -1240,9 +1259,6 @@ IEXT OP * VOL     Imain_root;
 IEXT OP * VOL  Imain_start;
 IEXT OP * VOL  Ieval_root;
 IEXT OP * VOL  Ieval_start;
-IEXT OP *      Ilast_root;
-IEXT char *    Ilast_eval;
-IEXT I32       Ilast_elen;
 
 /* runtime control stuff */
 IEXT COP * VOL Icurcop IINIT(&compiling);
@@ -1265,7 +1281,7 @@ IEXT SV * bodytarget;
 IEXT SV *      toptarget;
 
 /* statics moved here for shared library purposes */
-IEXT SV        Istrchop;       /* return value from chop */
+IEXT SV                Istrchop;       /* return value from chop */
 IEXT int       Ifilemode;      /* so nextargv() can preserve mode */
 IEXT int       Ilastfd;        /* what to preserve mode on */
 IEXT char *    Ioldname;       /* what to preserve mode on */
@@ -1309,10 +1325,10 @@ extern "C" {
 };
 #endif
 
-/* The follow must follow proto.h */
+/* The following must follow proto.h */
 
 #ifdef DOINIT
-MGVTBL vtbl_sv =       {magic_get, magic_set, 0, 0, 0};
+MGVTBL vtbl_sv =       {magic_get, magic_set, magic_len, 0, 0};
 MGVTBL vtbl_env =      {0,             0,               0, 0, 0};
 MGVTBL vtbl_envelem =  {0,             magic_setenv,    0, 0, 0};
 MGVTBL vtbl_sig =      {0,             0,               0, 0, 0};
@@ -1322,6 +1338,7 @@ MGVTBL vtbl_dbmelem =     {0,             magic_setdbm,    0, 0, 0};
 MGVTBL vtbl_dbline =   {0,             magic_setdbline, 0, 0, 0};
 MGVTBL vtbl_arylen =   {magic_getarylen,magic_setarylen, 0, 0, 0};
 MGVTBL vtbl_glob =     {magic_getglob, magic_setglob,   0, 0, 0};
+MGVTBL vtbl_mglob =    {0,             magic_setmglob,  0, 0, 0};
 MGVTBL vtbl_substr =   {0,             magic_setsubstr, 0, 0, 0};
 MGVTBL vtbl_vec =      {0,             magic_setvec,    0, 0, 0};
 MGVTBL vtbl_bm =       {0,             magic_setbm,     0, 0, 0};
@@ -1337,6 +1354,7 @@ EXT MGVTBL vtbl_dbmelem;
 EXT MGVTBL vtbl_dbline;
 EXT MGVTBL vtbl_arylen;
 EXT MGVTBL vtbl_glob;
+EXT MGVTBL vtbl_mglob;
 EXT MGVTBL vtbl_substr;
 EXT MGVTBL vtbl_vec;
 EXT MGVTBL vtbl_bm;
diff --git a/perly.c b/perly.c
index abbd0a9..2909353 100644 (file)
--- a/perly.c
+++ b/perly.c
@@ -1,6 +1,8 @@
-extern char *malloc(), *realloc();
-
-# line 39 "perly.y"
+#ifndef lint
+static char yysccsid[] = "@(#)yaccpar 1.8 (Berkeley) 01/20/91";
+#endif
+#define YYBYACC 1
+#line 39 "perly.y"
 #include "EXTERN.h"
 #include "perl.h"
 
@@ -8,1741 +10,2341 @@ extern char *malloc(), *realloc();
 /*SUPPRESS 593*/
 /*SUPPRESS 595*/
 
-
-# line 50 "perly.y"
-typedef union  {
+#line 50 "perly.y"
+typedef union {
     I32        ival;
     char *pval;
     OP *opval;
     GV *gvval;
 } YYSTYPE;
-# define WORD 257
-# define METHOD 258
-# define THING 259
-# define PMFUNC 260
-# define LABEL 261
-# define FORMAT 262
-# define SUB 263
-# define PACKAGE 264
-# define WHILE 265
-# define UNTIL 266
-# define IF 267
-# define UNLESS 268
-# define ELSE 269
-# define ELSIF 270
-# define CONTINUE 271
-# define FOR 272
-# define LOOPEX 273
-# define DOTDOT 274
-# define FUNC0 275
-# define FUNC1 276
-# define FUNC 277
-# define RELOP 278
-# define EQOP 279
-# define MULOP 280
-# define ADDOP 281
-# define DOLSHARP 282
-# define DO 283
-# define LOCAL 284
-# define DELETE 285
-# define HASHBRACK 286
-# define LSTOP 287
-# define OROR 288
-# define ANDAND 289
-# define BITOROP 290
-# define BITANDOP 291
-# define UNIOP 292
-# define SHIFTOP 293
-# define MATCHOP 294
-# define ARROW 295
-# define UMINUS 296
-# define REFGEN 297
-# define POWOP 298
-# define PREINC 299
-# define PREDEC 300
-# define POSTINC 301
-# define POSTDEC 302
-#define yyclearin yychar = -1
-#define yyerrok yyerrflag = 0
-extern int yychar;
-extern int yyerrflag;
-#ifndef YYMAXDEPTH
-#define YYMAXDEPTH 150
-#endif
-YYSTYPE yylval, yyval;
-# define YYERRCODE 256
-
-# line 569 "perly.y"
- /* PROGRAM */
-int yyexca[] ={
--1, 1,
-       0, -1,
-       -2, 0,
--1, 3,
-       0, 2,
-       -2, 39,
--1, 21,
-       295, 145,
-       -2, 25,
--1, 40,
-       41, 97,
-       265, 97,
-       266, 97,
-       267, 97,
-       268, 97,
-       274, 97,
-       278, 97,
-       279, 97,
-       280, 97,
-       281, 97,
-       44, 97,
-       61, 97,
-       63, 97,
-       58, 97,
-       288, 97,
-       289, 97,
-       290, 97,
-       291, 97,
-       293, 97,
-       294, 97,
-       295, 97,
-       298, 97,
-       301, 97,
-       302, 97,
-       59, 97,
-       93, 97,
-       -2, 144,
--1, 54,
-       41, 133,
-       265, 133,
-       266, 133,
-       267, 133,
-       268, 133,
-       274, 133,
-       278, 133,
-       279, 133,
-       280, 133,
-       281, 133,
-       44, 133,
-       61, 133,
-       63, 133,
-       58, 133,
-       288, 133,
-       289, 133,
-       290, 133,
-       291, 133,
-       293, 133,
-       294, 133,
-       295, 133,
-       298, 133,
-       301, 133,
-       302, 133,
-       59, 133,
-       93, 133,
-       -2, 143,
--1, 76,
-       59, 35,
-       -2, 0,
--1, 112,
-       301, 0,
-       302, 0,
-       -2, 88,
--1, 113,
-       301, 0,
-       302, 0,
-       -2, 89,
--1, 192,
-       278, 0,
-       -2, 71,
--1, 193,
-       279, 0,
-       -2, 72,
--1, 194,
-       274, 0,
-       -2, 75,
--1, 310,
-       41, 35,
-       -2, 0,
-       };
-# define YYNPROD 152
-# define YYLAST 2258
-int yyact[]={
-
-   107,   162,   104,   105,    90,   102,   229,   103,   148,    90,
-    21,   239,    67,   104,   105,   150,   228,    91,    25,    72,
-    74,   240,   241,    80,    82,    78,    91,    92,    56,    31,
-    26,   102,    56,    58,    61,    90,    37,   132,    57,    30,
-   102,    29,    69,    68,    90,   244,   115,   117,   119,   129,
-    98,   133,    91,    92,   324,    16,   155,    77,    91,    92,
-    59,    14,    11,    12,    13,    93,   102,   152,    87,   153,
-    90,    93,   102,   157,   317,   159,    90,   315,   198,   164,
-   156,   166,   158,   168,   298,   161,   297,    38,   165,   296,
-   167,   262,   169,   170,   171,   172,   202,   210,    26,   200,
-   268,   215,   123,   220,    31,    81,    87,    56,    58,    61,
-   199,    37,   121,    57,    30,    26,    29,    87,   258,    26,
-    79,   203,    32,    73,     3,   310,    98,    99,    91,    92,
-   211,   212,   213,   214,   124,    59,   218,    98,    99,    91,
-    92,    93,   102,    71,   122,   223,    90,    97,    96,    95,
-    94,   237,    93,   102,   121,   316,   154,    90,    87,    70,
-    87,    87,    38,    87,    66,    87,   295,    31,    87,   235,
-    56,    58,    61,   318,    37,   299,    57,    30,   293,    29,
-   243,    14,    11,    12,    13,   327,   122,   325,    26,    98,
-    99,    91,    92,    87,    26,   204,    87,    32,    59,   320,
-    96,    95,    94,    26,    93,   102,    26,   255,   256,    90,
-   292,   266,   259,   174,   265,   232,    87,   234,   314,   304,
-    98,    99,    91,    92,   267,    38,    26,   323,   271,   273,
-    87,   264,   281,    94,   282,    93,   102,   284,   278,   286,
-    90,   287,   263,   289,   206,   197,   156,    56,   202,   139,
-   207,   200,    24,    54,    65,    46,    53,    26,   231,   221,
-    32,    18,    19,    22,    23,   209,    56,   294,    20,    49,
-   126,    51,    52,    63,   288,   280,   254,   300,    60,    48,
-    36,    45,    39,    62,   308,   101,   219,   160,    50,    85,
-    86,    83,    84,    33,   285,    34,    35,   312,   311,   274,
-   242,   313,    87,    87,   238,   233,    31,    87,    87,    56,
-    58,    61,   322,    37,   272,    57,    30,   149,    29,    25,
-    85,    86,    83,    84,   326,   201,   328,    24,    54,    65,
-    46,    53,    56,   137,   136,   135,    76,    59,   329,   306,
-   307,   127,   309,     8,    49,     7,    51,    52,    63,   163,
-     2,     9,    55,    60,    48,    36,    45,    39,    62,    17,
-    47,    41,    44,    50,    38,    42,   321,    43,    33,    31,
-    34,    35,    56,    58,    61,    15,    37,   270,    57,    30,
-    10,    29,     5,   208,   205,    88,     6,     4,   147,     1,
-     0,    54,    65,    46,    53,     0,    26,     0,     0,    32,
-    59,     0,     0,     0,     0,     0,     0,    49,     0,    51,
-    52,    63,     0,     0,     0,    28,    60,    48,    36,    45,
-    39,    62,     0,     0,     0,     0,    50,    38,     0,   150,
-     0,    33,    31,    34,    35,    56,    58,    61,     0,    37,
-     0,    57,    30,     0,    29,   106,   108,   109,   110,   111,
-   112,   113,    98,    99,    91,    92,     0,     0,   261,    26,
-     0,     0,    32,    59,    95,    94,     0,    93,   102,     0,
-     0,     0,    90,     0,     0,     0,    31,     0,     0,    56,
-    58,    61,     0,    37,     0,    57,    30,   236,    29,     0,
-    38,     0,     0,     0,     0,     0,   100,     0,     0,     0,
-    98,    99,    91,    92,     0,     0,     0,    59,     0,     0,
-    97,    96,    95,    94,     0,    93,   102,     0,     0,     0,
-    90,   275,    26,     0,   276,    32,     0,     0,     0,     0,
-    54,    65,    46,    53,    38,   225,   260,     0,   227,     0,
-   230,    89,     0,   101,   269,     0,    49,     0,    51,    52,
-    63,     0,     0,     0,     0,    60,    48,    36,    45,    39,
-    62,   283,     0,     0,     0,    50,    26,     0,     0,    32,
-    33,    31,    34,    35,    56,    58,    61,     0,    37,   257,
-    57,    30,     0,    29,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,    54,    65,    46,    53,   301,     0,   302,
-     0,     0,    59,     0,     0,     0,     0,     0,     0,    49,
-     0,    51,    52,    63,     0,   277,     0,   279,    60,    48,
-    36,    45,    39,    62,   319,     0,     0,     0,    50,    38,
-     0,     0,     0,    33,     0,    34,    35,     0,     0,     0,
-     0,     0,     0,   291,    89,     0,   101,     0,     0,     0,
-     0,    64,     0,     0,     0,     0,    54,    65,    46,    53,
-     0,    26,     0,     0,    32,     0,     0,     0,     0,   305,
-     0,     0,    49,     0,    51,    52,    63,     0,     0,     0,
-     0,    60,    48,    36,    45,    39,    62,    89,     0,   101,
-     0,    50,     0,     0,     0,     0,    33,     0,    34,    35,
-    54,    65,    46,    53,     0,     0,     0,     0,   138,   141,
-   142,   143,   144,   145,   146,     0,    49,   151,    51,    52,
-    63,     0,     0,     0,     0,    60,    48,    36,    45,    39,
-    62,     0,     0,     0,     0,    50,     0,     0,     0,     0,
-    33,    31,    34,    35,    56,    58,    61,     0,    37,   222,
-    57,    30,     0,    29,   100,     0,     0,     0,    98,    99,
-    91,    92,     0,     0,     0,     0,     0,     0,    97,    96,
-    95,    94,    59,    93,   102,     0,     0,     0,    90,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,    54,    65,    46,    53,    38,
-     0,   226,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,    49,     0,    51,    52,    63,     0,     0,     0,     0,
-    60,    48,    36,    45,    39,    62,     0,     0,     0,     0,
-    50,    26,     0,     0,    32,    33,    31,    34,    35,    56,
-    58,    61,     0,    37,   217,    57,    30,     0,    29,     0,
-     0,     0,     0,     0,     0,     0,     0,   100,     0,     0,
-     0,    98,    99,    91,    92,     0,     0,    59,     0,     0,
-     0,    97,    96,    95,    94,     0,    93,   102,     0,     0,
-    31,    90,     0,    56,    58,    61,     0,    37,     0,    57,
-    30,     0,    29,     0,    38,     0,     0,     0,     0,     0,
-   100,     0,     0,     0,    98,    99,    91,    92,   190,     0,
-     0,    59,     0,     0,    97,    96,    95,    94,     0,    93,
-   102,     0,     0,     0,    90,     0,    26,     0,     0,    32,
-    31,     0,     0,    56,    58,    61,     0,    37,    38,    57,
-    30,     0,    29,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,   188,     0,
-     0,    59,     0,     0,     0,    54,    65,    46,    53,     0,
-    26,     0,     0,    32,     0,     0,     0,     0,     0,     0,
-     0,    49,     0,    51,    52,    63,     0,     0,    38,     0,
-    60,    48,    36,    45,    39,    62,     0,     0,     0,     0,
-    50,     0,     0,     0,     0,    33,    31,    34,    35,    56,
-    58,    61,     0,    37,     0,    57,    30,     0,    29,     0,
-    26,     0,     0,    32,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,   186,     0,     0,    59,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-    54,    65,    46,    53,    38,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,    49,     0,    51,    52,
-    63,     0,     0,     0,     0,    60,    48,    36,    45,    39,
-    62,     0,     0,     0,     0,    50,    26,     0,     0,    32,
-    33,     0,    34,    35,    54,    65,    46,    53,     0,    31,
-     0,     0,    56,    58,    61,     0,    37,     0,    57,    30,
-    49,    29,    51,    52,    63,     0,     0,     0,     0,    60,
-    48,    36,    45,    39,    62,     0,     0,   184,     0,    50,
-    59,     0,     0,     0,    33,     0,    34,    35,     0,     0,
-     0,     0,     0,     0,    54,    65,    46,    53,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,    38,     0,     0,
-    49,     0,    51,    52,    63,     0,     0,     0,     0,    60,
-    48,    36,    45,    39,    62,     0,     0,     0,     0,    50,
-     0,     0,     0,     0,    33,     0,    34,    35,     0,    26,
-     0,     0,    32,     0,     0,     0,    31,     0,     0,    56,
-    58,    61,     0,    37,     0,    57,    30,     0,    29,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-    54,    65,    46,    53,   182,     0,     0,    59,     0,     0,
-     0,     0,     0,     0,     0,     0,    49,     0,    51,    52,
-    63,     0,     0,     0,    40,    60,    48,    36,    45,    39,
-    62,     0,     0,     0,    38,    50,     0,     0,     0,     0,
-    33,     0,    34,    35,    31,    75,     0,    56,    58,    61,
-     0,    37,     0,    57,    30,     0,    29,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,    26,     0,     0,    32,
-   125,     0,   180,   131,     0,    59,     0,     0,     0,     0,
-     0,   140,   140,   140,   140,   140,   140,     0,     0,    31,
-   140,     0,    56,    58,    61,     0,    37,     0,    57,    30,
-     0,    29,    38,    54,    65,    46,    53,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,   178,     0,    49,
-    59,    51,    52,    63,     0,     0,     0,     0,    60,    48,
-    36,    45,    39,    62,    26,     0,     0,    32,    50,     0,
-     0,     0,     0,    33,     0,    34,    35,    38,     0,     0,
-     0,   216,     0,     0,     0,    31,     0,     0,    56,    58,
-    61,     0,    37,     0,    57,    30,     0,    29,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,    26,
-     0,     0,    32,   176,     0,     0,    59,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-    54,    65,    46,    53,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,    38,     0,     0,    49,     0,    51,    52,
-    63,     0,     0,     0,     0,    60,    48,    36,    45,    39,
-    62,     0,     0,     0,     0,    50,   253,     0,     0,    89,
-    33,   101,    34,    35,     0,    26,     0,     0,    32,     0,
-     0,     0,     0,     0,    31,     0,     0,    56,    58,    61,
-     0,    37,     0,    57,    30,     0,    29,     0,    54,    65,
-    46,    53,     0,     0,     0,     0,     0,     0,     0,     0,
-   120,     0,     0,     0,    49,    59,    51,    52,    63,     0,
-     0,     0,     0,    60,    48,    36,    45,    39,    62,     0,
-     0,     0,     0,    50,     0,     0,     0,     0,    33,     0,
-    34,    35,    38,    54,    65,    46,    53,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,    49,
-     0,    51,    52,    63,     0,     0,     0,     0,    60,    48,
-    36,    45,    39,    62,    26,     0,     0,    32,    50,     0,
-     0,     0,     0,    33,     0,    34,    35,    31,     0,     0,
-    56,    58,    61,     0,    37,     0,    57,    30,     0,    29,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,    54,
-    65,    46,    53,     0,     0,     0,     0,     0,    59,     0,
-     0,     0,     0,     0,     0,    49,     0,    51,    52,    63,
-     0,     0,     0,     0,    60,    48,    36,    45,    39,    62,
-     0,     0,     0,     0,    50,    38,     0,   118,     0,    33,
-     0,    34,    35,     0,    31,     0,     0,    56,    58,    61,
-     0,    37,   116,    57,    30,     0,    29,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,    26,     0,     0,
-    32,     0,   100,     0,     0,    59,    98,    99,    91,    92,
-     0,     0,     0,     0,     0,     0,    97,    96,    95,    94,
-     0,    93,   102,     0,     0,     0,    90,     0,    54,    65,
-    46,    53,    38,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,    49,     0,    51,    52,    63,     0,
-     0,     0,     0,    60,    48,    36,    45,    39,    62,     0,
-     0,     0,     0,    50,    26,     0,     0,    32,    33,     0,
-    34,    35,    31,     0,     0,    56,    58,    61,     0,    37,
-     0,    57,    30,     0,    29,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,    59,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,    31,     0,     0,
-    56,    58,    61,     0,    37,     0,    57,    30,     0,    29,
-    38,    54,    65,    46,    53,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,    49,    59,    51,
-    52,    63,     0,     0,     0,     0,    60,    48,    36,    45,
-    39,    62,    26,     0,     0,    32,    50,     0,     0,     0,
-     0,    33,     0,    34,    35,    38,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,    54,    65,
-    46,    53,     0,     0,     0,     0,     0,    26,     0,     0,
-    32,     0,     0,     0,    49,     0,    51,    52,    63,     0,
-     0,     0,     0,    60,    48,    36,    45,    39,    62,     0,
-     0,     0,     0,    50,     0,     0,     0,     0,    33,     0,
-    34,    35,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,    54,    65,    46,    53,
-    27,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,    49,     0,    51,    52,    63,     0,     0,     0,
-     0,    60,    48,    36,    45,    39,    62,     0,     0,     0,
-     0,    50,     0,     0,     0,     0,    33,   114,    34,    35,
-     0,   130,    65,    46,    53,     0,     0,     0,     0,   128,
-     0,   134,     0,     0,     0,     0,     0,    49,     0,    51,
-    52,    63,     0,     0,     0,     0,    60,    48,    36,    45,
-    39,    62,     0,     0,     0,     0,    50,     0,     0,     0,
-     0,    33,     0,    34,    35,     0,     0,     0,   173,     0,
-   175,   177,   179,   181,   183,   185,   187,   189,   191,   192,
-   193,   194,   195,   196,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,   224,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,   245,     0,   246,
-     0,   247,     0,   248,     0,   249,     0,   250,     0,   251,
-     0,   252,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,   173,     0,     0,     0,   173,     0,     0,   173,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,   290,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,   303 };
-int yypact[]={
-
- -1000, -1000, -1000,  -200, -1000, -1000, -1000, -1000, -1000,    -4,
- -1000,   -93,  -214,  -215, -1000, -1000, -1000,   100,   103,    83,
-   296,  -246,    80,    65, -1000,    24, -1000,   626,  -288,  1719,
-  1719,  1719,  1719,  1719,  1719,  1719,  1719,  1621,  1554,  1451,
-    21, -1000, -1000,    11, -1000,   230, -1000,   301,  1764,  -220,
-  1719,   295,   294,   293, -1000, -1000,    -8,    -8,    -8,    -8,
-    -8,    -8,  1719,   277,  -280,    -8,   -25, -1000,   -25,    97,
- -1000,  1719,   -25,  1719,   -25,   247,    71, -1000,   -25,  1719,
-   -25,  1719,   -25,  1719,  1719,  1719,  1719,  1719, -1000,  1719,
-  1352,  1286,  1241,  1173,  1076,   973,   897,   847,  1719,  1719,
-  1719,  1719,  1719,   -13, -1000, -1000,  -299, -1000,  -299,  -299,
-  -299,  -299, -1000, -1000,  -222,   207,    30,   151, -1000,   206,
-   -28,  1719,  1719,  1719,  1719,   -22,   211,   803,  -222, -1000,
-   246,    63, -1000, -1000,  -222,   218,   708,  1719, -1000, -1000,
- -1000, -1000, -1000, -1000, -1000, -1000,   134, -1000,   124,  1719,
-  -271,  1719, -1000, -1000, -1000,   217,   124,  -246,   264,  -246,
-  1719,    55,    92, -1000, -1000,   263,  -248,   259,  -248,   124,
-   124,   124,   124,   626,   -80,   626,  1719,  -294,  1719,  -289,
-  1719,  -263,  1719,  -254,  1719,  -152,  1719,   -58,  1719,   174,
-  1719,   -89,  -222,  -228,  -141,  1408,  -294,   236,  1719,  1719,
-   538,    27, -1000,  1719,   443, -1000, -1000,   399, -1000,   -34,
- -1000,   149,   172,   121,   152,  1719,   -23, -1000,   207,   336,
-   273, -1000, -1000,   258,   480, -1000,   134,   197,  1719,   235,
- -1000,   -25, -1000,   -25, -1000,   207,   -25,  1719,   -25, -1000,
-   -25,   234,   -25, -1000, -1000,   626,   626,   626,   626,   626,
-   626,   626,   626,  1719,  1719,   117,   119, -1000,  1719,    73,
- -1000,   -36, -1000, -1000,   -39, -1000,   -41,   116,  1719, -1000,
- -1000,   207, -1000,   207, -1000, -1000,  1719,   178, -1000, -1000,
-  1719,  -246,  -246,   -25,  -246,    66,  -248, -1000,  1719,  -248,
-   222,   177, -1000,   -48,    62, -1000, -1000, -1000, -1000,   -51,
-   114, -1000, -1000,   583, -1000,   158, -1000, -1000,  -246, -1000,
-    71, -1000,   186, -1000, -1000, -1000, -1000, -1000,   -71, -1000,
- -1000, -1000,   146,   -25,   144,   -25,  -248, -1000, -1000, -1000 };
-int yypgo[]={
-
-     0,   389,   387,   386,   385,   325,   384,   383,     0,   124,
-   382,   380,   375,     1,    11,     8,  1980,   415,  1254,   367,
-   365,   362,   361,   360,   349,   388,   651,    56,   352,   351,
-    57,   350,   345,   343 };
-int yyr1[]={
-
-     0,    31,     1,     8,     4,     9,     9,     9,    10,    10,
-    10,    10,    24,    24,    24,    24,    24,    24,    14,    14,
-    14,    12,    12,    12,    12,    30,    30,    11,    11,    11,
-    11,    11,    11,    11,    11,    13,    13,    27,    27,    29,
-    29,     2,     2,     2,     3,     3,    32,    33,    15,    15,
-    28,    28,    28,    28,    28,    28,    28,    28,    16,    16,
-    16,    16,    16,    16,    16,    16,    16,    16,    16,    16,
-    16,    16,    16,    16,    16,    16,    16,    16,    16,    16,
-    16,    17,    17,    17,    17,    17,    17,    17,    17,    17,
-    17,    17,    17,    17,    17,    17,    17,    17,    17,    17,
-    17,    17,    17,    17,    17,    17,    17,    17,    17,    17,
-    17,    17,    17,    17,    17,    17,    17,    17,    17,    17,
-    17,    17,    17,    17,    17,    17,    17,    17,    17,    17,
-    17,    17,    17,    17,    17,    25,    25,    23,    18,    19,
-    20,    21,    22,    26,    26,    26,     5,     5,     6,     6,
-     7,     7 };
-int yyr2[]={
-
-     0,     1,     5,     9,     1,     1,     5,     5,     5,     2,
-     5,     7,     3,     3,     7,     7,     7,     7,     1,     5,
-    13,    13,    13,     9,     9,     1,     5,    15,    15,    11,
-    11,    17,    15,    21,     7,     1,     2,     1,     2,     1,
-     2,     3,     3,     3,     7,     5,     7,     7,     7,     2,
-     7,    11,     9,    13,    13,     7,     5,     9,     7,     9,
-     9,     9,     9,     9,     9,     9,     9,     7,     7,     7,
-     7,     7,     7,     7,     7,     7,     7,     7,    11,     7,
-     3,     5,     5,     5,     5,     5,     5,     5,     5,     5,
-     5,     7,     5,     7,     5,     7,     7,     3,     3,     9,
-    11,     3,     3,     3,    11,    13,    13,    11,     9,    11,
-    13,    17,     3,     3,     7,     9,     5,     5,     9,    11,
-     9,    11,     3,     5,     3,     5,     5,     3,     7,     7,
-     9,     9,    13,     2,     2,     1,     3,     5,     5,     5,
-     5,     5,     5,     3,     3,     3,     5,     3,     5,     3,
-     7,     5 };
-int yychk[]={
-
- -1000,    -1,   -31,    -9,    -2,   -10,    -3,   -32,   -33,   -29,
-   -11,   262,   263,   264,   261,   -12,    59,   -24,   265,   266,
-   272,    -8,   267,   268,   256,   -15,   123,   -16,   -17,    45,
-    43,    33,   126,   297,   299,   300,   284,    40,    91,   286,
-   -18,   -22,   -20,   -19,   -21,   285,   259,   -23,   283,   273,
-   292,   275,   276,   260,   257,   -28,    36,    42,    37,    64,
-   282,    38,   287,   277,   -26,   258,   257,    -8,   257,   257,
-    59,    40,    -8,    40,    -8,   -18,    40,   -30,   271,    40,
-    -8,    40,    -8,   267,   268,   265,   266,    44,    -4,    61,
-   298,   280,   281,   293,   291,   290,   289,   288,   278,   279,
-   274,    63,   294,   295,   301,   302,   -17,    -8,   -17,   -17,
-   -17,   -17,   -17,   -17,   -16,   -15,    41,   -15,    93,   -15,
-    59,    91,   123,    91,   123,   -18,    40,    40,   -16,    -8,
-   257,   -18,   257,    -8,   -16,    40,    40,    40,   -26,   257,
-   -18,   -26,   -26,   -26,   -26,   -26,   -26,   -25,   -15,    40,
-   295,   -26,    -8,    -8,    59,   -27,   -15,    -8,   -15,    -8,
-    40,   -15,   -13,   -24,    -8,   -15,    -8,   -15,    -8,   -15,
-   -15,   -15,   -15,   -16,    -9,   -16,    61,   -16,    61,   -16,
-    61,   -16,    61,   -16,    61,   -16,    61,   -16,    61,   -16,
-    61,   -16,   -16,   -16,   -16,   -16,   -16,   258,    91,   123,
-    44,    -5,    41,    91,    44,    -6,    93,    44,    -7,    59,
-   125,   -15,   -15,   -15,   -15,   123,   -18,    41,   -15,    40,
-    40,    41,    41,   -15,   -16,   -25,   -26,   -25,   287,   277,
-   -25,    41,   -30,    41,   -30,   -15,    -5,    59,    41,   -14,
-   269,   270,    41,   -14,   125,   -16,   -16,   -16,   -16,   -16,
-   -16,   -16,   -16,    58,    40,   -15,   -15,    41,    91,   -15,
-    93,    59,   125,    93,    59,    93,    59,   -15,   123,    -5,
-    41,   -15,    41,   -15,    41,    41,    44,   -25,    41,   -25,
-    40,    -8,    -8,    -5,    -8,   -27,    -8,    -8,    40,    -8,
-   -16,   -25,    93,    59,   -15,    93,   125,   125,   125,    59,
-   -15,    -5,    -5,   -16,    41,   -25,   -30,   -30,    -8,   -30,
-    59,   -14,   -15,   -14,    41,   125,    93,   125,    59,    41,
-    41,   -30,   -13,    41,   125,    41,    -8,    41,    -8,   -14 };
-int yydef[]={
-
-     1,    -2,     5,    -2,     6,     7,    41,    42,    43,     0,
-     9,     0,     0,     0,    40,     8,    10,     0,     0,     0,
-     0,    -2,     0,     0,    12,    13,     4,    49,    80,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-    -2,    98,   101,   102,   103,     0,   112,   113,     0,   122,
-   124,   127,     0,     0,    -2,   134,     0,     0,     0,     0,
-     0,     0,   135,     0,     0,     0,     0,    45,     0,     0,
-    11,    37,     0,     0,     0,     0,    -2,    34,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     5,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,    86,    87,    81,   145,    82,    83,
-    84,    85,    -2,    -2,    90,     0,    92,     0,    94,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,   116,   117,
-   133,    97,   123,   125,   126,     0,     0,     0,   138,   143,
-   144,   142,   140,   139,   141,   137,   135,    56,   136,   135,
-     0,   135,    44,    46,    47,     0,    38,    25,     0,    25,
-     0,    13,     0,    36,    26,     0,    18,     0,    18,    14,
-    15,    16,    17,    48,    39,    58,     0,    67,     0,    68,
-     0,    69,     0,    70,     0,    73,     0,    74,     0,    76,
-     0,    77,    -2,    -2,    -2,     0,    79,     0,     0,     0,
-     0,    91,   147,     0,     0,    93,   149,     0,    95,     0,
-    96,     0,     0,     0,     0,     0,     0,   114,     0,     0,
-     0,   128,   129,     0,     0,    50,   135,     0,   135,     0,
-    55,     0,    29,     0,    30,     0,     0,    37,     0,    23,
-     0,     0,     0,    24,     3,    59,    60,    61,    62,    63,
-    64,    65,    66,     0,   135,     0,     0,   146,     0,     0,
-   148,     0,   151,    99,     0,   108,     0,     0,     0,   115,
-   118,     0,   120,     0,   130,   131,     0,     0,    57,    52,
-   135,    25,    25,     0,    25,     0,    18,    19,     0,    18,
-    78,     0,   100,     0,     0,   107,   150,   104,   109,     0,
-     0,   119,   121,     0,    51,     0,    27,    28,    25,    32,
-    -2,    21,     0,    22,    54,   105,   106,   110,     0,   132,
-    53,    31,     0,     0,     0,     0,    18,   111,    33,    20 };
-typedef struct { char *t_name; int t_val; } yytoktype;
+#line 21 "y.tab.c"
+#define WORD 257
+#define METHOD 258
+#define THING 259
+#define PMFUNC 260
+#define PRIVATEREF 261
+#define LABEL 262
+#define FORMAT 263
+#define SUB 264
+#define PACKAGE 265
+#define WHILE 266
+#define UNTIL 267
+#define IF 268
+#define UNLESS 269
+#define ELSE 270
+#define ELSIF 271
+#define CONTINUE 272
+#define FOR 273
+#define LOOPEX 274
+#define DOTDOT 275
+#define FUNC0 276
+#define FUNC1 277
+#define FUNC 278
+#define RELOP 279
+#define EQOP 280
+#define MULOP 281
+#define ADDOP 282
+#define DOLSHARP 283
+#define DO 284
+#define LOCAL 285
+#define DELETE 286
+#define HASHBRACK 287
+#define NOAMP 288
+#define LSTOP 289
+#define OROR 290
+#define ANDAND 291
+#define BITOROP 292
+#define BITANDOP 293
+#define UNIOP 294
+#define SHIFTOP 295
+#define MATCHOP 296
+#define ARROW 297
+#define UMINUS 298
+#define REFGEN 299
+#define POWOP 300
+#define PREINC 301
+#define PREDEC 302
+#define POSTINC 303
+#define POSTDEC 304
+#define YYERRCODE 256
+short yylhs[] = {                                        -1,
+   30,    0,    7,    3,    8,    8,    8,    9,    9,    9,
+    9,   23,   23,   23,   23,   23,   23,   13,   13,   13,
+   11,   11,   11,   11,   29,   29,   10,   10,   10,   10,
+   10,   10,   10,   10,   12,   12,   26,   26,   28,   28,
+    1,    1,    1,    2,    2,   31,   31,   32,   32,   14,
+   14,   27,   27,   27,   27,   27,   27,   27,   27,   15,
+   15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
+   15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
+   15,   15,   16,   16,   16,   16,   16,   16,   16,   16,
+   16,   16,   16,   16,   16,   16,   16,   16,   16,   16,
+   16,   16,   16,   16,   16,   16,   16,   16,   16,   16,
+   16,   16,   16,   16,   16,   16,   16,   16,   16,   16,
+   16,   16,   16,   16,   16,   16,   16,   16,   16,   16,
+   16,   16,   16,   16,   16,   16,   16,   24,   24,   22,
+   17,   18,   19,   20,   21,   25,   25,   25,   25,    4,
+    4,    5,    5,    6,    6,
+};
+short yylen[] = {                                         2,
+    0,    2,    4,    0,    0,    2,    2,    2,    1,    2,
+    3,    1,    1,    3,    3,    3,    3,    0,    2,    6,
+    6,    6,    4,    4,    0,    2,    7,    7,    5,    5,
+    8,    7,   10,    3,    0,    1,    0,    1,    0,    1,
+    1,    1,    1,    3,    2,    3,    3,    3,    2,    3,
+    1,    3,    5,    4,    6,    6,    3,    2,    4,    3,
+    4,    4,    4,    4,    4,    4,    4,    4,    3,    3,
+    3,    3,    3,    3,    3,    3,    3,    3,    3,    5,
+    3,    1,    2,    2,    2,    2,    2,    2,    2,    2,
+    2,    2,    3,    2,    3,    2,    3,    3,    1,    1,
+    4,    5,    1,    1,    1,    5,    6,    6,    5,    4,
+    5,    6,    8,    1,    1,    3,    4,    3,    2,    2,
+    4,    5,    4,    5,    1,    2,    1,    2,    2,    1,
+    3,    3,    4,    4,    6,    1,    1,    0,    1,    2,
+    2,    2,    2,    2,    2,    1,    1,    1,    1,    2,
+    1,    2,    1,    3,    2,
+};
+short yydefred[] = {                                      1,
+    0,    5,    0,   40,    0,    0,    0,    6,   41,    7,
+    9,    0,   42,   43,    4,    0,   45,    0,    0,   49,
+   12,    0,    0,  114,    0,  149,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,   10,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    8,
+    0,    0,    0,    0,    0,  103,  105,  100,    0,    0,
+    0,  137,    5,   44,   47,   46,   48,  146,  148,  147,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,  126,    0,    0,    0,  144,    0,  120,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,   58,    0,
+  128,    0,    0,    0,    0,   90,   91,    0,    0,    0,
+    0,   96,    0,  140,  141,  142,  143,  145,    0,   34,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+   88,   89,    0,    0,    0,    0,    0,   11,    0,    0,
+   57,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,   36,    0,  131,  132,    0,    0,    0,
+    0,    0,    0,    0,   98,    0,    0,   97,  118,   52,
+    0,  151,    0,    0,    0,  153,   95,   26,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,  116,    0,    0,    0,    3,  134,    0,    0,
+   29,    0,   30,    0,    0,    0,   23,    0,   24,    0,
+    0,    0,  133,   59,    0,  121,    0,  123,    0,    0,
+    0,    0,  155,    0,  150,    0,  152,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+  101,    0,  110,  117,    0,   54,    0,    0,    0,    0,
+   19,    0,    0,    0,    0,    0,   53,  122,  124,    0,
+    0,  154,  109,    0,    0,    0,    0,  102,  106,  111,
+    0,  135,   27,   28,   21,    0,   22,    0,   32,    0,
+    0,  112,  108,  107,   56,   55,    0,    0,   31,    0,
+    0,    0,  113,   20,   33,
+};
+short yydgoto[] = {                                       1,
+    8,    9,   73,  194,  197,  188,   79,    3,   10,   11,
+   60,  172,  247,  108,   62,   63,   64,   65,   66,   67,
+   68,   69,  174,  109,   71,  164,   72,   12,  130,    2,
+   13,   14,
+};
+short yysindex[] = {                                      0,
+    0,    0,   20,    0, -122, -241,  -57,    0,    0,    0,
+    0,  606,    0,    0,    0,  -84,    0,  -32,   39,    0,
+    0,    0,  -33,    0,   19,    0,  -28,  -23,  -21,  -19,
+  169, -143,   77,   83,  107,  -33, 2774, 2835,  172,  884,
+ -108, 2835, 2835, 2835, 2835, 2835, 2835, 2835,  945,    0,
+ 2835, 2835,  992,  -33,  -33,  -33,  -33,  -33, -106,    0,
+  -14, 1210,  -59,  -60,  -58,    0,    0,    0,  143,  159,
+  -76,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+ 2835, 2835, 2835,  -84, 2835,  -84, 2835,  -84, 2835,  -84,
+ 1056,  194,    0,  201, 1262, 2835,    0,  209,    0,   -1,
+  -30,   -1,  223,  147,  139,   28, 2835,  231,    0, 1323,
+    0,   -1, -237, -237, -237,    0,    0,  182,  115, -237,
+ -237,    0,  -18,    0,    0,    0,    0,    0,  -84,    0,
+ 2835, 2835, 2835, 2835, 2835, 2835, 2835, 2835, 1370, 1434,
+ 2835, 2835, 1640, 1701, 1748, 1812, 2018, 2835, 2079,  -87,
+    0,    0, 2835, 2835, 2835, 2835, 2126,    0,  -92, -119,
+    0, 4249,  231,  245, -106,  141, -106,  217,  -44,  246,
+  -44,  233,  -36,    0, 2835,    0,    0,  257,  255, 1323,
+ 2190, 2396,  181, 2835,    0, 2457,  184,    0,    0,    0,
+ 2835,    0, 2504,  215, 2568,    0,    0,    0,  231,  231,
+  231,  231, 1210,  -89,   -1, -174, 2835,  -40, 2835, -236,
+ 1210,  409, 2835,  345, 2835,  376, 2835, -238, 2835,  382,
+ 2835, -247,   16, 2835,   16, 2835,  270, 2835,   68,  -16,
+   75,  -15,    0,  115,  271, 2835,    0,    0, 2835,  -84,
+    0,  -84,    0,  -84,  -84,  277,    0,  -84,    0, 2835,
+  -84,  115,    0,    0,  278,    0,  115,    0,  115, 2835,
+   96,  193,    0,   -4,    0, 2835,    0, 1210, 1210, 2835,
+ 1210, 1210, 1210, 1210, 1210, 1210,  116, 2835,    3,  196,
+    0,  199,    0,    0, 2835,    0, 4397, -106, -106,  -44,
+    0, 2835,  -44,  266, -106,  -84,    0,    0,    0,  136,
+  203,    0,    0,    4, 1102,  218,  303,    0,    0,    0,
+  304,    0,    0,    0,    0,  264,    0, 1056,    0, -106,
+  228,    0,    0,    0,    0,    0,  -84,  307,    0,  313,
+  -44,  -84,    0,    0,    0,
+};
+short yyrindex[] = {                                      0,
+    0,    0,  229,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,  496,    0,    0,    0,    0,    0,    0,    0,    0,
+    0, 2708, 2864,    0,    0,    0,    0,    0,    0,    0,
+    0, 2904, 2978,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,   73,    0,
+   11,  363, 4373,  557, 3023,    0,    0,    0, 3161,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+ 2904,    0,  322,    0,    0,    0,    0,    0,    0,    0,
+  305,    0,    0,    0,    0,  324,    0, 3236,    0, 2284,
+ 3280, 3735,    0,    0,    0,    0, 2904, 3408,    0, 3449,
+    0, 3768, 4128, 4182, 4218,    0,    0, 3319,    0, 4284,
+ 4320,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,  678,
+    0,    0,   15,    0,  125,    0,  125,    0,  177,    0,
+  177,    0,  309,    0,    0,    0,    0,    0,    0,  324,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0, 3362,    0,    0,    0,    0,   79,   98,
+  128,  135,  860,  958, 3834, 3867,    0, 1906,    0, 1150,
+ 1575,    0,    0, 1021,    0, 4047,    0, 4005,    0, 3915,
+    0, 1528, 3577,    0, 3702,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0, 2904,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,  310,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0, 1953, 2331,    0,
+ 2667, 3620, 3907, 3931, 4037, 4063,    0,  324,    0,    0,
+    0,    0,    0,    0,  324,    0,    0,  125,  125,  177,
+    0,    0,  177,    0,  125,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,   10,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,  325,    0,  125,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+  177,    0,    0,    0,    0,
+};
+short yygindex[] = {                                      0,
+    0,    0,    0, -158,    0,    0,   -5,  298,    0,    0,
+    0,   55, -157,   -3, 4489,  520,  488,    0,    0,    0,
+    0,    0,  364,  216,  527,  127,    0,    0, -147,    0,
+    0,    0,
+};
+#define YYTABLESIZE 4759
+short yytable[] = {                                      17,
+   15,   20,   55,  228,  192,  237,   59,  193,   61,  182,
+   74,   83,   76,  249,  251,   18,   85,  241,   87,  243,
+   89,   84,   86,   88,   90,  195,   75,  135,  135,  135,
+  154,   99,  156,  139,  140,  226,  106,  111,   15,  135,
+  137,  138,  139,  140,  139,  119,  135,  135,  148,  123,
+   80,   13,  149,   80,  146,   38,  147,  148,   82,  148,
+  154,  149,  153,  149,  155,  151,  152,   80,   80,   13,
+   80,  186,   25,   38,  196,  284,  281,  283,  165,  163,
+  167,  166,  169,  168,  171,  170,  187,  173,  303,   15,
+   15,  178,  153,  296,   15,  308,  323,   77,  298,   15,
+  299,   15,   80,   15,  137,   25,  139,  140,   25,   25,
+   25,  135,   25,   93,   25,   25,   94,   25,  135,   16,
+  147,  148,   95,  198,   25,  149,  280,  199,  200,  201,
+  202,   25,  315,  282,   16,  317,   25,   16,   17,  135,
+  313,  314,    4,    5,    6,    7,   96,  319,  107,  229,
+  230,  231,  232,  234,  301,  192,   17,   25,  193,  135,
+   25,   25,   25,   25,   25,  129,   25,   25,   14,   25,
+  227,  252,  329,  334,  306,   15,   18,  257,  259,  135,
+  261,  242,  157,   25,  135,  235,   14,  264,   25,  137,
+  138,  139,  140,   15,  321,   25,  236,   25,   25,   19,
+  143,  144,  145,  146,   55,  147,  148,   55,   91,   18,
+  149,  103,   18,   18,   18,   25,   18,  158,   18,   18,
+  159,   18,  277,   78,  279,  245,  246,   26,    2,  131,
+  132,  133,  134,  175,  288,   18,  289,  150,  290,  291,
+   18,  176,  293,  151,  152,  295,  163,   25,  181,   25,
+   25,  131,  132,  133,  134,  148,  300,  244,   55,  149,
+  135,   39,  304,  185,   39,   39,   39,   18,   39,  184,
+   39,   39,  191,   39,  135,   80,   80,   80,   80,  139,
+  140,    4,    5,    6,    7,  240,  248,   39,  316,  135,
+  320,  250,   39,  147,  148,  254,  161,  253,  149,   18,
+  135,   18,   18,  260,  327,  266,   80,  135,  263,  278,
+  285,  179,   80,   80,   61,  149,  292,  302,  297,   39,
+  309,  331,  189,  310,  318,  190,  335,  322,   25,   25,
+   25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+   25,   25,  324,  325,  326,   25,   25,  332,   25,   25,
+   25,   39,  330,  333,   39,   25,   25,   25,   25,   25,
+   25,   25,   37,   35,  138,   35,   25,   13,   37,  148,
+  160,   25,  328,   25,   25,   70,  294,    0,    0,    0,
+   25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+   25,   25,   25,   25,    0,  255,    0,   25,   25,    0,
+   25,   25,   25,   51,    0,    0,   51,   25,   25,   25,
+   25,   25,   25,   25,    0,    0,    0,    0,   25,    0,
+   51,   51,    0,   25,    0,   25,   25,    0,    0,    0,
+    0,    0,   18,   18,   18,   18,   18,   18,   18,   18,
+   18,   18,   18,   18,   18,   18,    0,    0,    0,   18,
+   18,  286,   18,   18,   18,   51,    0,    0,    0,   18,
+   18,   18,   18,   18,   18,   18,  270,    0,    0,  141,
+   18,  142,    0,    0,    0,   18,    0,   18,   18,    0,
+    0,    0,    0,    0,   39,   39,   39,   39,   39,   39,
+    0,    0,    0,  307,   39,   39,   39,   39,    0,    0,
+  311,   39,   39,    0,   39,   39,   39,    0,    0,    0,
+   80,   39,   39,   39,   39,   39,   39,   39,   92,    0,
+    0,    0,   39,   80,  101,    0,  104,   39,  146,   39,
+   39,  146,  146,  146,    0,  146,  136,  146,  146,  136,
+  146,   80,   80,   80,   80,   80,    0,    0,    0,   81,
+    0,    0,    0,  136,  136,    0,  136,    0,  136,  146,
+    0,    0,   97,  113,  114,  115,  116,  117,  110,    0,
+  120,  121,    0,    0,    0,    0,    0,    0,    0,    0,
+  124,  125,  126,  127,  128,    0,  146,    0,  136,  147,
+  183,    0,  147,  147,  147,    0,  147,   99,  147,  147,
+   99,  147,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,   99,   99,    0,   99,  146,   99,
+  147,  146,  180,  137,  138,  139,  140,    0,   51,   51,
+   51,   51,    0,    0,    0,  144,  145,  146,   44,  147,
+  148,   55,   57,   54,  149,   49,    0,   58,   52,   99,
+   51,    0,    0,    0,  137,  138,  139,  140,    0,   51,
+  137,  138,  139,  140,   50,   51,   51,  145,  146,   56,
+  147,  148,    0,    0,    0,  149,  147,  148,    0,    0,
+    0,  149,  147,  136,    0,    0,    0,  137,  138,  139,
+  140,    0,    0,    0,    0,    0,   53,    0,  143,  144,
+  145,  146,    0,  147,  148,    0,    0,    0,  149,    0,
+   39,    0,    0,   39,   39,   39,    0,   39,    0,   39,
+   39,    0,   39,    0,    0,    0,    0,    0,   15,    0,
+    0,   45,    0,    0,    0,    0,   39,    0,    0,    0,
+    0,   39,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,  146,  146,  146,  146,  146,    0,    0,    0,
+    0,  136,  136,  136,  136,    0,    0,    0,   39,  146,
+  136,  146,  146,  146,  136,  136,  136,  136,  146,  146,
+  146,  146,  146,  146,  146,  136,  136,  136,  136,  146,
+  136,  136,  136,    0,  146,  136,  146,  146,  136,  136,
+   39,    0,    0,   39,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,  147,  147,  147,  147,  147,    0,    0,
+    0,    0,   99,   99,   99,   99,    0,    0,    0,    0,
+  147,   99,  147,  147,  147,   99,   99,   99,   99,  147,
+  147,  147,  147,  147,  147,  147,   99,   99,   99,   99,
+  147,   99,   99,   99,    0,  147,   99,  147,  147,   99,
+   99,   21,   22,   23,   24,   25,   26,    0,    0,    0,
+    0,   27,   28,   29,   30,    0,    0,    0,   31,   32,
+    0,   33,   34,   35,    0,    0,    0,    0,   36,   37,
+   38,   39,   40,   41,   42,    0,    0,    0,    0,   43,
+   50,    0,    0,   50,   46,    0,   47,   48,    0,    0,
+    0,    0,    0,    0,    0,    0,   44,   50,   50,   55,
+   57,   54,    0,   49,    0,   58,   52,    0,   51,    0,
+    0,    0,    0,   39,   39,   39,   39,   39,   39,    0,
+    0,    0,  105,   39,   39,   39,   39,   56,    0,    0,
+   39,   39,   50,   39,   39,   39,    0,    0,    0,    0,
+   39,   39,   39,   39,   39,   39,   39,    0,    0,    0,
+    0,   39,    0,    0,   53,    0,   39,   44,   39,   39,
+   55,   57,   54,    0,   49,  118,   58,   52,    0,   51,
+    0,    0,    0,    0,    0,    0,    0,    0,   77,    0,
+    0,   77,    0,    0,    0,    0,   15,    0,   56,   45,
+    0,    0,    0,    0,    0,   77,   77,    0,   77,    0,
+   77,    0,    0,    0,   44,    0,    0,   55,   57,   54,
+    0,   49,    0,   58,   52,   53,   51,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+   77,    0,    0,    0,    0,   56,    0,    0,    0,    0,
+    0,   79,    0,    0,   79,    0,    0,   15,    0,    0,
+   45,    0,    0,    0,    0,    0,    0,    0,   79,   79,
+    0,   79,   53,   79,  122,    0,    0,    0,   44,    0,
+    0,   55,   57,   54,    0,   49,    0,   58,   52,    0,
+   51,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,   79,   15,    0,    0,   45,    0,   56,
+    0,    0,    0,    0,    0,   50,   50,   50,   50,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+   22,   23,   24,   25,   26,    0,   53,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,   50,   32,    0,   33,
+   34,   35,   50,   50,  142,    0,   36,   37,   38,   39,
+   40,   41,   42,    0,    0,    0,    0,   43,   15,    0,
+    0,   45,   46,    0,   47,   48,    0,    0,    0,    0,
+   71,    0,    0,   71,    0,    0,    0,    0,    0,    0,
+    0,   22,   23,   24,   25,   26,    0,   71,   71,    0,
+   71,    0,   71,    0,    0,    0,    0,    0,   32,    0,
+   33,   34,   35,   77,   77,   77,   77,   36,   37,   38,
+   39,   40,   41,   42,    0,    0,    0,    0,   43,    0,
+    0,    0,   71,   46,    0,   47,   48,    0,   22,   23,
+   24,   25,   26,    0,   77,    0,    0,    0,    0,    0,
+   77,   77,    0,    0,    0,   32,    0,   33,   34,   35,
+  141,    0,  142,    0,   36,   37,   38,   39,   40,   41,
+   42,    0,    0,    0,    0,   43,   79,   79,   79,   79,
+   46,    0,   47,   48,   44,   79,    0,   55,   57,   54,
+    0,   49,  177,   58,   52,    0,   51,    0,    0,    0,
+   79,   21,   22,   23,   24,   25,   26,   79,    0,    0,
+    0,    0,    0,   79,   79,   56,    0,    0,    0,   32,
+    0,   33,   34,   35,    0,    0,    0,    0,   36,   37,
+   38,   39,   40,   41,   42,    0,    0,    0,    0,   43,
+    0,    0,   53,    0,   46,   44,   47,   48,   55,   57,
+   54,    0,   49,    0,   58,   52,    0,   51,    0,    0,
+    0,    0,    0,    0,    0,    0,  136,    0,    0,    0,
+  137,  138,  139,  140,   15,    0,   56,   45,    0,    0,
+    0,  143,  144,  145,  146,    0,  147,  148,    0,    0,
+    0,  149,   44,    0,    0,   55,   57,   54,    0,   49,
+    0,   58,   52,   53,   51,   71,   71,   71,   71,    0,
+    0,    0,    0,    0,   71,    0,    0,    0,   71,   71,
+  207,   71,    0,   56,    0,    0,    0,    0,    0,   71,
+   71,   71,   71,    0,   71,   15,   71,    0,   45,    0,
+    0,    0,   71,   71,    0,    0,    0,    0,    0,    0,
+   53,    0,    0,    0,    0,    0,   44,    0,    0,   55,
+   57,   54,    0,   49,    0,   58,   52,    0,   51,    0,
+    0,    0,    0,    0,  136,    0,    0,    0,  137,  138,
+  139,  140,   15,    0,  209,   45,    0,   56,    0,  143,
+  144,  145,  146,    0,  147,  148,    0,    0,    0,  149,
+    0,    0,    0,    0,    0,    0,    0,    0,   22,   23,
+   24,   25,   26,    0,   53,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,   32,    0,   33,   34,   35,
+    0,    0,    0,    0,   36,   37,   38,   39,   40,   41,
+   42,    0,    0,    0,    0,   43,   15,    0,    0,   45,
+   46,    0,   47,   48,    0,    0,    0,    0,   72,    0,
+    0,   72,    0,    0,    0,    0,    0,    0,    0,   22,
+   23,   24,   25,   26,    0,   72,   72,    0,   72,    0,
+   72,    0,    0,    0,    0,    0,   32,    0,   33,   34,
+   35,    0,    0,    0,    0,   36,   37,   38,   39,   40,
+   41,   42,    0,    0,    0,   60,   43,    0,   60,  159,
+   72,   46,    0,   47,   48,    0,   22,   23,   24,   25,
+   26,    0,   60,   60,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,   32,    0,   33,   34,   35,    0,    0,
+    0,    0,   36,   37,   38,   39,   40,   41,   42,    0,
+    0,    0,    0,   43,    0,    0,    0,   60,   46,    0,
+   47,   48,   44,    0,    0,   55,   57,   54,    0,   49,
+    0,   58,   52,    0,   51,    0,    0,    0,    0,    0,
+   22,   23,   24,   25,   26,    0,    0,    0,    0,    0,
+  213,    0,    0,   56,    0,    0,    0,   32,    0,   33,
+   34,   35,    0,    0,    0,    0,   36,   37,   38,   39,
+   40,   41,   42,    0,    0,    0,    0,   43,    0,    0,
+   53,    0,   46,   44,   47,   48,   55,   57,   54,    0,
+   49,    0,   58,   52,    0,   51,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,  215,   15,    0,   56,   45,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+   44,    0,    0,   55,   57,   54,    0,   49,    0,   58,
+   52,   53,   51,   72,   72,   72,   72,    0,    0,    0,
+    0,    0,   72,    0,    0,    0,   72,   72,  217,    0,
+    0,   56,    0,    0,    0,    0,    0,   72,   72,   72,
+   72,    0,   72,   15,   72,    0,   45,    0,    0,    0,
+   72,   72,    0,    0,    0,    0,    0,    0,   53,    0,
+   60,   60,   60,   60,   44,    0,    0,   55,   57,   54,
+    0,   49,    0,   58,   52,    0,   51,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+   15,   60,  219,   45,    0,   56,    0,   60,   60,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,   22,   23,   24,   25,
+   26,    0,   53,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,   32,    0,   33,   34,   35,    0,    0,
+    0,    0,   36,   37,   38,   39,   40,   41,   42,    0,
+    0,    0,    0,   43,   15,    0,    0,   45,   46,    0,
+   47,   48,    0,    0,    0,    0,   70,    0,    0,   70,
+    0,    0,    0,    0,    0,    0,    0,   22,   23,   24,
+   25,   26,    0,   70,   70,    0,   70,    0,   70,    0,
+    0,    0,    0,    0,   32,    0,   33,   34,   35,    0,
+    0,    0,    0,   36,   37,   38,   39,   40,   41,   42,
+    0,    0,    0,   62,   43,    0,   62,    0,   70,   46,
+    0,   47,   48,    0,   22,   23,   24,   25,   26,    0,
+   62,   62,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,   32,    0,   33,   34,   35,    0,    0,    0,    0,
+   36,   37,   38,   39,   40,   41,   42,    0,    0,    0,
+    0,   43,    0,    0,    0,   62,   46,    0,   47,   48,
+   44,    0,    0,   55,   57,   54,    0,   49,    0,   58,
+   52,    0,   51,    0,    0,    0,    0,    0,   22,   23,
+   24,   25,   26,    0,    0,    0,    0,    0,  221,    0,
+    0,   56,    0,    0,    0,   32,    0,   33,   34,   35,
+    0,    0,    0,    0,   36,   37,   38,   39,   40,   41,
+   42,    0,    0,    0,    0,   43,    0,    0,   53,    0,
+   46,   44,   47,   48,   55,   57,   54,    0,   49,    0,
+   58,   52,    0,   51,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,  224,
+   15,    0,   56,   45,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,   44,    0,
+    0,   55,   57,   54,    0,   49,  233,   58,   52,   53,
+   51,   70,   70,   70,   70,    0,    0,    0,    0,    0,
+   70,    0,    0,    0,   70,   70,   70,   70,    0,   56,
+    0,    0,    0,    0,    0,   70,   70,   70,   70,    0,
+   70,   15,   70,    0,   45,    0,    0,    0,   70,   70,
+    0,    0,    0,    0,    0,    0,   53,    0,   62,   62,
+   62,   62,   44,    0,    0,   55,   57,   54,    0,   49,
+  256,   58,   52,    0,   51,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,   15,   62,
+    0,   45,    0,   56,    0,   62,   62,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,   22,   23,   24,   25,   26,    0,
+   53,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,   32,    0,   33,   34,   35,    0,    0,    0,    0,
+   36,   37,   38,   39,   40,   41,   42,    0,    0,    0,
+    0,   43,   15,    0,    0,   45,   46,    0,   47,   48,
+    0,    0,    0,    0,  119,    0,    0,  119,    0,    0,
+    0,    0,    0,    0,    0,   22,   23,   24,   25,   26,
+    0,  119,  119,    0,  119,    0,  119,    0,    0,    0,
+    0,    0,   32,    0,   33,   34,   35,    0,    0,    0,
+    0,   36,   37,   38,   39,   40,   41,   42,    0,    0,
+    0,   63,   43,    0,   63,    0,  119,   46,    0,   47,
+   48,    0,   22,   23,   24,   25,   26,    0,   63,   63,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,   32,
+    0,   33,   34,   35,    0,    0,    0,    0,   36,   37,
+   38,   39,   40,   41,   42,    0,    0,    0,    0,   43,
+    0,    0,    0,   63,   46,    0,   47,   48,   44,    0,
+    0,   55,   57,   54,    0,   49,  258,   58,   52,    0,
+   51,    0,    0,    0,    0,    0,   22,   23,   24,   25,
+   26,    0,    0,    0,    0,    0,    0,    0,    0,   56,
+    0,    0,    0,   32,    0,   33,   34,   35,    0,    0,
+    0,    0,   36,   37,   38,   39,   40,   41,   42,    0,
+    0,    0,    0,   43,    0,    0,   53,    0,   46,   44,
+   47,   48,   55,   57,   54,    0,   49,    0,   58,   52,
+    0,   51,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,  262,    0,    0,   15,    0,
+   56,   45,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,   44,    0,    0,   55,
+   57,   54,    0,   49,  265,   58,   52,   53,   51,  119,
+  119,  119,  119,    0,    0,    0,    0,    0,  119,    0,
+    0,    0,  119,  119,    0,    0,    0,   56,    0,    0,
+    0,    0,    0,  119,  119,  119,  119,    0,    0,   15,
+  119,    0,   45,    0,    0,    0,  119,  119,    0,    0,
+    0,    0,    0,    0,   53,    0,   63,   63,   63,   63,
+   44,    0,    0,   55,   57,   54,    0,   49,    0,   58,
+   52,    0,   51,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,   15,   63,    0,   45,
+    0,   56,    0,   63,   63,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,   22,   23,   24,   25,   26,    0,   53,    0,
+  267,    0,    0,    0,    0,    0,    0,    0,    0,   32,
+    0,   33,   34,   35,    0,    0,    0,    0,   36,   37,
+   38,   39,   40,   41,   42,    0,    0,    0,    0,   43,
+   15,    0,    0,   45,   46,    0,   47,   48,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,   68,    0,    0,
+   68,    0,    0,   22,   23,   24,   25,   26,    0,    0,
+    0,    0,    0,    0,   68,   68,    0,    0,    0,    0,
+   32,    0,   33,   34,   35,    0,    0,    0,    0,   36,
+   37,   38,   39,   40,   41,   42,    0,    0,  125,    0,
+   43,  125,    0,    0,    0,   46,    0,   47,   48,   68,
+   22,   23,   24,   25,   26,  125,  125,    0,  125,    0,
+  125,    0,    0,    0,    0,    0,    0,   32,    0,   33,
+   34,   35,    0,    0,    0,    0,   36,   37,   38,   39,
+   40,   41,   42,    0,    0,    0,    0,   43,    0,    0,
+  125,    0,   46,    0,   47,   48,   44,    0,    0,   55,
+   57,   54,    0,   49,    0,   58,   52,    0,   51,    0,
+    0,    0,    0,    0,   22,   23,   24,   25,   26,    0,
+    0,    0,    0,    0,    0,    0,    0,   56,    0,    0,
+    0,   32,    0,   33,   34,   35,    0,    0,    0,    0,
+   36,   37,   38,   39,   40,   41,   42,    0,    0,    0,
+    0,   43,    0,    0,   53,    0,   46,   44,   47,   48,
+   55,   57,   54,    0,   49,    0,   58,   52,    0,   51,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,   15,    0,   56,   45,
+    0,    0,    0,    0,  130,    0,    0,  130,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,  130,  130,    0,  130,   53,  130,    0,    0,    0,
+    0,    0,   68,   68,   68,   68,    0,    0,    0,    0,
+    0,    0,    0,    0,  138,    0,    0,  138,    0,    0,
+    0,    0,    0,    0,    0,    0,  130,   15,    0,    0,
+   45,  138,  138,   68,  138,    0,  138,    0,    0,   68,
+   68,    0,    0,  125,  125,  125,  125,    0,    0,    0,
+    0,    0,  125,    0,    0,    0,  125,  125,  125,  125,
+    0,    0,    0,    0,    0,    0,  138,  125,  125,  125,
+  125,    0,  125,  125,  125,    0,    0,  125,    0,    0,
+  125,  125,    0,    0,    0,    0,    0,    0,  127,    0,
+    0,  127,    0,    0,    0,    0,    0,    0,    0,    0,
+   98,   23,   24,   25,   26,  127,  127,    0,  127,    0,
+  127,    0,    0,    0,    0,    0,    0,   32,    0,   33,
+   34,   35,    0,    0,    0,    0,   36,   37,   38,   39,
+   40,   41,   42,  104,    0,    0,  104,   43,    0,    0,
+  127,    0,   46,    0,   47,   48,    0,    0,    0,    0,
+  104,  104,    0,  104,    0,  104,    0,    0,    0,    0,
+    0,   22,   23,   24,   25,   26,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,   32,    0,
+   33,   34,   35,    0,    0,  104,    0,   36,   37,   38,
+   39,   40,   41,   42,    0,    0,    0,    0,   43,  130,
+  130,  130,  130,   46,    0,   47,   48,    0,  130,    0,
+    0,    0,  130,  130,  130,  130,    0,    0,    0,    0,
+    0,    0,    0,  130,  130,  130,  130,    0,  130,  130,
+  130,    0,    0,  130,    0,    0,  130,  130,    0,  138,
+  138,  138,  138,    0,    0,    0,    0,    0,  138,    0,
+    0,    0,  138,  138,  138,  138,    0,    0,    0,    0,
+    0,    0,    0,  138,  138,  138,  138,    0,  138,  138,
+  138,  115,    0,  138,  115,    0,  138,  138,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,  115,  115,
+    0,  115,    0,  115,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,  127,  127,  127,  127,    0,    0,    0,
+    0,    0,  127,  115,    0,    0,  127,  127,  127,  127,
+    0,    0,    0,    0,    0,    0,    0,  127,  127,  127,
+  127,    0,  127,  127,  127,    0,  136,  127,    0,  136,
+  127,  127,    0,    0,    0,    0,    0,    0,  104,  104,
+  104,  104,    0,  136,  136,    0,  136,  104,  136,    0,
+    0,  104,  104,  104,  104,    0,    0,    0,    0,    0,
+    0,    0,  104,  104,  104,  104,    0,  104,  104,  104,
+   99,    0,  104,   99,    0,  104,  104,    0,  136,    0,
+    0,    0,    0,    0,    0,    0,    0,   99,   99,    0,
+   99,    0,   99,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,   94,
+    0,    0,   94,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,   99,    0,    0,    0,   94,   94,    0,   94,
+    0,   94,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,   93,    0,    0,   93,    0,    0,    0,    0,
+    0,   94,    0,    0,    0,    0,    0,    0,    0,   93,
+   93,    0,   93,    0,   93,    0,  115,  115,  115,  115,
+    0,    0,    0,    0,    0,  115,    0,    0,    0,  115,
+  115,  115,  115,    0,    0,    0,    0,    0,  139,    0,
+  115,  115,  115,  115,   93,  115,  115,  115,    0,    0,
+  115,    0,    0,  115,  115,  139,  139,    0,  139,    0,
+  139,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,  138,
+    0,    0,  138,    0,    0,    0,    0,    0,    0,    0,
+  139,  136,  136,  136,  136,    0,  138,  138,    0,  138,
+  136,  138,    0,    0,  136,  136,  136,  136,    0,    0,
+    0,    0,    0,    0,    0,  136,  136,  136,  136,    0,
+  136,  136,  136,    0,    0,  136,    0,    0,  136,  136,
+    0,  138,    0,    0,    0,   99,   99,   99,   99,    0,
+    0,    0,    0,    0,   99,    0,    0,    0,   99,   99,
+   99,   99,    0,    0,    0,    0,    0,    0,    0,   99,
+   99,   99,   99,    0,   99,   99,   99,    0,    0,   99,
+    0,    0,   99,   99,   94,   94,   94,   94,    0,    0,
+    0,    0,    0,   94,    0,    0,    0,   94,   94,   94,
+   94,    0,    0,    0,    0,    0,    0,    0,   94,   94,
+   94,   94,    0,   94,   94,   94,    0,   81,   94,    0,
+   81,   94,   94,    0,    0,    0,    0,   93,   93,   93,
+   93,    0,    0,    0,   81,   81,   93,   81,    0,   81,
+   93,   93,   93,   93,    0,    0,    0,    0,    0,    0,
+    0,   93,   93,   93,   93,    0,   93,   93,   93,    0,
+   67,   93,    0,   67,   93,   93,    0,    0,    0,   81,
+    0,    0,    0,  139,  139,  139,  139,   67,   67,    0,
+    0,    0,  139,    0,    0,    0,  139,  139,  139,  139,
+    0,    0,    0,    0,    0,    0,    0,  139,  139,  139,
+  139,    0,  139,  139,  139,    0,    0,  139,    0,    0,
+  139,  139,   67,    0,  138,  138,  138,  138,    0,    0,
+    0,    0,    0,  138,    0,    0,    0,  138,  138,  138,
+  138,    0,    0,    0,    0,    0,    0,    0,  138,  138,
+  138,  138,   69,  138,  138,   69,    0,    0,  138,    0,
+    0,  138,  138,    0,    0,    0,    0,    0,    0,   69,
+   69,    0,   69,    0,   69,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,   92,    0,    0,   92,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,   92,   92,   69,   92,    0,   92,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,  129,    0,
+    0,  129,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,  129,  129,   92,  129,    0,
+  129,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,   81,   81,   81,   81,    0,    0,    0,    0,
+    0,   81,    0,    0,    0,   81,   81,   81,   81,    0,
+  129,    0,    0,    0,    0,    0,   81,   81,   81,   81,
+    0,   81,   81,   81,   73,    0,    0,   73,    0,   81,
+   81,    0,    0,    0,    0,   67,   67,   67,   67,    0,
+    0,   73,   73,    0,   73,    0,   73,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,   74,    0,    0,
+   74,    0,    0,    0,    0,    0,   67,    0,    0,    0,
+    0,    0,   67,   67,   74,   74,   73,   74,    0,   74,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,   66,    0,    0,
+   66,    0,    0,    0,    0,   75,    0,    0,   75,   74,
+    0,    0,    0,    0,   66,   66,    0,   69,   69,   69,
+   69,   65,   75,   75,   65,   75,   69,   75,    0,    0,
+   69,   69,   69,   69,    0,    0,    0,    0,   65,   65,
+    0,   69,   69,   69,   69,    0,   69,   69,   69,   66,
+   92,   92,   92,   92,   69,   69,    0,   75,    0,   92,
+    0,    0,    0,   92,   92,    0,    0,    0,    0,    0,
+    0,    0,    0,   65,   92,   92,   92,   92,    0,    0,
+    0,   92,    0,  129,  129,  129,  129,   92,   92,    0,
+    0,    0,  129,    0,    0,   76,  129,  129,   76,    0,
+    0,    0,    0,    0,    0,    0,    0,  129,  129,  129,
+  129,    0,   76,   76,  129,   76,    0,   76,    0,    0,
+  129,  129,    0,    0,    0,    0,    0,   64,    0,    0,
+   64,    0,    0,    0,    0,    0,    0,   78,    0,    0,
+   78,    0,    0,    0,   64,   64,    0,   76,    0,   73,
+   73,   73,   73,   61,   78,   78,   61,   78,   73,   78,
+    0,    0,    0,   73,    0,    0,    0,    0,    0,    0,
+   61,   61,    0,   73,   73,   73,   73,    0,    0,   64,
+   73,    0,   74,   74,   74,   74,   73,   73,    0,   78,
+    0,   74,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,   61,   74,   74,   74,   74,
+    0,    0,    0,   74,    0,    0,    0,    0,   85,   74,
+   74,   85,   66,   66,   66,   66,    0,    0,    0,    0,
+   75,   75,   75,   75,    0,   85,   85,    0,   85,   75,
+   85,    0,    0,    0,    0,    0,   65,   65,   65,   65,
+    0,    0,    0,   66,   75,   75,   75,   75,    0,   66,
+   66,   75,    0,    0,    0,    0,    0,   75,   75,    0,
+   85,    0,   86,    0,    0,   86,    0,   65,    0,    0,
+    0,    0,    0,   65,   65,    0,    0,    0,    0,   86,
+   86,    0,   86,    0,   86,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,   87,    0,
+    0,   87,    0,    0,    0,    0,    0,    0,    0,    0,
+   76,   76,   76,   76,   86,   87,   87,    0,   87,   76,
+   87,    0,    0,    0,    0,    0,    0,    0,    0,  238,
+    0,    0,  239,    0,   76,   76,   76,    0,    0,    0,
+    0,   76,   64,   64,   64,   64,    0,   76,   76,  141,
+   87,  142,   78,   78,   78,   78,    0,    0,    0,    0,
+    0,   78,    0,    0,   83,    0,    0,   83,   61,   61,
+   61,   61,    0,   64,    0,    0,   78,   78,    0,   64,
+   64,   83,   83,   78,   83,    0,   83,    0,    0,   78,
+   78,    0,    0,    0,    0,    0,    0,    0,    0,   61,
+   84,    0,    0,   84,    0,   61,   61,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,   83,   84,   84,    0,
+   84,    0,   84,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,   85,   85,   85,   85,    0,    0,    0,
+    0,    0,   85,    0,    0,    0,   85,   85,   85,   85,
+    0,    0,   84,   82,    0,    0,   82,   85,   85,   85,
+   85,    0,   85,   85,   85,    0,    0,   85,    0,    0,
+   82,   82,    0,   82,    0,   82,    0,  312,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,   86,   86,   86,
+   86,    0,    0,    0,    0,    0,   86,  141,    0,  142,
+   86,   86,   86,   86,    0,   82,    0,    0,    0,    0,
+    0,   86,   86,   86,   86,    0,   86,   86,   86,    0,
+    0,   86,    0,   87,   87,   87,   87,    0,    0,    0,
+    0,    0,   87,    0,    0,    0,   87,   87,   87,   87,
+    0,    0,    0,    0,    0,    0,    0,   87,   87,   87,
+   87,    0,   87,   87,   87,    0,    0,   87,    0,    0,
+    0,    0,    0,  136,    0,  100,  102,  137,  138,  139,
+  140,  112,    0,    0,    0,    0,    0,    0,  143,  144,
+  145,  146,    0,  147,  148,    0,    0,    0,  149,   83,
+   83,   83,   83,    0,    0,    0,    0,    0,   83,    0,
+    0,    0,   83,   83,   83,   83,    0,    0,    0,    0,
+  162,    0,    0,   83,   83,   83,   83,    0,   83,   83,
+   83,    0,    0,   83,    0,   84,   84,   84,   84,    0,
+    0,    0,    0,    0,   84,    0,    0,    0,   84,   84,
+   84,   84,    0,    0,    0,    0,    0,    0,    0,   84,
+   84,   84,   84,    0,   84,   84,   84,    0,    0,   84,
+    0,    0,    0,  203,  204,  205,  206,  208,  210,  211,
+  212,  214,  216,  218,  220,  222,  223,  225,   82,   82,
+   82,   82,    0,    0,    0,    0,    0,   82,    0,    0,
+    0,   82,   82,   82,   82,    0,    0,    0,    0,    0,
+    0,    0,   82,   82,   82,   82,    0,   82,   82,    0,
+    0,  136,   82,    0,  203,  137,  138,  139,  140,    0,
+    0,  203,    0,  203,    0,    0,  143,  144,  145,  146,
+    0,  147,  148,    0,    0,  268,  149,  269,    0,    0,
+    0,  271,    0,  272,    0,  273,    0,  274,    0,  275,
+    0,    0,  276,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,  287,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,  305,
+};
+short yycheck[] = {                                       5,
+  123,   59,   36,   91,   41,  125,   12,   44,   12,   40,
+   16,   40,   18,  171,  173,  257,   40,  165,   40,  167,
+   40,   27,   28,   29,   30,   44,   59,   44,   44,   44,
+   91,   37,   91,  281,  282,  123,   40,   43,  123,   44,
+  279,  280,  281,  282,  281,   49,   44,   44,  296,   53,
+   41,   41,  300,   44,  293,   41,  295,  296,   40,  296,
+   91,  300,  123,  300,  123,  303,  304,   58,   59,   59,
+   61,   44,    0,   59,   93,  234,   93,   93,   84,   83,
+   86,   85,   88,   87,   90,   89,   59,   91,   93,  123,
+  123,   95,  123,  252,  123,   93,   93,   59,  257,  123,
+  259,  123,   93,  123,  279,   33,  281,  282,   36,   37,
+   38,   44,   40,  257,   42,   43,   40,   45,   44,   41,
+  295,  296,   40,  129,    0,  300,   59,  131,  132,  133,
+  134,   59,  290,   59,  257,  293,   64,   59,   41,   44,
+  288,  289,  262,  263,  264,  265,   40,  295,  257,  153,
+  154,  155,  156,  157,   59,   41,   59,   33,   44,   44,
+   36,   37,   38,   91,   40,  272,   42,   43,   41,   45,
+  258,  175,  320,  331,   59,   41,    0,  181,  182,   44,
+  184,   41,   40,   59,   44,  278,   59,  191,   64,  279,
+  280,  281,  282,   59,   59,  123,  289,  125,  126,  257,
+  290,  291,  292,  293,   36,  295,  296,   36,   40,   33,
+  300,   40,   36,   37,   38,   91,   40,   59,   42,   43,
+  297,   45,  226,  257,  228,  270,  271,  261,    0,  266,
+  267,  268,  269,   40,  240,   59,  242,  297,  244,  245,
+   64,   41,  248,  303,  304,  251,  250,  123,   40,  125,
+  126,  266,  267,  268,  269,  296,  260,   41,   36,  300,
+   44,   33,  266,  125,   36,   37,   38,   91,   40,  123,
+   42,   43,   91,   45,   44,  266,  267,  268,  269,  281,
+  282,  262,  263,  264,  265,   41,   41,   59,  292,   44,
+  296,   59,   64,  295,  296,   41,   81,   41,  300,  123,
+   44,  125,  126,  123,   41,   91,  297,   44,  125,   40,
+   40,   96,  303,  304,  318,  300,   40,  125,   41,   91,
+  125,  327,  107,  125,   59,  110,  332,  125,  256,  257,
+  258,  259,  260,  261,  262,  263,  264,  265,  266,  267,
+  268,  269,  125,   41,   41,  273,  274,   41,  276,  277,
+  278,  123,  125,   41,  126,  283,  284,  285,  286,  287,
+  288,  289,   41,   59,   41,   41,  294,   59,   59,  297,
+   73,  299,  318,  301,  302,   12,  250,   -1,   -1,   -1,
+  256,  257,  258,  259,  260,  261,  262,  263,  264,  265,
+  266,  267,  268,  269,   -1,  180,   -1,  273,  274,   -1,
+  276,  277,  278,   41,   -1,   -1,   44,  283,  284,  285,
+  286,  287,  288,  289,   -1,   -1,   -1,   -1,  294,   -1,
+   58,   59,   -1,  299,   -1,  301,  302,   -1,   -1,   -1,
+   -1,   -1,  256,  257,  258,  259,  260,  261,  262,  263,
+  264,  265,  266,  267,  268,  269,   -1,   -1,   -1,  273,
+  274,  236,  276,  277,  278,   93,   -1,   -1,   -1,  283,
+  284,  285,  286,  287,  288,  289,   58,   -1,   -1,   61,
+  294,   63,   -1,   -1,   -1,  299,   -1,  301,  302,   -1,
+   -1,   -1,   -1,   -1,  256,  257,  258,  259,  260,  261,
+   -1,   -1,   -1,  278,  266,  267,  268,  269,   -1,   -1,
+  285,  273,  274,   -1,  276,  277,  278,   -1,   -1,   -1,
+   23,  283,  284,  285,  286,  287,  288,  289,   31,   -1,
+   -1,   -1,  294,   36,   37,   -1,   39,  299,   33,  301,
+  302,   36,   37,   38,   -1,   40,   41,   42,   43,   44,
+   45,   54,   55,   56,   57,   58,   -1,   -1,   -1,   23,
+   -1,   -1,   -1,   58,   59,   -1,   61,   -1,   63,   64,
+   -1,   -1,   36,   44,   45,   46,   47,   48,   42,   -1,
+   51,   52,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   54,   55,   56,   57,   58,   -1,   91,   -1,   93,   33,
+  103,   -1,   36,   37,   38,   -1,   40,   41,   42,   43,
+   44,   45,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   58,   59,   -1,   61,  123,   63,
+   64,  126,   96,  279,  280,  281,  282,   -1,  266,  267,
+  268,  269,   -1,   -1,   -1,  291,  292,  293,   33,  295,
+  296,   36,   37,   38,  300,   40,   -1,   42,   43,   93,
+   45,   -1,   -1,   -1,  279,  280,  281,  282,   -1,  297,
+  279,  280,  281,  282,   59,  303,  304,  292,  293,   64,
+  295,  296,   -1,   -1,   -1,  300,  295,  296,   -1,   -1,
+   -1,  300,  126,  275,   -1,   -1,   -1,  279,  280,  281,
+  282,   -1,   -1,   -1,   -1,   -1,   91,   -1,  290,  291,
+  292,  293,   -1,  295,  296,   -1,   -1,   -1,  300,   -1,
+   33,   -1,   -1,   36,   37,   38,   -1,   40,   -1,   42,
+   43,   -1,   45,   -1,   -1,   -1,   -1,   -1,  123,   -1,
+   -1,  126,   -1,   -1,   -1,   -1,   59,   -1,   -1,   -1,
+   -1,   64,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,  257,  258,  259,  260,  261,   -1,   -1,   -1,
+   -1,  266,  267,  268,  269,   -1,   -1,   -1,   91,  274,
+  275,  276,  277,  278,  279,  280,  281,  282,  283,  284,
+  285,  286,  287,  288,  289,  290,  291,  292,  293,  294,
+  295,  296,  297,   -1,  299,  300,  301,  302,  303,  304,
+  123,   -1,   -1,  126,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,  257,  258,  259,  260,  261,   -1,   -1,
+   -1,   -1,  266,  267,  268,  269,   -1,   -1,   -1,   -1,
+  274,  275,  276,  277,  278,  279,  280,  281,  282,  283,
+  284,  285,  286,  287,  288,  289,  290,  291,  292,  293,
+  294,  295,  296,  297,   -1,  299,  300,  301,  302,  303,
+  304,  256,  257,  258,  259,  260,  261,   -1,   -1,   -1,
+   -1,  266,  267,  268,  269,   -1,   -1,   -1,  273,  274,
+   -1,  276,  277,  278,   -1,   -1,   -1,   -1,  283,  284,
+  285,  286,  287,  288,  289,   -1,   -1,   -1,   -1,  294,
+   41,   -1,   -1,   44,  299,   -1,  301,  302,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   33,   58,   59,   36,
+   37,   38,   -1,   40,   -1,   42,   43,   -1,   45,   -1,
+   -1,   -1,   -1,  256,  257,  258,  259,  260,  261,   -1,
+   -1,   -1,   59,  266,  267,  268,  269,   64,   -1,   -1,
+  273,  274,   93,  276,  277,  278,   -1,   -1,   -1,   -1,
+  283,  284,  285,  286,  287,  288,  289,   -1,   -1,   -1,
+   -1,  294,   -1,   -1,   91,   -1,  299,   33,  301,  302,
+   36,   37,   38,   -1,   40,   41,   42,   43,   -1,   45,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   41,   -1,
+   -1,   44,   -1,   -1,   -1,   -1,  123,   -1,   64,  126,
+   -1,   -1,   -1,   -1,   -1,   58,   59,   -1,   61,   -1,
+   63,   -1,   -1,   -1,   33,   -1,   -1,   36,   37,   38,
+   -1,   40,   -1,   42,   43,   91,   45,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   93,   -1,   -1,   -1,   -1,   64,   -1,   -1,   -1,   -1,
+   -1,   41,   -1,   -1,   44,   -1,   -1,  123,   -1,   -1,
+  126,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   58,   59,
+   -1,   61,   91,   63,   93,   -1,   -1,   -1,   33,   -1,
+   -1,   36,   37,   38,   -1,   40,   -1,   42,   43,   -1,
+   45,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   93,  123,   -1,   -1,  126,   -1,   64,
+   -1,   -1,   -1,   -1,   -1,  266,  267,  268,  269,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  257,  258,  259,  260,  261,   -1,   91,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,  297,  274,   -1,  276,
+  277,  278,  303,  304,   63,   -1,  283,  284,  285,  286,
+  287,  288,  289,   -1,   -1,   -1,   -1,  294,  123,   -1,
+   -1,  126,  299,   -1,  301,  302,   -1,   -1,   -1,   -1,
+   41,   -1,   -1,   44,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,  257,  258,  259,  260,  261,   -1,   58,   59,   -1,
+   61,   -1,   63,   -1,   -1,   -1,   -1,   -1,  274,   -1,
+  276,  277,  278,  266,  267,  268,  269,  283,  284,  285,
+  286,  287,  288,  289,   -1,   -1,   -1,   -1,  294,   -1,
+   -1,   -1,   93,  299,   -1,  301,  302,   -1,  257,  258,
+  259,  260,  261,   -1,  297,   -1,   -1,   -1,   -1,   -1,
+  303,  304,   -1,   -1,   -1,  274,   -1,  276,  277,  278,
+   61,   -1,   63,   -1,  283,  284,  285,  286,  287,  288,
+  289,   -1,   -1,   -1,   -1,  294,  266,  267,  268,  269,
+  299,   -1,  301,  302,   33,  275,   -1,   36,   37,   38,
+   -1,   40,   41,   42,   43,   -1,   45,   -1,   -1,   -1,
+  290,  256,  257,  258,  259,  260,  261,  297,   -1,   -1,
+   -1,   -1,   -1,  303,  304,   64,   -1,   -1,   -1,  274,
+   -1,  276,  277,  278,   -1,   -1,   -1,   -1,  283,  284,
+  285,  286,  287,  288,  289,   -1,   -1,   -1,   -1,  294,
+   -1,   -1,   91,   -1,  299,   33,  301,  302,   36,   37,
+   38,   -1,   40,   -1,   42,   43,   -1,   45,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,  275,   -1,   -1,   -1,
+  279,  280,  281,  282,  123,   -1,   64,  126,   -1,   -1,
+   -1,  290,  291,  292,  293,   -1,  295,  296,   -1,   -1,
+   -1,  300,   33,   -1,   -1,   36,   37,   38,   -1,   40,
+   -1,   42,   43,   91,   45,  266,  267,  268,  269,   -1,
+   -1,   -1,   -1,   -1,  275,   -1,   -1,   -1,  279,  280,
+   61,  282,   -1,   64,   -1,   -1,   -1,   -1,   -1,  290,
+  291,  292,  293,   -1,  295,  123,  297,   -1,  126,   -1,
+   -1,   -1,  303,  304,   -1,   -1,   -1,   -1,   -1,   -1,
+   91,   -1,   -1,   -1,   -1,   -1,   33,   -1,   -1,   36,
+   37,   38,   -1,   40,   -1,   42,   43,   -1,   45,   -1,
+   -1,   -1,   -1,   -1,  275,   -1,   -1,   -1,  279,  280,
+  281,  282,  123,   -1,   61,  126,   -1,   64,   -1,  290,
+  291,  292,  293,   -1,  295,  296,   -1,   -1,   -1,  300,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  257,  258,
+  259,  260,  261,   -1,   91,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,  274,   -1,  276,  277,  278,
+   -1,   -1,   -1,   -1,  283,  284,  285,  286,  287,  288,
+  289,   -1,   -1,   -1,   -1,  294,  123,   -1,   -1,  126,
+  299,   -1,  301,  302,   -1,   -1,   -1,   -1,   41,   -1,
+   -1,   44,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  257,
+  258,  259,  260,  261,   -1,   58,   59,   -1,   61,   -1,
+   63,   -1,   -1,   -1,   -1,   -1,  274,   -1,  276,  277,
+  278,   -1,   -1,   -1,   -1,  283,  284,  285,  286,  287,
+  288,  289,   -1,   -1,   -1,   41,  294,   -1,   44,  297,
+   93,  299,   -1,  301,  302,   -1,  257,  258,  259,  260,
+  261,   -1,   58,   59,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,  274,   -1,  276,  277,  278,   -1,   -1,
+   -1,   -1,  283,  284,  285,  286,  287,  288,  289,   -1,
+   -1,   -1,   -1,  294,   -1,   -1,   -1,   93,  299,   -1,
+  301,  302,   33,   -1,   -1,   36,   37,   38,   -1,   40,
+   -1,   42,   43,   -1,   45,   -1,   -1,   -1,   -1,   -1,
+  257,  258,  259,  260,  261,   -1,   -1,   -1,   -1,   -1,
+   61,   -1,   -1,   64,   -1,   -1,   -1,  274,   -1,  276,
+  277,  278,   -1,   -1,   -1,   -1,  283,  284,  285,  286,
+  287,  288,  289,   -1,   -1,   -1,   -1,  294,   -1,   -1,
+   91,   -1,  299,   33,  301,  302,   36,   37,   38,   -1,
+   40,   -1,   42,   43,   -1,   45,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   61,  123,   -1,   64,  126,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   33,   -1,   -1,   36,   37,   38,   -1,   40,   -1,   42,
+   43,   91,   45,  266,  267,  268,  269,   -1,   -1,   -1,
+   -1,   -1,  275,   -1,   -1,   -1,  279,  280,   61,   -1,
+   -1,   64,   -1,   -1,   -1,   -1,   -1,  290,  291,  292,
+  293,   -1,  295,  123,  297,   -1,  126,   -1,   -1,   -1,
+  303,  304,   -1,   -1,   -1,   -1,   -1,   -1,   91,   -1,
+  266,  267,  268,  269,   33,   -1,   -1,   36,   37,   38,
+   -1,   40,   -1,   42,   43,   -1,   45,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  123,  297,   61,  126,   -1,   64,   -1,  303,  304,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,  257,  258,  259,  260,
+  261,   -1,   91,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,  274,   -1,  276,  277,  278,   -1,   -1,
+   -1,   -1,  283,  284,  285,  286,  287,  288,  289,   -1,
+   -1,   -1,   -1,  294,  123,   -1,   -1,  126,  299,   -1,
+  301,  302,   -1,   -1,   -1,   -1,   41,   -1,   -1,   44,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,  257,  258,  259,
+  260,  261,   -1,   58,   59,   -1,   61,   -1,   63,   -1,
+   -1,   -1,   -1,   -1,  274,   -1,  276,  277,  278,   -1,
+   -1,   -1,   -1,  283,  284,  285,  286,  287,  288,  289,
+   -1,   -1,   -1,   41,  294,   -1,   44,   -1,   93,  299,
+   -1,  301,  302,   -1,  257,  258,  259,  260,  261,   -1,
+   58,   59,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,  274,   -1,  276,  277,  278,   -1,   -1,   -1,   -1,
+  283,  284,  285,  286,  287,  288,  289,   -1,   -1,   -1,
+   -1,  294,   -1,   -1,   -1,   93,  299,   -1,  301,  302,
+   33,   -1,   -1,   36,   37,   38,   -1,   40,   -1,   42,
+   43,   -1,   45,   -1,   -1,   -1,   -1,   -1,  257,  258,
+  259,  260,  261,   -1,   -1,   -1,   -1,   -1,   61,   -1,
+   -1,   64,   -1,   -1,   -1,  274,   -1,  276,  277,  278,
+   -1,   -1,   -1,   -1,  283,  284,  285,  286,  287,  288,
+  289,   -1,   -1,   -1,   -1,  294,   -1,   -1,   91,   -1,
+  299,   33,  301,  302,   36,   37,   38,   -1,   40,   -1,
+   42,   43,   -1,   45,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   61,
+  123,   -1,   64,  126,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   33,   -1,
+   -1,   36,   37,   38,   -1,   40,   41,   42,   43,   91,
+   45,  266,  267,  268,  269,   -1,   -1,   -1,   -1,   -1,
+  275,   -1,   -1,   -1,  279,  280,  281,  282,   -1,   64,
+   -1,   -1,   -1,   -1,   -1,  290,  291,  292,  293,   -1,
+  295,  123,  297,   -1,  126,   -1,   -1,   -1,  303,  304,
+   -1,   -1,   -1,   -1,   -1,   -1,   91,   -1,  266,  267,
+  268,  269,   33,   -1,   -1,   36,   37,   38,   -1,   40,
+   41,   42,   43,   -1,   45,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  123,  297,
+   -1,  126,   -1,   64,   -1,  303,  304,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,  257,  258,  259,  260,  261,   -1,
+   91,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,  274,   -1,  276,  277,  278,   -1,   -1,   -1,   -1,
+  283,  284,  285,  286,  287,  288,  289,   -1,   -1,   -1,
+   -1,  294,  123,   -1,   -1,  126,  299,   -1,  301,  302,
+   -1,   -1,   -1,   -1,   41,   -1,   -1,   44,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,  257,  258,  259,  260,  261,
+   -1,   58,   59,   -1,   61,   -1,   63,   -1,   -1,   -1,
+   -1,   -1,  274,   -1,  276,  277,  278,   -1,   -1,   -1,
+   -1,  283,  284,  285,  286,  287,  288,  289,   -1,   -1,
+   -1,   41,  294,   -1,   44,   -1,   93,  299,   -1,  301,
+  302,   -1,  257,  258,  259,  260,  261,   -1,   58,   59,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  274,
+   -1,  276,  277,  278,   -1,   -1,   -1,   -1,  283,  284,
+  285,  286,  287,  288,  289,   -1,   -1,   -1,   -1,  294,
+   -1,   -1,   -1,   93,  299,   -1,  301,  302,   33,   -1,
+   -1,   36,   37,   38,   -1,   40,   41,   42,   43,   -1,
+   45,   -1,   -1,   -1,   -1,   -1,  257,  258,  259,  260,
+  261,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   64,
+   -1,   -1,   -1,  274,   -1,  276,  277,  278,   -1,   -1,
+   -1,   -1,  283,  284,  285,  286,  287,  288,  289,   -1,
+   -1,   -1,   -1,  294,   -1,   -1,   91,   -1,  299,   33,
+  301,  302,   36,   37,   38,   -1,   40,   -1,   42,   43,
+   -1,   45,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   59,   -1,   -1,  123,   -1,
+   64,  126,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   33,   -1,   -1,   36,
+   37,   38,   -1,   40,   41,   42,   43,   91,   45,  266,
+  267,  268,  269,   -1,   -1,   -1,   -1,   -1,  275,   -1,
+   -1,   -1,  279,  280,   -1,   -1,   -1,   64,   -1,   -1,
+   -1,   -1,   -1,  290,  291,  292,  293,   -1,   -1,  123,
+  297,   -1,  126,   -1,   -1,   -1,  303,  304,   -1,   -1,
+   -1,   -1,   -1,   -1,   91,   -1,  266,  267,  268,  269,
+   33,   -1,   -1,   36,   37,   38,   -1,   40,   -1,   42,
+   43,   -1,   45,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,  123,  297,   -1,  126,
+   -1,   64,   -1,  303,  304,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,  257,  258,  259,  260,  261,   -1,   91,   -1,
+   93,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  274,
+   -1,  276,  277,  278,   -1,   -1,   -1,   -1,  283,  284,
+  285,  286,  287,  288,  289,   -1,   -1,   -1,   -1,  294,
+  123,   -1,   -1,  126,  299,   -1,  301,  302,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   41,   -1,   -1,
+   44,   -1,   -1,  257,  258,  259,  260,  261,   -1,   -1,
+   -1,   -1,   -1,   -1,   58,   59,   -1,   -1,   -1,   -1,
+  274,   -1,  276,  277,  278,   -1,   -1,   -1,   -1,  283,
+  284,  285,  286,  287,  288,  289,   -1,   -1,   41,   -1,
+  294,   44,   -1,   -1,   -1,  299,   -1,  301,  302,   93,
+  257,  258,  259,  260,  261,   58,   59,   -1,   61,   -1,
+   63,   -1,   -1,   -1,   -1,   -1,   -1,  274,   -1,  276,
+  277,  278,   -1,   -1,   -1,   -1,  283,  284,  285,  286,
+  287,  288,  289,   -1,   -1,   -1,   -1,  294,   -1,   -1,
+   93,   -1,  299,   -1,  301,  302,   33,   -1,   -1,   36,
+   37,   38,   -1,   40,   -1,   42,   43,   -1,   45,   -1,
+   -1,   -1,   -1,   -1,  257,  258,  259,  260,  261,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   64,   -1,   -1,
+   -1,  274,   -1,  276,  277,  278,   -1,   -1,   -1,   -1,
+  283,  284,  285,  286,  287,  288,  289,   -1,   -1,   -1,
+   -1,  294,   -1,   -1,   91,   -1,  299,   33,  301,  302,
+   36,   37,   38,   -1,   40,   -1,   42,   43,   -1,   45,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,  123,   -1,   64,  126,
+   -1,   -1,   -1,   -1,   41,   -1,   -1,   44,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   58,   59,   -1,   61,   91,   63,   -1,   -1,   -1,
+   -1,   -1,  266,  267,  268,  269,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   41,   -1,   -1,   44,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   93,  123,   -1,   -1,
+  126,   58,   59,  297,   61,   -1,   63,   -1,   -1,  303,
+  304,   -1,   -1,  266,  267,  268,  269,   -1,   -1,   -1,
+   -1,   -1,  275,   -1,   -1,   -1,  279,  280,  281,  282,
+   -1,   -1,   -1,   -1,   -1,   -1,   93,  290,  291,  292,
+  293,   -1,  295,  296,  297,   -1,   -1,  300,   -1,   -1,
+  303,  304,   -1,   -1,   -1,   -1,   -1,   -1,   41,   -1,
+   -1,   44,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  257,  258,  259,  260,  261,   58,   59,   -1,   61,   -1,
+   63,   -1,   -1,   -1,   -1,   -1,   -1,  274,   -1,  276,
+  277,  278,   -1,   -1,   -1,   -1,  283,  284,  285,  286,
+  287,  288,  289,   41,   -1,   -1,   44,  294,   -1,   -1,
+   93,   -1,  299,   -1,  301,  302,   -1,   -1,   -1,   -1,
+   58,   59,   -1,   61,   -1,   63,   -1,   -1,   -1,   -1,
+   -1,  257,  258,  259,  260,  261,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  274,   -1,
+  276,  277,  278,   -1,   -1,   93,   -1,  283,  284,  285,
+  286,  287,  288,  289,   -1,   -1,   -1,   -1,  294,  266,
+  267,  268,  269,  299,   -1,  301,  302,   -1,  275,   -1,
+   -1,   -1,  279,  280,  281,  282,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,  290,  291,  292,  293,   -1,  295,  296,
+  297,   -1,   -1,  300,   -1,   -1,  303,  304,   -1,  266,
+  267,  268,  269,   -1,   -1,   -1,   -1,   -1,  275,   -1,
+   -1,   -1,  279,  280,  281,  282,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,  290,  291,  292,  293,   -1,  295,  296,
+  297,   41,   -1,  300,   44,   -1,  303,  304,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   58,   59,
+   -1,   61,   -1,   63,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,  266,  267,  268,  269,   -1,   -1,   -1,
+   -1,   -1,  275,   93,   -1,   -1,  279,  280,  281,  282,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,  290,  291,  292,
+  293,   -1,  295,  296,  297,   -1,   41,  300,   -1,   44,
+  303,  304,   -1,   -1,   -1,   -1,   -1,   -1,  266,  267,
+  268,  269,   -1,   58,   59,   -1,   61,  275,   63,   -1,
+   -1,  279,  280,  281,  282,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,  290,  291,  292,  293,   -1,  295,  296,  297,
+   41,   -1,  300,   44,   -1,  303,  304,   -1,   93,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   58,   59,   -1,
+   61,   -1,   63,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   41,
+   -1,   -1,   44,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   93,   -1,   -1,   -1,   58,   59,   -1,   61,
+   -1,   63,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   41,   -1,   -1,   44,   -1,   -1,   -1,   -1,
+   -1,   93,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   58,
+   59,   -1,   61,   -1,   63,   -1,  266,  267,  268,  269,
+   -1,   -1,   -1,   -1,   -1,  275,   -1,   -1,   -1,  279,
+  280,  281,  282,   -1,   -1,   -1,   -1,   -1,   41,   -1,
+  290,  291,  292,  293,   93,  295,  296,  297,   -1,   -1,
+  300,   -1,   -1,  303,  304,   58,   59,   -1,   61,   -1,
+   63,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   41,
+   -1,   -1,   44,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   93,  266,  267,  268,  269,   -1,   58,   59,   -1,   61,
+  275,   63,   -1,   -1,  279,  280,  281,  282,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,  290,  291,  292,  293,   -1,
+  295,  296,  297,   -1,   -1,  300,   -1,   -1,  303,  304,
+   -1,   93,   -1,   -1,   -1,  266,  267,  268,  269,   -1,
+   -1,   -1,   -1,   -1,  275,   -1,   -1,   -1,  279,  280,
+  281,  282,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  290,
+  291,  292,  293,   -1,  295,  296,  297,   -1,   -1,  300,
+   -1,   -1,  303,  304,  266,  267,  268,  269,   -1,   -1,
+   -1,   -1,   -1,  275,   -1,   -1,   -1,  279,  280,  281,
+  282,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  290,  291,
+  292,  293,   -1,  295,  296,  297,   -1,   41,  300,   -1,
+   44,  303,  304,   -1,   -1,   -1,   -1,  266,  267,  268,
+  269,   -1,   -1,   -1,   58,   59,  275,   61,   -1,   63,
+  279,  280,  281,  282,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,  290,  291,  292,  293,   -1,  295,  296,  297,   -1,
+   41,  300,   -1,   44,  303,  304,   -1,   -1,   -1,   93,
+   -1,   -1,   -1,  266,  267,  268,  269,   58,   59,   -1,
+   -1,   -1,  275,   -1,   -1,   -1,  279,  280,  281,  282,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,  290,  291,  292,
+  293,   -1,  295,  296,  297,   -1,   -1,  300,   -1,   -1,
+  303,  304,   93,   -1,  266,  267,  268,  269,   -1,   -1,
+   -1,   -1,   -1,  275,   -1,   -1,   -1,  279,  280,  281,
+  282,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  290,  291,
+  292,  293,   41,  295,  296,   44,   -1,   -1,  300,   -1,
+   -1,  303,  304,   -1,   -1,   -1,   -1,   -1,   -1,   58,
+   59,   -1,   61,   -1,   63,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   41,   -1,   -1,   44,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   58,   59,   93,   61,   -1,   63,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   41,   -1,
+   -1,   44,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   58,   59,   93,   61,   -1,
+   63,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,  266,  267,  268,  269,   -1,   -1,   -1,   -1,
+   -1,  275,   -1,   -1,   -1,  279,  280,  281,  282,   -1,
+   93,   -1,   -1,   -1,   -1,   -1,  290,  291,  292,  293,
+   -1,  295,  296,  297,   41,   -1,   -1,   44,   -1,  303,
+  304,   -1,   -1,   -1,   -1,  266,  267,  268,  269,   -1,
+   -1,   58,   59,   -1,   61,   -1,   63,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   41,   -1,   -1,
+   44,   -1,   -1,   -1,   -1,   -1,  297,   -1,   -1,   -1,
+   -1,   -1,  303,  304,   58,   59,   93,   61,   -1,   63,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   41,   -1,   -1,
+   44,   -1,   -1,   -1,   -1,   41,   -1,   -1,   44,   93,
+   -1,   -1,   -1,   -1,   58,   59,   -1,  266,  267,  268,
+  269,   41,   58,   59,   44,   61,  275,   63,   -1,   -1,
+  279,  280,  281,  282,   -1,   -1,   -1,   -1,   58,   59,
+   -1,  290,  291,  292,  293,   -1,  295,  296,  297,   93,
+  266,  267,  268,  269,  303,  304,   -1,   93,   -1,  275,
+   -1,   -1,   -1,  279,  280,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   93,  290,  291,  292,  293,   -1,   -1,
+   -1,  297,   -1,  266,  267,  268,  269,  303,  304,   -1,
+   -1,   -1,  275,   -1,   -1,   41,  279,  280,   44,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,  290,  291,  292,
+  293,   -1,   58,   59,  297,   61,   -1,   63,   -1,   -1,
+  303,  304,   -1,   -1,   -1,   -1,   -1,   41,   -1,   -1,
+   44,   -1,   -1,   -1,   -1,   -1,   -1,   41,   -1,   -1,
+   44,   -1,   -1,   -1,   58,   59,   -1,   93,   -1,  266,
+  267,  268,  269,   41,   58,   59,   44,   61,  275,   63,
+   -1,   -1,   -1,  280,   -1,   -1,   -1,   -1,   -1,   -1,
+   58,   59,   -1,  290,  291,  292,  293,   -1,   -1,   93,
+  297,   -1,  266,  267,  268,  269,  303,  304,   -1,   93,
+   -1,  275,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   93,  290,  291,  292,  293,
+   -1,   -1,   -1,  297,   -1,   -1,   -1,   -1,   41,  303,
+  304,   44,  266,  267,  268,  269,   -1,   -1,   -1,   -1,
+  266,  267,  268,  269,   -1,   58,   59,   -1,   61,  275,
+   63,   -1,   -1,   -1,   -1,   -1,  266,  267,  268,  269,
+   -1,   -1,   -1,  297,  290,  291,  292,  293,   -1,  303,
+  304,  297,   -1,   -1,   -1,   -1,   -1,  303,  304,   -1,
+   93,   -1,   41,   -1,   -1,   44,   -1,  297,   -1,   -1,
+   -1,   -1,   -1,  303,  304,   -1,   -1,   -1,   -1,   58,
+   59,   -1,   61,   -1,   63,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   41,   -1,
+   -1,   44,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  266,  267,  268,  269,   93,   58,   59,   -1,   61,  275,
+   63,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   41,
+   -1,   -1,   44,   -1,  290,  291,  292,   -1,   -1,   -1,
+   -1,  297,  266,  267,  268,  269,   -1,  303,  304,   61,
+   93,   63,  266,  267,  268,  269,   -1,   -1,   -1,   -1,
+   -1,  275,   -1,   -1,   41,   -1,   -1,   44,  266,  267,
+  268,  269,   -1,  297,   -1,   -1,  290,  291,   -1,  303,
+  304,   58,   59,  297,   61,   -1,   63,   -1,   -1,  303,
+  304,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  297,
+   41,   -1,   -1,   44,   -1,  303,  304,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   93,   58,   59,   -1,
+   61,   -1,   63,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,  266,  267,  268,  269,   -1,   -1,   -1,
+   -1,   -1,  275,   -1,   -1,   -1,  279,  280,  281,  282,
+   -1,   -1,   93,   41,   -1,   -1,   44,  290,  291,  292,
+  293,   -1,  295,  296,  297,   -1,   -1,  300,   -1,   -1,
+   58,   59,   -1,   61,   -1,   63,   -1,   41,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,  266,  267,  268,
+  269,   -1,   -1,   -1,   -1,   -1,  275,   61,   -1,   63,
+  279,  280,  281,  282,   -1,   93,   -1,   -1,   -1,   -1,
+   -1,  290,  291,  292,  293,   -1,  295,  296,  297,   -1,
+   -1,  300,   -1,  266,  267,  268,  269,   -1,   -1,   -1,
+   -1,   -1,  275,   -1,   -1,   -1,  279,  280,  281,  282,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,  290,  291,  292,
+  293,   -1,  295,  296,  297,   -1,   -1,  300,   -1,   -1,
+   -1,   -1,   -1,  275,   -1,   37,   38,  279,  280,  281,
+  282,   43,   -1,   -1,   -1,   -1,   -1,   -1,  290,  291,
+  292,  293,   -1,  295,  296,   -1,   -1,   -1,  300,  266,
+  267,  268,  269,   -1,   -1,   -1,   -1,   -1,  275,   -1,
+   -1,   -1,  279,  280,  281,  282,   -1,   -1,   -1,   -1,
+   82,   -1,   -1,  290,  291,  292,  293,   -1,  295,  296,
+  297,   -1,   -1,  300,   -1,  266,  267,  268,  269,   -1,
+   -1,   -1,   -1,   -1,  275,   -1,   -1,   -1,  279,  280,
+  281,  282,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  290,
+  291,  292,  293,   -1,  295,  296,  297,   -1,   -1,  300,
+   -1,   -1,   -1,  135,  136,  137,  138,  139,  140,  141,
+  142,  143,  144,  145,  146,  147,  148,  149,  266,  267,
+  268,  269,   -1,   -1,   -1,   -1,   -1,  275,   -1,   -1,
+   -1,  279,  280,  281,  282,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,  290,  291,  292,  293,   -1,  295,  296,   -1,
+   -1,  275,  300,   -1,  186,  279,  280,  281,  282,   -1,
+   -1,  193,   -1,  195,   -1,   -1,  290,  291,  292,  293,
+   -1,  295,  296,   -1,   -1,  207,  300,  209,   -1,   -1,
+   -1,  213,   -1,  215,   -1,  217,   -1,  219,   -1,  221,
+   -1,   -1,  224,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,  239,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  270,
+};
+#define YYFINAL 1
 #ifndef YYDEBUG
-#      define YYDEBUG  0       /* don't allow debugging */
+#define YYDEBUG 0
 #endif
-
+#define YYMAXTOKEN 304
 #if YYDEBUG
-
-yytoktype yytoks[] =
-{
-       "{",    123,
-       ")",    41,
-       "WORD", 257,
-       "METHOD",       258,
-       "THING",        259,
-       "PMFUNC",       260,
-       "LABEL",        261,
-       "FORMAT",       262,
-       "SUB",  263,
-       "PACKAGE",      264,
-       "WHILE",        265,
-       "UNTIL",        266,
-       "IF",   267,
-       "UNLESS",       268,
-       "ELSE", 269,
-       "ELSIF",        270,
-       "CONTINUE",     271,
-       "FOR",  272,
-       "LOOPEX",       273,
-       "DOTDOT",       274,
-       "FUNC0",        275,
-       "FUNC1",        276,
-       "FUNC", 277,
-       "RELOP",        278,
-       "EQOP", 279,
-       "MULOP",        280,
-       "ADDOP",        281,
-       "DOLSHARP",     282,
-       "DO",   283,
-       "LOCAL",        284,
-       "DELETE",       285,
-       "HASHBRACK",    286,
-       "LSTOP",        287,
-       ",",    44,
-       "=",    61,
-       "?",    63,
-       ":",    58,
-       "OROR", 288,
-       "ANDAND",       289,
-       "BITOROP",      290,
-       "BITANDOP",     291,
-       "UNIOP",        292,
-       "SHIFTOP",      293,
-       "MATCHOP",      294,
-       "ARROW",        295,
-       "!",    33,
-       "~",    126,
-       "UMINUS",       296,
-       "REFGEN",       297,
-       "POWOP",        298,
-       "PREINC",       299,
-       "PREDEC",       300,
-       "POSTINC",      301,
-       "POSTDEC",      302,
-       "(",    40,
-       "-unknown-",    -1      /* ends search */
+char *yyname[] = {
+"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+"'!'",0,0,"'$'","'%'","'&'",0,"'('","')'","'*'","'+'","','","'-'",0,0,0,0,0,0,0,
+0,0,0,0,0,"':'","';'",0,"'='",0,"'?'","'@'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,"'['",0,"']'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,"'{'",0,"'}'","'~'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"WORD","METHOD","THING",
+"PMFUNC","PRIVATEREF","LABEL","FORMAT","SUB","PACKAGE","WHILE","UNTIL","IF",
+"UNLESS","ELSE","ELSIF","CONTINUE","FOR","LOOPEX","DOTDOT","FUNC0","FUNC1",
+"FUNC","RELOP","EQOP","MULOP","ADDOP","DOLSHARP","DO","LOCAL","DELETE",
+"HASHBRACK","NOAMP","LSTOP","OROR","ANDAND","BITOROP","BITANDOP","UNIOP",
+"SHIFTOP","MATCHOP","ARROW","UMINUS","REFGEN","POWOP","PREINC","PREDEC",
+"POSTINC","POSTDEC",
 };
-
-char * yyreds[] =
-{
-       "-no such reduction-",
-       "prog : /* empty */",
-       "prog : lineseq",
-       "block : '{' remember lineseq '}'",
-       "remember : /* empty */",
-       "lineseq : /* empty */",
-       "lineseq : lineseq decl",
-       "lineseq : lineseq line",
-       "line : label cond",
-       "line : loop",
-       "line : label ';'",
-       "line : label sideff ';'",
-       "sideff : error",
-       "sideff : expr",
-       "sideff : expr IF expr",
-       "sideff : expr UNLESS expr",
-       "sideff : expr WHILE expr",
-       "sideff : expr UNTIL expr",
-       "else : /* empty */",
-       "else : ELSE block",
-       "else : ELSIF '(' expr ')' block else",
-       "cond : IF '(' expr ')' block else",
-       "cond : UNLESS '(' expr ')' block else",
-       "cond : IF block block else",
-       "cond : UNLESS block block else",
-       "cont : /* empty */",
-       "cont : CONTINUE block",
-       "loop : label WHILE '(' texpr ')' block cont",
-       "loop : label UNTIL '(' expr ')' block cont",
-       "loop : label WHILE block block cont",
-       "loop : label UNTIL block block cont",
-       "loop : label FOR scalar '(' expr crp block cont",
-       "loop : label FOR '(' expr crp block cont",
-       "loop : label FOR '(' nexpr ';' texpr ';' nexpr ')' block",
-       "loop : label block cont",
-       "nexpr : /* empty */",
-       "nexpr : sideff",
-       "texpr : /* empty */",
-       "texpr : expr",
-       "label : /* empty */",
-       "label : LABEL",
-       "decl : format",
-       "decl : subrout",
-       "decl : package",
-       "format : FORMAT WORD block",
-       "format : FORMAT block",
-       "subrout : SUB WORD block",
-       "package : PACKAGE WORD ';'",
-       "expr : expr ',' sexpr",
-       "expr : sexpr",
-       "listop : LSTOP indirob listexpr",
-       "listop : FUNC '(' indirob listexpr ')'",
-       "listop : indirob ARROW LSTOP listexpr",
-       "listop : indirob ARROW FUNC '(' listexpr ')'",
-       "listop : term ARROW METHOD '(' listexpr ')'",
-       "listop : METHOD indirob listexpr",
-       "listop : LSTOP listexpr",
-       "listop : FUNC '(' listexpr ')'",
-       "sexpr : sexpr '=' sexpr",
-       "sexpr : sexpr POWOP '=' sexpr",
-       "sexpr : sexpr MULOP '=' sexpr",
-       "sexpr : sexpr ADDOP '=' sexpr",
-       "sexpr : sexpr SHIFTOP '=' sexpr",
-       "sexpr : sexpr BITANDOP '=' sexpr",
-       "sexpr : sexpr BITOROP '=' sexpr",
-       "sexpr : sexpr ANDAND '=' sexpr",
-       "sexpr : sexpr OROR '=' sexpr",
-       "sexpr : sexpr POWOP sexpr",
-       "sexpr : sexpr MULOP sexpr",
-       "sexpr : sexpr ADDOP sexpr",
-       "sexpr : sexpr SHIFTOP sexpr",
-       "sexpr : sexpr RELOP sexpr",
-       "sexpr : sexpr EQOP sexpr",
-       "sexpr : sexpr BITANDOP sexpr",
-       "sexpr : sexpr BITOROP sexpr",
-       "sexpr : sexpr DOTDOT sexpr",
-       "sexpr : sexpr ANDAND sexpr",
-       "sexpr : sexpr OROR sexpr",
-       "sexpr : sexpr '?' sexpr ':' sexpr",
-       "sexpr : sexpr MATCHOP sexpr",
-       "sexpr : term",
-       "term : '-' term",
-       "term : '+' term",
-       "term : '!' term",
-       "term : '~' term",
-       "term : REFGEN term",
-       "term : term POSTINC",
-       "term : term POSTDEC",
-       "term : PREINC term",
-       "term : PREDEC term",
-       "term : LOCAL sexpr",
-       "term : '(' expr crp",
-       "term : '(' ')'",
-       "term : '[' expr crb",
-       "term : '[' ']'",
-       "term : HASHBRACK expr crhb",
-       "term : HASHBRACK ';' '}'",
-       "term : scalar",
-       "term : star",
-       "term : scalar '[' expr ']'",
-       "term : term ARROW '[' expr ']'",
-       "term : hsh",
-       "term : ary",
-       "term : arylen",
-       "term : scalar '{' expr ';' '}'",
-       "term : term ARROW '{' expr ';' '}'",
-       "term : '(' expr crp '[' expr ']'",
-       "term : '(' ')' '[' expr ']'",
-       "term : ary '[' expr ']'",
-       "term : ary '{' expr ';' '}'",
-       "term : DELETE scalar '{' expr ';' '}'",
-       "term : DELETE '(' scalar '{' expr ';' '}' ')'",
-       "term : THING",
-       "term : amper",
-       "term : amper '(' ')'",
-       "term : amper '(' expr crp",
-       "term : DO sexpr",
-       "term : DO block",
-       "term : DO WORD '(' ')'",
-       "term : DO WORD '(' expr crp",
-       "term : DO scalar '(' ')'",
-       "term : DO scalar '(' expr crp",
-       "term : LOOPEX",
-       "term : LOOPEX WORD",
-       "term : UNIOP",
-       "term : UNIOP block",
-       "term : UNIOP sexpr",
-       "term : FUNC0",
-       "term : FUNC0 '(' ')'",
-       "term : FUNC1 '(' ')'",
-       "term : FUNC1 '(' expr ')'",
-       "term : PMFUNC '(' sexpr ')'",
-       "term : PMFUNC '(' sexpr ',' sexpr ')'",
-       "term : WORD",
-       "term : listop",
-       "listexpr : /* empty */",
-       "listexpr : expr",
-       "amper : '&' indirob",
-       "scalar : '$' indirob",
-       "ary : '@' indirob",
-       "hsh : '%' indirob",
-       "arylen : DOLSHARP indirob",
-       "star : '*' indirob",
-       "indirob : WORD",
-       "indirob : scalar",
-       "indirob : block",
-       "crp : ',' ')'",
-       "crp : ')'",
-       "crb : ',' ']'",
-       "crb : ']'",
-       "crhb : ',' ';' '}'",
-       "crhb : ';' '}'",
+char *yyrule[] = {
+"$accept : prog",
+"$$1 :",
+"prog : $$1 lineseq",
+"block : '{' remember lineseq '}'",
+"remember :",
+"lineseq :",
+"lineseq : lineseq decl",
+"lineseq : lineseq line",
+"line : label cond",
+"line : loop",
+"line : label ';'",
+"line : label sideff ';'",
+"sideff : error",
+"sideff : expr",
+"sideff : expr IF expr",
+"sideff : expr UNLESS expr",
+"sideff : expr WHILE expr",
+"sideff : expr UNTIL expr",
+"else :",
+"else : ELSE block",
+"else : ELSIF '(' expr ')' block else",
+"cond : IF '(' expr ')' block else",
+"cond : UNLESS '(' expr ')' block else",
+"cond : IF block block else",
+"cond : UNLESS block block else",
+"cont :",
+"cont : CONTINUE block",
+"loop : label WHILE '(' texpr ')' block cont",
+"loop : label UNTIL '(' expr ')' block cont",
+"loop : label WHILE block block cont",
+"loop : label UNTIL block block cont",
+"loop : label FOR scalar '(' expr crp block cont",
+"loop : label FOR '(' expr crp block cont",
+"loop : label FOR '(' nexpr ';' texpr ';' nexpr ')' block",
+"loop : label block cont",
+"nexpr :",
+"nexpr : sideff",
+"texpr :",
+"texpr : expr",
+"label :",
+"label : LABEL",
+"decl : format",
+"decl : subrout",
+"decl : package",
+"format : FORMAT WORD block",
+"format : FORMAT block",
+"subrout : SUB WORD block",
+"subrout : SUB WORD ';'",
+"package : PACKAGE WORD ';'",
+"package : PACKAGE ';'",
+"expr : expr ',' sexpr",
+"expr : sexpr",
+"listop : LSTOP indirob listexpr",
+"listop : FUNC '(' indirob listexpr ')'",
+"listop : indirob ARROW LSTOP listexpr",
+"listop : indirob ARROW FUNC '(' listexpr ')'",
+"listop : term ARROW METHOD '(' listexpr ')'",
+"listop : METHOD indirob listexpr",
+"listop : LSTOP listexpr",
+"listop : FUNC '(' listexpr ')'",
+"sexpr : sexpr '=' sexpr",
+"sexpr : sexpr POWOP '=' sexpr",
+"sexpr : sexpr MULOP '=' sexpr",
+"sexpr : sexpr ADDOP '=' sexpr",
+"sexpr : sexpr SHIFTOP '=' sexpr",
+"sexpr : sexpr BITANDOP '=' sexpr",
+"sexpr : sexpr BITOROP '=' sexpr",
+"sexpr : sexpr ANDAND '=' sexpr",
+"sexpr : sexpr OROR '=' sexpr",
+"sexpr : sexpr POWOP sexpr",
+"sexpr : sexpr MULOP sexpr",
+"sexpr : sexpr ADDOP sexpr",
+"sexpr : sexpr SHIFTOP sexpr",
+"sexpr : sexpr RELOP sexpr",
+"sexpr : sexpr EQOP sexpr",
+"sexpr : sexpr BITANDOP sexpr",
+"sexpr : sexpr BITOROP sexpr",
+"sexpr : sexpr DOTDOT sexpr",
+"sexpr : sexpr ANDAND sexpr",
+"sexpr : sexpr OROR sexpr",
+"sexpr : sexpr '?' sexpr ':' sexpr",
+"sexpr : sexpr MATCHOP sexpr",
+"sexpr : term",
+"term : '-' term",
+"term : '+' term",
+"term : '!' term",
+"term : '~' term",
+"term : REFGEN term",
+"term : term POSTINC",
+"term : term POSTDEC",
+"term : PREINC term",
+"term : PREDEC term",
+"term : LOCAL sexpr",
+"term : '(' expr crp",
+"term : '(' ')'",
+"term : '[' expr crb",
+"term : '[' ']'",
+"term : HASHBRACK expr crhb",
+"term : HASHBRACK ';' '}'",
+"term : scalar",
+"term : star",
+"term : scalar '[' expr ']'",
+"term : term ARROW '[' expr ']'",
+"term : hsh",
+"term : ary",
+"term : arylen",
+"term : scalar '{' expr ';' '}'",
+"term : term ARROW '{' expr ';' '}'",
+"term : '(' expr crp '[' expr ']'",
+"term : '(' ')' '[' expr ']'",
+"term : ary '[' expr ']'",
+"term : ary '{' expr ';' '}'",
+"term : DELETE scalar '{' expr ';' '}'",
+"term : DELETE '(' scalar '{' expr ';' '}' ')'",
+"term : THING",
+"term : amper",
+"term : amper '(' ')'",
+"term : amper '(' expr crp",
+"term : NOAMP WORD listexpr",
+"term : DO sexpr",
+"term : DO block",
+"term : DO WORD '(' ')'",
+"term : DO WORD '(' expr crp",
+"term : DO scalar '(' ')'",
+"term : DO scalar '(' expr crp",
+"term : LOOPEX",
+"term : LOOPEX WORD",
+"term : UNIOP",
+"term : UNIOP block",
+"term : UNIOP sexpr",
+"term : FUNC0",
+"term : FUNC0 '(' ')'",
+"term : FUNC1 '(' ')'",
+"term : FUNC1 '(' expr ')'",
+"term : PMFUNC '(' sexpr ')'",
+"term : PMFUNC '(' sexpr ',' sexpr ')'",
+"term : WORD",
+"term : listop",
+"listexpr :",
+"listexpr : expr",
+"amper : '&' indirob",
+"scalar : '$' indirob",
+"ary : '@' indirob",
+"hsh : '%' indirob",
+"arylen : DOLSHARP indirob",
+"star : '*' indirob",
+"indirob : WORD",
+"indirob : scalar",
+"indirob : block",
+"indirob : PRIVATEREF",
+"crp : ',' ')'",
+"crp : ')'",
+"crb : ',' ']'",
+"crb : ']'",
+"crhb : ',' ';' '}'",
+"crhb : ';' '}'",
 };
-#endif /* YYDEBUG */
-#line 1 "/usr/lib/yaccpar"
-/*     @(#)yaccpar 1.10 89/04/04 SMI; from S5R3 1.10   */
-
-/*
-** Skeleton parser driver for yacc output
-*/
-
-/*
-** yacc user known macros and defines
-*/
-#define YYERROR                goto yyerrlab
-#define YYACCEPT       { free(yys); free(yyv); return(0); }
-#define YYABORT                { free(yys); free(yyv); return(1); }
-#define YYBACKUP( newtoken, newvalue )\
-{\
-       if ( yychar >= 0 || ( yyr2[ yytmp ] >> 1 ) != 1 )\
-       {\
-               yyerror( "syntax error - cannot backup" );\
-               goto yyerrlab;\
-       }\
-       yychar = newtoken;\
-       yystate = *yyps;\
-       yylval = newvalue;\
-       goto yynewstate;\
-}
-#define YYRECOVERING() (!!yyerrflag)
-#ifndef YYDEBUG
-#      define YYDEBUG  1       /* make debugging available */
 #endif
-
-/*
-** user known globals
-*/
-int yydebug;                   /* set to 1 to get debugging */
-
-/*
-** driver internal defines
-*/
-#define YYFLAG         (-1000)
-
-/*
-** static variables used by the parser
-*/
-static YYSTYPE *yyv;                   /* value stack */
-static int *yys;                       /* state stack */
-
-static YYSTYPE *yypv;                  /* top of value stack */
-static int *yyps;                      /* top of state stack */
-
-static int yystate;                    /* current state */
-static int yytmp;                      /* extra var (lasts between blocks) */
-
-int yynerrs;                   /* number of errors */
-
-int yyerrflag;                 /* error recovery flag */
-int yychar;                    /* current input token number */
-
-
-/*
-** yyparse - return 0 if worked, 1 if syntax error not recovered from
-*/
+#define yyclearin (yychar=(-1))
+#define yyerrok (yyerrflag=0)
+#ifdef YYSTACKSIZE
+#ifndef YYMAXDEPTH
+#define YYMAXDEPTH YYSTACKSIZE
+#endif
+#else
+#ifdef YYMAXDEPTH
+#define YYSTACKSIZE YYMAXDEPTH
+#else
+#define YYSTACKSIZE 500
+#define YYMAXDEPTH 500
+#endif
+#endif
+int yydebug;
+int yynerrs;
+int yyerrflag;
+int yychar;
+YYSTYPE yyval;
+YYSTYPE yylval;
+#line 579 "perly.y"
+ /* PROGRAM */
+#line 1392 "y.tab.c"
+#define YYABORT goto yyabort
+#define YYACCEPT goto yyaccept
+#define YYERROR goto yyerrlab
 int
 yyparse()
 {
-       register YYSTYPE *yypvt;        /* top of value stack for $vars */
-       unsigned yymaxdepth = YYMAXDEPTH;
+    register int yym, yyn, yystate;
+    register short *yyssp;
+    register YYSTYPE *yyvsp;
+    short* yyss;
+    YYSTYPE* yyvs;
+    unsigned yystacksize = YYSTACKSIZE;
+    int oldyydebug     = yydebug;
+    int oldyynerrs     = yynerrs;
+    int oldyyerrflag   = yyerrflag;
+    int oldyychar      = yychar;
+    YYSTYPE oldyyval   = yyval;
+    YYSTYPE oldyylval  = yylval;
+    int retval = 0;
 
-       /*
-       ** Initialize externals - yyparse may be called more than once
-       */
-       yyv = (YYSTYPE*)malloc(yymaxdepth*sizeof(YYSTYPE));
-       yys = (int*)malloc(yymaxdepth*sizeof(int));
-       if (!yyv || !yys)
-       {
-               yyerror( "out of memory" );
-               return(1);
-       }
-       yypv = &yyv[-1];
-       yyps = &yys[-1];
-       yystate = 0;
-       yytmp = 0;
-       yynerrs = 0;
-       yyerrflag = 0;
-       yychar = -1;
-
-       goto yystack;
-       {
-               register YYSTYPE *yy_pv;        /* top of value stack */
-               register int *yy_ps;            /* top of state stack */
-               register int yy_state;          /* current state */
-               register int  yy_n;             /* internal state number info */
+#if YYDEBUG
+    register char *yys;
+    extern char *getenv();
 
-               /*
-               ** get globals into registers.
-               ** branch to here only if YYBACKUP was called.
-               */
-       yynewstate:
-               yy_pv = yypv;
-               yy_ps = yyps;
-               yy_state = yystate;
-               goto yy_newstate;
+    if (yys = getenv("YYDEBUG"))
+    {
+        yyn = *yys;
+        if (yyn >= '0' && yyn <= '9')
+            yydebug = yyn - '0';
+    }
+#endif
 
-               /*
-               ** get globals into registers.
-               ** either we just started, or we just finished a reduction
-               */
-       yystack:
-               yy_pv = yypv;
-               yy_ps = yyps;
-               yy_state = yystate;
+    yynerrs = 0;
+    yyerrflag = 0;
+    yychar = (-1);
 
-               /*
-               ** top of for (;;) loop while no reductions done
-               */
-       yy_stack:
-               /*
-               ** put a state and value onto the stacks
-               */
-#if YYDEBUG
-               /*
-               ** if debugging, look up token value in list of value vs.
-               ** name pairs.  0 and negative (-1) are special values.
-               ** Note: linear search is used since time is not a real
-               ** consideration while debugging.
-               */
-               if ( yydebug )
-               {
-                       register int yy_i;
+    /*
+    ** Initialize private stacks (yyparse may be called from an action)
+    */
+    yyss = (short*)malloc(yystacksize*sizeof(short));
+    yyvs = (YYSTYPE*)malloc(yystacksize*sizeof(YYSTYPE));
+    if (!yyvs || !yyss)
+       goto yyoverflow;
 
-                       (void)printf( "State %d, token ", yy_state );
-                       if ( yychar == 0 )
-                               (void)printf( "end-of-file\n" );
-                       else if ( yychar < 0 )
-                               (void)printf( "-none-\n" );
-                       else
-                       {
-                               for ( yy_i = 0; yytoks[yy_i].t_val >= 0;
-                                       yy_i++ )
-                               {
-                                       if ( yytoks[yy_i].t_val == yychar )
-                                               break;
-                               }
-                               (void)printf( "%s\n", yytoks[yy_i].t_name );
-                       }
-               }
-#endif /* YYDEBUG */
-               if ( ++yy_ps >= &yys[ yymaxdepth ] )    /* room on stack? */
-               {
-                       /*
-                       ** reallocate and recover.  Note that pointers
-                       ** have to be reset, or bad things will happen
-                       */
-                       int yyps_index = (yy_ps - yys);
-                       int yypv_index = (yy_pv - yyv);
-                       int yypvt_index = (yypvt - yyv);
-                       yymaxdepth += YYMAXDEPTH;
-                       yyv = (YYSTYPE*)realloc((char*)yyv,
-                               yymaxdepth * sizeof(YYSTYPE));
-                       yys = (int*)realloc((char*)yys,
-                               yymaxdepth * sizeof(int));
-                       if (!yyv || !yys)
-                       {
-                               yyerror( "yacc stack overflow" );
-                               return(1);
-                       }
-                       yy_ps = yys + yyps_index;
-                       yy_pv = yyv + yypv_index;
-                       yypvt = yyv + yypvt_index;
-               }
-               *yy_ps = yy_state;
-               *++yy_pv = yyval;
+    yyssp = yyss;
+    yyvsp = yyvs;
+    *yyssp = yystate = 0;
 
-               /*
-               ** we have a new state - find out what to do
-               */
-       yy_newstate:
-               if ( ( yy_n = yypact[ yy_state ] ) <= YYFLAG )
-                       goto yydefault;         /* simple state */
+yyloop:
+    if (yyn = yydefred[yystate]) goto yyreduce;
+    if (yychar < 0)
+    {
+        if ((yychar = yylex()) < 0) yychar = 0;
 #if YYDEBUG
-               /*
-               ** if debugging, need to mark whether new token grabbed
-               */
-               yytmp = yychar < 0;
+        if (yydebug)
+        {
+            yys = 0;
+            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
+            if (!yys) yys = "illegal-symbol";
+            printf("yydebug: state %d, reading %d (%s)\n", yystate,
+                    yychar, yys);
+        }
 #endif
-               if ( ( yychar < 0 ) && ( ( yychar = yylex() ) < 0 ) )
-                       yychar = 0;             /* reached EOF */
-#if YYDEBUG
-               if ( yydebug && yytmp )
-               {
-                       register int yy_i;
-
-                       (void)printf( " *** Received token " );
-                       if ( yychar == 0 )
-                               (void)printf( "end-of-file\n" );
-                       else if ( yychar < 0 )
-                               (void)printf( "-none-\n" );
-                       else
-                       {
-                               for ( yy_i = 0; yytoks[yy_i].t_val >= 0;
-                                       yy_i++ )
-                               {
-                                       if ( yytoks[yy_i].t_val == yychar )
-                                               break;
-                               }
-                               (void)printf( "%s\n", yytoks[yy_i].t_name );
-                       }
-               }
-#endif /* YYDEBUG */
-               if ( ( ( yy_n += yychar ) < 0 ) || ( yy_n >= YYLAST ) )
-                       goto yydefault;
-               if ( yychk[ yy_n = yyact[ yy_n ] ] == yychar )  /*valid shift*/
-               {
-                       yychar = -1;
-                       yyval = yylval;
-                       yy_state = yy_n;
-                       if ( yyerrflag > 0 )
-                               yyerrflag--;
-                       goto yy_stack;
-               }
-
-       yydefault:
-               if ( ( yy_n = yydef[ yy_state ] ) == -2 )
-               {
+    }
+    if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
+            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
+    {
 #if YYDEBUG
-                       yytmp = yychar < 0;
+        if (yydebug)
+            printf("yydebug: state %d, shifting to state %d\n",
+                    yystate, yytable[yyn]);
 #endif
-                       if ( ( yychar < 0 ) && ( ( yychar = yylex() ) < 0 ) )
-                               yychar = 0;             /* reached EOF */
+        if (yyssp >= yyss + yystacksize - 1)
+        {
+           /*
+           ** reallocate and recover.  Note that pointers
+           ** have to be reset, or bad things will happen
+           */
+           int yyps_index = (yyssp - yyss);
+           int yypv_index = (yyvsp - yyvs);
+           yystacksize += YYSTACKSIZE;
+           yyvs = (YYSTYPE*)realloc((char*)yyvs,yystacksize * sizeof(YYSTYPE));
+           yyss = (short*)realloc((char*)yyss,yystacksize * sizeof(short));
+           if (!yyvs || !yyss)
+               goto yyoverflow;
+           yyssp = yyss + yyps_index;
+           yyvsp = yyvs + yypv_index;
+        }
+        *++yyssp = yystate = yytable[yyn];
+        *++yyvsp = yylval;
+        yychar = (-1);
+        if (yyerrflag > 0)  --yyerrflag;
+        goto yyloop;
+    }
+    if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
+            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
+    {
+        yyn = yytable[yyn];
+        goto yyreduce;
+    }
+    if (yyerrflag) goto yyinrecovery;
+#ifdef lint
+    goto yynewerror;
+#endif
+yynewerror:
+    yyerror("syntax error");
+#ifdef lint
+    goto yyerrlab;
+#endif
+yyerrlab:
+    ++yynerrs;
+yyinrecovery:
+    if (yyerrflag < 3)
+    {
+        yyerrflag = 3;
+        for (;;)
+        {
+            if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
+                    yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
+            {
 #if YYDEBUG
-                       if ( yydebug && yytmp )
-                       {
-                               register int yy_i;
-
-                               (void)printf( " *** Received token " );
-                               if ( yychar == 0 )
-                                       (void)printf( "end-of-file\n" );
-                               else if ( yychar < 0 )
-                                       (void)printf( "-none-\n" );
-                               else
-                               {
-                                       for ( yy_i = 0;
-                                               yytoks[yy_i].t_val >= 0;
-                                               yy_i++ )
-                                       {
-                                               if ( yytoks[yy_i].t_val
-                                                       == yychar )
-                                               {
-                                                       break;
-                                               }
-                                       }
-                                       (void)printf( "%s\n", yytoks[yy_i].t_name );
-                               }
-                       }
-#endif /* YYDEBUG */
-                       /*
-                       ** look through exception table
-                       */
-                       {
-                               register int *yyxi = yyexca;
-
-                               while ( ( *yyxi != -1 ) ||
-                                       ( yyxi[1] != yy_state ) )
-                               {
-                                       yyxi += 2;
-                               }
-                               while ( ( *(yyxi += 2) >= 0 ) &&
-                                       ( *yyxi != yychar ) )
-                                       ;
-                               if ( ( yy_n = yyxi[1] ) < 0 )
-                                       YYACCEPT;
-                       }
-               }
-
-               /*
-               ** check for syntax error
-               */
-               if ( yy_n == 0 )        /* have an error */
-               {
-                       /* no worry about speed here! */
-                       switch ( yyerrflag )
-                       {
-                       case 0:         /* new error */
-                               yyerror( "syntax error" );
-                               goto skip_init;
-                       yyerrlab:
-                               /*
-                               ** get globals into registers.
-                               ** we have a user generated syntax type error
-                               */
-                               yy_pv = yypv;
-                               yy_ps = yyps;
-                               yy_state = yystate;
-                               yynerrs++;
-                       skip_init:
-                       case 1:
-                       case 2:         /* incompletely recovered error */
-                                       /* try again... */
-                               yyerrflag = 3;
-                               /*
-                               ** find state where "error" is a legal
-                               ** shift action
-                               */
-                               while ( yy_ps >= yys )
-                               {
-                                       yy_n = yypact[ *yy_ps ] + YYERRCODE;
-                                       if ( yy_n >= 0 && yy_n < YYLAST &&
-                                               yychk[yyact[yy_n]] == YYERRCODE)                                        {
-                                               /*
-                                               ** simulate shift of "error"
-                                               */
-                                               yy_state = yyact[ yy_n ];
-                                               goto yy_stack;
-                                       }
-                                       /*
-                                       ** current state has no shift on
-                                       ** "error", pop stack
-                                       */
+                if (yydebug)
+                    printf("yydebug: state %d, error recovery shifting\
+ to state %d\n", *yyssp, yytable[yyn]);
+#endif
+                if (yyssp >= yyss + yystacksize - 1)
+                {
+                   /*
+                   ** reallocate and recover.  Note that pointers
+                   ** have to be reset, or bad things will happen
+                   */
+                   int yyps_index = (yyssp - yyss);
+                   int yypv_index = (yyvsp - yyvs);
+                   yystacksize += YYSTACKSIZE;
+                   yyvs = (YYSTYPE*)realloc((char*)yyvs,
+                       yystacksize * sizeof(YYSTYPE));
+                   yyss = (short*)realloc((char*)yyss,
+                       yystacksize * sizeof(short));
+                   if (!yyvs || !yyss)
+                       goto yyoverflow;
+                   yyssp = yyss + yyps_index;
+                   yyvsp = yyvs + yypv_index;
+                }
+                *++yyssp = yystate = yytable[yyn];
+                *++yyvsp = yylval;
+                goto yyloop;
+            }
+            else
+            {
 #if YYDEBUG
-#      define _POP_ "Error recovery pops state %d, uncovers state %d\n"
-                                       if ( yydebug )
-                                               (void)printf( _POP_, *yy_ps,
-                                                       yy_ps[-1] );
-#      undef _POP_
+                if (yydebug)
+                    printf("yydebug: error recovery discarding state %d\n",
+                            *yyssp);
 #endif
-                                       yy_ps--;
-                                       yy_pv--;
-                               }
-                               /*
-                               ** there is no state on stack with "error" as
-                               ** a valid shift.  give up.
-                               */
-                               YYABORT;
-                       case 3:         /* no shift yet; eat a token */
+                if (yyssp <= yyss) goto yyabort;
+                --yyssp;
+                --yyvsp;
+            }
+        }
+    }
+    else
+    {
+        if (yychar == 0) goto yyabort;
 #if YYDEBUG
-                               /*
-                               ** if debugging, look up token in list of
-                               ** pairs.  0 and negative shouldn't occur,
-                               ** but since timing doesn't matter when
-                               ** debugging, it doesn't hurt to leave the
-                               ** tests here.
-                               */
-                               if ( yydebug )
-                               {
-                                       register int yy_i;
-
-                                       (void)printf( "Error recovery discards " );
-                                       if ( yychar == 0 )
-                                               (void)printf( "token end-of-file\n" );
-                                       else if ( yychar < 0 )
-                                               (void)printf( "token -none-\n" );
-                                       else
-                                       {
-                                               for ( yy_i = 0;
-                                                       yytoks[yy_i].t_val >= 0;
-                                                       yy_i++ )
-                                               {
-                                                       if ( yytoks[yy_i].t_val
-                                                               == yychar )
-                                                       {
-                                                               break;
-                                                       }
-                                               }
-                                               (void)printf( "token %s\n",
-                                                       yytoks[yy_i].t_name );
-                                       }
-                               }
-#endif /* YYDEBUG */
-                               if ( yychar == 0 )      /* reached