This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Remove MAD.
authorJarkko Hietaniemi <jhi@iki.fi>
Fri, 13 Jun 2014 19:21:25 +0000 (15:21 -0400)
committerJarkko Hietaniemi <jhi@iki.fi>
Fri, 13 Jun 2014 19:41:55 +0000 (15:41 -0400)
MAD = Misc Attribute Decoration; unmaintained attempt at preserving
the Perl parse tree more faithfully so that automatic conversion to
Perl 6 would have been easier.

46 files changed:
Configure
Cross/Makefile-cross-SH
Cross/cflags-cross-arm
MANIFEST
Makefile.SH
Porting/Glossary
Porting/config.sh
Porting/config_H
config_h.SH
dump.c
embed.fnc
embed.h
embedvar.h
ext/Devel-Peek/Peek.xs
intrpvar.h
locale.c
mad/Nomad.pm [deleted file]
mad/P5AST.pm [deleted file]
mad/P5re.pm [deleted file]
mad/PLXML.pm [deleted file]
mad/p55 [deleted file]
mad/t/p55.t [deleted file]
madly.c [deleted file]
makedef.pl
op.c
op.h
pad.c
pad.h
parser.h
perl.c
perl.h
perly.act
perly.c
perly.h
perly.tab
perly.y
pp_ctl.c
proto.h
regen_perly.pl
sv.c
t/run/mad.t [deleted file]
toke.c
uconfig.h
uconfig.sh
win32/config_H.gc
win32/config_H.vc

index c84249f..4e6315d 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -1042,10 +1042,6 @@ sPRIgldbl=''
 sSCNfldbl=''
 lseeksize=''
 lseektype=''
-mad=''
-madlyh=''
-madlyobj=''
-madlysrc=''
 make_set_make=''
 d_mymalloc=''
 freetype=''
@@ -20338,40 +20334,6 @@ EOM
 *)  groupstype="$gidtype";;
 esac
 
-: MAD = Misc Attribute Definition
-
-if $test $patchlevel -lt 9; then
-: MAD is not available in 5.8.x or earlier.
-    ans=n;
-else
-    case "$mad" in
-    $define|true|[yY]*)        dflt='y' ;;
-    *)                 dflt='n' ;;
-    esac
-    cat <<EOM
-
-Would you like to build with Misc Attribute Decoration? This is development
-work leading to a Perl 5 to Perl 6 convertor, which imposes a space and speed
-overhead on the interpreter.
-
-If this doesn't make any sense to you, just accept the default '$dflt'.
-EOM
-    rp='Build Perl with MAD?'
-    . ./myread
-fi
-case "$ans" in
-y|Y)   val="$define"
-       madlyh='madly.h madly.act madly.tab'
-       madlysrc='madly.c'
-       madlyobj="madly$_o" ;;
-*)     val="$undef"
-       madlyh=''
-       madlysrc=''
-       madlyobj='' ;;
-esac
-set mad
-eval $setvar
-
 : check whether make sets MAKE
 echo " "
 echo "Checking if your $make program sets \$(MAKE)..." >&4
@@ -23746,10 +23708,6 @@ lpr='$lpr'
 ls='$ls'
 lseeksize='$lseeksize'
 lseektype='$lseektype'
-mad='$mad'
-madlyh='$madlyh'
-madlyobj='$madlyobj'
-madlysrc='$madlysrc'
 mail='$mail'
 mailx='$mailx'
 make='$make'
index 13945ce..eb673ce 100644 (file)
@@ -196,8 +196,6 @@ CLDFLAGS = $ldflags
 
 mallocsrc = $mallocsrc
 mallocobj = $mallocobj
-madlysrc = $madlysrc
-madlyobj = $madlyobj
 LNS = $lns
 # NOTE: some systems don't grok "cp -f". XXX Configure test needed?
 CPS = $cp
@@ -351,11 +349,11 @@ c1 = av.c scope.c op.c doop.c doio.c dump.c gv.c hv.c mg.c reentr.c mro.c perl.c
 c2 = perly.c pp.c pp_hot.c pp_ctl.c pp_sys.c regcomp.c regexec.c utf8.c sv.c
 c3 = taint.c toke.c util.c deb.c run.c universal.c pad.c globals.c keywords.c
 c4 = perlio.c perlapi.c numeric.c mathoms.c locale.c pp_pack.c pp_sort.c
-c5 = $(madlysrc) $(mallocsrc)
+c5 = $(mallocsrc)
 
 c = $(c1) $(c2) $(c3) $(c4) $(c5) miniperlmain.c perlmain.c opmini.c
 
-obj1 = $(madlyobj) $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) op$(OBJ_EXT) pad$(OBJ_EXT) regcomp$(OBJ_EXT) dump$(OBJ_EXT) util$(OBJ_EXT) mg$(OBJ_EXT) reentr$(OBJ_EXT) mro$(OBJ_EXT)
+obj1 = $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) op$(OBJ_EXT) pad$(OBJ_EXT) regcomp$(OBJ_EXT) dump$(OBJ_EXT) util$(OBJ_EXT) mg$(OBJ_EXT) reentr$(OBJ_EXT) mro$(OBJ_EXT)
 obj2 = hv$(OBJ_EXT) av$(OBJ_EXT) perl$(OBJ_EXT) run$(OBJ_EXT) pp_hot$(OBJ_EXT) sv$(OBJ_EXT) pp$(OBJ_EXT) scope$(OBJ_EXT) pp_ctl$(OBJ_EXT) pp_sys$(OBJ_EXT)
 obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) utf8$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) universal$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT) perlapi$(OBJ_EXT) numeric$(OBJ_EXT) mathoms$(OBJ_EXT) locale$(OBJ_EXT) pp_pack$(OBJ_EXT) pp_sort$(OBJ_EXT)
 
index acec8cc..8ee55a5 100644 (file)
@@ -78,7 +78,6 @@ for file do
     gv) ;;
     hv) ;;
     locale) ;;
-    madly) ;;
     main) ;;
     malloc) ;;
     mg) ;;
index 487e350..7ba8ccd 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -4235,13 +4235,6 @@ lib/warnings.pm                  For "use warnings"
 lib/warnings/register.pm       For "use warnings::register"
 lib/warnings.t                 See if warning controls work
 locale.c                       locale-specific utility functions
-madly.c                                parser code for MAD build
-mad/Nomad.pm                   Converts MAD XML dump to Perl 5
-mad/p55                                Perl 5 to Perl 5 translator - driver for nomad
-mad/P5AST.pm                   Used by nomad
-mad/P5re.pm                    Used by nomad
-mad/PLXML.pm                   Used by nomad
-mad/t/p55.t                    Test for the Perl 5 to Perl 5 translator
 makedef.pl                     Create symbol export lists for linking
 makedepend.SH                  Precursor to makedepend
 make_ext.pl                    Used by Makefile to execute extension Makefiles
@@ -5305,7 +5298,6 @@ t/run/flib/t2.pm          Test for .pmcs with -I/dir/
 t/run/flib/t2.pmc              Test for .pmcs with -I/dir/
 t/run/fresh_perl.t             Tests that require a fresh perl.
 t/run/locale.t         Tests related to locale handling
-t/run/mad.t                    Test vs MAD environment
 t/run/noswitch.t               Test aliasing ARGV for other switch tests
 t/run/runenv.t                 Test if perl honors its environment variables.
 t/run/script.t                 See if script invocation works
index 8c6221a..8438c4b 100755 (executable)
@@ -248,8 +248,6 @@ CLDFLAGS = $ldflags
 
 mallocsrc = $mallocsrc
 mallocobj = $mallocobj
-madlysrc = $madlysrc
-madlyobj = $madlyobj
 LNS = $lns
 # NOTE: some systems don't grok "cp -f". XXX Configure test needed?
 CPS = $cp
@@ -476,13 +474,13 @@ c1 = av.c scope.c op.c doop.c doio.c dump.c gv.c hv.c mg.c reentr.c mro.c perl.c
 c2 = perly.c pp.c pp_hot.c pp_ctl.c pp_sys.c regcomp.c regexec.c utf8.c sv.c
 c3 = taint.c toke.c util.c deb.c run.c universal.c pad.c globals.c keywords.c
 c4 = perlio.c perlapi.c numeric.c mathoms.c locale.c pp_pack.c pp_sort.c caretx.c
-c5 = $(madlysrc) $(mallocsrc)
+c5 = $(mallocsrc)
 
 c = $(c1) $(c2) $(c3) $(c4) $(c5) miniperlmain.c opmini.c perlmini.c
 
 obj0 = op$(OBJ_EXT) perl$(OBJ_EXT)
 obj0mini = perlmini$(OBJ_EXT) opmini$(OBJ_EXT) miniperlmain$(OBJ_EXT)
-obj1 = $(madlyobj) $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) pad$(OBJ_EXT) regcomp$(OBJ_EXT) dump$(OBJ_EXT) util$(OBJ_EXT) mg$(OBJ_EXT) reentr$(OBJ_EXT) mro$(OBJ_EXT) keywords$(OBJ_EXT)
+obj1 = $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) pad$(OBJ_EXT) regcomp$(OBJ_EXT) dump$(OBJ_EXT) util$(OBJ_EXT) mg$(OBJ_EXT) reentr$(OBJ_EXT) mro$(OBJ_EXT) keywords$(OBJ_EXT)
 obj2 = hv$(OBJ_EXT) av$(OBJ_EXT) run$(OBJ_EXT) pp_hot$(OBJ_EXT) sv$(OBJ_EXT) pp$(OBJ_EXT) scope$(OBJ_EXT) pp_ctl$(OBJ_EXT) pp_sys$(OBJ_EXT)
 obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) utf8$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) universal$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT) perlapi$(OBJ_EXT) numeric$(OBJ_EXT) mathoms$(OBJ_EXT) locale$(OBJ_EXT) pp_pack$(OBJ_EXT) pp_sort$(OBJ_EXT) caretx$(OBJ_EXT)
 
index 9128f5f..c58fb52 100644 (file)
@@ -3830,22 +3830,6 @@ lseektype (lseektype.U):
        or whatever type is used to declare lseek offset's type in the
        kernel (which also appears to be lseek's return type).
 
-mad (mad.U):
-       This variable indicates that the Misc Attribute Definition code is to
-       be compiled.
-
-madlyh (mad.U):
-       If the Misc Attribute Decoration is to be compiled, this variable is
-       set to the name of the extra header files to be used, else it is ''
-
-madlyobj (mad.U):
-       If the Misc Attribute Decoration is to be compiled, this variable is
-       set to the name of the extra object files to be used, else it is ''
-
-madlysrc (mad.U):
-       If the Misc Attribute Decoration is to be compiled, this variable is
-       set to the name of the extra C source files to be used, else it is ''
-
 mail (Loc.U):
        This variable is defined but not used by Configure.
        The value is the empty string and is not useful.
index 372acb5..0a352e1 100644 (file)
@@ -822,9 +822,6 @@ ls='ls'
 lseeksize='8'
 lseektype='off_t'
 mad='undef'
-madlyh=''
-madlyobj=''
-madlysrc=''
 mail=''
 mailx=''
 make='make'
index 6c1f125..9e99b54 100644 (file)
 #define PERL_PRIeldbl  "Le"    /**/
 #define PERL_SCNfldbl  "Lf"    /**/
 
-/* PERL_MAD:
- *     This symbol, if defined, indicates that the Misc Attribution
- *     Declaration code should be conditionally compiled.
- */
-/*#define      PERL_MAD                / **/
-
 /* NEED_VA_COPY:
  *     This symbol, if defined, indicates that the system stores
  *     the variable argument list datatype, va_list, in a format
index c320df3..db150a6 100755 (executable)
@@ -4425,12 +4425,6 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
 #$d_PRIeldbl PERL_PRIeldbl     $sPRIeldbl      /**/
 #$d_SCNfldbl PERL_SCNfldbl     $sSCNfldbl      /**/
 
-/* PERL_MAD:
- *     This symbol, if defined, indicates that the Misc Attribution
- *     Declaration code should be conditionally compiled.
- */
-#$mad  PERL_MAD                /**/
-
 /* NEED_VA_COPY:
  *     This symbol, if defined, indicates that the system stores
  *     the variable argument list datatype, va_list, in a format
diff --git a/dump.c b/dump.c
index 6bc0211..9bbbe2d 100644 (file)
--- a/dump.c
+++ b/dump.c
@@ -884,7 +884,7 @@ S_op_private_to_names(pTHX_ SV *tmpsv, U32 optype, U32 op_private) {
     return FALSE;
 }
 
-#define DUMP_OP_FLAGS(o,xml,level,file)                                 \
+#define DUMP_OP_FLAGS(o,level,file)                                 \
     if (o->op_flags || o->op_slabbed || o->op_savefree || o->op_static) { \
         SV * const tmpsv = newSVpvs("");                                \
         switch (o->op_flags & OPf_WANT) {                               \
@@ -906,22 +906,11 @@ S_op_private_to_names(pTHX_ SV *tmpsv, U32 optype, U32 op_private) {
         if (o->op_savefree) sv_catpvs(tmpsv, ",SAVEFREE");              \
         if (o->op_static)   sv_catpvs(tmpsv, ",STATIC");                \
         if (o->op_folded)   sv_catpvs(tmpsv, ",FOLDED");                \
-        if (!xml)                                                        \
-            Perl_dump_indent(aTHX_ level, file, "FLAGS = (%s)\n",       \
-                            SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");\
-        else                                                            \
-            PerlIO_printf(file, " flags=\"%s\"",                        \
-                          SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");        \
+        Perl_dump_indent(aTHX_ level, file, "FLAGS = (%s)\n",           \
+                         SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");   \
     }
 
-#if !defined(PERL_MAD)
-# define xmldump_attr1(level, file, pat, arg)
-#else
-# define xmldump_attr1(level, file, pat, arg) \
-       S_xmldump_attr(aTHX_ level, file, pat, arg)
-#endif
-
-#define DUMP_OP_PRIVATE(o,xml,level,file)                               \
+#define DUMP_OP_PRIVATE(o,level,file)                                   \
     if (o->op_private) {                                                \
         U32 optype = o->op_type;                                        \
         U32 oppriv = o->op_private;                                     \
@@ -1003,11 +992,8 @@ S_op_private_to_names(pTHX_ SV *tmpsv, U32 optype, U32 op_private) {
            && oppriv & OPpSLICEWARNING  )                               \
             sv_catpvs(tmpsv, ",SLICEWARNING");                          \
        if (SvCUR(tmpsv)) {                                             \
-            if (xml)                                                    \
-                xmldump_attr1(level+1, file, "private=\"%s\"", SvPVX(tmpsv)+1); \
-            else                                                        \
-                Perl_dump_indent(aTHX_ level, file, "PRIVATE = (%s)\n", SvPVX_const(tmpsv) + 1); \
-       } else if (!xml)                                                \
+            Perl_dump_indent(aTHX_ level, file, "PRIVATE = (%s)\n", SvPVX_const(tmpsv) + 1); \
+       } else                                                          \
             Perl_dump_indent(aTHX_ level, file, "PRIVATE = (0x%"UVxf")\n", \
                              (UV)oppriv);                               \
     }
@@ -1073,49 +1059,9 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
     Perl_dump_indent(aTHX_ level, file, "ADDR = 0x%"UVxf" => 0x%"UVxf"\n", (UV)o, (UV)o->op_next);
 #endif
 
-    DUMP_OP_FLAGS(o,0,level,file);
-    DUMP_OP_PRIVATE(o,0,level,file);
-
-#ifdef PERL_MAD
-    if (PL_madskills && o->op_madprop) {
-       SV * const tmpsv = newSVpvs("");
-       MADPROP* mp = o->op_madprop;
-       Perl_dump_indent(aTHX_ level, file, "MADPROPS = {\n");
-       level++;
-       while (mp) {
-           const char tmp = mp->mad_key;
-           sv_setpvs(tmpsv,"'");
-           if (tmp)
-               sv_catpvn(tmpsv, &tmp, 1);
-           sv_catpv(tmpsv, "'=");
-           switch (mp->mad_type) {
-           case MAD_NULL:
-               sv_catpv(tmpsv, "NULL");
-               Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
-               break;
-           case MAD_PV:
-               sv_catpv(tmpsv, "<");
-               sv_catpvn(tmpsv, (char*)mp->mad_val, mp->mad_vlen);
-               sv_catpv(tmpsv, ">");
-               Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
-               break;
-           case MAD_OP:
-               if ((OP*)mp->mad_val) {
-                   Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
-                   do_op_dump(level, file, (OP*)mp->mad_val);
-               }
-               break;
-           default:
-               sv_catpv(tmpsv, "(UNK)");
-               Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
-               break;
-           }
-           mp = mp->mad_next;
-       }
-       level--;
-       Perl_dump_indent(aTHX_ level, file, "}\n");
-    }
-#endif
+    DUMP_OP_FLAGS(o,level,file);
+    DUMP_OP_PRIVATE(o,level,file);
+
 
     switch (optype) {
     case OP_AELEMFAST:
@@ -1130,11 +1076,6 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
       const char * name;
       SV * const tmpsv  = newSVpvs_flags("", SVs_TEMP);
       SV * const tmpsv2 = newSVpvs_flags("", SVs_TEMP);
-#ifdef PERL_MAD
-               /* FIXME - is this making unwarranted assumptions about the
-                  UTF-8 cleanliness of the dump file handle?  */
-               SvUTF8_on(tmpsv);
-#endif
                gv_fullname3(tmpsv, MUTABLE_GV(cSVOPo->op_sv), NULL);
       name = SvPV_const(tmpsv, len);
                Perl_dump_indent(aTHX_ level, file, "GV = %s\n",
@@ -2461,11 +2402,6 @@ Perl_debop(pTHX_ const OP *o)
     case OP_GV:
        if (cGVOPo_gv) {
            SV * const sv = newSV(0);
-#ifdef PERL_MAD
-           /* FIXME - is this making unwarranted assumptions about the
-              UTF-8 cleanliness of the dump file handle?  */
-           SvUTF8_on(sv);
-#endif
            gv_fullname3(sv, cGVOPo_gv, NULL);
            PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
            SvREFCNT_dec_NN(sv);
@@ -2578,697 +2514,6 @@ Perl_debprofdump(pTHX)
     }
 }
 
-#ifdef PERL_MAD
-/*
- *    XML variants of most of the above routines
- */
-
-STATIC void
-S_xmldump_attr(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
-{
-    va_list args;
-
-    PERL_ARGS_ASSERT_XMLDUMP_ATTR;
-
-    PerlIO_printf(file, "\n    ");
-    va_start(args, pat);
-    xmldump_vindent(level, file, pat, &args);
-    va_end(args);
-}
-
-
-void
-Perl_xmldump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
-{
-    va_list args;
-    PERL_ARGS_ASSERT_XMLDUMP_INDENT;
-    va_start(args, pat);
-    xmldump_vindent(level, file, pat, &args);
-    va_end(args);
-}
-
-void
-Perl_xmldump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
-{
-    PERL_ARGS_ASSERT_XMLDUMP_VINDENT;
-
-    PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
-    PerlIO_vprintf(file, pat, *args);
-}
-
-void
-Perl_xmldump_all(pTHX)
-{
-    xmldump_all_perl(FALSE);
-}
-
-void
-Perl_xmldump_all_perl(pTHX_ bool justperl PERL_UNUSED_DECL)
-{
-    PerlIO_setlinebuf(PL_xmlfp);
-    if (PL_main_root)
-       op_xmldump(PL_main_root);
-    /* someday we might call this, when it outputs XML: */
-    /* xmldump_packsubs_perl(PL_defstash, justperl); */
-    if (PL_xmlfp != (PerlIO*)PerlIO_stdout())
-       PerlIO_close(PL_xmlfp);
-    PL_xmlfp = 0;
-}
-
-void
-Perl_xmldump_packsubs(pTHX_ const HV *stash)
-{
-    PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS;
-    xmldump_packsubs_perl(stash, FALSE);
-}
-
-void
-Perl_xmldump_packsubs_perl(pTHX_ const HV *stash, bool justperl)
-{
-    I32        i;
-    HE *entry;
-
-    PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS_PERL;
-
-    if (!HvARRAY(stash))
-       return;
-    for (i = 0; i <= (I32) HvMAX(stash); i++) {
-       for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
-           GV *gv = MUTABLE_GV(HeVAL(entry));
-           HV *hv;
-           if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
-               continue;
-           if (GvCVu(gv))
-               xmldump_sub_perl(gv, justperl);
-           if (GvFORM(gv))
-               xmldump_form(gv);
-           if (HeKEY(entry)[HeKLEN(entry)-1] == ':'
-               && (hv = GvHV(gv)) && hv != PL_defstash)
-               xmldump_packsubs_perl(hv, justperl);    /* nested package */
-       }
-    }
-}
-
-void
-Perl_xmldump_sub(pTHX_ const GV *gv)
-{
-    PERL_ARGS_ASSERT_XMLDUMP_SUB;
-    xmldump_sub_perl(gv, FALSE);
-}
-
-void
-Perl_xmldump_sub_perl(pTHX_ const GV *gv, bool justperl)
-{
-    SV * sv;
-
-    PERL_ARGS_ASSERT_XMLDUMP_SUB_PERL;
-
-    if (justperl && (CvISXSUB(GvCV(gv)) || !CvROOT(GvCV(gv))))
-       return;
-
-    sv = sv_newmortal();
-    gv_fullname3(sv, gv, NULL);
-    Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nSUB %s = ", SvPVX(sv));
-    if (CvXSUB(GvCV(gv)))
-       Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "(xsub 0x%"UVxf" %d)\n",
-           PTR2UV(CvXSUB(GvCV(gv))),
-           (int)CvXSUBANY(GvCV(gv)).any_i32);
-    else if (CvROOT(GvCV(gv)))
-       op_xmldump(CvROOT(GvCV(gv)));
-    else
-       Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "<undef>\n");
-}
-
-void
-Perl_xmldump_form(pTHX_ const GV *gv)
-{
-    SV * const sv = sv_newmortal();
-
-    PERL_ARGS_ASSERT_XMLDUMP_FORM;
-
-    gv_fullname3(sv, gv, NULL);
-    Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nFORMAT %s = ", SvPVX(sv));
-    if (CvROOT(GvFORM(gv)))
-       op_xmldump(CvROOT(GvFORM(gv)));
-    else
-       Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "<undef>\n");
-}
-
-void
-Perl_xmldump_eval(pTHX)
-{
-    op_xmldump(PL_eval_root);
-}
-
-char *
-Perl_sv_catxmlsv(pTHX_ SV *dsv, SV *ssv)
-{
-    PERL_ARGS_ASSERT_SV_CATXMLSV;
-    return sv_catxmlpvn(dsv, SvPVX(ssv), SvCUR(ssv), SvUTF8(ssv));
-}
-
-char *
-Perl_sv_catxmlpv(pTHX_ SV *dsv, const char *pv, int utf8)
-{
-    PERL_ARGS_ASSERT_SV_CATXMLPV;
-    return sv_catxmlpvn(dsv, pv, strlen(pv), utf8);
-}
-
-char *
-Perl_sv_catxmlpvn(pTHX_ SV *dsv, const char *pv, STRLEN len, int utf8)
-{
-    unsigned int c;
-    const char * const e = pv + len;
-    const char * const start = pv;
-    STRLEN dsvcur;
-    STRLEN cl;
-
-    PERL_ARGS_ASSERT_SV_CATXMLPVN;
-
-    sv_catpvs(dsv,"");
-    dsvcur = SvCUR(dsv);       /* in case we have to restart */
-
-  retry:
-    while (pv < e) {
-       if (utf8) {
-           c = utf8_to_uvchr_buf((U8*)pv, (U8*)e, &cl);
-           if (cl == 0) {
-               SvCUR(dsv) = dsvcur;
-               pv = start;
-               utf8 = 0;
-               goto retry;
-           }
-       }
-       else
-           c = (*pv & 255);
-
-        if (isCNTRL_L1(c)
-            && c != '\t'
-            && c != '\n'
-            && c != '\r'
-            && c != LATIN1_TO_NATIVE(0x85))
-        {
-           Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c);
-        }
-        else switch (c) {
-       case '<':
-           sv_catpvs(dsv, "&lt;");
-           break;
-       case '>':
-           sv_catpvs(dsv, "&gt;");
-           break;
-       case '&':
-           sv_catpvs(dsv, "&amp;");
-           break;
-       case '"':
-           sv_catpvs(dsv, "&#34;");
-           break;
-       default:
-           if (c < 0xD800) {
-               if (! isPRINT(c)) {
-                   Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c);
-               }
-               else {
-                   const char string = (char) c;
-                   sv_catpvn(dsv, &string, 1);
-               }
-               break;
-           }
-           if ((c >= 0xD800 && c <= 0xDB7F) ||
-               (c >= 0xDC00 && c <= 0xDFFF) ||
-               (c >= 0xFFF0 && c <= 0xFFFF) ||
-                c > 0x10ffff)
-               Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c);
-           else
-               Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c);
-       }
-
-       if (utf8)
-           pv += UTF8SKIP(pv);
-       else
-           pv++;
-    }
-
-    return SvPVX(dsv);
-}
-
-char *
-Perl_sv_xmlpeek(pTHX_ SV *sv)
-{
-    SV * const t = sv_newmortal();
-    STRLEN n_a;
-    int unref = 0;
-
-    PERL_ARGS_ASSERT_SV_XMLPEEK;
-
-    sv_utf8_upgrade(t);
-    sv_setpvs(t, "");
-    /* retry: */
-    if (!sv) {
-       sv_catpv(t, "VOID=\"\"");
-       goto finish;
-    }
-    else if (sv == (const SV *)0x55555555 || ((char)SvTYPE(sv)) == 'U') {
-       sv_catpv(t, "WILD=\"\"");
-       goto finish;
-    }
-    else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes || sv == &PL_sv_placeholder) {
-       if (sv == &PL_sv_undef) {
-           sv_catpv(t, "SV_UNDEF=\"1\"");
-           if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
-                                SVs_GMG|SVs_SMG|SVs_RMG)) &&
-               SvREADONLY(sv))
-               goto finish;
-       }
-       else if (sv == &PL_sv_no) {
-           sv_catpv(t, "SV_NO=\"1\"");
-           if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
-                                SVs_GMG|SVs_SMG|SVs_RMG)) &&
-               !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
-                                 SVp_POK|SVp_NOK)) &&
-               SvCUR(sv) == 0 &&
-               SvNVX(sv) == 0.0)
-               goto finish;
-       }
-       else if (sv == &PL_sv_yes) {
-           sv_catpv(t, "SV_YES=\"1\"");
-           if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
-                                SVs_GMG|SVs_SMG|SVs_RMG)) &&
-               !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
-                                 SVp_POK|SVp_NOK)) &&
-               SvCUR(sv) == 1 &&
-               SvPVX(sv) && *SvPVX(sv) == '1' &&
-               SvNVX(sv) == 1.0)
-               goto finish;
-       }
-       else {
-           sv_catpv(t, "SV_PLACEHOLDER=\"1\"");
-           if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
-                                SVs_GMG|SVs_SMG|SVs_RMG)) &&
-               SvREADONLY(sv))
-               goto finish;
-       }
-       sv_catpv(t, " XXX=\"\" ");
-    }
-    else if (SvREFCNT(sv) == 0) {
-       sv_catpv(t, " refcnt=\"0\"");
-       unref++;
-    }
-    else if (DEBUG_R_TEST_) {
-       int is_tmp = 0;
-       SSize_t ix;
-       /* is this SV on the tmps stack? */
-       for (ix=PL_tmps_ix; ix>=0; ix--) {
-           if (PL_tmps_stack[ix] == sv) {
-               is_tmp = 1;
-               break;
-           }
-       }
-       if (SvREFCNT(sv) > 1)
-           Perl_sv_catpvf(aTHX_ t, " DRT=\"<%"UVuf"%s>\"", (UV)SvREFCNT(sv),
-                   is_tmp ? "T" : "");
-       else if (is_tmp)
-           sv_catpv(t, " DRT=\"<T>\"");
-    }
-
-    if (SvROK(sv)) {
-       sv_catpv(t, " ROK=\"\"");
-    }
-    switch (SvTYPE(sv)) {
-    default:
-       sv_catpv(t, " FREED=\"1\"");
-       goto finish;
-
-    case SVt_NULL:
-       sv_catpv(t, " UNDEF=\"1\"");
-       goto finish;
-    case SVt_IV:
-       sv_catpv(t, " IV=\"");
-       break;
-    case SVt_NV:
-       sv_catpv(t, " NV=\"");
-       break;
-    case SVt_PV:
-       sv_catpv(t, " PV=\"");
-       break;
-    case SVt_PVIV:
-       sv_catpv(t, " PVIV=\"");
-       break;
-    case SVt_PVNV:
-       sv_catpv(t, " PVNV=\"");
-       break;
-    case SVt_PVMG:
-       sv_catpv(t, " PVMG=\"");
-       break;
-    case SVt_PVLV:
-       sv_catpv(t, " PVLV=\"");
-       break;
-    case SVt_PVAV:
-       sv_catpv(t, " AV=\"");
-       break;
-    case SVt_PVHV:
-       sv_catpv(t, " HV=\"");
-       break;
-    case SVt_PVCV:
-       if (CvGV(sv))
-           Perl_sv_catpvf(aTHX_ t, " CV=\"(%s)\"", GvNAME(CvGV(sv)));
-       else
-           sv_catpv(t, " CV=\"()\"");
-       goto finish;
-    case SVt_PVGV:
-       sv_catpv(t, " GV=\"");
-       break;
-    case SVt_INVLIST:
-       sv_catpv(t, " DUMMY=\"");
-       break;
-    case SVt_REGEXP:
-       sv_catpv(t, " REGEXP=\"");
-       break;
-    case SVt_PVFM:
-       sv_catpv(t, " FM=\"");
-       break;
-    case SVt_PVIO:
-       sv_catpv(t, " IO=\"");
-       break;
-    }
-
-    if (SvPOKp(sv)) {
-       if (SvPVX(sv)) {
-           sv_catxmlsv(t, sv);
-       }
-    }
-    else if (SvNOKp(sv)) {
-       STORE_NUMERIC_LOCAL_SET_STANDARD();
-       Perl_sv_catpvf(aTHX_ t, "%"NVgf"",SvNVX(sv));
-       RESTORE_NUMERIC_LOCAL();
-    }
-    else if (SvIOKp(sv)) {
-       if (SvIsUV(sv))
-           Perl_sv_catpvf(aTHX_ t, "%"UVuf"", (UV)SvUVX(sv));
-       else
-            Perl_sv_catpvf(aTHX_ t, "%"IVdf"", (IV)SvIVX(sv));
-    }
-    else
-       sv_catpv(t, "");
-    sv_catpv(t, "\"");
-
-  finish:
-    while (unref--)
-       sv_catpv(t, ")");
-    return SvPV(t, n_a);
-}
-
-void
-Perl_do_pmop_xmldump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
-{
-    PERL_ARGS_ASSERT_DO_PMOP_XMLDUMP;
-
-    if (!pm) {
-       Perl_xmldump_indent(aTHX_ level, file, "<pmop/>\n");
-       return;
-    }
-    Perl_xmldump_indent(aTHX_ level, file, "<pmop \n");
-    level++;
-    if (PM_GETRE(pm)) {
-       REGEXP *const r = PM_GETRE(pm);
-       SV * const tmpsv = newSVpvn_utf8("", 0, TRUE);
-       sv_catxmlsv(tmpsv, MUTABLE_SV(r));
-       Perl_xmldump_indent(aTHX_ level, file, "pre=\"%s\"\n",
-            SvPVX(tmpsv));
-       SvREFCNT_dec_NN(tmpsv);
-       Perl_xmldump_indent(aTHX_ level, file, "when=\"%s\"\n",
-            (pm->op_private & OPpRUNTIME) ? "RUN" : "COMP");
-    }
-    else
-       Perl_xmldump_indent(aTHX_ level, file, "pre=\"\" when=\"RUN\"\n");
-    if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) {
-       SV * const tmpsv = pm_description(pm);
-       Perl_xmldump_indent(aTHX_ level, file, "pmflags=\"%s\"\n", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
-       SvREFCNT_dec_NN(tmpsv);
-    }
-
-    level--;
-    if (pm->op_type != OP_PUSHRE && pm->op_pmreplrootu.op_pmreplroot) {
-       Perl_xmldump_indent(aTHX_ level, file, ">\n");
-       Perl_xmldump_indent(aTHX_ level+1, file, "<pm_repl>\n");
-       do_op_xmldump(level+2, file, pm->op_pmreplrootu.op_pmreplroot);
-       Perl_xmldump_indent(aTHX_ level+1, file, "</pm_repl>\n");
-       Perl_xmldump_indent(aTHX_ level, file, "</pmop>\n");
-    }
-    else
-       Perl_xmldump_indent(aTHX_ level, file, "/>\n");
-}
-
-void
-Perl_pmop_xmldump(pTHX_ const PMOP *pm)
-{
-    do_pmop_xmldump(0, PL_xmlfp, pm);
-}
-
-void
-Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o)
-{
-    UV      seq;
-    int     contents = 0;
-    const OPCODE optype = o->op_type;
-
-    PERL_ARGS_ASSERT_DO_OP_XMLDUMP;
-
-    if (!o)
-       return;
-    seq = sequence_num(o);
-    Perl_xmldump_indent(aTHX_ level, file,
-       "<op_%s seq=\"%"UVuf" -> ",
-            OP_NAME(o),
-                     seq);
-    level++;
-    if (o->op_next)
-       PerlIO_printf(file, seq ? "%"UVuf"\"" : "(%"UVuf")\"",
-                     sequence_num(o->op_next));
-    else
-       PerlIO_printf(file, "DONE\"");
-
-    if (o->op_targ) {
-       if (optype == OP_NULL)
-       {
-           PerlIO_printf(file, " was=\"%s\"", PL_op_name[o->op_targ]);
-           if (o->op_targ == OP_NEXTSTATE)
-           {
-               if (CopLINE(cCOPo))
-                   PerlIO_printf(file, " line=\"%"UVuf"\"",
-                                    (UV)CopLINE(cCOPo));
-               if (CopSTASHPV(cCOPo))
-                   PerlIO_printf(file, " package=\"%s\"",
-                                    CopSTASHPV(cCOPo));
-               if (CopLABEL(cCOPo))
-                   PerlIO_printf(file, " label=\"%s\"",
-                                    CopLABEL(cCOPo));
-           }
-       }
-       else
-           PerlIO_printf(file, " targ=\"%ld\"", (long)o->op_targ);
-    }
-#ifdef DUMPADDR
-    PerlIO_printf(file, " addr=\"0x%"UVxf" => 0x%"UVxf"\"", (UV)o, (UV)o->op_next);
-#endif
-
-    DUMP_OP_FLAGS(o,1,0,file);
-    DUMP_OP_PRIVATE(o,1,0,file);
-
-    switch (optype) {
-    case OP_AELEMFAST:
-       if (o->op_flags & OPf_SPECIAL) {
-           break;
-       }
-    case OP_GVSV:
-    case OP_GV:
-#ifdef USE_ITHREADS
-       S_xmldump_attr(aTHX_ level, file, "padix=\"%" IVdf "\"", (IV)cPADOPo->op_padix);
-#else
-       if (cSVOPo->op_sv) {
-           SV * const tmpsv1 = newSVpvn_utf8(NULL, 0, TRUE);
-           SV * const tmpsv2 = newSVpvn_utf8("", 0, TRUE);
-           char *s;
-           STRLEN len;
-           ENTER;
-           SAVEFREESV(tmpsv1);
-           SAVEFREESV(tmpsv2);
-           gv_fullname3(tmpsv1, MUTABLE_GV(cSVOPo->op_sv), NULL);
-           s = SvPV(tmpsv1,len);
-           sv_catxmlpvn(tmpsv2, s, len, 1);
-           S_xmldump_attr(aTHX_ level, file, "gv=\"%s\"", SvPV(tmpsv2, len));
-           LEAVE;
-       }
-       else
-           S_xmldump_attr(aTHX_ level, file, "gv=\"NULL\"");
-#endif
-       break;
-    case OP_CONST:
-    case OP_HINTSEVAL:
-    case OP_METHOD_NAMED:
-#ifndef USE_ITHREADS
-       /* with ITHREADS, consts are stored in the pad, and the right pad
-        * may not be active here, so skip */
-       S_xmldump_attr(aTHX_ level, file, "%s", sv_xmlpeek(cSVOPo_sv));
-#endif
-       break;
-    case OP_ANONCODE:
-       if (!contents) {
-           contents = 1;
-           PerlIO_printf(file, ">\n");
-       }
-       do_op_xmldump(level+1, file, CvROOT(cSVOPo_sv));
-       break;
-    case OP_NEXTSTATE:
-    case OP_DBSTATE:
-       if (CopLINE(cCOPo))
-           S_xmldump_attr(aTHX_ level, file, "line=\"%"UVuf"\"",
-                            (UV)CopLINE(cCOPo));
-       if (CopSTASHPV(cCOPo))
-           S_xmldump_attr(aTHX_ level, file, "package=\"%s\"",
-                            CopSTASHPV(cCOPo));
-       if (CopLABEL(cCOPo))
-           S_xmldump_attr(aTHX_ level, file, "label=\"%s\"",
-                            CopLABEL(cCOPo));
-       break;
-    case OP_ENTERLOOP:
-       S_xmldump_attr(aTHX_ level, file, "redo=\"");
-       if (cLOOPo->op_redoop)
-           PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_redoop));
-       else
-           PerlIO_printf(file, "DONE\"");
-       S_xmldump_attr(aTHX_ level, file, "next=\"");
-       if (cLOOPo->op_nextop)
-           PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_nextop));
-       else
-           PerlIO_printf(file, "DONE\"");
-       S_xmldump_attr(aTHX_ level, file, "last=\"");
-       if (cLOOPo->op_lastop)
-           PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_lastop));
-       else
-           PerlIO_printf(file, "DONE\"");
-       break;
-    case OP_COND_EXPR:
-    case OP_RANGE:
-    case OP_MAPWHILE:
-    case OP_GREPWHILE:
-    case OP_OR:
-    case OP_AND:
-       S_xmldump_attr(aTHX_ level, file, "other=\"");
-       if (cLOGOPo->op_other)
-           PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOGOPo->op_other));
-       else
-           PerlIO_printf(file, "DONE\"");
-       break;
-    case OP_LEAVE:
-    case OP_LEAVEEVAL:
-    case OP_LEAVESUB:
-    case OP_LEAVESUBLV:
-    case OP_LEAVEWRITE:
-    case OP_SCOPE:
-       if (o->op_private & OPpREFCOUNTED)
-           S_xmldump_attr(aTHX_ level, file, "refcnt=\"%"UVuf"\"", (UV)o->op_targ);
-       break;
-    default:
-       break;
-    }
-
-    if (PL_madskills && o->op_madprop) {
-       char prevkey = '\0';
-       SV * const tmpsv = newSVpvn_utf8("", 0, TRUE);
-       const MADPROP* mp = o->op_madprop;
-
-       if (!contents) {
-           contents = 1;
-           PerlIO_printf(file, ">\n");
-       }
-       Perl_xmldump_indent(aTHX_ level, file, "<madprops>\n");
-       level++;
-       while (mp) {
-           char tmp = mp->mad_key;
-           sv_setpvs(tmpsv,"\"");
-           if (tmp)
-               sv_catxmlpvn(tmpsv, &tmp, 1, 0);
-           if ((tmp == '_') || (tmp == '#')) /* '_' '#' whitespace belong to the previous token. */
-               sv_catxmlpvn(tmpsv, &prevkey, 1, 0);
-           else
-               prevkey = tmp;
-           sv_catpv(tmpsv, "\"");
-           switch (mp->mad_type) {
-           case MAD_NULL:
-               sv_catpv(tmpsv, "NULL");
-               Perl_xmldump_indent(aTHX_ level, file, "<mad_null key=%s/>\n", SvPVX(tmpsv));
-               break;
-           case MAD_PV:
-               sv_catpv(tmpsv, " val=\"");
-               sv_catxmlpvn(tmpsv, (char*)mp->mad_val, mp->mad_vlen,1);
-               sv_catpv(tmpsv, "\"");
-               Perl_xmldump_indent(aTHX_ level, file, "<mad_pv key=%s/>\n", SvPVX(tmpsv));
-               break;
-           case MAD_SV:
-               sv_catpv(tmpsv, " val=\"");
-               sv_catxmlsv(tmpsv, MUTABLE_SV(mp->mad_val));
-               sv_catpv(tmpsv, "\"");
-               Perl_xmldump_indent(aTHX_ level, file, "<mad_sv key=%s/>\n", SvPVX(tmpsv));
-               break;
-           case MAD_OP:
-               if ((OP*)mp->mad_val) {
-                   Perl_xmldump_indent(aTHX_ level, file, "<mad_op key=%s>\n", SvPVX(tmpsv));
-                   do_op_xmldump(level+1, file, (OP*)mp->mad_val);
-                   Perl_xmldump_indent(aTHX_ level, file, "</mad_op>\n");
-               }
-               break;
-           default:
-               Perl_xmldump_indent(aTHX_ level, file, "<mad_unk key=%s/>\n", SvPVX(tmpsv));
-               break;
-           }
-           mp = mp->mad_next;
-       }
-       level--;
-       Perl_xmldump_indent(aTHX_ level, file, "</madprops>\n");
-
-       SvREFCNT_dec_NN(tmpsv);
-    }
-
-    switch (optype) {
-    case OP_PUSHRE:
-    case OP_MATCH:
-    case OP_QR:
-    case OP_SUBST:
-       if (!contents) {
-           contents = 1;
-           PerlIO_printf(file, ">\n");
-       }
-       do_pmop_xmldump(level, file, cPMOPo);
-       break;
-    default:
-       break;
-    }
-
-    if (o->op_flags & OPf_KIDS) {
-       OP *kid;
-       if (!contents) {
-           contents = 1;
-           PerlIO_printf(file, ">\n");
-       }
-       for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
-           do_op_xmldump(level, file, kid);
-    }
-
-    if (contents)
-       Perl_xmldump_indent(aTHX_ level-1, file, "</op_%s>\n", OP_NAME(o));
-    else
-       PerlIO_printf(file, " />\n");
-}
-
-void
-Perl_op_xmldump(pTHX_ const OP *o)
-{
-    PERL_ARGS_ASSERT_OP_XMLDUMP;
-
-    do_op_xmldump(0, PL_xmlfp, o);
-}
-#endif
 
 /*
  * Local variables:
index b576d89..74b10ce 100644 (file)
--- a/embed.fnc
+++ b/embed.fnc
@@ -949,11 +949,7 @@ Apd        |CV*    |newCONSTSUB    |NULLOK HV* stash|NULLOK const char* name|NULLOK SV* sv
 Apd    |CV*    |newCONSTSUB_flags|NULLOK HV* stash \
                                  |NULLOK const char* name|STRLEN len \
                                  |U32 flags|NULLOK SV* sv
-#ifdef PERL_MAD
-Ap     |OP*    |newFORM        |I32 floor|NULLOK OP* o|NULLOK OP* block
-#else
 Ap     |void   |newFORM        |I32 floor|NULLOK OP* o|NULLOK OP* block
-#endif
 Apda   |OP*    |newFOROP       |I32 flags|NULLOK OP* sv|NN OP* expr|NULLOK OP* block|NULLOK OP* cont
 Apda   |OP*    |newGIVENOP     |NN OP* cond|NN OP* block|PADOFFSET defsv_off
 Apda   |OP*    |newLOGOP       |I32 optype|I32 flags|NN OP *first|NN OP *other
@@ -1055,11 +1051,7 @@ p        |void   |opslab_free_nopad|NN OPSLAB *slab
 p      |void   |opslab_force_free|NN OPSLAB *slab
 #endif
 : Used in perly.y
-#ifdef PERL_MAD
-p      |OP*    |package        |NN OP* o
-#else
 p      |void   |package        |NN OP* o
-#endif
 : Used in perly.y
 p      |void   |package_version|NN OP* v
 : Used in toke.c and perly.y
@@ -1593,12 +1585,7 @@ Ap       |void   |unsharepvn     |NULLOK const char* sv|I32 len|U32 hash
 : Used in gv.c, hv.c
 p      |void   |unshare_hek    |NULLOK HEK* hek
 : Used in perly.y
-#ifdef PERL_MAD
-p      |OP *   |utilize        |int aver|I32 floor|NULLOK OP* version \
-                               |NN OP* idop|NULLOK OP* arg
-#else
 p      |void   |utilize        |int aver|I32 floor|NULLOK OP* version|NN OP* idop|NULLOK OP* arg
-#endif
 Ap     |U8*    |utf16_to_utf8  |NN U8* p|NN U8 *d|I32 bytelen|NN I32 *newlen
 Ap     |U8*    |utf16_to_utf8_reversed|NN U8* p|NN U8 *d|I32 bytelen|NN I32 *newlen
 AdpPR  |STRLEN |utf8_length    |NN const U8* s|NN const U8 *e
@@ -2494,9 +2481,6 @@ s |void   |deb_stack_n    |NN SV** stack_base|I32 stack_min \
 #endif
 
 : pad API
-#ifdef PERL_MAD
-Mnpd   |void   |pad_peg        |NN const char* s
-#endif
 Apda   |PADLIST*|pad_new       |int flags
 #if defined(PERL_IN_PAD_C)
 s      |PADOFFSET|pad_alloc_name|NN SV *namesv|U32 flags \
@@ -2663,58 +2647,6 @@ Apnod    |Size_t |my_strlcat     |NULLOK char *dst|NULLOK const char *src|Size_t size
 Apnod     |Size_t |my_strlcpy     |NULLOK char *dst|NULLOK const char *src|Size_t size
 #endif
 
-#ifdef PERL_MAD
-#if defined(PERL_IN_DUMP_C)
-sf     |void   |xmldump_attr   |I32 level|NN PerlIO *file|NN const char* pat \
-                               |...
-#endif
-Mfp    |void   |xmldump_indent |I32 level|NN PerlIO *file|NN const char* pat \
-                               |...
-Mp     |void   |xmldump_vindent|I32 level|NN PerlIO *file|NN const char* pat \
-                               |NULLOK va_list *args
-Mp     |void   |xmldump_all
-p      |void   |xmldump_all_perl       |bool justperl
-Mp     |void   |xmldump_packsubs       |NN const HV* stash
-p      |void   |xmldump_packsubs_perl  |NN const HV* stash|bool justperl
-Mp     |void   |xmldump_sub    |NN const GV* gv
-Mp     |void   |xmldump_sub_perl       |NN const GV* gv|bool justperl
-Mp     |void   |xmldump_form   |NN const GV* gv
-Mp     |void   |xmldump_eval
-Mp     |char*  |sv_catxmlsv    |NN SV *dsv|NN SV *ssv
-Mp     |char*  |sv_catxmlpvn   |NN SV *dsv|NN const char *pv|STRLEN len|int utf8
-Mp     |char*  |sv_catxmlpv    |NN SV *dsv|NN const char *pv|int utf8
-Mp     |char*  |sv_xmlpeek     |NN SV* sv
-Mp     |void   |do_pmop_xmldump|I32 level|NN PerlIO *file \
-                               |NULLOK const PMOP *pm
-Mp     |void   |pmop_xmldump   |NULLOK const PMOP* pm
-Mp     |void   |do_op_xmldump  |I32 level|NN PerlIO *file|NULLOK const OP *o
-Mp     |void   |op_xmldump     |NN const OP *o
-
-Mp     |TOKEN* |newTOKEN       |I32 optype|YYSTYPE lval \
-                               |NULLOK MADPROP* madprop
-Mp     |void   |token_free     |NN TOKEN *tk
-Mp     |void   |token_getmad   |NN TOKEN *tk|NULLOK OP *o|char slot
-Mp     |void   |op_getmad_weak |NULLOK OP* from|NULLOK OP* o|char slot
-Mp     |void   |op_getmad      |NULLOK OP* from|NULLOK OP* o|char slot
-Mp     |void   |prepend_madprops|NULLOK MADPROP* mp|NULLOK OP* o|char slot
-Mp     |void   |append_madprops|NULLOK MADPROP* tm|NULLOK OP* o|char slot
-Mp     |void   |addmad         |NULLOK MADPROP* tm|NULLOK MADPROP** root \
-                               |char slot
-Mp     |MADPROP*|newMADsv      |char key|NN SV* sv
-Mp     |MADPROP*|newMADPROP    |char key|char type|NULLOK void* val \
-                               |I32 vlen
-Mp     |void   |mad_free       |NULLOK MADPROP* mp
-
-#  if defined(PERL_IN_TOKE_C)
-s      |char*  |skipspace0     |NN char *s
-s      |char*  |skipspace1     |NN char *s
-s      |char*  |skipspace2     |NN char *s|NULLOK SV **sv
-s      |void   |start_force    |int where
-s      |void   |curmad         |char slot|NULLOK SV *sv
-#  endif
-Mp     |int    |madlex
-Mp     |int    |madparse       |int gramtype
-#endif
 #if !defined(HAS_SIGNBIT)
 AMdnoP |int    |Perl_signbit   |NV f
 #endif
diff --git a/embed.h b/embed.h
index c139c1e..b236ada 100644 (file)
--- a/embed.h
+++ b/embed.h
 #define newCONSTSUB(a,b,c)     Perl_newCONSTSUB(aTHX_ a,b,c)
 #define newCONSTSUB_flags(a,b,c,d,e)   Perl_newCONSTSUB_flags(aTHX_ a,b,c,d,e)
 #define newCVREF(a,b)          Perl_newCVREF(aTHX_ a,b)
+#define newFORM(a,b,c)         Perl_newFORM(aTHX_ a,b,c)
 #define newFOROP(a,b,c,d,e)    Perl_newFOROP(aTHX_ a,b,c,d,e)
 #define newGIVENOP(a,b,c)      Perl_newGIVENOP(aTHX_ a,b,c)
 #define newGVOP(a,b,c)         Perl_newGVOP(aTHX_ a,b,c)
 #if !(defined(NO_MATHOMS))
 #define sv_nounlocking(a)      Perl_sv_nounlocking(aTHX_ a)
 #endif
-#if !(defined(PERL_MAD))
-#define newFORM(a,b,c)         Perl_newFORM(aTHX_ a,b,c)
-#endif
 #if !(defined(_MSC_VER))
 #ifndef PERL_IMPLICIT_CONTEXT
 #define die                    Perl_die
 #if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C)
 #define _get_regclass_nonbitmap_data(a,b,c,d,e)        Perl__get_regclass_nonbitmap_data(aTHX_ a,b,c,d,e)
 #endif
-#if defined(PERL_MAD)
-#define newFORM(a,b,c)         Perl_newFORM(aTHX_ a,b,c)
-#endif
 #if defined(UNLINK_ALL_VERSIONS)
 #define unlnk(a)               Perl_unlnk(aTHX_ a)
 #endif
 #define oopsHV(a)              Perl_oopsHV(aTHX_ a)
 #define op_const_sv(a,b)       Perl_op_const_sv(aTHX_ a,b)
 #define op_unscope(a)          Perl_op_unscope(aTHX_ a)
+#define package(a)             Perl_package(aTHX_ a)
 #define package_version(a)     Perl_package_version(aTHX_ a)
 #define pad_block_start(a)     Perl_pad_block_start(aTHX_ a)
 #define pad_fixup_inner_anons(a,b,c)   Perl_pad_fixup_inner_anons(aTHX_ a,b,c)
 #define tied_method            Perl_tied_method
 #endif
 #define unshare_hek(a)         Perl_unshare_hek(aTHX_ a)
+#define utilize(a,b,c,d,e)     Perl_utilize(aTHX_ a,b,c,d,e)
 #define vivify_ref(a,b)                Perl_vivify_ref(aTHX_ a,b)
 #define wait4pid(a,b,c)                Perl_wait4pid(aTHX_ a,b,c)
 #define watch(a)               Perl_watch(aTHX_ a)
 #  if !(defined(PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION))
 #define do_exec(a)             Perl_do_exec(aTHX_ a)
 #  endif
-#  if !(defined(PERL_MAD))
-#define package(a)             Perl_package(aTHX_ a)
-#define utilize(a,b,c,d,e)     Perl_utilize(aTHX_ a,b,c,d,e)
-#  endif
 #  if !(defined(_MSC_VER))
 #define magic_regdatum_set(a,b)        Perl_magic_regdatum_set(aTHX_ a,b)
 #  endif
 #define tokeq(a)               S_tokeq(aTHX_ a)
 #define update_debugger_info(a,b,c)    S_update_debugger_info(aTHX_ a,b,c)
 #define yywarn(a,b)            S_yywarn(aTHX_ a,b)
-#    if defined(PERL_MAD)
-#define curmad(a,b)            S_curmad(aTHX_ a,b)
-#define skipspace0(a)          S_skipspace0(aTHX_ a)
-#define skipspace1(a)          S_skipspace1(aTHX_ a)
-#define skipspace2(a,b)                S_skipspace2(aTHX_ a,b)
-#define start_force(a)         S_start_force(aTHX_ a)
-#    endif
 #  endif
 #  if defined(PERL_IN_UNIVERSAL_C)
 #define isa_lookup(a,b,c,d)    S_isa_lookup(aTHX_ a,b,c,d)
 #define mem_log_common         S_mem_log_common
 #    endif
 #  endif
-#  if defined(PERL_MAD)
-#define addmad(a,b,c)          Perl_addmad(aTHX_ a,b,c)
-#define append_madprops(a,b,c) Perl_append_madprops(aTHX_ a,b,c)
-#define do_op_xmldump(a,b,c)   Perl_do_op_xmldump(aTHX_ a,b,c)
-#define do_pmop_xmldump(a,b,c) Perl_do_pmop_xmldump(aTHX_ a,b,c)
-#define mad_free(a)            Perl_mad_free(aTHX_ a)
-#define madlex()               Perl_madlex(aTHX)
-#define madparse(a)            Perl_madparse(aTHX_ a)
-#define newMADPROP(a,b,c,d)    Perl_newMADPROP(aTHX_ a,b,c,d)
-#define newMADsv(a,b)          Perl_newMADsv(aTHX_ a,b)
-#define newTOKEN(a,b,c)                Perl_newTOKEN(aTHX_ a,b,c)
-#define op_getmad(a,b,c)       Perl_op_getmad(aTHX_ a,b,c)
-#define op_getmad_weak(a,b,c)  Perl_op_getmad_weak(aTHX_ a,b,c)
-#define op_xmldump(a)          Perl_op_xmldump(aTHX_ a)
-#define package(a)             Perl_package(aTHX_ a)
-#define pad_peg                        Perl_pad_peg
-#define pmop_xmldump(a)                Perl_pmop_xmldump(aTHX_ a)
-#define prepend_madprops(a,b,c)        Perl_prepend_madprops(aTHX_ a,b,c)
-#define sv_catxmlpv(a,b,c)     Perl_sv_catxmlpv(aTHX_ a,b,c)
-#define sv_catxmlpvn(a,b,c,d)  Perl_sv_catxmlpvn(aTHX_ a,b,c,d)
-#define sv_catxmlsv(a,b)       Perl_sv_catxmlsv(aTHX_ a,b)
-#define sv_xmlpeek(a)          Perl_sv_xmlpeek(aTHX_ a)
-#define token_free(a)          Perl_token_free(aTHX_ a)
-#define token_getmad(a,b,c)    Perl_token_getmad(aTHX_ a,b,c)
-#define utilize(a,b,c,d,e)     Perl_utilize(aTHX_ a,b,c,d,e)
-#define xmldump_all()          Perl_xmldump_all(aTHX)
-#define xmldump_all_perl(a)    Perl_xmldump_all_perl(aTHX_ a)
-#define xmldump_eval()         Perl_xmldump_eval(aTHX)
-#define xmldump_form(a)                Perl_xmldump_form(aTHX_ a)
-#ifndef PERL_IMPLICIT_CONTEXT
-#define xmldump_indent         Perl_xmldump_indent
-#endif
-#define xmldump_packsubs(a)    Perl_xmldump_packsubs(aTHX_ a)
-#define xmldump_packsubs_perl(a,b)     Perl_xmldump_packsubs_perl(aTHX_ a,b)
-#define xmldump_sub(a)         Perl_xmldump_sub(aTHX_ a)
-#define xmldump_sub_perl(a,b)  Perl_xmldump_sub_perl(aTHX_ a,b)
-#define xmldump_vindent(a,b,c,d)       Perl_xmldump_vindent(aTHX_ a,b,c,d)
-#  endif
 #  if defined(PERL_USES_PL_PIDSTATUS) && defined(PERL_IN_UTIL_C)
 #define pidgone(a,b)           S_pidgone(aTHX_ a,b)
 #  endif
index bf08780..454c1ee 100644 (file)
 #define PL_localizing          (vTHX->Ilocalizing)
 #define PL_localpatches                (vTHX->Ilocalpatches)
 #define PL_lockhook            (vTHX->Ilockhook)
-#define PL_madskills           (vTHX->Imadskills)
 #define PL_main_cv             (vTHX->Imain_cv)
 #define PL_main_root           (vTHX->Imain_root)
 #define PL_main_start          (vTHX->Imain_start)
 #define PL_warnhook            (vTHX->Iwarnhook)
 #define PL_watchaddr           (vTHX->Iwatchaddr)
 #define PL_watchok             (vTHX->Iwatchok)
-#define PL_xmlfp               (vTHX->Ixmlfp)
 
 #endif /* MULTIPLICITY */
 
index b20fa94..0d8b833 100644 (file)
@@ -364,19 +364,8 @@ S_ck_dump(pTHX_ OP *entersubop, GV *namegv, SV *cv)
        aop = cUNOPx(aop)->op_first;
     prev = aop;
     aop = aop->op_sibling;
-    while (PL_madskills && aop->op_type == OP_STUB) {
-       prev = aop;
-       aop = aop->op_sibling;
-    }
-    if (PL_madskills && aop->op_type == OP_NULL) {
-       first = ((UNOP*)aop)->op_first;
-       ((UNOP*)aop)->op_first = NULL;
-       prev = aop;
-    }
-    else {
-       first = aop;
-       prev->op_sibling = first->op_sibling;
-    }
+    first = aop;
+    prev->op_sibling = first->op_sibling;
     if (first->op_type == OP_RV2AV ||
        first->op_type == OP_PADAV ||
        first->op_type == OP_RV2HV ||
@@ -386,10 +375,6 @@ S_ck_dump(pTHX_ OP *entersubop, GV *namegv, SV *cv)
     else
        first->op_flags &= ~OPf_MOD;
     aop = aop->op_sibling;
-    while (PL_madskills && aop->op_type == OP_STUB) {
-       prev = aop;
-       aop = aop->op_sibling;
-    }
     if (!aop) {
        /* It doesn’t really matter what we return here, as this only
           occurs after yyerror.  */
index 3e7d4a3..c8982fd 100644 (file)
@@ -757,11 +757,6 @@ PERLVAR(I, memory_debug_header, struct perl_memory_debug_header)
 PERLVARI(I, dumper_fd, int,    -1)
 #endif
 
-#ifdef PERL_MAD
-PERLVARI(I, madskills, bool,   FALSE)  /* preserve all syntactic info */
-                                       /* (MAD = Misc Attribute Decoration) */
-PERLVARI(I, xmlfp,     PerlIO *, NULL)
-#endif
 
 #ifdef DEBUG_LEAKING_SCALARS
 PERLVARI(I, sv_serial, U32,    0)      /* SV serial number, used in sv.c */
index 64c0d8d..2b66c8c 100644 (file)
--- a/locale.c
+++ b/locale.c
@@ -1300,81 +1300,6 @@ Perl__is_cur_LC_category_utf8(pTHX_ int category)
 #   endif /* USE_LOCALE_MONETARY */
 #endif /* HAS_LOCALECONV */
 
-#if 0 && defined(HAS_STRERROR) && defined(USE_LOCALE_MESSAGES)
-
-/* This code is ifdefd out because it was found to not be necessary in testing
- * on our dromedary test machine, which has over 700 locales.  There, looking
- * at just the currency symbol gave essentially the same results as doing this
- * extra work.  Executing this also caused segfaults in miniperl.  I left it in
- * so as to avoid rewriting it if real-world experience indicates that
- * dromedary is an outlier.  Essentially, instead of returning abpve if we
- * haven't found illegal utf8, we continue on and examine all the strerror()
- * messages on the platform for utf8ness.  If all are ASCII, we still don't
- * know the answer; but otherwise we have a pretty good indication of the
- * utf8ness.  The reason this doesn't necessarily help much is that the
- * messages may not have been translated into the locale.  The currency symbol
- * is much more likely to have been translated.  The code below would need to
- * be altered somewhat to just be a continuation of testing the currency
- * symbol. */
-        int e;
-        unsigned int failures = 0, non_ascii = 0;
-        char *save_messages_locale = NULL;
-
-        /* Like above for LC_CTYPE, we set LC_MESSAGES to the locale of the
-         * desired category, if it isn't that locale already */
-
-        if (category != LC_MESSAGES) {
-
-            save_messages_locale = stdize_locale(savepv(setlocale(LC_MESSAGES,
-                                                                  NULL)));
-            if (! save_messages_locale) {
-                goto cant_use_messages;
-            }
-
-            if (strEQ(save_messages_locale, save_input_locale)) {
-                Safefree(save_input_locale);
-            }
-            else if (! setlocale(LC_MESSAGES, save_input_locale)) {
-                Safefree(save_messages_locale);
-                goto cant_use_messages;
-            }
-        }
-
-        /* Here the current LC_MESSAGES is set to the locale of the category
-         * whose information is desired.  Look through all the messages */
-
-        for (e = 0;
-#ifdef HAS_SYS_ERRLIST
-             e <= sys_nerr
-#endif
-             ; e++)
-        {
-            const U8* const errmsg = (U8 *) Strerror(e) ;
-            if (!errmsg)
-                break;
-            if (! is_utf8_string(errmsg, 0)) {
-                failures++;
-                break;
-            }
-            else if (! is_ascii_string(errmsg, 0)) {
-                non_ascii++;
-            }
-        }
-
-        /* And, if we changed it, restore LC_MESSAGES to its original locale */
-        if (save_messages_locale) {
-            setlocale(LC_MESSAGES, save_messages_locale);
-            Safefree(save_messages_locale);
-        }
-
-        /* Any non-UTF-8 message means not a UTF-8 locale; if all are valid,
-         * any non-ascii means it is one; otherwise we assume it isn't */
-        return (failures) ? FALSE : non_ascii;
-
-    }
-  cant_use_messages:
-
-#endif
 
     DEBUG_L(PerlIO_printf(Perl_debug_log,
                           "Assuming locale %s is not a UTF-8 locale\n",
diff --git a/mad/Nomad.pm b/mad/Nomad.pm
deleted file mode 100644 (file)
index eaac474..0000000
+++ /dev/null
@@ -1,3012 +0,0 @@
-package Nomad;
-
-# Suboptimal things:
-#      ast type info is generally still implicit
-#      the combined madness calls are actually losing type information
-#      brace madprops tend to be too low in the tree
-#      could use about 18 more refactorings...
-#      lots of unused cruft left around from previous refactorings
-
-use strict;
-use warnings;
-use Carp;
-
-use P5AST;
-use P5re;
-
-my $deinterpolate;
-
-sub xml_to_p5 {
-    my %options = @_;
-
-
-    my $filename = $options{'input'} or die;
-    $deinterpolate = $options{'deinterpolate'};
-    my $YAML = $options{'YAML'};
-
-    local $SIG{__DIE__} = sub {
-        my $e = shift;
-        $e =~ s/\n$/\n    [NODE $filename line $::prevstate->{line}]/ if $::prevstate;
-        confess $e;
-    };
-
-    # parse file
-    use XML::Parser;
-    my $p1 = XML::Parser->new(Style => 'Objects', Pkg => 'PLXML');
-    $p1->setHandlers('Char' => sub { warn "Chars $_[1]" if $_[1] =~ /\S/; });
-
-    # First slurp XML into tree of objects.
-
-    my $root = $p1->parsefile($filename);
-
-    # Now turn XML tree into something more like an AST.
-
-    PLXML::prepreproc($root->[0]);
-    my $ast = P5AST->new('Kids' => [$root->[0]->ast()]);
-    #::t($ast);
-
-    if ($YAML) {
-        require YAML::Syck;
-        return YAML::Syck::Dump($ast);
-    }
-
-    # Finally, walk AST to produce new program.
-
-    my $text = $ast->p5text(); # returns encoded, must output raw
-    return $text;
-}
-
-$::curstate = 0;
-$::prevstate = 0;
-$::curenc = 1;         # start in iso-8859-1, sigh...
-
-$::H = "HeredocHere000";
-%::H = ();
-
-my @enc = (
-    'utf-8',
-    'iso-8859-1',
-);
-
-my %enc = (
-    'utf-8' => 0,
-    'iso-8859-1' => 1,
-);
-
-my %madtype = (
-    '$' => 'p5::sigil',
-    '@' => 'p5::sigil',
-    '%' => 'p5::sigil',
-    '&' => 'p5::sigil',
-    '*' => 'p5::sigil',
-    'o' => 'p5::operator',
-    '~' => 'p5::operator',
-    '+' => 'p5::punct',
-    '?' => 'p5::punct',
-    ':' => 'p5::punct',
-    ',' => 'p5::punct',
-    ';' => 'p5::punct',
-    '#' => 'p5::punct',
-    '(' => 'p5::opener',
-    ')' => 'p5::closer',
-    '[' => 'p5::opener',
-    ']' => 'p5::closer',
-    '{' => 'p5::opener',
-    '}' => 'p5::closer',
-    '1'        => 'p5::punct',
-    '2'        => 'p5::punct',
-    'a'        => 'p5::operator',
-    'A'        => 'p5::operator',
-    'd' => 'p5::declarator',
-    'E'        => 'p5::text',
-    'L' => 'p5::label',
-    'm' => 'p5::remod',
-#    'n' => 'p5::name',
-    'q' => 'p5::openquote',
-    'Q' => 'p5::closequote',
-    '='        => 'p5::text',
-    'R'        => 'p5::text',
-    's'        => 'p5::text',
-    's'        => 'p5::declarator',
-#    'V' => 'p5::version',
-    'X' => 'p5::token',
-);
-
-use Data::Dumper;
-$Data::Dumper::Indent = 1;
-$Data::Dumper::Quotekeys = 0;
-
-sub d {
-    my $text = Dumper(@_);
-    # doesn't scale well, alas
-    1 while $text =~ s/(.*)^([^\n]*)bless\( \{\n(.*?)^(\s*\}), '([^']*)' \)([^\n]*)/$1$2$5 {\n$3$4$6 # $5/ms;
-    $text =~ s/PLXML:://g;
-    if ($text) {
-       my ($package, $filename, $line) = caller;
-       my $subroutine = (caller(1))[3];
-       $text =~ s/\n?\z/, called from $subroutine, line $line\n/;
-       warn $text;
-    }
-};
-
-{
-
-    my %xmlrepl = (
-       '&' => '&amp;',
-       "'" => '&apos;',
-       '"' => '&dquo;',
-       '<' => '&lt;',
-       '>' => '&gt;',
-       "\n" => '&#10;',
-       "\t" => '&#9;',
-    );
-
-    sub x {
-       my $indent = 0;
-       if (@_ > 1) {
-           warn xdolist($indent,"LIST",@_);
-       }
-       else {
-           my $type = ref $_[0];
-           if ($type) {
-               warn xdoitem($indent,$type,@_);
-           }
-           else {
-               warn xdoitem($indent,"ITEM",@_);
-           }
-       }
-    }
-
-    sub xdolist {
-       my $indent = shift;
-       my $tag = shift;
-       my $in = ' ' x ($indent * 2);
-       my $result;
-       $result .= "$in<$tag>\n" if defined $tag;
-       for my $it (@_) {
-           my $itt = ref $it || "ITEM";
-           $itt =~ s/::/:/g;
-           $result .= xdoitem($indent+1,$itt,$it);
-       }
-       $result .= "$in</$tag>\n" if defined $tag;
-       return $result;
-    }
-
-    sub xdohash {
-       my $indent = shift;
-       my $tag = shift;
-       my $hash = shift;
-       my $in = ' ' x ($indent * 2);
-       my $result = "$in<$tag>\n";
-       my @keys = sort keys %$hash;
-       my $longest = 0;
-       for my $k (@keys) {
-           $longest = length($k) if length($k) > $longest;
-       }
-       my $K;
-       for my $k (@keys) {
-           my $tmp;
-           $K = $$hash{$k}, next if $k eq 'Kids';
-           my $sp = ' ' x ($longest - length($k));
-           if (ref $$hash{$k}) {
-               $tmp = xdoitem($indent+1,"kv",$$hash{$k});
-               $tmp =~ s!^ *<kv>\n *</kv>!$in  <kv/>!;
-           }
-           else {
-               $tmp = xdoitem($indent+1,"kv",$$hash{$k});
-           }
-           $k =~ s/([\t\n'"<>&])/$xmlrepl{$1}/g;
-           $tmp =~ s/<kv/<kv k='$k'$sp/ or
-               $tmp =~ s/^(.*)$/$in  <kv k='$k'>\n$in  $1$in  <\/kv>\n/s;
-           $result .= $tmp;
-       }
-       if ($K and @$K) {
-           $result .= xdolist($indent, undef, @$K);
-       }
-       $result .= "$in</$tag>\n";
-    }
-
-    sub xdoitem {
-       my $indent = shift;
-       my $tag = shift;
-       my $item = shift;
-       my $in = ' ' x ($indent * 2);
-       my $r = ref $item;
-       if (not $r) {
-           $item =~ s/([\t\n'"<>&])/$xmlrepl{$1}/g;
-           return "$in<$tag>$item</$tag>\n";
-       }
-       (my $newtag = $r) =~ s/::/:/g;
-       my $t = "$item";
-       if ($t =~ /\bARRAY\b/) {
-           if (@{$item}) {
-               return xdolist($indent,$tag,@{$item});
-           }
-           else {
-               return "$in<$tag />\n";
-           }
-       }
-       if ($t =~ /\bHASH\b/) {
-           return xdohash($indent,$tag,$item);
-       }
-       if ($r =~ /^p5::/) {
-           return "$in<$newtag>$$item</$newtag>\n";
-       }
-       else {
-           return "$in<$newtag type='$r'/>\n";
-       }
-    }
-
-    my %trepl = (
-       "'" => '\\\'',
-       '"' => '\\"',
-       "\n" => '\\n',
-       "\t" => '\\t',
-    );
-
-    sub t {
-       my $indent = 0;
-       if (@_ > 1) {
-           tdolist($indent,"LIST",@_);
-       }
-       else {
-           my $type = ref $_[0];
-           if ($type) {
-               tdoitem($indent,$type,@_);
-           }
-           else {
-               tdoitem($indent,"ITEM",@_);
-           }
-       }
-       print STDERR "\n";
-    }
-
-    sub tdolist {
-       my $indent = shift;
-       my $tag = shift || "ARRAY";
-       my $in = ' ' x ($indent * 2);
-       if (@_) {
-           print STDERR "[\n";
-           for my $it (@_) {
-               my $itt = ref $it || "ITEM";
-               print STDERR $in,"  ";
-               tdoitem($indent+1,$itt,$it);
-               print STDERR "\n";
-           }
-           print STDERR "$in]";
-       }
-       else {
-           print STDERR "[]";
-       }
-    }
-
-    sub tdohash {
-       my $indent = shift;
-       my $tag = shift;
-       my $hash = shift;
-       my $in = ' ' x ($indent * 2);
-
-       print STDERR "$tag => {\n";
-
-       my @keys = sort keys %$hash;
-       my $longest = 0;
-       for my $k (@keys) {
-           $longest = length($k) if length($k) > $longest;
-       }
-       my $K;
-       for my $k (@keys) {
-           my $sp = ' ' x ($longest - length($k));
-           print STDERR "$in  $k$sp => ";
-           tdoitem($indent+1,"",$$hash{$k});
-           if ($k eq 'Kids') {
-               print STDERR " # Kids";
-           }
-           print STDERR "\n";
-       }
-       print STDERR "$in} # $tag";
-    }
-
-    sub tdoitem {
-       my $indent = shift;
-       my $tag = shift;
-       my $item = shift;
-       if (not defined $item) {
-           print STDERR "UNDEF";
-           return;
-       }
-#      my $in = ' ' x ($indent * 2);
-       my $r = ref $item;
-       if (not $r) {
-           $item =~ s/([\t\n"])/$trepl{$1}/g;
-           print STDERR "\"$item\"";
-           return;
-       }
-       my $t = "$item";
-       if ($r =~ /^p5::/) {
-           my $str = $$item{uni};
-           my $enc = $enc[$$item{enc}] . ' ';
-           $enc =~ s/iso-8859-1 //;
-           $str =~ s/([\t\n"])/$trepl{$1}/g;
-           print STDERR "$r $enc\"$str\"";
-       }
-       elsif ($t =~ /\bARRAY\b/) {
-           tdolist($indent,$tag,@{$item});
-       }
-       elsif ($t =~ /\bHASH\b/) {
-           tdohash($indent,$tag,$item);
-       }
-       else {
-           print STDERR "$r type='$r'";
-       }
-    }
-}
-
-sub encnum {
-    my $encname = shift;
-    if (not exists $enc{$encname}) {
-       push @enc, $encname;
-       return $enc{$encname} = $#enc;
-    }
-    return $enc{$encname};
-}
-
-use PLXML;
-
-package p5::text;
-
-use Encode;
-
-sub new {
-    my $class = shift;
-    my $text = shift;
-    die "Too many args to new" if @_;
-    die "Attempt to bless non-text $text" if ref $text;
-    return bless( { uni => $text,
-                   enc => $::curenc,
-                 }, $class);
-}
-
-sub uni { my $self = shift; $$self{uni}; }     # internal stuff all in utf8
-
-sub enc {
-    my $self = shift;
-    my $enc = $enc[$$self{enc} || 0];
-    return encode($enc, $$self{uni});
-}
-
-package p5::closequote;        BEGIN { @p5::closequote::ISA = 'p5::punct'; }
-package p5::closer;    BEGIN { @p5::closer::ISA = 'p5::punct'; }
-package p5::declarator;        BEGIN { @p5::declarator::ISA = 'p5::token'; }
-package p5::junk;      BEGIN { @p5::junk::ISA = 'p5::text'; }
-package p5::label;     BEGIN { @p5::label::ISA = 'p5::token'; }
-#package p5::name;     BEGIN { @p5::name::ISA = 'p5::token'; }
-package p5::opener;    BEGIN { @p5::opener::ISA = 'p5::punct'; }
-package p5::openquote; BEGIN { @p5::openquote::ISA = 'p5::punct'; }
-package p5::operator;  BEGIN { @p5::operator::ISA = 'p5::token'; }
-package p5::punct;     BEGIN { @p5::punct::ISA = 'p5::token'; }
-package p5::remod;     BEGIN { @p5::remod::ISA = 'p5::token'; }
-package p5::sigil;     BEGIN { @p5::sigil::ISA = 'p5::punct'; }
-package p5::token;     BEGIN { @p5::token::ISA = 'p5::text'; }
-#package p5::version;  BEGIN { @p5::version::ISA = 'p5::token'; }
-
-################################################################
-# Routines to turn XML tree into an AST.  Mostly this amounts to hoisting
-# misplaced nodes and flattening various things into lists.
-
-package PLXML;
-
-sub AUTOLOAD {
-    ::x("AUTOLOAD $PLXML::AUTOLOAD", @_);
-    return "[[[ $PLXML::AUTOLOAD ]]]";
-}
-
-sub prepreproc {
-    my $self = shift;
-    my $kids = $$self{Kids};
-    $self->{mp} = {};
-    if (defined $kids) {
-       my $i;
-       for ($i = 0; $i < @$kids; $i++) {
-           if (ref $kids->[$i] eq "PLXML::madprops") {
-               $self->{mp} = splice(@$kids, $i, 1)->hash($self,@_);
-               $i--;
-               next;
-           }
-           else {
-               prepreproc($kids->[$i], $self, @_);
-           }
-       }
-    }
-}
-
-sub preproc {
-    my $self = shift;
-    if (ref $self eq 'PLXML::op_null' and $$self{was}) {
-       return "PLXML::op_$$self{was}"->key();
-    }
-    else {
-       return $self->key();
-    }
-}
-
-sub newtype {
-    my $self = shift;
-    my $t = ref $self || $self;
-    $t = "PLXML::op_$$self{was}" if $t eq 'PLXML::op_null' and $$self{was};
-    $t =~ s/PLXML/P5AST/ or die "Bad type: $t";
-    return $t;
-}
-
-sub madness {
-    my $self = shift;
-    my @keys = split(' ', shift);
-    @keys = map { $_ eq 'd' ? ('k', 'd') : $_ } @keys;
-    my @vals = ();
-    for my $key (@keys) {
-       my $madprop = $self->{mp}{$key};
-       next unless defined $madprop;
-       if (ref $madprop eq 'PLXML::mad_op') {
-           if ($key eq 'b') {
-               push @vals, $madprop->blockast($self, @_);
-           }
-           else {
-               push @vals, $madprop->ast($self, @_);
-           }
-           next;
-       }
-       my $white;
-       if ($white = $self->{mp}{"_$key"}) {
-           push @vals, p5::junk->new($white);
-       }
-       my $type = $madtype{$key} || "p5::token";
-       push @vals, $type->new($madprop);
-       if ($white = $self->{mp}{"#$key"}) {
-           push @vals, p5::junk->new($white);
-       }
-    }
-    @vals;
-}
-
-sub blockast {
-    my $self = shift;
-    $self->ast(@_);
-}
-
-sub ast {
-    my $self = shift;
-
-    my @newkids;
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast($self, @_);
-    }
-    return $self->newtype->new(Kids => [uc $self->key(), "(", @newkids, ")"]);
-}
-
-sub op {
-    my $self = shift;
-    my $desc = $self->desc();
-    if ($desc =~ /\((.*?)\)/) {
-       return $1;
-    }
-    else {
-       return " <<" . $self->key() . ">> ";
-    }
-}
-
-sub mp {
-    my $self = shift;
-    return $self->{mp};
-}
-
-package PLXML::Characters;
-
-sub ast { die "oops" }
-sub pair { die "oops" }
-
-package PLXML::madprops;
-
-sub ast {
-    die "oops madprops";
-}
-
-sub hash {
-    my $self = shift;
-    my @pairs;
-    my %hash = ();
-    my $firstthing = '';
-    my $lastthing = '';
-    
-    # We need to guarantee key uniqueness at this point.
-    for my $kid (@{$$self{Kids}}) {
-       my ($k,$v) = $kid->pair($self, @_);
-       $firstthing ||= $k;
-        $k .= 'x' while exists $hash{$k};
-        $lastthing = $k;
-       $hash{$k} = $v;
-    }
-    $hash{FIRST} = $firstthing;
-    $hash{LAST} = $lastthing;
-    return \%hash;
-}
-
-package PLXML::mad_op;
-
-sub pair {
-    my $self = shift;
-    my $key = $$self{key};
-    return $key,$self;
-}
-
-sub ast {
-    my $self = shift;
-    $self->prepreproc(@_);
-    my @vals;
-    for my $kid (@{$$self{Kids}}) {
-        push @vals, $kid->ast($self, @_);
-    }
-    if (@vals == 1) {
-       return @vals;
-    }
-    else {
-       return P5AST::op_list->new(Kids => [@vals]);
-    }
-}
-
-sub blockast {
-    my $self = shift;
-    $self->prepreproc(@_);
-    my @vals;
-    for my $kid (@{$$self{Kids}}) {
-        push @vals, $kid->blockast($self, @_);
-    }
-    if (@vals == 1) {
-       return @vals;
-    }
-    else {
-       return P5AST::op_lineseq->new(Kids => [@vals]);
-    }
-}
-
-package PLXML::mad_pv;
-
-sub pair {
-    my $self = shift;
-    my $key = $$self{key};
-    my $val = $$self{val};
-    $val =~ s/STUPIDXML\(#x(\w+)\)/chr(hex $1)/eg;
-    return $key,$val;
-}
-
-package PLXML::mad_sv;
-
-sub pair {
-    my $self = shift;
-    my $key = $$self{key};
-    my $val = $$self{val};
-    $val =~ s/STUPIDXML\(#x(\w+)\)/chr(hex $1)/eg;
-    return $key,$val;
-}
-
-package PLXML::baseop;
-
-sub ast {
-    my $self = shift;
-
-    my @retval;
-    my @newkids;
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast($self, @_);
-    }
-    if (@newkids) {
-       push @retval, uc $self->key(), "(", @newkids , ")";
-    }
-    else {
-       push @retval, $self->madness('o ( )');
-    }
-    return $self->newtype->new(Kids => [@retval]);
-}
-
-package PLXML::baseop_unop;
-
-sub ast {
-    my $self = shift;
-    my @newkids = $self->madness('d o (');
-
-    if (exists $$self{Kids}) {
-       my $arg = $$self{Kids}[0];
-       push @newkids, $arg->ast($self, @_) if defined $arg;
-    }
-    push @newkids, $self->madness(')');
-
-    return $self->newtype()->new(Kids => [@newkids]);
-}
-
-package PLXML::binop;
-
-sub ast {
-    my $self = shift;
-    my @newkids;
-
-    my $left = $$self{Kids}[0];
-    push @newkids, $left->ast($self, @_);
-
-    push @newkids, $self->madness('o');
-
-    my $right = $$self{Kids}[1];
-    if (defined $right) {
-       push @newkids, $right->ast($self, @_);
-    }
-
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::cop;
-
-package PLXML::filestatop;
-
-sub ast {
-    my $self = shift;
-
-    my @newkids = $self->madness('o (');
-
-    if (@{$$self{Kids}}) {
-       for my $kid (@{$$self{Kids}}) {
-           push @newkids, $kid->ast($self, @_);
-       }
-    }
-    if ($$self{mp}{O}) {
-       push @newkids, $self->madness('O');
-    }
-    push @newkids, $self->madness(')');
-
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::listop;
-
-sub ast {
-    my $self = shift;
-
-    my @retval;
-    my @after;
-    if (@retval = $self->madness('X')) {
-       my @before, $self->madness('o x');
-       return P5AST::listop->new(Kids => [@before,@retval]);
-    }
-
-    push @retval, $self->madness('o d ( [ {');
-
-    my @newkids;
-    for my $kid (@{$$self{Kids}}) {
-       next if ref $kid eq 'PLXML::op_pushmark';
-       next if ref $kid eq 'PLXML::op_null' and
-               defined $$kid{was} and $$kid{was} eq 'pushmark';
-       push @newkids, $kid->ast($self, @_);
-    }
-
-    my $x = "";
-
-    if ($$self{mp}{S}) {
-       push @retval, $self->madness('S');
-    }
-    push @retval, @newkids;
-
-    push @retval, $self->madness('} ] )');
-    return $self->newtype->new(Kids => [@retval,@after]);
-}
-
-package PLXML::logop;
-
-sub ast {
-    my $self = shift;
-
-    my @newkids;
-    push @newkids, $self->madness('o (');
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast($self, @_);
-    }
-    push @newkids, $self->madness(')');
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::loop;
-
-package PLXML::loopexop;
-
-sub ast {
-    my $self = shift;
-    my @newkids = $self->madness('o (');
-
-    if ($$self{mp}{L} or not $$self{flags} =~ /\bSPECIAL\b/) {
-       my @label = $self->madness('L');
-       if (@label) {
-           push @newkids, @label;
-       }
-       else {
-           my $arg = $$self{Kids}[0];
-           push @newkids, $arg->ast($self, @_) if defined $arg;
-       }
-    }
-    push @newkids, $self->madness(')');
-
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-
-package PLXML::padop;
-
-package PLXML::padop_svop;
-
-package PLXML::pmop;
-
-sub ast {
-    my $self = shift;
-
-    return P5AST::pmop->new(Kids => []) unless exists $$self{flags};
-
-    my $bits = $self->fetchbits($$self{flags},@_);
-
-    my @newkids;
-    if ($bits->{binding}) {
-       push @newkids, $bits->{binding};
-       push @newkids, $self->madness('~');
-    }
-    if (exists $bits->{regcomp} and $bits->{regcomp}) {
-       my @front = $self->madness('q');
-       my @back = $self->madness('Q');
-       push @newkids, @front, $bits->{regcomp}, @back,
-               $self->madness('m');
-    }
-    elsif ($$self{mp}{q}) {
-       push @newkids, $self->madness('q = Q m');
-    }
-    elsif ($$self{mp}{X}) {
-       push @newkids, $self->madness('X m');
-    }
-    else {
-       push @newkids, $self->madness('e m');
-    }
-
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-sub innerpmop {
-    my $pmop = shift;
-    my $bits = shift;
-    for my $key (grep {!/^Kids/} keys %$pmop) {
-       $bits->{$key} = $pmop->{$key};
-    }
-
-    # Have to delete all the fake evals of the repl.  This is a pain...
-    if (@{$$pmop{Kids}}) {
-       my $really = $$pmop{Kids}[0]{Kids}[0];
-       if (ref $really eq 'PLXML::op_substcont') {
-           $really = $$really{Kids}[0];
-       }
-       while ((ref $really) =~ /^PLXML::op_.*(null|entereval)/) {
-           if (exists $$really{was}) {
-               $bits->{repl} = $really->ast(@_);
-               return;
-           }
-           $really = $$really{Kids}[0];
-       }
-       if (ref $really eq 'PLXML::op_scope' and
-           @{$$really{Kids}} == 1 and
-           ref $$really{Kids}[0] eq 'PLXML::op_null' and
-           not @{$$really{Kids}[0]{Kids}})
-       {
-           $bits->{repl} = '';
-           return;
-       }
-       if (ref $really eq 'PLXML::op_leave' and
-           @{$$really{Kids}} == 2 and
-           ref $$really{Kids}[1] eq 'PLXML::op_null' and
-           not @{$$really{Kids}[1]{Kids}})
-       {
-           $bits->{repl} = '';
-           return;
-       }
-       if ((ref $really) =~ /^PLXML::op_(scope|leave)/) {
-           # should be at inner do {...} here, so skip that fakery too
-           $bits->{repl} = $really->newtype->new(Kids => [$really->PLXML::op_lineseq::lineseq(@_)]);
-           # but retrieve the whitespace before fake '}'
-           if ($$really{mp}{'_}'}) {
-               push(@{$bits->{repl}->{Kids}}, p5::junk->new($$really{mp}{'_}'}));
-           }
-       }
-       else {  # something else, padsv probably
-           $bits->{repl} = $really->ast(@_);
-       }
-    }
-}
-
-sub fetchbits {
-    my $self = shift;
-    my $flags = shift || '';
-    my %bits = %$self;
-    my @kids = @{$$self{Kids}};
-    if (@kids) {
-       delete $bits{Kids};
-       my $arg = shift @kids;
-       innerpmop($arg,\%bits, $self, @_);
-       if ($flags =~ /STACKED/) {
-           $arg = shift @kids;
-           $bits{binding} = $arg->ast($self, @_);
-       }
-       if ($bits{when} ne "COMP" and @kids) {
-           $arg = pop @kids;
-           $bits{regcomp} = $arg->ast($self, @_);
-       }
-       if (not exists $bits{repl} and @kids) {
-           $arg = shift @kids;
-           $bits{repl} = $arg->ast($self, @_);
-       }
-    }
-    return \%bits;
-}
-
-package PLXML::pvop_svop;
-
-package PLXML::unop;
-
-sub ast {
-    my $self = shift;
-    my @newkids = $self->madness('o (');
-
-    if (exists $$self{Kids}) {
-       my $arg = $$self{Kids}[0];
-       push @newkids, $arg->ast($self, @_) if defined $arg;
-    }
-    push @newkids, $self->madness(')');
-
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML;
-package PLXML::Characters;
-package PLXML::madprops;
-package PLXML::mad_op;
-package PLXML::mad_pv;
-package PLXML::baseop;
-package PLXML::baseop_unop;
-package PLXML::binop;
-package PLXML::cop;
-package PLXML::filestatop;
-package PLXML::listop;
-package PLXML::logop;
-package PLXML::loop;
-package PLXML::loopexop;
-package PLXML::padop;
-package PLXML::padop_svop;
-package PLXML::pmop;
-package PLXML::pvop_svop;
-package PLXML::unop;
-package PLXML::op_null;
-
-# Null nodes typed by first madprop.
-
-my %astmad;
-
-BEGIN {
-    %astmad = (
-       'p' => sub {            # peg for #! line, etc.
-           my $self = shift;
-           my @newkids;
-           push @newkids, $self->madness('p px');
-           $::curstate = 0;
-           return P5AST::peg->new(Kids => [@newkids])
-       },
-       '(' => sub {            # extra parens around the whole thing
-           my $self = shift;
-           my @newkids;
-           push @newkids, $self->madness('dx d o (');
-           for my $kid (@{$$self{Kids}}) {
-               push @newkids, $kid->ast($self, @_);
-           }
-           push @newkids, $self->madness(')');
-           return P5AST::parens->new(Kids => [@newkids])
-       },
-       '~' => sub {                            # binding operator
-           my $self = shift;
-           my @newkids;
-           push @newkids, $$self{Kids}[0]->ast($self,@_);
-           push @newkids, $self->madness('~');
-           push @newkids, $$self{Kids}[1]->ast($self,@_);
-           return P5AST::bindop->new(Kids => [@newkids])
-       },
-       ';' => sub {            # null statements/blocks
-           my $self = shift;
-           my @newkids;
-           push @newkids, $self->madness('{ ; }');
-           $::curstate = 0;
-           return P5AST::nothing->new(Kids => [@newkids])
-       },
-       'I' => sub {            # if or unless statement keyword
-           my $self = shift;
-           my @newkids;
-           push @newkids, $self->madness('L I (');
-           my @subkids;
-           for my $kid (@{$$self{Kids}}) {
-               push @subkids, $kid->ast($self, @_);
-           }
-           die "oops in op_null->new" unless @subkids == 1;
-           my $newself = $subkids[0];
-           @subkids = @{$$newself{Kids}};
-           
-           unshift @{$subkids[0]{Kids}}, @newkids;
-           push @{$subkids[0]{Kids}}, $self->madness(')');
-           return bless($newself, 'P5AST::condstate');
-       },
-       'U' => sub {                    # use
-           my $self = shift;
-           my @newkids;
-           my @module = $self->madness('U');
-           my @args = $self->madness('A');
-           my $module = $module[-1]{Kids}[-1];
-           if ($module->uni eq 'bytes') {
-               $::curenc = Nomad::encnum('iso-8859-1');
-           }
-           elsif ($module->uni eq 'utf8') {
-               if ($$self{mp}{o} eq 'no') {
-                   $::curenc = Nomad::encnum('iso-8859-1');
-               }
-               else {
-                   $::curenc = Nomad::encnum('utf-8');
-               }
-           }
-           elsif ($module->uni eq 'encoding') {
-               if ($$self{mp}{o} eq 'no') {
-                   $::curenc = Nomad::encnum('iso-8859-1');
-               }
-               else {
-                   $::curenc = Nomad::encnum(eval $args[0]->p5text); # XXX bletch
-               }
-           }
-           # (Surrounding {} ends up here if use is only thing in block.)
-           push @newkids, $self->madness('{ o');
-           push @newkids, @module;
-           push @newkids, $self->madness('V');
-           push @newkids, @args;
-           push @newkids, $self->madness('S ; }');
-           $::curstate = 0;
-           return P5AST::use->new(Kids => [@newkids])
-       },
-       '?' => sub {                    # ternary
-           my $self = shift;
-           my @newkids;
-           my @subkids;
-           my @condkids = @{$$self{Kids}[0]{Kids}};
-           
-           push @newkids, $condkids[0]->ast($self,@_), $self->madness('?');
-           push @newkids, $condkids[1]->ast($self,@_), $self->madness(':');
-           push @newkids, $condkids[2]->ast($self,@_);
-           return P5AST::ternary->new(Kids => [@newkids])
-       },
-       '&' => sub {                    # subroutine
-           my $self = shift;
-           my @newkids;
-           push @newkids, $self->madness('d n s a : { & } ;');
-           $::curstate = 0;
-           return P5AST::sub->new(Kids => [@newkids])
-       },
-       'i' => sub {                    # modifier if
-           my $self = shift;
-           my @newkids;
-           push @newkids, $self->madness('i');
-           my $cond = $$self{Kids}[0];
-           my @subkids;
-           for my $kid (@{$$cond{Kids}}) {
-               push @subkids, $kid->ast($self, @_);
-           }
-           push @newkids, shift @subkids;
-           unshift @newkids, @subkids;
-           return P5AST::condmod->new(Kids => [@newkids])
-       },
-       'P' => sub {                            # package declaration
-           my $self = shift;
-           my @newkids;
-           push @newkids, $self->madness('o');
-           push @newkids, $self->madness('P');
-           push @newkids, $self->madness(';');
-           $::curstate = 0;
-           return P5AST::package->new(Kids => [@newkids])
-       },
-       'F' => sub {                            # format
-           my $self = shift;
-           my @newkids = $self->madness('F n b');
-           $::curstate = 0;
-           return P5AST::format->new(Kids => [@newkids])
-       },
-       'x' => sub {                            # qw literal
-           my $self = shift;
-           return P5AST::qwliteral->new(Kids => [$self->madness('x')])
-       },
-       'q' => sub {                            # random quote
-           my $self = shift;
-           return P5AST::quote->new(Kids => [$self->madness('q = Q')])
-       },
-       'X' => sub {                            # random literal
-           my $self = shift;
-           return P5AST::token->new(Kids => [$self->madness('X')])
-       },
-       ':' => sub {                            # attr list
-           my $self = shift;
-           return P5AST::attrlist->new(Kids => [$self->madness(':')])
-       },
-       ',' => sub {                            # "unary ," so to speak
-           my $self = shift;
-           my @newkids;
-           push @newkids, $self->madness(',');
-           push @newkids, $$self{Kids}[0]->ast($self,@_);
-           return P5AST::listelem->new(Kids => [@newkids])
-       },
-       'C' => sub {                            # constant conditional
-           my $self = shift;
-           my @newkids;
-           push @newkids, $$self{Kids}[0]->ast($self,@_);
-           my @folded = $self->madness('C');
-           if (@folded) {
-               my @t = $self->madness('t');
-               my @e = $self->madness('e');
-               if (@e) {
-                   return P5AST::op_cond_expr->new(
-                       Kids => [
-                           $self->madness('I ('),
-                           @folded,
-                           $self->madness(') ?'),
-                           P5AST::op_cond_expr->new(Kids => [@newkids]),
-                           $self->madness(':'),
-                           @e
-                       ] );
-               }
-               else {
-                   return P5AST::op_cond_expr->new(
-                       Kids => [
-                           $self->madness('I ('),
-                           @folded,
-                           $self->madness(') ?'),
-                           @t,
-                           $self->madness(':'),
-                           @newkids
-                       ] );
-               }
-           }
-           return P5AST::op_null->new(Kids => [@newkids])
-       },
-       '+' => sub {                            # unary +
-           my $self = shift;
-           my @newkids;
-           push @newkids, $self->madness('+');
-           push @newkids, $$self{Kids}[0]->ast($self,@_);
-           return P5AST::preplus->new(Kids => [@newkids])
-       },
-       'D' => sub {                            # do block
-           my $self = shift;
-           my @newkids;
-           push @newkids, $self->madness('D');
-           push @newkids, $$self{Kids}[0]->ast($self,@_);
-           return P5AST::doblock->new(Kids => [@newkids])
-       },
-       '3' => sub {                            # C-style for loop
-           my $self = shift;
-           my @newkids;
-
-           # What a mess!
-           my (undef, $init, $lineseq) = @{$$self{Kids}[0]{Kids}};
-           my (undef, $leaveloop) = @{$$lineseq{Kids}};
-           my (undef, $null) = @{$$leaveloop{Kids}};
-           my $and;
-           my $cond;
-           my $lineseq2;
-           my $block;
-           my $cont;
-           if (exists $$null{was} and $$null{was} eq 'and') {
-               ($lineseq2) = @{$$null{Kids}};
-           }
-           else {
-               ($and) = @{$$null{Kids}};
-               ($cond, $lineseq2) = @{$$and{Kids}};
-           }
-           if ($$lineseq2{mp}{'{'}) {
-               $block = $lineseq2;
-           }
-           else {
-               ($block, $cont) = @{$$lineseq2{Kids}};
-           }
-
-           push @newkids, $self->madness('L 3 (');
-           push @newkids, $init->ast($self,@_);
-           push @newkids, $self->madness('1');
-           if (defined $cond) {
-               push @newkids, $cond->ast($self,@_);
-           }
-           elsif (defined $null) {
-               push @newkids, $null->madness('1');
-           }
-           push @newkids, $self->madness('2');
-           if (defined $cont) {
-               push @newkids, $cont->ast($self,@_);
-           }
-           push @newkids, $self->madness(')');
-           push @newkids, $block->blockast($self,@_);
-           $::curstate = 0;
-           return P5AST::cfor->new(Kids => [@newkids])
-       },
-       'o' => sub {                    # random useless operator
-           my $self = shift;
-           my @newkids;
-           push @newkids, $self->madness('o');
-           my $kind = $newkids[-1] || '';
-           $kind = $kind->uni if ref $kind;
-           my @subkids;
-           for my $kid (@{$$self{Kids}}) {
-               push @subkids, $kid->ast($self, @_);
-           }
-           if ($kind eq '=') { # stealth readline
-               unshift(@newkids, shift(@subkids));
-               push(@newkids, @subkids);
-               return P5AST::op_aassign->new(Kids => [@newkids])
-           }
-           else {
-               my $newself = $subkids[0];
-               splice(@{$newself->{Kids}}, 1, 0,
-                           $self->madness('ox ('),
-                           @newkids,
-                           $self->madness(')')
-               );
-               return $newself;
-           }
-       },
-    );
-}
-
-# Null nodes are an untyped mess inside Perl.  Instead of fixing it there,
-# we derive an effective type either from the "was" field or the first madprop.
-# (The individual routines select the actual new type.)
-
-sub ast {
-    my $self = shift;
-    my $was = $$self{was} || 'peg';
-    my $mad = $$self{mp}{FIRST} || "unknown";
-
-    # First try for a "was".
-    my $meth = "PLXML::op_${was}::astnull";
-    if (exists &{$meth}) {
-       return $self->$meth(@_);
-    }
-
-    # Look at first madprop.
-    if (exists $astmad{$mad}) {
-       return $astmad{$mad}->($self);
-    }
-    warn "No mad $mad" unless $mad eq 'unknown';
-
-    # Do something generic.
-    my @newkids;
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast($self, @_);
-    }
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-sub blockast {
-    my $self = shift;
-    local $::curstate;
-    local $::curenc = $::curenc;
-    return $self->madness('{ ; }');
-}
-
-package PLXML::op_stub;
-
-sub ast {
-    my $self = shift;
-    return $self->newtype->new(Kids => [$self->madness(', x ( ) q = Q')]);
-}
-
-package PLXML::op_scalar;
-
-sub ast {
-    my $self = shift;
-
-    my @pre = $self->madness('o q');
-    my $op = pop @pre;
-    if ($op->uni =~ /^<</) {
-       my @newkids;
-       my $opstub = bless { start => $op }, 'P5AST::heredoc';
-       push @newkids, $opstub;
-       push @newkids, $self->madness('(');
-
-       my @kids = @{$$self{Kids}};
-
-       my @divert;
-       for my $kid (@kids) {
-           next if ref $kid eq 'PLXML::op_pushmark';
-           next if ref $kid eq 'PLXML::op_null' and
-                   defined $$kid{was} and $$kid{was} eq 'pushmark';
-           push @divert, $kid->ast($self, @_);
-       }
-       $opstub->{doc} = P5AST::op_list->new(Kids => [@divert]);
-       $opstub->{end} = ($self->madness('Q'))[-1];
-
-       push @newkids, $self->madness(')');
-
-       return $self->newtype->new(Kids => [@pre,@newkids]);
-    }
-    return $self->PLXML::baseop_unop::ast();
-}
-
-package PLXML::op_pushmark;
-
-sub ast { () }
-
-package PLXML::op_wantarray;
-package PLXML::op_const;
-
-sub astnull {
-    my $self = shift;
-    my @newkids;
-    return unless $$self{mp};
-    push @newkids, $self->madness('q = Q X : f O ( )');
-    return P5AST::op_const->new(Kids => [@newkids]);
-}
-
-sub ast {
-    my $self = shift;
-    return unless %{$$self{mp}};
-
-    my @before;
-
-    my $const;
-    my @args = $self->madness('f');
-    if (@args) {
-    }
-    elsif (exists $self->{mp}{q}) {
-       push @args, $self->madness('d q');
-       if ($args[-1]->uni =~ /^<</) {
-           my $opstub = bless { start => pop(@args) }, 'P5AST::heredoc';
-           $opstub->{doc} = P5AST::op_const->new(Kids => [$self->madness('=')]);
-           $opstub->{end} = ($self->madness('Q'))[-1];
-           push @args, $opstub;
-       }
-       else {
-           push @args, $self->madness('= Q');
-       }
-    }
-    elsif (exists $self->{mp}{X}) {
-       push @before, $self->madness('d');      # was local $[ probably
-       if (not $$self{mp}{O}) {
-           push @before, $self->madness('o');  # was unary
-       }
-       my @X = $self->madness(': X');
-       if (exists $$self{private} and $$self{private} =~ /BARE/) {
-           return $self->newtype->new(Kids => [@X]);
-       }
-       my $X = pop @X;
-       push @before, @X;
-       @args = (
-           $self->madness('x'),
-           $X);
-       if ($$self{mp}{O}) {
-           push @args, $self->madness('o O');
-       }
-    }
-    elsif (exists $self->{mp}{O}) {
-       push @args, $self->madness('O');
-    }
-    elsif ($$self{private} =~ /\bBARE\b/) {
-       @args = ($$self{PV});
-    }
-    elsif (exists $$self{mp}{o}) {
-       @args = $self->madness('o');
-    }
-    elsif (exists $$self{PV}) {
-       @args = ('"', $$self{PV}, '"');
-    }
-    elsif (exists $$self{NV}) {
-       @args = $$self{NV};
-    }
-    elsif (exists $$self{IV}) {
-       @args = $$self{IV};
-    }
-    else {
-       @args = $self->SUPER::text(@_);
-    }
-    return $self->newtype->new(Kids => [@before, @args]);
-}
-
-
-package PLXML::op_gvsv;
-
-sub ast {
-    my $self = shift;
-    my @args;
-    my @retval;
-    for my $attr (qw/gv GV flags/) {
-       if (exists $$self{$attr}) {
-           push @args, $attr, $$self{$attr};
-       }
-    }
-    push @retval, @args;
-    push @retval, $self->madness('X');
-    return $self->newtype->new(Kids => [@retval]);
-}
-
-package PLXML::op_gv;
-
-sub ast {
-    my $self = shift;
-    my @newkids;
-    push @newkids, $self->madness('X K');
-
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::op_gelem;
-
-sub ast {
-    my $self = shift;
-
-    local $::curstate; # in case there are statements in subscript
-    local $::curenc = $::curenc;
-    my @newkids;
-    push @newkids, $self->madness('dx d');
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast($self, @_);
-    }
-    splice @newkids, -1, 0, $self->madness('o {');
-    push @newkids, $self->madness('}');
-
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::op_padsv;
-
-sub ast {
-    my $self = shift;
-    my @args;
-    push @args, $self->madness('dx d ( $ )');
-
-    return $self->newtype->new(Kids => [@args]);
-}
-
-package PLXML::op_padav;
-
-sub astnull { ast(@_) }
-
-sub ast {
-    my $self = shift;
-    my @retval;
-    push @retval, $self->madness('dx d (');
-    push @retval, $self->madness('$ @');
-    push @retval, $self->madness(') o O');
-    return $self->newtype->new(Kids => [@retval]);
-}
-
-package PLXML::op_padhv;
-
-sub astnull { ast(@_) }
-
-sub ast {
-    my $self = shift;
-    my @retval;
-    push @retval, $self->madness('dx d (');
-    push @retval, $self->madness('$ @ %');
-    push @retval, $self->madness(') o O');
-    return $self->newtype->new(Kids => [@retval]);
-}
-
-package PLXML::op_padany;
-
-package PLXML::op_pushre;
-
-sub ast {
-    my $self = shift;
-    if ($$self{mp}{q}) {
-       return $self->madness('q = Q m');
-    }
-    if ($$self{mp}{X}) {
-       return $self->madness('X m');
-    }
-    if ($$self{mp}{e}) {
-       return $self->madness('e m');
-    }
-    return $$self{Kids}[1]->ast($self,@_), $self->madness('m');
-}
-
-package PLXML::op_rv2gv;
-
-sub ast {
-    my $self = shift;
-
-    my @newkids;
-    push @newkids, $self->madness('dx d ( * $');
-    push @newkids, $$self{Kids}[0]->ast();
-    push @newkids, $self->madness(')');
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::op_rv2sv;
-
-sub astnull {
-    my $self = shift;
-    return P5AST::op_rv2sv->new(Kids => [$self->madness('O o dx d ( $ ) : a')]);
-}
-
-sub ast {
-    my $self = shift;
-
-    my @newkids;
-    push @newkids, $self->madness('dx d ( $');
-    if (ref $$self{Kids}[0] ne "PLXML::op_gv") {
-       push @newkids, $$self{Kids}[0]->ast();
-    }
-    push @newkids, $self->madness(') : a');
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::op_av2arylen;
-
-sub ast {
-    my $self = shift;
-
-    my @newkids;
-    push @newkids, $$self{Kids}[0]->madness('l');
-    push @newkids, $$self{Kids}[0]->ast();
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::op_rv2cv;
-
-sub astnull {
-    my $self = shift;
-    my @newkids;
-    push @newkids, $self->madness('X');
-    return @newkids if @newkids;
-    if (exists $$self{mp}{'&'}) {
-       push @newkids, $self->madness('&');
-       if (@{$$self{Kids}}) {
-           push @newkids, $$self{Kids}[0]->ast(@_);
-       }
-    }
-    else {
-       push @newkids, $$self{Kids}[0]->ast(@_);
-    }
-    return P5AST::op_rv2cv->new(Kids => [@newkids]);
-}
-
-sub ast {
-    my $self = shift;
-
-    my @newkids;
-    push @newkids, $self->madness('&');
-    if (@{$$self{Kids}}) {
-       push @newkids, $$self{Kids}[0]->ast();
-    }
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::op_anoncode;
-
-sub ast {
-    my $self = shift;
-    my $arg = $$self{Kids}[0];
-    local $::curstate;         # hide nested statements in sub
-    local $::curenc = $::curenc;
-    if (defined $arg) {
-       return $arg->ast(@_);
-    }
-    return ';';  # XXX literal ; should come through somewhere
-}
-
-package PLXML::op_prototype;
-package PLXML::op_refgen;
-
-sub ast {
-    my $self = shift;
-    my @newkids = $self->madness('o s a');
-
-    if (exists $$self{Kids}) {
-       my $arg = $$self{Kids}[0];
-       push @newkids, $arg->ast($self, @_) if defined $arg;
-    }
-
-    my $res = $self->newtype->new(Kids => [@newkids]);
-    return $res;
-}
-
-package PLXML::op_srefgen;
-
-sub ast {
-    my @newkids;
-    my $self = shift;
-    if ($$self{mp}{FIRST} eq '{') {
-       local $::curstate;      # this is officially a block, so hide it
-       local $::curenc = $::curenc;
-       push @newkids, $self->madness('{');
-       for my $kid (@{$$self{Kids}}) {
-           push @newkids, $kid->ast($self, @_);
-       }
-       push @newkids, $self->madness('; }');
-       return P5AST::op_stringify->new(Kids => [@newkids]);
-    }
-    else {
-       push @newkids, $self->madness('o [');
-       for my $kid (@{$$self{Kids}}) {
-           push @newkids, $kid->ast($self, @_);
-       }
-       push @newkids, $self->madness(']');
-       return P5AST::op_stringify->new(Kids => [@newkids]);
-    }
-}
-
-package PLXML::op_ref;
-package PLXML::op_bless;
-package PLXML::op_backtick;
-
-sub ast {
-    my $self = shift;
-    my @args;
-    if (exists $self->{mp}{q}) {
-       push @args, $self->madness('q');
-       if ($args[-1]->uni =~ /^<</) {
-           my $opstub = bless { start => $args[-1] }, 'P5AST::heredoc';
-           $args[-1] = $opstub;
-           $opstub->{doc} = P5AST::op_const->new(Kids => [$self->madness('=')]);
-           $opstub->{end} = ($self->madness('Q'))[-1];
-       }
-       else {
-           push @args, $self->madness('= Q');
-       }
-    }
-    return $self->newtype->new(Kids => [@args]);
-}
-
-package PLXML::op_glob;
-
-sub astnull {
-    my $self = shift;
-    my @retval = $self->madness('o q = Q');
-    if (not @retval or $retval[-1]->uni eq 'glob') {
-       push @retval, $self->madness('(');
-       push @retval, $$self{Kids}[0]->ast($self,@_);
-       push @retval, $self->madness(')');
-    }
-    return P5AST::op_glob->new(Kids => [@retval]);
-}
-
-package PLXML::op_readline;
-
-sub astnull {
-    my $self = shift;
-    my @retval;
-    if (exists $$self{mp}{q}) {
-       @retval = $self->madness('q = Q');
-    }
-    elsif (exists $$self{mp}{X}) {
-       @retval = $self->madness('X');
-    }
-    return P5AST::op_readline->new(Kids => [@retval]);
-}
-
-sub ast {
-    my $self = shift;
-
-    my @retval;
-
-    my @args;
-    my $const;
-    if (exists $$self{mp}{q}) {
-       @args = $self->madness('q = Q');
-    }
-    elsif (exists $$self{mp}{X}) {
-       @args = $self->madness('X');
-    }
-    elsif (exists $$self{GV}) {
-       @args = $$self{IV};
-    }
-    elsif (@{$$self{Kids}}) {
-       @args = $self->PLXML::unop::ast(@_);
-    }
-    else {
-       @args = $self->SUPER::text(@_);
-    }
-    return $self->newtype->new(Kids => [@retval,@args]);
-}
-
-
-package PLXML::op_rcatline;
-package PLXML::op_regcmaybe;
-package PLXML::op_regcreset;
-package PLXML::op_regcomp;
-
-sub ast {
-    my $self = shift;
-    $self->PLXML::unop::ast(@_);
-}
-
-package PLXML::op_match;
-
-sub ast {
-    my $self = shift;
-    my $retval = $self->SUPER::ast(@_);
-    my $p5re;
-    if (not $p5re = $retval->p5text()) {
-       $retval = $self->newtype->new(Kids => [$self->madness('X q = Q m')]);
-       $p5re = $retval->p5text();
-    }
-    if ($deinterpolate) {
-       $retval->{P5re} = P5re::qrparse($p5re);
-    }
-    return $retval;
-}
-
-package PLXML::op_qr;
-
-sub ast {
-    my $self = shift;
-    my $retval;
-    if (exists $$self{flags}) {
-       $retval = $self->SUPER::ast(@_);
-    }
-    else {
-       $retval = $self->newtype->new(Kids => [$self->madness('X q = Q m')]);
-    }
-    if ($deinterpolate) {
-       my $p5re = $retval->p5text();
-       $retval->{P5re} = P5re::qrparse($p5re);
-    }
-    return $retval;
-}
-
-package PLXML::op_subst;
-
-sub ast {
-    my $self = shift;
-
-    my $bits = $self->fetchbits($$self{flags},@_);
-
-    my @newkids;
-    if ($bits->{binding}) {
-       push @newkids, $bits->{binding};
-       push @newkids, $self->madness('~');
-    }
-    my $X = p5::token->new($$self{mp}{X});
-    my @lfirst = $self->madness('q');
-    my @llast = $self->madness('Q');
-    push @newkids,
-       @lfirst,
-       $self->madness('E'),    # XXX s/b e probably
-       @llast;
-    my @rfirst = $self->madness('z');
-    my @rlast = $self->madness('Z');
-    my @mods = $self->madness('m');
-    if ($rfirst[-1]->uni ne $llast[-1]->uni) {
-       push @newkids, @rfirst;
-    }
-    # remove the fake '\n' if /e and '#' in replacement.
-    if (@mods and $mods[0] =~ m/e/ and ($self->madness('R'))[0]->uni =~ m/#/) {
-        unshift @rlast, bless {}, 'chomp'; # hack to remove '\n'
-    }
-    push @newkids, $bits->{repl}, @rlast, @mods;
-
-    my $retval = $self->newtype->new(Kids => [@newkids]);
-    if ($deinterpolate) {
-       my $p5re = $retval->p5text();
-       $retval->{P5re} = P5re::qrparse($p5re);
-    }
-    return $retval;
-}
-
-package PLXML::op_substcont;
-package PLXML::op_trans;
-
-sub ast {
-    my $self = shift;
-
-#    my $bits = $self->fetchbits($$self{flags},@_);
-#
-    my @newkids;
-    my @lfirst = $self->madness('q');
-    my @llast = $self->madness('Q');
-    push @newkids,
-       @lfirst,
-       $self->madness('E'),
-       @llast;
-    my @rfirst = $self->madness('z');
-    my @repl = $self->madness('R');
-    my @rlast = $self->madness('Z');
-    my @mods = $self->madness('m');
-    if ($rfirst[-1]->uni ne $llast[-1]->uni) {
-       push @newkids, @rfirst;
-    }
-
-    push @newkids, @repl, @rlast, @mods;
-
-    my $res = $self->newtype->new(Kids => [@newkids]);
-    return $res;
-}
-
-package PLXML::op_sassign;
-
-sub ast {
-    my $self = shift;
-    my @newkids;
-
-    my $right = $$self{Kids}[1];
-    eval { push @newkids, $right->ast($self, @_); };
-
-    push @newkids, $self->madness('o');
-
-    my $left = $$self{Kids}[0];
-    push @newkids, $left->ast($self, @_);
-
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::op_aassign;
-
-sub astnull { ast(@_) }
-
-sub ast {
-    my $self = shift;
-    my @newkids;
-
-    my $right = $$self{Kids}[1];
-    push @newkids, $right->ast($self, @_);
-
-    push @newkids, $self->madness('o');
-
-    my $left = $$self{Kids}[0];
-    push @newkids, $left->ast($self, @_);
-
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::op_chop;
-package PLXML::op_schop;
-package PLXML::op_chomp;
-package PLXML::op_schomp;
-package PLXML::op_defined;
-package PLXML::op_undef;
-package PLXML::op_study;
-package PLXML::op_pos;
-package PLXML::op_preinc;
-
-sub ast {
-    my $self = shift;
-    if ($$self{targ}) {                # stealth post inc or dec
-       return $self->PLXML::op_postinc::ast(@_);
-    }
-    return $self->SUPER::ast(@_);
-}
-
-package PLXML::op_i_preinc;
-
-sub ast { my $self = shift; $self->PLXML::op_preinc::ast(@_); }
-
-package PLXML::op_predec;
-
-sub ast { my $self = shift; $self->PLXML::op_preinc::ast(@_); }
-
-package PLXML::op_i_predec;
-
-sub ast { my $self = shift; $self->PLXML::op_preinc::ast(@_); }
-
-package PLXML::op_postinc;
-
-sub ast {
-    my $self = shift;
-    my @newkids;
-
-    if (exists $$self{Kids}) {
-       my $arg = $$self{Kids}[0];
-       push @newkids, $arg->ast($self, @_) if defined $arg;
-    }
-    push @newkids, $self->madness('o');
-
-    my $res = $self->newtype->new(Kids => [@newkids]);
-    return $res;
-}
-
-package PLXML::op_i_postinc;
-
-sub ast { my $self = shift; $self->PLXML::op_postinc::ast(@_); }
-
-package PLXML::op_postdec;
-
-sub ast { my $self = shift; $self->PLXML::op_postinc::ast(@_); }
-
-package PLXML::op_i_postdec;
-
-sub ast { my $self = shift; $self->PLXML::op_postinc::ast(@_); }
-
-package PLXML::op_pow;
-package PLXML::op_multiply;
-package PLXML::op_i_multiply;
-package PLXML::op_divide;
-package PLXML::op_i_divide;
-package PLXML::op_modulo;
-package PLXML::op_i_modulo;
-package PLXML::op_repeat;
-
-sub ast {
-    my $self = shift;
-    return $self->SUPER::ast(@_)
-       unless exists $$self{private} and $$self{private} =~ /DOLIST/;
-
-    my $newself = $$self{Kids}[0]->ast($self,@_);
-    splice @{$newself->{Kids}}, -1, 0, $self->madness('o');
-
-    return bless $newself, $self->newtype;     # rebless the op_null
-}
-
-package PLXML::op_add;
-package PLXML::op_i_add;
-package PLXML::op_subtract;
-package PLXML::op_i_subtract;
-package PLXML::op_concat;
-
-sub astnull {
-    my $self = shift;
-    my @newkids;
-
-    my @after;
-    my $left = $$self{Kids}[0];
-    push @newkids, $left->ast($self, @_);
-
-    push @newkids, $self->madness('o');
-
-    my $right = $$self{Kids}[1];
-    push @newkids, $right->ast($self, @_);
-    return P5AST::op_concat->new(Kids => [@newkids]);
-}
-
-sub ast {
-    my $self = shift;
-    my $parent = $_[0];
-    my @newkids;
-
-    my @after;
-    my $left = $$self{Kids}[0];
-    push @newkids, $left->ast($self, @_);
-
-    push @newkids, $self->madness('o');
-
-    my $right = $$self{Kids}[1];
-    push @newkids, $right->ast($self, @_);
-
-    return $self->newtype->new(Kids => [@newkids, @after]);
-}
-
-package PLXML::op_stringify;
-
-sub astnull {
-    ast(@_);
-}
-
-sub ast {
-    my $self = shift;
-    my @newkids;
-    my @front = $self->madness('q (');
-    my @back = $self->madness(') Q');
-    my @M = $self->madness('M');
-    if (@M) {
-       push @newkids, $M[0], $self->madness('o');
-    }
-    push @newkids, @front;
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast($self, @_);
-    }
-    push @newkids, @back;
-    return P5AST::op_stringify->new(Kids => [@newkids]);
-}
-
-package PLXML::op_left_shift;
-package PLXML::op_right_shift;
-package PLXML::op_lt;
-package PLXML::op_i_lt;
-package PLXML::op_gt;
-package PLXML::op_i_gt;
-package PLXML::op_le;
-package PLXML::op_i_le;
-package PLXML::op_ge;
-package PLXML::op_i_ge;
-package PLXML::op_eq;
-package PLXML::op_i_eq;
-package PLXML::op_ne;
-package PLXML::op_i_ne;
-package PLXML::op_ncmp;
-package PLXML::op_i_ncmp;
-package PLXML::op_slt;
-package PLXML::op_sgt;
-package PLXML::op_sle;
-package PLXML::op_sge;
-package PLXML::op_seq;
-package PLXML::op_sne;
-package PLXML::op_scmp;
-package PLXML::op_bit_and;
-package PLXML::op_bit_xor;
-package PLXML::op_bit_or;
-package PLXML::op_negate;
-package PLXML::op_i_negate;
-package PLXML::op_not;
-
-sub ast {
-    my $self = shift;
-    my @newkids = $self->madness('o (');
-    my @swap;
-    if (@newkids and $newkids[-1]->uni eq '!~') {
-       @swap = @newkids;
-       @newkids = ();
-    }
-
-    if (exists $$self{Kids}) {
-       my $arg = $$self{Kids}[0];
-       push @newkids, $arg->ast($self, @_) if defined $arg;
-    }
-    if (@swap) {
-       splice @{$newkids[-1][0]{Kids}}, -2, 0, @swap;  # XXX WAG
-    }
-    push @newkids, $self->madness(')');
-
-    my $res = $self->newtype->new(Kids => [@newkids]);
-    return $res;
-}
-
-package PLXML::op_complement;
-package PLXML::op_atan2;
-package PLXML::op_sin;
-package PLXML::op_cos;
-package PLXML::op_rand;
-package PLXML::op_srand;
-package PLXML::op_exp;
-package PLXML::op_log;
-package PLXML::op_sqrt;
-package PLXML::op_int;
-package PLXML::op_hex;
-package PLXML::op_oct;
-package PLXML::op_abs;
-package PLXML::op_length;
-package PLXML::op_substr;
-package PLXML::op_vec;
-package PLXML::op_index;
-package PLXML::op_rindex;
-package PLXML::op_sprintf;
-package PLXML::op_formline;
-package PLXML::op_ord;
-package PLXML::op_chr;
-package PLXML::op_crypt;
-package PLXML::op_ucfirst;
-
-sub ast {
-    my $self = shift;
-    return $self->PLXML::listop::ast(@_);
-}
-
-package PLXML::op_lcfirst;
-
-sub ast {
-    my $self = shift;
-    return $self->PLXML::listop::ast(@_);
-}
-
-package PLXML::op_uc;
-
-sub ast {
-    my $self = shift;
-    return $self->PLXML::listop::ast(@_);
-}
-
-package PLXML::op_lc;
-
-sub ast {
-    my $self = shift;
-    return $self->PLXML::listop::ast(@_);
-}
-
-package PLXML::op_quotemeta;
-
-sub ast {
-    my $self = shift;
-    return $self->PLXML::listop::ast(@_);
-}
-
-package PLXML::op_rv2av;
-
-sub astnull {
-    my $self = shift;
-    return P5AST::op_rv2av->new(Kids => [$self->madness('$ @')]);
-}
-
-sub ast {
-    my $self = shift;
-
-    if (ref $$self{Kids}[0] eq 'PLXML::op_const' and $$self{mp}{'O'}) {
-       return $self->madness('O');
-    }
-
-    my @before;
-    push @before, $self->madness('dx d (');
-
-    my @newkids;
-    push @newkids, $self->madness('$ @ K');
-    if (ref $$self{Kids}[0] ne "PLXML::op_gv") {
-       push @newkids, $$self{Kids}[0]->ast();
-    }
-    my @after;
-    push @after, $self->madness(') a');
-    return $self->newtype->new(Kids => [@before, @newkids, @after]);
-}
-
-package PLXML::op_aelemfast;
-
-sub ast {
-    my $self = shift;
-    return $self->madness('$');
-}
-
-package PLXML::op_aelem;
-
-sub astnull {
-    my $self = shift;
-    my @newkids;
-    push @newkids, $self->madness('dx d');
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast($self, @_);
-    }
-    splice @newkids, -1, 0, $self->madness('a [');
-    push @newkids, $self->madness(']');
-    return P5AST::op_aelem->new(Kids => [@newkids]);
-}
-
-sub ast {
-    my $self = shift;
-
-    my @before = $self->madness('dx d');
-    my @newkids;
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast(@_);
-    }
-    splice @newkids, -1, 0, $self->madness('a [');
-    push @newkids, $self->madness(']');
-
-    return $self->newtype->new(Kids => [@before, @newkids]);
-}
-
-package PLXML::op_aslice;
-
-sub astnull {
-    my $self = shift;
-    my @newkids;
-    push @newkids, $self->madness('[');
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast(@_);
-    }
-    unshift @newkids, pop @newkids;
-    unshift @newkids, $self->madness('dx d');
-    push @newkids, $self->madness(']');
-    return P5AST::op_aslice->new(Kids => [@newkids]);
-}
-
-sub ast {
-    my $self = shift;
-
-    my @newkids;
-    push @newkids, $self->madness('[');
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast(@_);
-    }
-    unshift @newkids, pop @newkids;
-    unshift @newkids, $self->madness('dx d');
-    push @newkids, $self->madness(']');
-
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::op_each;
-package PLXML::op_values;
-package PLXML::op_keys;
-package PLXML::op_delete;
-package PLXML::op_exists;
-package PLXML::op_rv2hv;
-
-sub astnull {
-    my $self = shift;
-    return P5AST::op_rv2hv->new(Kids => [$self->madness('$')]);
-}
-
-sub ast {
-    my $self = shift;
-
-    my @before;
-    push @before, $self->madness('dx d (');
-
-    my @newkids;
-    push @newkids, $self->madness('$ @ % K');
-    if (ref $$self{Kids}[0] ne "PLXML::op_gv") {
-       push @newkids, $$self{Kids}[0]->ast();
-    }
-    my @after;
-    push @after, $self->madness(') a');
-    return $self->newtype->new(Kids => [@before, @newkids, @after]);
-}
-
-package PLXML::op_helem;
-
-sub astnull {
-    my $self = shift;
-    local $::curstate; # hash subscript potentially a lineseq
-    local $::curenc = $::curenc;
-
-    my @newkids;
-    push @newkids, $self->madness('dx d');
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast($self, @_);
-    }
-    splice @newkids, -1, 0, $self->madness('a {');
-    push @newkids, $self->madness('}');
-    return P5AST::op_helem->new(Kids => [@newkids]);
-}
-
-sub ast {
-    my $self = shift;
-    local $::curstate; # hash subscript potentially a lineseq
-    local $::curenc = $::curenc;
-
-    my @before = $self->madness('dx d');
-    my @newkids;
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast($self, @_);
-    }
-    splice @newkids, -1, 0, $self->madness('a {');
-    push @newkids, $self->madness('}');
-
-    return $self->newtype->new(Kids => [@before, @newkids]);
-}
-
-
-package PLXML::op_hslice;
-
-sub astnull {
-    my $self = shift;
-    my @newkids;
-    push @newkids, $self->madness('{');
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast(@_);
-    }
-    unshift @newkids, pop @newkids;
-    unshift @newkids, $self->madness('dx d'); 
-    push @newkids, $self->madness('}');
-    return P5AST::op_hslice->new(Kids => [@newkids]);
-}
-
-sub ast {
-    my $self = shift;
-
-    my @newkids;
-    push @newkids, $self->madness('{');
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast(@_);
-    }
-    unshift @newkids, pop @newkids;
-    unshift @newkids, $self->madness('dx d'); 
-    push @newkids, $self->madness('}');
-
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::op_unpack;
-package PLXML::op_pack;
-package PLXML::op_split;
-package PLXML::op_join;
-package PLXML::op_list;
-
-sub astnull {
-    my $self = shift;
-    my @newkids;
-    my @retval;
-    my @before;
-    if (@retval = $self->madness('X')) {
-       push @before, $self->madness('x o');
-       return @before,@retval;
-    }
-    my @kids = @{$$self{Kids}};
-    for my $kid (@kids) {
-       next if ref $kid eq 'PLXML::op_pushmark';
-       next if ref $kid eq 'PLXML::op_null' and
-               defined $$kid{was} and $$kid{was} eq 'pushmark';
-       push @newkids, $kid->ast($self, @_);
-    }
-
-    my $x = "";
-    my @newnewkids = ();
-    push @newnewkids, $self->madness('dx d (');
-    push @newnewkids, @newkids;
-    push @newnewkids, $self->madness(') :');
-    return P5AST::op_list->new(Kids => [@newnewkids]);
-}
-
-sub ast {
-    my $self = shift;
-
-    my @retval;
-    my @before;
-    if (@retval = $self->madness('X')) {
-       push @before, $self->madness('o');
-       return $self->newtype->new(Kids => [@before,@retval]);
-    }
-    push @retval, $self->madness('dx d (');
-
-    my @newkids;
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast($self, @_);
-    }
-    my $x = "";
-    my @newnewkids = ();
-    push @newnewkids, @newkids;
-    @newkids = @newnewkids;
-    push @retval, @newkids;
-    push @retval, $self->madness(') :');
-    return $self->newtype->new(Kids => [@retval]);
-}
-
-package PLXML::op_lslice;
-
-sub ast {
-    my $self = shift;
-    my @newkids;
-
-    if ($$self{mp}{q}) {
-       push @newkids, $self->madness('q = Q');
-    }
-    elsif ($$self{mp}{x}) {
-       push @newkids, $self->madness('x');
-    }
-    else {
-       push @newkids, $self->madness('(');
-       my $list = $$self{Kids}[1];
-       push @newkids, $list->ast($self, @_);
-       push @newkids, $self->madness(')');
-    }
-
-    push @newkids, $self->madness('[');
-
-    my $slice = $$self{Kids}[0];
-    push @newkids, $slice->ast($self, @_);
-    push @newkids, $self->madness(']');
-
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::op_anonlist;
-package PLXML::op_anonhash;
-package PLXML::op_splice;
-package PLXML::op_push;
-package PLXML::op_pop;
-package PLXML::op_shift;
-package PLXML::op_unshift;
-package PLXML::op_sort;
-package PLXML::op_reverse;
-
-sub astnull {
-    my $self = shift;
-    $self->PLXML::listop::ast(@_);
-}
-
-package PLXML::op_grepstart;
-package PLXML::op_grepwhile;
-package PLXML::op_mapstart;
-package PLXML::op_mapwhile;
-package PLXML::op_range;
-
-sub ast {
-    my $self = shift;
-    return $self->PLXML::binop::ast(@_);
-}
-
-package PLXML::op_flip;
-package PLXML::op_flop;
-package PLXML::op_and;
-
-sub astnull {
-    my $self = shift;
-    my @newkids;
-    my @first = $self->madness('1');
-    my @second = $self->madness('2');
-    my @stuff = $$self{Kids}[0]->ast();
-    if (my @I = $self->madness('I')) {
-       if (@second) {
-           push @newkids, @I;
-           push @newkids, $self->madness('(');
-           push @newkids, @stuff;
-           push @newkids, $self->madness(')');
-           push @newkids, @second;
-       }
-       else {
-           push @newkids, @I;
-           push @newkids, $self->madness('(');
-           push @newkids, @first;
-           push @newkids, $self->madness(')');
-           push @newkids, @stuff;
-       }
-    }
-    elsif (my @i = $self->madness('i')) {
-       if (@second) {
-           push @newkids, @second;
-           push @newkids, @i;
-           push @newkids, @stuff;
-       }
-       else {
-           push @newkids, @stuff;
-           push @newkids, @i;
-           push @newkids, @first;
-       }
-    }
-    elsif (my @o = $self->madness('o')) {
-       if (@second) {
-           push @newkids, @stuff;
-           push @newkids, @o;
-           push @newkids, @second;
-       }
-       else {
-           push @newkids, @first;
-           push @newkids, @o;
-           push @newkids, @stuff;
-       }
-    }
-    return P5AST::op_and->new(Kids => [@newkids]);
-}
-
-package PLXML::op_or;
-
-sub astnull {
-    my $self = shift;
-    my @newkids;
-    my @first = $self->madness('1');
-    my @second = $self->madness('2');
-    my @i = $self->madness('i');
-    my @stuff = $$self{Kids}[0]->ast();
-    if (@second) {
-       if (@i) {
-           push @newkids, @second;
-           push @newkids, $self->madness('i');
-           push @newkids, @stuff;
-       }
-       else {
-           push @newkids, @stuff;
-           push @newkids, $self->madness('o');
-           push @newkids, @second;
-       }
-    }
-    else {
-       if (@i) {
-           push @newkids, @stuff;
-           push @newkids, $self->madness('i');
-           push @newkids, @first;
-       }
-       else {
-           push @newkids, @first;
-           push @newkids, $self->madness('o');
-           push @newkids, @stuff;
-       }
-    }
-    return "P5AST::op_$$self{was}"->new(Kids => [@newkids]);
-}
-
-
-package PLXML::op_xor;
-package PLXML::op_cond_expr;
-package PLXML::op_andassign;
-package PLXML::op_orassign;
-package PLXML::op_method;
-package PLXML::op_entersub;
-
-sub ast {
-    my $self = shift;
-
-    if ($$self{mp}{q}) {
-       return $self->madness('q = Q');
-    }
-    if ($$self{mp}{X}) {               # <FH> override?
-       return $self->madness('X');
-    }
-    if ($$self{mp}{A}) {
-       return $self->astmethod(@_);
-    }
-    if ($$self{mp}{a}) {
-       return $self->astarrow(@_);
-    }
-
-    my @retval;
-
-    my @newkids;
-    my @kids = @{$$self{Kids}};
-    if (@kids == 1 and ref $kids[0] eq 'PLXML::op_null' and $kids[0]{was} =~ /list/) {
-       @kids = @{$kids[0]{Kids}};
-    }
-    my $dest = pop @kids;
-    my @dest = $dest->ast($self, @_);
-    
-    if (ref($dest) =~ /method/) {
-       my $invocant = shift @kids;
-       $invocant = shift @kids if ref($invocant) eq 'PLXML::op_pushmark';
-       my @invocant = $invocant->ast($self, @_);
-       push @retval, @dest;
-       push @retval, @invocant;
-    }
-    elsif (exists $$self{mp}{o} and $$self{mp}{o} eq 'do') {
-       push @retval, $self->madness('o');
-       push @retval, @dest;
-    }
-    else {
-       push @retval, $self->madness('o');
-       push @retval, @dest;
-    }
-    while (@kids) {
-       my $kid = shift(@kids);
-       push @newkids, $kid->ast($self, @_);
-    }
-
-    push @retval, $self->madness('(');
-    push @retval, @newkids;
-    push @retval, $self->madness(')');
-    return $self->newtype->new(Kids => [@retval]);
-}
-
-sub astmethod {
-    my $self = shift;
-    my @newkids;
-    my @kids;
-    for my $kid (@{$$self{Kids}}) {
-       next if ref $kid eq 'PLXML::op_pushmark';
-       next if ref $kid eq 'PLXML::op_null' and
-               defined $$kid{was} and $$kid{was} eq 'pushmark';
-       push @kids, $kid;
-    }
-    my @invocant;
-    if ($$self{flags} =~ /\bSTACKED\b/) {
-       push @invocant, shift(@kids)->ast($self, @_);
-    }
-    for my $kid (@kids) {
-       push @newkids, $kid->ast($self, @_);
-    }
-    my $dest = pop(@newkids);
-    if (ref $dest eq 'PLXML::op_rv2cv' and $$self{flags} =~ /\bMOD\b/) {
-       $dest = pop(@newkids);
-    }
-    my $x = "";
-    my @retval;
-    push @retval, @invocant;
-    push @retval, $self->madness('A');
-    push @retval, $dest;
-    push @retval, $self->madness('(');
-    push @retval, @newkids;
-    push @retval, $self->madness(')');
-    return $self->newtype->new(Kids => [@retval]);
-}
-
-sub astarrow {
-    my $self = shift;
-    my @newkids;
-    my @retval;
-    my @kids = @{$$self{Kids}};
-    if (@kids == 1 and ref $kids[0] eq 'PLXML::op_null' and $kids[0]{was} =~ /list/) {
-       @kids = @{$kids[0]{Kids}};
-    }
-    while (@kids > 1) {
-       my $kid = shift(@kids);
-       push @newkids, $kid->ast($self, @_);
-    }
-    my @dest = $kids[0]->ast($self, @_);
-    my $x = "";
-    push @retval, @dest;
-    push @retval, $self->madness('a');
-    push @retval, $self->madness('(');
-    push @retval, @newkids;
-    push @retval, $self->madness(')');
-    return $self->newtype->new(Kids => [@retval]);
-}
-
-package PLXML::op_leavesub;
-
-sub ast {
-    my $self = shift;
-    if (ref $$self{Kids}[0] eq "PLXML::op_null") {
-       return $$self{Kids}[0]->ast(@_);
-    }
-    return $$self{Kids}[0]->blockast($self, @_);
-}
-
-package PLXML::op_leavesublv;
-
-sub ast {
-    my $self = shift;
-
-    return $$self{Kids}[0]->blockast($self, @_);
-}
-
-package PLXML::op_caller;
-package PLXML::op_warn;
-package PLXML::op_die;
-package PLXML::op_reset;
-package PLXML::op_lineseq;
-
-sub lineseq {
-    my $self = shift;
-    my @kids = @{$$self{Kids}};
-    local $::curstate = 0;     # (probably redundant, but that's okay)
-    local $::prevstate = 0;
-    local $::curenc = $::curenc;
-    my @retval;
-    my @newstuff;
-    my $newprev;
-    while (@kids) {
-       my $kid = shift @kids;
-       my $thing = $kid->ast($self, @_);
-       next unless defined $thing;
-       if ($::curstate ne $::prevstate) {
-           if ($::prevstate) {
-               push @newstuff, $::prevstate->madness(';');
-               push @{$newprev->{Kids}}, @newstuff if $newprev;
-               @newstuff = ();
-           }
-           $::prevstate = $::curstate;
-           $newprev = $thing;
-           push @retval, $thing;
-       }
-       elsif ($::prevstate) {
-           push @newstuff, $thing;
-       }
-       else {
-           push @retval, $thing;
-       }
-    }
-    if ($::prevstate) {
-       push @newstuff, $::prevstate->madness(';');
-       push @{$newprev->{Kids}}, @newstuff if $newprev;
-       @newstuff = ();
-       $::prevstate = 0;
-    }
-    return @retval;
-}
-
-sub blockast {
-    my $self = shift;
-    local $::curstate;
-
-    my @retval;
-    push @retval, $self->madness('{');
-    my @newkids = $self->PLXML::op_lineseq::lineseq(@_);
-    push @retval, @newkids;
-
-    push @retval, $self->madness('; }');
-    return $self->newtype->new(Kids => [@retval]);
-}
-
-package PLXML::op_nextstate;
-
-sub newtype { return "P5AST::statement" }
-
-sub astnull {
-    my $self = shift;
-    my @newkids;
-    push @newkids, $self->madness('L');
-    $::curstate = $self;
-    return P5AST::statement->new(Kids => [@newkids]);
-}
-
-sub ast {
-    my $self = shift;
-
-    my @newkids;
-    push @newkids, $self->madness('L');
-    $::curstate = $self;
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-
-package PLXML::op_dbstate;
-package PLXML::op_unstack;
-package PLXML::op_enter;
-
-sub ast { () }
-
-package PLXML::op_leave;
-
-sub astnull {
-    ast(@_);
-}
-
-sub ast {
-    my $self = shift;
-
-    my $mad = $$self{mp}{FIRST} || "unknown";
-
-    my @retval;
-    if ($mad eq 'w') {
-       my @newkids;
-       my @tmpkids;
-       push @tmpkids, $self->{Kids};
-       my $anddo = $$self{Kids}[-1]{Kids}[0]{Kids};
-       eval { push @newkids, $anddo->[1]->ast($self,@_); };
-       push @newkids, "[[[NOANDDO]]]" if $@;
-       push @newkids, $self->madness('w');
-       push @newkids, $anddo->[0]->ast($self,@_);
-
-       return $self->newtype->new(Kids => [@newkids]);
-    }
-
-    local $::curstate;
-    push @retval, $self->madness('o {');
-
-    my @newkids = $self->PLXML::op_lineseq::lineseq(@_);
-    push @retval, @newkids;
-    push @retval, $self->madness(q/; }/);
-    my $retval = $self->newtype->new(Kids => [@retval]);
-
-    if ($$self{mp}{C}) {
-       my @before;
-       my @after;
-       push @before, $self->madness('I ( C )');
-       if ($$self{mp}{t}) {
-           push @before, $self->madness('t');
-       }
-       elsif ($$self{mp}{e}) {
-           push @after, $self->madness('e');
-       }
-       return P5AST::op_cond->new(Kids => [@before, $retval, @after]);
-    }
-    else {
-       return $retval;
-    }
-}
-
-package PLXML::op_scope;
-
-sub ast {
-    my $self = shift;
-    local $::curstate;
-
-    my @newkids;
-    push @newkids, $self->madness('o');
-
-    push @newkids, $self->madness('{');
-    push @newkids, $self->PLXML::op_lineseq::lineseq(@_);
-    push @newkids, $self->madness('; }');
-
-    my @folded = $self->madness('C');
-    if (@folded) {
-       my @t = $self->madness('t');
-       my @e = $self->madness('e');
-       if (@e) {
-           return $self->newtype->new(
-               Kids => [
-                   $self->madness('I ('),
-                   @folded,
-                   $self->madness(')'),
-                   $self->newtype->new(Kids => [@newkids]),
-                   @e
-               ] );
-       }
-       else {
-           return $self->newtype->new(
-               Kids => [
-                   $self->madness('I ('),
-                   @folded,
-                   $self->madness(')'),
-                   @t,
-                   $self->newtype->new(Kids => [@newkids])
-               ] );
-       }
-    }
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::op_enteriter;
-
-sub ast {
-    my $self = shift;
-    my (undef,$range,$var) = @{$self->{Kids}};
-    my @retval;
-    push @retval, $self->madness('v');
-    if (!@retval and defined $var) {
-       push @retval, $var->ast($self,@_);
-    }
-    else {
-       push @retval, '';
-    }
-    if (ref $range eq 'PLXML::op_null' and $$self{flags} =~ /STACKED/) {
-       my (undef,$min,$max) = @{$range->{Kids}};
-       push @retval, $min->ast($self,@_);
-       if (defined $max) {
-           if (exists $$range{mp}{O}) {        # deeply buried .. operator
-               PLXML::prepreproc($$range{mp}{O});
-               push @retval,
-                 $$range{mp}{'O'}{Kids}[0]{Kids}[0]{Kids}[0]{Kids}[0]->madness('o')
-           }
-           else {
-               push @retval, '..';             # XXX missing whitespace
-           }
-           push @retval, $max->ast($self,@_);
-       }
-    }
-    else {
-       push @retval, $range->ast($self,@_);
-    }
-    return $self->newtype->new(Kids => [@retval]);
-}
-
-package PLXML::op_iter;
-package PLXML::op_enterloop;
-
-sub ast {
-}
-
-package PLXML::op_leaveloop;
-
-sub ast {
-    my $self = shift;
-
-    my @retval;
-    my @newkids;
-    my $enterloop = $$self{Kids}[0];
-    my $nextthing = $$self{Kids}[1];
-
-    if ($$self{mp}{W}) {
-       push @retval, $self->madness('L');
-       push @newkids, $self->madness('W d');
-
-       if (ref $enterloop eq 'PLXML::op_enteriter') {
-           my ($var,@rest) = @{$enterloop->ast($self,@_)->{Kids}};
-           push @newkids, $var if $var;
-           push @newkids, $self->madness('q ( x = Q');
-           push @newkids, @rest;
-       }
-       else {
-           push @newkids, $self->madness('(');
-           push @newkids, $enterloop->ast($self,@_);
-       }
-    }
-    my $andor;
-
-    if (ref $nextthing eq 'PLXML::op_null') {
-       if ($$nextthing{mp}{'1'}) {
-           push @newkids, $nextthing->madness('1');
-           push @newkids, $self->madness(')');
-           push @newkids, $$nextthing{Kids}[0]->blockast($self,@_);
-       }
-       elsif ($$nextthing{mp}{'2'}) {
-           push @newkids, $$nextthing{Kids}[0]->ast($self,@_);
-           push @newkids, $self->madness(')');
-           push @newkids, $$nextthing{mp}{'2'}->blockast($self,@_);
-       }
-       elsif ($$nextthing{mp}{'U'}) {
-           push @newkids, $nextthing->ast($self,@_);
-       }
-       else {
-           # bypass the op_null
-           $andor = $nextthing->{Kids}[0];
-           eval {
-               push @newkids, $$andor{Kids}[0]->ast($self, @_);
-           };
-           push @newkids, $self->madness(')');
-           eval {
-               push @newkids, $$andor{Kids}[1]->blockast($self, @_);
-           };
-       }
-    }
-    else {
-       $andor = $nextthing;
-       push @newkids, $nextthing->madness('O');
-       push @newkids, $self->madness(')');
-       push @newkids, $nextthing->blockast($self, @_);
-    }
-    if ($$self{mp}{w}) {
-       push @newkids, $self->madness('w');
-       push @newkids, $enterloop->ast($self,@_);
-    }
-
-    push @retval, @newkids;
-
-    return $self->newtype->new(Kids => [@retval]);
-}
-
-package PLXML::op_return;
-package PLXML::op_last;
-package PLXML::op_next;
-package PLXML::op_redo;
-package PLXML::op_dump;
-package PLXML::op_goto;
-package PLXML::op_exit;
-package PLXML::op_open;
-package PLXML::op_close;
-package PLXML::op_pipe_op;
-package PLXML::op_fileno;
-package PLXML::op_umask;
-package PLXML::op_binmode;
-package PLXML::op_tie;
-package PLXML::op_untie;
-package PLXML::op_tied;
-package PLXML::op_dbmopen;
-package PLXML::op_dbmclose;
-package PLXML::op_sselect;
-package PLXML::op_select;
-package PLXML::op_getc;
-package PLXML::op_read;
-package PLXML::op_enterwrite;
-package PLXML::op_leavewrite;
-package PLXML::op_prtf;
-package PLXML::op_print;
-package PLXML::op_say;
-package PLXML::op_sysopen;
-package PLXML::op_sysseek;
-package PLXML::op_sysread;
-package PLXML::op_syswrite;
-package PLXML::op_send;
-package PLXML::op_recv;
-package PLXML::op_eof;
-package PLXML::op_tell;
-package PLXML::op_seek;
-package PLXML::op_truncate;
-package PLXML::op_fcntl;
-package PLXML::op_ioctl;
-package PLXML::op_flock;
-package PLXML::op_socket;
-package PLXML::op_sockpair;
-package PLXML::op_bind;
-package PLXML::op_connect;
-package PLXML::op_listen;
-package PLXML::op_accept;
-package PLXML::op_shutdown;
-package PLXML::op_gsockopt;
-package PLXML::op_ssockopt;
-package PLXML::op_getsockname;
-package PLXML::op_getpeername;
-package PLXML::op_lstat;
-package PLXML::op_stat;
-package PLXML::op_ftrread;
-package PLXML::op_ftrwrite;
-package PLXML::op_ftrexec;
-package PLXML::op_fteread;
-package PLXML::op_ftewrite;
-package PLXML::op_fteexec;
-package PLXML::op_ftis;
-package PLXML::op_fteowned;
-package PLXML::op_ftrowned;
-package PLXML::op_ftzero;
-package PLXML::op_ftsize;
-package PLXML::op_ftmtime;
-package PLXML::op_ftatime;
-package PLXML::op_ftctime;
-package PLXML::op_ftsock;
-package PLXML::op_ftchr;
-package PLXML::op_ftblk;
-package PLXML::op_ftfile;
-package PLXML::op_ftdir;
-package PLXML::op_ftpipe;
-package PLXML::op_ftlink;
-package PLXML::op_ftsuid;
-package PLXML::op_ftsgid;
-package PLXML::op_ftsvtx;
-package PLXML::op_fttty;
-package PLXML::op_fttext;
-package PLXML::op_ftbinary;
-package PLXML::op_chdir;
-package PLXML::op_chown;
-package PLXML::op_chroot;
-package PLXML::op_unlink;
-package PLXML::op_chmod;
-package PLXML::op_utime;
-package PLXML::op_rename;
-package PLXML::op_link;
-package PLXML::op_symlink;
-package PLXML::op_readlink;
-package PLXML::op_mkdir;
-package PLXML::op_rmdir;
-package PLXML::op_open_dir;
-package PLXML::op_readdir;
-package PLXML::op_telldir;
-package PLXML::op_seekdir;
-package PLXML::op_rewinddir;
-package PLXML::op_closedir;
-package PLXML::op_fork;
-package PLXML::op_wait;
-package PLXML::op_waitpid;
-package PLXML::op_system;
-package PLXML::op_exec;
-package PLXML::op_kill;
-package PLXML::op_getppid;
-package PLXML::op_getpgrp;
-package PLXML::op_setpgrp;
-package PLXML::op_getpriority;
-package PLXML::op_setpriority;
-package PLXML::op_time;
-package PLXML::op_tms;
-package PLXML::op_localtime;
-package PLXML::op_gmtime;
-package PLXML::op_alarm;
-package PLXML::op_sleep;
-package PLXML::op_shmget;
-package PLXML::op_shmctl;
-package PLXML::op_shmread;
-package PLXML::op_shmwrite;
-package PLXML::op_msgget;
-package PLXML::op_msgctl;
-package PLXML::op_msgsnd;
-package PLXML::op_msgrcv;
-package PLXML::op_semget;
-package PLXML::op_semctl;
-package PLXML::op_semop;
-package PLXML::op_require;
-package PLXML::op_dofile;
-package PLXML::op_entereval;
-
-sub ast {
-    my $self = shift;
-    local $::curstate;         # eval {} has own statement sequence
-    return $self->SUPER::ast(@_);
-}
-
-package PLXML::op_leaveeval;
-package PLXML::op_entertry;
-package PLXML::op_leavetry;
-
-sub ast {
-    my $self = shift;
-
-    return $self->PLXML::op_leave::ast(@_);
-}
-
-package PLXML::op_ghbyname;
-package PLXML::op_ghbyaddr;
-package PLXML::op_ghostent;
-package PLXML::op_gnbyname;
-package PLXML::op_gnbyaddr;
-package PLXML::op_gnetent;
-package PLXML::op_gpbyname;
-package PLXML::op_gpbynumber;
-package PLXML::op_gprotoent;
-package PLXML::op_gsbyname;
-package PLXML::op_gsbyport;
-package PLXML::op_gservent;
-package PLXML::op_shostent;
-package PLXML::op_snetent;
-package PLXML::op_sprotoent;
-package PLXML::op_sservent;
-package PLXML::op_ehostent;
-package PLXML::op_enetent;
-package PLXML::op_eprotoent;
-package PLXML::op_eservent;
-package PLXML::op_gpwnam;
-package PLXML::op_gpwuid;
-package PLXML::op_gpwent;
-package PLXML::op_spwent;
-package PLXML::op_epwent;
-package PLXML::op_ggrnam;
-package PLXML::op_ggrgid;
-package PLXML::op_ggrent;
-package PLXML::op_sgrent;
-package PLXML::op_egrent;
-package PLXML::op_getlogin;
-package PLXML::op_syscall;
-package PLXML::op_lock;
-package PLXML::op_threadsv;
-package PLXML::op_setstate;
-package PLXML::op_method_named;
-
-sub ast {
-    my $self = shift;
-    return $self->madness('O');
-}
-
-package PLXML::op_dor;
-
-sub astnull {
-    my $self = shift;
-    $self->PLXML::op_or::astnull(@_);
-}
-
-package PLXML::op_dorassign;
-package PLXML::op_custom;
-
diff --git a/mad/P5AST.pm b/mad/P5AST.pm
deleted file mode 100644 (file)
index 13a35e1..0000000
+++ /dev/null
@@ -1,541 +0,0 @@
-package P5AST;
-
-$::herequeue = '';
-
-1;
-
-{
-    my %newkey = qw(
-    );
-
-    sub translate {
-       my $class = shift;
-       my $key = shift;
-       $key = $newkey{$key} || "op_$key";
-       return "P5AST::$key";
-    }
-}
-
-sub new {
-    my $class = shift;
-    bless {@_}, $class;
-}
-
-sub AUTOLOAD {
-    warn "AUTOLOAD $P5AST::AUTOLOAD(" . join(',', @_) . ")\n";
-}
-
-sub DESTROY { }
-
-sub p5arraytext {
-    my $kid = shift;
-    my $text = "";
-    for my $subkid (@$kid) {
-       my $type = ref $subkid;
-       if ($type eq 'ARRAY') {
-           if ($dowarn) {
-               warn "Extra array\n";
-               $text .= '〔 '. p5arraytext($subkid) . ' ã€•';
-           }
-           else {
-               $text .= p5arraytext($subkid);
-           }
-       }
-       elsif ($type =~ /^p5::/) {
-           my $newtext = $subkid->enc();
-           if ($::herequeue && $newtext =~ s/\n/\n$::herequeue/) {
-               $::herequeue = '';
-           }
-           $text .= $newtext;
-       }
-       elsif ($type) {
-           $text .= $subkid->text(@_);
-       }
-       else {
-           $text .= $subkid;
-       }
-    }
-    return $text;
-}
-
-sub p5text {
-    my $self = shift;
-#    my $pre = $self->pretext();
-#    my $post = $self->posttext();
-    my $text = "";
-    foreach my $kid (@{$$self{Kids}}) {
-       my $type = ref $kid;
-       if ($type eq 'ARRAY') {
-           $text .= p5arraytext($kid);
-       }
-       elsif ($type =~ /^p5::/) {
-           my $newtext = $kid->enc();
-           if ($::herequeue && $newtext =~ s/\n/\n$::herequeue/) {
-               $::herequeue = '';
-           }
-           $text .= $newtext;
-       }
-        elsif ($type eq "chomp") {
-            $text =~ s/\n$//g;
-        }
-       elsif ($type) {
-           $text .= $kid->p5text(@_);
-       }
-       elsif (defined $kid) {
-           $text .= $kid;
-       }
-       else {
-           $text .= '[[[ UNDEF ]]]';
-       }
-    }
-    return $text;
-}
-
-sub p5subtext {
-    my $self = shift;
-    my @text;
-    foreach my $kid (@{$$self{Kids}}) {
-       my $text = $kid->p5text(@_);
-       push @text, $text if defined $text;
-    }
-    return @text;
-}
-
-sub p6text {
-    return $_[0]->p5text();    # assume it's the same
-}
-
-package P5AST::heredoc; @ISA = 'P5AST';
-
-sub p5text {
-    my $self = shift;
-    my $newdoc;
-    {
-       local $::herequeue;                     # don't interpolate outer heredoc yet
-       $newdoc = $self->{doc}->p5text(@_) .  $self->{end}->enc();
-       if ($::herequeue) {                     # heredoc within the heredoc?
-           $newdoc .= $::herequeue;
-           $::herequeue = '';
-       }
-    }
-    $::herequeue .= $newdoc;
-    my $start = $self->{start};
-    my $type = ref $start;
-    if ($type =~ /^p5::/) {            # XXX too much cut-n-paste here...
-       return $start->enc();
-    }
-    elsif ($type) {
-       return $start->p5text(@_);
-    }
-    else {
-       return $start;
-    }
-}
-
-package P5AST::BAD;
-
-sub p5text {
-    my $self = shift;
-    my $t = ref $t;
-    warn "Shouldn't have a node of type $t";
-}
-
-package P5AST::baseop;                 @ISA = 'P5AST';
-package P5AST::baseop_unop;    @ISA = 'P5AST::baseop';
-package P5AST::binop;          @ISA = 'P5AST::baseop';
-package P5AST::cop;            @ISA = 'P5AST::baseop';
-package P5AST::filestatop;     @ISA = 'P5AST::baseop';
-package P5AST::listop;                 @ISA = 'P5AST::baseop';
-package P5AST::logop;          @ISA = 'P5AST::baseop';
-package P5AST::loop;           @ISA = 'P5AST::baseop';
-package P5AST::loopexop;       @ISA = 'P5AST::baseop';
-package P5AST::padop;          @ISA = 'P5AST::baseop';
-package P5AST::padop_svop;     @ISA = 'P5AST::baseop';
-package P5AST::pmop;           @ISA = 'P5AST::baseop';
-package P5AST::pvop_svop;      @ISA = 'P5AST::baseop';
-package P5AST::unop;           @ISA = 'P5AST::baseop';
-
-# Nothing.
-
-package P5AST::op_null;        @ISA = 'P5AST::baseop';
-package P5AST::op_stub;        @ISA = 'P5AST::baseop';
-package P5AST::op_scalar;      @ISA = 'P5AST::baseop_unop';
-
-# Pushy stuff.
-
-package P5AST::op_pushmark;    @ISA = 'P5AST::baseop';
-package P5AST::op_wantarray;   @ISA = 'P5AST::baseop';
-package P5AST::op_const;       @ISA = 'P5AST::padop_svop';
-package P5AST::op_gvsv;        @ISA = 'P5AST::padop_svop';
-package P5AST::op_gv;          @ISA = 'P5AST::padop_svop';
-package P5AST::op_gelem;       @ISA = 'P5AST::binop';
-package P5AST::op_padsv;       @ISA = 'P5AST::baseop';
-package P5AST::op_padav;       @ISA = 'P5AST::baseop';
-package P5AST::op_padhv;       @ISA = 'P5AST::baseop';
-package P5AST::op_padany;      @ISA = 'P5AST::baseop';
-package P5AST::op_pushre;      @ISA = 'P5AST::pmop';
-package P5AST::op_rv2gv;       @ISA = 'P5AST::unop';
-package P5AST::op_rv2sv;       @ISA = 'P5AST::unop';
-package P5AST::op_av2arylen;   @ISA = 'P5AST::unop';
-package P5AST::op_rv2cv;       @ISA = 'P5AST::unop';
-package P5AST::op_anoncode;    @ISA = 'P5AST::padop_svop';
-package P5AST::op_prototype;   @ISA = 'P5AST::baseop_unop';
-package P5AST::op_refgen;      @ISA = 'P5AST::unop';
-package P5AST::op_srefgen;     @ISA = 'P5AST::unop';
-package P5AST::op_ref;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_bless;       @ISA = 'P5AST::listop';
-package P5AST::op_backtick;    @ISA = 'P5AST::baseop_unop';
-package P5AST::op_glob;        @ISA = 'P5AST::listop';
-package P5AST::op_readline;    @ISA = 'P5AST::baseop_unop';
-package P5AST::op_rcatline;    @ISA = 'P5AST::padop_svop';
-package P5AST::op_regcmaybe;   @ISA = 'P5AST::unop';
-package P5AST::op_regcreset;   @ISA = 'P5AST::unop';
-package P5AST::op_regcomp;     @ISA = 'P5AST::logop';
-package P5AST::op_match;       @ISA = 'P5AST::pmop';
-package P5AST::op_qr;          @ISA = 'P5AST::pmop';
-package P5AST::op_subst;       @ISA = 'P5AST::pmop';
-package P5AST::op_substcont;   @ISA = 'P5AST::logop';
-package P5AST::op_trans;       @ISA = 'P5AST::pvop_svop';
-package P5AST::op_sassign;     @ISA = 'P5AST::baseop';
-package P5AST::op_aassign;     @ISA = 'P5AST::binop';
-package P5AST::op_chop;        @ISA = 'P5AST::baseop_unop';
-package P5AST::op_schop;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_chomp;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_schomp;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_defined;     @ISA = 'P5AST::baseop_unop';
-package P5AST::op_undef;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_study;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_pos;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_preinc;      @ISA = 'P5AST::unop';
-package P5AST::op_i_preinc;    @ISA = 'P5AST::unop';
-package P5AST::op_predec;      @ISA = 'P5AST::unop';
-package P5AST::op_i_predec;    @ISA = 'P5AST::unop';
-package P5AST::op_postinc;     @ISA = 'P5AST::unop';
-package P5AST::op_i_postinc;   @ISA = 'P5AST::unop';
-package P5AST::op_postdec;     @ISA = 'P5AST::unop';
-package P5AST::op_i_postdec;   @ISA = 'P5AST::unop';
-package P5AST::op_pow;                 @ISA = 'P5AST::binop';
-package P5AST::op_multiply;    @ISA = 'P5AST::binop';
-package P5AST::op_i_multiply;  @ISA = 'P5AST::binop';
-package P5AST::op_divide;      @ISA = 'P5AST::binop';
-package P5AST::op_i_divide;    @ISA = 'P5AST::binop';
-package P5AST::op_modulo;      @ISA = 'P5AST::binop';
-package P5AST::op_i_modulo;    @ISA = 'P5AST::binop';
-package P5AST::op_repeat;      @ISA = 'P5AST::binop';
-package P5AST::op_add;                 @ISA = 'P5AST::binop';
-package P5AST::op_i_add;       @ISA = 'P5AST::binop';
-package P5AST::op_subtract;    @ISA = 'P5AST::binop';
-package P5AST::op_i_subtract;  @ISA = 'P5AST::binop';
-package P5AST::op_concat;      @ISA = 'P5AST::binop';
-package P5AST::op_stringify;   @ISA = 'P5AST::listop';
-package P5AST::op_left_shift;  @ISA = 'P5AST::binop';
-package P5AST::op_right_shift;         @ISA = 'P5AST::binop';
-package P5AST::op_lt;          @ISA = 'P5AST::binop';
-package P5AST::op_i_lt;        @ISA = 'P5AST::binop';
-package P5AST::op_gt;          @ISA = 'P5AST::binop';
-package P5AST::op_i_gt;        @ISA = 'P5AST::binop';
-package P5AST::op_le;          @ISA = 'P5AST::binop';
-package P5AST::op_i_le;        @ISA = 'P5AST::binop';
-package P5AST::op_ge;          @ISA = 'P5AST::binop';
-package P5AST::op_i_ge;        @ISA = 'P5AST::binop';
-package P5AST::op_eq;          @ISA = 'P5AST::binop';
-package P5AST::op_i_eq;        @ISA = 'P5AST::binop';
-package P5AST::op_ne;          @ISA = 'P5AST::binop';
-package P5AST::op_i_ne;        @ISA = 'P5AST::binop';
-package P5AST::op_ncmp;        @ISA = 'P5AST::binop';
-package P5AST::op_i_ncmp;      @ISA = 'P5AST::binop';
-package P5AST::op_slt;                 @ISA = 'P5AST::binop';
-package P5AST::op_sgt;                 @ISA = 'P5AST::binop';
-package P5AST::op_sle;                 @ISA = 'P5AST::binop';
-package P5AST::op_sge;                 @ISA = 'P5AST::binop';
-package P5AST::op_seq;                 @ISA = 'P5AST::binop';
-package P5AST::op_sne;                 @ISA = 'P5AST::binop';
-package P5AST::op_scmp;        @ISA = 'P5AST::binop';
-package P5AST::op_bit_and;     @ISA = 'P5AST::binop';
-package P5AST::op_bit_xor;     @ISA = 'P5AST::binop';
-package P5AST::op_bit_or;      @ISA = 'P5AST::binop';
-package P5AST::op_negate;      @ISA = 'P5AST::unop';
-package P5AST::op_i_negate;    @ISA = 'P5AST::unop';
-package P5AST::op_not;                 @ISA = 'P5AST::unop';
-package P5AST::op_complement;  @ISA = 'P5AST::unop';
-package P5AST::op_atan2;       @ISA = 'P5AST::listop';
-package P5AST::op_sin;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_cos;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_rand;        @ISA = 'P5AST::baseop_unop';
-package P5AST::op_srand;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_exp;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_log;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_sqrt;        @ISA = 'P5AST::baseop_unop';
-package P5AST::op_int;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_hex;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_oct;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_abs;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_length;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_substr;      @ISA = 'P5AST::listop';
-package P5AST::op_vec;                 @ISA = 'P5AST::listop';
-package P5AST::op_index;       @ISA = 'P5AST::listop';
-package P5AST::op_rindex;      @ISA = 'P5AST::listop';
-package P5AST::op_sprintf;     @ISA = 'P5AST::listop';
-package P5AST::op_formline;    @ISA = 'P5AST::listop';
-package P5AST::op_ord;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_chr;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_crypt;       @ISA = 'P5AST::listop';
-package P5AST::op_ucfirst;     @ISA = 'P5AST::baseop_unop';
-package P5AST::op_lcfirst;     @ISA = 'P5AST::baseop_unop';
-package P5AST::op_uc;          @ISA = 'P5AST::baseop_unop';
-package P5AST::op_lc;          @ISA = 'P5AST::baseop_unop';
-package P5AST::op_quotemeta;   @ISA = 'P5AST::baseop_unop';
-package P5AST::op_rv2av;       @ISA = 'P5AST::unop';
-package P5AST::op_aelemfast;   @ISA = 'P5AST::padop_svop';
-package P5AST::op_aelem;       @ISA = 'P5AST::binop';
-package P5AST::op_aslice;      @ISA = 'P5AST::listop';
-package P5AST::op_each;        @ISA = 'P5AST::baseop_unop';
-package P5AST::op_values;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_keys;        @ISA = 'P5AST::baseop_unop';
-package P5AST::op_delete;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_exists;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_rv2hv;       @ISA = 'P5AST::unop';
-package P5AST::op_helem;       @ISA = 'P5AST::listop';
-package P5AST::op_hslice;      @ISA = 'P5AST::listop';
-package P5AST::op_unpack;      @ISA = 'P5AST::listop';
-package P5AST::op_pack;        @ISA = 'P5AST::listop';
-package P5AST::op_split;       @ISA = 'P5AST::listop';
-package P5AST::op_join;        @ISA = 'P5AST::listop';
-package P5AST::op_list;        @ISA = 'P5AST::listop';
-package P5AST::op_lslice;      @ISA = 'P5AST::binop';
-package P5AST::op_anonlist;    @ISA = 'P5AST::listop';
-package P5AST::op_anonhash;    @ISA = 'P5AST::listop';
-package P5AST::op_splice;      @ISA = 'P5AST::listop';
-package P5AST::op_push;        @ISA = 'P5AST::listop';
-package P5AST::op_pop;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_shift;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_unshift;     @ISA = 'P5AST::listop';
-package P5AST::op_sort;        @ISA = 'P5AST::listop';
-package P5AST::op_reverse;     @ISA = 'P5AST::listop';
-package P5AST::op_grepstart;   @ISA = 'P5AST::listop';
-package P5AST::op_grepwhile;   @ISA = 'P5AST::logop';
-package P5AST::op_mapstart;    @ISA = 'P5AST::listop';
-package P5AST::op_mapwhile;    @ISA = 'P5AST::logop';
-package P5AST::op_range;       @ISA = 'P5AST::logop';
-package P5AST::op_flip;        @ISA = 'P5AST::unop';
-package P5AST::op_flop;        @ISA = 'P5AST::unop';
-package P5AST::op_and;                 @ISA = 'P5AST::logop';
-package P5AST::op_or;          @ISA = 'P5AST::logop';
-package P5AST::op_xor;                 @ISA = 'P5AST::binop';
-package P5AST::op_cond_expr;   @ISA = 'P5AST::logop';
-package P5AST::op_andassign;   @ISA = 'P5AST::logop';
-package P5AST::op_orassign;    @ISA = 'P5AST::logop';
-package P5AST::op_method;      @ISA = 'P5AST::unop';
-package P5AST::op_entersub;    @ISA = 'P5AST::unop';
-package P5AST::op_leavesub;    @ISA = 'P5AST::unop';
-package P5AST::op_leavesublv;  @ISA = 'P5AST::unop';
-package P5AST::op_caller;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_warn;        @ISA = 'P5AST::listop';
-package P5AST::op_die;                 @ISA = 'P5AST::listop';
-package P5AST::op_reset;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_lineseq;     @ISA = 'P5AST::listop';
-package P5AST::op_nextstate;   @ISA = 'P5AST::BAD';
-package P5AST::op_dbstate;     @ISA = 'P5AST::cop';
-package P5AST::op_unstack;     @ISA = 'P5AST::baseop';
-package P5AST::op_enter;       @ISA = 'P5AST::baseop';
-package P5AST::op_leave;       @ISA = 'P5AST::listop';
-package P5AST::op_scope;       @ISA = 'P5AST::listop';
-package P5AST::op_enteriter;   @ISA = 'P5AST::loop';
-package P5AST::op_iter;        @ISA = 'P5AST::baseop';
-package P5AST::op_enterloop;   @ISA = 'P5AST::loop';
-package P5AST::op_leaveloop;   @ISA = 'P5AST::binop';
-package P5AST::op_return;      @ISA = 'P5AST::listop';
-package P5AST::op_last;        @ISA = 'P5AST::loopexop';
-package P5AST::op_next;        @ISA = 'P5AST::loopexop';
-package P5AST::op_redo;        @ISA = 'P5AST::loopexop';
-package P5AST::op_dump;        @ISA = 'P5AST::loopexop';
-package P5AST::op_goto;        @ISA = 'P5AST::loopexop';
-package P5AST::op_exit;        @ISA = 'P5AST::baseop_unop';
-package P5AST::op_open;        @ISA = 'P5AST::listop';
-package P5AST::op_close;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_pipe_op;     @ISA = 'P5AST::listop';
-package P5AST::op_fileno;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_umask;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_binmode;     @ISA = 'P5AST::listop';
-package P5AST::op_tie;                 @ISA = 'P5AST::listop';
-package P5AST::op_untie;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_tied;        @ISA = 'P5AST::baseop_unop';
-package P5AST::op_dbmopen;     @ISA = 'P5AST::listop';
-package P5AST::op_dbmclose;    @ISA = 'P5AST::baseop_unop';
-package P5AST::op_sselect;     @ISA = 'P5AST::listop';
-package P5AST::op_select;      @ISA = 'P5AST::listop';
-package P5AST::op_getc;        @ISA = 'P5AST::baseop_unop';
-package P5AST::op_read;        @ISA = 'P5AST::listop';
-package P5AST::op_enterwrite;  @ISA = 'P5AST::baseop_unop';
-package P5AST::op_leavewrite;  @ISA = 'P5AST::unop';
-package P5AST::op_prtf;        @ISA = 'P5AST::listop';
-package P5AST::op_print;       @ISA = 'P5AST::listop';
-package P5AST::op_say;         @ISA = 'P5AST::listop';
-package P5AST::op_sysopen;     @ISA = 'P5AST::listop';
-package P5AST::op_sysseek;     @ISA = 'P5AST::listop';
-package P5AST::op_sysread;     @ISA = 'P5AST::listop';
-package P5AST::op_syswrite;    @ISA = 'P5AST::listop';
-package P5AST::op_send;        @ISA = 'P5AST::listop';
-package P5AST::op_recv;        @ISA = 'P5AST::listop';
-package P5AST::op_eof;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_tell;        @ISA = 'P5AST::baseop_unop';
-package P5AST::op_seek;        @ISA = 'P5AST::listop';
-package P5AST::op_truncate;    @ISA = 'P5AST::listop';
-package P5AST::op_fcntl;       @ISA = 'P5AST::listop';
-package P5AST::op_ioctl;       @ISA = 'P5AST::listop';
-package P5AST::op_flock;       @ISA = 'P5AST::listop';
-package P5AST::op_socket;      @ISA = 'P5AST::listop';
-package P5AST::op_sockpair;    @ISA = 'P5AST::listop';
-package P5AST::op_bind;        @ISA = 'P5AST::listop';
-package P5AST::op_connect;     @ISA = 'P5AST::listop';
-package P5AST::op_listen;      @ISA = 'P5AST::listop';
-package P5AST::op_accept;      @ISA = 'P5AST::listop';
-package P5AST::op_shutdown;    @ISA = 'P5AST::listop';
-package P5AST::op_gsockopt;    @ISA = 'P5AST::listop';
-package P5AST::op_ssockopt;    @ISA = 'P5AST::listop';
-package P5AST::op_getsockname;         @ISA = 'P5AST::baseop_unop';
-package P5AST::op_getpeername;         @ISA = 'P5AST::baseop_unop';
-package P5AST::op_lstat;       @ISA = 'P5AST::filestatop';
-package P5AST::op_stat;        @ISA = 'P5AST::filestatop';
-package P5AST::op_ftrread;     @ISA = 'P5AST::filestatop';
-package P5AST::op_ftrwrite;    @ISA = 'P5AST::filestatop';
-package P5AST::op_ftrexec;     @ISA = 'P5AST::filestatop';
-package P5AST::op_fteread;     @ISA = 'P5AST::filestatop';
-package P5AST::op_ftewrite;    @ISA = 'P5AST::filestatop';
-package P5AST::op_fteexec;     @ISA = 'P5AST::filestatop';
-package P5AST::op_ftis;        @ISA = 'P5AST::filestatop';
-package P5AST::op_fteowned;    @ISA = 'P5AST::filestatop';
-package P5AST::op_ftrowned;    @ISA = 'P5AST::filestatop';
-package P5AST::op_ftzero;      @ISA = 'P5AST::filestatop';
-package P5AST::op_ftsize;      @ISA = 'P5AST::filestatop';
-package P5AST::op_ftmtime;     @ISA = 'P5AST::filestatop';
-package P5AST::op_ftatime;     @ISA = 'P5AST::filestatop';
-package P5AST::op_ftctime;     @ISA = 'P5AST::filestatop';
-package P5AST::op_ftsock;      @ISA = 'P5AST::filestatop';
-package P5AST::op_ftchr;       @ISA = 'P5AST::filestatop';
-package P5AST::op_ftblk;       @ISA = 'P5AST::filestatop';
-package P5AST::op_ftfile;      @ISA = 'P5AST::filestatop';
-package P5AST::op_ftdir;       @ISA = 'P5AST::filestatop';
-package P5AST::op_ftpipe;      @ISA = 'P5AST::filestatop';
-package P5AST::op_ftlink;      @ISA = 'P5AST::filestatop';
-package P5AST::op_ftsuid;      @ISA = 'P5AST::filestatop';
-package P5AST::op_ftsgid;      @ISA = 'P5AST::filestatop';
-package P5AST::op_ftsvtx;      @ISA = 'P5AST::filestatop';
-package P5AST::op_fttty;       @ISA = 'P5AST::filestatop';
-package P5AST::op_fttext;      @ISA = 'P5AST::filestatop';
-package P5AST::op_ftbinary;    @ISA = 'P5AST::filestatop';
-package P5AST::op_chdir;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_chown;       @ISA = 'P5AST::listop';
-package P5AST::op_chroot;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_unlink;      @ISA = 'P5AST::listop';
-package P5AST::op_chmod;       @ISA = 'P5AST::listop';
-package P5AST::op_utime;       @ISA = 'P5AST::listop';
-package P5AST::op_rename;      @ISA = 'P5AST::listop';
-package P5AST::op_link;        @ISA = 'P5AST::listop';
-package P5AST::op_symlink;     @ISA = 'P5AST::listop';
-package P5AST::op_readlink;    @ISA = 'P5AST::baseop_unop';
-package P5AST::op_mkdir;       @ISA = 'P5AST::listop';
-package P5AST::op_rmdir;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_open_dir;    @ISA = 'P5AST::listop';
-package P5AST::op_readdir;     @ISA = 'P5AST::baseop_unop';
-package P5AST::op_telldir;     @ISA = 'P5AST::baseop_unop';
-package P5AST::op_seekdir;     @ISA = 'P5AST::listop';
-package P5AST::op_rewinddir;   @ISA = 'P5AST::baseop_unop';
-package P5AST::op_closedir;    @ISA = 'P5AST::baseop_unop';
-package P5AST::op_fork;        @ISA = 'P5AST::baseop';
-package P5AST::op_wait;        @ISA = 'P5AST::baseop';
-package P5AST::op_waitpid;     @ISA = 'P5AST::listop';
-package P5AST::op_system;      @ISA = 'P5AST::listop';
-package P5AST::op_exec;        @ISA = 'P5AST::listop';
-package P5AST::op_kill;        @ISA = 'P5AST::listop';
-package P5AST::op_getppid;     @ISA = 'P5AST::baseop';
-package P5AST::op_getpgrp;     @ISA = 'P5AST::baseop_unop';
-package P5AST::op_setpgrp;     @ISA = 'P5AST::listop';
-package P5AST::op_getpriority;         @ISA = 'P5AST::listop';
-package P5AST::op_setpriority;         @ISA = 'P5AST::listop';
-package P5AST::op_time;        @ISA = 'P5AST::baseop';
-package P5AST::op_tms;         @ISA = 'P5AST::baseop';
-package P5AST::op_localtime;   @ISA = 'P5AST::baseop_unop';
-package P5AST::op_gmtime;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_alarm;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_sleep;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_shmget;      @ISA = 'P5AST::listop';
-package P5AST::op_shmctl;      @ISA = 'P5AST::listop';
-package P5AST::op_shmread;     @ISA = 'P5AST::listop';
-package P5AST::op_shmwrite;    @ISA = 'P5AST::listop';
-package P5AST::op_msgget;      @ISA = 'P5AST::listop';
-package P5AST::op_msgctl;      @ISA = 'P5AST::listop';
-package P5AST::op_msgsnd;      @ISA = 'P5AST::listop';
-package P5AST::op_msgrcv;      @ISA = 'P5AST::listop';
-package P5AST::op_semget;      @ISA = 'P5AST::listop';
-package P5AST::op_semctl;      @ISA = 'P5AST::listop';
-package P5AST::op_semop;       @ISA = 'P5AST::listop';
-package P5AST::op_require;     @ISA = 'P5AST::baseop_unop';
-package P5AST::op_dofile;      @ISA = 'P5AST::unop';
-package P5AST::op_entereval;   @ISA = 'P5AST::baseop_unop';
-package P5AST::op_leaveeval;   @ISA = 'P5AST::unop';
-package P5AST::op_entertry;    @ISA = 'P5AST::logop';
-package P5AST::op_leavetry;    @ISA = 'P5AST::listop';
-package P5AST::op_ghbyname;    @ISA = 'P5AST::baseop_unop';
-package P5AST::op_ghbyaddr;    @ISA = 'P5AST::listop';
-package P5AST::op_ghostent;    @ISA = 'P5AST::baseop';
-package P5AST::op_gnbyname;    @ISA = 'P5AST::baseop_unop';
-package P5AST::op_gnbyaddr;    @ISA = 'P5AST::listop';
-package P5AST::op_gnetent;     @ISA = 'P5AST::baseop';
-package P5AST::op_gpbyname;    @ISA = 'P5AST::baseop_unop';
-package P5AST::op_gpbynumber;  @ISA = 'P5AST::listop';
-package P5AST::op_gprotoent;   @ISA = 'P5AST::baseop';
-package P5AST::op_gsbyname;    @ISA = 'P5AST::listop';
-package P5AST::op_gsbyport;    @ISA = 'P5AST::listop';
-package P5AST::op_gservent;    @ISA = 'P5AST::baseop';
-package P5AST::op_shostent;    @ISA = 'P5AST::baseop_unop';
-package P5AST::op_snetent;     @ISA = 'P5AST::baseop_unop';
-package P5AST::op_sprotoent;   @ISA = 'P5AST::baseop_unop';
-package P5AST::op_sservent;    @ISA = 'P5AST::baseop_unop';
-package P5AST::op_ehostent;    @ISA = 'P5AST::baseop';
-package P5AST::op_enetent;     @ISA = 'P5AST::baseop';
-package P5AST::op_eprotoent;   @ISA = 'P5AST::baseop';
-package P5AST::op_eservent;    @ISA = 'P5AST::baseop';
-package P5AST::op_gpwnam;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_gpwuid;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_gpwent;      @ISA = 'P5AST::baseop';
-package P5AST::op_spwent;      @ISA = 'P5AST::baseop';
-package P5AST::op_epwent;      @ISA = 'P5AST::baseop';
-package P5AST::op_ggrnam;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_ggrgid;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_ggrent;      @ISA = 'P5AST::baseop';
-package P5AST::op_sgrent;      @ISA = 'P5AST::baseop';
-package P5AST::op_egrent;      @ISA = 'P5AST::baseop';
-package P5AST::op_getlogin;    @ISA = 'P5AST::baseop';
-package P5AST::op_syscall;     @ISA = 'P5AST::listop';
-package P5AST::op_lock;        @ISA = 'P5AST::baseop_unop';
-package P5AST::op_threadsv;    @ISA = 'P5AST::baseop';
-package P5AST::op_setstate;    @ISA = 'P5AST::cop';
-package P5AST::op_method_named; @ISA = 'P5AST::padop_svop';
-package P5AST::op_dor;                 @ISA = 'P5AST::logop';
-package P5AST::op_dorassign;   @ISA = 'P5AST::logop';
-package P5AST::op_custom;      @ISA = 'P5AST::baseop';
-
-# New node types (implicit types within perl)
-
-package P5AST::statement;      @ISA = 'P5AST::cop';
-package P5AST::peg;            @ISA = 'P5AST::baseop';
-package P5AST::parens;         @ISA = 'P5AST::baseop';
-package P5AST::bindop;         @ISA = 'P5AST::baseop';
-package P5AST::nothing;                @ISA = 'P5AST::baseop';
-package P5AST::condstate;      @ISA = 'P5AST::logop';
-package P5AST::use;            @ISA = 'P5AST::baseop';
-package P5AST::ternary;                @ISA = 'P5AST::baseop';
-package P5AST::sub;            @ISA = 'P5AST::baseop';
-package P5AST::condmod;                @ISA = 'P5AST::logop';
-package P5AST::package;                @ISA = 'P5AST::baseop';
-package P5AST::format;         @ISA = 'P5AST::baseop';
-package P5AST::qwliteral;      @ISA = 'P5AST::baseop';
-package P5AST::quote;          @ISA = 'P5AST::baseop';
-package P5AST::token;          @ISA = 'P5AST::baseop';
-package P5AST::attrlist;       @ISA = 'P5AST::baseop';
-package P5AST::listelem;       @ISA = 'P5AST::baseop';
-package P5AST::preplus;                @ISA = 'P5AST::baseop';
-package P5AST::doblock;                @ISA = 'P5AST::baseop';
-package P5AST::cfor;           @ISA = 'P5AST::baseop';
-package P5AST::pmop;           @ISA = 'P5AST::baseop';
diff --git a/mad/P5re.pm b/mad/P5re.pm
deleted file mode 100644 (file)
index 24037ec..0000000
+++ /dev/null
@@ -1,650 +0,0 @@
-#!/usr/bin/perl
-
-# Copyright (C) 2005, Larry Wall
-# This software may be copied under the same terms as Perl.
-
-package P5re;
-
-use strict;
-use warnings;
-
-our @EXPORT_OK = qw(re re2xml qr2xml);
-
-my $indent = 0;
-my $in = "";
-my $delim = 1;
-my $debug = 0;
-my $maxbrack;
-
-our $extended;
-our $insensitive;
-our $singleline;
-our $multiline;
-
-my %xmlish = (
-       chr(0x00) => "STUPIDXML(#x00)",
-       chr(0x01) => "STUPIDXML(#x01)",
-       chr(0x02) => "STUPIDXML(#x02)",
-       chr(0x03) => "STUPIDXML(#x03)",
-       chr(0x04) => "STUPIDXML(#x04)",
-       chr(0x05) => "STUPIDXML(#x05)",
-       chr(0x06) => "STUPIDXML(#x06)",
-       chr(0x07) => "STUPIDXML(#x07)",
-       chr(0x08) => "STUPIDXML(#x08)",
-       chr(0x09) => "&#9;",
-       chr(0x0a) => "&#10;",
-       chr(0x0b) => "STUPIDXML(#x0b)",
-       chr(0x0c) => "STUPIDXML(#x0c)",
-       chr(0x0d) => "&#13;",
-       chr(0x0e) => "STUPIDXML(#x0e)",
-       chr(0x0f) => "STUPIDXML(#x0f)",
-       chr(0x10) => "STUPIDXML(#x10)",
-       chr(0x11) => "STUPIDXML(#x11)",
-       chr(0x12) => "STUPIDXML(#x12)",
-       chr(0x13) => "STUPIDXML(#x13)",
-       chr(0x14) => "STUPIDXML(#x14)",
-       chr(0x15) => "STUPIDXML(#x15)",
-       chr(0x16) => "STUPIDXML(#x16)",
-       chr(0x17) => "STUPIDXML(#x17)",
-       chr(0x18) => "STUPIDXML(#x18)",
-       chr(0x19) => "STUPIDXML(#x19)",
-       chr(0x1a) => "STUPIDXML(#x1a)",
-       chr(0x1b) => "STUPIDXML(#x1b)",
-       chr(0x1c) => "STUPIDXML(#x1c)",
-       chr(0x1d) => "STUPIDXML(#x1d)",
-       chr(0x1e) => "STUPIDXML(#x1e)",
-       chr(0x1f) => "STUPIDXML(#x1f)",
-       chr(0x7f) => "STUPIDXML(#x7f)",
-       chr(0x80) => "STUPIDXML(#x80)",
-       chr(0x81) => "STUPIDXML(#x81)",
-       chr(0x82) => "STUPIDXML(#x82)",
-       chr(0x83) => "STUPIDXML(#x83)",
-       chr(0x84) => "STUPIDXML(#x84)",
-       chr(0x86) => "STUPIDXML(#x86)",
-       chr(0x87) => "STUPIDXML(#x87)",
-       chr(0x88) => "STUPIDXML(#x88)",
-       chr(0x89) => "STUPIDXML(#x89)",
-       chr(0x90) => "STUPIDXML(#x90)",
-       chr(0x91) => "STUPIDXML(#x91)",
-       chr(0x92) => "STUPIDXML(#x92)",
-       chr(0x93) => "STUPIDXML(#x93)",
-       chr(0x94) => "STUPIDXML(#x94)",
-       chr(0x95) => "STUPIDXML(#x95)",
-       chr(0x96) => "STUPIDXML(#x96)",
-       chr(0x97) => "STUPIDXML(#x97)",
-       chr(0x98) => "STUPIDXML(#x98)",
-       chr(0x99) => "STUPIDXML(#x99)",
-       chr(0x9a) => "STUPIDXML(#x9a)",
-       chr(0x9b) => "STUPIDXML(#x9b)",
-       chr(0x9c) => "STUPIDXML(#x9c)",
-       chr(0x9d) => "STUPIDXML(#x9d)",
-       chr(0x9e) => "STUPIDXML(#x9e)",
-       chr(0x9f) => "STUPIDXML(#x9f)",
-       '<'       => "&lt;",
-       '>'       => "&gt;",
-       '&'       => "&amp;",
-       '"'       => "&#34;",           # XML idiocy
-);
-
-sub xmlquote {
-    my $text = shift;
-    $text =~ s/(.)/$xmlish{$1} || $1/seg;
-    return $text;
-}
-
-sub text {
-    my $self = shift;
-    return xmlquote($self->{text});
-}
-
-sub rep {
-    my $self = shift;
-    return xmlquote($self->{rep});
-}
-
-sub xmlkids {
-    my $self = shift;
-    my $array = $self->{Kids};
-    my $ret = "";
-    $indent += 2;
-    $in = ' ' x $indent;
-    foreach my $chunk (@$array) {
-       if (ref $chunk eq "ARRAY") {
-           die;
-       }
-       elsif (ref $chunk) {
-           $ret .= $chunk->xml();
-       }
-       else {
-           warn $chunk;
-       }
-    }
-    $indent -= 2;
-    $in = ' ' x $indent;
-    return $ret;
-};
-
-package P5re::RE; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    my %flags = @_;
-    if ($flags{indent}) {
-       $indent = delete $flags{indent} || 0;
-       $in = ' ' x $indent;
-    }
-
-    my $kind = $self->{kind};
-
-    my $first = $self->{Kids}[0];
-    if ($first and ref $first eq 'P5re::Mod') {
-       for my $c (qw(i m s x)) {
-           next unless defined $first->{$c};
-           $self->{$c} = $first->{$c};
-           delete $first->{$c};
-       }
-    }
-
-    my $modifiers = "";
-    foreach my $k (sort keys %$self) {
-       next if $k eq 'kind' or $k eq "Kids";
-       my $v = $self->{$k};
-       $k =~ s/^[A-Z]//;
-       $modifiers .= " $k=\"$v\"";
-    }
-    my $text = "$in<$kind$modifiers>\n";
-    $text .= $self->xmlkids();
-    $text .= "$in</$kind>\n";
-    return $text;
-}
-
-package P5re::Alt; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    my $text = "$in<alt>\n";
-    $text .= $self->xmlkids();
-    $text .= "$in</alt>\n";
-    return $text;
-}
-
-#package P5re::Atom; our @ISA = 'P5re';
-#
-#sub xml {
-#    my $self = shift;
-#    my $text = "$in<atom>\n";
-#    $text .= $self->xmlkids();
-#    $text .= "$in</atom>\n";
-#    return $text;
-#}
-
-package P5re::Quant; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    my $q = $self->{rep};
-    my $min = $self->{min};
-    my $max = $self->{max};
-    my $greedy = $self->{greedy};
-    my $text = "$in<quant rep=\"$q\" min=\"$min\" max=\"$max\" greedy=\"$greedy\">\n";
-    $text .= $self->xmlkids();
-    $text .= "$in</quant>\n";
-    return $text;
-}
-
-package P5re::White; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    return "$in<white text=\"" . $self->text() . "\" />\n";
-}
-
-package P5re::Char; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    return "$in<char text=\"" . $self->text() . "\" />\n";
-}
-
-package P5re::Comment; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    return "$in<comment rep=\"" . $self->rep() . "\" />\n";
-}
-
-package P5re::Mod; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    my $modifiers = "";
-    foreach my $k (sort keys %$self) {
-       next if $k eq 'kind' or $k eq "Kids";
-       my $v = $self->{$k};
-       $k =~ s/^[A-Z]//;
-       $modifiers .= " $k=\"$v\"";
-    }
-    return "$in<mod$modifiers />\n";
-}
-
-package P5re::Meta; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    my $sem = "";
-    if ($self->{sem}) {
-       $sem = 'sem="' . $self->{sem} . '" '
-    }
-    return "$in<meta rep=\"" . $self->rep() . "\" $sem/>\n";
-}
-
-package P5re::Back; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    return "$in<backref to=\"" . P5re::xmlquote($self->{to}) . "\"/>\n";
-}
-
-package P5re::Var; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    return "$in<var name=\"" . $self->{name} . "\" />\n";
-}
-
-package P5re::Closure; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    return "$in<closure rep=\"" . P5re::xmlquote($self->{rep}) . "\" />\n";
-}
-
-package P5re::CClass; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    my $neg = $self->{neg} ? "negated" : "normal";
-    my $text = "$in<cclass match=\"$neg\">\n";
-    $text .= $self->xmlkids();
-    $text .= "$in</cclass>\n";
-    return $text;
-}
-
-package P5re::Range; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    my $text = "$in<range>\n";
-    $text .= $self->xmlkids();
-    $text .= "$in</range>\n";
-    return $text;
-}
-
-package P5re;
-
-unless (caller) {
-    while (<>) {
-       chomp;
-       print qr2xml($_);
-       print "#######################################\n";
-    }
-}
-
-sub qrparse {
-    my $qr = shift;
-    my $mod;
-    if ($qr =~ /^s/) {
-       $qr =~ s/^(?:\w*)(\W)((?:\\.|.)*?)\1(.*)\1(\w*)$/$2/;
-       $mod = $4;
-    }
-    else {
-       $qr =~ s/^(?:\w*)(\W)(.*)\1(\w*)$/$2/;
-       $mod = $3;
-    }
-    substr($qr,0,0) = "(?$mod)" if defined $mod and $mod ne "";
-    return parse($qr,@_);
-}
-
-sub qr2xml {
-    return qrparse(@_)->xml();
-}
-
-sub re2xml {
-    my $re = shift;
-    return parse($re,@_)->xml();
-}
-
-sub parse {
-    local($_) = shift;
-    my %flags = @_;
-    $maxbrack = 0;
-    $indent = delete $flags{indent} || 0;
-    $in = ' ' x $indent;
-    warn "$_\n" if $debug;
-    my $re = re('re');
-    @$re{keys %flags} = values %flags;
-    return $re;
-}
-
-sub re {
-    my $kind = shift;
-
-    my $oldextended = $extended;
-    my $oldinsensitive = $insensitive;
-    my $oldmultiline = $multiline;
-    my $oldsingleline = $singleline;
-
-    local $extended = $extended;
-    local $insensitive = $insensitive;
-    local $multiline = $multiline;
-    local $singleline = $singleline;
-
-    my $first = alt();
-
-    my $re;
-    if (not /^\|/) {
-       $first->{kind} = $kind;
-       $re = bless $first, "P5re::RE";  # rebless to remove single alt
-    }
-    else {
-       my @alts = ($first);
-
-       while (s/^\|//) {
-           push(@alts, alt());
-       }
-       $re = bless { Kids => [@alts], kind => $kind }, "P5re::RE";     
-    }
-
-    $re->{x} = $oldextended || 0;
-    $re->{i} = $oldinsensitive || 0;
-    $re->{m} = $oldmultiline || 0;
-    $re->{s} = $oldsingleline || 0;
-    return $re;
-}
-
-sub alt {
-    my @quants;
-
-    my $quant;
-    while ($quant = quant()) {
-       if (@quants and
-           ref $quant eq ref $quants[-1] and
-           exists $quants[-1]{text} and
-           exists $quant->{text} )
-       {
-           $quants[-1]{text} .= $quant->{text};
-       }
-       else {
-           push(@quants, $quant);
-       }
-    }
-    return bless { Kids => [@quants] }, "P5re::Alt";   
-}
-
-sub quant {
-    my $atom = atom();
-    return 0 unless $atom;
-#    $atom = bless { Kids => [$atom] }, "P5re::Atom";  
-    if (s/^(([*+?])(\??)|\{(\d+)(?:(,)(\d*))?\}(\??))//) {
-       my $min = 0;
-       my $max = "Inf";
-       my $greed = 1;
-       if ($2) {
-           if ($2 eq '+') {
-               $min = 1;
-           }
-           elsif ($2 eq '?') {
-               $max = 1;
-           }
-           $greed = 0 if $3;
-       }
-       elsif (defined $4) {
-           $min = $4;
-           if ($5) {
-               $max = $6 if $6;
-           }
-           else {
-               $max = $min;
-           }
-           $greed = 0 if $7;
-       }
-       $greed = "na" if $min == $max;
-       return bless { Kids => [$atom],
-                   rep => $1,
-                   min => $min,
-                   max => $max,
-                   greedy => $greed
-               }, "P5re::Quant";       
-    }
-    return $atom;
-}
-
-sub atom {
-    my $re;
-    if ($_ eq "") { return 0 }
-    if (/^[)|]/) { return 0 }
-
-    # whitespace is special because we don't know if /x is in effect
-    if ($extended) {
-       if (s/^(?=\s|#)(\s*(?:#.*)?)//) { return bless { text => $1 }, "P5re::White"; }
-    }
-
-    # all the parenthesized forms
-    if (s/^\(//) {
-       if (s/^\?://) {
-           $re = re('bracket');
-       }
-       elsif (s/^(\?#.*?)\)/)/) {
-           $re = bless { rep => "($1)" }, "P5re::Comment";     
-       }
-       elsif (s/^\?=//) {
-           $re = re('lookahead');
-       }
-       elsif (s/^\?!//) {
-           $re = re('neglookahead');
-       }
-       elsif (s/^\?<=//) {
-           $re = re('lookbehind');
-       }
-       elsif (s/^\?<!//) {
-           $re = re('neglookbehind');
-       }
-       elsif (s/^\?>//) {
-           $re = re('nobacktrack');
-       }
-       elsif (s/^(\?\??\{.*?\})\)/)/) {
-           $re = bless { rep => "($1)" }, "P5re::Closure";     
-       }
-       elsif (s/^(\?\(\d+\))//) {
-           my $mods = $1;
-           $re = re('conditional');
-           $re->{Arep} = "$mods";
-       }
-       elsif (s/^\?(?=\(\?)//) {
-           my $mods = $1;
-           my $cond = atom();
-           $re = re('conditional');
-           unshift(@{$re->{Kids}}, $cond);
-       }
-       elsif (s/^(\?[-\w]+)://) {
-           my $mods = $1;
-           local $extended = $extended;
-           local $insensitive = $insensitive;
-           local $multiline = $multiline;
-           local $singleline = $singleline;
-           setmods($mods);
-           $re = re('bracket');
-           $re->{Arep} = "($mods)";
-           $re->{x} = $extended || 0;
-           $re->{i} = $insensitive || 0;
-           $re->{m} = $multiline || 0;
-           $re->{s} = $singleline || 0;
-       }
-       elsif (s/^(\?[-\w]+)//) {
-           my $mods = $1;
-           $re = bless { Arep => "($mods)" }, "P5re::Mod";     
-           setmods($mods);
-           $re->{x} = $extended || 0;
-           $re->{i} = $insensitive || 0;
-           $re->{m} = $multiline || 0;
-           $re->{s} = $singleline || 0;
-       }
-       elsif (s/^\?//) {
-           $re = re('UNRECOGNIZED');
-       }
-       else {
-           my $brack = ++$maxbrack;
-           $re = re('capture');
-           $re->{Ato} = $brack;
-       }
-
-       if (not s/^\)//) { warn "Expected right paren at: '$_'" }
-       return $re;
-    }
-
-    # special meta
-    if (s/^\.//) {
-       my $s = $singleline ? '.' : '\N';
-       return bless { rep => '.', sem => $s }, "P5re::Meta";
-    }
-    if (s/^\^//) {
-       my $s = $multiline ? '^^' : '^';
-       return bless { rep => '^', sem => $s }, "P5re::Meta";
-    }
-    if (s/^\$(?:$|(?=[|)]))//) {
-       my $s = $multiline ? '$$' : '$';
-       return bless { rep => '$', sem => $s }, "P5re::Meta";
-    }
-    if (s/^([\$\@](\w+|.))//) {                # XXX need to handle subscripts here
-       return bless { name => $1 }, "P5re::Var";
-    }
-
-    # character classes
-    if (s/^\[//) {
-       my $re = cclass();
-       if (not s/^\]//) { warn "Expected right bracket at: '$_'" }
-       return $re;
-    }
-
-    # backwhacks
-    if (/^\\([1-9]\d*)/ and $1 <= $maxbrack) {
-       my $to = $1;
-       onechar();
-       return bless { to => $to }, "P5re::Back";
-    }
-
-    # backwhacks
-    if (/^\\(?=\w)/) {
-       return bless { rep => onechar() }, "P5re::Meta";
-    }
-
-    # backwhacks
-    if (s/^\\(.)//) {
-       return bless { text => $1 }, "P5re::Char";
-    }
-
-    # optimization, would happen anyway
-    if (s/^(\w+)//) { return bless { text => $1 }, "P5re::Char"; }
-
-    # random character
-    if (s/^(.)//) { return bless { text => $1 }, "P5re::Char"; }
-}
-
-sub cclass {
-    my @cclass;
-    my $cclass = "";
-    my $neg = 0;
-    if (s/^\^//) { $neg = 1 }
-    if (s/^([\]\-])//) { $cclass .= $1 }
-
-    while ($_ ne "" and not /^\]/) {
-       # backwhacks
-       if (/^\\(?=.)|.-/) {
-           my $o1 = onecharobj();
-           if ($cclass ne "") {
-               push @cclass, bless { text => $cclass }, "P5re::Char";
-               $cclass = "";
-           }
-
-           if (s/^-(?=[^]])//) {
-               my $o2 = onecharobj();
-               push @cclass, bless { Kids => [$o1, $o2] }, "P5re::Range";
-           }
-           else {
-               push @cclass, $o1;
-           }
-       }
-       elsif (s/^(\[([:=.])\^?\w*\2\])//) {
-           if ($cclass ne "") {
-               push @cclass, bless { text => $cclass }, "P5re::Char";
-               $cclass = "";
-           }
-           push @cclass, bless { rep => $1 }, "P5re::Meta";
-       }
-       else {
-           $cclass .= onechar();
-       }
-    }
-
-    if ($cclass ne "") {
-       push @cclass, bless { text => $cclass }, "P5re::Char";
-    }
-    return bless { Kids => [@cclass], neg => $neg }, "P5re::CClass";
-}
-
-sub onecharobj {
-    my $ch = onechar();
-    if ($ch =~ /^\\/) {
-       $ch = bless { rep => $ch }, "P5re::Meta";
-    }
-    else {
-       $ch = bless { text => $ch }, "P5re::Char";
-    }
-}
-
-sub onechar {
-    die "Oops, short cclass" unless s/^(.)//;
-    my $ch = $1;
-    if ($ch eq '\\') {
-       if (s/^([rntf]|[0-7]{1,4})//) { $ch .= $1 }
-       elsif (s/^(x[0-9a-fA-f]{1,2})//) { $ch .= $1 }
-       elsif (s/^(x\{[0-9a-fA-f]+\})//) { $ch .= $1 }
-       elsif (s/^([NpP]\{.*?\})//) { $ch .= $1 }
-       elsif (s/^([cpP].)//) { $ch .= $1 }
-       elsif (s/^(.)//) { $ch .= $1 }
-       else {
-           die "Oops, short backwhack";
-       }
-    }
-    return $ch;
-}
-
-sub setmods {
-    my $mods = shift;
-    if ($mods =~ /\-.*x/) {
-       $extended = 0;
-    }
-    elsif ($mods =~ /x/) {
-       $extended = 1;
-    }
-    if ($mods =~ /\-.*i/) {
-       $insensitive = 0;
-    }
-    elsif ($mods =~ /i/) {
-       $insensitive = 1;
-    }
-    if ($mods =~ /\-.*m/) {
-       $multiline = 0;
-    }
-    elsif ($mods =~ /m/) {
-       $multiline = 1;
-    }
-    if ($mods =~ /\-.*s/) {
-       $singleline = 0;
-    }
-    elsif ($mods =~ /s/) {
-       $singleline = 1;
-    }
-}
-
-1;
diff --git a/mad/PLXML.pm b/mad/PLXML.pm
deleted file mode 100644 (file)
index ad77860..0000000
+++ /dev/null
@@ -1,4162 +0,0 @@
-use strict;
-use warnings;
-
-package PLXML;
-
-sub DESTROY { }
-
-sub walk {
-    print "walk(" . join(',', @_) . ")\n";
-    my $self = shift;
-    for my $key (sort keys %$self) {
-       print "\t$key = <$$self{$key}>\n";
-    }
-    foreach my $kid (@{$$self{Kids}}) {
-       $kid->walk(@_);
-    }
-}
-
-package PLXML::Characters;
-
-our @ISA = ('PLXML');
-sub walk {}
-
-package PLXML::madprops;
-
-our @ISA = ('PLXML');
-
-package PLXML::mad_op;
-
-our @ISA = ('PLXML');
-
-package PLXML::mad_pv;
-
-our @ISA = ('PLXML');
-
-package PLXML::baseop;
-
-our @ISA = ('PLXML');
-
-package PLXML::baseop_unop;
-
-our @ISA = ('PLXML');
-
-package PLXML::binop;
-
-our @ISA = ('PLXML');
-
-package PLXML::cop;
-
-our @ISA = ('PLXML');
-
-package PLXML::filestatop;
-
-our @ISA = ('PLXML::baseop_unop');
-
-package PLXML::listop;
-
-our @ISA = ('PLXML');
-
-package PLXML::logop;
-
-our @ISA = ('PLXML');
-
-package PLXML::loop;
-
-our @ISA = ('PLXML');
-
-package PLXML::loopexop;
-
-our @ISA = ('PLXML');
-
-package PLXML::padop;
-
-our @ISA = ('PLXML');
-
-package PLXML::padop_svop;
-
-our @ISA = ('PLXML');
-
-package PLXML::pmop;
-
-our @ISA = ('PLXML');
-
-package PLXML::pvop_svop;
-
-our @ISA = ('PLXML');
-
-package PLXML::unop;
-
-our @ISA = ('PLXML');
-
-
-# New ops always go at the end, just before 'custom'
-
-# A recapitulation of the format of this file:
-# The file consists of five columns: the name of the op, an English
-# description, the name of the "check" routine used to optimize this
-# operation, some flags, and a description of the operands.
-
-# The flags consist of options followed by a mandatory op class signifier
-
-# The classes are:
-# baseop      - 0            unop     - 1            binop      - 2
-# logop       - |            listop   - @            pmop       - /
-# padop/svop  - $            padop    - # (unused)   loop       - {
-# baseop/unop - %            loopexop - }            filestatop - -
-# pvop/svop   - "            cop      - ;
-
-# Other options are:
-#   needs stack mark                    - m
-#   needs constant folding              - f
-#   produces a scalar                   - s
-#   produces an integer                 - i
-#   needs a target                      - t
-#   target can be in a pad              - T
-#   has a corresponding integer version - I
-#   has side effects                    - d
-#   uses $_ if no argument given        - u
-
-# Values for the operands are:
-# scalar      - S            list     - L            array     - A
-# hash        - H            sub (CV) - C            file      - F
-# socket      - Fs           filetest - F-           reference - R
-# "?" denotes an optional operand.
-
-# Nothing.
-
-package PLXML::op_null;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'null' }
-sub desc { 'null operation' }
-sub check { 'ck_null' }
-sub flags { '0' }
-sub args { '' }
-
-
-package PLXML::op_stub;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'stub' }
-sub desc { 'stub' }
-sub check { 'ck_null' }
-sub flags { '0' }
-sub args { '' }
-
-
-package PLXML::op_scalar;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'scalar' }
-sub desc { 'scalar' }
-sub check { 'ck_fun' }
-sub flags { 's%' }
-sub args { 'S' }
-
-
-
-# Pushy stuff.
-
-package PLXML::op_pushmark;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'pushmark' }
-sub desc { 'pushmark' }
-sub check { 'ck_null' }
-sub flags { 's0' }
-sub args { '' }
-
-
-package PLXML::op_wantarray;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'wantarray' }
-sub desc { 'wantarray' }
-sub check { 'ck_null' }
-sub flags { 'is0' }
-sub args { '' }
-
-
-
-package PLXML::op_const;
-
-our @ISA = ('PLXML::padop_svop');
-
-sub key { 'const' }
-sub desc { 'constant item' }
-sub check { 'ck_svconst' }
-sub flags { 's$' }
-sub args { '' }
-
-
-
-package PLXML::op_gvsv;
-
-our @ISA = ('PLXML::padop_svop');
-
-sub key { 'gvsv' }
-sub desc { 'scalar variable' }
-sub check { 'ck_null' }
-sub flags { 'ds$' }
-sub args { '' }
-
-
-package PLXML::op_gv;
-
-our @ISA = ('PLXML::padop_svop');
-
-sub key { 'gv' }
-sub desc { 'glob value' }
-sub check { 'ck_null' }
-sub flags { 'ds$' }
-sub args { '' }
-
-
-package PLXML::op_gelem;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'gelem' }
-sub desc { 'glob elem' }
-sub check { 'ck_null' }
-sub flags { 'd2' }
-sub args { 'S S' }
-
-
-package PLXML::op_padsv;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'padsv' }
-sub desc { 'private variable' }
-sub check { 'ck_null' }
-sub flags { 'ds0' }
-sub args { '' }
-
-
-package PLXML::op_padav;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'padav' }
-sub desc { 'private array' }
-sub check { 'ck_null' }
-sub flags { 'd0' }
-sub args { '' }
-
-
-package PLXML::op_padhv;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'padhv' }
-sub desc { 'private hash' }
-sub check { 'ck_null' }
-sub flags { 'd0' }
-sub args { '' }
-
-
-package PLXML::op_padany;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'padany' }
-sub desc { 'private value' }
-sub check { 'ck_null' }
-sub flags { 'd0' }
-sub args { '' }
-
-
-
-package PLXML::op_pushre;
-
-our @ISA = ('PLXML::pmop');
-
-sub key { 'pushre' }
-sub desc { 'push regexp' }
-sub check { 'ck_null' }
-sub flags { 'd/' }
-sub args { '' }
-
-
-
-# References and stuff.
-
-package PLXML::op_rv2gv;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'rv2gv' }
-sub desc { 'ref-to-glob cast' }
-sub check { 'ck_rvconst' }
-sub flags { 'ds1' }
-sub args { '' }
-
-
-package PLXML::op_rv2sv;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'rv2sv' }
-sub desc { 'scalar dereference' }
-sub check { 'ck_rvconst' }
-sub flags { 'ds1' }
-sub args { '' }
-
-
-package PLXML::op_av2arylen;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'av2arylen' }
-sub desc { 'array length' }
-sub check { 'ck_null' }
-sub flags { 'is1' }
-sub args { '' }
-
-
-package PLXML::op_rv2cv;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'rv2cv' }
-sub desc { 'subroutine dereference' }
-sub check { 'ck_rvconst' }
-sub flags { 'd1' }
-sub args { '' }
-
-
-package PLXML::op_anoncode;
-
-our @ISA = ('PLXML::padop_svop');
-
-sub key { 'anoncode' }
-sub desc { 'anonymous subroutine' }
-sub check { 'ck_anoncode' }
-sub flags { '$' }
-sub args { '' }
-
-
-package PLXML::op_prototype;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'prototype' }
-sub desc { 'subroutine prototype' }
-sub check { 'ck_null' }
-sub flags { 's%' }
-sub args { 'S' }
-
-
-package PLXML::op_refgen;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'refgen' }
-sub desc { 'reference constructor' }
-sub check { 'ck_spair' }
-sub flags { 'm1' }
-sub args { 'L' }
-
-
-package PLXML::op_srefgen;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'srefgen' }
-sub desc { 'single ref constructor' }
-sub check { 'ck_null' }
-sub flags { 'fs1' }
-sub args { 'S' }
-
-
-package PLXML::op_ref;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'ref' }
-sub desc { 'reference-type operator' }
-sub check { 'ck_fun' }
-sub flags { 'stu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_bless;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'bless' }
-sub desc { 'bless' }
-sub check { 'ck_fun' }
-sub flags { 's@' }
-sub args { 'S S?' }
-
-
-
-# Pushy I/O.
-
-package PLXML::op_backtick;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'backtick' }
-sub desc { 'quoted execution (``, qx)' }
-sub check { 'ck_open' }
-sub flags { 't%' }
-sub args { '' }
-
-
-# glob defaults its first arg to $_
-package PLXML::op_glob;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'glob' }
-sub desc { 'glob' }
-sub check { 'ck_glob' }
-sub flags { 't@' }
-sub args { 'S?' }
-
-
-package PLXML::op_readline;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'readline' }
-sub desc { '<HANDLE>' }
-sub check { 'ck_null' }
-sub flags { 't%' }
-sub args { 'F?' }
-
-
-package PLXML::op_rcatline;
-
-our @ISA = ('PLXML::padop_svop');
-
-sub key { 'rcatline' }
-sub desc { 'append I/O operator' }
-sub check { 'ck_null' }
-sub flags { 't$' }
-sub args { '' }
-
-
-
-# Bindable operators.
-
-package PLXML::op_regcmaybe;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'regcmaybe' }
-sub desc { 'regexp internal guard' }
-sub check { 'ck_fun' }
-sub flags { 's1' }
-sub args { 'S' }
-
-
-package PLXML::op_regcreset;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'regcreset' }
-sub desc { 'regexp internal reset' }
-sub check { 'ck_fun' }
-sub flags { 's1' }
-sub args { 'S' }
-
-
-package PLXML::op_regcomp;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'regcomp' }
-sub desc { 'regexp compilation' }
-sub check { 'ck_null' }
-sub flags { 's|' }
-sub args { 'S' }
-
-
-package PLXML::op_match;
-
-our @ISA = ('PLXML::pmop');
-
-sub key { 'match' }
-sub desc { 'pattern match (m//)' }
-sub check { 'ck_match' }
-sub flags { 'd/' }
-sub args { '' }
-
-
-package PLXML::op_qr;
-
-our @ISA = ('PLXML::pmop');
-
-sub key { 'qr' }
-sub desc { 'pattern quote (qr//)' }
-sub check { 'ck_match' }
-sub flags { 's/' }
-sub args { '' }
-
-
-package PLXML::op_subst;
-
-our @ISA = ('PLXML::pmop');
-
-sub key { 'subst' }
-sub desc { 'substitution (s///)' }
-sub check { 'ck_match' }
-sub flags { 'dis/' }
-sub args { 'S' }
-
-
-package PLXML::op_substcont;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'substcont' }
-sub desc { 'substitution iterator' }
-sub check { 'ck_null' }
-sub flags { 'dis|' }
-sub args { '' }
-
-
-package PLXML::op_trans;
-
-our @ISA = ('PLXML::pvop_svop');
-
-sub key { 'trans' }
-sub desc { 'transliteration (tr///)' }
-sub check { 'ck_match' }
-sub flags { 'is"' }
-sub args { 'S' }
-
-
-
-# Lvalue operators.
-# sassign is special-cased for op class
-
-package PLXML::op_sassign;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'sassign' }
-sub desc { 'scalar assignment' }
-sub check { 'ck_sassign' }
-sub flags { 's0' }
-sub args { '' }
-
-
-package PLXML::op_aassign;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'aassign' }
-sub desc { 'list assignment' }
-sub check { 'ck_null' }
-sub flags { 't2' }
-sub args { 'L L' }
-
-
-
-package PLXML::op_chop;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'chop' }
-sub desc { 'chop' }
-sub check { 'ck_spair' }
-sub flags { 'mts%' }
-sub args { 'L' }
-
-
-package PLXML::op_schop;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'schop' }
-sub desc { 'scalar chop' }
-sub check { 'ck_null' }
-sub flags { 'stu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_chomp;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'chomp' }
-sub desc { 'chomp' }
-sub check { 'ck_spair' }
-sub flags { 'mTs%' }
-sub args { 'L' }
-
-
-package PLXML::op_schomp;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'schomp' }
-sub desc { 'scalar chomp' }
-sub check { 'ck_null' }
-sub flags { 'sTu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_defined;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'defined' }
-sub desc { 'defined operator' }
-sub check { 'ck_defined' }
-sub flags { 'isu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_undef;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'undef' }
-sub desc { 'undef operator' }
-sub check { 'ck_lfun' }
-sub flags { 's%' }
-sub args { 'S?' }
-
-
-package PLXML::op_study;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'study' }
-sub desc { 'study' }
-sub check { 'ck_fun' }
-sub flags { 'su%' }
-sub args { 'S?' }
-
-
-package PLXML::op_pos;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'pos' }
-sub desc { 'match position' }
-sub check { 'ck_lfun' }
-sub flags { 'stu%' }
-sub args { 'S?' }
-
-
-
-package PLXML::op_preinc;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'preinc' }
-sub desc { 'preincrement (++)' }
-sub check { 'ck_lfun' }
-sub flags { 'dIs1' }
-sub args { 'S' }
-
-
-package PLXML::op_i_preinc;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'i_preinc' }
-sub desc { 'integer preincrement (++)' }
-sub check { 'ck_lfun' }
-sub flags { 'dis1' }
-sub args { 'S' }
-
-
-package PLXML::op_predec;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'predec' }
-sub desc { 'predecrement (--)' }
-sub check { 'ck_lfun' }
-sub flags { 'dIs1' }
-sub args { 'S' }
-
-
-package PLXML::op_i_predec;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'i_predec' }
-sub desc { 'integer predecrement (--)' }
-sub check { 'ck_lfun' }
-sub flags { 'dis1' }
-sub args { 'S' }
-
-
-package PLXML::op_postinc;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'postinc' }
-sub desc { 'postincrement (++)' }
-sub check { 'ck_lfun' }
-sub flags { 'dIst1' }
-sub args { 'S' }
-
-
-package PLXML::op_i_postinc;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'i_postinc' }
-sub desc { 'integer postincrement (++)' }
-sub check { 'ck_lfun' }
-sub flags { 'disT1' }
-sub args { 'S' }
-
-
-package PLXML::op_postdec;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'postdec' }
-sub desc { 'postdecrement (--)' }
-sub check { 'ck_lfun' }
-sub flags { 'dIst1' }
-sub args { 'S' }
-
-
-package PLXML::op_i_postdec;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'i_postdec' }
-sub desc { 'integer postdecrement (--)' }
-sub check { 'ck_lfun' }
-sub flags { 'disT1' }
-sub args { 'S' }
-
-
-
-# Ordinary operators.
-
-package PLXML::op_pow;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'pow' }
-sub desc { 'exponentiation (**)' }
-sub check { 'ck_null' }
-sub flags { 'fsT2' }
-sub args { 'S S' }
-
-
-
-package PLXML::op_multiply;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'multiply' }
-sub desc { 'multiplication (*)' }
-sub check { 'ck_null' }
-sub flags { 'IfsT2' }
-sub args { 'S S' }
-
-
-package PLXML::op_i_multiply;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'i_multiply' }
-sub desc { 'integer multiplication (*)' }
-sub check { 'ck_null' }
-sub flags { 'ifsT2' }
-sub args { 'S S' }
-
-
-package PLXML::op_divide;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'divide' }
-sub desc { 'division (/)' }
-sub check { 'ck_null' }
-sub flags { 'IfsT2' }
-sub args { 'S S' }
-
-
-package PLXML::op_i_divide;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'i_divide' }
-sub desc { 'integer division (/)' }
-sub check { 'ck_null' }
-sub flags { 'ifsT2' }
-sub args { 'S S' }
-
-
-package PLXML::op_modulo;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'modulo' }
-sub desc { 'modulus (%)' }
-sub check { 'ck_null' }
-sub flags { 'IifsT2' }
-sub args { 'S S' }
-
-
-package PLXML::op_i_modulo;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'i_modulo' }
-sub desc { 'integer modulus (%)' }
-sub check { 'ck_null' }
-sub flags { 'ifsT2' }
-sub args { 'S S' }
-
-
-package PLXML::op_repeat;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'repeat' }
-sub desc { 'repeat (x)' }
-sub check { 'ck_repeat' }
-sub flags { 'mt2' }
-sub args { 'L S' }
-
-
-
-package PLXML::op_add;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'add' }
-sub desc { 'addition (+)' }
-sub check { 'ck_null' }
-sub flags { 'IfsT2' }
-sub args { 'S S' }
-
-
-package PLXML::op_i_add;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'i_add' }
-sub desc { 'integer addition (+)' }
-sub check { 'ck_null' }
-sub flags { 'ifsT2' }
-sub args { 'S S' }
-
-
-package PLXML::op_subtract;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'subtract' }
-sub desc { 'subtraction (-)' }
-sub check { 'ck_null' }
-sub flags { 'IfsT2' }
-sub args { 'S S' }
-
-
-package PLXML::op_i_subtract;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'i_subtract' }
-sub desc { 'integer subtraction (-)' }
-sub check { 'ck_null' }
-sub flags { 'ifsT2' }
-sub args { 'S S' }
-
-
-package PLXML::op_concat;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'concat' }
-sub desc { 'concatenation (.) or string' }
-sub check { 'ck_concat' }
-sub flags { 'fsT2' }
-sub args { 'S S' }
-
-
-package PLXML::op_stringify;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'stringify' }
-sub desc { 'string' }
-sub check { 'ck_fun' }
-sub flags { 'fsT@' }
-sub args { 'S' }
-
-
-
-package PLXML::op_left_shift;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'left_shift' }
-sub desc { 'left bitshift (<<)' }
-sub check { 'ck_bitop' }
-sub flags { 'fsT2' }
-sub args { 'S S' }
-
-
-package PLXML::op_right_shift;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'right_shift' }
-sub desc { 'right bitshift (>>)' }
-sub check { 'ck_bitop' }
-sub flags { 'fsT2' }
-sub args { 'S S' }
-
-
-
-package PLXML::op_lt;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'lt' }
-sub desc { 'numeric lt (<)' }
-sub check { 'ck_null' }
-sub flags { 'Iifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_i_lt;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'i_lt' }
-sub desc { 'integer lt (<)' }
-sub check { 'ck_null' }
-sub flags { 'ifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_gt;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'gt' }
-sub desc { 'numeric gt (>)' }
-sub check { 'ck_null' }
-sub flags { 'Iifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_i_gt;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'i_gt' }
-sub desc { 'integer gt (>)' }
-sub check { 'ck_null' }
-sub flags { 'ifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_le;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'le' }
-sub desc { 'numeric le (<=)' }
-sub check { 'ck_null' }
-sub flags { 'Iifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_i_le;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'i_le' }
-sub desc { 'integer le (<=)' }
-sub check { 'ck_null' }
-sub flags { 'ifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_ge;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'ge' }
-sub desc { 'numeric ge (>=)' }
-sub check { 'ck_null' }
-sub flags { 'Iifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_i_ge;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'i_ge' }
-sub desc { 'integer ge (>=)' }
-sub check { 'ck_null' }
-sub flags { 'ifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_eq;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'eq' }
-sub desc { 'numeric eq (==)' }
-sub check { 'ck_null' }
-sub flags { 'Iifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_i_eq;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'i_eq' }
-sub desc { 'integer eq (==)' }
-sub check { 'ck_null' }
-sub flags { 'ifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_ne;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'ne' }
-sub desc { 'numeric ne (!=)' }
-sub check { 'ck_null' }
-sub flags { 'Iifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_i_ne;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'i_ne' }
-sub desc { 'integer ne (!=)' }
-sub check { 'ck_null' }
-sub flags { 'ifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_ncmp;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'ncmp' }
-sub desc { 'numeric comparison (<=>)' }
-sub check { 'ck_null' }
-sub flags { 'Iifst2' }
-sub args { 'S S' }
-
-
-package PLXML::op_i_ncmp;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'i_ncmp' }
-sub desc { 'integer comparison (<=>)' }
-sub check { 'ck_null' }
-sub flags { 'ifst2' }
-sub args { 'S S' }
-
-
-
-package PLXML::op_slt;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'slt' }
-sub desc { 'string lt' }
-sub check { 'ck_null' }
-sub flags { 'ifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_sgt;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'sgt' }
-sub desc { 'string gt' }
-sub check { 'ck_null' }
-sub flags { 'ifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_sle;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'sle' }
-sub desc { 'string le' }
-sub check { 'ck_null' }
-sub flags { 'ifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_sge;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'sge' }
-sub desc { 'string ge' }
-sub check { 'ck_null' }
-sub flags { 'ifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_seq;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'seq' }
-sub desc { 'string eq' }
-sub check { 'ck_null' }
-sub flags { 'ifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_sne;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'sne' }
-sub desc { 'string ne' }
-sub check { 'ck_null' }
-sub flags { 'ifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_scmp;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'scmp' }
-sub desc { 'string comparison (cmp)' }
-sub check { 'ck_null' }
-sub flags { 'ifst2' }
-sub args { 'S S' }
-
-
-
-package PLXML::op_bit_and;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'bit_and' }
-sub desc { 'bitwise and (&)' }
-sub check { 'ck_bitop' }
-sub flags { 'fst2' }
-sub args { 'S S' }
-
-
-package PLXML::op_bit_xor;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'bit_xor' }
-sub desc { 'bitwise xor (^)' }
-sub check { 'ck_bitop' }
-sub flags { 'fst2' }
-sub args { 'S S' }
-
-
-package PLXML::op_bit_or;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'bit_or' }
-sub desc { 'bitwise or (|)' }
-sub check { 'ck_bitop' }
-sub flags { 'fst2' }
-sub args { 'S S' }
-
-
-
-package PLXML::op_negate;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'negate' }
-sub desc { 'negation (-)' }
-sub check { 'ck_null' }
-sub flags { 'Ifst1' }
-sub args { 'S' }
-
-
-package PLXML::op_i_negate;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'i_negate' }
-sub desc { 'integer negation (-)' }
-sub check { 'ck_null' }
-sub flags { 'ifsT1' }
-sub args { 'S' }
-
-
-package PLXML::op_not;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'not' }
-sub desc { 'not' }
-sub check { 'ck_null' }
-sub flags { 'ifs1' }
-sub args { 'S' }
-
-
-package PLXML::op_complement;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'complement' }
-sub desc { '1\'s complement (~)' }
-sub check { 'ck_bitop' }
-sub flags { 'fst1' }
-sub args { 'S' }
-
-
-
-# High falutin' math.
-
-package PLXML::op_atan2;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'atan2' }
-sub desc { 'atan2' }
-sub check { 'ck_fun' }
-sub flags { 'fsT@' }
-sub args { 'S S' }
-
-
-package PLXML::op_sin;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'sin' }
-sub desc { 'sin' }
-sub check { 'ck_fun' }
-sub flags { 'fsTu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_cos;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'cos' }
-sub desc { 'cos' }
-sub check { 'ck_fun' }
-sub flags { 'fsTu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_rand;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'rand' }
-sub desc { 'rand' }
-sub check { 'ck_fun' }
-sub flags { 'sT%' }
-sub args { 'S?' }
-
-
-package PLXML::op_srand;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'srand' }
-sub desc { 'srand' }
-sub check { 'ck_fun' }
-sub flags { 's%' }
-sub args { 'S?' }
-
-
-package PLXML::op_exp;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'exp' }
-sub desc { 'exp' }
-sub check { 'ck_fun' }
-sub flags { 'fsTu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_log;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'log' }
-sub desc { 'log' }
-sub check { 'ck_fun' }
-sub flags { 'fsTu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_sqrt;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'sqrt' }
-sub desc { 'sqrt' }
-sub check { 'ck_fun' }
-sub flags { 'fsTu%' }
-sub args { 'S?' }
-
-
-
-# Lowbrow math.
-
-package PLXML::op_int;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'int' }
-sub desc { 'int' }
-sub check { 'ck_fun' }
-sub flags { 'fsTu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_hex;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'hex' }
-sub desc { 'hex' }
-sub check { 'ck_fun' }
-sub flags { 'fsTu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_oct;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'oct' }
-sub desc { 'oct' }
-sub check { 'ck_fun' }
-sub flags { 'fsTu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_abs;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'abs' }
-sub desc { 'abs' }
-sub check { 'ck_fun' }
-sub flags { 'fsTu%' }
-sub args { 'S?' }
-
-
-
-# String stuff.
-
-package PLXML::op_length;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'length' }
-sub desc { 'length' }
-sub check { 'ck_lengthconst' }
-sub flags { 'isTu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_substr;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'substr' }
-sub desc { 'substr' }
-sub check { 'ck_substr' }
-sub flags { 'st@' }
-sub args { 'S S S? S?' }
-
-
-package PLXML::op_vec;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'vec' }
-sub desc { 'vec' }
-sub check { 'ck_fun' }
-sub flags { 'ist@' }
-sub args { 'S S S' }
-
-
-
-package PLXML::op_index;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'index' }
-sub desc { 'index' }
-sub check { 'ck_index' }
-sub flags { 'isT@' }
-sub args { 'S S S?' }
-
-
-package PLXML::op_rindex;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'rindex' }
-sub desc { 'rindex' }
-sub check { 'ck_index' }
-sub flags { 'isT@' }
-sub args { 'S S S?' }
-
-
-
-package PLXML::op_sprintf;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'sprintf' }
-sub desc { 'sprintf' }
-sub check { 'ck_fun' }
-sub flags { 'mfst@' }
-sub args { 'S L' }
-
-
-package PLXML::op_formline;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'formline' }
-sub desc { 'formline' }
-sub check { 'ck_fun' }
-sub flags { 'ms@' }
-sub args { 'S L' }
-
-
-package PLXML::op_ord;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'ord' }
-sub desc { 'ord' }
-sub check { 'ck_fun' }
-sub flags { 'ifsTu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_chr;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'chr' }
-sub desc { 'chr' }
-sub check { 'ck_fun' }
-sub flags { 'fsTu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_crypt;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'crypt' }
-sub desc { 'crypt' }
-sub check { 'ck_fun' }
-sub flags { 'fsT@' }
-sub args { 'S S' }
-
-
-package PLXML::op_ucfirst;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'ucfirst' }
-sub desc { 'ucfirst' }
-sub check { 'ck_fun' }
-sub flags { 'fstu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_lcfirst;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'lcfirst' }
-sub desc { 'lcfirst' }
-sub check { 'ck_fun' }
-sub flags { 'fstu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_uc;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'uc' }
-sub desc { 'uc' }
-sub check { 'ck_fun' }
-sub flags { 'fstu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_lc;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'lc' }
-sub desc { 'lc' }
-sub check { 'ck_fun' }
-sub flags { 'fstu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_quotemeta;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'quotemeta' }
-sub desc { 'quotemeta' }
-sub check { 'ck_fun' }
-sub flags { 'fstu%' }
-sub args { 'S?' }
-
-
-
-# Arrays.
-
-package PLXML::op_rv2av;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'rv2av' }
-sub desc { 'array dereference' }
-sub check { 'ck_rvconst' }
-sub flags { 'dt1' }
-sub args { '' }
-
-
-package PLXML::op_aelemfast;
-
-our @ISA = ('PLXML::padop_svop');
-
-sub key { 'aelemfast' }
-sub desc { 'constant array element' }
-sub check { 'ck_null' }
-sub flags { 's$' }
-sub args { 'A S' }
-
-
-package PLXML::op_aelem;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'aelem' }
-sub desc { 'array element' }
-sub check { 'ck_null' }
-sub flags { 's2' }
-sub args { 'A S' }
-
-
-package PLXML::op_aslice;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'aslice' }
-sub desc { 'array slice' }
-sub check { 'ck_null' }
-sub flags { 'm@' }
-sub args { 'A L' }
-
-
-
-# Hashes.
-
-package PLXML::op_each;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'each' }
-sub desc { 'each' }
-sub check { 'ck_fun' }
-sub flags { '%' }
-sub args { 'H' }
-
-
-package PLXML::op_values;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'values' }
-sub desc { 'values' }
-sub check { 'ck_fun' }
-sub flags { 't%' }
-sub args { 'H' }
-
-
-package PLXML::op_keys;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'keys' }
-sub desc { 'keys' }
-sub check { 'ck_fun' }
-sub flags { 't%' }
-sub args { 'H' }
-
-
-package PLXML::op_delete;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'delete' }
-sub desc { 'delete' }
-sub check { 'ck_delete' }
-sub flags { '%' }
-sub args { 'S' }
-
-
-package PLXML::op_exists;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'exists' }
-sub desc { 'exists' }
-sub check { 'ck_exists' }
-sub flags { 'is%' }
-sub args { 'S' }
-
-
-package PLXML::op_rv2hv;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'rv2hv' }
-sub desc { 'hash dereference' }
-sub check { 'ck_rvconst' }
-sub flags { 'dt1' }
-sub args { '' }
-
-
-package PLXML::op_helem;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'helem' }
-sub desc { 'hash element' }
-sub check { 'ck_null' }
-sub flags { 's2@' }
-sub args { 'H S' }
-
-
-package PLXML::op_hslice;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'hslice' }
-sub desc { 'hash slice' }
-sub check { 'ck_null' }
-sub flags { 'm@' }
-sub args { 'H L' }
-
-
-
-# Explosives and implosives.
-
-package PLXML::op_unpack;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'unpack' }
-sub desc { 'unpack' }
-sub check { 'ck_unpack' }
-sub flags { '@' }
-sub args { 'S S?' }
-
-
-package PLXML::op_pack;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'pack' }
-sub desc { 'pack' }
-sub check { 'ck_fun' }
-sub flags { 'mst@' }
-sub args { 'S L' }
-
-
-package PLXML::op_split;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'split' }
-sub desc { 'split' }
-sub check { 'ck_split' }
-sub flags { 't@' }
-sub args { 'S S S' }
-
-
-package PLXML::op_join;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'join' }
-sub desc { 'join or string' }
-sub check { 'ck_join' }
-sub flags { 'mst@' }
-sub args { 'S L' }
-
-
-
-# List operators.
-
-package PLXML::op_list;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'list' }
-sub desc { 'list' }
-sub check { 'ck_null' }
-sub flags { 'm@' }
-sub args { 'L' }
-
-
-package PLXML::op_lslice;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'lslice' }
-sub desc { 'list slice' }
-sub check { 'ck_null' }
-sub flags { '2' }
-sub args { 'H L L' }
-
-
-package PLXML::op_anonlist;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'anonlist' }
-sub desc { 'anonymous list ([])' }
-sub check { 'ck_fun' }
-sub flags { 'ms@' }
-sub args { 'L' }
-
-
-package PLXML::op_anonhash;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'anonhash' }
-sub desc { 'anonymous hash ({})' }
-sub check { 'ck_fun' }
-sub flags { 'ms@' }
-sub args { 'L' }
-
-
-
-package PLXML::op_splice;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'splice' }
-sub desc { 'splice' }
-sub check { 'ck_fun' }
-sub flags { 'm@' }
-sub args { 'A S? S? L' }
-
-
-package PLXML::op_push;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'push' }
-sub desc { 'push' }
-sub check { 'ck_fun' }
-sub flags { 'imsT@' }
-sub args { 'A L' }
-
-
-package PLXML::op_pop;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'pop' }
-sub desc { 'pop' }
-sub check { 'ck_shift' }
-sub flags { 's%' }
-sub args { 'A?' }
-
-
-package PLXML::op_shift;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'shift' }
-sub desc { 'shift' }
-sub check { 'ck_shift' }
-sub flags { 's%' }
-sub args { 'A?' }
-
-
-package PLXML::op_unshift;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'unshift' }
-sub desc { 'unshift' }
-sub check { 'ck_fun' }
-sub flags { 'imsT@' }
-sub args { 'A L' }
-
-
-package PLXML::op_sort;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'sort' }
-sub desc { 'sort' }
-sub check { 'ck_sort' }
-sub flags { 'm@' }
-sub args { 'C? L' }
-
-
-package PLXML::op_reverse;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'reverse' }
-sub desc { 'reverse' }
-sub check { 'ck_fun' }
-sub flags { 'mt@' }
-sub args { 'L' }
-
-
-
-package PLXML::op_grepstart;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'grepstart' }
-sub desc { 'grep' }
-sub check { 'ck_grep' }
-sub flags { 'dm@' }
-sub args { 'C L' }
-
-
-package PLXML::op_grepwhile;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'grepwhile' }
-sub desc { 'grep iterator' }
-sub check { 'ck_null' }
-sub flags { 'dt|' }
-sub args { '' }
-
-
-
-package PLXML::op_mapstart;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'mapstart' }
-sub desc { 'map' }
-sub check { 'ck_grep' }
-sub flags { 'dm@' }
-sub args { 'C L' }
-
-
-package PLXML::op_mapwhile;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'mapwhile' }
-sub desc { 'map iterator' }
-sub check { 'ck_null' }
-sub flags { 'dt|' }
-sub args { '' }
-
-
-
-# Range stuff.
-
-package PLXML::op_range;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'range' }
-sub desc { 'flipflop' }
-sub check { 'ck_null' }
-sub flags { '|' }
-sub args { 'S S' }
-
-
-package PLXML::op_flip;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'flip' }
-sub desc { 'range (or flip)' }
-sub check { 'ck_null' }
-sub flags { '1' }
-sub args { 'S S' }
-
-
-package PLXML::op_flop;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'flop' }
-sub desc { 'range (or flop)' }
-sub check { 'ck_null' }
-sub flags { '1' }
-sub args { '' }
-
-
-
-# Control.
-
-package PLXML::op_and;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'and' }
-sub desc { 'logical and (&&)' }
-sub check { 'ck_null' }
-sub flags { '|' }
-sub args { '' }
-
-
-package PLXML::op_or;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'or' }
-sub desc { 'logical or (||)' }
-sub check { 'ck_null' }
-sub flags { '|' }
-sub args { '' }
-
-
-package PLXML::op_xor;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'xor' }
-sub desc { 'logical xor' }
-sub check { 'ck_null' }
-sub flags { 'fs2' }
-sub args { 'S S        ' }
-
-
-package PLXML::op_cond_expr;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'cond_expr' }
-sub desc { 'conditional expression' }
-sub check { 'ck_null' }
-sub flags { 'd|' }
-sub args { '' }
-
-
-package PLXML::op_andassign;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'andassign' }
-sub desc { 'logical and assignment (&&=)' }
-sub check { 'ck_null' }
-sub flags { 's|' }
-sub args { '' }
-
-
-package PLXML::op_orassign;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'orassign' }
-sub desc { 'logical or assignment (||=)' }
-sub check { 'ck_null' }
-sub flags { 's|' }
-sub args { '' }
-
-
-
-package PLXML::op_method;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'method' }
-sub desc { 'method lookup' }
-sub check { 'ck_method' }
-sub flags { 'd1' }
-sub args { '' }
-
-
-package PLXML::op_entersub;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'entersub' }
-sub desc { 'subroutine entry' }
-sub check { 'ck_subr' }
-sub flags { 'dmt1' }
-sub args { 'L' }
-
-
-package PLXML::op_leavesub;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'leavesub' }
-sub desc { 'subroutine exit' }
-sub check { 'ck_null' }
-sub flags { '1' }
-sub args { '' }
-
-
-package PLXML::op_leavesublv;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'leavesublv' }
-sub desc { 'lvalue subroutine return' }
-sub check { 'ck_null' }
-sub flags { '1' }
-sub args { '' }
-
-
-package PLXML::op_caller;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'caller' }
-sub desc { 'caller' }
-sub check { 'ck_fun' }
-sub flags { 't%' }
-sub args { 'S?' }
-
-
-package PLXML::op_warn;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'warn' }
-sub desc { 'warn' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'L' }
-
-
-package PLXML::op_die;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'die' }
-sub desc { 'die' }
-sub check { 'ck_die' }
-sub flags { 'dimst@' }
-sub args { 'L' }
-
-
-package PLXML::op_reset;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'reset' }
-sub desc { 'symbol reset' }
-sub check { 'ck_fun' }
-sub flags { 'is%' }
-sub args { 'S?' }
-
-
-
-package PLXML::op_lineseq;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'lineseq' }
-sub desc { 'line sequence' }
-sub check { 'ck_null' }
-sub flags { '@' }
-sub args { '' }
-
-
-package PLXML::op_nextstate;
-
-our @ISA = ('PLXML::cop');
-
-sub key { 'nextstate' }
-sub desc { 'next statement' }
-sub check { 'ck_null' }
-sub flags { 's;' }
-sub args { '' }
-
-
-package PLXML::op_dbstate;
-
-our @ISA = ('PLXML::cop');
-
-sub key { 'dbstate' }
-sub desc { 'debug next statement' }
-sub check { 'ck_null' }
-sub flags { 's;' }
-sub args { '' }
-
-
-package PLXML::op_unstack;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'unstack' }
-sub desc { 'iteration finalizer' }
-sub check { 'ck_null' }
-sub flags { 's0' }
-sub args { '' }
-
-
-package PLXML::op_enter;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'enter' }
-sub desc { 'block entry' }
-sub check { 'ck_null' }
-sub flags { '0' }
-sub args { '' }
-
-
-package PLXML::op_leave;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'leave' }
-sub desc { 'block exit' }
-sub check { 'ck_null' }
-sub flags { '@' }
-sub args { '' }
-
-
-package PLXML::op_scope;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'scope' }
-sub desc { 'block' }
-sub check { 'ck_null' }
-sub flags { '@' }
-sub args { '' }
-
-
-package PLXML::op_enteriter;
-
-our @ISA = ('PLXML::loop');
-
-sub key { 'enteriter' }
-sub desc { 'foreach loop entry' }
-sub check { 'ck_null' }
-sub flags { 'd{' }
-sub args { '' }
-
-
-package PLXML::op_iter;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'iter' }
-sub desc { 'foreach loop iterator' }
-sub check { 'ck_null' }
-sub flags { '0' }
-sub args { '' }
-
-
-package PLXML::op_enterloop;
-
-our @ISA = ('PLXML::loop');
-
-sub key { 'enterloop' }
-sub desc { 'loop entry' }
-sub check { 'ck_null' }
-sub flags { 'd{' }
-sub args { '' }
-
-
-package PLXML::op_leaveloop;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'leaveloop' }
-sub desc { 'loop exit' }
-sub check { 'ck_null' }
-sub flags { '2' }
-sub args { '' }
-
-
-package PLXML::op_return;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'return' }
-sub desc { 'return' }
-sub check { 'ck_return' }
-sub flags { 'dm@' }
-sub args { 'L' }
-
-
-package PLXML::op_last;
-
-our @ISA = ('PLXML::loopexop');
-
-sub key { 'last' }
-sub desc { 'last' }
-sub check { 'ck_null' }
-sub flags { 'ds}' }
-sub args { '' }
-
-
-package PLXML::op_next;
-
-our @ISA = ('PLXML::loopexop');
-
-sub key { 'next' }
-sub desc { 'next' }
-sub check { 'ck_null' }
-sub flags { 'ds}' }
-sub args { '' }
-
-
-package PLXML::op_redo;
-
-our @ISA = ('PLXML::loopexop');
-
-sub key { 'redo' }
-sub desc { 'redo' }
-sub check { 'ck_null' }
-sub flags { 'ds}' }
-sub args { '' }
-
-
-package PLXML::op_dump;
-
-our @ISA = ('PLXML::loopexop');
-
-sub key { 'dump' }
-sub desc { 'dump' }
-sub check { 'ck_null' }
-sub flags { 'ds}' }
-sub args { '' }
-
-
-package PLXML::op_goto;
-
-our @ISA = ('PLXML::loopexop');
-
-sub key { 'goto' }
-sub desc { 'goto' }
-sub check { 'ck_null' }
-sub flags { 'ds}' }
-sub args { '' }
-
-
-package PLXML::op_exit;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'exit' }
-sub desc { 'exit' }
-sub check { 'ck_exit' }
-sub flags { 'ds%' }
-sub args { 'S?' }
-
-
-# continued below
-
-#nswitch       numeric switch          ck_null         d       
-#cswitch       character switch        ck_null         d       
-
-# I/O.
-
-package PLXML::op_open;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'open' }
-sub desc { 'open' }
-sub check { 'ck_open' }
-sub flags { 'ismt@' }
-sub args { 'F S? L' }
-
-
-package PLXML::op_close;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'close' }
-sub desc { 'close' }
-sub check { 'ck_fun' }
-sub flags { 'is%' }
-sub args { 'F?' }
-
-
-package PLXML::op_pipe_op;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'pipe_op' }
-sub desc { 'pipe' }
-sub check { 'ck_fun' }
-sub flags { 'is@' }
-sub args { 'F F' }
-
-
-
-package PLXML::op_fileno;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'fileno' }
-sub desc { 'fileno' }
-sub check { 'ck_fun' }
-sub flags { 'ist%' }
-sub args { 'F' }
-
-
-package PLXML::op_umask;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'umask' }
-sub desc { 'umask' }
-sub check { 'ck_fun' }
-sub flags { 'ist%' }
-sub args { 'S?' }
-
-
-package PLXML::op_binmode;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'binmode' }
-sub desc { 'binmode' }
-sub check { 'ck_fun' }
-sub flags { 's@' }
-sub args { 'F S?' }
-
-
-
-package PLXML::op_tie;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'tie' }
-sub desc { 'tie' }
-sub check { 'ck_fun' }
-sub flags { 'idms@' }
-sub args { 'R S L' }
-
-
-package PLXML::op_untie;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'untie' }
-sub desc { 'untie' }
-sub check { 'ck_fun' }
-sub flags { 'is%' }
-sub args { 'R' }
-
-
-package PLXML::op_tied;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'tied' }
-sub desc { 'tied' }
-sub check { 'ck_fun' }
-sub flags { 's%' }
-sub args { 'R' }
-
-
-package PLXML::op_dbmopen;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'dbmopen' }
-sub desc { 'dbmopen' }
-sub check { 'ck_fun' }
-sub flags { 'is@' }
-sub args { 'H S S' }
-
-
-package PLXML::op_dbmclose;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'dbmclose' }
-sub desc { 'dbmclose' }
-sub check { 'ck_fun' }
-sub flags { 'is%' }
-sub args { 'H' }
-
-
-
-package PLXML::op_sselect;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'sselect' }
-sub desc { 'select system call' }
-sub check { 'ck_select' }
-sub flags { 't@' }
-sub args { 'S S S S' }
-
-
-package PLXML::op_select;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'select' }
-sub desc { 'select' }
-sub check { 'ck_select' }
-sub flags { 'st@' }
-sub args { 'F?' }
-
-
-
-package PLXML::op_getc;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'getc' }
-sub desc { 'getc' }
-sub check { 'ck_eof' }
-sub flags { 'st%' }
-sub args { 'F?' }
-
-
-package PLXML::op_read;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'read' }
-sub desc { 'read' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'F R S S?' }
-
-
-package PLXML::op_enterwrite;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'enterwrite' }
-sub desc { 'write' }
-sub check { 'ck_fun' }
-sub flags { 'dis%' }
-sub args { 'F?' }
-
-
-package PLXML::op_leavewrite;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'leavewrite' }
-sub desc { 'write exit' }
-sub check { 'ck_null' }
-sub flags { '1' }
-sub args { '' }
-
-
-
-package PLXML::op_prtf;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'prtf' }
-sub desc { 'printf' }
-sub check { 'ck_listiob' }
-sub flags { 'ims@' }
-sub args { 'F? L' }
-
-
-package PLXML::op_print;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'print' }
-sub desc { 'print' }
-sub check { 'ck_listiob' }
-sub flags { 'ims@' }
-sub args { 'F? L' }
-
-
-package PLXML::op_say;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'say' }
-sub desc { 'say' }
-sub check { 'ck_listiob' }
-sub flags { 'ims@' }
-sub args { 'F? L' }
-
-
-package PLXML::op_sysopen;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'sysopen' }
-sub desc { 'sysopen' }
-sub check { 'ck_fun' }
-sub flags { 's@' }
-sub args { 'F S S S?' }
-
-
-package PLXML::op_sysseek;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'sysseek' }
-sub desc { 'sysseek' }
-sub check { 'ck_fun' }
-sub flags { 's@' }
-sub args { 'F S S' }
-
-
-package PLXML::op_sysread;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'sysread' }
-sub desc { 'sysread' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'F R S S?' }
-
-
-package PLXML::op_syswrite;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'syswrite' }
-sub desc { 'syswrite' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'F S S? S?' }
-
-
-
-package PLXML::op_send;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'send' }
-sub desc { 'send' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'Fs S S S?' }
-
-
-package PLXML::op_recv;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'recv' }
-sub desc { 'recv' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'Fs R S S' }
-
-
-
-package PLXML::op_eof;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'eof' }
-sub desc { 'eof' }
-sub check { 'ck_eof' }
-sub flags { 'is%' }
-sub args { 'F?' }
-
-
-package PLXML::op_tell;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'tell' }
-sub desc { 'tell' }
-sub check { 'ck_fun' }
-sub flags { 'st%' }
-sub args { 'F?' }
-
-
-package PLXML::op_seek;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'seek' }
-sub desc { 'seek' }
-sub check { 'ck_fun' }
-sub flags { 's@' }
-sub args { 'F S S' }
-
-
-# truncate really behaves as if it had both "S S" and "F S"
-package PLXML::op_truncate;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'truncate' }
-sub desc { 'truncate' }
-sub check { 'ck_trunc' }
-sub flags { 'is@' }
-sub args { 'S S' }
-
-
-
-package PLXML::op_fcntl;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'fcntl' }
-sub desc { 'fcntl' }
-sub check { 'ck_fun' }
-sub flags { 'st@' }
-sub args { 'F S S' }
-
-
-package PLXML::op_ioctl;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'ioctl' }
-sub desc { 'ioctl' }
-sub check { 'ck_fun' }
-sub flags { 'st@' }
-sub args { 'F S S' }
-
-
-package PLXML::op_flock;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'flock' }
-sub desc { 'flock' }
-sub check { 'ck_fun' }
-sub flags { 'isT@' }
-sub args { 'F S' }
-
-
-
-# Sockets.
-
-package PLXML::op_socket;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'socket' }
-sub desc { 'socket' }
-sub check { 'ck_fun' }
-sub flags { 'is@' }
-sub args { 'Fs S S S' }
-
-
-package PLXML::op_sockpair;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'sockpair' }
-sub desc { 'socketpair' }
-sub check { 'ck_fun' }
-sub flags { 'is@' }
-sub args { 'Fs Fs S S S' }
-
-
-
-package PLXML::op_bind;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'bind' }
-sub desc { 'bind' }
-sub check { 'ck_fun' }
-sub flags { 'is@' }
-sub args { 'Fs S' }
-
-
-package PLXML::op_connect;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'connect' }
-sub desc { 'connect' }
-sub check { 'ck_fun' }
-sub flags { 'is@' }
-sub args { 'Fs S' }
-
-
-package PLXML::op_listen;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'listen' }
-sub desc { 'listen' }
-sub check { 'ck_fun' }
-sub flags { 'is@' }
-sub args { 'Fs S' }
-
-
-package PLXML::op_accept;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'accept' }
-sub desc { 'accept' }
-sub check { 'ck_fun' }
-sub flags { 'ist@' }
-sub args { 'Fs Fs' }
-
-
-package PLXML::op_shutdown;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'shutdown' }
-sub desc { 'shutdown' }
-sub check { 'ck_fun' }
-sub flags { 'ist@' }
-sub args { 'Fs S' }
-
-
-
-package PLXML::op_gsockopt;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'gsockopt' }
-sub desc { 'getsockopt' }
-sub check { 'ck_fun' }
-sub flags { 'is@' }
-sub args { 'Fs S S' }
-
-
-package PLXML::op_ssockopt;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'ssockopt' }
-sub desc { 'setsockopt' }
-sub check { 'ck_fun' }
-sub flags { 'is@' }
-sub args { 'Fs S S S' }
-
-
-
-package PLXML::op_getsockname;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'getsockname' }
-sub desc { 'getsockname' }
-sub check { 'ck_fun' }
-sub flags { 'is%' }
-sub args { 'Fs' }
-
-
-package PLXML::op_getpeername;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'getpeername' }
-sub desc { 'getpeername' }
-sub check { 'ck_fun' }
-sub flags { 'is%' }
-sub args { 'Fs' }
-
-
-
-# Stat calls.
-
-package PLXML::op_lstat;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'lstat' }
-sub desc { 'lstat' }
-sub check { 'ck_ftst' }
-sub flags { 'u-' }
-sub args { 'F' }
-
-
-package PLXML::op_stat;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'stat' }
-sub desc { 'stat' }
-sub check { 'ck_ftst' }
-sub flags { 'u-' }
-sub args { 'F' }
-
-
-package PLXML::op_ftrread;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftrread' }
-sub desc { '-R' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftrwrite;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftrwrite' }
-sub desc { '-W' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftrexec;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftrexec' }
-sub desc { '-X' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_fteread;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'fteread' }
-sub desc { '-r' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftewrite;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftewrite' }
-sub desc { '-w' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_fteexec;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'fteexec' }
-sub desc { '-x' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftis;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftis' }
-sub desc { '-e' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_fteowned;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'fteowned' }
-sub desc { '-O' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftrowned;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftrowned' }
-sub desc { '-o' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftzero;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftzero' }
-sub desc { '-z' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftsize;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftsize' }
-sub desc { '-s' }
-sub check { 'ck_ftst' }
-sub flags { 'istu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftmtime;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftmtime' }
-sub desc { '-M' }
-sub check { 'ck_ftst' }
-sub flags { 'stu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftatime;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftatime' }
-sub desc { '-A' }
-sub check { 'ck_ftst' }
-sub flags { 'stu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftctime;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftctime' }
-sub desc { '-C' }
-sub check { 'ck_ftst' }
-sub flags { 'stu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftsock;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftsock' }
-sub desc { '-S' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftchr;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftchr' }
-sub desc { '-c' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftblk;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftblk' }
-sub desc { '-b' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftfile;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftfile' }
-sub desc { '-f' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftdir;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftdir' }
-sub desc { '-d' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftpipe;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftpipe' }
-sub desc { '-p' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftlink;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftlink' }
-sub desc { '-l' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftsuid;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftsuid' }
-sub desc { '-u' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftsgid;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftsgid' }
-sub desc { '-g' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftsvtx;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftsvtx' }
-sub desc { '-k' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_fttty;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'fttty' }
-sub desc { '-t' }
-sub check { 'ck_ftst' }
-sub flags { 'is-' }
-sub args { 'F-' }
-
-
-package PLXML::op_fttext;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'fttext' }
-sub desc { '-T' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftbinary;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftbinary' }
-sub desc { '-B' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-
-# File calls.
-
-package PLXML::op_chdir;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'chdir' }
-sub desc { 'chdir' }
-sub check { 'ck_fun' }
-sub flags { 'isT%' }
-sub args { 'S?' }
-
-
-package PLXML::op_chown;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'chown' }
-sub desc { 'chown' }
-sub check { 'ck_fun' }
-sub flags { 'imsT@' }
-sub args { 'L' }
-
-
-package PLXML::op_chroot;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'chroot' }
-sub desc { 'chroot' }
-sub check { 'ck_fun' }
-sub flags { 'isTu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_unlink;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'unlink' }
-sub desc { 'unlink' }
-sub check { 'ck_fun' }
-sub flags { 'imsTu@' }
-sub args { 'L' }
-
-
-package PLXML::op_chmod;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'chmod' }
-sub desc { 'chmod' }
-sub check { 'ck_fun' }
-sub flags { 'imsT@' }
-sub args { 'L' }
-
-
-package PLXML::op_utime;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'utime' }
-sub desc { 'utime' }
-sub check { 'ck_fun' }
-sub flags { 'imsT@' }
-sub args { 'L' }
-
-
-package PLXML::op_rename;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'rename' }
-sub desc { 'rename' }
-sub check { 'ck_fun' }
-sub flags { 'isT@' }
-sub args { 'S S' }
-
-
-package PLXML::op_link;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'link' }
-sub desc { 'link' }
-sub check { 'ck_fun' }
-sub flags { 'isT@' }
-sub args { 'S S' }
-
-
-package PLXML::op_symlink;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'symlink' }
-sub desc { 'symlink' }
-sub check { 'ck_fun' }
-sub flags { 'isT@' }
-sub args { 'S S' }
-
-
-package PLXML::op_readlink;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'readlink' }
-sub desc { 'readlink' }
-sub check { 'ck_fun' }
-sub flags { 'stu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_mkdir;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'mkdir' }
-sub desc { 'mkdir' }
-sub check { 'ck_fun' }
-sub flags { 'isT@' }
-sub args { 'S S?' }
-
-
-package PLXML::op_rmdir;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'rmdir' }
-sub desc { 'rmdir' }
-sub check { 'ck_fun' }
-sub flags { 'isTu%' }
-sub args { 'S?' }
-
-
-
-# Directory calls.
-
-package PLXML::op_open_dir;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'open_dir' }
-sub desc { 'opendir' }
-sub check { 'ck_fun' }
-sub flags { 'is@' }
-sub args { 'F S' }
-
-
-package PLXML::op_readdir;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'readdir' }
-sub desc { 'readdir' }
-sub check { 'ck_fun' }
-sub flags { '%' }
-sub args { 'F' }
-
-
-package PLXML::op_telldir;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'telldir' }
-sub desc { 'telldir' }
-sub check { 'ck_fun' }
-sub flags { 'st%' }
-sub args { 'F' }
-
-
-package PLXML::op_seekdir;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'seekdir' }
-sub desc { 'seekdir' }
-sub check { 'ck_fun' }
-sub flags { 's@' }
-sub args { 'F S' }
-
-
-package PLXML::op_rewinddir;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'rewinddir' }
-sub desc { 'rewinddir' }
-sub check { 'ck_fun' }
-sub flags { 's%' }
-sub args { 'F' }
-
-
-package PLXML::op_closedir;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'closedir' }
-sub desc { 'closedir' }
-sub check { 'ck_fun' }
-sub flags { 'is%' }
-sub args { 'F' }
-
-
-
-# Process control.
-
-package PLXML::op_fork;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'fork' }
-sub desc { 'fork' }
-sub check { 'ck_null' }
-sub flags { 'ist0' }
-sub args { '' }
-
-
-package PLXML::op_wait;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'wait' }
-sub desc { 'wait' }
-sub check { 'ck_null' }
-sub flags { 'isT0' }
-sub args { '' }
-
-
-package PLXML::op_waitpid;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'waitpid' }
-sub desc { 'waitpid' }
-sub check { 'ck_fun' }
-sub flags { 'isT@' }
-sub args { 'S S' }
-
-
-package PLXML::op_system;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'system' }
-sub desc { 'system' }
-sub check { 'ck_exec' }
-sub flags { 'imsT@' }
-sub args { 'S? L' }
-
-
-package PLXML::op_exec;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'exec' }
-sub desc { 'exec' }
-sub check { 'ck_exec' }
-sub flags { 'dimsT@' }
-sub args { 'S? L' }
-
-
-package PLXML::op_kill;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'kill' }
-sub desc { 'kill' }
-sub check { 'ck_fun' }
-sub flags { 'dimsT@' }
-sub args { 'L' }
-
-
-package PLXML::op_getppid;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'getppid' }
-sub desc { 'getppid' }
-sub check { 'ck_null' }
-sub flags { 'isT0' }
-sub args { '' }
-
-
-package PLXML::op_getpgrp;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'getpgrp' }
-sub desc { 'getpgrp' }
-sub check { 'ck_fun' }
-sub flags { 'isT%' }
-sub args { 'S?' }
-
-
-package PLXML::op_setpgrp;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'setpgrp' }
-sub desc { 'setpgrp' }
-sub check { 'ck_fun' }
-sub flags { 'isT@' }
-sub args { 'S? S?' }
-
-
-package PLXML::op_getpriority;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'getpriority' }
-sub desc { 'getpriority' }
-sub check { 'ck_fun' }
-sub flags { 'isT@' }
-sub args { 'S S' }
-
-
-package PLXML::op_setpriority;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'setpriority' }
-sub desc { 'setpriority' }
-sub check { 'ck_fun' }
-sub flags { 'isT@' }
-sub args { 'S S S' }
-
-
-
-# Time calls.
-
-package PLXML::op_time;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'time' }
-sub desc { 'time' }
-sub check { 'ck_null' }
-sub flags { 'isT0' }
-sub args { '' }
-
-
-package PLXML::op_tms;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'tms' }
-sub desc { 'times' }
-sub check { 'ck_null' }
-sub flags { '0' }
-sub args { '' }
-
-
-package PLXML::op_localtime;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'localtime' }
-sub desc { 'localtime' }
-sub check { 'ck_fun' }
-sub flags { 't%' }
-sub args { 'S?' }
-
-
-package PLXML::op_gmtime;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'gmtime' }
-sub desc { 'gmtime' }
-sub check { 'ck_fun' }
-sub flags { 't%' }
-sub args { 'S?' }
-
-
-package PLXML::op_alarm;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'alarm' }
-sub desc { 'alarm' }
-sub check { 'ck_fun' }
-sub flags { 'istu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_sleep;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'sleep' }
-sub desc { 'sleep' }
-sub check { 'ck_fun' }
-sub flags { 'isT%' }
-sub args { 'S?' }
-
-
-
-# Shared memory.
-
-package PLXML::op_shmget;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'shmget' }
-sub desc { 'shmget' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'S S S' }
-
-
-package PLXML::op_shmctl;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'shmctl' }
-sub desc { 'shmctl' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'S S S' }
-
-
-package PLXML::op_shmread;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'shmread' }
-sub desc { 'shmread' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'S S S S' }
-
-
-package PLXML::op_shmwrite;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'shmwrite' }
-sub desc { 'shmwrite' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'S S S S' }
-
-
-
-# Message passing.
-
-package PLXML::op_msgget;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'msgget' }
-sub desc { 'msgget' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'S S' }
-
-
-package PLXML::op_msgctl;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'msgctl' }
-sub desc { 'msgctl' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'S S S' }
-
-
-package PLXML::op_msgsnd;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'msgsnd' }
-sub desc { 'msgsnd' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'S S S' }
-
-
-package PLXML::op_msgrcv;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'msgrcv' }
-sub desc { 'msgrcv' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'S S S S S' }
-
-
-
-# Semaphores.
-
-package PLXML::op_semget;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'semget' }
-sub desc { 'semget' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'S S S' }
-
-
-package PLXML::op_semctl;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'semctl' }
-sub desc { 'semctl' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'S S S S' }
-
-
-package PLXML::op_semop;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'semop' }
-sub desc { 'semop' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'S S' }
-
-
-
-# Eval.
-
-package PLXML::op_require;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'require' }
-sub desc { 'require' }
-sub check { 'ck_require' }
-sub flags { 'du%' }
-sub args { 'S?' }
-
-
-package PLXML::op_dofile;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'dofile' }
-sub desc { 'do "file"' }
-sub check { 'ck_fun' }
-sub flags { 'd1' }
-sub args { 'S' }
-
-
-package PLXML::op_entereval;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'entereval' }
-sub desc { 'eval "string"' }
-sub check { 'ck_eval' }
-sub flags { 'd%' }
-sub args { 'S' }
-
-
-package PLXML::op_leaveeval;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'leaveeval' }
-sub desc { 'eval "string" exit' }
-sub check { 'ck_null' }
-sub flags { '1' }
-sub args { 'S' }
-
-
-#evalonce      eval constant string    ck_null         d1      S
-package PLXML::op_entertry;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'entertry' }
-sub desc { 'eval {block}' }
-sub check { 'ck_null' }
-sub flags { '|' }
-sub args { '' }
-
-
-package PLXML::op_leavetry;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'leavetry' }
-sub desc { 'eval {block} exit' }
-sub check { 'ck_null' }
-sub flags { '@' }
-sub args { '' }
-
-
-
-# Get system info.
-
-package PLXML::op_ghbyname;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'ghbyname' }
-sub desc { 'gethostbyname' }
-sub check { 'ck_fun' }
-sub flags { '%' }
-sub args { 'S' }
-
-
-package PLXML::op_ghbyaddr;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'ghbyaddr' }
-sub desc { 'gethostbyaddr' }
-sub check { 'ck_fun' }
-sub flags { '@' }
-sub args { 'S S' }
-
-
-package PLXML::op_ghostent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'ghostent' }
-sub desc { 'gethostent' }
-sub check { 'ck_null' }
-sub flags { '0' }
-sub args { '' }
-
-
-package PLXML::op_gnbyname;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'gnbyname' }
-sub desc { 'getnetbyname' }
-sub check { 'ck_fun' }
-sub flags { '%' }
-sub args { 'S' }
-
-
-package PLXML::op_gnbyaddr;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'gnbyaddr' }
-sub desc { 'getnetbyaddr' }
-sub check { 'ck_fun' }
-sub flags { '@' }
-sub args { 'S S' }
-
-
-package PLXML::op_gnetent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'gnetent' }
-sub desc { 'getnetent' }
-sub check { 'ck_null' }
-sub flags { '0' }
-sub args { '' }
-
-
-package PLXML::op_gpbyname;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'gpbyname' }
-sub desc { 'getprotobyname' }
-sub check { 'ck_fun' }
-sub flags { '%' }
-sub args { 'S' }
-
-
-package PLXML::op_gpbynumber;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'gpbynumber' }
-sub desc { 'getprotobynumber' }
-sub check { 'ck_fun' }
-sub flags { '@' }
-sub args { 'S' }
-
-
-package PLXML::op_gprotoent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'gprotoent' }
-sub desc { 'getprotoent' }
-sub check { 'ck_null' }
-sub flags { '0' }
-sub args { '' }
-
-
-package PLXML::op_gsbyname;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'gsbyname' }
-sub desc { 'getservbyname' }
-sub check { 'ck_fun' }
-sub flags { '@' }
-sub args { 'S S' }
-
-
-package PLXML::op_gsbyport;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'gsbyport' }
-sub desc { 'getservbyport' }
-sub check { 'ck_fun' }
-sub flags { '@' }
-sub args { 'S S' }
-
-
-package PLXML::op_gservent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'gservent' }
-sub desc { 'getservent' }
-sub check { 'ck_null' }
-sub flags { '0' }
-sub args { '' }
-
-
-package PLXML::op_shostent;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'shostent' }
-sub desc { 'sethostent' }
-sub check { 'ck_fun' }
-sub flags { 'is%' }
-sub args { 'S' }
-
-
-package PLXML::op_snetent;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'snetent' }
-sub desc { 'setnetent' }
-sub check { 'ck_fun' }
-sub flags { 'is%' }
-sub args { 'S' }
-
-
-package PLXML::op_sprotoent;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'sprotoent' }
-sub desc { 'setprotoent' }
-sub check { 'ck_fun' }
-sub flags { 'is%' }
-sub args { 'S' }
-
-
-package PLXML::op_sservent;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'sservent' }
-sub desc { 'setservent' }
-sub check { 'ck_fun' }
-sub flags { 'is%' }
-sub args { 'S' }
-
-
-package PLXML::op_ehostent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'ehostent' }
-sub desc { 'endhostent' }
-sub check { 'ck_null' }
-sub flags { 'is0' }
-sub args { '' }
-
-
-package PLXML::op_enetent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'enetent' }
-sub desc { 'endnetent' }
-sub check { 'ck_null' }
-sub flags { 'is0' }
-sub args { '' }
-
-
-package PLXML::op_eprotoent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'eprotoent' }
-sub desc { 'endprotoent' }
-sub check { 'ck_null' }
-sub flags { 'is0' }
-sub args { '' }
-
-
-package PLXML::op_eservent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'eservent' }
-sub desc { 'endservent' }
-sub check { 'ck_null' }
-sub flags { 'is0' }
-sub args { '' }
-
-
-package PLXML::op_gpwnam;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'gpwnam' }
-sub desc { 'getpwnam' }
-sub check { 'ck_fun' }
-sub flags { '%' }
-sub args { 'S' }
-
-
-package PLXML::op_gpwuid;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'gpwuid' }
-sub desc { 'getpwuid' }
-sub check { 'ck_fun' }
-sub flags { '%' }
-sub args { 'S' }
-
-
-package PLXML::op_gpwent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'gpwent' }
-sub desc { 'getpwent' }
-sub check { 'ck_null' }
-sub flags { '0' }
-sub args { '' }
-
-
-package PLXML::op_spwent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'spwent' }
-sub desc { 'setpwent' }
-sub check { 'ck_null' }
-sub flags { 'is0' }
-sub args { '' }
-
-
-package PLXML::op_epwent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'epwent' }
-sub desc { 'endpwent' }
-sub check { 'ck_null' }
-sub flags { 'is0' }
-sub args { '' }
-
-
-package PLXML::op_ggrnam;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'ggrnam' }
-sub desc { 'getgrnam' }
-sub check { 'ck_fun' }
-sub flags { '%' }
-sub args { 'S' }
-
-
-package PLXML::op_ggrgid;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'ggrgid' }
-sub desc { 'getgrgid' }
-sub check { 'ck_fun' }
-sub flags { '%' }
-sub args { 'S' }
-
-
-package PLXML::op_ggrent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'ggrent' }
-sub desc { 'getgrent' }
-sub check { 'ck_null' }
-sub flags { '0' }
-sub args { '' }
-
-
-package PLXML::op_sgrent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'sgrent' }
-sub desc { 'setgrent' }
-sub check { 'ck_null' }
-sub flags { 'is0' }
-sub args { '' }
-
-
-package PLXML::op_egrent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'egrent' }
-sub desc { 'endgrent' }
-sub check { 'ck_null' }
-sub flags { 'is0' }
-sub args { '' }
-
-
-package PLXML::op_getlogin;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'getlogin' }
-sub desc { 'getlogin' }
-sub check { 'ck_null' }
-sub flags { 'st0' }
-sub args { '' }
-
-
-
-# Miscellaneous.
-
-package PLXML::op_syscall;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'syscall' }
-sub desc { 'syscall' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'S L' }
-
-
-
-# For multi-threading
-package PLXML::op_lock;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'lock' }
-sub desc { 'lock' }
-sub check { 'ck_rfun' }
-sub flags { 's%' }
-sub args { 'R' }
-
-
-package PLXML::op_threadsv;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'threadsv' }
-sub desc { 'per-thread value' }
-sub check { 'ck_null' }
-sub flags { 'ds0' }
-sub args { '' }
-
-
-
-# Control (contd.)
-package PLXML::op_setstate;
-
-our @ISA = ('PLXML::cop');
-
-sub key { 'setstate' }
-sub desc { 'set statement info' }
-sub check { 'ck_null' }
-sub flags { 's;' }
-sub args { '' }
-
-
-package PLXML::op_method_named;
-
-our @ISA = ('PLXML::padop_svop');
-
-sub key { 'method_named' }
-sub desc { 'method with known name' }
-sub check { 'ck_null' }
-sub flags { 'd$' }
-sub args { '' }
-
-
-
-package PLXML::op_dor;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'dor' }
-sub desc { 'defined or (//)' }
-sub check { 'ck_null' }
-sub flags { '|' }
-sub args { '' }
-
-
-package PLXML::op_dorassign;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'dorassign' }
-sub desc { 'defined or assignment (//=)' }
-sub check { 'ck_null' }
-sub flags { 's|' }
-sub args { '' }
-
-
-
-# Add new ops before this, the custom operator.
-
-package PLXML::op_custom;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'custom' }
-sub desc { 'unknown custom operator' }
-sub check { 'ck_null' }
-sub flags { '0' }
-sub args { '' }
-
-
diff --git a/mad/p55 b/mad/p55
deleted file mode 100644 (file)
index 20b879b..0000000
--- a/mad/p55
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/usr/bin/perl
-
-while (@ARGV and $ARGV[0] =~ /^-/) {
-    my $switch = shift;
-    if ($switch eq '-Y') {
-        $YAML = '-Y ';
-    }
-    else {
-        die "Unrecognized switch: -$switch";
-    }
-}
-
-my $file = shift;
-my $infile = $file;
-
-unlink "$file.msg";
-my $top = "/home/larry/src/p55";
-
-my $text;
-open(FILE, $file) or die "Can't open $file: $!\n";
-{
-    local $/;
-    $text = <FILE>;
-}
-close FILE;
-my $T;
-$switches = $1 if $text =~ /^#!.*?\s(-.*)/;
-$switches =~ s/\s+-[-*].*//;
-$switches =~ s/\s+#.*//;
-
-#if ($text =~ s/\bexit\b/DUMMYEXIT/g) {
-#    $infile = "$file.tmp";
-#    open FILE, ">$infile";
-#    print FILE $text;
-#    close FILE;
-#}
-
-unlink "$file.xml", "$file.msg", "$file.err", "$file.diff", "$file.p5";
-print "PERL_XMLDUMP='$file.xml' $top/perl $switches -I lib $infile 2>$file.err\n";
-system "PERL_XMLDUMP='$file.xml' $top/perl $switches -I lib $infile 2>$file.err";
-
-if ($?) {
-    print "Exit status $?\n";
-    system "cat $file.err";
-    exit 1;
-}
-
-if (not -s "$file.xml") {
-    die "Didn't produce an xml file!?!\n"
-}
-
-if ($YAML) {
-    system "$top/nomad -Y $file.xml";
-    exit;
-}
-
-system "$top/nomad $file.xml >$file.p5 2>$file.msg";
-
-if ($?) {
-    print "Oops!\n" unless -s "$file.msg";
-    system "cat $file.msg";
-    exit 1;
-}
-
-system "diff -u $file $file.p5 >$file.diff";
-if (-s "$file.diff") {
-    system "cat $file.diff";
-    exit 1;
-}
diff --git a/mad/t/p55.t b/mad/t/p55.t
deleted file mode 100644 (file)
index fbfa451..0000000
+++ /dev/null
@@ -1,178 +0,0 @@
-
-# Test p55, the "Perl 5 to Perl 5" translator.
-
-# The perl core should have MAD enabled ('sh Configure -Dmad=y ...')
-
-# The part to convert xml to Perl 5 requires XML::Parser, but it does
-# not depend on Perl internals, so you can use a stable system wide
-# perl
-
-# For the p55 on the perl test suite, it should be started from the
-# $perlsource/t subdir
-
-# Instructions:
-#     sh Configure -Dmad=y
-#     make && make test
-#     cd t && /usr/bin/prove ../mad/t/p55.t
-
-use strict;
-use warnings;
-
-BEGIN {
-    push @INC, "../mad";
-}
-
-use Test::More qw|no_plan|;
-use IO::Handle;
-
-use Nomad;
-
-sub p55 {
-    my ($input, $msg) = @_;
-
-    # perl5 to xml
-    open my $infile, "> tmp.in";
-    $infile->print($input);
-    close $infile;
-
-    unlink "tmp.xml";
-    `PERL_XMLDUMP='tmp.xml' ../perl -I ../lib tmp.in 2> tmp.err`;
-
-    if (-z "tmp.xml") {
-        return ok 0, "MAD dump failed $msg";
-    }
-    my $output = eval { Nomad::xml_to_p5( input => "tmp.xml" ) };
-    diag($@) if $@;
-    is($output, $input, $msg);
-}
-
-undef $/;
-my @prgs = split m/^########\n/m, <DATA>;
-
-use bytes;
-
-for my $prog (@prgs) {
-    my $msg = ($prog =~ s/^#(.*)\n//) && $1;
-    local $TODO = ($msg =~ /TODO/) ? 1 : 0;
-    p55($prog, $msg);
-}
-
-# Files
-use File::Find;
-use Test::Differences;
-
-our %failing = map { $_, 1 } qw|
-../t/comp/require.t
-
-../t/op/switch.t
-
-../t/op/attrhand.t
-
-../t/op/symbolcache.t
-
-../t/op/exec.t
-
-../t/op/state.t
-../t/op/each_array.t
-../t/lib/cygwin.t
-|;
-
-my @files;
-find( sub { push @files, $File::Find::name if m/[.]t$/ }, '../t/');
-
-for my $file (@files) {
-    my $input;
-    local $/ = undef;
-    local $TODO = (exists $failing{$file} ? "Known failure" : undef);
-    #warn $file;
-    open(my $fh, "<", "$file") or die "Failed open '../t/$file' $!";
-    $input = $fh->getline;
-    close $fh or die;
-
-    my $switches = "";
-    if( $input =~ m/^[#][!].*perl(.*)/) {
-        $switches = $1;
-    }
-
-    unlink "tmp.xml";
-    `PERL_XMLDUMP='tmp.xml' ../perl $switches -I ../lib $file 2> tmp.err`;
-
-    if (-z "tmp.xml") {
-        fail "MAD dump failure of '$file'";
-        next;
-    }
-    my $output = eval { Nomad::xml_to_p5( input => "tmp.xml" ) };
-    if ($@) {
-        fail "convert xml to p5 failed file: '$file'";
-        diag "error: $@";
-        next;
-    }
-    eq_or_diff $output, $input, "p55 '$file'";
-}
-
-__DATA__
-use strict;
-#ABC
-new Foo;
-Foo->new;
-########
-sub pi() { 3.14 }
-my $x = pi;
-########
--OS_Code => $a
-########
-use encoding 'euc-jp';
-tr/¤¡-¤ó¥¡-¥ó/¥¡-¥ó¤¡-¤ó/;
-########
-sub ok($$) { }
-BEGIN { ok(1, 2, ); }
-########
-for (my $i=0; $i<3; $i++) { }
-########
-for (; $a<3; $a++) { }
-########
-#
-s//$#foo/ge;
-########
-#
-s//m#.#/ge;
-########
-#
-eval { require 5.005 }
-########
-# Reduced test case from t/io/layers.t
-sub PerlIO::F_UTF8 () { 0x00008000 } # from perliol.h
-BEGIN { PerlIO::Layer->find("encoding",1);}
-########
-# from ../t/op/array.t
-$[ = 1
-########
-# from t/comp/parser.t
-$x = 1 for ($[) = 0;
-########
-# from t/op/getppid.t
-pipe my ($r, $w)
-########
-# TODO switch
-use feature 'switch';
-given(my $x = "bar") { }
-########
-# TODO attribute t/op/attrhand.t
-sub something : TypeCheck(
-    QNET::Util::Object,
-    QNET::Util::Object,
-    QNET::Util::Object
-) { #           WrongAttr (perl tokenizer bug)
-    # keep this ^ lined up !
-    return 42;
-}
-########
-# TODO symbol table t/op/symbolcache.t
-sub replaced2 { 'func' }
-BEGIN { undef $main::{replaced2} }
-########
-# TODO exit in begin block. from t/op/threads.t without threads
-BEGIN {
-    exit 0;
-}
-use foobar;
diff --git a/madly.c b/madly.c
deleted file mode 100644 (file)
index d703732..0000000
--- a/madly.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/*    madly.c
- *
- *    Copyright (c) 2004, 2005, 2006 Larry Wall and others
- *
- *    You may distribute under the terms of either the GNU General Public
- *    License or the Artistic License, as specified in the README file.
- * 
- * Note that this file is essentially empty, and just #includes perly.c,
- * to allow compilation of a second parser, Perl_madparse, that is
- * identical to Perl_yyparse, but which includes extra code for dumping
- * the parse tree.  This is controlled by the PERL_IN_MADLY_C define.
- */
-
-#define PERL_IN_MADLY_C
-
-#include "perly.c"
-
-/*
- * Local variables:
- * c-indentation-style: bsd
- * c-basic-offset: 4
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set ts=8 sts=4 sw=4 et:
- */
index c88bee8..83f0c91 100644 (file)
@@ -453,13 +453,6 @@ unless ($define{'PERL_TRACK_MEMPOOL'}) {
     ++$skip{PL_memory_debug_header};
 }
 
-unless ($define{PERL_MAD}) {
-    ++$skip{$_} foreach qw(
-                   PL_madskills
-                   PL_xmlfp
-                        );
-}
-
 unless ($define{'MULTIPLICITY'}) {
     ++$skip{$_} foreach qw(
                    PL_interp_size
diff --git a/op.c b/op.c
index be20c21..eb64b52 100644 (file)
--- a/op.c
+++ b/op.c
@@ -571,8 +571,6 @@ S_no_bareword_allowed(pTHX_ OP *o)
 {
     PERL_ARGS_ASSERT_NO_BAREWORD_ALLOWED;
 
-    if (PL_madskills)
-       return;         /* various ok barewords are hidden in extra OP_NULL */
     qerror(Perl_mess(aTHX_
                     "Bareword \"%"SVf"\" not allowed while \"strict subs\" in use",
                     SVfARG(cSVOPo_sv)));
@@ -786,19 +784,8 @@ Perl_op_clear(pTHX_ OP *o)
 
     PERL_ARGS_ASSERT_OP_CLEAR;
 
-#ifdef PERL_MAD
-    mad_free(o->op_madprop);
-    o->op_madprop = 0;
-#endif    
-
- retry:
     switch (o->op_type) {
     case OP_NULL:      /* Was holding old type, if any. */
-       if (PL_madskills && o->op_targ != OP_NULL) {
-           o->op_type = (Optype)o->op_targ;
-           o->op_targ = 0;
-           goto retry;
-       }
         /* FALLTHROUGH */
     case OP_ENTERTRY:
     case OP_ENTEREVAL: /* Was holding hints. */
@@ -1038,8 +1025,7 @@ Perl_op_null(pTHX_ OP *o)
 
     if (o->op_type == OP_NULL)
        return;
-    if (!PL_madskills)
-       op_clear(o);
+    op_clear(o);
     o->op_targ = o->op_type;
     o->op_type = OP_NULL;
     o->op_ppaddr = PL_ppaddr[OP_NULL];
@@ -1398,21 +1384,6 @@ Perl_scalarvoid(pTHX_ OP *o)
 
     PERL_ARGS_ASSERT_SCALARVOID;
 
-    /* trailing mad null ops don't count as "there" for void processing */
-    if (PL_madskills &&
-       o->op_type != OP_NULL &&
-       o->op_sibling &&
-       o->op_sibling->op_type == OP_NULL)
-    {
-       OP *sib;
-       for (sib = o->op_sibling;
-               sib && sib->op_type == OP_NULL;
-               sib = sib->op_sibling) ;
-       
-       if (!sib)
-           return o;
-    }
-
     if (o->op_type == OP_NEXTSTATE
        || o->op_type == OP_DBSTATE
        || (o->op_type == OP_NULL && (o->op_targ == OP_NEXTSTATE
@@ -1673,8 +1644,7 @@ Perl_scalarvoid(pTHX_ OP *o)
     case OP_AND:
        kid = cLOGOPo->op_first;
        if (kid->op_type == OP_NOT
-           && (kid->op_flags & OPf_KIDS)
-           && !PL_madskills) {
+           && (kid->op_flags & OPf_KIDS)) {
            if (o->op_type == OP_AND) {
                o->op_type = OP_OR;
                o->op_ppaddr = PL_ppaddr[OP_OR];
@@ -1885,23 +1855,6 @@ S_finalize_op(pTHX_ OP* o)
 {
     PERL_ARGS_ASSERT_FINALIZE_OP;
 
-#if defined(PERL_MAD) && defined(USE_ITHREADS)
-    {
-       /* Make sure mad ops are also thread-safe */
-       MADPROP *mp = o->op_madprop;
-       while (mp) {
-           if (mp->mad_type == MAD_OP && mp->mad_vlen) {
-               OP *prop_op = (OP *) mp->mad_val;
-               /* We only need "Relocate sv to the pad for thread safety.", but this
-                  easiest way to make sure it traverses everything */
-               if (prop_op->op_type == OP_CONST)
-                   cSVOPx(prop_op)->op_private &= ~OPpCONST_STRICT;
-               finalize_op(prop_op);
-           }
-           mp = mp->mad_next;
-       }
-    }
-#endif
 
     switch (o->op_type) {
     case OP_NEXTSTATE:
@@ -2132,7 +2085,7 @@ Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags)
        PL_modcount++;
        return o;
     case OP_STUB:
-       if ((o->op_flags & OPf_PARENS) || PL_madskills)
+       if ((o->op_flags & OPf_PARENS))
            break;
        goto nomod;
     case OP_ENTERSUB:
@@ -2635,10 +2588,6 @@ S_dup_attrlist(pTHX_ OP *o)
      */
     if (o->op_type == OP_CONST)
        rop = newSVOP(OP_CONST, o->op_flags, SvREFCNT_inc_NN(cSVOPo->op_sv));
-#ifdef PERL_MAD
-    else if (o->op_type == OP_NULL)
-       rop = NULL;
-#endif
     else {
        assert((o->op_type == OP_LIST) && (o->op_flags & OPf_KIDS));
        rop = NULL;
@@ -2898,10 +2847,6 @@ S_my_kid(pTHX_ OP *o, OP *attrs, OP **imopsp)
        return o;
 
     type = o->op_type;
-    if (PL_madskills && type == OP_NULL && o->op_flags & OPf_KIDS) {
-       (void)my_kid(cUNOPo->op_first, attrs, imopsp);
-       return o;
-    }
 
     if (type == OP_LIST) {
         OP *kid;
@@ -3614,14 +3559,7 @@ S_fold_constants(pTHX_ OP *o)
        CALLRUNOPS(aTHX);
        sv = *(PL_stack_sp--);
        if (o->op_targ && sv == PAD_SV(o->op_targ)) {   /* grab pad temp? */
-#ifdef PERL_MAD
-           /* Can't simply swipe the SV from the pad, because that relies on
-              the op being freed "real soon now". Under MAD, this doesn't
-              happen (see the #ifdef below).  */
-           sv = newSVsv(sv);
-#else
            pad_swipe(o->op_targ,  FALSE);
-#endif
        }
        else if (SvTEMP(sv)) {                  /* grab mortal temp? */
            SvREFCNT_inc_simple_void(sv);
@@ -3655,9 +3593,7 @@ S_fold_constants(pTHX_ OP *o)
     if (ret)
        goto nope;
 
-#ifndef PERL_MAD
     op_free(o);
-#endif
     assert(sv);
     if (type == OP_STRINGIFY) SvPADTMP_off(sv);
     else if (!SvIMMORTAL(sv)) {
@@ -3671,7 +3607,6 @@ S_fold_constants(pTHX_ OP *o)
        newop = newSVOP(OP_CONST, 0, MUTABLE_SV(sv));
        if (type != OP_STRINGIFY) newop->op_folded = 1;
     }
-    op_getmad(o,newop,'f');
     return newop;
 
  nope:
@@ -3718,11 +3653,7 @@ S_gen_constant_list(pTHX_ OP *o)
            SvPADTMP_on(*svp);
            SvREADONLY_on(*svp);
        }
-#ifdef PERL_MAD
-    op_getmad(curop,o,'O');
-#else
     op_free(curop);
-#endif
     LINKLIST(o);
     return list(o);
 }
@@ -3834,21 +3765,6 @@ Perl_op_append_list(pTHX_ I32 type, OP *first, OP *last)
     ((LISTOP*)first)->op_last = ((LISTOP*)last)->op_last;
     first->op_flags |= (last->op_flags & OPf_KIDS);
 
-#ifdef PERL_MAD
-    if (((LISTOP*)last)->op_first && first->op_madprop) {
-       MADPROP *mp = ((LISTOP*)last)->op_first->op_madprop;
-       if (mp) {
-           while (mp->mad_next)
-               mp = mp->mad_next;
-           mp->mad_next = first->op_madprop;
-       }
-       else {
-           ((LISTOP*)last)->op_first->op_madprop = first->op_madprop;
-       }
-    }
-    first->op_madprop = last->op_madprop;
-    last->op_madprop = 0;
-#endif
 
     S_op_destroy(aTHX_ last);
 
@@ -3901,251 +3817,6 @@ Perl_op_prepend_elem(pTHX_ I32 type, OP *first, OP *last)
 
 /* Constructors */
 
-#ifdef PERL_MAD
-TOKEN *
-Perl_newTOKEN(pTHX_ I32 optype, YYSTYPE lval, MADPROP* madprop)
-{
-    TOKEN *tk;
-    Newxz(tk, 1, TOKEN);
-    tk->tk_type = (OPCODE)optype;
-    tk->tk_type = 12345;
-    tk->tk_lval = lval;
-    tk->tk_mad = madprop;
-    return tk;
-}
-
-void
-Perl_token_free(pTHX_ TOKEN* tk)
-{
-    PERL_ARGS_ASSERT_TOKEN_FREE;
-
-    if (tk->tk_type != 12345)
-       return;
-    mad_free(tk->tk_mad);
-    Safefree(tk);
-}
-
-void
-Perl_token_getmad(pTHX_ TOKEN* tk, OP* o, char slot)
-{
-    MADPROP* mp;
-    MADPROP* tm;
-
-    PERL_ARGS_ASSERT_TOKEN_GETMAD;
-
-    if (tk->tk_type != 12345) {
-       Perl_warner(aTHX_ packWARN(WARN_MISC),
-            "Invalid TOKEN object ignored");
-       return;
-    }
-    tm = tk->tk_mad;
-    if (!tm)
-       return;
-
-    /* faked up qw list? */
-    if (slot == '(' &&
-       tm->mad_type == MAD_SV &&
-       SvPVX((SV *)tm->mad_val)[0] == 'q')
-           slot = 'x';
-
-    if (o) {
-       mp = o->op_madprop;
-       if (mp) {
-           for (;;) {
-               /* pretend constant fold didn't happen? */
-               if (mp->mad_key == 'f' &&
-                   (o->op_type == OP_CONST ||
-                    o->op_type == OP_GV) )
-               {
-                   token_getmad(tk,(OP*)mp->mad_val,slot);
-                   return;
-               }
-               if (!mp->mad_next)
-                   break;
-               mp = mp->mad_next;
-           }
-           mp->mad_next = tm;
-           mp = mp->mad_next;
-       }
-       else {
-           o->op_madprop = tm;
-           mp = o->op_madprop;
-       }
-       if (mp->mad_key == 'X')
-           mp->mad_key = slot; /* just change the first one */
-
-       tk->tk_mad = 0;
-    }
-    else
-       mad_free(tm);
-    Safefree(tk);
-}
-
-void
-Perl_op_getmad_weak(pTHX_ OP* from, OP* o, char slot)
-{
-    MADPROP* mp;
-    if (!from)
-       return;
-    if (o) {
-       mp = o->op_madprop;
-       if (mp) {
-           for (;;) {
-               /* pretend constant fold didn't happen? */
-               if (mp->mad_key == 'f' &&
-                   (o->op_type == OP_CONST ||
-                    o->op_type == OP_GV) )
-               {
-                   op_getmad(from,(OP*)mp->mad_val,slot);
-                   return;
-               }
-               if (!mp->mad_next)
-                   break;
-               mp = mp->mad_next;
-           }
-           mp->mad_next = newMADPROP(slot,MAD_OP,from,0);
-       }
-       else {
-           o->op_madprop = newMADPROP(slot,MAD_OP,from,0);
-       }
-    }
-}
-
-void
-Perl_op_getmad(pTHX_ OP* from, OP* o, char slot)
-{
-    MADPROP* mp;
-    if (!from)
-       return;
-    if (o) {
-       mp = o->op_madprop;
-       if (mp) {
-           for (;;) {
-               /* pretend constant fold didn't happen? */
-               if (mp->mad_key == 'f' &&
-                   (o->op_type == OP_CONST ||
-                    o->op_type == OP_GV) )
-               {
-                   op_getmad(from,(OP*)mp->mad_val,slot);
-                   return;
-               }
-               if (!mp->mad_next)
-                   break;
-               mp = mp->mad_next;
-           }
-           mp->mad_next = newMADPROP(slot,MAD_OP,from,1);
-       }
-       else {
-           o->op_madprop = newMADPROP(slot,MAD_OP,from,1);
-       }
-    }
-    else {
-       PerlIO_printf(PerlIO_stderr(),
-                     "DESTROYING op = %0"UVxf"\n", PTR2UV(from));
-       op_free(from);
-    }
-}
-
-void
-Perl_prepend_madprops(pTHX_ MADPROP* mp, OP* o, char slot)
-{
-    MADPROP* tm;
-    if (!mp || !o)
-       return;
-    if (slot)
-       mp->mad_key = slot;
-    tm = o->op_madprop;
-    o->op_madprop = mp;
-    for (;;) {
-       if (!mp->mad_next)
-           break;
-       mp = mp->mad_next;
-    }
-    mp->mad_next = tm;
-}
-
-void
-Perl_append_madprops(pTHX_ MADPROP* tm, OP* o, char slot)
-{
-    if (!o)
-       return;
-    addmad(tm, &(o->op_madprop), slot);
-}
-
-void
-Perl_addmad(pTHX_ MADPROP* tm, MADPROP** root, char slot)
-{
-    MADPROP* mp;
-    if (!tm || !root)
-       return;
-    if (slot)
-       tm->mad_key = slot;
-    mp = *root;
-    if (!mp) {
-       *root = tm;
-       return;
-    }
-    for (;;) {
-       if (!mp->mad_next)
-           break;
-       mp = mp->mad_next;
-    }
-    mp->mad_next = tm;
-}
-
-MADPROP *
-Perl_newMADsv(pTHX_ char key, SV* sv)
-{
-    PERL_ARGS_ASSERT_NEWMADSV;
-
-    return newMADPROP(key, MAD_SV, sv, 0);
-}
-
-MADPROP *
-Perl_newMADPROP(pTHX_ char key, char type, void* val, I32 vlen)
-{
-    MADPROP *const mp = (MADPROP *) PerlMemShared_malloc(sizeof(MADPROP));
-    mp->mad_next = 0;
-    mp->mad_key = key;
-    mp->mad_vlen = vlen;
-    mp->mad_type = type;
-    mp->mad_val = val;
-/*    PerlIO_printf(PerlIO_stderr(), "NEW  mp = %0x\n", mp);  */
-    return mp;
-}
-
-void
-Perl_mad_free(pTHX_ MADPROP* mp)
-{
-/*    PerlIO_printf(PerlIO_stderr(), "FREE mp = %0x\n", mp); */
-    if (!mp)
-       return;
-    if (mp->mad_next)
-       mad_free(mp->mad_next);
-/*    if (PL_parser && PL_parser->lex_state != LEX_NOTPARSING && mp->mad_vlen)
-       PerlIO_printf(PerlIO_stderr(), "DESTROYING '%c'=<%s>\n", mp->mad_key & 255, mp->mad_val); */
-    switch (mp->mad_type) {
-    case MAD_NULL:
-       break;
-    case MAD_PV:
-       Safefree(mp->mad_val);
-       break;
-    case MAD_OP:
-       if (mp->mad_vlen)       /* vlen holds "strong/weak" boolean */
-           op_free((OP*)mp->mad_val);
-       break;
-    case MAD_SV:
-       sv_free(MUTABLE_SV(mp->mad_val));
-       break;
-    default:
-       PerlIO_printf(PerlIO_stderr(), "Unrecognized mad\n");
-       break;
-    }
-    PerlMemShared_free(mp);
-}
-
-#endif
 
 /*
 =head1 Optree construction
@@ -4386,10 +4057,6 @@ S_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
     dVAR;
     SV * const tstr = ((SVOP*)expr)->op_sv;
     SV * const rstr =
-#ifdef PERL_MAD
-                       (repl->op_type == OP_NULL)
-                           ? ((SVOP*)((LISTOP*)repl)->op_first)->op_sv :
-#endif
                              ((SVOP*)repl)->op_sv;
     STRLEN tlen;
     STRLEN rlen;
@@ -4620,13 +4287,8 @@ S_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
        Safefree(tsave);
        Safefree(rsave);
 
-#ifdef PERL_MAD
-       op_getmad(expr,o,'e');
-       op_getmad(repl,o,'r');
-#else
        op_free(expr);
        op_free(repl);
-#endif
        return o;
     }
 
@@ -4711,13 +4373,8 @@ S_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
 
     if (grows)
        o->op_private |= OPpTRANS_GROWS;
-#ifdef PERL_MAD
-    op_getmad(expr,o,'e');
-    op_getmad(repl,o,'r');
-#else
     op_free(expr);
     op_free(repl);
-#endif
 
     return o;
 }
@@ -4969,11 +4626,7 @@ Perl_pmruntime(pTHX_ OP *o, OP *expr, bool isreg, I32 floor)
                    : Perl_re_op_compile(aTHX_ NULL, 0, expr, eng, NULL, NULL,
                                        rx_flags, pm->op_pmflags)
            );
-#ifdef PERL_MAD
-           op_getmad(expr,(OP*)pm,'e');
-#else
            op_free(expr);
-#endif
        }
        else {
            /* compile-time pattern that includes literal code blocks */
@@ -5316,18 +4969,11 @@ Perl_newPVOP(pTHX_ I32 type, I32 flags, char *pv)
     return CHECKOP(type, pvop);
 }
 
-#ifdef PERL_MAD
-OP*
-#else
 void
-#endif
 Perl_package(pTHX_ OP *o)
 {
     dVAR;
     SV *const sv = cSVOPo->op_sv;
-#ifdef PERL_MAD
-    OP *pegop;
-#endif
 
     PERL_ARGS_ASSERT_PACKAGE;
 
@@ -5342,18 +4988,7 @@ Perl_package(pTHX_ OP *o)
     PL_parser->copline = NOLINE;
     PL_parser->expect = XSTATE;
 
-#ifndef PERL_MAD
     op_free(o);
-#else
-    if (!PL_madskills) {
-       op_free(o);
-       return NULL;
-    }
-
-    pegop = newOP(OP_NULL,0);
-    op_getmad(o,pegop,'P');
-    return pegop;
-#endif
 }
 
 void
@@ -5368,20 +5003,13 @@ Perl_package_version( pTHX_ OP *v )
     op_free(v);
 }
 
-#ifdef PERL_MAD
-OP*
-#else
 void
-#endif
 Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *idop, OP *arg)
 {
     dVAR;
     OP *pack;
     OP *imop;
     OP *veop;
-#ifdef PERL_MAD
-    OP *pegop = PL_madskills ? newOP(OP_NULL,0) : NULL;
-#endif
     SV *use_version = NULL;
 
     PERL_ARGS_ASSERT_UTILIZE;
@@ -5389,16 +5017,11 @@ Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *idop, OP *arg)
     if (idop->op_type != OP_CONST)
        Perl_croak(aTHX_ "Module name must be constant");
 
-    if (PL_madskills)
-       op_getmad(idop,pegop,'U');
-
     veop = NULL;
 
     if (version) {
        SV * const vesv = ((SVOP*)version)->op_sv;
 
-       if (PL_madskills)
-           op_getmad(version,pegop,'V');
        if (!arg && !SvNIOKp(vesv)) {
            arg = version;
        }
@@ -5423,8 +5046,6 @@ Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *idop, OP *arg)
 
     /* Fake up an import/unimport */
     if (arg && arg->op_type == OP_STUB) {
-       if (PL_madskills)
-           op_getmad(arg,pegop,'S');
        imop = arg;             /* no import on explicit () */
     }
     else if (SvNIOKp(((SVOP*)idop)->op_sv)) {
@@ -5437,9 +5058,6 @@ Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *idop, OP *arg)
     else {
        SV *meth;
 
-       if (PL_madskills)
-           op_getmad(arg,pegop,'A');
-
        /* Make copy of idop so we don't free it twice */
        pack = newSVOP(OP_CONST, 0, newSVsv(((SVOP*)idop)->op_sv));
 
@@ -5514,9 +5132,6 @@ Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *idop, OP *arg)
     if (PL_cop_seqmax == PERL_PADSEQ_INTRO) /* not a legal value */
        PL_cop_seqmax++;
 
-#ifdef PERL_MAD
-    return pegop;
-#endif
 }
 
 /*
@@ -5910,7 +5525,7 @@ Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right)
            LINKLIST(o);
        }
 
-       if (right && right->op_type == OP_SPLIT && !PL_madskills) {
+       if (right && right->op_type == OP_SPLIT) {
            OP* tmpop = ((LISTOP*)right)->op_first;
            if (tmpop && (tmpop->op_type == OP_PUSHRE)) {
                PMOP * const pm = (PMOP*)tmpop;
@@ -6211,7 +5826,7 @@ S_new_logop(pTHX_ I32 type, I32 flags, OP** firstp, OP** otherp)
        && (first->op_flags & OPf_KIDS)
        && ((first->op_flags & OPf_SPECIAL) /* unless ($x) { } */
            || (other->op_type == OP_NOT))  /* if (!$x && !$y) { } */
-       && !PL_madskills) {
+       ) {
        if (type == OP_AND || type == OP_OR) {
            if (type == OP_AND)
                type = OP_OR;
@@ -6236,12 +5851,6 @@ S_new_logop(pTHX_ I32 type, I32 flags, OP** firstp, OP** otherp)
            *firstp = NULL;
            if (other->op_type == OP_CONST)
                other->op_private |= OPpCONST_SHORTCIRCUIT;
-           if (PL_madskills) {
-               OP *newop = newUNOP(OP_NULL, 0, other);
-               op_getmad(first, newop, '1');
-               newop->op_targ = type;  /* set "was" field */
-               return newop;
-           }
            op_free(first);
            if (other->op_type == OP_LEAVE)
                other = newUNOP(OP_NULL, OPf_SPECIAL, other);
@@ -6276,13 +5885,7 @@ S_new_logop(pTHX_ I32 type, I32 flags, OP** firstp, OP** otherp)
            *otherp = NULL;
            if (cstop->op_type == OP_CONST)
                cstop->op_private |= OPpCONST_SHORTCIRCUIT;
-           if (PL_madskills) {
-               first = newUNOP(OP_NULL, 0, first);
-               op_getmad(other, first, '2');
-               first->op_targ = type;  /* set "was" field */
-           }
-           else
-               op_free(other);
+               op_free(other);
            return first;
        }
     }
@@ -6397,15 +6000,8 @@ Perl_newCONDOP(pTHX_ I32 flags, OP *first, OP *trueop, OP *falseop)
            cstop->op_private & OPpCONST_STRICT) {
            no_bareword_allowed(cstop);
        }
-       if (PL_madskills) {
-           /* This is all dead code when PERL_MAD is not defined.  */
-           live = newUNOP(OP_NULL, 0, live);
-           op_getmad(first, live, 'C');
-           op_getmad(dead, live, left ? 'e' : 't');
-       } else {
-           op_free(first);
-           op_free(dead);
-       }
+        op_free(first);
+        op_free(dead);
        if (live->op_type == OP_LEAVE)
            live = newUNOP(OP_NULL, OPf_SPECIAL, live);
        else if (live->op_type == OP_MATCH || live->op_type == OP_SUBST
@@ -6767,7 +6363,6 @@ Perl_newFOROP(pTHX_ I32 flags, OP *sv, OP *expr, OP *block, OP *cont)
     PADOFFSET padoff = 0;
     I32 iterflags = 0;
     I32 iterpflags = 0;
-    OP *madsv = NULL;
 
     PERL_ARGS_ASSERT_NEWFOROP;
 
@@ -6790,12 +6385,8 @@ Perl_newFOROP(pTHX_ I32 flags, OP *sv, OP *expr, OP *block, OP *cont)
        else if (sv->op_type == OP_PADSV) { /* private variable */
            iterpflags = sv->op_private & OPpLVAL_INTRO; /* for my $x () */
            padoff = sv->op_targ;
-           if (PL_madskills)
-               madsv = sv;
-           else {
-               sv->op_targ = 0;
-               op_free(sv);
-           }
+            sv->op_targ = 0;
+            op_free(sv);
            sv = NULL;
        }
        else
@@ -6846,11 +6437,7 @@ Perl_newFOROP(pTHX_ I32 flags, OP *sv, OP *expr, OP *block, OP *cont)
        right->op_next = (OP*)listop;
        listop->op_next = listop->op_first;
 
-#ifdef PERL_MAD
-       op_getmad(expr,(OP*)listop,'O');
-#else
        op_free(expr);
-#endif
        expr = (OP*)(listop);
         op_null(expr);
        iterflags |= OPf_STACKED;
@@ -6879,8 +6466,6 @@ Perl_newFOROP(pTHX_ I32 flags, OP *sv, OP *expr, OP *block, OP *cont)
        loop = (LOOP*)PerlMemShared_realloc(loop, sizeof(LOOP));
     loop->op_targ = padoff;
     wop = newWHILEOP(flags, 1, loop, newOP(OP_ITER, 0), block, cont, 0);
-    if (madsv)
-       op_getmad(madsv, (OP*)loop, 'v');
     return wop;
 }
 
@@ -6933,11 +6518,7 @@ Perl_newLOOPEX(pTHX_ I32 type, OP *label)
     
     /* If we have already created an op, we do not need the label. */
     if (o)
-#ifdef PERL_MAD
-               op_getmad(label,o,'L');
-#else
                op_free(label);
-#endif
     else o = newUNOP(type, OPf_STACKED, label);
 
     PL_hints |= HINT_BLOCK_SCOPE;
@@ -7298,9 +6879,6 @@ Perl_op_const_sv(pTHX_ const OP *o, CV *cv)
     dVAR;
     SV *sv = NULL;
 
-    if (PL_madskills)
-       return NULL;
-
     if (!o)
        return NULL;
 
@@ -7362,9 +6940,6 @@ S_already_defined(pTHX_ CV *const cv, OP * const block, OP * const o,
     assert (o || name);
     assert (const_svp);
     if ((!block
-#ifdef PERL_MAD
-        || block->op_type == OP_NULL
-#endif
         )) {
        if (CvFLAGS(PL_compcv)) {
            /* might have had built-in attrs applied */
@@ -7402,13 +6977,7 @@ S_already_defined(pTHX_ CV *const cv, OP * const block, OP * const o,
        SvREFCNT_inc_simple_void_NN(PL_compcv);
        CopLINE_set(PL_curcop, oldline);
     }
-#ifdef PERL_MAD
-    if (!PL_minus_c)   /* keep old one around for madskills */
-#endif
-    {
-       /* (PL_madskills unset in used file.) */
-       SAVEFREESV(cv);
-    }
+    SAVEFREESV(cv);
     return TRUE;
 }
 
@@ -7464,12 +7033,10 @@ Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
     else
        ps = NULL;
 
-    if (!PL_madskills) {
-       if (proto)
-           SAVEFREEOP(proto);
-       if (attrs)
-           SAVEFREEOP(attrs);
-    }
+    if (proto)
+        SAVEFREEOP(proto);
+    if (attrs)
+        SAVEFREEOP(attrs);
 
     if (PL_parser && PL_parser->error_count) {
        op_free(block);
@@ -7512,9 +7079,6 @@ Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
 
     if (!block || !ps || *ps || attrs
        || (CvFLAGS(compcv) & CVf_BUILTIN_ATTRS)
-#ifdef PERL_MAD
-       || block->op_type == OP_NULL
-#endif
        )
        const_sv = NULL;
     else
@@ -7563,8 +7127,6 @@ Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
        CvXSUB(cv) = const_sv_xsub;
        CvCONST_on(cv);
        CvISXSUB_on(cv);
-       if (PL_madskills)
-           goto install_block;
        op_free(block);
        SvREFCNT_dec(compcv);
        PL_compcv = NULL;
@@ -7585,9 +7147,6 @@ Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
     if (cv) {  /* must reuse cv in case stub is referenced elsewhere */
        /* transfer PL_compcv to cv */
        if (block
-#ifdef PERL_MAD
-                  && block->op_type != OP_NULL
-#endif
        ) {
            cv_flags_t preserved_flags =
                CvFLAGS(cv) & (CVf_BUILTIN_ATTRS|CVf_NAMED);
@@ -7651,7 +7210,6 @@ Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
         if ( ps_utf8 ) SvUTF8_on(MUTABLE_SV(cv));
     }
 
- install_block:
     if (!block)
        goto attrs;
 
@@ -7664,11 +7222,7 @@ Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
     /* This makes sub {}; work as expected.  */
     if (block->op_type == OP_STUB) {
            OP* const newblock = newSTATEOP(0, NULL, 0);
-#ifdef PERL_MAD
-           op_getmad(block,newblock,'B');
-#else
            op_free(block);
-#endif
            block = newblock;
     }
     CvROOT(cv) = CvLVALUE(cv)
@@ -7786,8 +7340,7 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
        store it.  */
     const I32 gv_fetch_flags
        = ec ? GV_NOADD_NOINIT :
-        (block || attrs || (CvFLAGS(PL_compcv) & CVf_BUILTIN_ATTRS)
-          || PL_madskills)
+        (block || attrs || (CvFLAGS(PL_compcv) & CVf_BUILTIN_ATTRS))
        ? GV_ADDMULTI : GV_ADDMULTI | GV_NOINIT;
     STRLEN namlen = 0;
     const char * const name =
@@ -7831,14 +7384,12 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
     else
        ps = NULL;
 
-    if (!PL_madskills) {
-       if (o)
-           SAVEFREEOP(o);
-       if (proto)
-           SAVEFREEOP(proto);
-       if (attrs)
-           SAVEFREEOP(attrs);
-    }
+    if (o)
+        SAVEFREEOP(o);
+    if (proto)
+        SAVEFREEOP(proto);
+    if (attrs)
+        SAVEFREEOP(attrs);
 
     if (ec) {
        op_free(block);
@@ -7885,9 +7436,6 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
 
     if (!block || !ps || *ps || attrs
        || (CvFLAGS(PL_compcv) & CVf_BUILTIN_ATTRS)
-#ifdef PERL_MAD
-       || block->op_type == OP_NULL
-#endif
        )
        const_sv = NULL;
     else
@@ -7933,8 +7481,6 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
                const_sv
            );
        }
-       if (PL_madskills)
-           goto install_block;
        op_free(block);
        SvREFCNT_dec(PL_compcv);
        PL_compcv = NULL;
@@ -7943,9 +7489,6 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
     if (cv) {                          /* must reuse cv if autoloaded */
        /* transfer PL_compcv to cv */
        if (block
-#ifdef PERL_MAD
-                  && block->op_type != OP_NULL
-#endif
        ) {
            cv_flags_t existing_builtin_attrs = CvFLAGS(cv) & CVf_BUILTIN_ATTRS;
            PADLIST *const temp_av = CvPADLIST(cv);
@@ -8010,7 +7553,6 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
         if ( ps_utf8 ) SvUTF8_on(MUTABLE_SV(cv));
     }
 
- install_block:
     if (!block)
        goto attrs;
 
@@ -8023,11 +7565,7 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
     /* This makes sub {}; work as expected.  */
     if (block->op_type == OP_STUB) {
            OP* const newblock = newSTATEOP(0, NULL, 0);
-#ifdef PERL_MAD
-           op_getmad(block,newblock,'B');
-#else
            op_free(block);
-#endif
            block = newblock;
     }
     CvROOT(cv) = CvLVALUE(cv)
@@ -8395,18 +7933,11 @@ Perl_newXS(pTHX_ const char *name, XSUBADDR_t subaddr, const char *filename)
     );
 }
 
-#ifdef PERL_MAD
-OP *
-#else
 void
-#endif
 Perl_newFORM(pTHX_ I32 floor, OP *o, OP *block)
 {
     dVAR;
     CV *cv;
-#ifdef PERL_MAD
-    OP* pegop = newOP(OP_NULL, 0);
-#endif
 
     GV *gv;
 
@@ -8455,18 +7986,10 @@ Perl_newFORM(pTHX_ I32 floor, OP *o, OP *block)
     cv_forget_slab(cv);
 
   finish:
-#ifdef PERL_MAD
-    op_getmad(o,pegop,'n');
-    op_getmad_weak(block, pegop, 'b');
-#else
     op_free(o);
-#endif
     if (PL_parser)
        PL_parser->copline = NOLINE;
     LEAVE_SCOPE(floor);
-#ifdef PERL_MAD
-    return pegop;
-#endif
 }
 
 OP *
@@ -8632,8 +8155,7 @@ Perl_ck_anoncode(pTHX_ OP *o)
     PERL_ARGS_ASSERT_CK_ANONCODE;
 
     cSVOPo->op_targ = pad_add_anon((CV*)cSVOPo->op_sv, o->op_type);
-    if (!PL_madskills)
-       cSVOPo->op_sv = NULL;
+    cSVOPo->op_sv = NULL;
     return o;
 }
 
@@ -8697,11 +8219,7 @@ Perl_ck_backtick(pTHX_ OP *o)
     else if (!(o->op_flags & OPf_KIDS))
        newop = newUNOP(OP_BACKTICK, 0, newDEFSVOP());
     if (newop) {
-#ifdef PERL_MAD
-       op_getmad(o,newop,'O');
-#else
        op_free(o);
-#endif
        return newop;
     }
     S_io_hints(aTHX_ o);
@@ -8801,11 +8319,7 @@ Perl_ck_spair(pTHX_ OP *o)
                    type == OP_RV2AV || type == OP_RV2HV)
                return o;
        }
-#ifdef PERL_MAD
-       op_getmad(kUNOP->op_first,newop,'K');
-#else
        op_free(kUNOP->op_first);
-#endif
        kUNOP->op_first = newop;
     }
     /* transforms OP_REFGEN into OP_SREFGEN, OP_CHOP into OP_SCHOP,
@@ -8864,11 +8378,7 @@ Perl_ck_eof(pTHX_ OP *o)
        if (cLISTOPo->op_first->op_type == OP_STUB) {
            OP * const newop
                = newUNOP(o->op_type, OPf_SPECIAL, newGVOP(OP_GV, 0, PL_argvgv));
-#ifdef PERL_MAD
-           op_getmad(o,newop,'O');
-#else
            op_free(o);
-#endif
            o = newop;
        }
        o = ck_fun(o);
@@ -8893,14 +8403,9 @@ Perl_ck_eval(pTHX_ OP *o)
 
        if (kid->op_type == OP_LINESEQ || kid->op_type == OP_STUB) {
            LOGOP *enter;
-#ifdef PERL_MAD
-           OP* const oldo = o;
-#endif
 
            cUNOPo->op_first = 0;
-#ifndef PERL_MAD
            op_free(o);
-#endif
 
            NewOp(1101, enter, 1, LOGOP);
            enter->op_type = OP_ENTERTRY;
@@ -8914,7 +8419,6 @@ Perl_ck_eval(pTHX_ OP *o)
            o->op_type = OP_LEAVETRY;
            o->op_ppaddr = PL_ppaddr[OP_LEAVETRY];
            enter->op_other = o;
-           op_getmad(oldo,o,'O');
            return o;
        }
        else {
@@ -8924,13 +8428,8 @@ Perl_ck_eval(pTHX_ OP *o)
     }
     else {
        const U8 priv = o->op_private;
-#ifdef PERL_MAD
-       OP* const oldo = o;
-#else
        op_free(o);
-#endif
        o = newUNOP(OP_ENTEREVAL, priv <<8, newDEFSVOP());
-       op_getmad(oldo,o,'O');
     }
     o->op_targ = (PADOFFSET)PL_hints;
     if (o->op_private & OPpEVAL_BYTES) o->op_targ &= ~HINT_UTF8;
@@ -9123,11 +8622,7 @@ Perl_ck_ftst(pTHX_ OP *o)
         && !kid->op_folded) {
            OP * const newop = newGVOP(type, OPf_REF,
                gv_fetchsv(kid->op_sv, GV_ADD, SVt_PVIO));
-#ifdef PERL_MAD
-           op_getmad(o,newop,'O');
-#else
            op_free(o);
-#endif
            return newop;
        }
        if ((PL_hints & HINT_FILETEST_ACCESS) && OP_IS_FILETEST_ACCESS(o->op_type))
@@ -9144,16 +8639,11 @@ Perl_ck_ftst(pTHX_ OP *o)
        }
     }
     else {
-#ifdef PERL_MAD
-       OP* const oldo = o;
-#else
        op_free(o);
-#endif
        if (type == OP_FTTTY)
            o = newGVOP(type, OPf_REF, PL_stdingv);
        else
            o = newUNOP(type, 0, newDEFSVOP());
-       op_getmad(oldo,o,'O');
     }
     return o;
 }
@@ -9208,12 +8698,6 @@ Perl_ck_fun(pTHX_ OP *o)
 
            numargs++;
            sibl = kid->op_sibling;
-#ifdef PERL_MAD
-           if (!sibl && kid->op_type == OP_STUB) {
-               numargs--;
-               break;
-           }
-#endif
            switch (oa & 7) {
            case OA_SCALAR:
                /* list seen where single (scalar) arg expected? */
@@ -9281,11 +8765,7 @@ Perl_ck_fun(pTHX_ OP *o)
                        if (!(o->op_private & 1) && /* if not unop */
                            kid == cLISTOPo->op_last)
                            cLISTOPo->op_last = newop;
-#ifdef PERL_MAD
-                       op_getmad(kid,newop,'K');
-#else
                        op_free(kid);
-#endif
                        kid = newop;
                    }
                    else if (kid->op_type == OP_READLINE) {
@@ -9407,28 +8887,17 @@ Perl_ck_fun(pTHX_ OP *o)
            tokid = &kid->op_sibling;
            kid = kid->op_sibling;
        }
-#ifdef PERL_MAD
-       if (kid && kid->op_type != OP_STUB)
-           return too_many_arguments_pv(o,OP_DESC(o), 0);
-       o->op_private |= numargs;
-#else
-       /* FIXME - should the numargs move as for the PERL_MAD case?  */
+       /* FIXME - should the numargs or-ing move after the too many
+         * arguments check? */
        o->op_private |= numargs;
        if (kid)
            return too_many_arguments_pv(o,OP_DESC(o), 0);
-#endif
        listkids(o);
     }
     else if (PL_opargs[type] & OA_DEFGV) {
-#ifdef PERL_MAD
-       OP *newop = newUNOP(type, 0, newDEFSVOP());
-       op_getmad(o,newop,'O');
-       return newop;
-#else
        /* Ordering of these two is important to keep f_map.t passing.  */
        op_free(o);
        return newUNOP(type, 0, newDEFSVOP());
-#endif
     }
 
     if (oa) {
@@ -9628,11 +9097,7 @@ Perl_ck_readline(pTHX_ OP *o)
     else {
        OP * const newop
            = newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, PL_argvgv));
-#ifdef PERL_MAD
-       op_getmad(o,newop,'O');
-#else
        op_free(o);
-#endif
        return newop;
     }
     return o;
@@ -9724,8 +9189,6 @@ Perl_ck_sassign(pTHX_ OP *o)
        && !(kid->op_flags & OPf_STACKED)
        /* Cannot steal the second time! */
        && !(kid->op_private & OPpTARGET_MY)
-       /* Keep the full thing for madskills */
-       && !PL_madskills
        )
     {
        OP * const kkid = kid->op_sibling;
@@ -9820,11 +9283,7 @@ Perl_ck_method(pTHX_ OP *o)
                kSVOP->op_sv = NULL;
            }
            cmop = newSVOP(OP_METHOD_NAMED, 0, sv);
-#ifdef PERL_MAD
-           op_getmad(o,cmop,'O');
-#else
            op_free(o);
-#endif
            return cmop;
        }
     }
@@ -9934,11 +9393,8 @@ Perl_ck_require(pTHX_ OP *o)
        else {
            kid = newDEFSVOP();
        }
-#ifndef PERL_MAD
        op_free(o);
-#endif
        newop = S_new_entersubop(aTHX_ gv, kid);
-       op_getmad(o,newop,'O');
        return newop;
     }
 
@@ -10003,17 +9459,8 @@ Perl_ck_shift(pTHX_ OP *o)
        }
 
        argop = newUNOP(OP_RV2AV, 0, scalar(newGVOP(OP_GV, 0, PL_argvgv)));
-#ifdef PERL_MAD
-       {
-           OP * const oldo = o;
-           o = newUNOP(type, 0, scalar(argop));
-           op_getmad(oldo,o,'O');
-           return o;
-       }
-#else
        op_free(o);
        return newUNOP(type, 0, scalar(argop));
-#endif
     }
     return scalar(ck_fun(o));
 }
@@ -10182,11 +9629,7 @@ S_simplify_sort(pTHX_ OP *o)
        o->op_private |= OPpSORT_NUMERIC | OPpSORT_INTEGER;
     kid = cLISTOPo->op_first->op_sibling;
     cLISTOPo->op_first->op_sibling = kid->op_sibling; /* bypass old block */
-#ifdef PERL_MAD
-    op_getmad(kid,o,'S');                            /* then delete it */
-#else
     op_free(kid);                                    /* then delete it */
-#endif
 }
 
 OP *
@@ -10410,10 +9853,8 @@ Perl_ck_entersub_args_list(pTHX_ OP *entersubop)
     if (!aop->op_sibling)
        aop = cUNOPx(aop)->op_first;
     for (aop = aop->op_sibling; aop->op_sibling; aop = aop->op_sibling) {
-       if (!(PL_madskills && aop->op_type == OP_STUB)) {
-           list(aop);
-           op_lvalue(aop, OP_ENTERSUB);
-       }
+        list(aop);
+        op_lvalue(aop, OP_ENTERSUB);
     }
     return entersubop;
 }
@@ -10472,15 +9913,7 @@ Perl_ck_entersub_args_proto(pTHX_ OP *entersubop, GV *namegv, SV *protosv)
     aop = aop->op_sibling;
     for (cvop = aop; cvop->op_sibling; cvop = cvop->op_sibling) ;
     while (aop != cvop) {
-       OP* o3;
-       if (PL_madskills && aop->op_type == OP_STUB) {
-           aop = aop->op_sibling;
-           continue;
-       }
-       if (PL_madskills && aop->op_type == OP_NULL)
-           o3 = ((UNOP*)aop)->op_first;
-       else
-           o3 = aop;
+       OP* o3 = aop;
 
        if (proto >= proto_end)
            return too_many_arguments_sv(entersubop, gv_ename(namegv), 0);
@@ -10537,14 +9970,9 @@ Perl_ck_entersub_args_proto(pTHX_ OP *entersubop, GV *namegv, SV *protosv)
                                GV * const gv = cGVOPx_gv(gvop);
                                OP * const sibling = aop->op_sibling;
                                SV * const n = newSVpvs("");
-#ifdef PERL_MAD
-                               OP * const oldaop = aop;
-#else
                                op_free(aop);
-#endif
                                gv_fullname4(n, gv, "", FALSE);
                                aop = newSVOP(OP_CONST, 0, n);
-                               op_getmad(oldaop,aop,'O');
                                prev->op_sibling = aop;
                                aop->op_sibling = sibling;
                            }
@@ -10744,9 +10172,6 @@ Perl_ck_entersub_args_core(pTHX_ OP *entersubop, GV *namegv, SV *protosv)
            aop = cUNOPx(aop)->op_first;
        aop = aop->op_sibling;
        for (cvop = aop; cvop->op_sibling; cvop = cvop->op_sibling) ;
-       if (PL_madskills) while (aop != cvop && aop->op_type == OP_STUB) {
-           aop = aop->op_sibling;
-       }
        if (aop != cvop)
            (void)too_many_arguments_pv(entersubop, GvNAME(namegv), 0);
        
@@ -10772,9 +10197,6 @@ Perl_ck_entersub_args_core(pTHX_ OP *entersubop, GV *namegv, SV *protosv)
     else {
        OP *prev, *cvop;
        U32 flags;
-#ifdef PERL_MAD
-       bool seenarg = FALSE;
-#endif
        if (!aop->op_sibling)
            aop = cUNOPx(aop)->op_first;
        
@@ -10784,10 +10206,6 @@ Perl_ck_entersub_args_core(pTHX_ OP *entersubop, GV *namegv, SV *protosv)
        for (cvop = aop;
             cvop->op_sibling;
             prev=cvop, cvop = cvop->op_sibling)
-#ifdef PERL_MAD
-           if (PL_madskills && cvop->op_sibling
-            && cvop->op_type != OP_STUB) seenarg = TRUE
-#endif
            ;
        prev->op_sibling = NULL;
        flags = OPf_SPECIAL * !(cvop->op_private & OPpENTERSUB_NOPAREN);
@@ -10806,9 +10224,6 @@ Perl_ck_entersub_args_core(pTHX_ OP *entersubop, GV *namegv, SV *protosv)
            return aop ? newUNOP(opnum,flags,aop) : newOP(opnum,flags);
        case OA_BASEOP:
            if (aop) {
-#ifdef PERL_MAD
-               if (!PL_madskills || seenarg)
-#endif
                    (void)too_many_arguments_pv(aop, GvNAME(namegv), 0);
                op_free(aop);
            }
diff --git a/op.h b/op.h
index 9d9dd58..100514c 100644 (file)
--- a/op.h
+++ b/op.h
 
 #define OPCODE U16
 
-#ifdef PERL_MAD
-#  define MADPROP_IN_BASEOP    MADPROP*        op_madprop;
-#else
-#  define MADPROP_IN_BASEOP
-#endif
-
 typedef PERL_BITFIELD16 Optype;
 
 #ifdef BASEOP_DEFINITION
@@ -50,7 +44,6 @@ typedef PERL_BITFIELD16 Optype;
     OP*                op_next;                \
     OP*                op_sibling;             \
     OP*                (*op_ppaddr)(pTHX);     \
-    MADPROP_IN_BASEOP                  \
     PADOFFSET  op_targ;                \
     PERL_BITFIELD16 op_type:9;         \
     PERL_BITFIELD16 op_opt:1;          \
@@ -1062,103 +1055,6 @@ the NULL pointer check.
 #define newATTRSUB(f, o, p, a, b) Perl_newATTRSUB_x(aTHX_  f, o, p, a, b, FALSE)
 #define newSUB(f, o, p, b)     newATTRSUB((f), (o), (p), NULL, (b))
 
-#ifdef PERL_MAD
-#  define MAD_NULL 1
-#  define MAD_PV 2
-#  define MAD_OP 3
-#  define MAD_SV 4
-
-struct madprop {
-    MADPROP* mad_next;
-    void *mad_val;
-    U32 mad_vlen;
-/*    short mad_count; */
-    char mad_key;
-    char mad_type;
-};
-
-struct token {
-    I32 tk_type;
-    YYSTYPE tk_lval;
-    MADPROP* tk_mad;
-};
-#endif
-
-/*
- * Values that can be held by mad_key :
- * ^       unfilled head spot
- * ,       literal ,
- * ;       literal ; (blank if implicit ; at end of block)
- * :       literal : from ?: or attr list
- * +       unary +
- * ?       literal ? from ?:
- * (       literal (
- * )       literal )
- * [       literal [
- * ]       literal ]
- * {       literal {
- * }       literal }
- * @       literal @ sigil
- * $       literal $ sigil
- * *       literal * sigil
- * !       use is source filtered
- * &       & or sub
- * #       whitespace/comment following ; or }
- * #       $# sigil
- * 1       1st ; from for(;;)
- * 1       retired protasis
- * 2       2nd ; from for(;;)
- * 2       retired apodosis
- * 3       C-style for list
- * a       sub or var attributes
- * a       non-method arrow operator
- * A       method arrow operator
- * A       use import args
- * b       format block
- * B       retired stub block
- * C       constant conditional op
- * d       declarator
- * D       do block
- * e       unreached "else" (see C)
- * e       expression producing E
- * E       tr/E/R/, /E/
- * f       folded constant op
- * F       peg op for format
- * g       op was forced to be a word
- * i       if/unless modifier
- * I       if/elsif/unless statement
- * k       local declarator
- * K       retired kid op
- * l       last index of array ($#foo)
- * L       label
- * m       modifier on regex
- * n       sub or format name
- * o       current operator/declarator name
- * o       else/continue
- * O       generic optimized op
- * p       peg to hold extra whitespace at statement level
- * P       peg op for package declaration
- * q       opening quote
- * =       quoted material
- * Q       closing quote
- * Q       optimized qw//
- * r       expression producing R
- * R       tr/E/R/ s/E/R/
- * s       sub signature
- * S       use import stub (no import)
- * S       retired sort block
- * t       unreached "then" (see C)
- * U       use import op
- * v       private sv of for loop
- * V       use version
- * w       while/until modifier
- * W       while/for statement
- * x       optimized qw
- * X       random thing
- * _       whitespace/comments preceding anything else
- * ~       =~ operator
- */
-
 /*
 =head1 Hook manipulation
 */
diff --git a/pad.c b/pad.c
index e2523e3..da067bf 100644 (file)
--- a/pad.c
+++ b/pad.c
@@ -153,28 +153,6 @@ Points directly to the body of the L</PL_comppad> array.
   STMT_START { ((XPVNV*)SvANY(sv))->xnv_u.xpad_cop_seq.xhigh = (val); } STMT_END
 
 /*
-=for apidoc mx|void|pad_peg|const char *s
-
-When PERL_MAD is enabled, this is a small no-op function that gets called
-at the start of each pad-related function.  It can be breakpointed to
-track all pad operations.  The parameter is a string indicating the type
-of pad operation being performed.
-
-=cut
-*/
-
-#ifdef PERL_MAD
-void pad_peg(const char* s) {
-    static int pegcnt; /* XXX not threadsafe */
-    PERL_UNUSED_ARG(s);
-
-    PERL_ARGS_ASSERT_PAD_PEG;
-
-    pegcnt++;
-}
-#endif
-
-/*
 This is basically sv_eq_flags() in sv.c, but we avoid the magic
 and bytes checking.
 */
diff --git a/pad.h b/pad.h
index 6269bdc..b36eafb 100644 (file)
--- a/pad.h
+++ b/pad.h
@@ -135,9 +135,7 @@ typedef enum {
  * whether PL_comppad and PL_curpad are consistent and whether they have
  * active values */
 
-#ifndef PERL_MAD
 #  define pad_peg(label)
-#endif
 
 #ifdef DEBUGGING
 #  define ASSERT_CURPAD_LEGAL(label) \
index ff5867e..75f676c 100644 (file)
--- a/parser.h
+++ b/parser.h
@@ -98,28 +98,9 @@ typedef struct yy_parser {
     AV         *rsfp_filters;  /* holds chain of active source filters */
     U8         form_lex_state; /* remember lex_state when parsing fmt */
 
-#ifdef PERL_MAD
-    SV         *endwhite;
-    I32                faketokens;
-    I32                lasttoke;
-    SV         *nextwhite;
-    I32                realtokenstart;
-    SV         *skipwhite;
-    SV         *thisclose;
-    MADPROP *  thismad;
-    SV         *thisopen;
-    SV         *thisstuff;
-    SV         *thistoken;
-    SV         *thiswhite;
-
-/* What we know when we're in LEX_KNOWNEXT state. */
-    NEXTTOKE   nexttoke[5];    /* value of next token, if any */
-    I32                curforce;
-#else
     YYSTYPE    nextval[5];     /* value of next token, if any */
     I32                nexttype[5];    /* type of next token */
     I32                nexttoke;
-#endif
 
     COP                *saved_curcop;  /* the previous PL_curcop */
     char       tokenbuf[256];
diff --git a/perl.c b/perl.c
index 544a0bc..9e0d2b5 100644 (file)
--- a/perl.c
+++ b/perl.c
@@ -2244,32 +2244,6 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
     }
     }
 
-#ifdef PERL_MAD
-    {
-       const char *s;
-    if (!TAINTING_get &&
-        (s = PerlEnv_getenv("PERL_XMLDUMP"))) {
-       PL_madskills = 1;
-       PL_minus_c = 1;
-       if (!s || !s[0])
-           PL_xmlfp = PerlIO_stdout();
-       else {
-           PL_xmlfp = PerlIO_open(s, "w");
-           if (!PL_xmlfp)
-               Perl_croak(aTHX_ "Can't open %s", s);
-       }
-       my_setenv("PERL_XMLDUMP", NULL);        /* hide from subprocs */
-    }
-    }
-
-    {
-       const char *s;
-    if ((s = PerlEnv_getenv("PERL_MADSKILLS"))) {
-       PL_madskills = atoi(s);
-       my_setenv("PERL_MADSKILLS", NULL);      /* hide from subprocs */
-    }
-    }
-#endif
 
     lex_start(linestr_sv, rsfp, lex_start_flags);
     SvREFCNT_dec(linestr_sv);
@@ -2398,12 +2372,6 @@ S_run_body(pTHX_ I32 oldscope)
                     (unsigned int)(PL_sawampersand)));
 
     if (!PL_restartop) {
-#ifdef PERL_MAD
-       if (PL_xmlfp) {
-           xmldump_all();
-           exit(0);    /* less likely to core dump than my_exit(0) */
-       }
-#endif
 #ifdef DEBUGGING
        if (DEBUG_x_TEST || DEBUG_B_TEST)
            dump_all_perl(!DEBUG_B_TEST);
@@ -4858,21 +4826,12 @@ Perl_call_list(pTHX_ I32 oldscope, AV *paramList)
                Perl_av_create_and_push(aTHX_ &PL_unitcheckav_save, MUTABLE_SV(cv));
            }
        } else {
-           if (!PL_madskills)
-               SAVEFREESV(cv);
+            SAVEFREESV(cv);
        }
        JMPENV_PUSH(ret);
        switch (ret) {
        case 0:
-#ifdef PERL_MAD
-           if (PL_madskills)
-               PL_madskills |= 16384;
-#endif
            CALL_LIST_BODY(cv);
-#ifdef PERL_MAD
-           if (PL_madskills)
-               PL_madskills &= ~16384;
-#endif
            atsv = ERRSV;
            (void)SvPV_const(atsv, len);
            if (len) {
diff --git a/perl.h b/perl.h
index 3fa7db5..237c2d1 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -2256,11 +2256,6 @@ int isnan(double d);
 
 typedef MEM_SIZE STRLEN;
 
-#ifdef PERL_MAD
-typedef struct token TOKEN;
-typedef struct madprop MADPROP;
-typedef struct nexttoken NEXTTOKE;
-#endif
 typedef struct op OP;
 typedef struct cop COP;
 typedef struct unop UNOP;
@@ -3294,13 +3289,6 @@ typedef        struct crypt_data {     /* straight from /usr/include/crypt.h */
 #endif
 #include "perly.h"
 
-#ifdef PERL_MAD
-struct nexttoken {
-    YYSTYPE next_val;  /* value of next token, if any */
-    I32 next_type;     /* type of next token */
-    MADPROP *next_mad; /* everything else about that token */
-};
-#endif
 
 /* macros to define bit-fields in structs. */
 #ifndef PERL_BITFIELD8
@@ -4611,9 +4599,6 @@ EXTCONST char PL_bincompat_options[] =
 #  ifdef PERL_IMPLICIT_SYS
                             " PERL_IMPLICIT_SYS"
 #  endif
-#  ifdef PERL_MAD
-                            " PERL_MAD"
-#  endif
 #  ifdef PERL_MICRO
                             " PERL_MICRO"
 #  endif
@@ -5032,12 +5017,6 @@ struct tempsym; /* defined in pp_pack.c */
 #if !defined(PERL_FOR_X2P)
 #  include "embedvar.h"
 #endif
-#ifndef PERL_MAD
-#  undef PL_madskills
-#  undef PL_xmlfp
-#  define PL_madskills 0
-#  define PL_xmlfp 0
-#endif
 
 /* Now include all the 'global' variables
  * If we don't have threads or multiple interpreters
@@ -5064,10 +5043,6 @@ END_EXTERN_C
    In particular, need the relevant *ish file included already, as it may
    define HAVE_INTERP_INTERN  */
 #include "embed.h"
-#ifndef PERL_MAD
-#  undef op_getmad
-#  define op_getmad(arg,pegop,slot) NOOP
-#endif
 
 #ifndef PERL_GLOBAL_STRUCT
 START_EXTERN_C
index cb5e9ba..61850f4 100644 (file)
--- a/perly.act
+++ b/perly.act
@@ -5,14 +5,14 @@
  */
 
 case 2:
-#line 142 "perly.y"
+#line 114 "perly.y"
     {
                          PL_parser->expect = XSTATE;
                        }
     break;
 
   case 3:
-#line 146 "perly.y"
+#line 118 "perly.y"
     {
                          newPROG(block_end((ps[(3) - (4)].val.ival),(ps[(4) - (4)].val.opval)));
                          (yyval.ival) = 0;
@@ -20,14 +20,14 @@ case 2:
     break;
 
   case 4:
-#line 151 "perly.y"
+#line 123 "perly.y"
     {
                          parser->expect = XTERM;
                        }
     break;
 
   case 5:
-#line 155 "perly.y"
+#line 127 "perly.y"
     {
                          PL_eval_root = (ps[(3) - (3)].val.opval);
                          (yyval.ival) = 0;
@@ -35,14 +35,14 @@ case 2:
     break;
 
   case 6:
-#line 160 "perly.y"
+#line 132 "perly.y"
     {
                          parser->expect = XBLOCK;
                        }
     break;
 
   case 7:
-#line 164 "perly.y"
+#line 136 "perly.y"
     {
                          PL_pad_reset_pending = TRUE;
                          PL_eval_root = (ps[(3) - (3)].val.opval);
@@ -53,14 +53,14 @@ case 2:
     break;
 
   case 8:
-#line 172 "perly.y"
+#line 144 "perly.y"
     {
                          parser->expect = XSTATE;
                        }
     break;
 
   case 9:
-#line 176 "perly.y"
+#line 148 "perly.y"
     {
                          PL_pad_reset_pending = TRUE;
                          PL_eval_root = (ps[(3) - (3)].val.opval);
@@ -71,14 +71,14 @@ case 2:
     break;
 
   case 10:
-#line 184 "perly.y"
+#line 156 "perly.y"
     {
                          parser->expect = XSTATE;
                        }
     break;
 
   case 11:
-#line 188 "perly.y"
+#line 160 "perly.y"
     {
                          PL_pad_reset_pending = TRUE;
                          PL_eval_root = (ps[(3) - (3)].val.opval);
@@ -89,14 +89,14 @@ case 2:
     break;
 
   case 12:
-#line 196 "perly.y"
+#line 168 "perly.y"
     {
                          parser->expect = XSTATE;
                        }
     break;
 
   case 13:
-#line 200 "perly.y"
+#line 172 "perly.y"
     {
                          PL_eval_root = (ps[(3) - (3)].val.opval);
                          (yyval.ival) = 0;
@@ -104,52 +104,46 @@ case 2:
     break;
 
   case 14:
-#line 208 "perly.y"
-    { if (PL_parser->copline > (line_t)IVAL((ps[(1) - (4)].val.i_tkval)))
-                             PL_parser->copline = (line_t)IVAL((ps[(1) - (4)].val.i_tkval));
+#line 180 "perly.y"
+    { if (PL_parser->copline > (line_t)(ps[(1) - (4)].val.ival))
+                             PL_parser->copline = (line_t)(ps[(1) - (4)].val.ival);
                          (yyval.opval) = block_end((ps[(2) - (4)].val.ival), (ps[(3) - (4)].val.opval));
-                         TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'{');
-                         TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),'}');
                        }
     break;
 
   case 15:
-#line 218 "perly.y"
-    { if (PL_parser->copline > (line_t)IVAL((ps[(1) - (7)].val.i_tkval)))
-                             PL_parser->copline = (line_t)IVAL((ps[(1) - (7)].val.i_tkval));
+#line 188 "perly.y"
+    { if (PL_parser->copline > (line_t)(ps[(1) - (7)].val.ival))
+                             PL_parser->copline = (line_t)(ps[(1) - (7)].val.ival);
                          (yyval.opval) = block_end((ps[(2) - (7)].val.ival), (ps[(5) - (7)].val.opval));
-                         TOKEN_GETMAD((ps[(1) - (7)].val.i_tkval),(yyval.opval),'{');
-                         TOKEN_GETMAD((ps[(7) - (7)].val.i_tkval),(yyval.opval),'}');
                        }
     break;
 
   case 16:
-#line 227 "perly.y"
+#line 195 "perly.y"
     { (yyval.ival) = block_start(TRUE); }
     break;
 
   case 17:
-#line 231 "perly.y"
-    { if (PL_parser->copline > (line_t)IVAL((ps[(1) - (4)].val.i_tkval)))
-                             PL_parser->copline = (line_t)IVAL((ps[(1) - (4)].val.i_tkval));
+#line 199 "perly.y"
+    { if (PL_parser->copline > (line_t)(ps[(1) - (4)].val.ival))
+                             PL_parser->copline = (line_t)(ps[(1) - (4)].val.ival);
                          (yyval.opval) = block_end((ps[(2) - (4)].val.ival), (ps[(3) - (4)].val.opval));
-                         TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'{');
-                         TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),'}');
                        }
     break;
 
   case 18:
-#line 240 "perly.y"
+#line 206 "perly.y"
     { (yyval.ival) = block_start(FALSE); }
     break;
 
   case 19:
-#line 245 "perly.y"
+#line 211 "perly.y"
     { (yyval.opval) = (OP*)NULL; }
     break;
 
   case 20:
-#line 247 "perly.y"
+#line 213 "perly.y"
     {   (yyval.opval) = op_append_list(OP_LINESEQ, (ps[(1) - (2)].val.opval), (ps[(2) - (2)].val.opval));
                            PL_pad_reset_pending = TRUE;
                            if ((ps[(1) - (2)].val.opval) && (ps[(2) - (2)].val.opval))
@@ -158,12 +152,12 @@ case 2:
     break;
 
   case 21:
-#line 256 "perly.y"
+#line 222 "perly.y"
     { (yyval.opval) = (OP*)NULL; }
     break;
 
   case 22:
-#line 258 "perly.y"
+#line 224 "perly.y"
     {   (yyval.opval) = op_append_list(OP_LINESEQ, (ps[(1) - (2)].val.opval), (ps[(2) - (2)].val.opval));
                            PL_pad_reset_pending = TRUE;
                            if ((ps[(1) - (2)].val.opval) && (ps[(2) - (2)].val.opval))
@@ -172,68 +166,42 @@ case 2:
     break;
 
   case 23:
-#line 267 "perly.y"
+#line 233 "perly.y"
     {
-                         if((ps[(1) - (1)].val.opval)) {
-                             (yyval.opval) = newSTATEOP(0, NULL, (ps[(1) - (1)].val.opval));
-                         } else {
-                             (yyval.opval) = IF_MAD(newOP(OP_NULL, 0), NULL);
-                         }
+                         (yyval.opval) = (ps[(1) - (1)].val.opval) ? newSTATEOP(0, NULL, (ps[(1) - (1)].val.opval)) : NULL;
                        }
     break;
 
   case 24:
-#line 275 "perly.y"
+#line 237 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); }
     break;
 
   case 25:
-#line 279 "perly.y"
+#line 241 "perly.y"
     {
-                         (yyval.opval) = newSTATEOP(SVf_UTF8
-                                          * PVAL((ps[(1) - (2)].val.p_tkval))[strlen(PVAL((ps[(1) - (2)].val.p_tkval)))+1],
-                                         PVAL((ps[(1) - (2)].val.p_tkval)), (ps[(2) - (2)].val.opval));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.p_tkval),
-                             (ps[(2) - (2)].val.opval) ? cLISTOPx((yyval.opval))->op_first : (yyval.opval), 'L');
+                         (yyval.opval) = newSTATEOP(SVf_UTF8 * (ps[(1) - (2)].val.pval)[strlen((ps[(1) - (2)].val.pval))+1], (ps[(1) - (2)].val.pval), (ps[(2) - (2)].val.opval));
                        }
     break;
 
   case 26:
-#line 287 "perly.y"
+#line 245 "perly.y"
     {
-                         (yyval.opval) = newSTATEOP(SVf_UTF8
-                                          * PVAL((ps[(1) - (2)].val.p_tkval))[strlen(PVAL((ps[(1) - (2)].val.p_tkval)))+1],
-                                         PVAL((ps[(1) - (2)].val.p_tkval)), (ps[(2) - (2)].val.opval));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.p_tkval), cLISTOPx((yyval.opval))->op_first, 'L');
+                         (yyval.opval) = newSTATEOP(SVf_UTF8 * (ps[(1) - (2)].val.pval)[strlen((ps[(1) - (2)].val.pval))+1], (ps[(1) - (2)].val.pval), (ps[(2) - (2)].val.opval));
                        }
     break;
 
   case 27:
-#line 297 "perly.y"
+#line 252 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); }
     break;
 
   case 28:
-#line 299 "perly.y"
-    {
-                         (yyval.opval) = newOP(OP_NULL,0);
-                         TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'p');
-                       }
-    break;
-
-  case 29:
-#line 304 "perly.y"
+#line 254 "perly.y"
     {
                          CV *fmtcv = PL_compcv;
-#ifdef MAD
-                         (yyval.opval) = newFORM((ps[(2) - (4)].val.ival), (ps[(3) - (4)].val.opval), (ps[(4) - (4)].val.opval));
-                         prepend_madprops((ps[(1) - (4)].val.i_tkval)->tk_mad, (yyval.opval), 'F');
-                         (ps[(1) - (4)].val.i_tkval)->tk_mad = 0;
-                         token_free((ps[(1) - (4)].val.i_tkval));
-#else
                          newFORM((ps[(2) - (4)].val.ival), (ps[(3) - (4)].val.opval), (ps[(4) - (4)].val.opval));
                          (yyval.opval) = (OP*)NULL;
-#endif
                          if (CvOUTSIDE(fmtcv) && !CvEVAL(CvOUTSIDE(fmtcv))) {
                              SvREFCNT_inc_simple_void(fmtcv);
                              pad_add_anon(fmtcv, OP_NULL);
@@ -241,8 +209,8 @@ case 2:
                        }
     break;
 
-  case 30:
-#line 321 "perly.y"
+  case 29:
+#line 264 "perly.y"
     {
                          if ((ps[(2) - (3)].val.opval)->op_type == OP_CONST) {
                            const char *const name =
@@ -266,104 +234,63 @@ case 2:
                        }
     break;
 
-  case 31:
-#line 343 "perly.y"
+  case 30:
+#line 286 "perly.y"
     {
                          SvREFCNT_inc_simple_void(PL_compcv);
-#ifdef MAD
-                         {
-                             OP* o = newSVOP(OP_ANONCODE, 0,
-                               (SV*)(
-#endif
                          (ps[(2) - (7)].val.opval)->op_type == OP_CONST
                              ? newATTRSUB((ps[(3) - (7)].val.ival), (ps[(2) - (7)].val.opval), (ps[(5) - (7)].val.opval), (ps[(6) - (7)].val.opval), (ps[(7) - (7)].val.opval))
                              : newMYSUB((ps[(3) - (7)].val.ival), (ps[(2) - (7)].val.opval), (ps[(5) - (7)].val.opval), (ps[(6) - (7)].val.opval), (ps[(7) - (7)].val.opval))
-#ifdef MAD
-                               ));
-                             (yyval.opval) = newOP(OP_NULL,0);
-                             op_getmad(o,(yyval.opval),'&');
-                             op_getmad((ps[(2) - (7)].val.opval),(yyval.opval),'n');
-                             op_getmad((ps[(5) - (7)].val.opval),(yyval.opval),'s');
-                             op_getmad((ps[(6) - (7)].val.opval),(yyval.opval),'a');
-                             token_getmad((ps[(1) - (7)].val.i_tkval),(yyval.opval),'d');
-                             append_madprops((ps[(7) - (7)].val.opval)->op_madprop, (yyval.opval), 0);
-                             (ps[(7) - (7)].val.opval)->op_madprop = 0;
-                         }
-#else
                          ;
                          (yyval.opval) = (OP*)NULL;
-#endif
                          intro_my();
                        }
     break;
 
-  case 32:
-#line 371 "perly.y"
+  case 31:
+#line 296 "perly.y"
     {
-#ifdef MAD
-                         (yyval.opval) = package((ps[(3) - (4)].val.opval));
-                         token_getmad((ps[(1) - (4)].val.i_tkval),(yyval.opval),'o');
-                         if ((ps[(2) - (4)].val.opval))
-                             package_version((ps[(2) - (4)].val.opval));
-                         token_getmad((ps[(4) - (4)].val.i_tkval),(yyval.opval),';');
-#else
                          package((ps[(3) - (4)].val.opval));
                          if ((ps[(2) - (4)].val.opval))
                              package_version((ps[(2) - (4)].val.opval));
                          (yyval.opval) = (OP*)NULL;
-#endif
                        }
     break;
 
-  case 33:
-#line 386 "perly.y"
+  case 32:
+#line 303 "perly.y"
     { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ }
     break;
 
-  case 34:
-#line 388 "perly.y"
+  case 33:
+#line 305 "perly.y"
     {
                          SvREFCNT_inc_simple_void(PL_compcv);
-#ifdef MAD
-                         (yyval.opval) = utilize(IVAL((ps[(1) - (7)].val.i_tkval)), (ps[(2) - (7)].val.ival), (ps[(4) - (7)].val.opval), (ps[(5) - (7)].val.opval), (ps[(6) - (7)].val.opval));
-                         token_getmad((ps[(1) - (7)].val.i_tkval),(yyval.opval),'o');
-                         token_getmad((ps[(7) - (7)].val.i_tkval),(yyval.opval),';');
-                         if (PL_parser->rsfp_filters &&
-                                     AvFILLp(PL_parser->rsfp_filters) >= 0)
-                             append_madprops(newMADPROP('!', MAD_NULL, NULL, 0), (yyval.opval), 0);
-#else
-                         utilize(IVAL((ps[(1) - (7)].val.i_tkval)), (ps[(2) - (7)].val.ival), (ps[(4) - (7)].val.opval), (ps[(5) - (7)].val.opval), (ps[(6) - (7)].val.opval));
+                         utilize((ps[(1) - (7)].val.ival), (ps[(2) - (7)].val.ival), (ps[(4) - (7)].val.opval), (ps[(5) - (7)].val.opval), (ps[(6) - (7)].val.opval));
                          (yyval.opval) = (OP*)NULL;
-#endif
                        }
     break;
 
-  case 35:
-#line 403 "perly.y"
+  case 34:
+#line 311 "perly.y"
     {
                          (yyval.opval) = block_end((ps[(3) - (7)].val.ival),
                              newCONDOP(0, (ps[(4) - (7)].val.opval), op_scope((ps[(6) - (7)].val.opval)), (ps[(7) - (7)].val.opval)));
-                         TOKEN_GETMAD((ps[(1) - (7)].val.i_tkval),(yyval.opval),'I');
-                         TOKEN_GETMAD((ps[(2) - (7)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(5) - (7)].val.i_tkval),(yyval.opval),')');
-                         PL_parser->copline = (line_t)IVAL((ps[(1) - (7)].val.i_tkval));
+                         PL_parser->copline = (line_t)(ps[(1) - (7)].val.ival);
                        }
     break;
 
-  case 36:
-#line 412 "perly.y"
+  case 35:
+#line 317 "perly.y"
     {
                          (yyval.opval) = block_end((ps[(3) - (7)].val.ival),
                              newCONDOP(0, (ps[(4) - (7)].val.opval), op_scope((ps[(6) - (7)].val.opval)), (ps[(7) - (7)].val.opval)));
-                         TOKEN_GETMAD((ps[(1) - (7)].val.i_tkval),(yyval.opval),'I');
-                         TOKEN_GETMAD((ps[(2) - (7)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(5) - (7)].val.i_tkval),(yyval.opval),')');
-                         PL_parser->copline = (line_t)IVAL((ps[(1) - (7)].val.i_tkval));
+                         PL_parser->copline = (line_t)(ps[(1) - (7)].val.ival);
                        }
     break;
 
-  case 37:
-#line 421 "perly.y"
+  case 36:
+#line 323 "perly.y"
     {
                          const PADOFFSET offset = pad_findmy_pvs("$_", 0);
                          (yyval.opval) = block_end((ps[(3) - (6)].val.ival),
@@ -372,50 +299,44 @@ case 2:
                                    || PAD_COMPNAME_FLAGS_isOUR(offset)
                                      ? 0
                                      : offset));
-                         PL_parser->copline = (line_t)IVAL((ps[(1) - (6)].val.i_tkval));
+                         PL_parser->copline = (line_t)(ps[(1) - (6)].val.ival);
                        }
     break;
 
-  case 38:
-#line 432 "perly.y"
+  case 37:
+#line 334 "perly.y"
     { (yyval.opval) = block_end((ps[(3) - (6)].val.ival), newWHENOP((ps[(4) - (6)].val.opval), op_scope((ps[(6) - (6)].val.opval)))); }
     break;
 
-  case 39:
-#line 434 "perly.y"
+  case 38:
+#line 336 "perly.y"
     { (yyval.opval) = newWHENOP(0, op_scope((ps[(2) - (2)].val.opval))); }
     break;
 
-  case 40:
-#line 436 "perly.y"
+  case 39:
+#line 338 "perly.y"
     {
                          (yyval.opval) = block_end((ps[(3) - (8)].val.ival),
                                  newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
                                      (ps[(4) - (8)].val.opval), (ps[(7) - (8)].val.opval), (ps[(8) - (8)].val.opval), (ps[(6) - (8)].val.ival)));
-                         TOKEN_GETMAD((ps[(1) - (8)].val.i_tkval),(yyval.opval),'W');
-                         TOKEN_GETMAD((ps[(2) - (8)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(5) - (8)].val.i_tkval),(yyval.opval),')');
-                         PL_parser->copline = (line_t)IVAL((ps[(1) - (8)].val.i_tkval));
+                         PL_parser->copline = (line_t)(ps[(1) - (8)].val.ival);
                        }
     break;
 
-  case 41:
-#line 446 "perly.y"
+  case 40:
+#line 345 "perly.y"
     {
                          (yyval.opval) = block_end((ps[(3) - (8)].val.ival),
                                  newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
                                      (ps[(4) - (8)].val.opval), (ps[(7) - (8)].val.opval), (ps[(8) - (8)].val.opval), (ps[(6) - (8)].val.ival)));
-                         TOKEN_GETMAD((ps[(1) - (8)].val.i_tkval),(yyval.opval),'W');
-                         TOKEN_GETMAD((ps[(2) - (8)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(5) - (8)].val.i_tkval),(yyval.opval),')');
-                         PL_parser->copline = (line_t)IVAL((ps[(1) - (8)].val.i_tkval));
+                         PL_parser->copline = (line_t)(ps[(1) - (8)].val.ival);
                        }
     break;
 
-  case 42:
-#line 457 "perly.y"
+  case 41:
+#line 353 "perly.y"
     {
-                         OP *initop = IF_MAD((ps[(4) - (11)].val.opval) ? (ps[(4) - (11)].val.opval) : newOP(OP_NULL, 0), (ps[(4) - (11)].val.opval));
+                         OP *initop = (ps[(4) - (11)].val.opval);
                          OP *forop = newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
                                      scalar((ps[(6) - (11)].val.opval)), (ps[(11) - (11)].val.opval), (ps[(9) - (11)].val.opval), (ps[(8) - (11)].val.ival));
                          if (initop) {
@@ -424,55 +345,39 @@ case 2:
                                      newOP(OP_UNSTACK, OPf_SPECIAL),
                                      forop));
                          }
-                         DO_MAD({ forop = newUNOP(OP_NULL, 0, forop); })
                          (yyval.opval) = block_end((ps[(3) - (11)].val.ival), forop);
-                         TOKEN_GETMAD((ps[(1) - (11)].val.i_tkval),(yyval.opval),'3');
-                         TOKEN_GETMAD((ps[(2) - (11)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(5) - (11)].val.i_tkval),(yyval.opval),'1');
-                         TOKEN_GETMAD((ps[(7) - (11)].val.i_tkval),(yyval.opval),'2');
-                         TOKEN_GETMAD((ps[(10) - (11)].val.i_tkval),(yyval.opval),')');
-                         PL_parser->copline = (line_t)IVAL((ps[(1) - (11)].val.i_tkval));
+                         PL_parser->copline = (line_t)(ps[(1) - (11)].val.ival);
                        }
     break;
 
-  case 43:
-#line 477 "perly.y"
+  case 42:
+#line 367 "perly.y"
     {
                          (yyval.opval) = block_end((ps[(3) - (9)].val.ival), newFOROP(0, (ps[(4) - (9)].val.opval), (ps[(6) - (9)].val.opval), (ps[(8) - (9)].val.opval), (ps[(9) - (9)].val.opval)));
-                         TOKEN_GETMAD((ps[(1) - (9)].val.i_tkval),(yyval.opval),'W');
-                         TOKEN_GETMAD((ps[(2) - (9)].val.i_tkval),(yyval.opval),'d');
-                         TOKEN_GETMAD((ps[(5) - (9)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(7) - (9)].val.i_tkval),(yyval.opval),')');
-                         PL_parser->copline = (line_t)IVAL((ps[(1) - (9)].val.i_tkval));
+                         PL_parser->copline = (line_t)(ps[(1) - (9)].val.ival);
                        }
     break;
 
-  case 44:
-#line 486 "perly.y"
+  case 43:
+#line 372 "perly.y"
     {
                          (yyval.opval) = block_end((ps[(4) - (8)].val.ival), newFOROP(0,
                                      op_lvalue((ps[(2) - (8)].val.opval), OP_ENTERLOOP), (ps[(5) - (8)].val.opval), (ps[(7) - (8)].val.opval), (ps[(8) - (8)].val.opval)));
-                         TOKEN_GETMAD((ps[(1) - (8)].val.i_tkval),(yyval.opval),'W');
-                         TOKEN_GETMAD((ps[(3) - (8)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(6) - (8)].val.i_tkval),(yyval.opval),')');
-                         PL_parser->copline = (line_t)IVAL((ps[(1) - (8)].val.i_tkval));
+                         PL_parser->copline = (line_t)(ps[(1) - (8)].val.ival);
                        }
     break;
 
-  case 45:
-#line 495 "perly.y"
+  case 44:
+#line 378 "perly.y"
     {
                          (yyval.opval) = block_end((ps[(3) - (7)].val.ival),
                                  newFOROP(0, (OP*)NULL, (ps[(4) - (7)].val.opval), (ps[(6) - (7)].val.opval), (ps[(7) - (7)].val.opval)));
-                         TOKEN_GETMAD((ps[(1) - (7)].val.i_tkval),(yyval.opval),'W');
-                         TOKEN_GETMAD((ps[(2) - (7)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(5) - (7)].val.i_tkval),(yyval.opval),')');
-                         PL_parser->copline = (line_t)IVAL((ps[(1) - (7)].val.i_tkval));
+                         PL_parser->copline = (line_t)(ps[(1) - (7)].val.ival);
                        }
     break;
 
-  case 46:
-#line 504 "perly.y"
+  case 45:
+#line 384 "perly.y"
     {
                          /* a block is a loop that happens once */
                          (yyval.opval) = newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
@@ -480,8 +385,8 @@ case 2:
                        }
     break;
 
-  case 47:
-#line 510 "perly.y"
+  case 46:
+#line 390 "perly.y"
     {
                          package((ps[(3) - (5)].val.opval));
                          if ((ps[(2) - (5)].val.opval)) {
@@ -490,53 +395,43 @@ case 2:
                        }
     break;
 
-  case 48:
-#line 517 "perly.y"
+  case 47:
+#line 397 "perly.y"
     {
                          /* a block is a loop that happens once */
                          (yyval.opval) = newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
                                  (OP*)NULL, block_end((ps[(5) - (8)].val.ival), (ps[(7) - (8)].val.opval)), (OP*)NULL, 0);
-                         TOKEN_GETMAD((ps[(4) - (8)].val.i_tkval),(yyval.opval),'{');
-                         TOKEN_GETMAD((ps[(8) - (8)].val.i_tkval),(yyval.opval),'}');
-                         if (PL_parser->copline > (line_t)IVAL((ps[(4) - (8)].val.i_tkval)))
-                             PL_parser->copline = (line_t)IVAL((ps[(4) - (8)].val.i_tkval));
+                         if (PL_parser->copline > (line_t)(ps[(4) - (8)].val.ival))
+                             PL_parser->copline = (line_t)(ps[(4) - (8)].val.ival);
                        }
     break;
 
-  case 49:
-#line 527 "perly.y"
+  case 48:
+#line 405 "perly.y"
     {
                          PL_parser->expect = XSTATE;
                          (yyval.opval) = (ps[(1) - (2)].val.opval);
-                         TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),';');
                        }
     break;
 
-  case 50:
-#line 533 "perly.y"
+  case 49:
+#line 410 "perly.y"
     {
                          PL_parser->expect = XSTATE;
-                         (yyval.opval) = IF_MAD(newOP(OP_NULL, 0), (OP*)NULL);
-                         TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),';');
+                         (yyval.opval) = (OP*)NULL;
                          PL_parser->copline = NOLINE;
                        }
     break;
 
-  case 51:
-#line 543 "perly.y"
+  case 50:
+#line 419 "perly.y"
     { OP *list;
                          if ((ps[(2) - (2)].val.opval)) {
                              OP *term = (ps[(2) - (2)].val.opval);
-                             DO_MAD(term = newUNOP(OP_NULL, 0, term));
                              list = op_append_elem(OP_LIST, (ps[(1) - (2)].val.opval), term);
                          }
                          else {
-#ifdef MAD
-                             OP *op = newNULLLIST();
-                             list = op_append_elem(OP_LIST, (ps[(1) - (2)].val.opval), op);
-#else
                              list = (ps[(1) - (2)].val.opval);
-#endif
                          }
                          if (PL_parser->copline == NOLINE)
                               PL_parser->copline = CopLINE(PL_curcop)-1;
@@ -546,225 +441,194 @@ case 2:
                        }
     break;
 
-  case 52:
-#line 566 "perly.y"
+  case 51:
+#line 436 "perly.y"
     { (yyval.opval) = NULL; }
     break;
 
-  case 53:
-#line 568 "perly.y"
+  case 52:
+#line 438 "perly.y"
     { (yyval.opval) = op_unscope((ps[(2) - (3)].val.opval)); }
     break;
 
-  case 54:
-#line 573 "perly.y"
+  case 53:
+#line 443 "perly.y"
     { (yyval.opval) = (OP*)NULL; }
     break;
 
-  case 55:
-#line 575 "perly.y"
+  case 54:
+#line 445 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); }
     break;
 
+  case 55:
+#line 447 "perly.y"
+    { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval)); }
+    break;
+
   case 56:
-#line 577 "perly.y"
-    { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval));
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'i');
-                       }
+#line 449 "perly.y"
+    { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval)); }
     break;
 
   case 57:
-#line 581 "perly.y"
-    { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval));
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'i');
-                       }
+#line 451 "perly.y"
+    { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, scalar((ps[(3) - (3)].val.opval)), (ps[(1) - (3)].val.opval)); }
     break;
 
   case 58:
-#line 585 "perly.y"
-    { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, scalar((ps[(3) - (3)].val.opval)), (ps[(1) - (3)].val.opval));
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'w');
-                       }
+#line 453 "perly.y"
+    { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval)); }
     break;
 
   case 59:
-#line 589 "perly.y"
-    { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval));
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'w');
-                       }
-    break;
-
-  case 60:
-#line 593 "perly.y"
+#line 455 "perly.y"
     { (yyval.opval) = newFOROP(0, (OP*)NULL, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval), (OP*)NULL);
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'w');
-                         PL_parser->copline = (line_t)IVAL((ps[(2) - (3)].val.i_tkval));
-                       }
+                         PL_parser->copline = (line_t)(ps[(2) - (3)].val.ival); }
     break;
 
-  case 61:
-#line 598 "perly.y"
+  case 60:
+#line 458 "perly.y"
     { (yyval.opval) = newWHENOP((ps[(3) - (3)].val.opval), op_scope((ps[(1) - (3)].val.opval))); }
     break;
 
-  case 62:
-#line 603 "perly.y"
+  case 61:
+#line 463 "perly.y"
     { (yyval.opval) = (OP*)NULL; }
     break;
 
-  case 63:
-#line 605 "perly.y"
+  case 62:
+#line 465 "perly.y"
     {
                          ((ps[(2) - (2)].val.opval))->op_flags |= OPf_PARENS;
                          (yyval.opval) = op_scope((ps[(2) - (2)].val.opval));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
                        }
     break;
 
-  case 64:
-#line 611 "perly.y"
-    { PL_parser->copline = (line_t)IVAL((ps[(1) - (6)].val.i_tkval));
+  case 63:
+#line 470 "perly.y"
+    { PL_parser->copline = (line_t)(ps[(1) - (6)].val.ival);
                            (yyval.opval) = newCONDOP(0,
                                newSTATEOP(OPf_SPECIAL,NULL,(ps[(3) - (6)].val.opval)),
                                op_scope((ps[(5) - (6)].val.opval)), (ps[(6) - (6)].val.opval));
                          PL_hints |= HINT_BLOCK_SCOPE;
-                         TOKEN_GETMAD((ps[(1) - (6)].val.i_tkval),(yyval.opval),'I');
-                         TOKEN_GETMAD((ps[(2) - (6)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(4) - (6)].val.i_tkval),(yyval.opval),')');
                        }
     break;
 
-  case 65:
-#line 624 "perly.y"
+  case 64:
+#line 480 "perly.y"
     { (yyval.opval) = (OP*)NULL; }
     break;
 
-  case 66:
-#line 626 "perly.y"
-    {
-                         (yyval.opval) = op_scope((ps[(2) - (2)].val.opval));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+  case 65:
+#line 482 "perly.y"
+    { (yyval.opval) = op_scope((ps[(2) - (2)].val.opval)); }
     break;
 
-  case 67:
-#line 634 "perly.y"
+  case 66:
+#line 487 "perly.y"
     { (yyval.ival) = (PL_min_intro_pending &&
                            PL_max_intro_pending >=  PL_min_intro_pending);
                          intro_my(); }
     break;
 
-  case 68:
-#line 640 "perly.y"
+  case 67:
+#line 493 "perly.y"
     { (yyval.opval) = (OP*)NULL; }
     break;
 
-  case 70:
-#line 646 "perly.y"
+  case 69:
+#line 499 "perly.y"
     { YYSTYPE tmplval;
                          (void)scan_num("1", &tmplval);
                          (yyval.opval) = tmplval.opval; }
     break;
 
-  case 72:
-#line 654 "perly.y"
+  case 71:
+#line 507 "perly.y"
     { (yyval.opval) = invert(scalar((ps[(1) - (1)].val.opval))); }
     break;
 
-  case 73:
-#line 659 "perly.y"
+  case 72:
+#line 512 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); intro_my(); }
     break;
 
-  case 74:
-#line 663 "perly.y"
+  case 73:
+#line 516 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); intro_my(); }
     break;
 
-  case 75:
-#line 667 "perly.y"
+  case 74:
+#line 520 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); intro_my(); }
     break;
 
-  case 76:
-#line 670 "perly.y"
+  case 75:
+#line 523 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); }
     break;
 
-  case 77:
-#line 671 "perly.y"
+  case 76:
+#line 524 "perly.y"
     { (yyval.opval) = (OP*)NULL; }
     break;
 
-  case 78:
-#line 675 "perly.y"
+  case 77:
+#line 528 "perly.y"
     { (yyval.ival) = start_subparse(FALSE, 0);
                            SAVEFREESV(PL_compcv); }
     break;
 
-  case 79:
-#line 681 "perly.y"
+  case 78:
+#line 534 "perly.y"
     { (yyval.ival) = start_subparse(FALSE, CVf_ANON);
                            SAVEFREESV(PL_compcv); }
     break;
 
-  case 80:
-#line 686 "perly.y"
+  case 79:
+#line 539 "perly.y"
     { (yyval.ival) = start_subparse(TRUE, 0);
                            SAVEFREESV(PL_compcv); }
     break;
 
-  case 83:
-#line 697 "perly.y"
+  case 82:
+#line 550 "perly.y"
     { (yyval.opval) = (OP*)NULL; }
     break;
 
-  case 85:
-#line 703 "perly.y"
+  case 84:
+#line 556 "perly.y"
     { (yyval.opval) = (OP*)NULL; }
     break;
 
+  case 85:
+#line 558 "perly.y"
+    { (yyval.opval) = (ps[(2) - (2)].val.opval); }
+    break;
+
   case 86:
-#line 705 "perly.y"
-    { (yyval.opval) = (ps[(2) - (2)].val.opval);
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),':');
-                       }
+#line 560 "perly.y"
+    { (yyval.opval) = (OP*)NULL; }
     break;
 
   case 87:
-#line 709 "perly.y"
-    { (yyval.opval) = IF_MAD(
-                                   newOP(OP_NULL, 0),
-                                   (OP*)NULL
-                               );
-                         TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),':');
-                       }
+#line 565 "perly.y"
+    { (yyval.opval) = (ps[(2) - (2)].val.opval); }
     break;
 
   case 88:
-#line 719 "perly.y"
-    { (yyval.opval) = (ps[(2) - (2)].val.opval);
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),':');
-                       }
+#line 567 "perly.y"
+    { (yyval.opval) = (OP*)NULL; }
     break;
 
   case 89:
-#line 723 "perly.y"
-    { (yyval.opval) = IF_MAD(
-                                   newOP(OP_NULL, 0),
-                                   (OP*)NULL
-                               );
-                         TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),':');
-                       }
-    break;
-
-  case 90:
-#line 732 "perly.y"
+#line 571 "perly.y"
     { (yyval.opval) = (OP*)NULL; }
     break;
 
-  case 91:
-#line 734 "perly.y"
+  case 90:
+#line 573 "perly.y"
     {
                          if (!FEATURE_SIGNATURES_IS_ENABLED)
                            Perl_croak(aTHX_ "Experimental "
@@ -776,8 +640,8 @@ case 2:
                        }
     break;
 
-  case 92:
-#line 744 "perly.y"
+  case 91:
+#line 583 "perly.y"
     {
                          (yyval.opval) = op_append_list(OP_LINESEQ, (ps[(2) - (3)].val.opval),
                                newSTATEOP(0, NULL, sawparens(newNULLLIST())));
@@ -785,121 +649,89 @@ case 2:
                        }
     break;
 
-  case 93:
-#line 753 "perly.y"
+  case 92:
+#line 592 "perly.y"
     {
-                         if (PL_parser->copline > (line_t)IVAL((ps[(3) - (5)].val.i_tkval)))
-                             PL_parser->copline = (line_t)IVAL((ps[(3) - (5)].val.i_tkval));
+                         if (PL_parser->copline > (line_t)(ps[(3) - (5)].val.ival))
+                             PL_parser->copline = (line_t)(ps[(3) - (5)].val.ival);
                          (yyval.opval) = block_end((ps[(1) - (5)].val.ival),
                                op_append_list(OP_LINESEQ, (ps[(2) - (5)].val.opval), (ps[(4) - (5)].val.opval)));
-                         TOKEN_GETMAD((ps[(3) - (5)].val.i_tkval),(yyval.opval),'{');
-                         TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),'}');
                        }
     break;
 
-  case 94:
-#line 764 "perly.y"
+  case 93:
+#line 601 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); }
     break;
 
-  case 95:
-#line 765 "perly.y"
-    { (yyval.opval) = IF_MAD(
-                                   newOP(OP_NULL,0),
-                                   (OP*)NULL
-                               );
+  case 94:
+#line 602 "perly.y"
+    { (yyval.opval) = (OP*)NULL;
                          PL_parser->expect = XSTATE;
-                         TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),';');
                        }
     break;
 
+  case 95:
+#line 609 "perly.y"
+    { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); }
+    break;
+
   case 96:
-#line 776 "perly.y"
-    { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 611 "perly.y"
+    { (yyval.opval) = newLOGOP((ps[(2) - (3)].val.ival), 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); }
     break;
 
   case 97:
-#line 780 "perly.y"
-    { (yyval.opval) = newLOGOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 613 "perly.y"
+    { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); }
     break;
 
-  case 98:
-#line 784 "perly.y"
-    { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+  case 99:
+#line 619 "perly.y"
+    { (yyval.opval) = (ps[(1) - (2)].val.opval); }
     break;
 
   case 100:
-#line 792 "perly.y"
-    {
-#ifdef MAD
-                         OP* op = newNULLLIST();
-                         token_getmad((ps[(2) - (2)].val.i_tkval),op,',');
-                         (yyval.opval) = op_append_elem(OP_LIST, (ps[(1) - (2)].val.opval), op);
-#else
-                         (yyval.opval) = (ps[(1) - (2)].val.opval);
-#endif
-                       }
-    break;
-
-  case 101:
-#line 802 "perly.y"
+#line 621 "perly.y"
     { 
                          OP* term = (ps[(3) - (3)].val.opval);
-                         DO_MAD(
-                             term = newUNOP(OP_NULL, 0, term);
-                             token_getmad((ps[(2) - (3)].val.i_tkval),term,',');
-                         )
                          (yyval.opval) = op_append_elem(OP_LIST, (ps[(1) - (3)].val.opval), term);
                        }
     break;
 
-  case 103:
-#line 815 "perly.y"
-    { (yyval.opval) = convert(IVAL((ps[(1) - (3)].val.i_tkval)), OPf_STACKED,
-                               op_prepend_elem(OP_LIST, newGVREF(IVAL((ps[(1) - (3)].val.i_tkval)),(ps[(2) - (3)].val.opval)), (ps[(3) - (3)].val.opval)) );
-                         TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'o');
+  case 102:
+#line 630 "perly.y"
+    { (yyval.opval) = convert((ps[(1) - (3)].val.ival), OPf_STACKED,
+                               op_prepend_elem(OP_LIST, newGVREF((ps[(1) - (3)].val.ival),(ps[(2) - (3)].val.opval)), (ps[(3) - (3)].val.opval)) );
                        }
     break;
 
-  case 104:
-#line 820 "perly.y"
-    { (yyval.opval) = convert(IVAL((ps[(1) - (5)].val.i_tkval)), OPf_STACKED,
-                               op_prepend_elem(OP_LIST, newGVREF(IVAL((ps[(1) - (5)].val.i_tkval)),(ps[(3) - (5)].val.opval)), (ps[(4) - (5)].val.opval)) );
-                         TOKEN_GETMAD((ps[(1) - (5)].val.i_tkval),(yyval.opval),'o');
-                         TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),')');
+  case 103:
+#line 634 "perly.y"
+    { (yyval.opval) = convert((ps[(1) - (5)].val.ival), OPf_STACKED,
+                               op_prepend_elem(OP_LIST, newGVREF((ps[(1) - (5)].val.ival),(ps[(3) - (5)].val.opval)), (ps[(4) - (5)].val.opval)) );
                        }
     break;
 
-  case 105:
-#line 827 "perly.y"
+  case 104:
+#line 638 "perly.y"
     { (yyval.opval) = convert(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST,
                                    op_prepend_elem(OP_LIST, scalar((ps[(1) - (6)].val.opval)), (ps[(5) - (6)].val.opval)),
                                    newUNOP(OP_METHOD, 0, (ps[(3) - (6)].val.opval))));
-                         TOKEN_GETMAD((ps[(2) - (6)].val.i_tkval),(yyval.opval),'A');
-                         TOKEN_GETMAD((ps[(4) - (6)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(6) - (6)].val.i_tkval),(yyval.opval),')');
                        }
     break;
 
-  case 106:
-#line 836 "perly.y"
+  case 105:
+#line 644 "perly.y"
     { (yyval.opval) = convert(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST, scalar((ps[(1) - (3)].val.opval)),
                                    newUNOP(OP_METHOD, 0, (ps[(3) - (3)].val.opval))));
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'A');
                        }
     break;
 
-  case 107:
-#line 842 "perly.y"
+  case 106:
+#line 649 "perly.y"
     { (yyval.opval) = convert(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST,
                                    op_prepend_elem(OP_LIST, (ps[(2) - (3)].val.opval), (ps[(3) - (3)].val.opval)),
@@ -907,349 +739,241 @@ case 2:
                        }
     break;
 
-  case 108:
-#line 848 "perly.y"
+  case 107:
+#line 655 "perly.y"
     { (yyval.opval) = convert(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST,
                                    op_prepend_elem(OP_LIST, (ps[(2) - (5)].val.opval), (ps[(4) - (5)].val.opval)),
                                    newUNOP(OP_METHOD, 0, (ps[(1) - (5)].val.opval))));
-                         TOKEN_GETMAD((ps[(3) - (5)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),')');
                        }
     break;
 
-  case 109:
-#line 856 "perly.y"
-    { (yyval.opval) = convert(IVAL((ps[(1) - (2)].val.i_tkval)), 0, (ps[(2) - (2)].val.opval));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+  case 108:
+#line 661 "perly.y"
+    { (yyval.opval) = convert((ps[(1) - (2)].val.ival), 0, (ps[(2) - (2)].val.opval)); }
     break;
 
-  case 110:
-#line 860 "perly.y"
-    { (yyval.opval) = convert(IVAL((ps[(1) - (4)].val.i_tkval)), 0, (ps[(3) - (4)].val.opval));
-                         TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'o');
-                         TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),')');
-                       }
+  case 109:
+#line 663 "perly.y"
+    { (yyval.opval) = convert((ps[(1) - (4)].val.ival), 0, (ps[(3) - (4)].val.opval)); }
     break;
 
-  case 111:
-#line 866 "perly.y"
+  case 110:
+#line 665 "perly.y"
     { SvREFCNT_inc_simple_void(PL_compcv);
                          (yyval.opval) = newANONATTRSUB((ps[(2) - (3)].val.ival), 0, (OP*)NULL, (ps[(3) - (3)].val.opval)); }
     break;
 
-  case 112:
-#line 869 "perly.y"
+  case 111:
+#line 668 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                 op_append_elem(OP_LIST,
                                   op_prepend_elem(OP_LIST, (ps[(4) - (5)].val.opval), (ps[(5) - (5)].val.opval)), (ps[(1) - (5)].val.opval)));
                        }
     break;
 
-  case 115:
-#line 884 "perly.y"
+  case 114:
+#line 683 "perly.y"
     { (yyval.opval) = newBINOP(OP_GELEM, 0, (ps[(1) - (5)].val.opval), scalar((ps[(3) - (5)].val.opval)));
                            PL_parser->expect = XOPERATOR;
-                         TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'{');
-                         TOKEN_GETMAD((ps[(4) - (5)].val.i_tkval),(yyval.opval),';');
-                         TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),'}');
                        }
     break;
 
-  case 116:
-#line 891 "perly.y"
+  case 115:
+#line 687 "perly.y"
     { (yyval.opval) = newBINOP(OP_AELEM, 0, oopsAV((ps[(1) - (4)].val.opval)), scalar((ps[(3) - (4)].val.opval)));
-                         TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'[');
-                         TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),']');
                        }
     break;
 
-  case 117:
-#line 896 "perly.y"
+  case 116:
+#line 690 "perly.y"
     { (yyval.opval) = newBINOP(OP_AELEM, 0,
                                        ref(newAVREF((ps[(1) - (5)].val.opval)),OP_RV2AV),
                                        scalar((ps[(4) - (5)].val.opval)));
-                         TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'a');
-                         TOKEN_GETMAD((ps[(3) - (5)].val.i_tkval),(yyval.opval),'[');
-                         TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),']');
                        }
     break;
 
-  case 118:
-#line 904 "perly.y"
+  case 117:
+#line 695 "perly.y"
     { (yyval.opval) = newBINOP(OP_AELEM, 0,
                                        ref(newAVREF((ps[(1) - (4)].val.opval)),OP_RV2AV),
                                        scalar((ps[(3) - (4)].val.opval)));
-                         TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'[');
-                         TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),']');
                        }
     break;
 
-  case 119:
-#line 911 "perly.y"
+  case 118:
+#line 700 "perly.y"
     { (yyval.opval) = newBINOP(OP_HELEM, 0, oopsHV((ps[(1) - (5)].val.opval)), jmaybe((ps[(3) - (5)].val.opval)));
                            PL_parser->expect = XOPERATOR;
-                         TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'{');
-                         TOKEN_GETMAD((ps[(4) - (5)].val.i_tkval),(yyval.opval),';');
-                         TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),'}');
                        }
     break;
 
-  case 120:
-#line 918 "perly.y"
+  case 119:
+#line 704 "perly.y"
     { (yyval.opval) = newBINOP(OP_HELEM, 0,
                                        ref(newHVREF((ps[(1) - (6)].val.opval)),OP_RV2HV),
                                        jmaybe((ps[(4) - (6)].val.opval)));
                            PL_parser->expect = XOPERATOR;
-                         TOKEN_GETMAD((ps[(2) - (6)].val.i_tkval),(yyval.opval),'a');
-                         TOKEN_GETMAD((ps[(3) - (6)].val.i_tkval),(yyval.opval),'{');
-                         TOKEN_GETMAD((ps[(5) - (6)].val.i_tkval),(yyval.opval),';');
-                         TOKEN_GETMAD((ps[(6) - (6)].val.i_tkval),(yyval.opval),'}');
                        }
     break;
 
-  case 121:
-#line 928 "perly.y"
+  case 120:
+#line 710 "perly.y"
     { (yyval.opval) = newBINOP(OP_HELEM, 0,
                                        ref(newHVREF((ps[(1) - (5)].val.opval)),OP_RV2HV),
                                        jmaybe((ps[(3) - (5)].val.opval)));
                            PL_parser->expect = XOPERATOR;
-                         TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'{');
-                         TOKEN_GETMAD((ps[(4) - (5)].val.i_tkval),(yyval.opval),';');
-                         TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),'}');
                        }
     break;
 
+  case 121:
+#line 716 "perly.y"
+    { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
+                                  newCVREF(0, scalar((ps[(1) - (4)].val.opval)))); }
+    break;
+
   case 122:
-#line 937 "perly.y"
+#line 719 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
-                                  newCVREF(0, scalar((ps[(1) - (4)].val.opval))));
-                         TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'a');
-                         TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),')');
-                       }
+                                  op_append_elem(OP_LIST, (ps[(4) - (5)].val.opval),
+                                      newCVREF(0, scalar((ps[(1) - (5)].val.opval))))); }
     break;
 
   case 123:
-#line 944 "perly.y"
+#line 724 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
-                                  op_append_elem(OP_LIST, (ps[(4) - (5)].val.opval),
-                                      newCVREF(0, scalar((ps[(1) - (5)].val.opval)))));
-                         TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'a');
-                         TOKEN_GETMAD((ps[(3) - (5)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),')');
-                       }
+                                  op_append_elem(OP_LIST, (ps[(3) - (4)].val.opval),
+                                              newCVREF(0, scalar((ps[(1) - (4)].val.opval))))); }
     break;
 
   case 124:
-#line 953 "perly.y"
+#line 728 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
-                                  op_append_elem(OP_LIST, (ps[(3) - (4)].val.opval),
-                                              newCVREF(0, scalar((ps[(1) - (4)].val.opval)))));
-                         TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),')');
-                       }
+                                  newCVREF(0, scalar((ps[(1) - (3)].val.opval)))); }
     break;
 
   case 125:
-#line 960 "perly.y"
-    { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
-                                  newCVREF(0, scalar((ps[(1) - (3)].val.opval))));
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')');
-                       }
+#line 731 "perly.y"
+    { (yyval.opval) = newSLICEOP(0, (ps[(5) - (6)].val.opval), (ps[(2) - (6)].val.opval)); }
     break;
 
   case 126:
-#line 966 "perly.y"
-    { (yyval.opval) = newSLICEOP(0, (ps[(5) - (6)].val.opval), (ps[(2) - (6)].val.opval));
-                         TOKEN_GETMAD((ps[(1) - (6)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(3) - (6)].val.i_tkval),(yyval.opval),')');
-                         TOKEN_GETMAD((ps[(4) - (6)].val.i_tkval),(yyval.opval),'[');
-                         TOKEN_GETMAD((ps[(6) - (6)].val.i_tkval),(yyval.opval),']');
-                       }
+#line 733 "perly.y"
+    { (yyval.opval) = newSLICEOP(0, (ps[(3) - (4)].val.opval), (ps[(1) - (4)].val.opval)); }
     break;
 
   case 127:
-#line 973 "perly.y"
-    { (yyval.opval) = newSLICEOP(0, (ps[(3) - (4)].val.opval), (ps[(1) - (4)].val.opval));
-                         TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'[');
-                         TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),']');
-                       }
+#line 735 "perly.y"
+    { (yyval.opval) = newSLICEOP(0, (ps[(4) - (5)].val.opval), (OP*)NULL); }
     break;
 
   case 128:
-#line 978 "perly.y"
-    { (yyval.opval) = newSLICEOP(0, (ps[(4) - (5)].val.opval), (OP*)NULL);
-                         TOKEN_GETMAD((ps[(1) - (5)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),')');
-                         TOKEN_GETMAD((ps[(3) - (5)].val.i_tkval),(yyval.opval),'[');
-                         TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),']');
-                       }
+#line 740 "perly.y"
+    { (yyval.opval) = newASSIGNOP(OPf_STACKED, (ps[(1) - (3)].val.opval), (ps[(2) - (3)].val.ival), (ps[(3) - (3)].val.opval)); }
     break;
 
   case 129:
-#line 988 "perly.y"
-    { (yyval.opval) = newASSIGNOP(OPf_STACKED, (ps[(1) - (3)].val.opval), IVAL((ps[(2) - (3)].val.i_tkval)), (ps[(3) - (3)].val.opval));
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 742 "perly.y"
+    { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); }
     break;
 
   case 130:
-#line 992 "perly.y"
-    { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
+#line 744 "perly.y"
+    {   if ((ps[(2) - (3)].val.ival) != OP_REPEAT)
+                               scalar((ps[(1) - (3)].val.opval));
+                           (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, (ps[(1) - (3)].val.opval), scalar((ps[(3) - (3)].val.opval)));
                        }
     break;
 
   case 131:
-#line 996 "perly.y"
-    {   if (IVAL((ps[(2) - (3)].val.i_tkval)) != OP_REPEAT)
-                               scalar((ps[(1) - (3)].val.opval));
-                           (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, (ps[(1) - (3)].val.opval), scalar((ps[(3) - (3)].val.opval)));
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 749 "perly.y"
+    { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); }
     break;
 
   case 132:
-#line 1002 "perly.y"
-    { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 751 "perly.y"
+    { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); }
     break;
 
   case 133:
-#line 1006 "perly.y"
-    { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 753 "perly.y"
+    { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); }
     break;
 
   case 134:
-#line 1010 "perly.y"
-    { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 755 "perly.y"
+    { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); }
     break;
 
   case 135:
-#line 1014 "perly.y"
-    { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 757 "perly.y"
+    { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); }
     break;
 
   case 136:
-#line 1018 "perly.y"
-    { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 759 "perly.y"
+    { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); }
     break;
 
   case 137:
-#line 1022 "perly.y"
-    { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 761 "perly.y"
+    { (yyval.opval) = newRANGE((ps[(2) - (3)].val.ival), scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); }
     break;
 
   case 138:
-#line 1026 "perly.y"
-    {
-                         (yyval.opval) = newRANGE(IVAL((ps[(2) - (3)].val.i_tkval)), scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
-                         DO_MAD({
-                             UNOP *op;
-                             op = (UNOP*)(yyval.opval);
-                             op = (UNOP*)op->op_first; /* get to flop */
-                             op = (UNOP*)op->op_first; /* get to flip */
-                             op = (UNOP*)op->op_first; /* get to range */
-                             token_getmad((ps[(2) - (3)].val.i_tkval),(OP*)op,'o');
-                           });
-                       }
+#line 763 "perly.y"
+    { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); }
     break;
 
   case 139:
-#line 1038 "perly.y"
-    { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 765 "perly.y"
+    { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); }
     break;
 
   case 140:
-#line 1042 "perly.y"
-    { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 767 "perly.y"
+    { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); }
     break;
 
   case 141:
-#line 1046 "perly.y"
-    { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 769 "perly.y"
+    { (yyval.opval) = bind_match((ps[(2) - (3)].val.ival), (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); }
     break;
 
   case 142:
-#line 1050 "perly.y"
-    { (yyval.opval) = bind_match(IVAL((ps[(2) - (3)].val.i_tkval)), (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),
-                               ((yyval.opval)->op_type == OP_NOT
-                                   ? ((UNOP*)(yyval.opval))->op_first : (yyval.opval)),
-                               '~');
-                       }
+#line 774 "perly.y"
+    { (yyval.opval) = newUNOP(OP_NEGATE, 0, scalar((ps[(2) - (2)].val.opval))); }
     break;
 
   case 143:
-#line 1060 "perly.y"
-    { (yyval.opval) = newUNOP(OP_NEGATE, 0, scalar((ps[(2) - (2)].val.opval)));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 776 "perly.y"
+    { (yyval.opval) = (ps[(2) - (2)].val.opval); }
     break;
 
   case 144:
-#line 1064 "perly.y"
-    { (yyval.opval) = IF_MAD(
-                                   newUNOP(OP_NULL, 0, (ps[(2) - (2)].val.opval)),
-                                   (ps[(2) - (2)].val.opval)
-                               );
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'+');
-                       }
+#line 779 "perly.y"
+    { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[(2) - (2)].val.opval))); }
     break;
 
   case 145:
-#line 1071 "perly.y"
-    { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[(2) - (2)].val.opval)));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 781 "perly.y"
+    { (yyval.opval) = newUNOP(OP_COMPLEMENT, 0, scalar((ps[(2) - (2)].val.opval))); }
     break;
 
   case 146:
-#line 1075 "perly.y"
-    { (yyval.opval) = newUNOP(OP_COMPLEMENT, 0, scalar((ps[(2) - (2)].val.opval)));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
-    break;
-
-  case 147:
-#line 1079 "perly.y"
+#line 783 "perly.y"
     { (yyval.opval) = newUNOP(OP_POSTINC, 0,
-                                       op_lvalue(scalar((ps[(1) - (2)].val.opval)), OP_POSTINC));
-                         TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+                                       op_lvalue(scalar((ps[(1) - (2)].val.opval)), OP_POSTINC)); }
     break;
 
-  case 148:
-#line 1084 "perly.y"
+  case 147:
+#line 786 "perly.y"
     { (yyval.opval) = newUNOP(OP_POSTDEC, 0,
-                                       op_lvalue(scalar((ps[(1) - (2)].val.opval)), OP_POSTDEC));
-                         TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+                                       op_lvalue(scalar((ps[(1) - (2)].val.opval)), OP_POSTDEC));}
     break;
 
-  case 149:
-#line 1089 "perly.y"
+  case 148:
+#line 789 "perly.y"
     { (yyval.opval) = convert(OP_JOIN, 0,
                                       op_append_elem(
                                        OP_LIST,
@@ -1259,164 +983,124 @@ case 2:
                                        )),
                                        (ps[(1) - (2)].val.opval)
                                       ));
-                         TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),'o');
                        }
     break;
 
-  case 150:
-#line 1101 "perly.y"
+  case 149:
+#line 800 "perly.y"
     { (yyval.opval) = newUNOP(OP_PREINC, 0,
-                                       op_lvalue(scalar((ps[(2) - (2)].val.opval)), OP_PREINC));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+                                       op_lvalue(scalar((ps[(2) - (2)].val.opval)), OP_PREINC)); }
     break;
 
-  case 151:
-#line 1106 "perly.y"
+  case 150:
+#line 803 "perly.y"
     { (yyval.opval) = newUNOP(OP_PREDEC, 0,
-                                       op_lvalue(scalar((ps[(2) - (2)].val.opval)), OP_PREDEC));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+                                       op_lvalue(scalar((ps[(2) - (2)].val.opval)), OP_PREDEC)); }
+    break;
+
+  case 151:
+#line 810 "perly.y"
+    { (yyval.opval) = newANONLIST((ps[(2) - (3)].val.opval)); }
     break;
 
   case 152:
-#line 1115 "perly.y"
-    { (yyval.opval) = newANONLIST((ps[(2) - (3)].val.opval));
-                         TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'[');
-                         TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),']');
-                       }
+#line 812 "perly.y"
+    { (yyval.opval) = newANONLIST((OP*)NULL);}
     break;
 
   case 153:
-#line 1120 "perly.y"
-    { (yyval.opval) = newANONLIST((OP*)NULL);
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'[');
-                         TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),']');
-                       }
+#line 814 "perly.y"
+    { (yyval.opval) = newANONHASH((ps[(2) - (4)].val.opval)); }
     break;
 
   case 154:
-#line 1125 "perly.y"
-    { (yyval.opval) = newANONHASH((ps[(2) - (4)].val.opval));
-                         TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'{');
-                         TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),';');
-                         TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),'}');
-                       }
+#line 816 "perly.y"
+    { (yyval.opval) = newANONHASH((OP*)NULL); }
     break;
 
   case 155:
-#line 1131 "perly.y"
-    { (yyval.opval) = newANONHASH((OP*)NULL);
-                         TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'{');
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),';');
-                         TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),'}');
-                       }
+#line 818 "perly.y"
+    { SvREFCNT_inc_simple_void(PL_compcv);
+                         (yyval.opval) = newANONATTRSUB((ps[(2) - (5)].val.ival), (ps[(3) - (5)].val.opval), (ps[(4) - (5)].val.opval), (ps[(5) - (5)].val.opval)); }
     break;
 
   case 156:
-#line 1137 "perly.y"
-    { SvREFCNT_inc_simple_void(PL_compcv);
-                         (yyval.opval) = newANONATTRSUB((ps[(2) - (5)].val.ival), (ps[(3) - (5)].val.opval), (ps[(4) - (5)].val.opval), (ps[(5) - (5)].val.opval));
-                         TOKEN_GETMAD((ps[(1) - (5)].val.i_tkval),(yyval.opval),'o');
-                         OP_GETMAD((ps[(3) - (5)].val.opval),(yyval.opval),'s');
-                         OP_GETMAD((ps[(4) - (5)].val.opval),(yyval.opval),'a');
-                       }
+#line 825 "perly.y"
+    { (yyval.opval) = dofile((ps[(2) - (2)].val.opval), (ps[(1) - (2)].val.ival));}
     break;
 
   case 157:
-#line 1148 "perly.y"
-    { (yyval.opval) = dofile((ps[(2) - (2)].val.opval), IVAL((ps[(1) - (2)].val.i_tkval)));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 827 "perly.y"
+    { (yyval.opval) = newUNOP(OP_NULL, OPf_SPECIAL, op_scope((ps[(2) - (2)].val.opval)));}
     break;
 
-  case 158:
-#line 1152 "perly.y"
-    { (yyval.opval) = newUNOP(OP_NULL, OPf_SPECIAL, op_scope((ps[(2) - (2)].val.opval)));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'D');
-                       }
+  case 162:
+#line 835 "perly.y"
+    { (yyval.opval) = newCONDOP(0, (ps[(1) - (5)].val.opval), (ps[(3) - (5)].val.opval), (ps[(5) - (5)].val.opval)); }
     break;
 
   case 163:
-#line 1162 "perly.y"
-    { (yyval.opval) = newCONDOP(0, (ps[(1) - (5)].val.opval), (ps[(3) - (5)].val.opval), (ps[(5) - (5)].val.opval));
-                         TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'?');
-                         TOKEN_GETMAD((ps[(4) - (5)].val.i_tkval),(yyval.opval),':');
-                       }
+#line 837 "perly.y"
+    { (yyval.opval) = newUNOP(OP_REFGEN, 0, op_lvalue((ps[(2) - (2)].val.opval),OP_REFGEN)); }
     break;
 
   case 164:
-#line 1167 "perly.y"
-    { (yyval.opval) = newUNOP(OP_REFGEN, 0, op_lvalue((ps[(2) - (2)].val.opval),OP_REFGEN));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 839 "perly.y"
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
     break;
 
   case 165:
-#line 1171 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
+#line 841 "perly.y"
+    { (yyval.opval) = localize((ps[(2) - (2)].val.opval),(ps[(1) - (2)].val.ival)); }
     break;
 
   case 166:
-#line 1173 "perly.y"
-    { (yyval.opval) = localize((ps[(2) - (2)].val.opval),IVAL((ps[(1) - (2)].val.i_tkval)));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'k');
-                       }
+#line 843 "perly.y"
+    { (yyval.opval) = sawparens((ps[(2) - (3)].val.opval)); }
     break;
 
   case 167:
-#line 1177 "perly.y"
-    { (yyval.opval) = sawparens(IF_MAD(newUNOP(OP_NULL,0,(ps[(2) - (3)].val.opval)), (ps[(2) - (3)].val.opval)));
-                         TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')');
-                       }
+#line 845 "perly.y"
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
     break;
 
   case 168:
-#line 1182 "perly.y"
-    { (yyval.opval) = IF_MAD(newUNOP(OP_NULL,0,(ps[(1) - (1)].val.opval)), (ps[(1) - (1)].val.opval)); }
+#line 847 "perly.y"
+    { (yyval.opval) = sawparens(newNULLLIST()); }
     break;
 
   case 169:
-#line 1184 "perly.y"
-    { (yyval.opval) = sawparens(newNULLLIST());
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),')');
-                       }
+#line 849 "perly.y"
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
     break;
 
   case 170:
-#line 1189 "perly.y"
+#line 851 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); }
     break;
 
   case 171:
-#line 1191 "perly.y"
+#line 853 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); }
     break;
 
   case 172:
-#line 1193 "perly.y"
+#line 855 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); }
     break;
 
   case 173:
-#line 1195 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
-    break;
-
-  case 174:
-#line 1197 "perly.y"
+#line 857 "perly.y"
     { (yyval.opval) = newUNOP(OP_AV2ARYLEN, 0, ref((ps[(1) - (1)].val.opval), OP_AV2ARYLEN));}
     break;
 
-  case 175:
-#line 1199 "perly.y"
+  case 174:
+#line 859 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); }
     break;
 
-  case 176:
-#line 1201 "perly.y"
+  case 175:
+#line 861 "perly.y"
     { (yyval.opval) = op_prepend_elem(OP_ASLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_ASLICE, 0,
@@ -1425,13 +1109,11 @@ case 2:
                          if ((yyval.opval) && (ps[(1) - (4)].val.opval))
                              (yyval.opval)->op_private |=
                                  (ps[(1) - (4)].val.opval)->op_private & OPpSLICEWARNING;
-                         TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'[');
-                         TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),']');
                        }
     break;
 
-  case 177:
-#line 1213 "perly.y"
+  case 176:
+#line 871 "perly.y"
     { (yyval.opval) = op_prepend_elem(OP_KVASLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_KVASLICE, 0,
@@ -1440,13 +1122,11 @@ case 2:
                          if ((yyval.opval) && (ps[(1) - (4)].val.opval))
                              (yyval.opval)->op_private |=
                                  (ps[(1) - (4)].val.opval)->op_private & OPpSLICEWARNING;
-                         TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'[');
-                         TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),']');
                        }
     break;
 
-  case 178:
-#line 1225 "perly.y"
+  case 177:
+#line 881 "perly.y"
     { (yyval.opval) = op_prepend_elem(OP_HSLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_HSLICE, 0,
@@ -1456,14 +1136,11 @@ case 2:
                              (yyval.opval)->op_private |=
                                  (ps[(1) - (5)].val.opval)->op_private & OPpSLICEWARNING;
                            PL_parser->expect = XOPERATOR;
-                         TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'{');
-                         TOKEN_GETMAD((ps[(4) - (5)].val.i_tkval),(yyval.opval),';');
-                         TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),'}');
                        }
     break;
 
-  case 179:
-#line 1239 "perly.y"
+  case 178:
+#line 892 "perly.y"
     { (yyval.opval) = op_prepend_elem(OP_KVHSLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_KVHSLICE, 0,
@@ -1473,216 +1150,157 @@ case 2:
                              (yyval.opval)->op_private |=
                                  (ps[(1) - (5)].val.opval)->op_private & OPpSLICEWARNING;
                            PL_parser->expect = XOPERATOR;
-                         TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'{');
-                         TOKEN_GETMAD((ps[(4) - (5)].val.i_tkval),(yyval.opval),';');
-                         TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),'}');
                        }
     break;
 
-  case 180:
-#line 1253 "perly.y"
+  case 179:
+#line 903 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); }
     break;
 
-  case 181:
-#line 1255 "perly.y"
+  case 180:
+#line 905 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar((ps[(1) - (1)].val.opval))); }
     break;
 
-  case 182:
-#line 1257 "perly.y"
+  case 181:
+#line 907 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[(1) - (3)].val.opval)));
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')');
                        }
     break;
 
-  case 183:
-#line 1262 "perly.y"
+  case 182:
+#line 910 "perly.y"
     {
                          (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST, (ps[(3) - (4)].val.opval), scalar((ps[(1) - (4)].val.opval))));
-                         DO_MAD({
-                             OP* op = (yyval.opval);
-                             if (op->op_type == OP_CONST) { /* defeat const fold */
-                               op = (OP*)op->op_madprop->mad_val;
-                             }
-                             token_getmad((ps[(2) - (4)].val.i_tkval),op,'(');
-                             token_getmad((ps[(4) - (4)].val.i_tkval),op,')');
-                         });
                        }
     break;
 
-  case 184:
-#line 1275 "perly.y"
+  case 183:
+#line 915 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                            op_append_elem(OP_LIST, (ps[(3) - (3)].val.opval), scalar((ps[(2) - (3)].val.opval))));
-                         TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'o');
                        }
     break;
 
+  case 184:
+#line 919 "perly.y"
+    { (yyval.opval) = newSVREF((ps[(1) - (4)].val.opval)); }
+    break;
+
   case 185:
-#line 1280 "perly.y"
-    { (yyval.opval) = newSVREF((ps[(1) - (4)].val.opval));
-                         TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),'$');
-                       }
+#line 921 "perly.y"
+    { (yyval.opval) = newAVREF((ps[(1) - (4)].val.opval)); }
     break;
 
   case 186:
-#line 1284 "perly.y"
-    { (yyval.opval) = newAVREF((ps[(1) - (4)].val.opval));
-                         TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),'@');
-                       }
+#line 923 "perly.y"
+    { (yyval.opval) = newHVREF((ps[(1) - (4)].val.opval)); }
     break;
 
   case 187:
-#line 1288 "perly.y"
-    { (yyval.opval) = newHVREF((ps[(1) - (4)].val.opval));
-                         TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),'%');
-                       }
+#line 925 "perly.y"
+    { (yyval.opval) = newUNOP(OP_ENTERSUB, 0,
+                                      scalar(newCVREF((ps[(3) - (4)].val.ival),(ps[(1) - (4)].val.opval)))); }
     break;
 
   case 188:
-#line 1292 "perly.y"
-    { (yyval.opval) = newUNOP(OP_ENTERSUB, 0,
-                                      scalar(newCVREF(IVAL((ps[(3) - (4)].val.i_tkval)),(ps[(1) - (4)].val.opval))));
-                         TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),'&');
-                       }
+#line 928 "perly.y"
+    { (yyval.opval) = newGVREF(0,(ps[(1) - (4)].val.opval)); }
     break;
 
   case 189:
-#line 1297 "perly.y"
-    { (yyval.opval) = newGVREF(0,(ps[(1) - (4)].val.opval));
-                         TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),'*');
-                       }
+#line 930 "perly.y"
+    { (yyval.opval) = newOP((ps[(1) - (1)].val.ival), OPf_SPECIAL);
+                           PL_hints |= HINT_BLOCK_SCOPE; }
     break;
 
   case 190:
-#line 1301 "perly.y"
-    { (yyval.opval) = newOP(IVAL((ps[(1) - (1)].val.i_tkval)), OPf_SPECIAL);
-                           PL_hints |= HINT_BLOCK_SCOPE;
-                         TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 933 "perly.y"
+    { (yyval.opval) = newLOOPEX((ps[(1) - (2)].val.ival),(ps[(2) - (2)].val.opval)); }
     break;
 
   case 191:
-#line 1306 "perly.y"
-    { (yyval.opval) = newLOOPEX(IVAL((ps[(1) - (2)].val.i_tkval)),(ps[(2) - (2)].val.opval));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 935 "perly.y"
+    { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[(2) - (2)].val.opval))); }
     break;
 
   case 192:
-#line 1310 "perly.y"
-    { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[(2) - (2)].val.opval)));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 937 "perly.y"
+    { (yyval.opval) = newOP((ps[(1) - (1)].val.ival), 0); }
     break;
 
   case 193:
-#line 1314 "perly.y"
-    { (yyval.opval) = newOP(IVAL((ps[(1) - (1)].val.i_tkval)), 0);
-                         TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 939 "perly.y"
+    { (yyval.opval) = newUNOP((ps[(1) - (2)].val.ival), 0, (ps[(2) - (2)].val.opval)); }
     break;
 
   case 194:
-#line 1318 "perly.y"
-    { (yyval.opval) = newUNOP(IVAL((ps[(1) - (2)].val.i_tkval)), 0, (ps[(2) - (2)].val.opval));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 941 "perly.y"
+    { (yyval.opval) = newUNOP((ps[(1) - (2)].val.ival), 0, (ps[(2) - (2)].val.opval)); }
     break;
 
   case 195:
-#line 1322 "perly.y"
-    { (yyval.opval) = newUNOP(IVAL((ps[(1) - (2)].val.i_tkval)), 0, (ps[(2) - (2)].val.opval));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 943 "perly.y"
+    { (yyval.opval) = newOP(OP_REQUIRE, (ps[(1) - (1)].val.ival) ? OPf_SPECIAL : 0); }
     break;
 
   case 196:
-#line 1326 "perly.y"
-    { (yyval.opval) = newOP(OP_REQUIRE, (ps[(1) - (1)].val.i_tkval) ? OPf_SPECIAL : 0);
-                         TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 945 "perly.y"
+    { (yyval.opval) = newUNOP(OP_REQUIRE, (ps[(1) - (2)].val.ival) ? OPf_SPECIAL : 0, (ps[(2) - (2)].val.opval)); }
     break;
 
   case 197:
-#line 1330 "perly.y"
-    { (yyval.opval) = newUNOP(OP_REQUIRE, (ps[(1) - (2)].val.i_tkval) ? OPf_SPECIAL : 0, (ps[(2) - (2)].val.opval));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 947 "perly.y"
+    { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[(1) - (1)].val.opval))); }
     break;
 
   case 198:
-#line 1334 "perly.y"
-    { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[(1) - (1)].val.opval))); }
+#line 949 "perly.y"
+    { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
+                           op_append_elem(OP_LIST, (ps[(2) - (2)].val.opval), scalar((ps[(1) - (2)].val.opval)))); }
     break;
 
   case 199:
-#line 1336 "perly.y"
-    { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
-                           op_append_elem(OP_LIST, (ps[(2) - (2)].val.opval), scalar((ps[(1) - (2)].val.opval)))); }
+#line 952 "perly.y"
+    { (yyval.opval) = newOP((ps[(1) - (1)].val.ival), 0); }
     break;
 
   case 200:
-#line 1339 "perly.y"
-    { (yyval.opval) = newOP(IVAL((ps[(1) - (1)].val.i_tkval)), 0);
-                         TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'o');
-                       }
+#line 954 "perly.y"
+    { (yyval.opval) = newOP((ps[(1) - (3)].val.ival), 0);}
     break;
 
   case 201:
-#line 1343 "perly.y"
-    { (yyval.opval) = newOP(IVAL((ps[(1) - (3)].val.i_tkval)), 0);
-                         TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'o');
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')');
-                       }
+#line 956 "perly.y"
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
     break;
 
   case 202:
-#line 1349 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
+#line 958 "perly.y"
+    { (yyval.opval) = (ps[(1) - (3)].val.opval); }
     break;
 
   case 203:
-#line 1351 "perly.y"
-    { (yyval.opval) = (ps[(1) - (3)].val.opval);
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')');
-                       }
+#line 960 "perly.y"
+    { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[(1) - (1)].val.opval))); }
     break;
 
   case 204:
-#line 1356 "perly.y"
-    { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
-                               scalar((ps[(1) - (1)].val.opval))); }
+#line 962 "perly.y"
+    { (yyval.opval) = ((ps[(1) - (3)].val.ival) == OP_NOT)
+                          ? newUNOP((ps[(1) - (3)].val.ival), 0, newSVOP(OP_CONST, 0, newSViv(0)))
+                          : newOP((ps[(1) - (3)].val.ival), OPf_SPECIAL); }
     break;
 
   case 205:
-#line 1359 "perly.y"
-    { (yyval.opval) = (IVAL((ps[(1) - (3)].val.i_tkval)) == OP_NOT)
-                           ? newUNOP(IVAL((ps[(1) - (3)].val.i_tkval)), 0, newSVOP(OP_CONST, 0, newSViv(0)))
-                           : newOP(IVAL((ps[(1) - (3)].val.i_tkval)), OPf_SPECIAL);
-
-                         TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'o');
-                         TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')');
-                       }
+#line 966 "perly.y"
+    { (yyval.opval) = newUNOP((ps[(1) - (4)].val.ival), 0, (ps[(3) - (4)].val.opval)); }
     break;
 
   case 206:
-#line 1368 "perly.y"
-    { (yyval.opval) = newUNOP(IVAL((ps[(1) - (4)].val.i_tkval)), 0, (ps[(3) - (4)].val.opval));
-                         TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'o');
-                         TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),')');
-                       }
-    break;
-
-  case 207:
-#line 1374 "perly.y"
+#line 968 "perly.y"
     {
                            if (   (ps[(1) - (1)].val.opval)->op_type != OP_TRANS
                                && (ps[(1) - (1)].val.opval)->op_type != OP_TRANSR
@@ -1695,186 +1313,150 @@ case 2:
                        }
     break;
 
-  case 208:
-#line 1385 "perly.y"
-    { (yyval.opval) = pmruntime((ps[(1) - (5)].val.opval), (ps[(4) - (5)].val.opval), 1, (ps[(2) - (5)].val.ival));
-                         TOKEN_GETMAD((ps[(3) - (5)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),')');
-                       }
+  case 207:
+#line 979 "perly.y"
+    { (yyval.opval) = pmruntime((ps[(1) - (5)].val.opval), (ps[(4) - (5)].val.opval), 1, (ps[(2) - (5)].val.ival)); }
     break;
 
-  case 211:
-#line 1392 "perly.y"
+  case 210:
+#line 983 "perly.y"
     {
                          (yyval.opval) = newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0),
                                newSVOP(OP_CONST, 0, newSVpvs("Unimplemented")));
-                         TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'X');
                        }
     break;
 
+  case 212:
+#line 992 "perly.y"
+    { (yyval.opval) = my_attrs((ps[(2) - (3)].val.opval),(ps[(3) - (3)].val.opval)); }
+    break;
+
   case 213:
-#line 1402 "perly.y"
-    { (yyval.opval) = my_attrs((ps[(2) - (3)].val.opval),(ps[(3) - (3)].val.opval));
-                         DO_MAD(
-                             token_getmad((ps[(1) - (3)].val.i_tkval),(yyval.opval),'d');
-                             append_madprops((ps[(3) - (3)].val.opval)->op_madprop, (yyval.opval), 'a');
-                             (ps[(3) - (3)].val.opval)->op_madprop = 0;
-                         );
-                       }
+#line 994 "perly.y"
+    { (yyval.opval) = localize((ps[(2) - (2)].val.opval),(ps[(1) - (2)].val.ival)); }
     break;
 
   case 214:
-#line 1410 "perly.y"
-    { (yyval.opval) = localize((ps[(2) - (2)].val.opval),IVAL((ps[(1) - (2)].val.i_tkval)));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'d');
-                       }
+#line 999 "perly.y"
+    { (yyval.opval) = sawparens((ps[(2) - (3)].val.opval)); }
     break;
 
   case 215:
-#line 1417 "perly.y"
-    { (yyval.opval) = sawparens((ps[(2) - (3)].val.opval));
-                         TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')');
-                       }
+#line 1001 "perly.y"
+    { (yyval.opval) = sawparens(newNULLLIST()); }
     break;
 
   case 216:
-#line 1422 "perly.y"
-    { (yyval.opval) = sawparens(newNULLLIST());
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'(');
-                         TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),')');
-                       }
+#line 1004 "perly.y"
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
     break;
 
   case 217:
-#line 1427 "perly.y"
+#line 1006 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); }
     break;
 
   case 218:
-#line 1429 "perly.y"
+#line 1008 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); }
     break;
 
   case 219:
-#line 1431 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
+#line 1013 "perly.y"
+    { (yyval.opval) = (OP*)NULL; }
     break;
 
   case 220:
-#line 1436 "perly.y"
-    { (yyval.opval) = (OP*)NULL; }
+#line 1015 "perly.y"
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
     break;
 
   case 221:
-#line 1438 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
+#line 1019 "perly.y"
+    { (yyval.opval) = (OP*)NULL; }
     break;
 
   case 222:
-#line 1442 "perly.y"
-    { (yyval.opval) = (OP*)NULL; }
+#line 1021 "perly.y"
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
     break;
 
   case 223:
-#line 1444 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
+#line 1027 "perly.y"
+    { PL_parser->in_my = 0; (yyval.opval) = my((ps[(1) - (1)].val.opval)); }
     break;
 
   case 224:
-#line 1450 "perly.y"
-    { PL_parser->in_my = 0; (yyval.opval) = my((ps[(1) - (1)].val.opval)); }
+#line 1031 "perly.y"
+    { (yyval.opval) = newCVREF((ps[(1) - (2)].val.ival),(ps[(2) - (2)].val.opval)); }
     break;
 
   case 225:
-#line 1454 "perly.y"
-    { (yyval.opval) = newCVREF(IVAL((ps[(1) - (2)].val.i_tkval)),(ps[(2) - (2)].val.opval));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'&');
-                       }
+#line 1035 "perly.y"
+    { (yyval.opval) = newSVREF((ps[(2) - (2)].val.opval)); }
     break;
 
   case 226:
-#line 1460 "perly.y"
-    { (yyval.opval) = newSVREF((ps[(2) - (2)].val.opval));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'$');
+#line 1039 "perly.y"
+    { (yyval.opval) = newAVREF((ps[(2) - (2)].val.opval));
+                         if ((yyval.opval)) (yyval.opval)->op_private |= (ps[(1) - (2)].val.ival);
                        }
     break;
 
   case 227:
-#line 1466 "perly.y"
-    { (yyval.opval) = newAVREF((ps[(2) - (2)].val.opval));
-                         if ((yyval.opval)) (yyval.opval)->op_private |= IVAL((ps[(1) - (2)].val.i_tkval));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'@');
+#line 1045 "perly.y"
+    { (yyval.opval) = newHVREF((ps[(2) - (2)].val.opval));
+                         if ((yyval.opval)) (yyval.opval)->op_private |= (ps[(1) - (2)].val.ival);
                        }
     break;
 
   case 228:
-#line 1473 "perly.y"
-    { (yyval.opval) = newHVREF((ps[(2) - (2)].val.opval));
-                         if ((yyval.opval)) (yyval.opval)->op_private |= IVAL((ps[(1) - (2)].val.i_tkval));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'%');
-                       }
+#line 1051 "perly.y"
+    { (yyval.opval) = newAVREF((ps[(2) - (2)].val.opval)); }
     break;
 
   case 229:
-#line 1480 "perly.y"
-    { (yyval.opval) = newAVREF((ps[(2) - (2)].val.opval));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'l');
-                       }
+#line 1053 "perly.y"
+    { (yyval.opval) = newAVREF((ps[(1) - (4)].val.opval)); }
     break;
 
   case 230:
-#line 1484 "perly.y"
-    { (yyval.opval) = newAVREF((ps[(1) - (4)].val.opval));
-                         TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),'l');
-                       }
+#line 1057 "perly.y"
+    { (yyval.opval) = newGVREF(0,(ps[(2) - (2)].val.opval)); }
     break;
 
-  case 231:
-#line 1490 "perly.y"
-    { (yyval.opval) = newGVREF(0,(ps[(2) - (2)].val.opval));
-                         TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'*');
-                       }
+  case 232:
+#line 1062 "perly.y"
+    { (yyval.opval) = newAVREF((ps[(1) - (3)].val.opval)); }
     break;
 
-  case 233:
-#line 1497 "perly.y"
-    { (yyval.opval) = newAVREF((ps[(1) - (3)].val.opval));
-                         TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),'@');
-                       }
+  case 234:
+#line 1067 "perly.y"
+    { (yyval.opval) = newHVREF((ps[(1) - (3)].val.opval)); }
     break;
 
-  case 235:
-#line 1504 "perly.y"
-    { (yyval.opval) = newHVREF((ps[(1) - (3)].val.opval));
-                         TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),'@');
-                       }
+  case 236:
+#line 1072 "perly.y"
+    { (yyval.opval) = newGVREF(0,(ps[(1) - (3)].val.opval)); }
     break;
 
   case 237:
-#line 1511 "perly.y"
-    { (yyval.opval) = newGVREF(0,(ps[(1) - (3)].val.opval));
-                         TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),'*');
-                       }
+#line 1077 "perly.y"
+    { (yyval.opval) = scalar((ps[(1) - (1)].val.opval)); }
     break;
 
   case 238:
-#line 1518 "perly.y"
+#line 1079 "perly.y"
     { (yyval.opval) = scalar((ps[(1) - (1)].val.opval)); }
     break;
 
   case 239:
-#line 1520 "perly.y"
-    { (yyval.opval) = scalar((ps[(1) - (1)].val.opval)); }
-    break;
-
-  case 240:
-#line 1522 "perly.y"
+#line 1081 "perly.y"
     { (yyval.opval) = op_scope((ps[(1) - (1)].val.opval)); }
     break;
 
-  case 241:
-#line 1525 "perly.y"
+  case 240:
+#line 1084 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); }
     break;
 
@@ -1882,6 +1464,6 @@ case 2:
     
 
 /* Generated from:
- * bb8245a1a537b2afb2445b3973f63b210f9ec346a1955071aef7d05ba97196ae perly.y
- * 5c9d2a0262457fe9b70073fc8ad6c188f812f38ad57712b7e2f53daa01b297cc regen_perly.pl
+ * 7e6c275bbd1dbc800c205a8a8b0cd785e4859f94976ee7372149598471f16f81 perly.y
+ * d1d4df7b8e30ac9dede664af9179e6e5e7ddc7f2ad9c4eff9e2e5b32c9e16a6e regen_perly.pl
  * ex: set ro: */
diff --git a/perly.c b/perly.c
index 46d25a5..eb25893 100644 (file)
--- a/perly.c
+++ b/perly.c
  *     restriction.  This special exception was added by the Free
  *     Software Foundation in version 1.24 of Bison.
  *
- * Note that this file is also #included in madly.c, to allow compilation
- * of a second parser, Perl_madparse, that is identical to Perl_yyparse,
- * but which includes extra code for dumping the parse tree.
- * This is controlled by the PERL_IN_MADLY_C define.
  */
 
 #include "EXTERN.h"
@@ -144,9 +140,6 @@ yy_stack_print (pTHX_ const yy_parser *parser)
                    : "(Nullop)"
            );
            break;
-#ifndef PERL_IN_MADLY_C
-       case toketype_i_tkval:
-#endif
        case toketype_ival:
            PerlIO_printf(Perl_debug_log, " %8"IVdf, (IV)ps->val.ival);
            break;
@@ -241,11 +234,7 @@ S_clear_yystack(pTHX_  const yy_parser *parser)
 `----------*/
 
 int
-#ifdef PERL_IN_MADLY_C
-Perl_madparse (pTHX_ int gramtype)
-#else
 Perl_yyparse (pTHX_ int gramtype)
-#endif
 {
     dVAR;
     int yystate;
@@ -265,13 +254,6 @@ Perl_yyparse (pTHX_ int gramtype)
          action routines: ie $$.  */
     YYSTYPE yyval;
 
-#ifndef PERL_IN_MADLY_C
-#  ifdef PERL_MAD
-    if (PL_madskills)
-       return madparse(gramtype);
-#  endif
-#endif
-
     YYDPRINTF ((Perl_debug_log, "Starting parse\n"));
 
     parser = PL_parser;
@@ -338,11 +320,7 @@ Perl_yyparse (pTHX_ int gramtype)
     /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
     if (parser->yychar == YYEMPTY) {
        YYDPRINTF ((Perl_debug_log, "Reading a token: "));
-#ifdef PERL_IN_MADLY_C
-       parser->yychar = PL_madskills ? madlex() : yylex();
-#else
        parser->yychar = yylex();
-#endif
 
 /* perly.tab is shipped based on an ASCII system; if it were to be regenerated
  * on a platform that doesn't use ASCII, this translation back would need to be
@@ -435,26 +413,6 @@ Perl_yyparse (pTHX_ int gramtype)
 
     switch (yyn) {
 
-#ifdef PERL_IN_MADLY_C
-#  define IVAL(i) (i)->tk_lval.ival
-#  define PVAL(p) (p)->tk_lval.pval
-#  define TOKEN_GETMAD(a,b,c) token_getmad((a),(b),(c))
-#  define TOKEN_FREE(a) token_free(a)
-#  define OP_GETMAD(a,b,c) op_getmad((a),(b),(c))
-#  define IF_MAD(a,b) (a)
-#  define DO_MAD(a) a
-#  define MAD
-#else
-#  define IVAL(i) (i)
-#  define PVAL(p) (p)
-#  define TOKEN_GETMAD(a,b,c)
-#  define TOKEN_FREE(a)
-#  define OP_GETMAD(a,b,c)
-#  define IF_MAD(a,b) (b)
-#  define DO_MAD(a)
-#  undef MAD
-#endif
-
 /* contains all the rule actions; auto-generated from perly.y */
 #include "perly.act"
 
diff --git a/perly.h b/perly.h
index e6426df..cd92798 100644 (file)
--- a/perly.h
+++ b/perly.h
@@ -5,11 +5,11 @@
  */
 
 #ifdef PERL_CORE
-/* A Bison parser, made by GNU Bison 2.5.  */
+/* A Bison parser, made by GNU Bison 2.7.12-4996.  */
 
 /* Bison interface for Yacc-like parsers in C
    
-      Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
+      Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int yydebug;
+#endif
 
 /* Tokens.  */
 #ifndef YYTOKENTYPE
      POSTINC = 334,
      PREDEC = 335,
      PREINC = 336,
-     ARROW = 337,
-     PEG = 338
+     ARROW = 337
    };
 #endif
 
 #define PREDEC 335
 #define PREINC 336
 #define ARROW 337
-#define PEG 338
-
 
 
 #ifdef PERL_IN_TOKE_C
@@ -239,28 +243,16 @@ S_is_opval_token(int type) {
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
 {
-
-/* Line 2068 of yacc.c  */
+/* Line 2053 of yacc.c  */
 
     I32        ival; /* __DEFAULT__ (marker for regen_perly.pl;
                                must always be 1st union member) */
     char *pval;
     OP *opval;
     GV *gvval;
-#ifdef PERL_IN_MADLY_C
-    TOKEN* p_tkval;
-    TOKEN* i_tkval;
-#else
-    char *p_tkval;
-    I32        i_tkval;
-#endif
-#ifdef PERL_MAD
-    TOKEN* tkval;
-#endif
 
 
-
-/* Line 2068 of yacc.c  */
+/* Line 2053 of yacc.c  */
 } YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
@@ -268,10 +260,22 @@ typedef union YYSTYPE
 #endif
 
 
-
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void *YYPARSE_PARAM);
+#else
+int yyparse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
 
 
 /* Generated from:
- * bb8245a1a537b2afb2445b3973f63b210f9ec346a1955071aef7d05ba97196ae perly.y
- * 5c9d2a0262457fe9b70073fc8ad6c188f812f38ad57712b7e2f53daa01b297cc regen_perly.pl
+ * 7e6c275bbd1dbc800c205a8a8b0cd785e4859f94976ee7372149598471f16f81 perly.y
+ * d1d4df7b8e30ac9dede664af9179e6e5e7ddc7f2ad9c4eff9e2e5b32c9e16a6e regen_perly.pl
  * ex: set ro: */
index 4f5a86a..bd3a25c 100644 (file)
--- a/perly.tab
+++ b/perly.tab
@@ -6,20 +6,20 @@
 
 #define YYFINAL  14
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   2731
+#define YYLAST   2763
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  105
+#define YYNTOKENS  104
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  72
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  241
+#define YYNRULES  240
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  475
+#define YYNSTATES  474
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   338
+#define YYMAXUTOK   337
 
 #define YYTRANSLATE(YYX)                                               \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -60,7 +60,7 @@ static const yytype_uint8 yytranslate[] =
       59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
       69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
       79,    81,    84,    85,    86,    87,    88,    89,    90,    93,
-      94,    95,    96,    97,    98,    99,   100,   101,   104
+      94,    95,    96,    97,    98,    99,   100,   101
 };
 
 #if YYDEBUG
@@ -70,151 +70,151 @@ static const yytype_uint16 yyprhs[] =
 {
        0,     0,     3,     4,     9,    10,    14,    15,    19,    20,
       24,    25,    29,    30,    34,    39,    47,    48,    53,    54,
-      55,    58,    59,    62,    64,    66,    69,    72,    74,    76,
-      81,    82,    90,    95,    96,   104,   112,   120,   127,   134,
-     137,   146,   155,   167,   177,   186,   194,   197,   198,   207,
-     210,   212,   215,   216,   220,   222,   224,   228,   232,   236,
-     240,   244,   248,   249,   252,   259,   260,   263,   264,   265,
-     267,   268,   270,   272,   274,   276,   278,   280,   281,   282,
-     283,   284,   286,   288,   289,   291,   292,   295,   297,   300,
-     302,   303,   304,   308,   314,   316,   318,   322,   326,   330,
-     332,   335,   339,   341,   345,   351,   358,   362,   366,   372,
-     375,   380,   381,   387,   389,   391,   397,   402,   408,   413,
-     419,   426,   432,   437,   443,   448,   452,   459,   464,   470,
-     474,   478,   482,   486,   490,   494,   498,   502,   506,   510,
-     514,   518,   522,   526,   529,   532,   535,   538,   541,   544,
-     547,   550,   553,   557,   560,   565,   569,   575,   578,   581,
-     583,   585,   587,   589,   595,   598,   600,   603,   607,   609,
-     612,   614,   616,   618,   620,   622,   624,   629,   634,   640,
-     646,   648,   650,   654,   659,   663,   668,   673,   678,   683,
-     688,   690,   693,   696,   698,   701,   704,   706,   709,   711,
-     714,   716,   720,   722,   726,   728,   732,   737,   738,   744,
-     746,   748,   750,   752,   756,   759,   763,   766,   768,   770,
-     772,   773,   775,   776,   778,   780,   783,   786,   789,   792,
-     795,   800,   803,   805,   809,   811,   815,   817,   821,   823,
-     825,   827
+      55,    58,    59,    62,    64,    66,    69,    72,    74,    79,
+      80,    88,    93,    94,   102,   110,   118,   125,   132,   135,
+     144,   153,   165,   175,   184,   192,   195,   196,   205,   208,
+     210,   213,   214,   218,   220,   222,   226,   230,   234,   238,
+     242,   246,   247,   250,   257,   258,   261,   262,   263,   265,
+     266,   268,   270,   272,   274,   276,   278,   279,   280,   281,
+     282,   284,   286,   287,   289,   290,   293,   295,   298,   300,
+     301,   302,   306,   312,   314,   316,   320,   324,   328,   330,
+     333,   337,   339,   343,   349,   356,   360,   364,   370,   373,
+     378,   379,   385,   387,   389,   395,   400,   406,   411,   417,
+     424,   430,   435,   441,   446,   450,   457,   462,   468,   472,
+     476,   480,   484,   488,   492,   496,   500,   504,   508,   512,
+     516,   520,   524,   527,   530,   533,   536,   539,   542,   545,
+     548,   551,   555,   558,   563,   567,   573,   576,   579,   581,
+     583,   585,   587,   593,   596,   598,   601,   605,   607,   610,
+     612,   614,   616,   618,   620,   622,   627,   632,   638,   644,
+     646,   648,   652,   657,   661,   666,   671,   676,   681,   686,
+     688,   691,   694,   696,   699,   702,   704,   707,   709,   712,
+     714,   718,   720,   724,   726,   730,   735,   736,   742,   744,
+     746,   748,   750,   754,   757,   761,   764,   766,   768,   770,
+     771,   773,   774,   776,   778,   781,   784,   787,   790,   793,
+     798,   801,   803,   807,   809,   813,   815,   819,   821,   823,
+     825
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 static const yytype_int16 yyrhs[] =
 {
-     106,     0,    -1,    -1,     3,   107,   115,   118,    -1,    -1,
-       4,   108,   165,    -1,    -1,     5,   109,   113,    -1,    -1,
-       6,   110,   122,    -1,    -1,     7,   111,   120,    -1,    -1,
-       8,   112,   118,    -1,     9,   115,   118,    10,    -1,    21,
-     115,    20,    74,   119,    20,    22,    -1,    -1,     9,   117,
-     118,    10,    -1,    -1,    -1,   118,   120,    -1,    -1,   119,
-     126,    -1,   122,    -1,   121,    -1,    36,   122,    -1,    36,
-     121,    -1,    35,    -1,   104,    -1,    37,   141,   138,   114,
-      -1,    -1,    38,   142,   139,   123,   143,   144,   149,    -1,
-      40,    23,    23,    20,    -1,    -1,    41,   139,   124,    23,
-      23,   164,    20,    -1,    44,   103,   115,   135,   102,   116,
-     129,    -1,    45,   103,   115,   137,   102,   116,   129,    -1,
-      50,   103,   115,   135,   102,   116,    -1,    51,   103,   115,
-     135,   102,   116,    -1,    52,   113,    -1,    42,   103,   115,
-     133,   102,   131,   116,   130,    -1,    43,   103,   115,   134,
-     102,   131,   116,   130,    -1,    49,   103,   115,   136,    20,
-     133,    20,   131,   136,   102,   116,    -1,    49,    70,   115,
-     166,   103,   135,   102,   116,   130,    -1,    49,   168,   103,
-     115,   135,   102,   116,   130,    -1,    49,   103,   115,   135,
-     102,   116,   130,    -1,   113,   130,    -1,    -1,    40,    23,
-      23,     9,   115,   125,   118,    10,    -1,   128,    20,    -1,
-      20,    -1,    26,   127,    -1,    -1,    73,   118,    74,    -1,
-       1,    -1,   150,    -1,   150,    44,   150,    -1,   150,    45,
-     150,    -1,   150,    42,   150,    -1,   150,    43,   134,    -1,
-     150,    49,   150,    -1,   150,    51,   150,    -1,    -1,    46,
-     116,    -1,    47,   103,   135,   102,   116,   129,    -1,    -1,
-      48,   113,    -1,    -1,    -1,   128,    -1,    -1,   150,    -1,
-     150,    -1,   150,    -1,   132,    -1,   134,    -1,    23,    -1,
-      -1,    -1,    -1,    -1,    23,    -1,    28,    -1,    -1,    26,
-      -1,    -1,    72,    26,    -1,    72,    -1,    72,    26,    -1,
-      72,    -1,    -1,    -1,   103,   147,   102,    -1,   115,   146,
-       9,   118,    10,    -1,   148,    -1,    20,    -1,   150,    78,
-     150,    -1,   150,    77,   150,    -1,   150,    76,   150,    -1,
-     151,    -1,   151,    80,    -1,   151,    80,   160,    -1,   160,
-      -1,    60,   176,   151,    -1,    58,   103,   176,   150,   102,
-      -1,   160,   101,   154,   103,   165,   102,    -1,   160,   101,
-     154,    -1,    24,   176,   164,    -1,    25,   176,   103,   165,
-     102,    -1,    60,   164,    -1,    58,   103,   165,   102,    -1,
-      -1,    33,   140,   113,   153,   164,    -1,    24,    -1,   168,
-      -1,   175,     9,   150,    20,    10,    -1,   168,    11,   150,
-      12,    -1,   160,   101,    11,   150,    12,    -1,   155,    11,
-     150,    12,    -1,   168,     9,   150,    20,    10,    -1,   160,
-     101,     9,   150,    20,    10,    -1,   155,     9,   150,    20,
-      10,    -1,   160,   101,   103,   102,    -1,   160,   101,   103,
-     150,   102,    -1,   155,   103,   150,   102,    -1,   155,   103,
-     102,    -1,   103,   150,   102,    11,   150,    12,    -1,    29,
-      11,   150,    12,    -1,   103,   102,    11,   150,    12,    -1,
-     160,    81,   160,    -1,   160,    95,   160,    -1,   160,    63,
-     160,    -1,   160,    64,   160,    -1,   160,    89,   160,    -1,
-     160,    61,   160,    -1,   160,    62,   160,    -1,   160,    88,
-     160,    -1,   160,    87,   160,    -1,   160,    54,   160,    -1,
-     160,    86,   160,    -1,   160,    85,   160,    -1,   160,    84,
-     160,    -1,   160,    90,   160,    -1,    13,   160,    -1,    14,
-     160,    -1,    91,   160,    -1,    92,   160,    -1,   160,    98,
-      -1,   160,    97,    -1,   160,    96,    -1,   100,   160,    -1,
-      99,   160,    -1,    11,   150,    12,    -1,    11,    12,    -1,
-      67,   150,    20,    10,    -1,    67,    20,    10,    -1,    39,
-     140,   143,   144,   148,    -1,    66,   160,    -1,    66,   113,
-      -1,   156,    -1,   157,    -1,   158,    -1,   159,    -1,   160,
-      82,   160,    83,   160,    -1,    93,   160,    -1,   162,    -1,
-      69,   160,    -1,   103,   150,   102,    -1,    29,    -1,   103,
-     102,    -1,   168,    -1,   172,    -1,   170,    -1,   169,    -1,
-     171,    -1,   155,    -1,   173,    11,   150,    12,    -1,   174,
-      11,   150,    12,    -1,   173,     9,   150,    20,    10,    -1,
-     174,     9,   150,    20,    10,    -1,    26,    -1,   167,    -1,
-     167,   103,   102,    -1,   167,   103,   150,   102,    -1,    68,
-     142,   164,    -1,   160,   101,    15,    18,    -1,   160,   101,
-      16,    18,    -1,   160,   101,    17,    18,    -1,   160,   101,
-      19,    18,    -1,   160,   101,    18,    18,    -1,    53,    -1,
-      53,   160,    -1,    79,   151,    -1,    59,    -1,    59,   113,
-      -1,    59,   160,    -1,    71,    -1,    71,   160,    -1,    32,
-      -1,    32,   160,    -1,    56,    -1,    56,   103,   102,    -1,
-      30,    -1,    30,   103,   102,    -1,    31,    -1,    57,   103,
-     102,    -1,    57,   103,   150,   102,    -1,    -1,    27,   161,
-     103,   151,   102,    -1,    23,    -1,   152,    -1,    55,    -1,
-      34,    -1,    70,   163,   145,    -1,    70,   163,    -1,   103,
-     150,   102,    -1,   103,   102,    -1,   168,    -1,   170,    -1,
-     169,    -1,    -1,   151,    -1,    -1,   150,    -1,   168,    -1,
-      19,   176,    -1,    15,   176,    -1,    16,   176,    -1,    17,
-     176,    -1,    65,   176,    -1,   160,   101,    65,    18,    -1,
-      18,   176,    -1,   169,    -1,   160,   101,    16,    -1,   170,
-      -1,   160,   101,    17,    -1,   172,    -1,   160,   101,    18,
-      -1,    23,    -1,   168,    -1,   113,    -1,    28,    -1
+     105,     0,    -1,    -1,     3,   106,   114,   117,    -1,    -1,
+       4,   107,   164,    -1,    -1,     5,   108,   112,    -1,    -1,
+       6,   109,   121,    -1,    -1,     7,   110,   119,    -1,    -1,
+       8,   111,   117,    -1,     9,   114,   117,    10,    -1,    21,
+     114,    20,    74,   118,    20,    22,    -1,    -1,     9,   116,
+     117,    10,    -1,    -1,    -1,   117,   119,    -1,    -1,   118,
+     125,    -1,   121,    -1,   120,    -1,    36,   121,    -1,    36,
+     120,    -1,    35,    -1,    37,   140,   137,   113,    -1,    -1,
+      38,   141,   138,   122,   142,   143,   148,    -1,    40,    23,
+      23,    20,    -1,    -1,    41,   138,   123,    23,    23,   163,
+      20,    -1,    44,   103,   114,   134,   102,   115,   128,    -1,
+      45,   103,   114,   136,   102,   115,   128,    -1,    50,   103,
+     114,   134,   102,   115,    -1,    51,   103,   114,   134,   102,
+     115,    -1,    52,   112,    -1,    42,   103,   114,   132,   102,
+     130,   115,   129,    -1,    43,   103,   114,   133,   102,   130,
+     115,   129,    -1,    49,   103,   114,   135,    20,   132,    20,
+     130,   135,   102,   115,    -1,    49,    70,   114,   165,   103,
+     134,   102,   115,   129,    -1,    49,   167,   103,   114,   134,
+     102,   115,   129,    -1,    49,   103,   114,   134,   102,   115,
+     129,    -1,   112,   129,    -1,    -1,    40,    23,    23,     9,
+     114,   124,   117,    10,    -1,   127,    20,    -1,    20,    -1,
+      26,   126,    -1,    -1,    73,   117,    74,    -1,     1,    -1,
+     149,    -1,   149,    44,   149,    -1,   149,    45,   149,    -1,
+     149,    42,   149,    -1,   149,    43,   133,    -1,   149,    49,
+     149,    -1,   149,    51,   149,    -1,    -1,    46,   115,    -1,
+      47,   103,   134,   102,   115,   128,    -1,    -1,    48,   112,
+      -1,    -1,    -1,   127,    -1,    -1,   149,    -1,   149,    -1,
+     149,    -1,   131,    -1,   133,    -1,    23,    -1,    -1,    -1,
+      -1,    -1,    23,    -1,    28,    -1,    -1,    26,    -1,    -1,
+      72,    26,    -1,    72,    -1,    72,    26,    -1,    72,    -1,
+      -1,    -1,   103,   146,   102,    -1,   114,   145,     9,   117,
+      10,    -1,   147,    -1,    20,    -1,   149,    78,   149,    -1,
+     149,    77,   149,    -1,   149,    76,   149,    -1,   150,    -1,
+     150,    80,    -1,   150,    80,   159,    -1,   159,    -1,    60,
+     175,   150,    -1,    58,   103,   175,   149,   102,    -1,   159,
+     101,   153,   103,   164,   102,    -1,   159,   101,   153,    -1,
+      24,   175,   163,    -1,    25,   175,   103,   164,   102,    -1,
+      60,   163,    -1,    58,   103,   164,   102,    -1,    -1,    33,
+     139,   112,   152,   163,    -1,    24,    -1,   167,    -1,   174,
+       9,   149,    20,    10,    -1,   167,    11,   149,    12,    -1,
+     159,   101,    11,   149,    12,    -1,   154,    11,   149,    12,
+      -1,   167,     9,   149,    20,    10,    -1,   159,   101,     9,
+     149,    20,    10,    -1,   154,     9,   149,    20,    10,    -1,
+     159,   101,   103,   102,    -1,   159,   101,   103,   149,   102,
+      -1,   154,   103,   149,   102,    -1,   154,   103,   102,    -1,
+     103,   149,   102,    11,   149,    12,    -1,    29,    11,   149,
+      12,    -1,   103,   102,    11,   149,    12,    -1,   159,    81,
+     159,    -1,   159,    95,   159,    -1,   159,    63,   159,    -1,
+     159,    64,   159,    -1,   159,    89,   159,    -1,   159,    61,
+     159,    -1,   159,    62,   159,    -1,   159,    88,   159,    -1,
+     159,    87,   159,    -1,   159,    54,   159,    -1,   159,    86,
+     159,    -1,   159,    85,   159,    -1,   159,    84,   159,    -1,
+     159,    90,   159,    -1,    13,   159,    -1,    14,   159,    -1,
+      91,   159,    -1,    92,   159,    -1,   159,    98,    -1,   159,
+      97,    -1,   159,    96,    -1,   100,   159,    -1,    99,   159,
+      -1,    11,   149,    12,    -1,    11,    12,    -1,    67,   149,
+      20,    10,    -1,    67,    20,    10,    -1,    39,   139,   142,
+     143,   147,    -1,    66,   159,    -1,    66,   112,    -1,   155,
+      -1,   156,    -1,   157,    -1,   158,    -1,   159,    82,   159,
+      83,   159,    -1,    93,   159,    -1,   161,    -1,    69,   159,
+      -1,   103,   149,   102,    -1,    29,    -1,   103,   102,    -1,
+     167,    -1,   171,    -1,   169,    -1,   168,    -1,   170,    -1,
+     154,    -1,   172,    11,   149,    12,    -1,   173,    11,   149,
+      12,    -1,   172,     9,   149,    20,    10,    -1,   173,     9,
+     149,    20,    10,    -1,    26,    -1,   166,    -1,   166,   103,
+     102,    -1,   166,   103,   149,   102,    -1,    68,   141,   163,
+      -1,   159,   101,    15,    18,    -1,   159,   101,    16,    18,
+      -1,   159,   101,    17,    18,    -1,   159,   101,    19,    18,
+      -1,   159,   101,    18,    18,    -1,    53,    -1,    53,   159,
+      -1,    79,   150,    -1,    59,    -1,    59,   112,    -1,    59,
+     159,    -1,    71,    -1,    71,   159,    -1,    32,    -1,    32,
+     159,    -1,    56,    -1,    56,   103,   102,    -1,    30,    -1,
+      30,   103,   102,    -1,    31,    -1,    57,   103,   102,    -1,
+      57,   103,   149,   102,    -1,    -1,    27,   160,   103,   150,
+     102,    -1,    23,    -1,   151,    -1,    55,    -1,    34,    -1,
+      70,   162,   144,    -1,    70,   162,    -1,   103,   149,   102,
+      -1,   103,   102,    -1,   167,    -1,   169,    -1,   168,    -1,
+      -1,   150,    -1,    -1,   149,    -1,   167,    -1,    19,   175,
+      -1,    15,   175,    -1,    16,   175,    -1,    17,   175,    -1,
+      65,   175,    -1,   159,   101,    65,    18,    -1,    18,   175,
+      -1,   168,    -1,   159,   101,    16,    -1,   169,    -1,   159,
+     101,    17,    -1,   171,    -1,   159,   101,    18,    -1,    23,
+      -1,   167,    -1,   112,    -1,    28,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   142,   142,   141,   151,   150,   160,   159,   172,   171,
-     184,   183,   196,   195,   207,   217,   227,   230,   240,   245,
-     246,   256,   257,   266,   274,   278,   286,   296,   298,   303,
-     321,   320,   370,   386,   385,   402,   411,   420,   431,   433,
-     435,   445,   455,   476,   485,   494,   503,   510,   509,   526,
-     532,   542,   566,   567,   572,   574,   576,   580,   584,   588,
-     592,   597,   603,   604,   610,   624,   625,   634,   640,   641,
-     646,   649,   653,   658,   662,   666,   670,   671,   675,   681,
-     686,   691,   692,   697,   698,   703,   704,   708,   718,   722,
-     732,   734,   733,   752,   764,   765,   775,   779,   783,   787,
-     791,   801,   810,   814,   819,   826,   835,   841,   847,   855,
-     859,   866,   865,   876,   877,   881,   890,   895,   903,   910,
-     917,   927,   936,   943,   952,   959,   965,   972,   977,   987,
-     991,   995,  1001,  1005,  1009,  1013,  1017,  1021,  1025,  1037,
-    1041,  1045,  1049,  1059,  1063,  1070,  1074,  1078,  1083,  1088,
-    1100,  1105,  1114,  1119,  1124,  1130,  1136,  1147,  1151,  1157,
-    1158,  1159,  1160,  1161,  1166,  1170,  1172,  1176,  1181,  1183,
-    1188,  1190,  1192,  1194,  1196,  1198,  1200,  1212,  1224,  1238,
-    1252,  1254,  1256,  1261,  1274,  1279,  1283,  1287,  1291,  1296,
-    1300,  1305,  1309,  1313,  1317,  1321,  1325,  1329,  1333,  1335,
-    1338,  1342,  1348,  1350,  1355,  1358,  1367,  1374,  1373,  1389,
-    1390,  1391,  1397,  1401,  1409,  1416,  1421,  1426,  1428,  1430,
-    1435,  1437,  1442,  1443,  1449,  1453,  1459,  1465,  1472,  1479,
-    1483,  1489,  1495,  1496,  1502,  1503,  1509,  1510,  1517,  1519,
-    1521,  1524
+       0,   114,   114,   113,   123,   122,   132,   131,   144,   143,
+     156,   155,   168,   167,   179,   187,   195,   198,   206,   211,
+     212,   222,   223,   232,   236,   240,   244,   251,   253,   264,
+     263,   295,   303,   302,   310,   316,   322,   333,   335,   337,
+     344,   351,   366,   371,   377,   383,   390,   389,   404,   409,
+     418,   436,   437,   442,   444,   446,   448,   450,   452,   454,
+     457,   463,   464,   469,   480,   481,   487,   493,   494,   499,
+     502,   506,   511,   515,   519,   523,   524,   528,   534,   539,
+     544,   545,   550,   551,   556,   557,   559,   564,   566,   571,
+     573,   572,   591,   601,   602,   608,   610,   612,   614,   618,
+     620,   625,   629,   633,   637,   643,   648,   654,   660,   662,
+     665,   664,   675,   676,   680,   686,   689,   694,   699,   703,
+     709,   715,   718,   723,   727,   730,   732,   734,   739,   741,
+     743,   748,   750,   752,   754,   756,   758,   760,   762,   764,
+     766,   768,   773,   775,   778,   780,   782,   785,   788,   799,
+     802,   809,   811,   813,   815,   817,   824,   826,   830,   831,
+     832,   833,   834,   836,   838,   840,   842,   844,   846,   848,
+     850,   852,   854,   856,   858,   860,   870,   880,   891,   902,
+     904,   906,   909,   914,   918,   920,   922,   924,   927,   929,
+     932,   934,   936,   938,   940,   942,   944,   946,   948,   951,
+     953,   955,   957,   959,   961,   965,   968,   967,   980,   981,
+     982,   987,   991,   993,   998,  1000,  1003,  1005,  1007,  1012,
+    1014,  1019,  1020,  1026,  1030,  1034,  1038,  1044,  1050,  1052,
+    1056,  1060,  1061,  1065,  1066,  1070,  1071,  1076,  1078,  1080,
+    1083
 };
 #endif
 
-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+#if YYDEBUG || YYERROR_VERBOSE || 0
 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
 static const char *const yytname[] =
@@ -233,18 +233,18 @@ static const char *const yytname[] =
   "ANDOP", "NOTOP", "','", "ASSIGNOP", "'?'", "':'", "DORDOR", "OROR",
   "ANDAND", "BITOROP", "BITANDOP", "SHIFTOP", "MATCHOP", "'!'", "'~'",
   "REFGEN", "UMINUS", "POWOP", "POSTJOIN", "POSTDEC", "POSTINC", "PREDEC",
-  "PREINC", "ARROW", "')'", "'('", "PEG", "$accept", "grammar", "$@1",
-  "$@2", "$@3", "$@4", "$@5", "$@6", "block", "formblock", "remember",
-  "mblock", "mremember", "stmtseq", "formstmtseq", "fullstmt",
-  "labfullstmt", "barestmt", "$@7", "$@8", "$@9", "formline", "formarg",
-  "sideff", "else", "cont", "mintro", "nexpr", "texpr", "iexpr", "mexpr",
-  "mnexpr", "miexpr", "formname", "startsub", "startanonsub",
-  "startformsub", "subname", "proto", "subattrlist", "myattrlist",
-  "subsignature", "@10", "realsubbody", "optsubbody", "expr", "listexpr",
-  "listop", "@11", "method", "subscripted", "termbinop", "termunop",
-  "anonymous", "termdo", "term", "@12", "myattrterm", "myterm",
-  "optlistexpr", "optexpr", "my_scalar", "amper", "scalar", "ary", "hsh",
-  "arylen", "star", "sliceme", "kvslice", "gelem", "indirob", 0
+  "PREINC", "ARROW", "')'", "'('", "$accept", "grammar", "$@1", "$@2",
+  "$@3", "$@4", "$@5", "$@6", "block", "formblock", "remember", "mblock",
+  "mremember", "stmtseq", "formstmtseq", "fullstmt", "labfullstmt",
+  "barestmt", "$@7", "$@8", "$@9", "formline", "formarg", "sideff", "else",
+  "cont", "mintro", "nexpr", "texpr", "iexpr", "mexpr", "mnexpr", "miexpr",
+  "formname", "startsub", "startanonsub", "startformsub", "subname",
+  "proto", "subattrlist", "myattrlist", "subsignature", "@10",
+  "realsubbody", "optsubbody", "expr", "listexpr", "listop", "@11",
+  "method", "subscripted", "termbinop", "termunop", "anonymous", "termdo",
+  "term", "@12", "myattrterm", "myterm", "optlistexpr", "optexpr",
+  "my_scalar", "amper", "scalar", "ary", "hsh", "arylen", "star",
+  "sliceme", "kvslice", "gelem", "indirob", YY_NULL
 };
 #endif
 
@@ -263,38 +263,38 @@ static const yytype_uint16 yytoknum[] =
      311,   312,   313,   314,   315,   316,   317,   318,   319,   320,
       44,   321,    63,    58,   322,   323,   324,   325,   326,   327,
      328,    33,   126,   329,   330,   331,   332,   333,   334,   335,
-     336,   337,    41,    40,   338
+     336,   337,    41,    40
 };
 # endif
 
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint8 yyr1[] =
 {
-       0,   105,   107,   106,   108,   106,   109,   106,   110,   106,
-     111,   106,   112,   106,   113,   114,   115,   116,   117,   118,
-     118,   119,   119,   120,   120,   121,   121,   122,   122,   122,
-     123,   122,   122,   124,   122,   122,   122,   122,   122,   122,
-     122,   122,   122,   122,   122,   122,   122,   125,   122,   122,
-     122,   126,   127,   127,   128,   128,   128,   128,   128,   128,
-     128,   128,   129,   129,   129,   130,   130,   131,   132,   132,
-     133,   133,   134,   135,   136,   137,   138,   138,   139,   140,
-     141,   142,   142,   143,   143,   144,   144,   144,   145,   145,
-     146,   147,   146,   148,   149,   149,   150,   150,   150,   150,
-     151,   151,   151,   152,   152,   152,   152,   152,   152,   152,
-     152,   153,   152,   154,   154,   155,   155,   155,   155,   155,
-     155,   155,   155,   155,   155,   155,   155,   155,   155,   156,
-     156,   156,   156,   156,   156,   156,   156,   156,   156,   156,
-     156,   156,   156,   157,   157,   157,   157,   157,   157,   157,
-     157,   157,   158,   158,   158,   158,   158,   159,   159,   160,
-     160,   160,   160,   160,   160,   160,   160,   160,   160,   160,
-     160,   160,   160,   160,   160,   160,   160,   160,   160,   160,
-     160,   160,   160,   160,   160,   160,   160,   160,   160,   160,
-     160,   160,   160,   160,   160,   160,   160,   160,   160,   160,
-     160,   160,   160,   160,   160,   160,   160,   161,   160,   160,
-     160,   160,   160,   162,   162,   163,   163,   163,   163,   163,
-     164,   164,   165,   165,   166,   167,   168,   169,   170,   171,
-     171,   172,   173,   173,   174,   174,   175,   175,   176,   176,
-     176,   176
+       0,   104,   106,   105,   107,   105,   108,   105,   109,   105,
+     110,   105,   111,   105,   112,   113,   114,   115,   116,   117,
+     117,   118,   118,   119,   119,   120,   120,   121,   121,   122,
+     121,   121,   123,   121,   121,   121,   121,   121,   121,   121,
+     121,   121,   121,   121,   121,   121,   124,   121,   121,   121,
+     125,   126,   126,   127,   127,   127,   127,   127,   127,   127,
+     127,   128,   128,   128,   129,   129,   130,   131,   131,   132,
+     132,   133,   134,   135,   136,   137,   137,   138,   139,   140,
+     141,   141,   142,   142,   143,   143,   143,   144,   144,   145,
+     146,   145,   147,   148,   148,   149,   149,   149,   149,   150,
+     150,   150,   151,   151,   151,   151,   151,   151,   151,   151,
+     152,   151,   153,   153,   154,   154,   154,   154,   154,   154,
+     154,   154,   154,   154,   154,   154,   154,   154,   155,   155,
+     155,   155,   155,   155,   155,   155,   155,   155,   155,   155,
+     155,   155,   156,   156,   156,   156,   156,   156,   156,   156,
+     156,   157,   157,   157,   157,   157,   158,   158,   159,   159,
+     159,   159,   159,   159,   159,   159,   159,   159,   159,   159,
+     159,   159,   159,   159,   159,   159,   159,   159,   159,   159,
+     159,   159,   159,   159,   159,   159,   159,   159,   159,   159,
+     159,   159,   159,   159,   159,   159,   159,   159,   159,   159,
+     159,   159,   159,   159,   159,   159,   160,   159,   159,   159,
+     159,   159,   161,   161,   162,   162,   162,   162,   162,   163,
+     163,   164,   164,   165,   166,   167,   168,   169,   170,   170,
+     171,   172,   172,   173,   173,   174,   174,   175,   175,   175,
+     175
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -302,29 +302,29 @@ static const yytype_uint8 yyr2[] =
 {
        0,     2,     0,     4,     0,     3,     0,     3,     0,     3,
        0,     3,     0,     3,     4,     7,     0,     4,     0,     0,
-       2,     0,     2,     1,     1,     2,     2,     1,     1,     4,
-       0,     7,     4,     0,     7,     7,     7,     6,     6,     2,
-       8,     8,    11,     9,     8,     7,     2,     0,     8,     2,
-       1,     2,     0,     3,     1,     1,     3,     3,     3,     3,
-       3,     3,     0,     2,     6,     0,     2,     0,     0,     1,
-       0,     1,     1,     1,     1,     1,     1,     0,     0,     0,
-       0,     1,     1,     0,     1,     0,     2,     1,     2,     1,
-       0,     0,     3,     5,     1,     1,     3,     3,     3,     1,
-       2,     3,     1,     3,     5,     6,     3,     3,     5,     2,
-       4,     0,     5,     1,     1,     5,     4,     5,     4,     5,
-       6,     5,     4,     5,     4,     3,     6,     4,     5,     3,
+       2,     0,     2,     1,     1,     2,     2,     1,     4,     0,
+       7,     4,     0,     7,     7,     7,     6,     6,     2,     8,
+       8,    11,     9,     8,     7,     2,     0,     8,     2,     1,
+       2,     0,     3,     1,     1,     3,     3,     3,     3,     3,
+       3,     0,     2,     6,     0,     2,     0,     0,     1,     0,
+       1,     1,     1,     1,     1,     1,     0,     0,     0,     0,
+       1,     1,     0,     1,     0,     2,     1,     2,     1,     0,
+       0,     3,     5,     1,     1,     3,     3,     3,     1,     2,
+       3,     1,     3,     5,     6,     3,     3,     5,     2,     4,
+       0,     5,     1,     1,     5,     4,     5,     4,     5,     6,
+       5,     4,     5,     4,     3,     6,     4,     5,     3,     3,
        3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
-       3,     3,     3,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     3,     2,     4,     3,     5,     2,     2,     1,
-       1,     1,     1,     5,     2,     1,     2,     3,     1,     2,
-       1,     1,     1,     1,     1,     1,     4,     4,     5,     5,
-       1,     1,     3,     4,     3,     4,     4,     4,     4,     4,
-       1,     2,     2,     1,     2,     2,     1,     2,     1,     2,
-       1,     3,     1,     3,     1,     3,     4,     0,     5,     1,
-       1,     1,     1,     3,     2,     3,     2,     1,     1,     1,
-       0,     1,     0,     1,     1,     2,     2,     2,     2,     2,
-       4,     2,     1,     3,     1,     3,     1,     3,     1,     1,
-       1,     1
+       3,     3,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     3,     2,     4,     3,     5,     2,     2,     1,     1,
+       1,     1,     5,     2,     1,     2,     3,     1,     2,     1,
+       1,     1,     1,     1,     1,     4,     4,     5,     5,     1,
+       1,     3,     4,     3,     4,     4,     4,     4,     4,     1,
+       2,     2,     1,     2,     2,     1,     2,     1,     2,     1,
+       3,     1,     3,     1,     3,     4,     0,     5,     1,     1,
+       1,     1,     3,     2,     3,     2,     1,     1,     1,     0,
+       1,     0,     1,     1,     2,     2,     2,     2,     2,     4,
+       2,     1,     3,     1,     3,     1,     3,     1,     1,     1,
+       1
 };
 
 /* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
@@ -332,345 +332,362 @@ static const yytype_uint8 yyr2[] =
    means the default is an error.  */
 static const yytype_uint8 yydefact[] =
 {
-       0,     2,     4,     6,     8,    10,    12,     0,    16,   222,
+       0,     2,     4,     6,     8,    10,    12,     0,    16,   221,
        0,     0,     0,    19,     1,    19,     0,     0,     0,     0,
-       0,     0,     0,     0,   209,     0,     0,   180,   207,   168,
-     202,   204,   198,    79,   212,    79,   190,   211,   200,     0,
-       0,   193,   220,     0,     0,     0,     0,     0,     0,   196,
-       0,     0,     0,     0,     0,     0,     0,   223,    99,   210,
-     175,   159,   160,   161,   162,   102,   165,     5,   181,   170,
-     173,   172,   174,   171,     0,     0,     0,    16,     7,    54,
-      50,    27,    80,     0,     0,    78,     0,     0,     0,     0,
-       0,     0,     0,     0,    28,    65,     9,     0,    55,     0,
-      11,    24,    23,     0,     0,   153,     0,   143,   144,   238,
-     241,   240,   239,   226,   227,   228,   231,   225,   220,     0,
-       0,     0,     0,   199,     0,    83,   191,     0,     0,   222,
-     194,   195,   238,   221,   109,   239,     0,   229,   158,   157,
-       0,     0,    81,    82,   220,   166,     0,   214,   217,   219,
-     218,   197,   192,   145,   146,   164,   151,   150,   169,     0,
-       0,     0,     0,   100,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   208,     0,     0,   179,   206,   167,
+     201,   203,   197,    78,   211,    78,   189,   210,   199,     0,
+       0,   192,   219,     0,     0,     0,     0,     0,     0,   195,
+       0,     0,     0,     0,     0,     0,     0,   222,    98,   209,
+     174,   158,   159,   160,   161,   101,   164,     5,   180,   169,
+     172,   171,   173,   170,     0,     0,     0,    16,     7,    53,
+      49,    27,    79,     0,     0,    77,     0,     0,     0,     0,
+       0,     0,     0,     0,    64,     9,     0,    54,     0,    11,
+      24,    23,     0,     0,   152,     0,   142,   143,   237,   240,
+     239,   238,   225,   226,   227,   230,   224,   219,     0,     0,
+       0,     0,   198,     0,    82,   190,     0,     0,   221,   193,
+     194,   237,   220,   108,   238,     0,   228,   157,   156,     0,
+       0,    80,    81,   219,   165,     0,   213,   216,   218,   217,
+     196,   191,   144,   145,   163,   150,   149,   168,     0,     0,
+       0,     0,    99,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   149,   148,   147,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,    19,    77,    78,     0,    33,    16,
-      16,    16,    16,    16,    16,     0,    16,    16,    39,     0,
-      46,    49,     0,     0,     0,     0,     0,     0,    26,    25,
-      20,   152,   107,   222,     0,     0,   203,   111,    84,    85,
-     201,   205,     0,     0,     0,   103,   155,     0,   184,   216,
-       0,    89,   213,     0,   167,    98,    97,    96,   101,     0,
-       0,   125,     0,   138,   134,   135,   131,   132,   129,     0,
-     141,   140,   139,   137,   136,   133,   142,   130,     0,     0,
-       0,   233,   235,   237,     0,   113,     0,     0,   106,   114,
-     182,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      76,     0,    30,     0,     0,    70,     0,     0,     0,     0,
-       0,    16,     0,     0,    66,    58,    59,    72,    56,    57,
-      60,    61,     0,     0,   127,   220,    87,    16,   206,   110,
-       0,   154,   215,    88,     0,     0,     0,   118,   124,     0,
-       0,     0,   185,   186,   187,   189,   188,   230,   122,     0,
-     222,   183,     0,   116,     0,   176,     0,   177,     0,    14,
-      16,    29,    83,    16,    32,     0,     0,    71,     0,     0,
-      73,    75,     0,     0,   224,    69,    74,     0,     0,    55,
-       0,     0,     0,   108,   208,   112,    86,    90,   156,   104,
-     128,     0,   121,   163,     0,   117,   123,     0,   119,   178,
-     179,   115,     0,    85,    47,   220,    67,    67,     0,     0,
-       0,     0,    70,     0,     0,     0,    91,     0,   126,   120,
-     105,     0,    16,    19,     0,     0,     0,    18,    62,    62,
-       0,    65,     0,     0,    37,    38,     0,    19,    21,    95,
-      94,    31,     0,    34,    65,    65,    19,     0,     0,    35,
-      36,     0,    45,    67,    65,    92,     0,     0,    48,    40,
-      41,     0,    63,     0,    65,     0,    44,    93,     0,    52,
-      22,    17,     0,    43,     0,    15,    19,    51,     0,     0,
-       0,    62,    42,    53,    64
+       0,   148,   147,   146,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    19,    76,    77,     0,    32,    16,    16,
+      16,    16,    16,    16,     0,    16,    16,    38,     0,    45,
+      48,     0,     0,     0,     0,     0,     0,    26,    25,    20,
+     151,   106,   221,     0,     0,   202,   110,    83,    84,   200,
+     204,     0,     0,     0,   102,   154,     0,   183,   215,     0,
+      88,   212,     0,   166,    97,    96,    95,   100,     0,     0,
+     124,     0,   137,   133,   134,   130,   131,   128,     0,   140,
+     139,   138,   136,   135,   132,   141,   129,     0,     0,     0,
+     232,   234,   236,     0,   112,     0,     0,   105,   113,   181,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    75,
+       0,    29,     0,     0,    69,     0,     0,     0,     0,     0,
+      16,     0,     0,    65,    57,    58,    71,    55,    56,    59,
+      60,     0,     0,   126,   219,    86,    16,   205,   109,     0,
+     153,   214,    87,     0,     0,     0,   117,   123,     0,     0,
+       0,   184,   185,   186,   188,   187,   229,   121,     0,   221,
+     182,     0,   115,     0,   175,     0,   176,     0,    14,    16,
+      28,    82,    16,    31,     0,     0,    70,     0,     0,    72,
+      74,     0,     0,   223,    68,    73,     0,     0,    54,     0,
+       0,     0,   107,   207,   111,    85,    89,   155,   103,   127,
+       0,   120,   162,     0,   116,   122,     0,   118,   177,   178,
+     114,     0,    84,    46,   219,    66,    66,     0,     0,     0,
+       0,    69,     0,     0,     0,    90,     0,   125,   119,   104,
+       0,    16,    19,     0,     0,     0,    18,    61,    61,     0,
+      64,     0,     0,    36,    37,     0,    19,    21,    94,    93,
+      30,     0,    33,    64,    64,    19,     0,     0,    34,    35,
+       0,    44,    66,    64,    91,     0,     0,    47,    39,    40,
+       0,    62,     0,    64,     0,    43,    92,     0,    51,    22,
+      17,     0,    42,     0,    15,    19,    50,     0,     0,     0,
+      61,    41,    52,    63
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,     7,     8,     9,    10,    11,    12,    13,   111,   351,
-     377,   418,   436,   103,   447,   220,   101,   102,   352,   294,
-     413,   460,   467,    97,   439,   210,   415,   366,   356,   306,
-     359,   368,   362,   291,   198,   124,   195,   144,   229,   317,
-     242,   407,   426,   378,   431,    98,    58,    59,   315,   278,
-      60,    61,    62,    63,    64,    65,   120,    66,   147,   134,
-      67,   363,    68,    69,    70,    71,    72,    73,    74,    75,
-      76,   113
+      -1,     7,     8,     9,    10,    11,    12,    13,   110,   350,
+     376,   417,   435,   102,   446,   219,   100,   101,   351,   293,
+     412,   459,   466,    96,   438,   209,   414,   365,   355,   305,
+     358,   367,   361,   290,   197,   123,   194,   143,   228,   316,
+     241,   406,   425,   377,   430,    97,    58,    59,   314,   277,
+      60,    61,    62,    63,    64,    65,   119,    66,   146,   133,
+      67,   362,    68,    69,    70,    71,    72,    73,    74,    75,
+      76,   112
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -401
+#define YYPACT_NINF -408
 static const yytype_int16 yypact[] =
 {
-     709,  -401,  -401,  -401,  -401,  -401,  -401,    15,  -401,  2565,
-      19,  1216,  1120,  -401,  -401,  -401,  1825,  2565,  2565,   379,
-     379,   379,   379,   379,  -401,   379,   379,  -401,  -401,    13,
-     -51,  -401,  2565,  -401,  -401,  -401,  2565,  -401,   -45,   -39,
-     -17,  1732,  1639,   379,  1732,  1916,    26,  2565,    10,  2565,
-    2565,  2565,  2565,  2565,  2565,  2565,  2007,   -21,    11,  -401,
-       1,  -401,  -401,  -401,  -401,  2585,  -401,  -401,    -7,    54,
-     108,   131,  -401,    91,   156,   221,    92,  -401,  -401,  -401,
-    -401,  -401,  -401,    26,    99,  -401,    20,    52,    53,    65,
-     -11,    69,    89,    19,  -401,   116,  -401,   158,   368,  1120,
-    -401,  -401,  -401,   448,   544,  -401,    -1,   250,   250,  -401,
-    -401,  -401,  -401,  -401,  -401,  -401,  -401,  -401,  2565,    90,
-      94,  2565,    96,  1901,    19,   182,  2585,   125,  2100,  1639,
-    -401,  1901,  1545,    11,  -401,  1466,  2565,  -401,  -401,  1901,
-     208,    68,  -401,  -401,  2565,  1901,  2193,   167,  -401,  -401,
-    -401,  1901,    11,   250,   250,   250,   520,   520,   231,   139,
-    2565,  2565,  2565,  2565,  2565,  2565,  2286,  2565,  2565,  2565,
-    2565,  2565,  2565,  2565,  2565,  2565,  2565,  2565,  2565,  2565,
-    2565,  2565,  -401,  -401,  -401,    63,  2379,  2565,  2565,  2565,
-    2565,  2565,  2565,  2565,  -401,   222,  -401,   223,  -401,  -401,
-    -401,  -401,  -401,  -401,  -401,   141,  -401,  -401,  -401,    19,
-    -401,  -401,  2565,  2565,  2565,  2565,  2565,  2565,  -401,  -401,
-    -401,  -401,  -401,  2565,  2565,    61,  -401,  -401,  -401,   191,
-    -401,  -401,   160,   162,  2565,    11,  -401,   257,  -401,  -401,
-     213,   247,  -401,  2565,   269,   199,   199,  -401,  2585,    75,
-      72,  -401,   233,  1298,  1810,  1624,   529,   273,  2585,   295,
-     342,   342,  1436,  1515,  1717,  1348,   250,   250,  2565,  2565,
-     515,   267,   288,   289,   290,  -401,   296,  2472,   178,  -401,
-    -401,   349,   157,    93,   248,    98,   255,   103,   263,   640,
-    -401,   297,  -401,    12,   264,  2565,  2565,  2565,  2565,   301,
-    1310,  -401,  2565,  2565,  -401,   -21,  -401,   -21,   -21,   -21,
-     -21,   -21,   217,   -66,  -401,  2565,   302,  -401,  -401,  -401,
-     418,  -401,  -401,  -401,   118,  2565,   311,  -401,  -401,  2565,
-     266,   124,  -401,  -401,  -401,  -401,  -401,  -401,  -401,   434,
-    2565,  -401,   317,  -401,   320,  -401,   340,  -401,   343,  -401,
-    -401,  -401,   182,  -401,  -401,   329,   252,   -21,   253,   258,
-     -21,  -401,   259,   261,  -401,  -401,  -401,   271,   366,   227,
-    2565,   285,   287,  -401,  -401,  -401,  -401,   292,  -401,  -401,
-    -401,   129,  -401,  2630,   388,  -401,  -401,   298,  -401,  -401,
-    -401,  -401,   394,   191,  -401,  2565,  -401,  -401,   399,   399,
-    2565,   399,  2565,   314,   399,   399,  -401,   409,  -401,  -401,
-    -401,   346,   401,  -401,   403,   399,   399,  -401,    23,    23,
-     331,   116,   414,   399,  -401,  -401,   333,  -401,  -401,  -401,
-    -401,  -401,   736,  -401,   116,   116,  -401,   399,   339,  -401,
-    -401,   399,  -401,  -401,   116,  -401,   832,     9,  -401,  -401,
-    -401,   928,  -401,  2565,   116,  1403,  -401,  -401,   425,   380,
-    -401,  -401,   350,  -401,   353,  -401,  -401,  -401,   399,   399,
-    1024,    23,  -401,  -401,  -401
+     714,  -408,  -408,  -408,  -408,  -408,  -408,     5,  -408,  2549,
+      20,  1201,  1108,  -408,  -408,  -408,  1809,  2549,  2549,   608,
+     608,   608,   608,   608,  -408,   608,   608,  -408,  -408,    48,
+     -67,  -408,  2549,  -408,  -408,  -408,  2549,  -408,   -54,   -41,
+     -26,  1716,  1623,   608,  1716,  1900,    50,  2549,    40,  2549,
+    2549,  2549,  2549,  2549,  2549,  2549,  1991,   226,    21,  -408,
+      11,  -408,  -408,  -408,  -408,  2617,  -408,  -408,    -8,   107,
+     136,   155,  -408,    98,   220,   251,   110,  -408,  -408,  -408,
+    -408,  -408,  -408,    50,    77,  -408,    19,    26,    37,    41,
+       1,    45,    51,    20,    93,  -408,   135,   367,  1108,  -408,
+    -408,  -408,   447,   542,  -408,    -2,   614,   614,  -408,  -408,
+    -408,  -408,  -408,  -408,  -408,  -408,  -408,  2549,    56,   100,
+    2549,    92,  1701,    20,   188,  2617,   124,  2084,  1623,  -408,
+    1701,  1529,    21,  -408,  1450,  2549,  -408,  -408,  1701,   225,
+       3,  -408,  -408,  2549,  1701,  2177,   168,  -408,  -408,  -408,
+    1701,    21,   614,   614,   614,   354,   354,   232,   -50,  2549,
+    2549,  2549,  2549,  2549,  2549,  2270,  2549,  2549,  2549,  2549,
+    2549,  2549,  2549,  2549,  2549,  2549,  2549,  2549,  2549,  2549,
+    2549,  -408,  -408,  -408,   252,  2363,  2549,  2549,  2549,  2549,
+    2549,  2549,  2549,  -408,   221,  -408,   259,  -408,  -408,  -408,
+    -408,  -408,  -408,  -408,   171,  -408,  -408,  -408,    20,  -408,
+    -408,  2549,  2549,  2549,  2549,  2549,  2549,  -408,  -408,  -408,
+    -408,  -408,  2549,  2549,     9,  -408,  -408,  -408,   211,  -408,
+    -408,   140,   184,  2549,    21,  -408,   295,  -408,  -408,   212,
+     284,  -408,  2549,   302,   240,   240,  -408,  2617,    74,    13,
+    -408,   291,   341,  1608,   245,   529,   432,  2617,  2572,   289,
+     289,  1279,  1420,  1499,  1332,   614,   614,  2549,  2549,   257,
+     309,   313,   321,   326,  -408,   327,  2456,   217,  -408,  -408,
+     304,   101,    60,   119,    91,   129,    94,   156,   637,  -408,
+     328,  -408,    15,   324,  2549,  2549,  2549,  2549,   339,  1294,
+    -408,  2549,  2549,  -408,   226,  -408,   226,   226,   226,   226,
+     226,   254,   -48,  -408,  2549,   334,  -408,  -408,  -408,   433,
+    -408,  -408,  -408,    97,  2549,   352,  -408,  -408,  2549,   160,
+     115,  -408,  -408,  -408,  -408,  -408,  -408,  -408,   443,  2549,
+    -408,   353,  -408,   360,  -408,   362,  -408,   363,  -408,  -408,
+    -408,   188,  -408,  -408,   365,   287,   226,   290,   292,   226,
+    -408,   297,   288,  -408,  -408,  -408,   299,   377,   281,  2549,
+     306,   311,  -408,  -408,  -408,  -408,   312,  -408,  -408,  -408,
+     123,  -408,  2662,   407,  -408,  -408,   317,  -408,  -408,  -408,
+    -408,   400,   211,  -408,  2549,  -408,  -408,   413,   413,  2549,
+     413,  2549,   322,   413,   413,  -408,   423,  -408,  -408,  -408,
+     359,   414,  -408,   421,   413,   413,  -408,    23,    23,   344,
+      93,   434,   413,  -408,  -408,   355,  -408,  -408,  -408,  -408,
+    -408,   732,  -408,    93,    93,  -408,   413,   366,  -408,  -408,
+     413,  -408,  -408,    93,  -408,   827,    38,  -408,  -408,  -408,
+     922,  -408,  2549,    93,  1387,  -408,  -408,   446,   402,  -408,
+    -408,   391,  -408,   392,  -408,  -408,  -408,   413,   413,  1015,
+      23,  -408,  -408,  -408
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -401,  -401,  -401,  -401,  -401,  -401,  -401,  -401,   -10,  -401,
-      22,  -103,  -401,   -12,  -401,   444,   359,     7,  -401,  -401,
-    -401,  -401,  -401,  -295,  -400,    88,  -381,  -401,    67,  -189,
-    -280,    21,  -401,  -401,   274,   467,  -401,   438,   173,   133,
-    -401,  -401,  -401,   117,  -401,    -3,   -33,  -401,  -401,  -401,
-    -401,  -401,  -401,  -401,  -401,    80,  -401,  -401,  -401,  -111,
-    -121,  -401,  -401,    18,   480,   483,  -401,  -401,  -401,  -401,
-    -401,    25
+    -408,  -408,  -408,  -408,  -408,  -408,  -408,  -408,   -10,  -408,
+      22,  -103,  -408,   -12,  -408,   489,   410,     7,  -408,  -408,
+    -408,  -408,  -408,  -291,  -407,  -105,  -377,  -408,   122,   -18,
+    -287,    70,  -408,  -408,   330,   496,  -408,   449,   183,   144,
+    -408,  -408,  -408,   126,  -408,    -3,   -33,  -408,  -408,  -408,
+    -408,  -408,  -408,  -408,  -408,    79,  -408,  -408,  -408,  -110,
+    -124,  -408,  -408,    18,   493,   500,  -408,  -408,  -408,  -408,
+    -408,    25
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -237
+#define YYTABLE_NINF -236
 static const yytype_int16 yytable[] =
 {
-      78,    95,    95,   104,    19,   365,    57,   222,   233,   133,
-     164,   221,   165,   106,   163,    14,   416,   152,    96,   440,
-     367,   353,   371,   372,   121,    19,    20,    21,    77,   458,
-      15,   130,   354,   238,   138,   459,   374,   112,   112,   112,
-     112,   112,   141,   112,   112,   114,   115,   116,   117,   142,
-     118,   119,   122,   159,   143,   160,   161,   162,   127,   203,
-     135,   112,   455,   187,   128,   188,   148,   136,   137,   437,
-     438,   474,   268,   314,   269,   160,   161,   162,   270,   271,
-     272,   273,   274,   208,   327,   133,   129,   275,   237,    95,
-     403,   163,   204,    95,    95,   326,   186,   107,   108,   194,
-    -236,   193,   312,   235,   166,   343,   219,   358,   205,   361,
-     345,   133,   123,   146,   227,   347,   126,  -232,   225,  -232,
-     420,   131,   197,   199,   139,   232,    57,   145,   276,   151,
-     380,   153,   154,   155,   156,   157,   385,   160,   161,   162,
-    -234,   408,  -234,   240,   160,   161,   162,   135,   160,   161,
-     162,   160,   161,   162,   234,   200,   201,   245,   246,   247,
-     365,   249,   250,   252,   209,   189,   277,   190,   202,   160,
-     161,   162,   206,   462,   160,   161,   162,   342,   211,   160,
-     161,   162,   289,   281,   282,   283,   284,   285,   286,   287,
-     288,   313,   207,   223,   160,   161,   162,   224,   226,   304,
-     160,   161,   162,   279,   375,   160,   161,   162,   228,   305,
-     307,   308,   309,   310,   311,   160,   161,   162,   236,   387,
-      57,   295,   296,   297,   298,   299,   300,   230,   302,   303,
-     191,   320,   192,   160,   161,   162,   160,   161,   162,   241,
-     324,   244,   243,   248,   301,   290,   293,   253,   254,   255,
-     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
-     266,   267,   318,   316,   319,   330,   331,   321,   344,   212,
-     213,   214,   215,   323,   339,   346,   216,   162,   217,    95,
-     325,   340,   133,   348,   414,   333,   384,   355,   112,   160,
-     161,   162,   357,   307,   360,   307,   419,   369,   421,   360,
-     360,   424,   425,   160,   161,   162,   334,   335,   336,   160,
-     161,   162,   434,   435,   337,   322,    19,   364,   350,   373,
-     444,   382,   381,   370,   160,   161,   162,   388,   376,   -73,
-     389,   160,   161,   162,   452,   328,   170,    57,   454,   160,
-     161,   162,   160,   161,   162,   181,   182,   183,   184,   167,
-     390,   185,   395,   391,   396,   397,   168,   169,   170,   171,
-     398,   399,   133,   180,   400,   471,   472,   360,   181,   182,
-     183,   184,   392,   401,   185,   394,   172,   173,   329,   174,
-     175,   176,   177,   178,   179,   180,   402,   404,    77,   405,
-     181,   182,   183,   184,    19,   406,   185,   360,   409,   357,
-     410,   432,   109,   168,   169,   170,   171,   110,   417,   383,
-     212,   213,   214,   215,   411,   446,   423,   216,   427,   217,
-     428,   429,    95,   433,   451,   160,   161,   162,   176,   177,
-     178,   179,   180,   441,   443,   445,    95,   181,   182,   183,
-     184,    95,   453,   185,   160,   161,   162,   465,   -13,    79,
-     360,   341,   468,   466,   470,   469,   100,    77,   218,    16,
-      95,    17,    18,    19,    20,    21,    22,    23,    80,   422,
-     292,    24,    25,    26,    27,    28,   464,    29,    30,    31,
-      32,    33,    34,    81,    99,    82,    83,    35,    84,    85,
-      86,    87,    88,    89,   160,   161,   162,    90,    91,    92,
-      93,    36,   125,    37,    38,    39,    40,    41,    42,   442,
-     160,   161,   162,    43,    44,    45,    46,    47,    48,    49,
-     379,   196,   449,   450,    77,   393,   412,    50,   149,   430,
-      19,   150,   456,   332,     0,     0,   386,     0,   109,    51,
-      52,    53,   463,   110,    -3,    79,     0,    54,    55,     0,
-       0,    56,    94,    77,     0,    16,     0,    17,    18,    19,
-      20,    21,    22,    23,    80,     0,     0,    24,    25,    26,
-      27,    28,     0,    29,    30,    31,    32,    33,    34,    81,
-      99,    82,    83,    35,    84,    85,    86,    87,    88,    89,
-       0,     0,     0,    90,    91,    92,    93,    36,     0,    37,
-      38,    39,    40,    41,    42,     0,     0,     0,     0,    43,
-      44,    45,    46,    47,    48,    49,  -237,  -237,  -237,   180,
-       0,   185,     0,    50,   181,   182,   183,   184,     0,     0,
-     185,     0,     0,     0,     0,    51,    52,    53,     0,     0,
-       0,    79,     0,    54,    55,     0,     0,    56,    94,    77,
-     349,    16,     0,    17,    18,    19,    20,    21,    22,    23,
-      80,     0,     0,    24,    25,    26,    27,    28,     0,    29,
-      30,    31,    32,    33,    34,    81,    99,    82,    83,    35,
-      84,    85,    86,    87,    88,    89,     0,     0,     0,    90,
-      91,    92,    93,    36,     0,    37,    38,    39,    40,    41,
-      42,     0,     0,     0,     0,    43,    44,    45,    46,    47,
-      48,    49,     1,     2,     3,     4,     5,     6,     0,    50,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    51,    52,    53,     0,     0,     0,    79,     0,    54,
-      55,     0,     0,    56,    94,    77,   448,    16,     0,    17,
-      18,    19,    20,    21,    22,    23,    80,     0,     0,    24,
-      25,    26,    27,    28,     0,    29,    30,    31,    32,    33,
-      34,    81,    99,    82,    83,    35,    84,    85,    86,    87,
-      88,    89,     0,     0,     0,    90,    91,    92,    93,    36,
-       0,    37,    38,    39,    40,    41,    42,     0,     0,     0,
-       0,    43,    44,    45,    46,    47,    48,    49,     0,     0,
-       0,     0,     0,     0,     0,    50,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    51,    52,    53,
-       0,     0,     0,    79,     0,    54,    55,     0,     0,    56,
-      94,    77,   457,    16,     0,    17,    18,    19,    20,    21,
+      78,    94,    94,   103,   232,    14,    57,   221,   364,   132,
+     220,   439,   366,   105,   370,   371,    19,   151,    95,   415,
+     163,   313,   164,   236,   352,   326,   159,   160,   161,    77,
+      15,   129,   162,   237,   137,   353,   121,   111,   111,   111,
+     111,   111,   140,   111,   111,   113,   114,   115,   116,   126,
+     117,   118,   243,   158,   373,    19,    20,    21,   457,   120,
+     134,   111,   127,   473,   458,   454,   147,   135,   136,   436,
+     437,   202,   342,   141,   159,   160,   161,   128,   142,   159,
+     160,   161,   402,   207,   132,   159,   160,   161,    94,   159,
+     160,   161,    94,    94,   325,   185,   106,   107,   311,   193,
+     196,   162,   234,   344,   203,   218,   346,  -235,   204,   379,
+     132,   122,   419,   226,   165,   125,   186,   224,   187,   192,
+     130,   341,   198,   138,   231,    57,   144,   384,   150,   199,
+     152,   153,   154,   155,   156,   407,   159,   160,   161,   343,
+     200,   208,   239,   145,   201,  -231,   134,  -231,   205,   345,
+     159,   160,   161,   233,   206,   210,   244,   245,   246,   222,
+     248,   249,   251,   364,  -233,   461,  -233,   159,   160,   161,
+     159,   160,   161,   159,   160,   161,   347,   159,   160,   161,
+     383,   288,   280,   281,   282,   283,   284,   285,   286,   287,
+     312,   159,   160,   161,   225,   159,   160,   161,   303,   159,
+     160,   161,   278,   223,   374,   159,   160,   161,   304,   306,
+     307,   308,   309,   310,   227,   386,   159,   160,   161,    57,
+     294,   295,   296,   297,   298,   299,   229,   301,   302,   188,
+     319,   189,   159,   160,   161,   235,   159,   160,   161,   323,
+     240,   247,   317,   242,   289,   252,   253,   254,   255,   256,
+     257,   258,   259,   260,   261,   262,   263,   264,   265,   266,
+     190,   267,   191,   268,   329,   330,    77,   269,   270,   271,
+     272,   273,    19,   338,   300,   331,   274,   357,    94,   360,
+     108,   132,   292,   315,   413,   109,   318,   111,   159,   160,
+     161,   356,   306,   359,   306,   418,   368,   420,   359,   359,
+     423,   424,   159,   160,   161,   320,   167,  -236,   169,   170,
+     322,   433,   434,   324,   321,   441,   363,   275,   161,   443,
+     339,   380,   369,   211,   212,   213,   214,   332,   448,   449,
+     215,   333,   216,   451,   178,   179,    57,   453,   455,   334,
+     180,   181,   182,   183,   335,   336,   184,   354,   462,   349,
+     167,   168,   169,   170,    19,   276,   372,   159,   160,   161,
+     375,   132,   381,   387,   470,   471,   359,   159,   160,   161,
+     388,   391,   389,   390,   393,   175,   176,   177,   178,   179,
+     159,   160,   161,   -72,   180,   181,   182,   183,   394,   395,
+     184,   399,   396,   327,   397,  -236,   359,   401,   356,   398,
+     431,   400,   167,   168,   169,   170,   340,   382,   403,   211,
+     212,   213,   214,   404,   445,   405,   215,   408,   216,   409,
+     410,    94,   416,   450,   422,   173,   174,   175,   176,   177,
+     178,   179,   426,   427,   428,    94,   180,   181,   182,   183,
+      94,   432,   184,   159,   160,   161,   440,   -13,    79,   359,
+    -236,  -236,  -236,   469,   442,   184,    77,   444,    16,    94,
+      17,    18,    19,    20,    21,    22,    23,    80,   464,   452,
+      24,    25,    26,    27,    28,   465,    29,    30,    31,    32,
+      33,    34,    81,    98,    82,    83,    35,    84,    85,    86,
+      87,    88,    89,   467,   468,   169,    90,    91,    92,    93,
+      36,    99,    37,    38,    39,    40,    41,    42,   217,   159,
+     160,   161,    43,    44,    45,    46,    47,    48,    49,   159,
+     160,   161,   179,   421,   463,   291,    50,   180,   181,   182,
+     183,   124,   195,   184,   392,   378,   411,   429,    51,    52,
+      53,   148,    -3,    79,     0,   385,    54,    55,   149,     0,
+      56,    77,     0,    16,     0,    17,    18,    19,    20,    21,
+      22,    23,    80,     0,     0,    24,    25,    26,    27,    28,
+       0,    29,    30,    31,    32,    33,    34,    81,    98,    82,
+      83,    35,    84,    85,    86,    87,    88,    89,     0,     0,
+       0,    90,    91,    92,    93,    36,     0,    37,    38,    39,
+      40,    41,    42,     0,     0,     0,     0,    43,    44,    45,
+      46,    47,    48,    49,     0,     0,     0,    77,     0,   179,
+       0,    50,     0,    19,   180,   181,   182,   183,     0,     0,
+     184,   108,     0,    51,    52,    53,   109,     0,    79,     0,
+       0,    54,    55,     0,     0,    56,    77,   348,    16,     0,
+      17,    18,    19,    20,    21,    22,    23,    80,     0,     0,
+      24,    25,    26,    27,    28,     0,    29,    30,    31,    32,
+      33,    34,    81,    98,    82,    83,    35,    84,    85,    86,
+      87,    88,    89,     0,     0,     0,    90,    91,    92,    93,
+      36,     0,    37,    38,    39,    40,    41,    42,     0,     0,
+       0,     0,    43,    44,    45,    46,    47,    48,    49,   180,
+     181,   182,   183,     0,     0,   184,    50,     1,     2,     3,
+       4,     5,     6,     0,     0,     0,     0,     0,    51,    52,
+      53,     0,     0,    79,     0,     0,    54,    55,     0,     0,
+      56,    77,   447,    16,     0,    17,    18,    19,    20,    21,
       22,    23,    80,     0,     0,    24,    25,    26,    27,    28,
-       0,    29,    30,    31,    32,    33,    34,    81,    99,    82,
+       0,    29,    30,    31,    32,    33,    34,    81,    98,    82,
       83,    35,    84,    85,    86,    87,    88,    89,     0,     0,
        0,    90,    91,    92,    93,    36,     0,    37,    38,    39,
       40,    41,    42,     0,     0,     0,     0,    43,    44,    45,
       46,    47,    48,    49,     0,     0,     0,     0,     0,     0,
        0,    50,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    51,    52,    53,     0,     0,     0,    79,
-       0,    54,    55,     0,     0,    56,    94,    77,   461,    16,
+       0,     0,     0,    51,    52,    53,     0,     0,    79,     0,
+       0,    54,    55,     0,     0,    56,    77,   456,    16,     0,
+      17,    18,    19,    20,    21,    22,    23,    80,     0,     0,
+      24,    25,    26,    27,    28,     0,    29,    30,    31,    32,
+      33,    34,    81,    98,    82,    83,    35,    84,    85,    86,
+      87,    88,    89,     0,     0,     0,    90,    91,    92,    93,
+      36,     0,    37,    38,    39,    40,    41,    42,     0,     0,
+       0,     0,    43,    44,    45,    46,    47,    48,    49,     0,
+       0,     0,     0,     0,     0,     0,    50,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    51,    52,
+      53,     0,     0,    79,     0,     0,    54,    55,     0,     0,
+      56,    77,   460,    16,     0,    17,    18,    19,    20,    21,
+      22,    23,    80,     0,     0,    24,    25,    26,    27,    28,
+       0,    29,    30,    31,    32,    33,    34,    81,    98,    82,
+      83,    35,    84,    85,    86,    87,    88,    89,     0,     0,
+       0,    90,    91,    92,    93,    36,     0,    37,    38,    39,
+      40,    41,    42,     0,     0,     0,     0,    43,    44,    45,
+      46,    47,    48,    49,     0,     0,     0,     0,     0,     0,
+       0,    50,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    51,    52,    53,    79,     0,     0,     0,
+       0,    54,    55,     0,    77,    56,    16,     0,    17,    18,
+      19,    20,    21,    22,    23,    80,     0,     0,    24,    25,
+      26,    27,    28,     0,    29,    30,    31,    32,    33,    34,
+      81,    98,    82,    83,    35,    84,    85,    86,    87,    88,
+      89,     0,     0,     0,    90,    91,    92,    93,    36,     0,
+      37,    38,    39,    40,    41,    42,     0,     0,     0,     0,
+      43,    44,    45,    46,    47,    48,    49,     0,     0,   472,
+       0,     0,     0,     0,    50,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    51,    52,    53,    79,
+       0,     0,     0,     0,    54,    55,     0,    77,    56,    16,
        0,    17,    18,    19,    20,    21,    22,    23,    80,     0,
        0,    24,    25,    26,    27,    28,     0,    29,    30,    31,
-      32,    33,    34,    81,    99,    82,    83,    35,    84,    85,
+      32,    33,    34,    81,    98,    82,    83,    35,    84,    85,
       86,    87,    88,    89,     0,     0,     0,    90,    91,    92,
       93,    36,     0,    37,    38,    39,    40,    41,    42,     0,
        0,     0,     0,    43,    44,    45,    46,    47,    48,    49,
        0,     0,     0,     0,     0,     0,     0,    50,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,    51,
-      52,    53,     0,     0,     0,    79,     0,    54,    55,     0,
-       0,    56,    94,    77,     0,    16,     0,    17,    18,    19,
-      20,    21,    22,    23,    80,     0,     0,    24,    25,    26,
-      27,    28,     0,    29,    30,    31,    32,    33,    34,    81,
-      99,    82,    83,    35,    84,    85,    86,    87,    88,    89,
-       0,     0,     0,    90,    91,    92,    93,    36,     0,    37,
+      52,    53,    79,     0,     0,     0,     0,    54,    55,     0,
+      77,    56,    16,     0,    17,    18,    19,    20,    21,    22,
+      23,    80,     0,     0,    24,    25,    26,    27,    28,     0,
+      29,    30,    31,    32,    33,    34,    81,     0,    82,    83,
+      35,    84,    85,    86,    87,    88,    89,     0,     0,     0,
+      90,    91,    92,    93,    36,     0,    37,    38,    39,    40,
+      41,    42,     0,     0,     0,     0,    43,    44,    45,    46,
+      47,    48,    49,     0,     0,     0,     0,     0,     0,     0,
+      50,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    51,    52,    53,    79,     0,     0,     0,     0,
+      54,    55,     0,     0,    56,    16,     0,    17,    18,    19,
+      20,    21,    22,    23,   -67,     0,     0,    24,    25,    26,
+      27,    28,     0,    29,    30,    31,    32,    33,    34,     0,
+       0,     0,     0,    35,     0,     0,     0,     0,     0,     0,
+     167,   168,   169,   170,     0,     0,     0,    36,     0,    37,
       38,    39,    40,    41,    42,     0,     0,     0,     0,    43,
-      44,    45,    46,    47,    48,    49,     0,     0,   473,     0,
-       0,     0,     0,    50,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    51,    52,    53,     0,     0,
-       0,    79,     0,    54,    55,     0,     0,    56,    94,    77,
-       0,    16,     0,    17,    18,    19,    20,    21,    22,    23,
-      80,     0,     0,    24,    25,    26,    27,    28,     0,    29,
-      30,    31,    32,    33,    34,    81,    99,    82,    83,    35,
-      84,    85,    86,    87,    88,    89,     0,     0,     0,    90,
-      91,    92,    93,    36,     0,    37,    38,    39,    40,    41,
-      42,     0,     0,     0,     0,    43,    44,    45,    46,    47,
-      48,    49,     0,     0,     0,     0,     0,     0,     0,    50,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    51,    52,    53,     0,     0,     0,    79,     0,    54,
-      55,     0,     0,    56,    94,    77,     0,    16,     0,    17,
-      18,    19,    20,    21,    22,    23,    80,     0,     0,    24,
+      44,    45,    46,    47,    48,    49,   176,   177,   178,   179,
+       0,     0,     0,    50,   180,   181,   182,   183,     0,     0,
+     184,     0,     0,     0,     0,    51,    52,    53,    79,     0,
+       0,     0,     0,    54,    55,   169,   170,    56,    16,     0,
+      17,    18,    19,    20,    21,    22,    23,     0,     0,     0,
+      24,    25,    26,    27,    28,     0,    29,    30,    31,    32,
+      33,    34,   179,     0,     0,     0,    35,   180,   181,   182,
+     183,     0,     0,   184,     0,     0,     0,     0,     0,     0,
+      36,     0,    37,    38,    39,    40,    41,    42,     0,     0,
+    -169,     0,    43,    44,    45,    46,    47,    48,    49,   186,
+       0,   187,  -169,     0,     0,     0,    50,     0,     0,     0,
+    -169,     0,     0,     0,     0,     0,     0,     0,    51,    52,
+      53,   167,   168,   169,   170,     0,    54,    55,     0,   -67,
+      56,     0,  -169,  -169,  -169,  -169,     0,     0,     0,  -169,
+       0,  -169,     0,     0,  -169,     0,     0,     0,   177,   178,
+     179,  -169,  -169,  -169,  -169,   180,   181,   182,   183,     0,
+       0,   184,     0,     0,     0,     0,  -169,  -169,  -169,  -208,
+    -169,  -169,  -169,  -169,  -169,  -169,  -169,  -169,  -169,  -169,
+    -169,  -208,     0,     0,     0,  -169,  -169,  -169,  -169,  -208,
+       0,  -169,  -169,     0,     0,     0,     0,     0,     0,     0,
+     167,   168,   169,   170,     0,     0,     0,     0,     0,     0,
+       0,  -208,  -208,  -208,  -208,     0,     0,     0,  -208,     0,
+    -208,     0,     0,  -208,     0,     0,     0,     0,   178,   179,
+    -208,  -208,  -208,  -208,   180,   181,   182,   183,     0,     0,
+     184,     0,     0,     0,     0,  -208,  -208,  -208,     0,  -208,
+    -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,
+       0,     0,     0,     0,  -208,  -208,  -208,  -208,     0,     0,
+    -208,  -208,    77,     0,    16,     0,    17,    18,    19,    20,
+      21,    22,    23,     0,     0,     0,   131,    25,    26,    27,
+      28,   109,    29,    30,    31,    32,    33,    34,     0,     0,
+       0,     0,    35,     0,     0,     0,     0,     0,     0,  -236,
+       0,   169,   170,     0,     0,     0,    36,     0,    37,    38,
+      39,    40,    41,    42,     0,     0,     0,     0,    43,    44,
+      45,    46,    47,    48,    49,     0,     0,   178,   179,     0,
+       0,     0,    50,   180,   181,   182,   183,     0,     0,   184,
+       0,     0,     0,     0,    51,    52,    53,     0,     0,     0,
+       0,     0,    54,    55,     0,    77,    56,    16,     0,    17,
+      18,    19,    20,    21,    22,    23,     0,     0,     0,    24,
       25,    26,    27,    28,     0,    29,    30,    31,    32,    33,
-      34,    81,     0,    82,    83,    35,    84,    85,    86,    87,
-      88,    89,     0,     0,     0,    90,    91,    92,    93,    36,
+      34,     0,     0,     0,     0,    35,     0,     0,     0,     0,
+       0,     0,     0,     0,   169,   170,     0,     0,     0,    36,
        0,    37,    38,    39,    40,    41,    42,     0,     0,     0,
        0,    43,    44,    45,    46,    47,    48,    49,     0,     0,
-       0,     0,     0,     0,     0,    50,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    51,    52,    53,
-       0,    79,     0,     0,     0,    54,    55,     0,     0,    56,
-      94,    16,     0,    17,    18,    19,    20,    21,    22,    23,
-     -68,     0,     0,    24,    25,    26,    27,    28,     0,    29,
-      30,    31,    32,    33,    34,     0,     0,     0,     0,    35,
-       0,     0,  -237,     0,     0,     0,     0,     0,     0,   168,
-     169,   170,   171,    36,     0,    37,    38,    39,    40,    41,
-      42,     0,     0,     0,     0,    43,    44,    45,    46,    47,
-      48,    49,   174,   175,   176,   177,   178,   179,   180,    50,
-       0,     0,     0,   181,   182,   183,   184,     0,     0,   185,
-       0,    51,    52,    53,    79,     0,     0,     0,     0,    54,
-      55,   170,   171,    56,    16,     0,    17,    18,    19,    20,
-      21,    22,    23,     0,     0,     0,    24,    25,    26,    27,
-      28,     0,    29,    30,    31,    32,    33,    34,   180,     0,
-       0,     0,    35,   181,   182,   183,   184,     0,     0,   185,
-       0,     0,     0,     0,     0,     0,    36,     0,    37,    38,
-      39,    40,    41,    42,     0,     0,  -170,     0,    43,    44,
-      45,    46,    47,    48,    49,   187,     0,   188,  -170,     0,
-       0,     0,    50,     0,     0,     0,  -170,     0,     0,     0,
-       0,     0,     0,     0,    51,    52,    53,   168,   169,   170,
-     171,     0,    54,    55,     0,   -68,    56,     0,  -170,  -170,
-    -170,  -170,     0,     0,     0,  -170,     0,  -170,     0,     0,
-    -170,     0,     0,   177,   178,   179,   180,  -170,  -170,  -170,
-    -170,   181,   182,   183,   184,     0,     0,   185,     0,     0,
-       0,     0,  -170,  -170,  -170,  -209,  -170,  -170,  -170,  -170,
-    -170,  -170,  -170,  -170,  -170,  -170,  -170,  -209,     0,     0,
-       0,  -170,  -170,  -170,  -170,  -209,     0,  -170,  -170,     0,
-       0,     0,     0,     0,     0,     0,   168,   169,   170,   171,
-       0,     0,     0,     0,     0,     0,     0,  -209,  -209,  -209,
-    -209,     0,     0,     0,  -209,     0,  -209,     0,     0,  -209,
-       0,     0,     0,   178,   179,   180,  -209,  -209,  -209,  -209,
-     181,   182,   183,   184,     0,     0,   185,     0,     0,     0,
-       0,  -209,  -209,  -209,     0,  -209,  -209,  -209,  -209,  -209,
-    -209,  -209,  -209,  -209,  -209,  -209,     0,     0,     0,     0,
-    -209,  -209,  -209,  -209,     0,     0,  -209,  -209,    77,     0,
-      16,     0,    17,    18,    19,    20,    21,    22,    23,     0,
-       0,     0,   132,    25,    26,    27,    28,   110,    29,    30,
+     178,   179,     0,     0,     0,    50,   180,   181,   182,   183,
+       0,     0,   184,     0,     0,     0,     0,    51,    52,    53,
+       0,     0,     0,     0,     0,    54,    55,     0,     0,    56,
+      16,   104,    17,    18,    19,    20,    21,    22,    23,     0,
+       0,     0,    24,    25,    26,    27,    28,     0,    29,    30,
       31,    32,    33,    34,     0,     0,     0,     0,    35,     0,
-       0,     0,     0,     0,     0,   168,  -237,   170,   171,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,    36,     0,    37,    38,    39,    40,    41,    42,
        0,     0,     0,     0,    43,    44,    45,    46,    47,    48,
-      49,     0,     0,   179,   180,     0,     0,     0,    50,   181,
-     182,   183,   184,     0,     0,   185,     0,     0,     0,     0,
+      49,     0,     0,     0,     0,     0,     0,     0,    50,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       51,    52,    53,     0,     0,     0,     0,     0,    54,    55,
-       0,    77,    56,    16,     0,    17,    18,    19,    20,    21,
-      22,    23,     0,     0,     0,    24,    25,    26,    27,    28,
-       0,    29,    30,    31,    32,    33,    34,     0,     0,     0,
-       0,    35,     0,     0,     0,     0,     0,     0,   168,   169,
-     170,   171,     0,     0,     0,    36,     0,    37,    38,    39,
-      40,    41,    42,     0,     0,     0,     0,    43,    44,    45,
-      46,    47,    48,    49,     0,     0,   179,   180,     0,     0,
-       0,    50,   181,   182,   183,   184,     0,     0,   185,     0,
-       0,     0,     0,    51,    52,    53,     0,     0,     0,     0,
-       0,    54,    55,     0,     0,    56,    16,   105,    17,    18,
-      19,    20,    21,    22,    23,     0,     0,     0,    24,    25,
-      26,    27,    28,     0,    29,    30,    31,    32,    33,    34,
-       0,     0,     0,     0,    35,     0,     0,     0,     0,     0,
-       0,  -237,     0,   170,   171,     0,     0,     0,    36,     0,
-      37,    38,    39,    40,    41,    42,     0,     0,     0,     0,
-      43,    44,    45,    46,    47,    48,    49,     0,     0,   179,
-     180,     0,     0,     0,    50,   181,   182,   183,   184,     0,
-       0,   185,     0,     0,     0,     0,    51,    52,    53,     0,
-       0,     0,     0,     0,    54,    55,     0,    16,    56,    17,
-      18,    19,    20,    21,    22,    23,   140,     0,     0,    24,
-      25,    26,    27,    28,     0,    29,    30,    31,    32,    33,
-      34,     0,     0,     0,     0,    35,     0,     0,     0,     0,
-       0,     0,     0,     0,   170,   171,     0,     0,     0,    36,
-       0,    37,    38,    39,    40,    41,    42,     0,     0,     0,
-       0,    43,    44,    45,    46,    47,    48,    49,     0,     0,
-     179,   180,     0,     0,     0,    50,   181,   182,   183,   184,
-       0,     0,   185,     0,     0,     0,     0,    51,    52,    53,
-       0,     0,     0,     0,     0,    54,    55,     0,    16,    56,
+       0,    16,    56,    17,    18,    19,    20,    21,    22,    23,
+     139,     0,     0,    24,    25,    26,    27,    28,     0,    29,
+      30,    31,    32,    33,    34,     0,     0,     0,     0,    35,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    36,     0,    37,    38,    39,    40,    41,
+      42,     0,     0,     0,     0,    43,    44,    45,    46,    47,
+      48,    49,     0,     0,     0,     0,     0,     0,     0,    50,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    51,    52,    53,     0,     0,     0,     0,     0,    54,
+      55,     0,    16,    56,    17,    18,    19,    20,    21,    22,
+      23,     0,     0,     0,    24,    25,    26,    27,    28,     0,
+      29,    30,    31,    32,    33,    34,     0,     0,     0,     0,
+      35,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    36,     0,    37,    38,    39,    40,
+      41,    42,     0,     0,     0,     0,    43,    44,    45,    46,
+      47,    48,    49,     0,     0,     0,     0,     0,     0,     0,
+      50,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    51,    52,    53,     0,     0,     0,     0,     0,
+      54,    55,     0,   157,    56,    16,     0,    17,    18,    19,
+      20,    21,    22,    23,     0,     0,     0,    24,    25,    26,
+      27,    28,     0,    29,    30,    31,    32,    33,    34,     0,
+       0,     0,     0,    35,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    36,     0,    37,
+      38,    39,    40,    41,    42,     0,     0,     0,     0,    43,
+      44,    45,    46,    47,    48,    49,     0,     0,     0,     0,
+       0,     0,     0,    50,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    51,    52,    53,     0,     0,
+       0,     0,     0,    54,    55,     0,   230,    56,    16,     0,
       17,    18,    19,    20,    21,    22,    23,     0,     0,     0,
       24,    25,    26,    27,    28,     0,    29,    30,    31,    32,
       33,    34,     0,     0,     0,     0,    35,     0,     0,     0,
@@ -679,7 +696,7 @@ static const yytype_int16 yytable[] =
        0,     0,    43,    44,    45,    46,    47,    48,    49,     0,
        0,     0,     0,     0,     0,     0,    50,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,    51,    52,
-      53,     0,     0,     0,     0,     0,    54,    55,     0,   158,
+      53,     0,     0,     0,     0,     0,    54,    55,     0,   238,
       56,    16,     0,    17,    18,    19,    20,    21,    22,    23,
        0,     0,     0,    24,    25,    26,    27,    28,     0,    29,
       30,    31,    32,    33,    34,     0,     0,     0,     0,    35,
@@ -689,7 +706,7 @@ static const yytype_int16 yytable[] =
       48,    49,     0,     0,     0,     0,     0,     0,     0,    50,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,    51,    52,    53,     0,     0,     0,     0,     0,    54,
-      55,     0,   231,    56,    16,     0,    17,    18,    19,    20,
+      55,     0,   250,    56,    16,     0,    17,    18,    19,    20,
       21,    22,    23,     0,     0,     0,    24,    25,    26,    27,
       28,     0,    29,    30,    31,    32,    33,    34,     0,     0,
        0,     0,    35,     0,     0,     0,     0,     0,     0,     0,
@@ -698,7 +715,7 @@ static const yytype_int16 yytable[] =
       45,    46,    47,    48,    49,     0,     0,     0,     0,     0,
        0,     0,    50,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,    51,    52,    53,     0,     0,     0,
-       0,     0,    54,    55,     0,   239,    56,    16,     0,    17,
+       0,     0,    54,    55,     0,   279,    56,    16,     0,    17,
       18,    19,    20,    21,    22,    23,     0,     0,     0,    24,
       25,    26,    27,    28,     0,    29,    30,    31,    32,    33,
       34,     0,     0,     0,     0,    35,     0,     0,     0,     0,
@@ -707,137 +724,132 @@ static const yytype_int16 yytable[] =
        0,    43,    44,    45,    46,    47,    48,    49,     0,     0,
        0,     0,     0,     0,     0,    50,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,    51,    52,    53,
-       0,     0,     0,     0,     0,    54,    55,     0,   251,    56,
+       0,     0,     0,     0,     0,    54,    55,     0,   337,    56,
       16,     0,    17,    18,    19,    20,    21,    22,    23,     0,
        0,     0,    24,    25,    26,    27,    28,     0,    29,    30,
       31,    32,    33,    34,     0,     0,     0,     0,    35,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,    36,     0,    37,    38,    39,    40,    41,    42,
        0,     0,     0,     0,    43,    44,    45,    46,    47,    48,
-      49,     0,     0,     0,     0,     0,     0,     0,    50,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      49,     0,     0,     0,     0,     0,   166,     0,    50,     0,
+       0,     0,     0,   167,   168,   169,   170,     0,     0,     0,
       51,    52,    53,     0,     0,     0,     0,     0,    54,    55,
-       0,   280,    56,    16,     0,    17,    18,    19,    20,    21,
-      22,    23,     0,     0,     0,    24,    25,    26,    27,    28,
-       0,    29,    30,    31,    32,    33,    34,     0,     0,     0,
-       0,    35,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    36,     0,    37,    38,    39,
-      40,    41,    42,     0,     0,     0,     0,    43,    44,    45,
-      46,    47,    48,    49,     0,     0,     0,     0,     0,     0,
-       0,    50,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    51,    52,    53,     0,     0,     0,     0,
-       0,    54,    55,     0,   338,    56,    16,     0,    17,    18,
-      19,    20,    21,    22,    23,     0,     0,     0,    24,    25,
-      26,    27,    28,     0,    29,    30,    31,    32,    33,    34,
-       0,     0,     0,     0,    35,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    36,     0,
-      37,    38,    39,    40,    41,    42,     0,     0,     0,     0,
-      43,    44,    45,    46,    47,    48,    49,     0,     0,   167,
-       0,     0,     0,     0,    50,     0,   168,   169,   170,   171,
-       0,     0,     0,     0,     0,     0,    51,    52,    53,     0,
-       0,     0,     0,     0,    54,    55,   172,   173,    56,   174,
-     175,   176,   177,   178,   179,   180,     0,     0,     0,     0,
-     181,   182,   183,   184,   167,     0,   185,     0,     0,     0,
-       0,   168,   169,   170,   171,     0,     0,     0,     0,     0,
+       0,     0,    56,   171,   172,   328,   173,   174,   175,   176,
+     177,   178,   179,     0,     0,     0,     0,   180,   181,   182,
+     183,   166,     0,   184,     0,     0,     0,     0,   167,   168,
+     169,   170,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   171,   172,
+       0,   173,   174,   175,   176,   177,   178,   179,     0,     0,
+       0,     0,   180,   181,   182,   183,   166,     0,   184,     0,
+       0,     0,     0,   167,   168,   169,   170,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   173,     0,   174,   175,   176,   177,   178,   179,
-     180,     0,     0,     0,     0,   181,   182,   183,   184,     0,
-       0,   185
+       0,     0,     0,     0,   172,     0,   173,   174,   175,   176,
+     177,   178,   179,     0,     0,     0,     0,   180,   181,   182,
+     183,     0,     0,   184
 };
 
-#define yypact_value_is_default(yystate) \
-  ((yystate) == (-401))
+#define yypact_value_is_default(Yystate) \
+  (!!((Yystate) == (-408)))
 
-#define yytable_value_is_error(yytable_value) \
-  ((yytable_value) == (-237))
+#define yytable_value_is_error(Yytable_value) \
+  (!!((Yytable_value) == (-236)))
 
 static const yytype_int16 yycheck[] =
 {
-      10,    11,    12,    15,    15,   300,     9,   118,   129,    42,
-       9,    12,    11,    16,    80,     0,   397,    50,    11,   419,
-     300,     9,   302,   303,    11,    15,    16,    17,     9,    20,
-       8,    41,    20,   144,    44,    26,   102,    19,    20,    21,
-      22,    23,    45,    25,    26,    20,    21,    22,    23,    23,
-      25,    26,   103,    56,    28,    76,    77,    78,   103,    70,
-      42,    43,   443,     9,   103,    11,    48,    42,    43,    46,
-      47,   471,     9,    12,    11,    76,    77,    78,    15,    16,
-      17,    18,    19,    93,    12,   118,   103,    24,    20,    99,
-     370,    80,   103,   103,   104,    20,   103,    17,    18,    77,
-       9,     9,   223,   136,   103,    12,    99,   296,    90,   298,
-      12,   144,    32,   103,   124,    12,    36,     9,   121,    11,
-     400,    41,    23,   103,    44,   128,   129,    47,    65,    49,
-      12,    51,    52,    53,    54,    55,    12,    76,    77,    78,
-       9,    12,    11,   146,    76,    77,    78,   129,    76,    77,
-      78,    76,    77,    78,   129,   103,   103,   160,   161,   162,
-     455,   164,   165,   166,    48,     9,   103,    11,   103,    76,
-      77,    78,   103,   453,    76,    77,    78,    20,    20,    76,
-      77,    78,   194,   186,   187,   188,   189,   190,   191,   192,
-     193,   224,   103,   103,    76,    77,    78,   103,   102,   209,
-      76,    77,    78,   185,   315,    76,    77,    78,    26,   212,
-     213,   214,   215,   216,   217,    76,    77,    78,    10,   340,
-     223,   199,   200,   201,   202,   203,   204,   102,   206,   207,
-       9,   234,    11,    76,    77,    78,    76,    77,    78,    72,
-     243,   102,    11,   163,   103,    23,    23,   167,   168,   169,
-     170,   171,   172,   173,   174,   175,   176,   177,   178,   179,
-     180,   181,   102,    72,   102,   268,   269,    10,    20,    42,
-      43,    44,    45,    26,   277,    20,    49,    78,    51,   289,
-      11,   103,   315,    20,   395,    18,    20,    23,   270,    76,
-      77,    78,   295,   296,   297,   298,   399,   300,   401,   302,
-     303,   404,   405,    76,    77,    78,    18,    18,    18,    76,
-      77,    78,   415,   416,    18,   102,    15,   299,    21,   102,
-     423,    10,   325,   301,    76,    77,    78,    10,    26,   102,
-      10,    76,    77,    78,   437,   102,    63,   340,   441,    76,
-      77,    78,    76,    77,    78,    95,    96,    97,    98,    54,
-      10,   101,    23,    10,   102,   102,    61,    62,    63,    64,
-     102,   102,   395,    90,   103,   468,   469,   370,    95,    96,
-      97,    98,   350,   102,   101,   353,    81,    82,    83,    84,
-      85,    86,    87,    88,    89,    90,    20,   102,     9,   102,
-      95,    96,    97,    98,    15,   103,   101,   400,    10,   402,
-     102,   413,    23,    61,    62,    63,    64,    28,     9,   329,
-      42,    43,    44,    45,    20,   427,   102,    49,     9,    51,
-      74,    20,   432,    20,   436,    76,    77,    78,    86,    87,
-      88,    89,    90,   102,    20,   102,   446,    95,    96,    97,
-      98,   451,   103,   101,    76,    77,    78,    22,     0,     1,
-     453,   102,   102,    73,   466,   102,    12,     9,    99,    11,
-     470,    13,    14,    15,    16,    17,    18,    19,    20,   402,
-     196,    23,    24,    25,    26,    27,   455,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      42,    43,    44,    45,    76,    77,    78,    49,    50,    51,
-      52,    53,    35,    55,    56,    57,    58,    59,    60,   421,
-      76,    77,    78,    65,    66,    67,    68,    69,    70,    71,
-     102,    83,   434,   435,     9,   352,   393,    79,    48,   412,
-      15,    48,   444,    18,    -1,    -1,   102,    -1,    23,    91,
-      92,    93,   454,    28,     0,     1,    -1,    99,   100,    -1,
-      -1,   103,   104,     9,    -1,    11,    -1,    13,    14,    15,
-      16,    17,    18,    19,    20,    -1,    -1,    23,    24,    25,
-      26,    27,    -1,    29,    30,    31,    32,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      -1,    -1,    -1,    49,    50,    51,    52,    53,    -1,    55,
-      56,    57,    58,    59,    60,    -1,    -1,    -1,    -1,    65,
-      66,    67,    68,    69,    70,    71,    96,    97,    98,    90,
-      -1,   101,    -1,    79,    95,    96,    97,    98,    -1,    -1,
-     101,    -1,    -1,    -1,    -1,    91,    92,    93,    -1,    -1,
-      -1,     1,    -1,    99,   100,    -1,    -1,   103,   104,     9,
-      10,    11,    -1,    13,    14,    15,    16,    17,    18,    19,
-      20,    -1,    -1,    23,    24,    25,    26,    27,    -1,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      40,    41,    42,    43,    44,    45,    -1,    -1,    -1,    49,
-      50,    51,    52,    53,    -1,    55,    56,    57,    58,    59,
-      60,    -1,    -1,    -1,    -1,    65,    66,    67,    68,    69,
-      70,    71,     3,     4,     5,     6,     7,     8,    -1,    79,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    91,    92,    93,    -1,    -1,    -1,     1,    -1,    99,
-     100,    -1,    -1,   103,   104,     9,    10,    11,    -1,    13,
-      14,    15,    16,    17,    18,    19,    20,    -1,    -1,    23,
-      24,    25,    26,    27,    -1,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
-      44,    45,    -1,    -1,    -1,    49,    50,    51,    52,    53,
-      -1,    55,    56,    57,    58,    59,    60,    -1,    -1,    -1,
-      -1,    65,    66,    67,    68,    69,    70,    71,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    79,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    91,    92,    93,
-      -1,    -1,    -1,     1,    -1,    99,   100,    -1,    -1,   103,
-     104,     9,    10,    11,    -1,    13,    14,    15,    16,    17,
+      10,    11,    12,    15,   128,     0,     9,   117,   299,    42,
+      12,   418,   299,    16,   301,   302,    15,    50,    11,   396,
+       9,    12,    11,    20,     9,    12,    76,    77,    78,     9,
+       8,    41,    80,   143,    44,    20,   103,    19,    20,    21,
+      22,    23,    45,    25,    26,    20,    21,    22,    23,   103,
+      25,    26,   102,    56,   102,    15,    16,    17,    20,    11,
+      42,    43,   103,   470,    26,   442,    48,    42,    43,    46,
+      47,    70,    12,    23,    76,    77,    78,   103,    28,    76,
+      77,    78,   369,    93,   117,    76,    77,    78,    98,    76,
+      77,    78,   102,   103,    20,   103,    17,    18,   222,    77,
+      23,    80,   135,    12,   103,    98,    12,     9,    90,    12,
+     143,    32,   399,   123,   103,    36,     9,   120,    11,     9,
+      41,    20,   103,    44,   127,   128,    47,    12,    49,   103,
+      51,    52,    53,    54,    55,    12,    76,    77,    78,    20,
+     103,    48,   145,   103,   103,     9,   128,    11,   103,    20,
+      76,    77,    78,   128,   103,    20,   159,   160,   161,   103,
+     163,   164,   165,   454,     9,   452,    11,    76,    77,    78,
+      76,    77,    78,    76,    77,    78,    20,    76,    77,    78,
+      20,   193,   185,   186,   187,   188,   189,   190,   191,   192,
+     223,    76,    77,    78,   102,    76,    77,    78,   208,    76,
+      77,    78,   184,   103,   314,    76,    77,    78,   211,   212,
+     213,   214,   215,   216,    26,   339,    76,    77,    78,   222,
+     198,   199,   200,   201,   202,   203,   102,   205,   206,     9,
+     233,    11,    76,    77,    78,    10,    76,    77,    78,   242,
+      72,   162,   102,    11,    23,   166,   167,   168,   169,   170,
+     171,   172,   173,   174,   175,   176,   177,   178,   179,   180,
+       9,     9,    11,    11,   267,   268,     9,    15,    16,    17,
+      18,    19,    15,   276,   103,    18,    24,   295,   288,   297,
+      23,   314,    23,    72,   394,    28,   102,   269,    76,    77,
+      78,   294,   295,   296,   297,   398,   299,   400,   301,   302,
+     403,   404,    76,    77,    78,    10,    61,    62,    63,    64,
+      26,   414,   415,    11,   102,   420,   298,    65,    78,   422,
+     103,   324,   300,    42,    43,    44,    45,    18,   433,   434,
+      49,    18,    51,   436,    89,    90,   339,   440,   443,    18,
+      95,    96,    97,    98,    18,    18,   101,    23,   453,    21,
+      61,    62,    63,    64,    15,   103,   102,    76,    77,    78,
+      26,   394,    10,    10,   467,   468,   369,    76,    77,    78,
+      10,   349,    10,    10,   352,    86,    87,    88,    89,    90,
+      76,    77,    78,   102,    95,    96,    97,    98,    23,   102,
+     101,   103,   102,   102,   102,    54,   399,    20,   401,   102,
+     412,   102,    61,    62,    63,    64,   102,   328,   102,    42,
+      43,    44,    45,   102,   426,   103,    49,    10,    51,   102,
+      20,   431,     9,   435,   102,    84,    85,    86,    87,    88,
+      89,    90,     9,    74,    20,   445,    95,    96,    97,    98,
+     450,    20,   101,    76,    77,    78,   102,     0,     1,   452,
+      96,    97,    98,   465,    20,   101,     9,   102,    11,   469,
+      13,    14,    15,    16,    17,    18,    19,    20,    22,   103,
+      23,    24,    25,    26,    27,    73,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+      43,    44,    45,   102,   102,    63,    49,    50,    51,    52,
+      53,    12,    55,    56,    57,    58,    59,    60,    98,    76,
+      77,    78,    65,    66,    67,    68,    69,    70,    71,    76,
+      77,    78,    90,   401,   454,   195,    79,    95,    96,    97,
+      98,    35,    83,   101,   351,   102,   392,   411,    91,    92,
+      93,    48,     0,     1,    -1,   102,    99,   100,    48,    -1,
+     103,     9,    -1,    11,    -1,    13,    14,    15,    16,    17,
+      18,    19,    20,    -1,    -1,    23,    24,    25,    26,    27,
+      -1,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      38,    39,    40,    41,    42,    43,    44,    45,    -1,    -1,
+      -1,    49,    50,    51,    52,    53,    -1,    55,    56,    57,
+      58,    59,    60,    -1,    -1,    -1,    -1,    65,    66,    67,
+      68,    69,    70,    71,    -1,    -1,    -1,     9,    -1,    90,
+      -1,    79,    -1,    15,    95,    96,    97,    98,    -1,    -1,
+     101,    23,    -1,    91,    92,    93,    28,    -1,     1,    -1,
+      -1,    99,   100,    -1,    -1,   103,     9,    10,    11,    -1,
+      13,    14,    15,    16,    17,    18,    19,    20,    -1,    -1,
+      23,    24,    25,    26,    27,    -1,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+      43,    44,    45,    -1,    -1,    -1,    49,    50,    51,    52,
+      53,    -1,    55,    56,    57,    58,    59,    60,    -1,    -1,
+      -1,    -1,    65,    66,    67,    68,    69,    70,    71,    95,
+      96,    97,    98,    -1,    -1,   101,    79,     3,     4,     5,
+       6,     7,     8,    -1,    -1,    -1,    -1,    -1,    91,    92,
+      93,    -1,    -1,     1,    -1,    -1,    99,   100,    -1,    -1,
+     103,     9,    10,    11,    -1,    13,    14,    15,    16,    17,
+      18,    19,    20,    -1,    -1,    23,    24,    25,    26,    27,
+      -1,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      38,    39,    40,    41,    42,    43,    44,    45,    -1,    -1,
+      -1,    49,    50,    51,    52,    53,    -1,    55,    56,    57,
+      58,    59,    60,    -1,    -1,    -1,    -1,    65,    66,    67,
+      68,    69,    70,    71,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    79,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    91,    92,    93,    -1,    -1,     1,    -1,
+      -1,    99,   100,    -1,    -1,   103,     9,    10,    11,    -1,
+      13,    14,    15,    16,    17,    18,    19,    20,    -1,    -1,
+      23,    24,    25,    26,    27,    -1,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+      43,    44,    45,    -1,    -1,    -1,    49,    50,    51,    52,
+      53,    -1,    55,    56,    57,    58,    59,    60,    -1,    -1,
+      -1,    -1,    65,    66,    67,    68,    69,    70,    71,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    79,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    91,    92,
+      93,    -1,    -1,     1,    -1,    -1,    99,   100,    -1,    -1,
+     103,     9,    10,    11,    -1,    13,    14,    15,    16,    17,
       18,    19,    20,    -1,    -1,    23,    24,    25,    26,    27,
       -1,    29,    30,    31,    32,    33,    34,    35,    36,    37,
       38,    39,    40,    41,    42,    43,    44,    45,    -1,    -1,
@@ -845,8 +857,17 @@ static const yytype_int16 yycheck[] =
       58,    59,    60,    -1,    -1,    -1,    -1,    65,    66,    67,
       68,    69,    70,    71,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    79,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    91,    92,    93,    -1,    -1,    -1,     1,
-      -1,    99,   100,    -1,    -1,   103,   104,     9,    10,    11,
+      -1,    -1,    -1,    91,    92,    93,     1,    -1,    -1,    -1,
+      -1,    99,   100,    -1,     9,   103,    11,    -1,    13,    14,
+      15,    16,    17,    18,    19,    20,    -1,    -1,    23,    24,
+      25,    26,    27,    -1,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    -1,    -1,    -1,    49,    50,    51,    52,    53,    -1,
+      55,    56,    57,    58,    59,    60,    -1,    -1,    -1,    -1,
+      65,    66,    67,    68,    69,    70,    71,    -1,    -1,    74,
+      -1,    -1,    -1,    -1,    79,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    91,    92,    93,     1,
+      -1,    -1,    -1,    -1,    99,   100,    -1,     9,   103,    11,
       -1,    13,    14,    15,    16,    17,    18,    19,    20,    -1,
       -1,    23,    24,    25,    26,    27,    -1,    29,    30,    31,
       32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
@@ -855,98 +876,60 @@ static const yytype_int16 yycheck[] =
       -1,    -1,    -1,    65,    66,    67,    68,    69,    70,    71,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    79,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    91,
-      92,    93,    -1,    -1,    -1,     1,    -1,    99,   100,    -1,
-      -1,   103,   104,     9,    -1,    11,    -1,    13,    14,    15,
+      92,    93,     1,    -1,    -1,    -1,    -1,    99,   100,    -1,
+       9,   103,    11,    -1,    13,    14,    15,    16,    17,    18,
+      19,    20,    -1,    -1,    23,    24,    25,    26,    27,    -1,
+      29,    30,    31,    32,    33,    34,    35,    -1,    37,    38,
+      39,    40,    41,    42,    43,    44,    45,    -1,    -1,    -1,
+      49,    50,    51,    52,    53,    -1,    55,    56,    57,    58,
+      59,    60,    -1,    -1,    -1,    -1,    65,    66,    67,    68,
+      69,    70,    71,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      79,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    91,    92,    93,     1,    -1,    -1,    -1,    -1,
+      99,   100,    -1,    -1,   103,    11,    -1,    13,    14,    15,
       16,    17,    18,    19,    20,    -1,    -1,    23,    24,    25,
-      26,    27,    -1,    29,    30,    31,    32,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      -1,    -1,    -1,    49,    50,    51,    52,    53,    -1,    55,
+      26,    27,    -1,    29,    30,    31,    32,    33,    34,    -1,
+      -1,    -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,    -1,
+      61,    62,    63,    64,    -1,    -1,    -1,    53,    -1,    55,
       56,    57,    58,    59,    60,    -1,    -1,    -1,    -1,    65,
-      66,    67,    68,    69,    70,    71,    -1,    -1,    74,    -1,
-      -1,    -1,    -1,    79,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    91,    92,    93,    -1,    -1,
-      -1,     1,    -1,    99,   100,    -1,    -1,   103,   104,     9,
-      -1,    11,    -1,    13,    14,    15,    16,    17,    18,    19,
-      20,    -1,    -1,    23,    24,    25,    26,    27,    -1,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      40,    41,    42,    43,    44,    45,    -1,    -1,    -1,    49,
-      50,    51,    52,    53,    -1,    55,    56,    57,    58,    59,
-      60,    -1,    -1,    -1,    -1,    65,    66,    67,    68,    69,
-      70,    71,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    79,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    91,    92,    93,    -1,    -1,    -1,     1,    -1,    99,
-     100,    -1,    -1,   103,   104,     9,    -1,    11,    -1,    13,
-      14,    15,    16,    17,    18,    19,    20,    -1,    -1,    23,
-      24,    25,    26,    27,    -1,    29,    30,    31,    32,    33,
-      34,    35,    -1,    37,    38,    39,    40,    41,    42,    43,
-      44,    45,    -1,    -1,    -1,    49,    50,    51,    52,    53,
-      -1,    55,    56,    57,    58,    59,    60,    -1,    -1,    -1,
-      -1,    65,    66,    67,    68,    69,    70,    71,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    79,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    91,    92,    93,
-      -1,     1,    -1,    -1,    -1,    99,   100,    -1,    -1,   103,
-     104,    11,    -1,    13,    14,    15,    16,    17,    18,    19,
-      20,    -1,    -1,    23,    24,    25,    26,    27,    -1,    29,
-      30,    31,    32,    33,    34,    -1,    -1,    -1,    -1,    39,
-      -1,    -1,    54,    -1,    -1,    -1,    -1,    -1,    -1,    61,
-      62,    63,    64,    53,    -1,    55,    56,    57,    58,    59,
-      60,    -1,    -1,    -1,    -1,    65,    66,    67,    68,    69,
-      70,    71,    84,    85,    86,    87,    88,    89,    90,    79,
-      -1,    -1,    -1,    95,    96,    97,    98,    -1,    -1,   101,
-      -1,    91,    92,    93,     1,    -1,    -1,    -1,    -1,    99,
-     100,    63,    64,   103,    11,    -1,    13,    14,    15,    16,
+      66,    67,    68,    69,    70,    71,    87,    88,    89,    90,
+      -1,    -1,    -1,    79,    95,    96,    97,    98,    -1,    -1,
+     101,    -1,    -1,    -1,    -1,    91,    92,    93,     1,    -1,
+      -1,    -1,    -1,    99,   100,    63,    64,   103,    11,    -1,
+      13,    14,    15,    16,    17,    18,    19,    -1,    -1,    -1,
+      23,    24,    25,    26,    27,    -1,    29,    30,    31,    32,
+      33,    34,    90,    -1,    -1,    -1,    39,    95,    96,    97,
+      98,    -1,    -1,   101,    -1,    -1,    -1,    -1,    -1,    -1,
+      53,    -1,    55,    56,    57,    58,    59,    60,    -1,    -1,
+       0,    -1,    65,    66,    67,    68,    69,    70,    71,     9,
+      -1,    11,    12,    -1,    -1,    -1,    79,    -1,    -1,    -1,
+      20,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    91,    92,
+      93,    61,    62,    63,    64,    -1,    99,   100,    -1,   102,
+     103,    -1,    42,    43,    44,    45,    -1,    -1,    -1,    49,
+      -1,    51,    -1,    -1,    54,    -1,    -1,    -1,    88,    89,
+      90,    61,    62,    63,    64,    95,    96,    97,    98,    -1,
+      -1,   101,    -1,    -1,    -1,    -1,    76,    77,    78,     0,
+      80,    81,    82,    83,    84,    85,    86,    87,    88,    89,
+      90,    12,    -1,    -1,    -1,    95,    96,    97,    98,    20,
+      -1,   101,   102,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      61,    62,    63,    64,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    42,    43,    44,    45,    -1,    -1,    -1,    49,    -1,
+      51,    -1,    -1,    54,    -1,    -1,    -1,    -1,    89,    90,
+      61,    62,    63,    64,    95,    96,    97,    98,    -1,    -1,
+     101,    -1,    -1,    -1,    -1,    76,    77,    78,    -1,    80,
+      81,    82,    83,    84,    85,    86,    87,    88,    89,    90,
+      -1,    -1,    -1,    -1,    95,    96,    97,    98,    -1,    -1,
+     101,   102,     9,    -1,    11,    -1,    13,    14,    15,    16,
       17,    18,    19,    -1,    -1,    -1,    23,    24,    25,    26,
-      27,    -1,    29,    30,    31,    32,    33,    34,    90,    -1,
-      -1,    -1,    39,    95,    96,    97,    98,    -1,    -1,   101,
-      -1,    -1,    -1,    -1,    -1,    -1,    53,    -1,    55,    56,
-      57,    58,    59,    60,    -1,    -1,     0,    -1,    65,    66,
-      67,    68,    69,    70,    71,     9,    -1,    11,    12,    -1,
-      -1,    -1,    79,    -1,    -1,    -1,    20,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    91,    92,    93,    61,    62,    63,
-      64,    -1,    99,   100,    -1,   102,   103,    -1,    42,    43,
-      44,    45,    -1,    -1,    -1,    49,    -1,    51,    -1,    -1,
-      54,    -1,    -1,    87,    88,    89,    90,    61,    62,    63,
-      64,    95,    96,    97,    98,    -1,    -1,   101,    -1,    -1,
-      -1,    -1,    76,    77,    78,     0,    80,    81,    82,    83,
-      84,    85,    86,    87,    88,    89,    90,    12,    -1,    -1,
-      -1,    95,    96,    97,    98,    20,    -1,   101,   102,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    61,    62,    63,    64,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    42,    43,    44,
-      45,    -1,    -1,    -1,    49,    -1,    51,    -1,    -1,    54,
-      -1,    -1,    -1,    88,    89,    90,    61,    62,    63,    64,
-      95,    96,    97,    98,    -1,    -1,   101,    -1,    -1,    -1,
-      -1,    76,    77,    78,    -1,    80,    81,    82,    83,    84,
-      85,    86,    87,    88,    89,    90,    -1,    -1,    -1,    -1,
-      95,    96,    97,    98,    -1,    -1,   101,   102,     9,    -1,
-      11,    -1,    13,    14,    15,    16,    17,    18,    19,    -1,
-      -1,    -1,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    -1,    -1,    -1,    -1,    39,    -1,
-      -1,    -1,    -1,    -1,    -1,    61,    62,    63,    64,    -1,
-      -1,    -1,    53,    -1,    55,    56,    57,    58,    59,    60,
-      -1,    -1,    -1,    -1,    65,    66,    67,    68,    69,    70,
-      71,    -1,    -1,    89,    90,    -1,    -1,    -1,    79,    95,
-      96,    97,    98,    -1,    -1,   101,    -1,    -1,    -1,    -1,
-      91,    92,    93,    -1,    -1,    -1,    -1,    -1,    99,   100,
-      -1,     9,   103,    11,    -1,    13,    14,    15,    16,    17,
-      18,    19,    -1,    -1,    -1,    23,    24,    25,    26,    27,
-      -1,    29,    30,    31,    32,    33,    34,    -1,    -1,    -1,
-      -1,    39,    -1,    -1,    -1,    -1,    -1,    -1,    61,    62,
-      63,    64,    -1,    -1,    -1,    53,    -1,    55,    56,    57,
-      58,    59,    60,    -1,    -1,    -1,    -1,    65,    66,    67,
-      68,    69,    70,    71,    -1,    -1,    89,    90,    -1,    -1,
-      -1,    79,    95,    96,    97,    98,    -1,    -1,   101,    -1,
-      -1,    -1,    -1,    91,    92,    93,    -1,    -1,    -1,    -1,
-      -1,    99,   100,    -1,    -1,   103,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    -1,    -1,    -1,    23,    24,
-      25,    26,    27,    -1,    29,    30,    31,    32,    33,    34,
-      -1,    -1,    -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,
-      -1,    61,    -1,    63,    64,    -1,    -1,    -1,    53,    -1,
-      55,    56,    57,    58,    59,    60,    -1,    -1,    -1,    -1,
-      65,    66,    67,    68,    69,    70,    71,    -1,    -1,    89,
-      90,    -1,    -1,    -1,    79,    95,    96,    97,    98,    -1,
-      -1,   101,    -1,    -1,    -1,    -1,    91,    92,    93,    -1,
-      -1,    -1,    -1,    -1,    99,   100,    -1,    11,   103,    13,
-      14,    15,    16,    17,    18,    19,    20,    -1,    -1,    23,
+      27,    28,    29,    30,    31,    32,    33,    34,    -1,    -1,
+      -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,    -1,    61,
+      -1,    63,    64,    -1,    -1,    -1,    53,    -1,    55,    56,
+      57,    58,    59,    60,    -1,    -1,    -1,    -1,    65,    66,
+      67,    68,    69,    70,    71,    -1,    -1,    89,    90,    -1,
+      -1,    -1,    79,    95,    96,    97,    98,    -1,    -1,   101,
+      -1,    -1,    -1,    -1,    91,    92,    93,    -1,    -1,    -1,
+      -1,    -1,    99,   100,    -1,     9,   103,    11,    -1,    13,
+      14,    15,    16,    17,    18,    19,    -1,    -1,    -1,    23,
       24,    25,    26,    27,    -1,    29,    30,    31,    32,    33,
       34,    -1,    -1,    -1,    -1,    39,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    63,    64,    -1,    -1,    -1,    53,
@@ -954,7 +937,44 @@ static const yytype_int16 yycheck[] =
       -1,    65,    66,    67,    68,    69,    70,    71,    -1,    -1,
       89,    90,    -1,    -1,    -1,    79,    95,    96,    97,    98,
       -1,    -1,   101,    -1,    -1,    -1,    -1,    91,    92,    93,
-      -1,    -1,    -1,    -1,    -1,    99,   100,    -1,    11,   103,
+      -1,    -1,    -1,    -1,    -1,    99,   100,    -1,    -1,   103,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    -1,
+      -1,    -1,    23,    24,    25,    26,    27,    -1,    29,    30,
+      31,    32,    33,    34,    -1,    -1,    -1,    -1,    39,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    53,    -1,    55,    56,    57,    58,    59,    60,
+      -1,    -1,    -1,    -1,    65,    66,    67,    68,    69,    70,
+      71,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    79,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      91,    92,    93,    -1,    -1,    -1,    -1,    -1,    99,   100,
+      -1,    11,   103,    13,    14,    15,    16,    17,    18,    19,
+      20,    -1,    -1,    23,    24,    25,    26,    27,    -1,    29,
+      30,    31,    32,    33,    34,    -1,    -1,    -1,    -1,    39,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    53,    -1,    55,    56,    57,    58,    59,
+      60,    -1,    -1,    -1,    -1,    65,    66,    67,    68,    69,
+      70,    71,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    79,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    91,    92,    93,    -1,    -1,    -1,    -1,    -1,    99,
+     100,    -1,    11,   103,    13,    14,    15,    16,    17,    18,
+      19,    -1,    -1,    -1,    23,    24,    25,    26,    27,    -1,
+      29,    30,    31,    32,    33,    34,    -1,    -1,    -1,    -1,
+      39,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    53,    -1,    55,    56,    57,    58,
+      59,    60,    -1,    -1,    -1,    -1,    65,    66,    67,    68,
+      69,    70,    71,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      79,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    91,    92,    93,    -1,    -1,    -1,    -1,    -1,
+      99,   100,    -1,   102,   103,    11,    -1,    13,    14,    15,
+      16,    17,    18,    19,    -1,    -1,    -1,    23,    24,    25,
+      26,    27,    -1,    29,    30,    31,    32,    33,    34,    -1,
+      -1,    -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    53,    -1,    55,
+      56,    57,    58,    59,    60,    -1,    -1,    -1,    -1,    65,
+      66,    67,    68,    69,    70,    71,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    79,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    91,    92,    93,    -1,    -1,
+      -1,    -1,    -1,    99,   100,    -1,   102,   103,    11,    -1,
       13,    14,    15,    16,    17,    18,    19,    -1,    -1,    -1,
       23,    24,    25,    26,    27,    -1,    29,    30,    31,    32,
       33,    34,    -1,    -1,    -1,    -1,    39,    -1,    -1,    -1,
@@ -998,127 +1018,113 @@ static const yytype_int16 yycheck[] =
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    53,    -1,    55,    56,    57,    58,    59,    60,
       -1,    -1,    -1,    -1,    65,    66,    67,    68,    69,    70,
-      71,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    79,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      71,    -1,    -1,    -1,    -1,    -1,    54,    -1,    79,    -1,
+      -1,    -1,    -1,    61,    62,    63,    64,    -1,    -1,    -1,
       91,    92,    93,    -1,    -1,    -1,    -1,    -1,    99,   100,
-      -1,   102,   103,    11,    -1,    13,    14,    15,    16,    17,
-      18,    19,    -1,    -1,    -1,    23,    24,    25,    26,    27,
-      -1,    29,    30,    31,    32,    33,    34,    -1,    -1,    -1,
-      -1,    39,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    53,    -1,    55,    56,    57,
-      58,    59,    60,    -1,    -1,    -1,    -1,    65,    66,    67,
-      68,    69,    70,    71,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    79,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    91,    92,    93,    -1,    -1,    -1,    -1,
-      -1,    99,   100,    -1,   102,   103,    11,    -1,    13,    14,
-      15,    16,    17,    18,    19,    -1,    -1,    -1,    23,    24,
-      25,    26,    27,    -1,    29,    30,    31,    32,    33,    34,
-      -1,    -1,    -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    53,    -1,
-      55,    56,    57,    58,    59,    60,    -1,    -1,    -1,    -1,
-      65,    66,    67,    68,    69,    70,    71,    -1,    -1,    54,
-      -1,    -1,    -1,    -1,    79,    -1,    61,    62,    63,    64,
-      -1,    -1,    -1,    -1,    -1,    -1,    91,    92,    93,    -1,
-      -1,    -1,    -1,    -1,    99,   100,    81,    82,   103,    84,
-      85,    86,    87,    88,    89,    90,    -1,    -1,    -1,    -1,
-      95,    96,    97,    98,    54,    -1,   101,    -1,    -1,    -1,
-      -1,    61,    62,    63,    64,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   103,    81,    82,    83,    84,    85,    86,    87,
+      88,    89,    90,    -1,    -1,    -1,    -1,    95,    96,    97,
+      98,    54,    -1,   101,    -1,    -1,    -1,    -1,    61,    62,
+      63,    64,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    81,    82,
+      -1,    84,    85,    86,    87,    88,    89,    90,    -1,    -1,
+      -1,    -1,    95,    96,    97,    98,    54,    -1,   101,    -1,
+      -1,    -1,    -1,    61,    62,    63,    64,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    82,    -1,    84,    85,    86,    87,    88,    89,
-      90,    -1,    -1,    -1,    -1,    95,    96,    97,    98,    -1,
-      -1,   101
+      -1,    -1,    -1,    -1,    82,    -1,    84,    85,    86,    87,
+      88,    89,    90,    -1,    -1,    -1,    -1,    95,    96,    97,
+      98,    -1,    -1,   101
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
 static const yytype_uint8 yystos[] =
 {
-       0,     3,     4,     5,     6,     7,     8,   106,   107,   108,
-     109,   110,   111,   112,     0,   115,    11,    13,    14,    15,
+       0,     3,     4,     5,     6,     7,     8,   105,   106,   107,
+     108,   109,   110,   111,     0,   114,    11,    13,    14,    15,
       16,    17,    18,    19,    23,    24,    25,    26,    27,    29,
       30,    31,    32,    33,    34,    39,    53,    55,    56,    57,
       58,    59,    60,    65,    66,    67,    68,    69,    70,    71,
-      79,    91,    92,    93,    99,   100,   103,   150,   151,   152,
-     155,   156,   157,   158,   159,   160,   162,   165,   167,   168,
-     169,   170,   171,   172,   173,   174,   175,     9,   113,     1,
+      79,    91,    92,    93,    99,   100,   103,   149,   150,   151,
+     154,   155,   156,   157,   158,   159,   161,   164,   166,   167,
+     168,   169,   170,   171,   172,   173,   174,     9,   112,     1,
       20,    35,    37,    38,    40,    41,    42,    43,    44,    45,
-      49,    50,    51,    52,   104,   113,   122,   128,   150,    36,
-     120,   121,   122,   118,   118,    12,   150,   160,   160,    23,
-      28,   113,   168,   176,   176,   176,   176,   176,   176,   176,
-     161,    11,   103,   160,   140,   140,   160,   103,   103,   103,
-     113,   160,    23,   151,   164,   168,   176,   176,   113,   160,
-      20,   150,    23,    28,   142,   160,   103,   163,   168,   169,
-     170,   160,   151,   160,   160,   160,   160,   160,   102,   150,
-      76,    77,    78,    80,     9,    11,   103,    54,    61,    62,
-      63,    64,    81,    82,    84,    85,    86,    87,    88,    89,
-      90,    95,    96,    97,    98,   101,   103,     9,    11,     9,
-      11,     9,    11,     9,   115,   141,   142,    23,   139,   103,
-     103,   103,   103,    70,   103,   168,   103,   103,   113,    48,
-     130,    20,    42,    43,    44,    45,    49,    51,   121,   122,
-     120,    12,   164,   103,   103,   150,   102,   113,    26,   143,
-     102,   102,   150,   165,   176,   151,    10,    20,   164,   102,
-     150,    72,   145,    11,   102,   150,   150,   150,   160,   150,
-     150,   102,   150,   160,   160,   160,   160,   160,   160,   160,
-     160,   160,   160,   160,   160,   160,   160,   160,     9,    11,
-      15,    16,    17,    18,    19,    24,    65,   103,   154,   168,
-     102,   150,   150,   150,   150,   150,   150,   150,   150,   118,
-      23,   138,   139,    23,   124,   115,   115,   115,   115,   115,
-     115,   103,   115,   115,   113,   150,   134,   150,   150,   150,
-     150,   150,   165,   151,    12,   153,    72,   144,   102,   102,
-     150,    10,   102,    26,   150,    11,    20,    12,   102,    83,
-     150,   150,    18,    18,    18,    18,    18,    18,   102,   150,
-     103,   102,    20,    12,    20,    12,    20,    12,    20,    10,
-      21,   114,   123,     9,    20,    23,   133,   150,   134,   135,
-     150,   134,   137,   166,   168,   128,   132,   135,   136,   150,
-     115,   135,   135,   102,   102,   164,    26,   115,   148,   102,
-      12,   150,    10,   160,    20,    12,   102,   165,    10,    10,
-      10,    10,   115,   143,   115,    23,   102,   102,   102,   102,
-     103,   102,    20,   135,   102,   102,   103,   146,    12,    10,
-     102,    20,   144,   125,   164,   131,   131,     9,   116,   116,
-     135,   116,   133,   102,   116,   116,   147,     9,    74,    20,
-     148,   149,   118,    20,   116,   116,   117,    46,    47,   129,
-     129,   102,   130,    20,   116,   102,   118,   119,    10,   130,
-     130,   118,   116,   103,   116,   131,   130,    10,    20,    26,
-     126,    10,   135,   130,   136,    22,    73,   127,   102,   102,
-     118,   116,   116,    74,   129
+      49,    50,    51,    52,   112,   121,   127,   149,    36,   119,
+     120,   121,   117,   117,    12,   149,   159,   159,    23,    28,
+     112,   167,   175,   175,   175,   175,   175,   175,   175,   160,
+      11,   103,   159,   139,   139,   159,   103,   103,   103,   112,
+     159,    23,   150,   163,   167,   175,   175,   112,   159,    20,
+     149,    23,    28,   141,   159,   103,   162,   167,   168,   169,
+     159,   150,   159,   159,   159,   159,   159,   102,   149,    76,
+      77,    78,    80,     9,    11,   103,    54,    61,    62,    63,
+      64,    81,    82,    84,    85,    86,    87,    88,    89,    90,
+      95,    96,    97,    98,   101,   103,     9,    11,     9,    11,
+       9,    11,     9,   114,   140,   141,    23,   138,   103,   103,
+     103,   103,    70,   103,   167,   103,   103,   112,    48,   129,
+      20,    42,    43,    44,    45,    49,    51,   120,   121,   119,
+      12,   163,   103,   103,   149,   102,   112,    26,   142,   102,
+     102,   149,   164,   175,   150,    10,    20,   163,   102,   149,
+      72,   144,    11,   102,   149,   149,   149,   159,   149,   149,
+     102,   149,   159,   159,   159,   159,   159,   159,   159,   159,
+     159,   159,   159,   159,   159,   159,   159,     9,    11,    15,
+      16,    17,    18,    19,    24,    65,   103,   153,   167,   102,
+     149,   149,   149,   149,   149,   149,   149,   149,   117,    23,
+     137,   138,    23,   123,   114,   114,   114,   114,   114,   114,
+     103,   114,   114,   112,   149,   133,   149,   149,   149,   149,
+     149,   164,   150,    12,   152,    72,   143,   102,   102,   149,
+      10,   102,    26,   149,    11,    20,    12,   102,    83,   149,
+     149,    18,    18,    18,    18,    18,    18,   102,   149,   103,
+     102,    20,    12,    20,    12,    20,    12,    20,    10,    21,
+     113,   122,     9,    20,    23,   132,   149,   133,   134,   149,
+     133,   136,   165,   167,   127,   131,   134,   135,   149,   114,
+     134,   134,   102,   102,   163,    26,   114,   147,   102,    12,
+     149,    10,   159,    20,    12,   102,   164,    10,    10,    10,
+      10,   114,   142,   114,    23,   102,   102,   102,   102,   103,
+     102,    20,   134,   102,   102,   103,   145,    12,    10,   102,
+      20,   143,   124,   163,   130,   130,     9,   115,   115,   134,
+     115,   132,   102,   115,   115,   146,     9,    74,    20,   147,
+     148,   117,    20,   115,   115,   116,    46,    47,   128,   128,
+     102,   129,    20,   115,   102,   117,   118,    10,   129,   129,
+     117,   115,   103,   115,   130,   129,    10,    20,    26,   125,
+      10,   134,   129,   135,    22,    73,   126,   102,   102,   117,
+     115,   115,    74,   128
 };
 
 typedef enum {
-       toketype_i_tkval, toketype_ival, toketype_opval, toketype_p_tkval
+       toketype_ival, toketype_opval, toketype_pval
 } toketypes;
 
 /* type of each token/terminal */
 static const toketypes yy_type_tab[] =
 {
   toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
-  toketype_ival, toketype_ival, toketype_ival, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval,
-  toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval,
-  toketype_i_tkval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
   toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
-  toketype_opval, toketype_p_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval,
-  toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval,
-  toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval,
-  toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval,
-  toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval,
-  toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_ival, toketype_ival, toketype_ival,
+  toketype_opval, toketype_pval, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
   toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
   toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
   toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
-  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_i_tkval, toketype_ival, toketype_ival, toketype_ival,
-  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_opval, toketype_opval, toketype_ival,
-  toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval,
-  toketype_opval, toketype_opval, toketype_ival, toketype_ival, toketype_ival, toketype_opval, toketype_opval,
-  toketype_opval, toketype_opval, toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
-  toketype_opval, toketype_opval, toketype_opval, toketype_ival, toketype_ival,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_opval, toketype_opval, toketype_ival, toketype_opval,
   toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
+  toketype_opval, toketype_ival, toketype_ival, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
+  toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
+  toketype_opval, toketype_ival, toketype_ival, toketype_ival, toketype_opval,
+  toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_ival,
+  toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_ival,
+  toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
   toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
-  toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
-  toketype_opval, toketype_opval, toketype_opval, toketype_ival, toketype_opval, toketype_opval,
   toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
-  toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval
+  toketype_opval, toketype_opval, toketype_opval, toketype_opval
 };
 
 /* Generated from:
- * bb8245a1a537b2afb2445b3973f63b210f9ec346a1955071aef7d05ba97196ae perly.y
- * 5c9d2a0262457fe9b70073fc8ad6c188f812f38ad57712b7e2f53daa01b297cc regen_perly.pl
+ * 7e6c275bbd1dbc800c205a8a8b0cd785e4859f94976ee7372149598471f16f81 perly.y
+ * d1d4df7b8e30ac9dede664af9179e6e5e7ddc7f2ad9c4eff9e2e5b32c9e16a6e regen_perly.pl
  * ex: set ro: */
diff --git a/perly.y b/perly.y
index 1047913..de90b2a 100644 (file)
--- a/perly.y
+++ b/perly.y
  * to run regen_perly.pl, which re-creates the files perly.h, perly.tab
  * and perly.act which are derived from this.
  *
- * Note that these derived files are included and compiled twice; once
- * from perly.c, and once from madly.c. The second time, a number of MAD
- * macros are defined, which compile in extra code that allows the parse
- * tree to be accurately dumped. In particular:
- *
- * MAD            defined if compiling madly.c
- * DO_MAD(A)      expands to A  under madly.c, to null otherwise
- * IF_MAD(a,b)    expands to A under madly.c, to B otherwise
- * TOKEN_GETMAD() expands to token_getmad() under madly.c, to null otherwise
- * TOKEN_FREE()   similarly
- * OP_GETMAD()    similarly
- * IVAL(i)        expands to (i)->tk_lval.ival or (i)
- * PVAL(p)        expands to (p)->tk_lval.pval or (p)
- *
  * The main job of of this grammar is to call the various newFOO()
  * functions in op.c to build a syntax tree of OP structs.
  * It relies on the lexer in toke.c to do the tokenizing.
@@ -47,8 +33,6 @@
 
 %pure_parser
 
-/* FIXME for MAD - is the new mintro on while and until important?  */
-
 %start grammar
 
 %union {
     char *pval;
     OP *opval;
     GV *gvval;
-#ifdef PERL_IN_MADLY_C
-    TOKEN* p_tkval;
-    TOKEN* i_tkval;
-#else
-    char *p_tkval;
-    I32        i_tkval;
-#endif
-#ifdef PERL_MAD
-    TOKEN* tkval;
-#endif
 }
 
 %token <ival> GRAMPROG GRAMEXPR GRAMBLOCK GRAMBARESTMT GRAMFULLSTMT GRAMSTMTSEQ
 
-%token <i_tkval> '{' '}' '[' ']' '-' '+' '$' '@' '%' '*' '&' ';' '=' '.'
+%token <ival> '{' '}' '[' ']' '-' '+' '$' '@' '%' '*' '&' ';' '=' '.'
 
 %token <opval> WORD METHOD FUNCMETH THING PMFUNC PRIVATEREF QWLIST
 %token <opval> FUNC0OP FUNC0SUB UNIOPSUB LSTOPSUB
 %token <opval> PLUGEXPR PLUGSTMT
-%token <p_tkval> LABEL
-%token <i_tkval> FORMAT SUB ANONSUB PACKAGE USE
-%token <i_tkval> WHILE UNTIL IF UNLESS ELSE ELSIF CONTINUE FOR
-%token <i_tkval> GIVEN WHEN DEFAULT
-%token <i_tkval> LOOPEX DOTDOT YADAYADA
-%token <i_tkval> FUNC0 FUNC1 FUNC UNIOP LSTOP
-%token <i_tkval> RELOP EQOP MULOP ADDOP
-%token <i_tkval> DOLSHARP DO HASHBRACK NOAMP
-%token <i_tkval> LOCAL MY REQUIRE
-%token <i_tkval> COLONATTR FORMLBRACK FORMRBRACK
+%token <pval> LABEL
+%token <ival> FORMAT SUB ANONSUB PACKAGE USE
+%token <ival> WHILE UNTIL IF UNLESS ELSE ELSIF CONTINUE FOR
+%token <ival> GIVEN WHEN DEFAULT
+%token <ival> LOOPEX DOTDOT YADAYADA
+%token <ival> FUNC0 FUNC1 FUNC UNIOP LSTOP
+%token <ival> RELOP EQOP MULOP ADDOP
+%token <ival> DOLSHARP DO HASHBRACK NOAMP
+%token <ival> LOCAL MY REQUIRE
+%token <ival> COLONATTR FORMLBRACK FORMRBRACK
 
 %type <ival> grammar remember mremember
 %type <ival>  startsub startanonsub startformsub
-/* FIXME for MAD - are these two ival? */
+
 %type <ival> mintro
 
 %type <opval> stmtseq fullstmt labfullstmt barestmt block mblock else
 %type <opval> realsubbody subsignature termbinop termunop anonymous termdo
 %type <opval> formstmtseq formline formarg
 
-%nonassoc <i_tkval> PREC_LOW
+%nonassoc <ival> PREC_LOW
 %nonassoc LOOPEX
 
-%left <i_tkval> OROP DOROP
-%left <i_tkval> ANDOP
-%right <i_tkval> NOTOP
+%left <ival> OROP DOROP
+%left <ival> ANDOP
+%right <ival> NOTOP
 %nonassoc LSTOP LSTOPSUB
-%left <i_tkval> ','
-%right <i_tkval> ASSIGNOP
-%right <i_tkval> '?' ':'
+%left <ival> ','
+%right <ival> ASSIGNOP
+%right <ival> '?' ':'
 %nonassoc DOTDOT YADAYADA
-%left <i_tkval> OROR DORDOR
-%left <i_tkval> ANDAND
-%left <i_tkval> BITOROP
-%left <i_tkval> BITANDOP
+%left <ival> OROR DORDOR
+%left <ival> ANDAND
+%left <ival> BITOROP
+%left <ival> BITANDOP
 %nonassoc EQOP
 %nonassoc RELOP
 %nonassoc UNIOP UNIOPSUB
 %nonassoc REQUIRE
-%left <i_tkval> SHIFTOP
+%left <ival> SHIFTOP
 %left ADDOP
 %left MULOP
-%left <i_tkval> MATCHOP
-%right <i_tkval> '!' '~' UMINUS REFGEN
-%right <i_tkval> POWOP
-%nonassoc <i_tkval> PREINC PREDEC POSTINC POSTDEC POSTJOIN
-%left <i_tkval> ARROW
-%nonassoc <i_tkval> ')'
-%left <i_tkval> '('
+%left <ival> MATCHOP
+%right <ival> '!' '~' UMINUS REFGEN
+%right <ival> POWOP
+%nonassoc <ival> PREINC PREDEC POSTINC POSTDEC POSTJOIN
+%left <ival> ARROW
+%nonassoc <ival> ')'
+%left <ival> '('
 %left '[' '{'
 
-%token <i_tkval> PEG
-
 %% /* RULES */
 
 /* Top-level choice of what kind of thing yyparse was called to parse */
@@ -205,21 +177,17 @@ grammar   :       GRAMPROG
 
 /* An ordinary block */
 block  :       '{' remember stmtseq '}'
-                       { if (PL_parser->copline > (line_t)IVAL($1))
-                             PL_parser->copline = (line_t)IVAL($1);
+                       { if (PL_parser->copline > (line_t)$1)
+                             PL_parser->copline = (line_t)$1;
                          $$ = block_end($2, $3);
-                         TOKEN_GETMAD($1,$$,'{');
-                         TOKEN_GETMAD($4,$$,'}');
                        }
        ;
 
 /* format body */
 formblock:     '=' remember ';' FORMRBRACK formstmtseq ';' '.'
-                       { if (PL_parser->copline > (line_t)IVAL($1))
-                             PL_parser->copline = (line_t)IVAL($1);
+                       { if (PL_parser->copline > (line_t)$1)
+                             PL_parser->copline = (line_t)$1;
                          $$ = block_end($2, $5);
-                         TOKEN_GETMAD($1,$$,'{');
-                         TOKEN_GETMAD($7,$$,'}');
                        }
        ;
 
@@ -228,11 +196,9 @@ remember:  /* NULL */      /* start a full lexical scope */
        ;
 
 mblock :       '{' mremember stmtseq '}'
-                       { if (PL_parser->copline > (line_t)IVAL($1))
-                             PL_parser->copline = (line_t)IVAL($1);
+                       { if (PL_parser->copline > (line_t)$1)
+                             PL_parser->copline = (line_t)$1;
                          $$ = block_end($2, $3);
-                         TOKEN_GETMAD($1,$$,'{');
-                         TOKEN_GETMAD($4,$$,'}');
                        }
        ;
 
@@ -265,11 +231,7 @@ formstmtseq:       /* NULL */
 /* A statement in the program, including optional labels */
 fullstmt:      barestmt
                        {
-                         if($1) {
-                             $$ = newSTATEOP(0, NULL, $1);
-                         } else {
-                             $$ = IF_MAD(newOP(OP_NULL, 0), NULL);
-                         }
+                         $$ = $1 ? newSTATEOP(0, NULL, $1) : NULL;
                        }
        |       labfullstmt
                        { $$ = $1; }
@@ -277,41 +239,22 @@ fullstmt: barestmt
 
 labfullstmt:   LABEL barestmt
                        {
-                         $$ = newSTATEOP(SVf_UTF8
-                                          * PVAL($1)[strlen(PVAL($1))+1],
-                                         PVAL($1), $2);
-                         TOKEN_GETMAD($1,
-                             $2 ? cLISTOPx($$)->op_first : $$, 'L');
+                         $$ = newSTATEOP(SVf_UTF8 * $1[strlen($1)+1], $1, $2);
                        }
        |       LABEL labfullstmt
                        {
-                         $$ = newSTATEOP(SVf_UTF8
-                                          * PVAL($1)[strlen(PVAL($1))+1],
-                                         PVAL($1), $2);
-                         TOKEN_GETMAD($1, cLISTOPx($$)->op_first, 'L');
+                         $$ = newSTATEOP(SVf_UTF8 * $1[strlen($1)+1], $1, $2);
                        }
        ;
 
 /* A bare statement, lacking label and other aspects of state op */
 barestmt:      PLUGSTMT
                        { $$ = $1; }
-       |       PEG
-                       {
-                         $$ = newOP(OP_NULL,0);
-                         TOKEN_GETMAD($1,$$,'p');
-                       }
        |       FORMAT startformsub formname formblock
                        {
                          CV *fmtcv = PL_compcv;
-#ifdef MAD
-                         $$ = newFORM($2, $3, $4);
-                         prepend_madprops($1->tk_mad, $$, 'F');
-                         $1->tk_mad = 0;
-                         token_free($1);
-#else
                          newFORM($2, $3, $4);
                          $$ = (OP*)NULL;
-#endif
                          if (CvOUTSIDE(fmtcv) && !CvEVAL(CvOUTSIDE(fmtcv))) {
                              SvREFCNT_inc_simple_void(fmtcv);
                              pad_add_anon(fmtcv, OP_NULL);
@@ -342,80 +285,39 @@ barestmt: PLUGSTMT
                proto subattrlist optsubbody
                        {
                          SvREFCNT_inc_simple_void(PL_compcv);
-#ifdef MAD
-                         {
-                             OP* o = newSVOP(OP_ANONCODE, 0,
-                               (SV*)(
-#endif
                          $2->op_type == OP_CONST
                              ? newATTRSUB($3, $2, $5, $6, $7)
                              : newMYSUB($3, $2, $5, $6, $7)
-#ifdef MAD
-                               ));
-                             $$ = newOP(OP_NULL,0);
-                             op_getmad(o,$$,'&');
-                             op_getmad($2,$$,'n');
-                             op_getmad($5,$$,'s');
-                             op_getmad($6,$$,'a');
-                             token_getmad($1,$$,'d');
-                             append_madprops($7->op_madprop, $$, 0);
-                             $7->op_madprop = 0;
-                         }
-#else
                          ;
                          $$ = (OP*)NULL;
-#endif
                          intro_my();
                        }
        |       PACKAGE WORD WORD ';'
                        {
-#ifdef MAD
-                         $$ = package($3);
-                         token_getmad($1,$$,'o');
-                         if ($2)
-                             package_version($2);
-                         token_getmad($4,$$,';');
-#else
                          package($3);
                          if ($2)
                              package_version($2);
                          $$ = (OP*)NULL;
-#endif
                        }
        |       USE startsub
                        { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ }
                WORD WORD optlistexpr ';'
                        {
                          SvREFCNT_inc_simple_void(PL_compcv);
-#ifdef MAD
-                         $$ = utilize(IVAL($1), $2, $4, $5, $6);
-                         token_getmad($1,$$,'o');
-                         token_getmad($7,$$,';');
-                         if (PL_parser->rsfp_filters &&
-                                     AvFILLp(PL_parser->rsfp_filters) >= 0)
-                             append_madprops(newMADPROP('!', MAD_NULL, NULL, 0), $$, 0);
-#else
-                         utilize(IVAL($1), $2, $4, $5, $6);
+                         utilize($1, $2, $4, $5, $6);
                          $$ = (OP*)NULL;
-#endif
                        }
        |       IF '(' remember mexpr ')' mblock else
                        {
                          $$ = block_end($3,
                              newCONDOP(0, $4, op_scope($6), $7));
-                         TOKEN_GETMAD($1,$$,'I');
-                         TOKEN_GETMAD($2,$$,'(');
-                         TOKEN_GETMAD($5,$$,')');
-                         PL_parser->copline = (line_t)IVAL($1);
+                         PL_parser->copline = (line_t)$1;
                        }
        |       UNLESS '(' remember miexpr ')' mblock else
                        {
                          $$ = block_end($3,
                              newCONDOP(0, $4, op_scope($6), $7));
-                         TOKEN_GETMAD($1,$$,'I');
-                         TOKEN_GETMAD($2,$$,'(');
-                         TOKEN_GETMAD($5,$$,')');
-                         PL_parser->copline = (line_t)IVAL($1);
+                         PL_parser->copline = (line_t)$1;
                        }
        |       GIVEN '(' remember mexpr ')' mblock
                        {
@@ -426,7 +328,7 @@ barestmt:   PLUGSTMT
                                    || PAD_COMPNAME_FLAGS_isOUR(offset)
                                      ? 0
                                      : offset));
-                         PL_parser->copline = (line_t)IVAL($1);
+                         PL_parser->copline = (line_t)$1;
                        }
        |       WHEN '(' remember mexpr ')' mblock
                        { $$ = block_end($3, newWHENOP($4, op_scope($6))); }
@@ -437,25 +339,19 @@ barestmt: PLUGSTMT
                          $$ = block_end($3,
                                  newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
                                      $4, $7, $8, $6));
-                         TOKEN_GETMAD($1,$$,'W');
-                         TOKEN_GETMAD($2,$$,'(');
-                         TOKEN_GETMAD($5,$$,')');
-                         PL_parser->copline = (line_t)IVAL($1);
+                         PL_parser->copline = (line_t)$1;
                        }
        |       UNTIL '(' remember iexpr ')' mintro mblock cont
                        {
                          $$ = block_end($3,
                                  newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
                                      $4, $7, $8, $6));
-                         TOKEN_GETMAD($1,$$,'W');
-                         TOKEN_GETMAD($2,$$,'(');
-                         TOKEN_GETMAD($5,$$,')');
-                         PL_parser->copline = (line_t)IVAL($1);
+                         PL_parser->copline = (line_t)$1;
                        }
        |       FOR '(' remember mnexpr ';' texpr ';' mintro mnexpr ')'
                mblock
                        {
-                         OP *initop = IF_MAD($4 ? $4 : newOP(OP_NULL, 0), $4);
+                         OP *initop = $4;
                          OP *forop = newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
                                      scalar($6), $11, $9, $8);
                          if (initop) {
@@ -464,41 +360,25 @@ barestmt: PLUGSTMT
                                      newOP(OP_UNSTACK, OPf_SPECIAL),
                                      forop));
                          }
-                         DO_MAD({ forop = newUNOP(OP_NULL, 0, forop); })
                          $$ = block_end($3, forop);
-                         TOKEN_GETMAD($1,$$,'3');
-                         TOKEN_GETMAD($2,$$,'(');
-                         TOKEN_GETMAD($5,$$,'1');
-                         TOKEN_GETMAD($7,$$,'2');
-                         TOKEN_GETMAD($10,$$,')');
-                         PL_parser->copline = (line_t)IVAL($1);
+                         PL_parser->copline = (line_t)$1;
                        }
        |       FOR MY remember my_scalar '(' mexpr ')' mblock cont
                        {
                          $$ = block_end($3, newFOROP(0, $4, $6, $8, $9));
-                         TOKEN_GETMAD($1,$$,'W');
-                         TOKEN_GETMAD($2,$$,'d');
-                         TOKEN_GETMAD($5,$$,'(');
-                         TOKEN_GETMAD($7,$$,')');
-                         PL_parser->copline = (line_t)IVAL($1);
+                         PL_parser->copline = (line_t)$1;
                        }
        |       FOR scalar '(' remember mexpr ')' mblock cont
                        {
                          $$ = block_end($4, newFOROP(0,
                                      op_lvalue($2, OP_ENTERLOOP), $5, $7, $8));
-                         TOKEN_GETMAD($1,$$,'W');
-                         TOKEN_GETMAD($3,$$,'(');
-                         TOKEN_GETMAD($6,$$,')');
-                         PL_parser->copline = (line_t)IVAL($1);
+                         PL_parser->copline = (line_t)$1;
                        }
        |       FOR '(' remember mexpr ')' mblock cont
                        {
                          $$ = block_end($3,
                                  newFOROP(0, (OP*)NULL, $4, $6, $7));
-                         TOKEN_GETMAD($1,$$,'W');
-                         TOKEN_GETMAD($2,$$,'(');
-                         TOKEN_GETMAD($5,$$,')');
-                         PL_parser->copline = (line_t)IVAL($1);
+                         PL_parser->copline = (line_t)$1;
                        }
        |       block cont
                        {
@@ -518,22 +398,18 @@ barestmt: PLUGSTMT
                          /* a block is a loop that happens once */
                          $$ = newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
                                  (OP*)NULL, block_end($5, $7), (OP*)NULL, 0);
-                         TOKEN_GETMAD($4,$$,'{');
-                         TOKEN_GETMAD($8,$$,'}');
-                         if (PL_parser->copline > (line_t)IVAL($4))
-                             PL_parser->copline = (line_t)IVAL($4);
+                         if (PL_parser->copline > (line_t)$4)
+                             PL_parser->copline = (line_t)$4;
                        }
        |       sideff ';'
                        {
                          PL_parser->expect = XSTATE;
                          $$ = $1;
-                         TOKEN_GETMAD($2,$$,';');
                        }
        |       ';'
                        {
                          PL_parser->expect = XSTATE;
-                         $$ = IF_MAD(newOP(OP_NULL, 0), (OP*)NULL);
-                         TOKEN_GETMAD($1,$$,';');
+                         $$ = (OP*)NULL;
                          PL_parser->copline = NOLINE;
                        }
        ;
@@ -543,16 +419,10 @@ formline: THING formarg
                        { OP *list;
                          if ($2) {
                              OP *term = $2;
-                             DO_MAD(term = newUNOP(OP_NULL, 0, term));
                              list = op_append_elem(OP_LIST, $1, term);
                          }
                          else {
-#ifdef MAD
-                             OP *op = newNULLLIST();
-                             list = op_append_elem(OP_LIST, $1, op);
-#else
                              list = $1;
-#endif
                          }
                          if (PL_parser->copline == NOLINE)
                               PL_parser->copline = CopLINE(PL_curcop)-1;
@@ -574,26 +444,16 @@ sideff    :       error
        |       expr
                        { $$ = $1; }
        |       expr IF expr
-                       { $$ = newLOGOP(OP_AND, 0, $3, $1);
-                         TOKEN_GETMAD($2,$$,'i');
-                       }
+                       { $$ = newLOGOP(OP_AND, 0, $3, $1); }
        |       expr UNLESS expr
-                       { $$ = newLOGOP(OP_OR, 0, $3, $1);
-                         TOKEN_GETMAD($2,$$,'i');
-                       }
+                       { $$ = newLOGOP(OP_OR, 0, $3, $1); }
        |       expr WHILE expr
-                       { $$ = newLOOPOP(OPf_PARENS, 1, scalar($3), $1);
-                         TOKEN_GETMAD($2,$$,'w');
-                       }
+                       { $$ = newLOOPOP(OPf_PARENS, 1, scalar($3), $1); }
        |       expr UNTIL iexpr
-                       { $$ = newLOOPOP(OPf_PARENS, 1, $3, $1);
-                         TOKEN_GETMAD($2,$$,'w');
-                       }
+                       { $$ = newLOOPOP(OPf_PARENS, 1, $3, $1); }
        |       expr FOR expr
                        { $$ = newFOROP(0, (OP*)NULL, $3, $1, (OP*)NULL);
-                         TOKEN_GETMAD($2,$$,'w');
-                         PL_parser->copline = (line_t)IVAL($2);
-                       }
+                         PL_parser->copline = (line_t)$2; }
        |       expr WHEN expr
                        { $$ = newWHENOP($3, op_scope($1)); }
        ;
@@ -605,17 +465,13 @@ else      :       /* NULL */
                        {
                          ($2)->op_flags |= OPf_PARENS;
                          $$ = op_scope($2);
-                         TOKEN_GETMAD($1,$$,'o');
                        }
        |       ELSIF '(' mexpr ')' mblock else
-                       { PL_parser->copline = (line_t)IVAL($1);
+                       { PL_parser->copline = (line_t)$1;
                            $$ = newCONDOP(0,
                                newSTATEOP(OPf_SPECIAL,NULL,$3),
                                op_scope($5), $6);
                          PL_hints |= HINT_BLOCK_SCOPE;
-                         TOKEN_GETMAD($1,$$,'I');
-                         TOKEN_GETMAD($2,$$,'(');
-                         TOKEN_GETMAD($4,$$,')');
                        }
        ;
 
@@ -623,10 +479,7 @@ else       :       /* NULL */
 cont   :       /* NULL */
                        { $$ = (OP*)NULL; }
        |       CONTINUE block
-                       {
-                         $$ = op_scope($2);
-                         TOKEN_GETMAD($1,$$,'o');
-                       }
+                       { $$ = op_scope($2); }
        ;
 
 /* determine whether there are any new my declarations */
@@ -702,30 +555,16 @@ proto     :       /* NULL */
 subattrlist:   /* NULL */
                        { $$ = (OP*)NULL; }
        |       COLONATTR THING
-                       { $$ = $2;
-                         TOKEN_GETMAD($1,$$,':');
-                       }
+                       { $$ = $2; }
        |       COLONATTR
-                       { $$ = IF_MAD(
-                                   newOP(OP_NULL, 0),
-                                   (OP*)NULL
-                               );
-                         TOKEN_GETMAD($1,$$,':');
-                       }
+                       { $$ = (OP*)NULL; }
        ;
 
 /* List of attributes for a "my" variable declaration */
 myattrlist:    COLONATTR THING
-                       { $$ = $2;
-                         TOKEN_GETMAD($1,$$,':');
-                       }
+                       { $$ = $2; }
        |       COLONATTR
-                       { $$ = IF_MAD(
-                                   newOP(OP_NULL, 0),
-                                   (OP*)NULL
-                               );
-                         TOKEN_GETMAD($1,$$,':');
-                       }
+                       { $$ = (OP*)NULL; }
        ;
 
 /* Optional subroutine signature */
@@ -751,60 +590,36 @@ subsignature:     /* NULL */ { $$ = (OP*)NULL; }
 /* Subroutine body - block with optional signature */
 realsubbody:   remember subsignature '{' stmtseq '}'
                        {
-                         if (PL_parser->copline > (line_t)IVAL($3))
-                             PL_parser->copline = (line_t)IVAL($3);
+                         if (PL_parser->copline > (line_t)$3)
+                             PL_parser->copline = (line_t)$3;
                          $$ = block_end($1,
                                op_append_list(OP_LINESEQ, $2, $4));
-                         TOKEN_GETMAD($3,$$,'{');
-                         TOKEN_GETMAD($5,$$,'}');
                        }
        ;
 
 /* Optional subroutine body, for named subroutine declaration */
 optsubbody:    realsubbody { $$ = $1; }
-       |       ';'     { $$ = IF_MAD(
-                                   newOP(OP_NULL,0),
-                                   (OP*)NULL
-                               );
+       |       ';'     { $$ = (OP*)NULL;
                          PL_parser->expect = XSTATE;
-                         TOKEN_GETMAD($1,$$,';');
                        }
        ;
 
 /* Ordinary expressions; logical combinations */
 expr   :       expr ANDOP expr
-                       { $$ = newLOGOP(OP_AND, 0, $1, $3);
-                         TOKEN_GETMAD($2,$$,'o');
-                       }
+                       { $$ = newLOGOP(OP_AND, 0, $1, $3); }
        |       expr OROP expr
-                       { $$ = newLOGOP(IVAL($2), 0, $1, $3);
-                         TOKEN_GETMAD($2,$$,'o');
-                       }
+                       { $$ = newLOGOP($2, 0, $1, $3); }
        |       expr DOROP expr
-                       { $$ = newLOGOP(OP_DOR, 0, $1, $3);
-                         TOKEN_GETMAD($2,$$,'o');
-                       }
+                       { $$ = newLOGOP(OP_DOR, 0, $1, $3); }
        |       listexpr %prec PREC_LOW
        ;
 
 /* Expressions are a list of terms joined by commas */
 listexpr:      listexpr ','
-                       {
-#ifdef MAD
-                         OP* op = newNULLLIST();
-                         token_getmad($2,op,',');
-                         $$ = op_append_elem(OP_LIST, $1, op);
-#else
-                         $$ = $1;
-#endif
-                       }
+                       { $$ = $1; }
        |       listexpr ',' term
                        { 
                          OP* term = $3;
-                         DO_MAD(
-                             term = newUNOP(OP_NULL, 0, term);
-                             token_getmad($2,term,',');
-                         )
                          $$ = op_append_elem(OP_LIST, $1, term);
                        }
        |       term %prec PREC_LOW
@@ -812,31 +627,23 @@ listexpr: listexpr ','
 
 /* List operators */
 listop :       LSTOP indirob listexpr /* map {...} @args or print $fh @args */
-                       { $$ = convert(IVAL($1), OPf_STACKED,
-                               op_prepend_elem(OP_LIST, newGVREF(IVAL($1),$2), $3) );
-                         TOKEN_GETMAD($1,$$,'o');
+                       { $$ = convert($1, OPf_STACKED,
+                               op_prepend_elem(OP_LIST, newGVREF($1,$2), $3) );
                        }
        |       FUNC '(' indirob expr ')'      /* print ($fh @args */
-                       { $$ = convert(IVAL($1), OPf_STACKED,
-                               op_prepend_elem(OP_LIST, newGVREF(IVAL($1),$3), $4) );
-                         TOKEN_GETMAD($1,$$,'o');
-                         TOKEN_GETMAD($2,$$,'(');
-                         TOKEN_GETMAD($5,$$,')');
+                       { $$ = convert($1, OPf_STACKED,
+                               op_prepend_elem(OP_LIST, newGVREF($1,$3), $4) );
                        }
        |       term ARROW method '(' optexpr ')' /* $foo->bar(list) */
                        { $$ = convert(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST,
                                    op_prepend_elem(OP_LIST, scalar($1), $5),
                                    newUNOP(OP_METHOD, 0, $3)));
-                         TOKEN_GETMAD($2,$$,'A');
-                         TOKEN_GETMAD($4,$$,'(');
-                         TOKEN_GETMAD($6,$$,')');
                        }
        |       term ARROW method                     /* $foo->bar */
                        { $$ = convert(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST, scalar($1),
                                    newUNOP(OP_METHOD, 0, $3)));
-                         TOKEN_GETMAD($2,$$,'A');
                        }
        |       METHOD indirob optlistexpr           /* new Class @args */
                        { $$ = convert(OP_ENTERSUB, OPf_STACKED,
@@ -849,19 +656,11 @@ listop    :       LSTOP indirob listexpr /* map {...} @args or print $fh @args */
                                op_append_elem(OP_LIST,
                                    op_prepend_elem(OP_LIST, $2, $4),
                                    newUNOP(OP_METHOD, 0, $1)));
-                         TOKEN_GETMAD($3,$$,'(');
-                         TOKEN_GETMAD($5,$$,')');
                        }
        |       LSTOP optlistexpr                    /* print @args */
-                       { $$ = convert(IVAL($1), 0, $2);
-                         TOKEN_GETMAD($1,$$,'o');
-                       }
+                       { $$ = convert($1, 0, $2); }
        |       FUNC '(' optexpr ')'                 /* print (@args) */
-                       { $$ = convert(IVAL($1), 0, $3);
-                         TOKEN_GETMAD($1,$$,'o');
-                         TOKEN_GETMAD($2,$$,'(');
-                         TOKEN_GETMAD($4,$$,')');
-                       }
+                       { $$ = convert($1, 0, $3); }
        |       LSTOPSUB startanonsub block /* sub f(&@);   f { foo } ... */
                        { SvREFCNT_inc_simple_void(PL_compcv);
                          $<opval>$ = newANONATTRSUB($2, 0, (OP*)NULL, $3); }
@@ -883,208 +682,109 @@ subscripted:    gelem '{' expr ';' '}'        /* *main::{something} */
                          * provided by the tokeniser */
                        { $$ = newBINOP(OP_GELEM, 0, $1, scalar($3));
                            PL_parser->expect = XOPERATOR;
-                         TOKEN_GETMAD($2,$$,'{');
-                         TOKEN_GETMAD($4,$$,';');
-                         TOKEN_GETMAD($5,$$,'}');
                        }
        |       scalar '[' expr ']'          /* $array[$element] */
                        { $$ = newBINOP(OP_AELEM, 0, oopsAV($1), scalar($3));
-                         TOKEN_GETMAD($2,$$,'[');
-                         TOKEN_GETMAD($4,$$,']');
                        }
        |       term ARROW '[' expr ']'      /* somearef->[$element] */
                        { $$ = newBINOP(OP_AELEM, 0,
                                        ref(newAVREF($1),OP_RV2AV),
                                        scalar($4));
-                         TOKEN_GETMAD($2,$$,'a');
-                         TOKEN_GETMAD($3,$$,'[');
-                         TOKEN_GETMAD($5,$$,']');
                        }
        |       subscripted '[' expr ']'    /* $foo->[$bar]->[$baz] */
                        { $$ = newBINOP(OP_AELEM, 0,
                                        ref(newAVREF($1),OP_RV2AV),
                                        scalar($3));
-                         TOKEN_GETMAD($2,$$,'[');
-                         TOKEN_GETMAD($4,$$,']');
                        }
        |       scalar '{' expr ';' '}'    /* $foo{bar();} */
                        { $$ = newBINOP(OP_HELEM, 0, oopsHV($1), jmaybe($3));
                            PL_parser->expect = XOPERATOR;
-                         TOKEN_GETMAD($2,$$,'{');
-                         TOKEN_GETMAD($4,$$,';');
-                         TOKEN_GETMAD($5,$$,'}');
                        }
        |       term ARROW '{' expr ';' '}' /* somehref->{bar();} */
                        { $$ = newBINOP(OP_HELEM, 0,
                                        ref(newHVREF($1),OP_RV2HV),
                                        jmaybe($4));
                            PL_parser->expect = XOPERATOR;
-                         TOKEN_GETMAD($2,$$,'a');
-                         TOKEN_GETMAD($3,$$,'{');
-                         TOKEN_GETMAD($5,$$,';');
-                         TOKEN_GETMAD($6,$$,'}');
                        }
        |       subscripted '{' expr ';' '}' /* $foo->[bar]->{baz;} */
                        { $$ = newBINOP(OP_HELEM, 0,
                                        ref(newHVREF($1),OP_RV2HV),
                                        jmaybe($3));
                            PL_parser->expect = XOPERATOR;
-                         TOKEN_GETMAD($2,$$,'{');
-                         TOKEN_GETMAD($4,$$,';');
-                         TOKEN_GETMAD($5,$$,'}');
                        }
        |       term ARROW '(' ')'          /* $subref->() */
                        { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
-                                  newCVREF(0, scalar($1)));
-                         TOKEN_GETMAD($2,$$,'a');
-                         TOKEN_GETMAD($3,$$,'(');
-                         TOKEN_GETMAD($4,$$,')');
-                       }
+                                  newCVREF(0, scalar($1))); }
        |       term ARROW '(' expr ')'     /* $subref->(@args) */
                        { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   op_append_elem(OP_LIST, $4,
-                                      newCVREF(0, scalar($1))));
-                         TOKEN_GETMAD($2,$$,'a');
-                         TOKEN_GETMAD($3,$$,'(');
-                         TOKEN_GETMAD($5,$$,')');
-                       }
+                                      newCVREF(0, scalar($1)))); }
 
        |       subscripted '(' expr ')'   /* $foo->{bar}->(@args) */
                        { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   op_append_elem(OP_LIST, $3,
-                                              newCVREF(0, scalar($1))));
-                         TOKEN_GETMAD($2,$$,'(');
-                         TOKEN_GETMAD($4,$$,')');
-                       }
+                                              newCVREF(0, scalar($1)))); }
        |       subscripted '(' ')'        /* $foo->{bar}->() */
                        { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
-                                  newCVREF(0, scalar($1)));
-                         TOKEN_GETMAD($2,$$,'(');
-                         TOKEN_GETMAD($3,$$,')');
-                       }
+                                  newCVREF(0, scalar($1))); }
        |       '(' expr ')' '[' expr ']'            /* list slice */
-                       { $$ = newSLICEOP(0, $5, $2);
-                         TOKEN_GETMAD($1,$$,'(');
-                         TOKEN_GETMAD($3,$$,')');
-                         TOKEN_GETMAD($4,$$,'[');
-                         TOKEN_GETMAD($6,$$,']');
-                       }
+                       { $$ = newSLICEOP(0, $5, $2); }
        |       QWLIST '[' expr ']'            /* list literal slice */
-                       { $$ = newSLICEOP(0, $3, $1);
-                         TOKEN_GETMAD($2,$$,'[');
-                         TOKEN_GETMAD($4,$$,']');
-                       }
+                       { $$ = newSLICEOP(0, $3, $1); }
        |       '(' ')' '[' expr ']'                 /* empty list slice! */
-                       { $$ = newSLICEOP(0, $4, (OP*)NULL);
-                         TOKEN_GETMAD($1,$$,'(');
-                         TOKEN_GETMAD($2,$$,')');
-                         TOKEN_GETMAD($3,$$,'[');
-                         TOKEN_GETMAD($5,$$,']');
-                       }
+                       { $$ = newSLICEOP(0, $4, (OP*)NULL); }
     ;
 
 /* Binary operators between terms */
 termbinop:     term ASSIGNOP term                     /* $x = $y */
-                       { $$ = newASSIGNOP(OPf_STACKED, $1, IVAL($2), $3);
-                         TOKEN_GETMAD($2,$$,'o');
-                       }
+                       { $$ = newASSIGNOP(OPf_STACKED, $1, $2, $3); }
        |       term POWOP term                        /* $x ** $y */
-                       { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3));
-                         TOKEN_GETMAD($2,$$,'o');
-                       }
+                       { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
        |       term MULOP term                        /* $x * $y, $x x $y */
-                       {   if (IVAL($2) != OP_REPEAT)
+                       {   if ($2 != OP_REPEAT)
                                scalar($1);
-                           $$ = newBINOP(IVAL($2), 0, $1, scalar($3));
-                         TOKEN_GETMAD($2,$$,'o');
+                           $$ = newBINOP($2, 0, $1, scalar($3));
                        }
        |       term ADDOP term                        /* $x + $y */
-                       { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3));
-                         TOKEN_GETMAD($2,$$,'o');
-                       }
+                       { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
        |       term SHIFTOP term                      /* $x >> $y, $x << $y */
-                       { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3));
-                         TOKEN_GETMAD($2,$$,'o');
-                       }
+                       { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
        |       term RELOP term                        /* $x > $y, etc. */
-                       { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3));
-                         TOKEN_GETMAD($2,$$,'o');
-                       }
+                       { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
        |       term EQOP term                         /* $x == $y, $x eq $y */
-                       { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3));
-                         TOKEN_GETMAD($2,$$,'o');
-                       }
+                       { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
        |       term BITANDOP term                     /* $x & $y */
-                       { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3));
-                         TOKEN_GETMAD($2,$$,'o');
-                       }
+                       { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
        |       term BITOROP term                      /* $x | $y */
-                       { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3));
-                         TOKEN_GETMAD($2,$$,'o');
-                       }
+                       { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
        |       term DOTDOT term                       /* $x..$y, $x...$y */
-                       {
-                         $$ = newRANGE(IVAL($2), scalar($1), scalar($3));
-                         DO_MAD({
-                             UNOP *op;
-                             op = (UNOP*)$$;
-                             op = (UNOP*)op->op_first; /* get to flop */
-                             op = (UNOP*)op->op_first; /* get to flip */
-                             op = (UNOP*)op->op_first; /* get to range */
-                             token_getmad($2,(OP*)op,'o');
-                           });
-                       }
+                       { $$ = newRANGE($2, scalar($1), scalar($3)); }
        |       term ANDAND term                       /* $x && $y */
-                       { $$ = newLOGOP(OP_AND, 0, $1, $3);
-                         TOKEN_GETMAD($2,$$,'o');
-                       }
+                       { $$ = newLOGOP(OP_AND, 0, $1, $3); }
        |       term OROR term                         /* $x || $y */
-                       { $$ = newLOGOP(OP_OR, 0, $1, $3);
-                         TOKEN_GETMAD($2,$$,'o');
-                       }
+                       { $$ = newLOGOP(OP_OR, 0, $1, $3); }
        |       term DORDOR term                       /* $x // $y */
-                       { $$ = newLOGOP(OP_DOR, 0, $1, $3);
-                         TOKEN_GETMAD($2,$$,'o');
-                       }
+                       { $$ = newLOGOP(OP_DOR, 0, $1, $3); }
        |       term MATCHOP term                      /* $x =~ /$y/ */
-                       { $$ = bind_match(IVAL($2), $1, $3);
-                         TOKEN_GETMAD($2,
-                               ($$->op_type == OP_NOT
-                                   ? ((UNOP*)$$)->op_first : $$),
-                               '~');
-                       }
+                       { $$ = bind_match($2, $1, $3); }
     ;
 
 /* Unary operators and terms */
 termunop : '-' term %prec UMINUS                       /* -$x */
-                       { $$ = newUNOP(OP_NEGATE, 0, scalar($2));
-                         TOKEN_GETMAD($1,$$,'o');
-                       }
+                       { $$ = newUNOP(OP_NEGATE, 0, scalar($2)); }
        |       '+' term %prec UMINUS                  /* +$x */
-                       { $$ = IF_MAD(
-                                   newUNOP(OP_NULL, 0, $2),
-                                   $2
-                               );
-                         TOKEN_GETMAD($1,$$,'+');
-                       }
+                       { $$ = $2; }
+
        |       '!' term                               /* !$x */
-                       { $$ = newUNOP(OP_NOT, 0, scalar($2));
-                         TOKEN_GETMAD($1,$$,'o');
-                       }
+                       { $$ = newUNOP(OP_NOT, 0, scalar($2)); }
        |       '~' term                               /* ~$x */
-                       { $$ = newUNOP(OP_COMPLEMENT, 0, scalar($2));
-                         TOKEN_GETMAD($1,$$,'o');
-                       }
+                       { $$ = newUNOP(OP_COMPLEMENT, 0, scalar($2)); }
        |       term POSTINC                           /* $x++ */
                        { $$ = newUNOP(OP_POSTINC, 0,
-                                       op_lvalue(scalar($1), OP_POSTINC));
-                         TOKEN_GETMAD($2,$$,'o');
-                       }
+                                       op_lvalue(scalar($1), OP_POSTINC)); }
        |       term POSTDEC                           /* $x-- */
                        { $$ = newUNOP(OP_POSTDEC, 0,
-                                       op_lvalue(scalar($1), OP_POSTDEC));
-                         TOKEN_GETMAD($2,$$,'o');
-                       }
+                                       op_lvalue(scalar($1), OP_POSTDEC));}
        |       term POSTJOIN    /* implicit join after interpolated ->@ */
                        { $$ = convert(OP_JOIN, 0,
                                       op_append_elem(
@@ -1095,63 +795,36 @@ termunop : '-' term %prec UMINUS                       /* -$x */
                                        )),
                                        $1
                                       ));
-                         TOKEN_GETMAD($2,$$,'o');
                        }
        |       PREINC term                            /* ++$x */
                        { $$ = newUNOP(OP_PREINC, 0,
-                                       op_lvalue(scalar($2), OP_PREINC));
-                         TOKEN_GETMAD($1,$$,'o');
-                       }
+                                       op_lvalue(scalar($2), OP_PREINC)); }
        |       PREDEC term                            /* --$x */
                        { $$ = newUNOP(OP_PREDEC, 0,
-                                       op_lvalue(scalar($2), OP_PREDEC));
-                         TOKEN_GETMAD($1,$$,'o');
-                       }
+                                       op_lvalue(scalar($2), OP_PREDEC)); }
 
     ;
 
 /* Constructors for anonymous data */
 anonymous:     '[' expr ']'
-                       { $$ = newANONLIST($2);
-                         TOKEN_GETMAD($1,$$,'[');
-                         TOKEN_GETMAD($3,$$,']');
-                       }
+                       { $$ = newANONLIST($2); }
        |       '[' ']'
-                       { $$ = newANONLIST((OP*)NULL);
-                         TOKEN_GETMAD($1,$$,'[');
-                         TOKEN_GETMAD($2,$$,']');
-                       }
+                       { $$ = newANONLIST((OP*)NULL);}
        |       HASHBRACK expr ';' '}'  %prec '(' /* { foo => "Bar" } */
-                       { $$ = newANONHASH($2);
-                         TOKEN_GETMAD($1,$$,'{');
-                         TOKEN_GETMAD($3,$$,';');
-                         TOKEN_GETMAD($4,$$,'}');
-                       }
+                       { $$ = newANONHASH($2); }
        |       HASHBRACK ';' '}'       %prec '(' /* { } (';' by tokener) */
-                       { $$ = newANONHASH((OP*)NULL);
-                         TOKEN_GETMAD($1,$$,'{');
-                         TOKEN_GETMAD($2,$$,';');
-                         TOKEN_GETMAD($3,$$,'}');
-                       }
+                       { $$ = newANONHASH((OP*)NULL); }
        |       ANONSUB startanonsub proto subattrlist realsubbody      %prec '('
                        { SvREFCNT_inc_simple_void(PL_compcv);
-                         $$ = newANONATTRSUB($2, $3, $4, $5);
-                         TOKEN_GETMAD($1,$$,'o');
-                         OP_GETMAD($3,$$,'s');
-                         OP_GETMAD($4,$$,'a');
-                       }
+                         $$ = newANONATTRSUB($2, $3, $4, $5); }
 
     ;
 
 /* Things called with "do" */
 termdo :       DO term %prec UNIOP                     /* do $filename */
-                       { $$ = dofile($2, IVAL($1));
-                         TOKEN_GETMAD($1,$$,'o');
-                       }
+                       { $$ = dofile($2, $1);}
        |       DO block        %prec '('               /* do { code */
-                       { $$ = newUNOP(OP_NULL, OPf_SPECIAL, op_scope($2));
-                         TOKEN_GETMAD($1,$$,'D');
-                       }
+                       { $$ = newUNOP(OP_NULL, OPf_SPECIAL, op_scope($2));}
         ;
 
 term   :       termbinop
@@ -1159,32 +832,19 @@ term     :       termbinop
        |       anonymous
        |       termdo
        |       term '?' term ':' term
-                       { $$ = newCONDOP(0, $1, $3, $5);
-                         TOKEN_GETMAD($2,$$,'?');
-                         TOKEN_GETMAD($4,$$,':');
-                       }
+                       { $$ = newCONDOP(0, $1, $3, $5); }
        |       REFGEN term                          /* \$x, \@y, \%z */
-                       { $$ = newUNOP(OP_REFGEN, 0, op_lvalue($2,OP_REFGEN));
-                         TOKEN_GETMAD($1,$$,'o');
-                       }
+                       { $$ = newUNOP(OP_REFGEN, 0, op_lvalue($2,OP_REFGEN)); }
        |       myattrterm      %prec UNIOP
                        { $$ = $1; }
        |       LOCAL term      %prec UNIOP
-                       { $$ = localize($2,IVAL($1));
-                         TOKEN_GETMAD($1,$$,'k');
-                       }
+                       { $$ = localize($2,$1); }
        |       '(' expr ')'
-                       { $$ = sawparens(IF_MAD(newUNOP(OP_NULL,0,$2), $2));
-                         TOKEN_GETMAD($1,$$,'(');
-                         TOKEN_GETMAD($3,$$,')');
-                       }
+                       { $$ = sawparens($2); }
        |       QWLIST
-                       { $$ = IF_MAD(newUNOP(OP_NULL,0,$1), $1); }
+                       { $$ = $1; }
        |       '(' ')'
-                       { $$ = sawparens(newNULLLIST());
-                         TOKEN_GETMAD($1,$$,'(');
-                         TOKEN_GETMAD($2,$$,')');
-                       }
+                       { $$ = sawparens(newNULLLIST()); }
        |       scalar  %prec '('
                        { $$ = $1; }
        |       star    %prec '('
@@ -1206,8 +866,6 @@ term       :       termbinop
                          if ($$ && $1)
                              $$->op_private |=
                                  $1->op_private & OPpSLICEWARNING;
-                         TOKEN_GETMAD($2,$$,'[');
-                         TOKEN_GETMAD($4,$$,']');
                        }
        |       kvslice '[' expr ']'                 /* array key/value slice */
                        { $$ = op_prepend_elem(OP_KVASLICE,
@@ -1218,8 +876,6 @@ term       :       termbinop
                          if ($$ && $1)
                              $$->op_private |=
                                  $1->op_private & OPpSLICEWARNING;
-                         TOKEN_GETMAD($2,$$,'[');
-                         TOKEN_GETMAD($4,$$,']');
                        }
        |       sliceme '{' expr ';' '}'                 /* @hash{@keys} */
                        { $$ = op_prepend_elem(OP_HSLICE,
@@ -1231,9 +887,6 @@ term       :       termbinop
                              $$->op_private |=
                                  $1->op_private & OPpSLICEWARNING;
                            PL_parser->expect = XOPERATOR;
-                         TOKEN_GETMAD($2,$$,'{');
-                         TOKEN_GETMAD($4,$$,';');
-                         TOKEN_GETMAD($5,$$,'}');
                        }
        |       kvslice '{' expr ';' '}'                 /* %hash{@keys} */
                        { $$ = op_prepend_elem(OP_KVHSLICE,
@@ -1245,9 +898,6 @@ term       :       termbinop
                              $$->op_private |=
                                  $1->op_private & OPpSLICEWARNING;
                            PL_parser->expect = XOPERATOR;
-                         TOKEN_GETMAD($2,$$,'{');
-                         TOKEN_GETMAD($4,$$,';');
-                         TOKEN_GETMAD($5,$$,'}');
                        }
        |       THING   %prec '('
                        { $$ = $1; }
@@ -1255,121 +905,65 @@ term    :       termbinop
                        { $$ = newUNOP(OP_ENTERSUB, 0, scalar($1)); }
        |       amper '(' ')'                 /* &foo() or foo() */
                        { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar($1));
-                         TOKEN_GETMAD($2,$$,'(');
-                         TOKEN_GETMAD($3,$$,')');
                        }
        |       amper '(' expr ')'          /* &foo(@args) or foo(@args) */
                        {
                          $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST, $3, scalar($1)));
-                         DO_MAD({
-                             OP* op = $$;
-                             if (op->op_type == OP_CONST) { /* defeat const fold */
-                               op = (OP*)op->op_madprop->mad_val;
-                             }
-                             token_getmad($2,op,'(');
-                             token_getmad($4,op,')');
-                         });
                        }
        |       NOAMP subname optlistexpr       /* foo @args (no parens) */
                        { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
                            op_append_elem(OP_LIST, $3, scalar($2)));
-                         TOKEN_GETMAD($1,$$,'o');
                        }
        |       term ARROW '$' '*'
-                       { $$ = newSVREF($1);
-                         TOKEN_GETMAD($3,$$,'$');
-                       }
+                       { $$ = newSVREF($1); }
        |       term ARROW '@' '*'
-                       { $$ = newAVREF($1);
-                         TOKEN_GETMAD($3,$$,'@');
-                       }
+                       { $$ = newAVREF($1); }
        |       term ARROW '%' '*'
-                       { $$ = newHVREF($1);
-                         TOKEN_GETMAD($3,$$,'%');
-                       }
+                       { $$ = newHVREF($1); }
        |       term ARROW '&' '*'
                        { $$ = newUNOP(OP_ENTERSUB, 0,
-                                      scalar(newCVREF(IVAL($3),$1)));
-                         TOKEN_GETMAD($3,$$,'&');
-                       }
+                                      scalar(newCVREF($3,$1))); }
        |       term ARROW '*' '*'      %prec '('
-                       { $$ = newGVREF(0,$1);
-                         TOKEN_GETMAD($3,$$,'*');
-                       }
+                       { $$ = newGVREF(0,$1); }
        |       LOOPEX  /* loop exiting command (goto, last, dump, etc) */
-                       { $$ = newOP(IVAL($1), OPf_SPECIAL);
-                           PL_hints |= HINT_BLOCK_SCOPE;
-                         TOKEN_GETMAD($1,$$,'o');
-                       }
+                       { $$ = newOP($1, OPf_SPECIAL);
+                           PL_hints |= HINT_BLOCK_SCOPE; }
        |       LOOPEX term
-                       { $$ = newLOOPEX(IVAL($1),$2);
-                         TOKEN_GETMAD($1,$$,'o');
-                       }
+                       { $$ = newLOOPEX($1,$2); }
        |       NOTOP listexpr                       /* not $foo */
-                       { $$ = newUNOP(OP_NOT, 0, scalar($2));
-                         TOKEN_GETMAD($1,$$,'o');
-                       }
+                       { $$ = newUNOP(OP_NOT, 0, scalar($2)); }
        |       UNIOP                                /* Unary op, $_ implied */
-                       { $$ = newOP(IVAL($1), 0);
-                         TOKEN_GETMAD($1,$$,'o');
-                       }
+                       { $$ = newOP($1, 0); }
        |       UNIOP block                          /* eval { foo }* */
-                       { $$ = newUNOP(IVAL($1), 0, $2);
-                         TOKEN_GETMAD($1,$$,'o');
-                       }
+                       { $$ = newUNOP($1, 0, $2); }
        |       UNIOP term                           /* Unary op */
-                       { $$ = newUNOP(IVAL($1), 0, $2);
-                         TOKEN_GETMAD($1,$$,'o');
-                       }
+                       { $$ = newUNOP($1, 0, $2); }
        |       REQUIRE                              /* require, $_ implied */
-                       { $$ = newOP(OP_REQUIRE, $1 ? OPf_SPECIAL : 0);
-                         TOKEN_GETMAD($1,$$,'o');
-                       }
+                       { $$ = newOP(OP_REQUIRE, $1 ? OPf_SPECIAL : 0); }
        |       REQUIRE term                         /* require Foo */
-                       { $$ = newUNOP(OP_REQUIRE, $1 ? OPf_SPECIAL : 0, $2);
-                         TOKEN_GETMAD($1,$$,'o');
-                       }
+                       { $$ = newUNOP(OP_REQUIRE, $1 ? OPf_SPECIAL : 0, $2); }
        |       UNIOPSUB
                        { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar($1)); }
        |       UNIOPSUB term                        /* Sub treated as unop */
                        { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
                            op_append_elem(OP_LIST, $2, scalar($1))); }
        |       FUNC0                                /* Nullary operator */
-                       { $$ = newOP(IVAL($1), 0);
-                         TOKEN_GETMAD($1,$$,'o');
-                       }
+                       { $$ = newOP($1, 0); }
        |       FUNC0 '(' ')'
-                       { $$ = newOP(IVAL($1), 0);
-                         TOKEN_GETMAD($1,$$,'o');
-                         TOKEN_GETMAD($2,$$,'(');
-                         TOKEN_GETMAD($3,$$,')');
-                       }
+                       { $$ = newOP($1, 0);}
        |       FUNC0OP       /* Same as above, but op created in toke.c */
                        { $$ = $1; }
        |       FUNC0OP '(' ')'
-                       { $$ = $1;
-                         TOKEN_GETMAD($2,$$,'(');
-                         TOKEN_GETMAD($3,$$,')');
-                       }
+                       { $$ = $1; }
        |       FUNC0SUB                             /* Sub treated as nullop */
-                       { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
-                               scalar($1)); }
+                       { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar($1)); }
        |       FUNC1 '(' ')'                        /* not () */
-                       { $$ = (IVAL($1) == OP_NOT)
-                           ? newUNOP(IVAL($1), 0, newSVOP(OP_CONST, 0, newSViv(0)))
-                           : newOP(IVAL($1), OPf_SPECIAL);
-
-                         TOKEN_GETMAD($1,$$,'o');
-                         TOKEN_GETMAD($2,$$,'(');
-                         TOKEN_GETMAD($3,$$,')');
-                       }
+                       { $$ = ($1 == OP_NOT)
+                          ? newUNOP($1, 0, newSVOP(OP_CONST, 0, newSViv(0)))
+                          : newOP($1, OPf_SPECIAL); }
        |       FUNC1 '(' expr ')'                   /* not($foo) */
-                       { $$ = newUNOP(IVAL($1), 0, $3);
-                         TOKEN_GETMAD($1,$$,'o');
-                         TOKEN_GETMAD($2,$$,'(');
-                         TOKEN_GETMAD($4,$$,')');
-                       }
+                       { $$ = newUNOP($1, 0, $3); }
        |       PMFUNC /* m//, s///, qr//, tr/// */
                        {
                            if (   $1->op_type != OP_TRANS
@@ -1382,47 +976,30 @@ term     :       termbinop
                                $<ival>$ = 0;
                        }
                    '(' listexpr ')'
-                       { $$ = pmruntime($1, $4, 1, $<ival>2);
-                         TOKEN_GETMAD($3,$$,'(');
-                         TOKEN_GETMAD($5,$$,')');
-                       }
+                       { $$ = pmruntime($1, $4, 1, $<ival>2); }
        |       WORD
        |       listop
        |       YADAYADA
                        {
                          $$ = newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0),
                                newSVOP(OP_CONST, 0, newSVpvs("Unimplemented")));
-                         TOKEN_GETMAD($1,$$,'X');
                        }
        |       PLUGEXPR
        ;
 
 /* "my" declarations, with optional attributes */
 myattrterm:    MY myterm myattrlist
-                       { $$ = my_attrs($2,$3);
-                         DO_MAD(
-                             token_getmad($1,$$,'d');
-                             append_madprops($3->op_madprop, $$, 'a');
-                             $3->op_madprop = 0;
-                         );
-                       }
+                       { $$ = my_attrs($2,$3); }
        |       MY myterm
-                       { $$ = localize($2,IVAL($1));
-                         TOKEN_GETMAD($1,$$,'d');
-                       }
+                       { $$ = localize($2,$1); }
        ;
 
 /* Things that can be "my"'d */
 myterm :       '(' expr ')'
-                       { $$ = sawparens($2);
-                         TOKEN_GETMAD($1,$$,'(');
-                         TOKEN_GETMAD($3,$$,')');
-                       }
+                       { $$ = sawparens($2); }
        |       '(' ')'
-                       { $$ = sawparens(newNULLLIST());
-                         TOKEN_GETMAD($1,$$,'(');
-                         TOKEN_GETMAD($2,$$,')');
-                       }
+                       { $$ = sawparens(newNULLLIST()); }
+
        |       scalar  %prec '('
                        { $$ = $1; }
        |       hsh     %prec '('
@@ -1451,66 +1028,48 @@ my_scalar:      scalar
        ;
 
 amper  :       '&' indirob
-                       { $$ = newCVREF(IVAL($1),$2);
-                         TOKEN_GETMAD($1,$$,'&');
-                       }
+                       { $$ = newCVREF($1,$2); }
        ;
 
 scalar :       '$' indirob
-                       { $$ = newSVREF($2);
-                         TOKEN_GETMAD($1,$$,'$');
-                       }
+                       { $$ = newSVREF($2); }
        ;
 
 ary    :       '@' indirob
                        { $$ = newAVREF($2);
-                         if ($$) $$->op_private |= IVAL($1);
-                         TOKEN_GETMAD($1,$$,'@');
+                         if ($$) $$->op_private |= $1;
                        }
        ;
 
 hsh    :       '%' indirob
                        { $$ = newHVREF($2);
-                         if ($$) $$->op_private |= IVAL($1);
-                         TOKEN_GETMAD($1,$$,'%');
+                         if ($$) $$->op_private |= $1;
                        }
        ;
 
 arylen :       DOLSHARP indirob
-                       { $$ = newAVREF($2);
-                         TOKEN_GETMAD($1,$$,'l');
-                       }
+                       { $$ = newAVREF($2); }
        |       term ARROW DOLSHARP '*'
-                       { $$ = newAVREF($1);
-                         TOKEN_GETMAD($3,$$,'l');
-                       }
+                       { $$ = newAVREF($1); }
        ;
 
 star   :       '*' indirob
-                       { $$ = newGVREF(0,$2);
-                         TOKEN_GETMAD($1,$$,'*');
-                       }
+                       { $$ = newGVREF(0,$2); }
        ;
 
 sliceme        :       ary
        |       term ARROW '@'
-                       { $$ = newAVREF($1);
-                         TOKEN_GETMAD($3,$$,'@');
-                       }
+                       { $$ = newAVREF($1); }
        ;
 
 kvslice        :       hsh
        |       term ARROW '%'
-                       { $$ = newHVREF($1);
-                         TOKEN_GETMAD($3,$$,'@');
-                       }
+                       { $$ = newHVREF($1); }
        ;
 
 gelem  :       star
        |       term ARROW '*'
-                       { $$ = newGVREF(0,$1);
-                         TOKEN_GETMAD($3,$$,'*');
-                       }
+                       { $$ = newGVREF(0,$1); }
        ;
 
 /* Indirect objects */
index 96a7d2a..ab729b0 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -3164,13 +3164,7 @@ PP(pp_exit)
 #endif
     }
     PL_exit_flags |= PERL_EXIT_EXPECTED;
-#ifdef PERL_MAD
-    /* KLUDGE: disable exit 0 in BEGIN blocks when we're just compiling */
-    if (anum || !(PL_minus_c && PL_madskills))
-       my_exit(anum);
-#else
     my_exit(anum);
-#endif
     PUSHs(&PL_sv_undef);
     RETURN;
 }
@@ -3405,8 +3399,7 @@ S_doeval(pTHX_ int gimme, CV* outside, U32 seq, HV *hh)
     PL_op = NULL; /* avoid PL_op and PL_curpad referring to different CVs */
 
 
-    if (!PL_madskills)
-       SAVEMORTALIZESV(evalcv);        /* must remain until end of current statement */
+    SAVEMORTALIZESV(evalcv);   /* must remain until end of current statement */
 
     /* make sure we compile in the right package */
 
@@ -3424,10 +3417,6 @@ S_doeval(pTHX_ int gimme, CV* outside, U32 seq, HV *hh)
     PL_unitcheckav = newAV();
     SAVEFREESV(PL_unitcheckav);
 
-#ifdef PERL_MAD
-    SAVEBOOL(PL_madskills);
-    PL_madskills = 0;
-#endif
 
     ENTER_with_name("evalcomp");
     SAVESPTR(PL_compcv);
diff --git a/proto.h b/proto.h
index 8dde508..3532594 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -2773,6 +2773,7 @@ PERL_CALLCONV OP* Perl_newCVREF(pTHX_ I32 flags, OP* o)
                        __attribute__malloc__
                        __attribute__warn_unused_result__;
 
+PERL_CALLCONV void     Perl_newFORM(pTHX_ I32 floor, OP* o, OP* block);
 PERL_CALLCONV OP*      Perl_newFOROP(pTHX_ I32 flags, OP* sv, OP* expr, OP* block, OP* cont)
                        __attribute__malloc__
                        __attribute__warn_unused_result__
@@ -3130,6 +3131,11 @@ PERL_CALLCONV void       Perl_pack_cat(pTHX_ SV *cat, const char *pat, const char *pat
 #define PERL_ARGS_ASSERT_PACK_CAT      \
        assert(cat); assert(pat); assert(patend); assert(beglist); assert(endlist); assert(next_in_list)
 
+PERL_CALLCONV void     Perl_package(pTHX_ OP* o)
+                       __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_PACKAGE       \
+       assert(o)
+
 PERL_CALLCONV void     Perl_package_version(pTHX_ OP* v)
                        __attribute__nonnull__(pTHX_1);
 #define PERL_ARGS_ASSERT_PACKAGE_VERSION       \
@@ -4863,6 +4869,11 @@ PERL_CALLCONV UV Perl_utf8n_to_uvuni(pTHX_ const U8 *s, STRLEN curlen, STRLEN *r
 #define PERL_ARGS_ASSERT_UTF8N_TO_UVUNI        \
        assert(s)
 
+PERL_CALLCONV void     Perl_utilize(pTHX_ int aver, I32 floor, OP* version, OP* idop, OP* arg)
+                       __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_UTILIZE       \
+       assert(idop)
+
 /* PERL_CALLCONV U8*   uvchr_to_utf8(pTHX_ U8 *d, UV uv)
                        __attribute__nonnull__(pTHX_1); */
 
@@ -5099,19 +5110,6 @@ PERL_CALLCONV void*      Perl_my_cxt_init(pTHX_ int *index, size_t size)
 
 #  endif
 #endif
-#if !(defined(PERL_MAD))
-PERL_CALLCONV void     Perl_newFORM(pTHX_ I32 floor, OP* o, OP* block);
-PERL_CALLCONV void     Perl_package(pTHX_ OP* o)
-                       __attribute__nonnull__(pTHX_1);
-#define PERL_ARGS_ASSERT_PACKAGE       \
-       assert(o)
-
-PERL_CALLCONV void     Perl_utilize(pTHX_ int aver, I32 floor, OP* version, OP* idop, OP* arg)
-                       __attribute__nonnull__(pTHX_4);
-#define PERL_ARGS_ASSERT_UTILIZE       \
-       assert(idop)
-
-#endif
 #if !(defined(WIN32))
 /* PERL_CALLCONV char* my_setlocale(pTHX_ int category, const char* locale)
                        __attribute__pure__; */
@@ -5844,15 +5842,6 @@ STATIC SV*       S_pm_description(pTHX_ const PMOP *pm)
        assert(pm)
 
 STATIC UV      S_sequence_num(pTHX_ const OP *o);
-#  if defined(PERL_MAD)
-STATIC void    S_xmldump_attr(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
-                       __attribute__format__(__printf__,pTHX_3,pTHX_4)
-                       __attribute__nonnull__(pTHX_2)
-                       __attribute__nonnull__(pTHX_3);
-#define PERL_ARGS_ASSERT_XMLDUMP_ATTR  \
-       assert(file); assert(pat)
-
-#  endif
 #endif
 #if defined(PERL_IN_DUMP_C) || defined(PERL_IN_HV_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_SCOPE_C)
 PERL_CALLCONV void     Perl_hv_kill_backrefs(pTHX_ HV *hv)
@@ -7692,25 +7681,6 @@ STATIC int       S_yywarn(pTHX_ const char *const s, U32 flags)
 #define PERL_ARGS_ASSERT_YYWARN        \
        assert(s)
 
-#  if defined(PERL_MAD)
-STATIC void    S_curmad(pTHX_ char slot, SV *sv);
-STATIC char*   S_skipspace0(pTHX_ char *s)
-                       __attribute__nonnull__(pTHX_1);
-#define PERL_ARGS_ASSERT_SKIPSPACE0    \
-       assert(s)
-
-STATIC char*   S_skipspace1(pTHX_ char *s)
-                       __attribute__nonnull__(pTHX_1);
-#define PERL_ARGS_ASSERT_SKIPSPACE1    \
-       assert(s)
-
-STATIC char*   S_skipspace2(pTHX_ char *s, SV **sv)
-                       __attribute__nonnull__(pTHX_1);
-#define PERL_ARGS_ASSERT_SKIPSPACE2    \
-       assert(s)
-
-STATIC void    S_start_force(pTHX_ int where);
-#  endif
 #endif
 #if defined(PERL_IN_UNIVERSAL_C)
 STATIC bool    S_isa_lookup(pTHX_ HV *stash, const char * const name, STRLEN len, U32 flags)
@@ -7793,129 +7763,6 @@ STATIC void     S_mem_log_common(enum mem_log_type mlt, const UV n, const UV typesiz
 
 #  endif
 #endif
-#if defined(PERL_MAD)
-PERL_CALLCONV void     Perl_addmad(pTHX_ MADPROP* tm, MADPROP** root, char slot);
-PERL_CALLCONV void     Perl_append_madprops(pTHX_ MADPROP* tm, OP* o, char slot);
-PERL_CALLCONV void     Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o)
-                       __attribute__nonnull__(pTHX_2);
-#define PERL_ARGS_ASSERT_DO_OP_XMLDUMP \
-       assert(file)
-
-PERL_CALLCONV void     Perl_do_pmop_xmldump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
-                       __attribute__nonnull__(pTHX_2);
-#define PERL_ARGS_ASSERT_DO_PMOP_XMLDUMP       \
-       assert(file)
-
-PERL_CALLCONV void     Perl_mad_free(pTHX_ MADPROP* mp);
-PERL_CALLCONV int      Perl_madlex(pTHX);
-PERL_CALLCONV int      Perl_madparse(pTHX_ int gramtype);
-PERL_CALLCONV OP*      Perl_newFORM(pTHX_ I32 floor, OP* o, OP* block);
-PERL_CALLCONV MADPROP* Perl_newMADPROP(pTHX_ char key, char type, void* val, I32 vlen);
-PERL_CALLCONV MADPROP* Perl_newMADsv(pTHX_ char key, SV* sv)
-                       __attribute__nonnull__(pTHX_2);
-#define PERL_ARGS_ASSERT_NEWMADSV      \
-       assert(sv)
-
-PERL_CALLCONV TOKEN*   Perl_newTOKEN(pTHX_ I32 optype, YYSTYPE lval, MADPROP* madprop);
-PERL_CALLCONV void     Perl_op_getmad(pTHX_ OP* from, OP* o, char slot);
-PERL_CALLCONV void     Perl_op_getmad_weak(pTHX_ OP* from, OP* o, char slot);
-PERL_CALLCONV void     Perl_op_xmldump(pTHX_ const OP *o)
-                       __attribute__nonnull__(pTHX_1);
-#define PERL_ARGS_ASSERT_OP_XMLDUMP    \
-       assert(o)
-
-PERL_CALLCONV OP*      Perl_package(pTHX_ OP* o)
-                       __attribute__nonnull__(pTHX_1);
-#define PERL_ARGS_ASSERT_PACKAGE       \
-       assert(o)
-
-PERL_CALLCONV void     Perl_pad_peg(const char* s)
-                       __attribute__nonnull__(1);
-#define PERL_ARGS_ASSERT_PAD_PEG       \
-       assert(s)
-
-PERL_CALLCONV void     Perl_pmop_xmldump(pTHX_ const PMOP* pm);
-PERL_CALLCONV void     Perl_prepend_madprops(pTHX_ MADPROP* mp, OP* o, char slot);
-PERL_CALLCONV char*    Perl_sv_catxmlpv(pTHX_ SV *dsv, const char *pv, int utf8)
-                       __attribute__nonnull__(pTHX_1)
-                       __attribute__nonnull__(pTHX_2);
-#define PERL_ARGS_ASSERT_SV_CATXMLPV   \
-       assert(dsv); assert(pv)
-
-PERL_CALLCONV char*    Perl_sv_catxmlpvn(pTHX_ SV *dsv, const char *pv, STRLEN len, int utf8)
-                       __attribute__nonnull__(pTHX_1)
-                       __attribute__nonnull__(pTHX_2);
-#define PERL_ARGS_ASSERT_SV_CATXMLPVN  \
-       assert(dsv); assert(pv)
-
-PERL_CALLCONV char*    Perl_sv_catxmlsv(pTHX_ SV *dsv, SV *ssv)
-                       __attribute__nonnull__(pTHX_1)
-                       __attribute__nonnull__(pTHX_2);
-#define PERL_ARGS_ASSERT_SV_CATXMLSV   \
-       assert(dsv); assert(ssv)
-
-PERL_CALLCONV char*    Perl_sv_xmlpeek(pTHX_ SV* sv)
-                       __attribute__nonnull__(pTHX_1);
-#define PERL_ARGS_ASSERT_SV_XMLPEEK    \
-       assert(sv)
-
-PERL_CALLCONV void     Perl_token_free(pTHX_ TOKEN *tk)
-                       __attribute__nonnull__(pTHX_1);
-#define PERL_ARGS_ASSERT_TOKEN_FREE    \
-       assert(tk)
-
-PERL_CALLCONV void     Perl_token_getmad(pTHX_ TOKEN *tk, OP *o, char slot)
-                       __attribute__nonnull__(pTHX_1);
-#define PERL_ARGS_ASSERT_TOKEN_GETMAD  \
-       assert(tk)
-
-PERL_CALLCONV OP *     Perl_utilize(pTHX_ int aver, I32 floor, OP* version, OP* idop, OP* arg)
-                       __attribute__nonnull__(pTHX_4);
-#define PERL_ARGS_ASSERT_UTILIZE       \
-       assert(idop)
-
-PERL_CALLCONV void     Perl_xmldump_all(pTHX);
-PERL_CALLCONV void     Perl_xmldump_all_perl(pTHX_ bool justperl);
-PERL_CALLCONV void     Perl_xmldump_eval(pTHX);
-PERL_CALLCONV void     Perl_xmldump_form(pTHX_ const GV* gv)
-                       __attribute__nonnull__(pTHX_1);
-#define PERL_ARGS_ASSERT_XMLDUMP_FORM  \
-       assert(gv)
-
-PERL_CALLCONV void     Perl_xmldump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
-                       __attribute__format__(__printf__,pTHX_3,pTHX_4)
-                       __attribute__nonnull__(pTHX_2)
-                       __attribute__nonnull__(pTHX_3);
-#define PERL_ARGS_ASSERT_XMLDUMP_INDENT        \
-       assert(file); assert(pat)
-
-PERL_CALLCONV void     Perl_xmldump_packsubs(pTHX_ const HV* stash)
-                       __attribute__nonnull__(pTHX_1);
-#define PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS      \
-       assert(stash)
-
-PERL_CALLCONV void     Perl_xmldump_packsubs_perl(pTHX_ const HV* stash, bool justperl)
-                       __attribute__nonnull__(pTHX_1);
-#define PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS_PERL \
-       assert(stash)
-
-PERL_CALLCONV void     Perl_xmldump_sub(pTHX_ const GV* gv)
-                       __attribute__nonnull__(pTHX_1);
-#define PERL_ARGS_ASSERT_XMLDUMP_SUB   \
-       assert(gv)
-
-PERL_CALLCONV void     Perl_xmldump_sub_perl(pTHX_ const GV* gv, bool justperl)
-                       __attribute__nonnull__(pTHX_1);
-#define PERL_ARGS_ASSERT_XMLDUMP_SUB_PERL      \
-       assert(gv)
-
-PERL_CALLCONV void     Perl_xmldump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
-                       __attribute__nonnull__(pTHX_2)
-                       __attribute__nonnull__(pTHX_3);
-#define PERL_ARGS_ASSERT_XMLDUMP_VINDENT       \
-       assert(file); assert(pat)
-
-#endif
 #if defined(PERL_USES_PL_PIDSTATUS) && defined(PERL_IN_UTIL_C)
 STATIC void    S_pidgone(pTHX_ Pid_t pid, int status);
 #endif
index b962756..bf484bb 100644 (file)
@@ -272,7 +272,7 @@ sub make_type_tab {
     my $default_token;
     open my $fh, '<', $y_file or die "Can't open $y_file: $!\n";
     while (<$fh>) {
-       if (/(\$\d+)\s*=/) {
+       if (/(\$\d+)\s*=[^=]/) {
            warn "$y_file:$.: dangerous assignment to $1: $_";
        }
 
diff --git a/sv.c b/sv.c
index b6409a0..05f26d7 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -11928,27 +11928,9 @@ Perl_parser_dup(pTHX_ const yy_parser *const proto, CLONE_PARAMS *const param)
     Copy(proto->tokenbuf, parser->tokenbuf, 256, char);
 
 
-#ifdef PERL_MAD
-    parser->endwhite   = proto->endwhite;
-    parser->faketokens = proto->faketokens;
-    parser->lasttoke   = proto->lasttoke;
-    parser->nextwhite  = proto->nextwhite;
-    parser->realtokenstart = proto->realtokenstart;
-    parser->skipwhite  = proto->skipwhite;
-    parser->thisclose  = proto->thisclose;
-    parser->thismad    = proto->thismad;
-    parser->thisopen   = proto->thisopen;
-    parser->thisstuff  = proto->thisstuff;
-    parser->thistoken  = proto->thistoken;
-    parser->thiswhite  = proto->thiswhite;
-
-    Copy(proto->nexttoke, parser->nexttoke, 5, NEXTTOKE);
-    parser->curforce   = proto->curforce;
-#else
     Copy(proto->nextval, parser->nextval, 5, YYSTYPE);
     Copy(proto->nexttype, parser->nexttype, 5, I32);
     parser->nexttoke   = proto->nexttoke;
-#endif
 
     /* XXX should clone saved_curcop here, but we aren't passed
      * proto_perl; so do it in perl_clone_using instead */
diff --git a/t/run/mad.t b/t/run/mad.t
deleted file mode 100644 (file)
index 83023c5..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-#!./perl
-#
-# Tests for Perl mad environment
-#
-# $PERL_XMLDUMP
-
-BEGIN {
-    chdir 't' if -d 't';
-    @INC = '../lib';
-    require Config; import Config;
-    require './test.pl';
-    skip_all_without_config('mad');
-}
-
-use File::Path;
-use File::Spec;
-
-my $tempdir = tempfile;
-
-mkdir $tempdir, 0700 or die "Can't mkdir '$tempdir': $!";
-unshift @INC, '../../lib';
-my $cleanup = 1;
-
-END {
-    if ($cleanup) {
-       rmtree($tempdir);
-    }
-}
-
-plan tests => 4;
-
-{
-    delete local $ENV{$_} for keys %ENV;
-    my $fn = File::Spec->catfile(File::Spec->curdir(), "withoutT.xml");
-    $ENV{PERL_XMLDUMP} = $fn;
-    fresh_perl_is('print q/hello/', '', {}, 'mad without -T');
-    ok(-f $fn, "xml file created without -T as expected");
-}
-
-{
-    delete local $ENV{$_} for keys %ENV;
-    my $fn = File::Spec->catfile(File::Spec->curdir(), "withT.xml");
-    fresh_perl_is('print q/hello/', 'hello', { switches => [ "-T" ] },
-                 'mad with -T');
-    ok(!-e $fn, "no xml file created with -T as expected");
-}
diff --git a/toke.c b/toke.c
index 4f1d7b3..4d22549 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -87,37 +87,13 @@ Individual members of C<PL_parser> have their own documentation.
 #define PL_multi_end           (PL_parser->multi_end)
 #define PL_error_count         (PL_parser->error_count)
 
-#ifdef PERL_MAD
-#  define PL_endwhite          (PL_parser->endwhite)
-#  define PL_faketokens                (PL_parser->faketokens)
-#  define PL_lasttoke          (PL_parser->lasttoke)
-#  define PL_nextwhite         (PL_parser->nextwhite)
-#  define PL_realtokenstart    (PL_parser->realtokenstart)
-#  define PL_skipwhite         (PL_parser->skipwhite)
-#  define PL_thisclose         (PL_parser->thisclose)
-#  define PL_thismad           (PL_parser->thismad)
-#  define PL_thisopen          (PL_parser->thisopen)
-#  define PL_thisstuff         (PL_parser->thisstuff)
-#  define PL_thistoken         (PL_parser->thistoken)
-#  define PL_thiswhite         (PL_parser->thiswhite)
-#  define PL_thiswhite         (PL_parser->thiswhite)
-#  define PL_nexttoke          (PL_parser->nexttoke)
-#  define PL_curforce          (PL_parser->curforce)
-#else
 #  define PL_nexttoke          (PL_parser->nexttoke)
 #  define PL_nexttype          (PL_parser->nexttype)
 #  define PL_nextval           (PL_parser->nextval)
-#endif
 
 static const char* const ident_too_long = "Identifier too long";
 
-#ifdef PERL_MAD
-#  define CURMAD(slot,sv) if (PL_madskills) { curmad(slot,sv); sv = 0; }
-#  define NEXTVAL_NEXTTOKE PL_nexttoke[PL_curforce].next_val
-#else
-#  define CURMAD(slot,sv)
 #  define NEXTVAL_NEXTTOKE PL_nextval[PL_nexttoke]
-#endif
 
 #define XENUMMASK  0x3f
 #define XFAKEEOF   0x40
@@ -187,17 +163,10 @@ static const char* const lex_state_names[] = {
 
 #define CLINE (PL_copline = (CopLINE(PL_curcop) < PL_copline ? CopLINE(PL_curcop) : PL_copline))
 
-#ifdef PERL_MAD
-#  define SKIPSPACE0(s) skipspace0(s)
-#  define SKIPSPACE1(s) skipspace1(s)
-#  define SKIPSPACE2(s,tsv) skipspace2(s,&tsv)
-#  define PEEKSPACE(s) skipspace2(s,0)
-#else
 #  define SKIPSPACE0(s) skipspace(s)
 #  define SKIPSPACE1(s) skipspace(s)
 #  define SKIPSPACE2(s,tsv) skipspace(s)
 #  define PEEKSPACE(s) skipspace(s)
-#endif
 
 /*
  * Convenience functions to return different tokens and prime the
@@ -374,7 +343,6 @@ static struct debug_tokens {
     { OROP,            TOKENTYPE_IVAL,         "OROP" },
     { OROR,            TOKENTYPE_NONE,         "OROR" },
     { PACKAGE,         TOKENTYPE_NONE,         "PACKAGE" },
-    { PEG,             TOKENTYPE_NONE,         "PEG" },
     { PLUGEXPR,                TOKENTYPE_OPVAL,        "PLUGEXPR" },
     { PLUGSTMT,                TOKENTYPE_OPVAL,        "PLUGSTMT" },
     { PMFUNC,          TOKENTYPE_OPVAL,        "PMFUNC" },
@@ -728,11 +696,7 @@ Perl_lex_start(pTHX_ SV *line, PerlIO *rsfp, U32 flags)
 
     /* initialise lexer state */
 
-#ifdef PERL_MAD
-    parser->curforce = -1;
-#else
     parser->nexttoke = 0;
-#endif
     parser->error_count = oparser ? oparser->error_count : 0;
     parser->copline = parser->preambling = NOLINE;
     parser->lex_state = LEX_NORMAL;
@@ -807,23 +771,9 @@ Perl_parser_free(pTHX_  const yy_parser *parser)
 void
 Perl_parser_free_nexttoke_ops(pTHX_  yy_parser *parser, OPSLAB *slab)
 {
-#ifdef PERL_MAD
-    I32 nexttoke = parser->lasttoke;
-#else
     I32 nexttoke = parser->nexttoke;
-#endif
     PERL_ARGS_ASSERT_PARSER_FREE_NEXTTOKE_OPS;
     while (nexttoke--) {
-#ifdef PERL_MAD
-       if (S_is_opval_token(parser->nexttoke[nexttoke].next_type
-                               & 0xffff)
-        && parser->nexttoke[nexttoke].next_val.opval
-        && parser->nexttoke[nexttoke].next_val.opval->op_slabbed
-        && OpSLAB(parser->nexttoke[nexttoke].next_val.opval) == slab) {
-               op_free(parser->nexttoke[nexttoke].next_val.opval);
-               parser->nexttoke[nexttoke].next_val.opval = NULL;
-       }
-#else
        if (S_is_opval_token(parser->nexttype[nexttoke] & 0xffff)
         && parser->nextval[nexttoke].opval
         && parser->nextval[nexttoke].opval->op_slabbed
@@ -831,7 +781,6 @@ Perl_parser_free_nexttoke_ops(pTHX_  yy_parser *parser, OPSLAB *slab)
            op_free(parser->nextval[nexttoke].opval);
            parser->nextval[nexttoke].opval = NULL;
        }
-#endif
     }
 }
 
@@ -1358,10 +1307,6 @@ Perl_lex_next_chunk(pTHX_ U32 flags)
            (void)PerlIO_close(PL_parser->rsfp);
        PL_parser->rsfp = NULL;
        PL_parser->in_pod = PL_parser->filtered = 0;
-#ifdef PERL_MAD
-       if (PL_madskills && !PL_in_eval && (PL_minus_p || PL_minus_n))
-           PL_faketokens = 1;
-#endif
        if (!PL_in_eval && PL_minus_p) {
            sv_catpvs(linestr,
                /*{*/";}continue{print or die qq(-p destination: $!\\n);}");
@@ -1535,14 +1480,6 @@ Perl_lex_read_space(pTHX_ U32 flags)
     bool need_incline = 0;
     if (flags & ~(LEX_KEEP_PREVIOUS|LEX_NO_NEXT_CHUNK|LEX_NO_INCLINE))
        Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_read_space");
-#ifdef PERL_MAD
-    if (PL_skipwhite) {
-       sv_free(PL_skipwhite);
-       PL_skipwhite = NULL;
-    }
-    if (PL_madskills)
-       PL_skipwhite = newSVpvs("");
-#endif /* PERL_MAD */
     s = PL_parser->bufptr;
     bufend = PL_parser->bufend;
     while (1) {
@@ -1565,10 +1502,6 @@ Perl_lex_read_space(pTHX_ U32 flags)
        } else if (c == 0 && s == bufend) {
            bool got_more;
            line_t l;
-#ifdef PERL_MAD
-           if (PL_madskills)
-               sv_catpvn(PL_skipwhite, PL_parser->bufptr, s-PL_parser->bufptr);
-#endif /* PERL_MAD */
            if (flags & LEX_NO_NEXT_CHUNK)
                break;
            PL_parser->bufptr = s;
@@ -1588,10 +1521,6 @@ Perl_lex_read_space(pTHX_ U32 flags)
            break;
        }
     }
-#ifdef PERL_MAD
-    if (PL_madskills)
-       sv_catpvn(PL_skipwhite, PL_parser->bufptr, s-PL_parser->bufptr);
-#endif /* PERL_MAD */
     PL_parser->bufptr = s;
 }
 
@@ -1828,85 +1757,6 @@ S_incline(pTHX_ const char *s)
 
 #define skipspace(s) skipspace_flags(s, 0)
 
-#ifdef PERL_MAD
-/* skip space before PL_thistoken */
-
-STATIC char *
-S_skipspace0(pTHX_ char *s)
-{
-    PERL_ARGS_ASSERT_SKIPSPACE0;
-
-    s = skipspace(s);
-    if (!PL_madskills)
-       return s;
-    if (PL_skipwhite) {
-       if (!PL_thiswhite)
-           PL_thiswhite = newSVpvs("");
-       sv_catsv(PL_thiswhite, PL_skipwhite);
-       sv_free(PL_skipwhite);
-       PL_skipwhite = 0;
-    }
-    PL_realtokenstart = s - SvPVX(PL_linestr);
-    return s;
-}
-
-/* skip space after PL_thistoken */
-
-STATIC char *
-S_skipspace1(pTHX_ char *s)
-{
-    const char *start = s;
-    I32 startoff = start - SvPVX(PL_linestr);
-
-    PERL_ARGS_ASSERT_SKIPSPACE1;
-
-    s = skipspace(s);
-    if (!PL_madskills)
-       return s;
-    start = SvPVX(PL_linestr) + startoff;
-    if (!PL_thistoken && PL_realtokenstart >= 0) {
-       const char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
-       PL_thistoken = newSVpvn(tstart, start - tstart);
-    }
-    PL_realtokenstart = -1;
-    if (PL_skipwhite) {
-       if (!PL_nextwhite)
-           PL_nextwhite = newSVpvs("");
-       sv_catsv(PL_nextwhite, PL_skipwhite);
-       sv_free(PL_skipwhite);
-       PL_skipwhite = 0;
-    }
-    return s;
-}
-
-STATIC char *
-S_skipspace2(pTHX_ char *s, SV **svp)
-{
-    char *start;
-    const I32 startoff = s - SvPVX(PL_linestr);
-
-    PERL_ARGS_ASSERT_SKIPSPACE2;
-
-    s = skipspace(s);
-    if (!PL_madskills || !svp)
-       return s;
-    start = SvPVX(PL_linestr) + startoff;
-    if (!PL_thistoken && PL_realtokenstart >= 0) {
-       char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
-       PL_thistoken = newSVpvn(tstart, start - tstart);
-       PL_realtokenstart = -1;
-    }
-    if (PL_skipwhite) {
-       if (!*svp)
-           *svp = newSVpvs("");
-       sv_setsv(*svp, PL_skipwhite);
-       sv_free(PL_skipwhite);
-       PL_skipwhite = 0;
-    }
-    
-    return s;
-}
-#endif
 
 STATIC void
 S_update_debugger_info(pTHX_ SV *orig_sv, const char *const buf, STRLEN len)
@@ -1942,16 +1792,7 @@ S_update_debugger_info(pTHX_ SV *orig_sv, const char *const buf, STRLEN len)
 STATIC char *
 S_skipspace_flags(pTHX_ char *s, U32 flags)
 {
-#ifdef PERL_MAD
-    char *start = s;
-#endif /* PERL_MAD */
     PERL_ARGS_ASSERT_SKIPSPACE_FLAGS;
-#ifdef PERL_MAD
-    if (PL_skipwhite) {
-       sv_free(PL_skipwhite);
-       PL_skipwhite = NULL;
-    }
-#endif /* PERL_MAD */
     if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
        while (s < PL_bufend && SPACE_OR_TAB(*s))
            s++;
@@ -1967,10 +1808,6 @@ S_skipspace_flags(pTHX_ char *s, U32 flags)
            PL_bufptr = PL_linestart;
        return s;
     }
-#ifdef PERL_MAD
-    if (PL_madskills)
-       PL_skipwhite = newSVpvn(start, s-start);
-#endif /* PERL_MAD */
     return s;
 }
 
@@ -2033,13 +1870,8 @@ S_lop(pTHX_ I32 f, int x, char *s)
     PL_bufptr = s;
     PL_last_lop = PL_oldbufptr;
     PL_last_lop_op = (OPCODE)f;
-#ifdef PERL_MAD
-    if (PL_lasttoke)
-       goto lstop;
-#else
     if (PL_nexttoke)
        goto lstop;
-#endif
     if (*s == '(')
        return REPORT(FUNC);
     s = PEEKSPACE(s);
@@ -2053,83 +1885,13 @@ S_lop(pTHX_ I32 f, int x, char *s)
     }
 }
 
-#ifdef PERL_MAD
- /*
- * S_start_force
- * Sets up for an eventual force_next().  start_force(0) basically does
- * an unshift, while start_force(-1) does a push.  yylex removes items
- * on the "pop" end.
- */
-
-STATIC void
-S_start_force(pTHX_ int where)
-{
-    int i;
-
-    if (where < 0)     /* so people can duplicate start_force(PL_curforce) */
-       where = PL_lasttoke;
-    assert(PL_curforce < 0 || PL_curforce == where);
-    if (PL_curforce != where) {
-       for (i = PL_lasttoke; i > where; --i) {
-           PL_nexttoke[i] = PL_nexttoke[i-1];
-       }
-       PL_lasttoke++;
-    }
-    if (PL_curforce < 0)       /* in case of duplicate start_force() */
-       Zero(&PL_nexttoke[where], 1, NEXTTOKE);
-    PL_curforce = where;
-    if (PL_nextwhite) {
-       if (PL_madskills)
-           curmad('^', newSVpvs(""));
-       CURMAD('_', PL_nextwhite);
-    }
-}
-
-STATIC void
-S_curmad(pTHX_ char slot, SV *sv)
-{
-    MADPROP **where;
-
-    if (!sv)
-       return;
-    if (PL_curforce < 0)
-       where = &PL_thismad;
-    else
-       where = &PL_nexttoke[PL_curforce].next_mad;
-
-    if (PL_faketokens)
-       sv_setpvs(sv, "");
-    else {
-       if (!IN_BYTES) {
-           if (UTF && is_utf8_string((U8*)SvPVX(sv), SvCUR(sv)))
-               SvUTF8_on(sv);
-           else if (PL_encoding) {
-               sv_recode_to_utf8(sv, PL_encoding);
-           }
-       }
-    }
-
-    /* keep a slot open for the head of the list? */
-    if (slot != '_' && *where && (*where)->mad_key == '^') {
-       (*where)->mad_key = slot;
-       sv_free(MUTABLE_SV(((*where)->mad_val)));
-       (*where)->mad_val = (void*)sv;
-    }
-    else
-       addmad(newMADsv(slot, sv), where, 0);
-}
-#else
-#  define start_force(where)    NOOP
-#  define curmad(slot, sv)      NOOP
-#endif
-
 /*
  * S_force_next
  * When the lexer realizes it knows the next token (for instance,
  * it is reordering tokens for the parser) then it can call S_force_next
  * to know what token to return the next time the lexer is called.  Caller
- * will need to set PL_nextval[] (or PL_nexttoke[].next_val with PERL_MAD),
- * and possibly PL_expect to ensure the lexer handles the token correctly.
+ * will need to set PL_nextval[] and possibly PL_expect to ensure
+ * the lexer handles the token correctly.
  */
 
 STATIC void
@@ -2142,16 +1904,6 @@ S_force_next(pTHX_ I32 type)
        tokereport(type, &NEXTVAL_NEXTTOKE);
     }
 #endif
-#ifdef PERL_MAD
-    if (PL_curforce < 0)
-       start_force(PL_lasttoke);
-    PL_nexttoke[PL_curforce].next_type = type;
-    if (PL_lex_state != LEX_KNOWNEXT)
-       PL_lex_defer = PL_lex_state;
-    PL_lex_state = LEX_KNOWNEXT;
-    PL_lex_expect = PL_expect;
-    PL_curforce = -1;
-#else
     PL_nexttype[PL_nexttoke] = type;
     PL_nexttoke++;
     if (PL_lex_state != LEX_KNOWNEXT) {
@@ -2159,7 +1911,6 @@ S_force_next(pTHX_ I32 type)
        PL_lex_expect = PL_expect;
        PL_lex_state = LEX_KNOWNEXT;
     }
-#endif
 }
 
 /*
@@ -2182,10 +1933,8 @@ S_postderef(pTHX_ int const funny, char const next)
        if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) {
            assert('@' == funny || '$' == funny || DOLSHARP == funny);
            PL_lex_state = LEX_INTERPEND;
-           start_force(PL_curforce);
            force_next(POSTJOIN);
        }
-       start_force(PL_curforce);
        force_next(next);
        PL_bufptr+=2;
     }
@@ -2205,7 +1954,6 @@ Perl_yyunlex(pTHX)
     int yyc = PL_parser->yychar;
     if (yyc != YYEMPTY) {
        if (yyc) {
-           start_force(-1);
            NEXTVAL_NEXTTOKE = PL_parser->yylval;
            if (yyc == '{'/*}*/ || yyc == HASHBRACK || yyc == '['/*]*/) {
                PL_lex_allbrackets--;
@@ -2272,9 +2020,6 @@ S_force_word(pTHX_ char *start, int token, int check_keyword, int allow_pack)
          if (keyword(s2, len, 0))
            return start;
        }
-       start_force(PL_curforce);
-       if (PL_madskills)
-           curmad('X', newSVpvn(start,s-start));
        if (token == METHOD) {
            s = SKIPSPACE1(s);
            if (*s == '(')
@@ -2283,8 +2028,6 @@ S_force_word(pTHX_ char *start, int token, int check_keyword, int allow_pack)
                PL_expect = XOPERATOR;
            }
        }
-       if (PL_madskills)
-           curmad('g', newSVpvs( "forced" ));
        NEXTVAL_NEXTTOKE.opval
            = (OP*)newSVOP(OP_CONST,0,
                           S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
@@ -2314,7 +2057,6 @@ S_force_ident(pTHX_ const char *s, int kind)
        const STRLEN len = s[1] ? strlen(s) : 1; /* s = "\"" see yylex */
        OP* const o = (OP*)newSVOP(OP_CONST, 0, newSVpvn_flags(s, len,
                                                                 UTF ? SVf_UTF8 : 0));
-       start_force(PL_curforce);
        NEXTVAL_NEXTTOKE.opval = o;
        force_next(WORD);
        if (kind) {
@@ -2337,7 +2079,6 @@ S_force_ident(pTHX_ const char *s, int kind)
 static void
 S_force_ident_maybe_lex(pTHX_ char pit)
 {
-    start_force(PL_curforce);
     NEXTVAL_NEXTTOKE.ival = pit;
     force_next('p');
 }
@@ -2384,9 +2125,6 @@ S_force_version(pTHX_ char *s, int guessing)
     dVAR;
     OP *version = NULL;
     char *d;
-#ifdef PERL_MAD
-    I32 startoff = s - SvPVX(PL_linestr);
-#endif
 
     PERL_ARGS_ASSERT_FORCE_VERSION;
 
@@ -2398,12 +2136,6 @@ S_force_version(pTHX_ char *s, int guessing)
     if (isDIGIT(*d)) {
        while (isDIGIT(*d) || *d == '_' || *d == '.')
            d++;
-#ifdef PERL_MAD
-       if (PL_madskills) {
-           start_force(PL_curforce);
-           curmad('X', newSVpvn(s,d-s));
-       }
-#endif
         if (*d == ';' || isSPACE(*d) || *d == '{' || *d == '}' || !*d) {
            SV *ver;
             s = scan_num(s, &pl_yylval);
@@ -2416,26 +2148,11 @@ S_force_version(pTHX_ char *s, int guessing)
            }
         }
        else if (guessing) {
-#ifdef PERL_MAD
-           if (PL_madskills) {
-               sv_free(PL_nextwhite);  /* let next token collect whitespace */
-               PL_nextwhite = 0;
-               s = SvPVX(PL_linestr) + startoff;
-           }
-#endif
            return s;
        }
     }
 
-#ifdef PERL_MAD
-    if (PL_madskills && !version) {
-       sv_free(PL_nextwhite);  /* let next token collect whitespace */
-       PL_nextwhite = 0;
-       s = SvPVX(PL_linestr) + startoff;
-    }
-#endif
     /* NOTE: The parser sees the package name and the VERSION swapped */
-    start_force(PL_curforce);
     NEXTVAL_NEXTTOKE.opval = version;
     force_next(WORD);
 
@@ -2452,9 +2169,6 @@ S_force_strict_version(pTHX_ char *s)
 {
     dVAR;
     OP *version = NULL;
-#ifdef PERL_MAD
-    I32 startoff = s - SvPVX(PL_linestr);
-#endif
     const char *errstr = NULL;
 
     PERL_ARGS_ASSERT_FORCE_STRICT_VERSION;
@@ -2476,15 +2190,7 @@ S_force_strict_version(pTHX_ char *s)
        return s;
     }
 
-#ifdef PERL_MAD
-    if (PL_madskills && !version) {
-       sv_free(PL_nextwhite);  /* let next token collect whitespace */
-       PL_nextwhite = 0;
-       s = SvPVX(PL_linestr) + startoff;
-    }
-#endif
     /* NOTE: The parser sees the package name and the VERSION swapped */
-    start_force(PL_curforce);
     NEXTVAL_NEXTTOKE.opval = version;
     force_next(WORD);
 
@@ -2773,20 +2479,6 @@ S_sublex_done(pTHX)
     }
     else {
        const line_t l = CopLINE(PL_curcop);
-#ifdef PERL_MAD
-       if (PL_madskills) {
-           if (PL_thiswhite) {
-               if (!PL_endwhite)
-                   PL_endwhite = newSVpvs("");
-               sv_catsv(PL_endwhite, PL_thiswhite);
-               PL_thiswhite = 0;
-           }
-           if (PL_thistoken)
-               sv_setpvs(PL_thistoken,"");
-           else
-               PL_realtokenstart = -1;
-       }
-#endif
        LEAVE;
        if (PL_multi_close == '<')
            PL_parser->herelines += l - PL_multi_end;
@@ -4144,9 +3836,6 @@ S_intuit_method(pTHX_ char *start, GV *gv, CV *cv)
     char tmpbuf[sizeof PL_tokenbuf];
     STRLEN len;
     GV* indirgv;
-#ifdef PERL_MAD
-    int soff;
-#endif
 
     PERL_ARGS_ASSERT_INTUIT_METHOD;
 
@@ -4166,13 +3855,7 @@ S_intuit_method(pTHX_ char *start, GV *gv, CV *cv)
        if (cv || PL_last_lop_op == OP_PRINT || PL_last_lop_op == OP_SAY ||
                isUPPER(*PL_tokenbuf))
            return 0;
-#ifdef PERL_MAD
-       len = start - SvPVX(PL_linestr);
-#endif
        s = PEEKSPACE(s);
-#ifdef PERL_MAD
-       start = SvPVX(PL_linestr) + len;
-#endif
        PL_bufptr = start;
        PL_expect = XREF;
        return *s == '(' ? FUNCMETH : METHOD;
@@ -4188,9 +3871,6 @@ S_intuit_method(pTHX_ char *start, GV *gv, CV *cv)
        if (len > 2 && tmpbuf[len - 2] == ':' && tmpbuf[len - 1] == ':') {
            len -= 2;
            tmpbuf[len] = '\0';
-#ifdef PERL_MAD
-           soff = s - SvPVX(PL_linestr);
-#endif
            goto bare_package;
        }
        indirgv = gv_fetchpvn_flags(tmpbuf, len, ( UTF ? SVf_UTF8 : 0 ), SVt_PVCV);
@@ -4198,26 +3878,16 @@ S_intuit_method(pTHX_ char *start, GV *gv, CV *cv)
            return 0;
        /* filehandle or package name makes it a method */
        if (!cv || GvIO(indirgv) || gv_stashpvn(tmpbuf, len, UTF ? SVf_UTF8 : 0)) {
-#ifdef PERL_MAD
-           soff = s - SvPVX(PL_linestr);
-#endif
            s = PEEKSPACE(s);
            if ((PL_bufend - s) >= 2 && *s == '=' && *(s+1) == '>')
                return 0;       /* no assumptions -- "=>" quotes bareword */
       bare_package:
-           start_force(PL_curforce);
            NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0,
                                                  S_newSV_maybe_utf8(aTHX_ tmpbuf, len));
            NEXTVAL_NEXTTOKE.opval->op_private = OPpCONST_BARE;
-           if (PL_madskills)
-               curmad('X', newSVpvn_flags(start,SvPVX(PL_linestr) + soff - start,
-                                                            ( UTF ? SVf_UTF8 : 0 )));
            PL_expect = XTERM;
            force_next(WORD);
            PL_bufptr = s;
-#ifdef PERL_MAD
-           PL_bufptr = SvPVX(PL_linestr) + soff; /* restart before space */
-#endif
            return *s == '(' ? FUNCMETH : METHOD;
        }
     }
@@ -4481,186 +4151,6 @@ S_find_in_my_stash(pTHX_ const char *pkgname, STRLEN len)
     return gv_stashpvn(pkgname, len, UTF ? SVf_UTF8 : 0);
 }
 
-#ifdef PERL_MAD 
- /*
- * Perl_madlex
- * The intent of this yylex wrapper is to minimize the changes to the
- * tokener when we aren't interested in collecting madprops.  It remains
- * to be seen how successful this strategy will be...
- */
-
-int
-Perl_madlex(pTHX)
-{
-    int optype;
-    char *s = PL_bufptr;
-
-    /* make sure PL_thiswhite is initialized */
-    PL_thiswhite = 0;
-    PL_thismad = 0;
-
-    /* previous token ate up our whitespace? */
-    if (!PL_lasttoke && PL_nextwhite) {
-       PL_thiswhite = PL_nextwhite;
-       PL_nextwhite = 0;
-    }
-
-    /* isolate the token, and figure out where it is without whitespace */
-    PL_realtokenstart = -1;
-    PL_thistoken = 0;
-    optype = yylex();
-    s = PL_bufptr;
-    assert(PL_curforce < 0);
-
-    if (!PL_thismad || PL_thismad->mad_key == '^') {   /* not forced already? */
-       if (!PL_thistoken) {
-           if (PL_realtokenstart < 0 || !CopLINE(PL_curcop))
-               PL_thistoken = newSVpvs("");
-           else {
-               char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
-               PL_thistoken = newSVpvn(tstart, s - tstart);
-           }
-       }
-       if (PL_thismad) /* install head */
-           CURMAD('X', PL_thistoken);
-    }
-
-    /* last whitespace of a sublex? */
-    if (optype == ')' && PL_endwhite) {
-       CURMAD('X', PL_endwhite);
-    }
-
-    if (!PL_thismad) {
-
-       /* if no whitespace and we're at EOF, bail.  Otherwise fake EOF below. */
-       if (!PL_thiswhite && !PL_endwhite && !optype) {
-           sv_free(PL_thistoken);
-           PL_thistoken = 0;
-           return 0;
-       }
-
-       /* put off final whitespace till peg */
-       if (optype == ';' && !PL_rsfp && !PL_parser->filtered) {
-           PL_nextwhite = PL_thiswhite;
-           PL_thiswhite = 0;
-       }
-       else if (PL_thisopen) {
-           CURMAD('q', PL_thisopen);
-           if (PL_thistoken)
-               sv_free(PL_thistoken);
-           PL_thistoken = 0;
-       }
-       else {
-           /* Store actual token text as madprop X */
-           CURMAD('X', PL_thistoken);
-       }
-
-       if (PL_thiswhite) {
-           /* add preceding whitespace as madprop _ */
-           CURMAD('_', PL_thiswhite);
-       }
-
-       if (PL_thisstuff) {
-           /* add quoted material as madprop = */
-           CURMAD('=', PL_thisstuff);
-       }
-
-       if (PL_thisclose) {
-           /* add terminating quote as madprop Q */
-           CURMAD('Q', PL_thisclose);
-       }
-    }
-
-    /* special processing based on optype */
-
-    switch (optype) {
-
-    /* opval doesn't need a TOKEN since it can already store mp */
-    case WORD:
-    case METHOD:
-    case FUNCMETH:
-    case THING:
-    case PMFUNC:
-    case PRIVATEREF:
-    case FUNC0SUB:
-    case UNIOPSUB:
-    case LSTOPSUB:
-       if (pl_yylval.opval)
-           append_madprops(PL_thismad, pl_yylval.opval, 0);
-       PL_thismad = 0;
-       return optype;
-
-    /* fake EOF */
-    case 0:
-       optype = PEG;
-       if (PL_endwhite) {
-           addmad(newMADsv('p', PL_endwhite), &PL_thismad, 0);
-           PL_endwhite = 0;
-       }
-       break;
-
-    /* pval */
-    case LABEL:
-       break;
-
-    case ']':
-    case '}':
-       if (PL_faketokens)
-           break;
-       /* remember any fake bracket that lexer is about to discard */ 
-       if (PL_lex_brackets == 1 &&
-           ((expectation)PL_lex_brackstack[0] & XFAKEBRACK))
-       {
-           s = PL_bufptr;
-           while (s < PL_bufend && (*s == ' ' || *s == '\t'))
-               s++;
-           if (*s == '}') {
-               PL_thiswhite = newSVpvn(PL_bufptr, ++s - PL_bufptr);
-               addmad(newMADsv('#', PL_thiswhite), &PL_thismad, 0);
-               PL_thiswhite = 0;
-               PL_bufptr = s - 1;
-               break;  /* don't bother looking for trailing comment */
-           }
-           else
-               s = PL_bufptr;
-       }
-       if (optype == ']')
-           break;
-       /* FALLTHROUGH */
-
-    /* attach a trailing comment to its statement instead of next token */
-    case ';':
-       if (PL_faketokens)
-           break;
-       if (PL_bufptr > PL_oldbufptr && PL_bufptr[-1] == optype) {
-           s = PL_bufptr;
-           while (s < PL_bufend && (*s == ' ' || *s == '\t'))
-               s++;
-           if (*s == '\n' || *s == '#') {
-               while (s < PL_bufend && *s != '\n')
-                   s++;
-               if (s < PL_bufend)
-                   s++;
-               PL_thiswhite = newSVpvn(PL_bufptr, s - PL_bufptr);
-               addmad(newMADsv('#', PL_thiswhite), &PL_thismad, 0);
-               PL_thiswhite = 0;
-               PL_bufptr = s;
-           }
-       }
-       break;
-
-    /* ival */
-    default:
-       break;
-
-    }
-
-    /* Create new token struct.  Note: opvals return early above. */
-    pl_yylval.tkval = newTOKEN(optype, pl_yylval, PL_thismad);
-    PL_thismad = 0;
-    return optype;
-}
-#endif
 
 STATIC char *
 S_tokenize_use(pTHX_ int is_use, char *s) {
@@ -4677,7 +4167,6 @@ S_tokenize_use(pTHX_ int is_use, char *s) {
        s = force_version(s, TRUE);
        if (*s == ';' || *s == '}'
                || (s = SKIPSPACE1(s), (*s == ';' || *s == '}'))) {
-           start_force(PL_curforce);
            NEXTVAL_NEXTTOKE.opval = NULL;
            force_next(WORD);
        }
@@ -4805,27 +4294,6 @@ Perl_yylex(pTHX)
 
     /* when we've already built the next token, just pull it out of the queue */
     case LEX_KNOWNEXT:
-#ifdef PERL_MAD
-       PL_lasttoke--;
-       pl_yylval = PL_nexttoke[PL_lasttoke].next_val;
-       if (PL_madskills) {
-           PL_thismad = PL_nexttoke[PL_lasttoke].next_mad;
-           PL_nexttoke[PL_lasttoke].next_mad = 0;
-           if (PL_thismad && PL_thismad->mad_key == '_') {
-               PL_thiswhite = MUTABLE_SV(PL_thismad->mad_val);
-               PL_thismad->mad_val = 0;
-               mad_free(PL_thismad);
-               PL_thismad = 0;
-           }
-       }
-       if (!PL_lasttoke) {
-           PL_lex_state = PL_lex_defer;
-           PL_expect = PL_lex_expect;
-           PL_lex_defer = LEX_NORMAL;
-           if (!PL_nexttoke[PL_lasttoke].next_type)
-               return yylex();
-       }
-#else
        PL_nexttoke--;
        pl_yylval = PL_nextval[PL_nexttoke];
        if (!PL_nexttoke) {
@@ -4833,14 +4301,9 @@ Perl_yylex(pTHX)
            PL_expect = PL_lex_expect;
            PL_lex_defer = LEX_NORMAL;
        }
-#endif
        {
            I32 next_type;
-#ifdef PERL_MAD
-           next_type = PL_nexttoke[PL_lasttoke].next_type;
-#else
            next_type = PL_nexttype[PL_nexttoke];
-#endif
            if (next_type & (7<<24)) {
                if (next_type & (1<<24)) {
                    if (PL_lex_brackets > 100)
@@ -4879,10 +4342,6 @@ Perl_yylex(pTHX)
                         || oldmod == 'F')) {
                    PL_bufptr += 2;
                    PL_lex_state = LEX_INTERPCONCAT;
-#ifdef PERL_MAD
-                   if (PL_madskills)
-                       PL_thistoken = newSVpvs("\\E");
-#endif
                }
                PL_lex_allbrackets--;
                return REPORT(')');
@@ -4892,20 +4351,8 @@ Perl_yylex(pTHX)
                Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
                         "Useless use of \\E");
             }
-#ifdef PERL_MAD
-           while (PL_bufptr != PL_bufend &&
-             PL_bufptr[0] == '\\' && PL_bufptr[1] == 'E') {
-               if (PL_madskills) {
-                 if (!PL_thiswhite)
-                   PL_thiswhite = newSVpvs("");
-                 sv_catpvn(PL_thiswhite, PL_bufptr, 2);
-               }
-               PL_bufptr += 2;
-           }
-#else
            if (PL_bufptr != PL_bufend)
                PL_bufptr += 2;
-#endif
            PL_lex_state = LEX_INTERPCONCAT;
            return yylex();
        }
@@ -4914,22 +4361,14 @@ Perl_yylex(pTHX)
               "### Saw case modifier\n"); });
            s = PL_bufptr + 1;
            if (s[1] == '\\' && s[2] == 'E') {
-#ifdef PERL_MAD
-               if (PL_madskills) {
-                 if (!PL_thiswhite)
-                   PL_thiswhite = newSVpvs("");
-                 sv_catpvn(PL_thiswhite, PL_bufptr, 4);
-               }
-#endif
                PL_bufptr = s + 3;
                PL_lex_state = LEX_INTERPCONCAT;
                return yylex();
            }
            else {
                I32 tmp;
-               if (!PL_madskills) /* when just compiling don't need correct */
-                   if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
-                       tmp = *s, *s = s[2], s[2] = (char)tmp;  /* misordered... */
+                if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
+                    tmp = *s, *s = s[2], s[2] = (char)tmp;     /* misordered... */
                if ((*s == 'L' || *s == 'U' || *s == 'F') &&
                    (strchr(PL_lex_casestack, 'L')
                         || strchr(PL_lex_casestack, 'U')
@@ -4943,10 +4382,8 @@ Perl_yylex(pTHX)
                PL_lex_casestack[PL_lex_casemods++] = *s;
                PL_lex_casestack[PL_lex_casemods] = '\0';
                PL_lex_state = LEX_INTERPCONCAT;
-               start_force(PL_curforce);
                NEXTVAL_NEXTTOKE.ival = 0;
                force_next((2<<24)|'(');
-               start_force(PL_curforce);
                if (*s == 'l')
                    NEXTVAL_NEXTTOKE.ival = OP_LCFIRST;
                else if (*s == 'u')
@@ -4961,26 +4398,12 @@ Perl_yylex(pTHX)
                    NEXTVAL_NEXTTOKE.ival = OP_FC;
                else
                    Perl_croak(aTHX_ "panic: yylex, *s=%u", *s);
-               if (PL_madskills) {
-                   SV* const tmpsv = newSVpvs("\\ ");
-                   /* replace the space with the character we want to escape
-                    */
-                   SvPVX(tmpsv)[1] = *s;
-                   curmad('_', tmpsv);
-               }
                PL_bufptr = s + 1;
            }
            force_next(FUNC);
            if (PL_lex_starts) {
                s = PL_bufptr;
                PL_lex_starts = 0;
-#ifdef PERL_MAD
-               if (PL_madskills) {
-                   if (PL_thistoken)
-                       sv_free(PL_thistoken);
-                   PL_thistoken = newSVpvs("");
-               }
-#endif
                /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
                if (PL_lex_casemods == 1 && PL_lex_inpat)
                    OPERATOR(',');
@@ -5006,18 +4429,13 @@ Perl_yylex(pTHX)
                             && (!PL_lex_inpat || PL_lex_casemods));
        PL_lex_state = LEX_INTERPNORMAL;
        if (PL_lex_dojoin) {
-           start_force(PL_curforce);
            NEXTVAL_NEXTTOKE.ival = 0;
            force_next(',');
-           start_force(PL_curforce);
            force_ident("\"", '$');
-           start_force(PL_curforce);
            NEXTVAL_NEXTTOKE.ival = 0;
            force_next('$');
-           start_force(PL_curforce);
            NEXTVAL_NEXTTOKE.ival = 0;
            force_next((2<<24)|'(');
-           start_force(PL_curforce);
            NEXTVAL_NEXTTOKE.ival = OP_JOIN;    /* emulate join($", ...) */
            force_next(FUNC);
        }
@@ -5027,21 +4445,12 @@ Perl_yylex(pTHX)
            PL_bufptr += 2;
            if (*PL_bufptr != '{')
                PL_bufptr++;
-           start_force(PL_curforce);
-           /* XXX probably need a CURMAD(something) here */
            PL_expect = XTERMBLOCK;
            force_next(DO);
        }
 
        if (PL_lex_starts++) {
            s = PL_bufptr;
-#ifdef PERL_MAD
-           if (PL_madskills) {
-               if (PL_thistoken)
-                   sv_free(PL_thistoken);
-               PL_thistoken = newSVpvs("");
-           }
-#endif
            /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
            if (!PL_lex_casemods && PL_lex_inpat)
                OPERATOR(',');
@@ -5062,13 +4471,6 @@ Perl_yylex(pTHX)
            const U8 dojoin_was = PL_lex_dojoin;
            PL_lex_dojoin = FALSE;
            PL_lex_state = LEX_INTERPCONCAT;
-#ifdef PERL_MAD
-           if (PL_madskills) {
-               if (PL_thistoken)
-                   sv_free(PL_thistoken);
-               PL_thistoken = newSVpvs("");
-           }
-#endif
            PL_lex_allbrackets--;
            return REPORT(dojoin_was == 1 ? ')' : POSTJOIN);
        }
@@ -5100,8 +4502,6 @@ Perl_yylex(pTHX)
            }
            else sv = newSVpvn(PL_parser->lex_shared->re_eval_start,
                         PL_bufptr - PL_parser->lex_shared->re_eval_start);
-           start_force(PL_curforce);
-           /* XXX probably need a CURMAD(something) here */
            NEXTVAL_NEXTTOKE.opval =
                    (OP*)newSVOP(OP_CONST, 0,
                                 sv);
@@ -5137,21 +4537,10 @@ Perl_yylex(pTHX)
        }
 
        if (s != PL_bufptr) {
-           start_force(PL_curforce);
-           if (PL_madskills) {
-               curmad('X', newSVpvn(PL_bufptr,s-PL_bufptr));
-           }
            NEXTVAL_NEXTTOKE = pl_yylval;
            PL_expect = XTERM;
            force_next(THING);
            if (PL_lex_starts++) {
-#ifdef PERL_MAD
-               if (PL_madskills) {
-                   if (PL_thistoken)
-                       sv_free(PL_thistoken);
-                   PL_thistoken = newSVpvs("");
-               }
-#endif
                /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
                if (!PL_lex_casemods && PL_lex_inpat)
                    OPERATOR(',');
@@ -5184,13 +4573,6 @@ Perl_yylex(pTHX)
     PL_parser->saw_infix_sigil = 0;
 
   retry:
-#ifdef PERL_MAD
-    if (PL_thistoken) {
-       sv_free(PL_thistoken);
-       PL_thistoken = 0;
-    }
-    PL_realtokenstart = s - SvPVX(PL_linestr); /* assume but undo on ws */
-#endif
     switch (*s) {
     default:
        if (UTF ? isIDFIRST_utf8((U8*)s) : isALNUMC(*s))
@@ -5216,10 +4598,6 @@ Perl_yylex(pTHX)
     case 26:
        goto fake_eof;                  /* emulate EOF on ^D or ^Z */
     case 0:
-#ifdef PERL_MAD
-       if (PL_madskills)
-           PL_faketokens = 0;
-#endif
        if (!PL_rsfp && (!PL_parser->filtered || s+1 < PL_bufend)) {
            PL_last_uni = 0;
            PL_last_lop = 0;
@@ -5241,10 +4619,6 @@ Perl_yylex(pTHX)
        PL_last_lop = 0;
        if (!PL_in_eval && !PL_preambled) {
            PL_preambled = TRUE;
-#ifdef PERL_MAD
-           if (PL_madskills)
-               PL_faketokens = 1;
-#endif
            if (PL_perldb) {
                /* Generate a string of Perl code to load the debugger.
                 * If PERL5DB is set, it will return the contents of that,
@@ -5330,10 +4704,6 @@ Perl_yylex(pTHX)
                TOKEN(';');     /* not infinite loop because rsfp is NULL now */
            }
            CopLINE_dec(PL_curcop);
-#ifdef PERL_MAD
-           if (!PL_rsfp)
-               PL_realtokenstart = -1;
-#endif
            s = PL_bufptr;
            /* If it looks like the start of a BOM or raw UTF-16,
             * check if it in fact is. */
@@ -5356,10 +4726,6 @@ Perl_yylex(pTHX)
            }
            if (PL_parser->in_pod) {
                /* Incest with pod. */
-#ifdef PERL_MAD
-               if (PL_madskills)
-                   sv_catsv(PL_thiswhite, PL_linestr);
-#endif
                if (*s == '=' && strnEQ(s, "=cut", 4) && !isALPHA(s[4])) {
                    sv_setpvs(PL_linestr, "");
                    PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
@@ -5379,10 +4745,6 @@ Perl_yylex(pTHX)
                s++;
            if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
                s++;
-#ifdef PERL_MAD
-           if (PL_madskills)
-               PL_thiswhite = newSVpvn(PL_linestart, s - PL_linestart);
-#endif
            d = NULL;
            if (!PL_in_eval) {
                if (*s == '#' && *(s+1) == '!')
@@ -5568,7 +4930,6 @@ Perl_yylex(pTHX)
        }
        if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
            PL_lex_state = LEX_FORMLINE;
-           start_force(PL_curforce);
            NEXTVAL_NEXTTOKE.ival = 0;
            force_next(FORMRBRACK);
            TOKEN(';');
@@ -5581,100 +4942,54 @@ Perl_yylex(pTHX)
       "\t(Maybe you didn't strip carriage returns after a network transfer?)\n");
 #endif
     case ' ': case '\t': case '\f': case 013:
-#ifdef PERL_MAD
-       PL_realtokenstart = -1;
-       if (PL_madskills) {
-         if (!PL_thiswhite)
-           PL_thiswhite = newSVpvs("");
-         sv_catpvn(PL_thiswhite, s, 1);
-       }
-#endif
        s++;
        goto retry;
     case '#':
     case '\n':
-#ifdef PERL_MAD
-       PL_realtokenstart = -1;
-       if (PL_madskills)
-           PL_faketokens = 0;
-#endif
        if (PL_lex_state != LEX_NORMAL ||
             (PL_in_eval && !PL_rsfp && !PL_parser->filtered)) {
+            const bool in_comment = *s == '#';
            if (*s == '#' && s == PL_linestart && PL_in_eval
             && !PL_rsfp && !PL_parser->filtered) {
                /* handle eval qq[#line 1 "foo"\n ...] */
                CopLINE_dec(PL_curcop);
                incline(s);
            }
-           if (PL_madskills && !PL_lex_formbrack && !PL_in_eval) {
-               s = SKIPSPACE0(s);
-               if (!PL_in_eval || PL_rsfp || PL_parser->filtered)
-                   incline(s);
-           }
-           else {
-               const bool in_comment = *s == '#';
-               d = s;
-               while (d < PL_bufend && *d != '\n')
-                   d++;
-               if (d < PL_bufend)
-                   d++;
-               else if (d > PL_bufend) /* Found by Ilya: feed random input to Perl. */
-                   Perl_croak(aTHX_ "panic: input overflow, %p > %p",
-                              d, PL_bufend);
-#ifdef PERL_MAD
-               if (PL_madskills)
-                   PL_thiswhite = newSVpvn(s, d - s);
-#endif
-               s = d;
-               if (in_comment && d == PL_bufend
-                && PL_lex_state == LEX_INTERPNORMAL
-                && PL_lex_inwhat == OP_SUBST && PL_lex_repl == PL_linestr
-                && SvEVALED(PL_lex_repl) && d[-1] == '}') s--;
-               else incline(s);
-           }
+            d = s;
+            while (d < PL_bufend && *d != '\n')
+                d++;
+            if (d < PL_bufend)
+                d++;
+            else if (d > PL_bufend)
+                /* Found by Ilya: feed random input to Perl. */
+                Perl_croak(aTHX_ "panic: input overflow, %p > %p",
+                           d, PL_bufend);
+            s = d;
+            if (in_comment && d == PL_bufend
+                && PL_lex_state == LEX_INTERPNORMAL
+                && PL_lex_inwhat == OP_SUBST && PL_lex_repl == PL_linestr
+                && SvEVALED(PL_lex_repl) && d[-1] == '}') s--;
+            else
+                incline(s);
            if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
                PL_lex_state = LEX_FORMLINE;
-               start_force(PL_curforce);
                NEXTVAL_NEXTTOKE.ival = 0;
                force_next(FORMRBRACK);
                TOKEN(';');
            }
        }
        else {
-#ifdef PERL_MAD
-           if (PL_madskills && CopLINE(PL_curcop) >= 1 && !PL_lex_formbrack) {
-               if (CopLINE(PL_curcop) == 1 && s[0] == '#' && s[1] == '!') {
-                   PL_faketokens = 0;
-                   s = SKIPSPACE0(s);
-                   TOKEN(PEG); /* make sure any #! line is accessible */
-               }
-               s = SKIPSPACE0(s);
-           }
-           else {
-#endif
-                   if (PL_madskills) d = s;
-                   while (s < PL_bufend && *s != '\n')
-                       s++;
-                   if (s < PL_bufend)
-                   {
-                       s++;
-                       if (s < PL_bufend)
-                           incline(s);
-                   }
-                   else if (s > PL_bufend) /* Found by Ilya: feed random input to Perl. */
-                     Perl_croak(aTHX_ "panic: input overflow");
-#ifdef PERL_MAD
-                   if (PL_madskills && CopLINE(PL_curcop) >= 1) {
-                       if (!PL_thiswhite)
-                           PL_thiswhite = newSVpvs("");
-                       if (CopLINE(PL_curcop) == 1) {
-                           sv_setpvs(PL_thiswhite, "");
-                           PL_faketokens = 0;
-                       }
-                       sv_catpvn(PL_thiswhite, d, s - d);
-                   }
-           }
-#endif
+            while (s < PL_bufend && *s != '\n')
+                s++;
+            if (s < PL_bufend)
+                {
+                    s++;
+                    if (s < PL_bufend)
+                        incline(s);
+                }
+            else if (s > PL_bufend)
+                /* Found by Ilya: feed random input to Perl. */
+                Perl_croak(aTHX_ "panic: input overflow");
        }
        goto retry;
     case '-':
@@ -5920,9 +5235,6 @@ Perl_yylex(pTHX)
        s++;
        switch (PL_expect) {
            OP *attrs;
-#ifdef PERL_MAD
-           I32 stuffstart;
-#endif
        case XOPERATOR:
            if (!PL_in_my || PL_lex_state != LEX_NORMAL)
                break;
@@ -5938,9 +5250,6 @@ Perl_yylex(pTHX)
        case XATTRTERM:
            PL_expect = XTERMBLOCK;
         grabattrs:
-#ifdef PERL_MAD
-           stuffstart = s - SvPVX(PL_linestr) - 1;
-#endif
            s = PEEKSPACE(s);
            attrs = NULL;
            while (isIDFIRST_lazy_if(s,UTF)) {
@@ -6060,17 +5369,9 @@ Perl_yylex(pTHX)
            }
        got_attrs:
            if (attrs) {
-               start_force(PL_curforce);
                NEXTVAL_NEXTTOKE.opval = attrs;
-               CURMAD('_', PL_nextwhite);
                force_next(THING);
            }
-#ifdef PERL_MAD
-           if (PL_madskills) {
-               PL_thistoken = newSVpvn(SvPVX(PL_linestr) + stuffstart,
-                                    (s - SvPVX(PL_linestr)) - stuffstart);
-           }
-#endif
            TOKEN(COLONATTR);
        }
        if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_CLOSING) {
@@ -6314,19 +5615,9 @@ Perl_yylex(pTHX)
            PL_bufptr = s;
            return yylex();             /* ignore fake brackets */
        }
-       start_force(PL_curforce);
-       if (PL_madskills) {
-           curmad('X', newSVpvn(s-1,1));
-           CURMAD('_', PL_thiswhite);
-       }
        force_next(formbrack ? '.' : '}');
        if (formbrack) LEAVE;
-#ifdef PERL_MAD
-       if (PL_madskills && !PL_thistoken)
-           PL_thistoken = newSVpvs("");
-#endif
        if (formbrack == 2) { /* means . where arguments were expected */
-           start_force(PL_curforce);
            force_next(';');
            TOKEN(FORMRBRACK);
        }
@@ -6438,14 +5729,6 @@ Perl_yylex(pTHX)
                        }
                        goto retry;
                    }
-#ifdef PERL_MAD
-                   if (PL_madskills) {
-                       if (!PL_thiswhite)
-                           PL_thiswhite = newSVpvs("");
-                       sv_catpvn(PL_thiswhite, PL_linestart,
-                                 PL_bufend - PL_linestart);
-                   }
-#endif
                    s = PL_bufend;
                    PL_parser->in_pod = 1;
                    goto retry;
@@ -6864,7 +6147,7 @@ Perl_yylex(pTHX)
        TERM(THING);
 
     case '\'':
-       s = scan_str(s,!!PL_madskills,FALSE,FALSE,NULL);
+       s = scan_str(s,FALSE,FALSE,FALSE,NULL);
        if (!s)
            missingterm(NULL);
        COPLINE_SET_FROM_MULTI_END;
@@ -6880,7 +6163,7 @@ Perl_yylex(pTHX)
        TERM(sublex_start());
 
     case '"':
-       s = scan_str(s,!!PL_madskills,FALSE,FALSE,NULL);
+       s = scan_str(s,FALSE,FALSE,FALSE,NULL);
        DEBUG_T( {
            if (s)
                printbuf("### Saw string before %s\n", s);
@@ -6911,7 +6194,7 @@ Perl_yylex(pTHX)
        TERM(sublex_start());
 
     case '`':
-       s = scan_str(s,!!PL_madskills,FALSE,FALSE,NULL);
+       s = scan_str(s,FALSE,FALSE,FALSE,NULL);
        DEBUG_T( { printbuf("### Saw backtick string before %s\n", s); } );
        if (PL_expect == XOPERATOR)
            no_op("Backticks",s);
@@ -7212,9 +6495,6 @@ Perl_yylex(pTHX)
                    lastchar && PL_bufptr - 2 >= PL_linestart
                         ? PL_bufptr[-2]
                         : 0;
-#ifdef PERL_MAD
-               SV *nextPL_nextwhite = 0;
-#endif
 
 
                /* Get the rest if it looks like a package qualifier */
@@ -7246,7 +6526,7 @@ Perl_yylex(pTHX)
                   in which case Foo is a bareword
                   (and a package name). */
 
-               if (len > 2 && !PL_madskills &&
+               if (len > 2 &&
                    PL_tokenbuf[len - 2] == ':' && PL_tokenbuf[len - 1] == ':')
                {
                    if (ckWARN(WARN_BAREWORD)
@@ -7284,13 +6564,6 @@ Perl_yylex(pTHX)
                    SvREFCNT_dec(tmp_sv);
                }
 
-#ifdef PERL_MAD
-               if (PL_madskills && !PL_thistoken) {
-                   char *start = SvPVX(PL_linestr) + PL_realtokenstart;
-                   PL_thistoken = newSVpvn(start,s - start);
-                   PL_realtokenstart = s - SvPVX(PL_linestr);
-               }
-#endif
 
                /* Presume this is going to be a bareword of some sort. */
                CLINE;
@@ -7323,9 +6596,6 @@ Perl_yylex(pTHX)
 
                    /* (Now we can afford to cross potential line boundary.) */
                    s = SKIPSPACE2(s,nextPL_nextwhite);
-#ifdef PERL_MAD
-                   PL_nextwhite = nextPL_nextwhite;    /* assume no & deception */
-#endif
 
                    /* Two barewords in a row may indicate method call. */
 
@@ -7357,13 +6627,7 @@ Perl_yylex(pTHX)
                }
 
                PL_expect = XOPERATOR;
-#ifdef PERL_MAD
-               if (isSPACE(*s))
-                   s = SKIPSPACE2(s,nextPL_nextwhite);
-               PL_nextwhite = nextPL_nextwhite;
-#else
                s = skipspace(s);
-#endif
 
                /* Is this a word before a => operator? */
                if (*s == '=' && s[1] == '>' && !pkgname) {
@@ -7391,23 +6655,9 @@ Perl_yylex(pTHX)
                            goto its_constant;
                        }
                    }
-#ifdef PERL_MAD
-                   if (PL_madskills) {
-                       PL_nextwhite = PL_thiswhite;
-                       PL_thiswhite = 0;
-                   }
-                   start_force(PL_curforce);
-#endif
                    NEXTVAL_NEXTTOKE.opval =
                        off ? rv2cv_op : pl_yylval.opval;
                    PL_expect = XOPERATOR;
-#ifdef PERL_MAD
-                   if (PL_madskills) {
-                       PL_nextwhite = nextPL_nextwhite;
-                       curmad('X', PL_thistoken);
-                       PL_thistoken = newSVpvs("");
-                   }
-#endif
                    if (off)
                         op_free(pl_yylval.opval), force_next(PRIVATEREF);
                    else op_free(rv2cv_op),        force_next(WORD);
@@ -7474,9 +6724,6 @@ Perl_yylex(pTHX)
                    PL_last_lop_op = OP_ENTERSUB;
                    /* Is there a prototype? */
                    if (
-#ifdef PERL_MAD
-                       cv &&
-#endif
                        SvPOK(cv))
                    {
                        STRLEN protolen = CvPROTOLEN(cv);
@@ -7520,71 +6767,6 @@ Perl_yylex(pTHX)
                            PREBLOCK(LSTOPSUB);
                        }
                    }
-#ifdef PERL_MAD
-                   {
-                       if (PL_madskills) {
-                           PL_nextwhite = PL_thiswhite;
-                           PL_thiswhite = 0;
-                       }
-                       start_force(PL_curforce);
-                       NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
-                       PL_expect = XTERM;
-                       if (PL_madskills) {
-                           PL_nextwhite = nextPL_nextwhite;
-                           curmad('X', PL_thistoken);
-                           PL_thistoken = newSVpvs("");
-                       }
-                       force_next(off ? PRIVATEREF : WORD);
-                       if (!PL_lex_allbrackets &&
-                               PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC)
-                           PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC;
-                       TOKEN(NOAMP);
-                   }
-               }
-
-               /* Guess harder when madskills require "best effort". */
-               if (PL_madskills && (!gv || !GvCVu(gv))) {
-                   int probable_sub = 0;
-                   if (strchr("\"'`$@%0123456789!*+{[<", *s))
-                       probable_sub = 1;
-                   else if (isALPHA(*s)) {
-                       char tmpbuf[1024];
-                       STRLEN tmplen;
-                       d = s;
-                       d = scan_word(d, tmpbuf, sizeof tmpbuf, TRUE, &tmplen);
-                       if (!keyword(tmpbuf, tmplen, 0))
-                           probable_sub = 1;
-                       else {
-                           while (d < PL_bufend && isSPACE(*d))
-                               d++;
-                           if (*d == '=' && d[1] == '>')
-                               probable_sub = 1;
-                       }
-                   }
-                   if (probable_sub) {
-                       gv = gv_fetchpv(PL_tokenbuf, GV_ADD | ( UTF ? SVf_UTF8 : 0 ),
-                                        SVt_PVCV);
-                       op_free(pl_yylval.opval);
-                       pl_yylval.opval =
-                           off ? (OP *)newCVREF(0, rv2cv_op) : rv2cv_op;
-                       pl_yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
-                       PL_last_lop = PL_oldbufptr;
-                       PL_last_lop_op = OP_ENTERSUB;
-                       PL_nextwhite = PL_thiswhite;
-                       PL_thiswhite = 0;
-                       start_force(PL_curforce);
-                       NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
-                       PL_expect = XTERM;
-                       PL_nextwhite = nextPL_nextwhite;
-                       curmad('X', PL_thistoken);
-                       PL_thistoken = newSVpvs("");
-                       force_next(off ? PRIVATEREF : WORD);
-                       if (!PL_lex_allbrackets &&
-                               PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC)
-                           PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC;
-                       TOKEN(NOAMP);
-                   }
-#else
                    NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
                    PL_expect = XTERM;
                    force_next(off ? PRIVATEREF : WORD);
@@ -7592,7 +6774,6 @@ Perl_yylex(pTHX)
                            PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC)
                        PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC;
                    TOKEN(NOAMP);
-#endif
                }
 
                /* Call it a bare word */
@@ -7737,21 +6918,6 @@ Perl_yylex(pTHX)
                    }
                }
 #endif
-#ifdef PERL_MAD
-               if (PL_madskills) {
-                   if (PL_realtokenstart >= 0) {
-                       char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
-                       if (!PL_endwhite)
-                           PL_endwhite = newSVpvs("");
-                       sv_catsv(PL_endwhite, PL_thiswhite);
-                       PL_thiswhite = 0;
-                       sv_catpvn(PL_endwhite, tstart, PL_bufend - tstart);
-                       PL_realtokenstart = -1;
-                   }
-                   while ((s = filter_gets(PL_endwhite, SvCUR(PL_endwhite)))
-                          != NULL) ;
-               }
-#endif
                PL_rsfp = NULL;
            }
            goto fake_eof;
@@ -7961,8 +7127,6 @@ Perl_yylex(pTHX)
            UNI(OP_EXISTS);
        
        case KEY_exit:
-           if (PL_madskills)
-               UNI(OP_INT);
            UNI(OP_EXIT);
 
        case KEY_eval:
@@ -8018,9 +7182,6 @@ Perl_yylex(pTHX)
            s = SKIPSPACE1(s);
            if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) {
                char *p = s;
-#ifdef PERL_MAD
-               int soff = s - SvPVX(PL_linestr); /* for skipspace realloc */
-#endif
 
                if ((PL_bufend - p) >= 3 &&
                    strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
@@ -8036,9 +7197,6 @@ Perl_yylex(pTHX)
                }
                if (*p != '$')
                    Perl_croak(aTHX_ "Missing $ on loop variable");
-#ifdef PERL_MAD
-               s = SvPVX(PL_linestr) + soff;
-#endif
            }
            OPERATOR(FOR);
 
@@ -8273,9 +7431,6 @@ Perl_yylex(pTHX)
            PL_in_my = (U16)tmp;
            s = SKIPSPACE1(s);
            if (isIDFIRST_lazy_if(s,UTF)) {
-#ifdef PERL_MAD
-               char* start = s;
-#endif
                s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
                if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
                {
@@ -8296,13 +7451,6 @@ Perl_yylex(pTHX)
                    my_snprintf(tmpbuf, sizeof(tmpbuf), "No such class %.1000s", PL_tokenbuf);
                    yyerror_pv(tmpbuf, UTF ? SVf_UTF8 : 0);
                }
-#ifdef PERL_MAD
-               if (PL_madskills) {     /* just add type to declarator token */
-                   sv_catsv(PL_thistoken, PL_nextwhite);
-                   PL_nextwhite = 0;
-                   sv_catpvn(PL_thistoken, start, s - start);
-               }
-#endif
            }
            pl_yylval.ival = 1;
            OPERATOR(MY);
@@ -8401,7 +7549,7 @@ Perl_yylex(pTHX)
            LOP(OP_PIPE_OP,XTERM);
 
        case KEY_q:
-           s = scan_str(s,!!PL_madskills,FALSE,FALSE,NULL);
+           s = scan_str(s,FALSE,FALSE,FALSE,NULL);
            if (!s)
                missingterm(NULL);
            COPLINE_SET_FROM_MULTI_END;
@@ -8413,7 +7561,7 @@ Perl_yylex(pTHX)
 
        case KEY_qw: {
            OP *words = NULL;
-           s = scan_str(s,!!PL_madskills,FALSE,FALSE,NULL);
+           s = scan_str(s,FALSE,FALSE,FALSE,NULL);
            if (!s)
                missingterm(NULL);
            COPLINE_SET_FROM_MULTI_END;
@@ -8464,7 +7612,7 @@ Perl_yylex(pTHX)
        }
 
        case KEY_qq:
-           s = scan_str(s,!!PL_madskills,FALSE,FALSE,NULL);
+           s = scan_str(s,FALSE,FALSE,FALSE,NULL);
            if (!s)
                missingterm(NULL);
            pl_yylval.ival = OP_STRINGIFY;
@@ -8477,7 +7625,7 @@ Perl_yylex(pTHX)
            TERM(sublex_start());
 
        case KEY_qx:
-           s = scan_str(s,!!PL_madskills,FALSE,FALSE,NULL);
+           s = scan_str(s,FALSE,FALSE,FALSE,NULL);
            if (!s)
                missingterm(NULL);
            pl_yylval.ival = OP_BACKTICK;
@@ -8697,44 +7845,21 @@ Perl_yylex(pTHX)
                expectation attrful;
                bool have_name, have_proto;
                const int key = tmp;
-#ifndef PERL_MAD
                 SV *format_name = NULL;
-#endif
-
-#ifdef PERL_MAD
-               SV *tmpwhite = 0;
-
-               char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
-               SV *subtoken = PL_madskills
-                  ? newSVpvn_flags(tstart, s - tstart, SvUTF8(PL_linestr))
-                  : NULL;
-               PL_thistoken = 0;
 
                d = s;
-               s = SKIPSPACE2(s,tmpwhite);
-#else
-               d = s;
                s = skipspace(s);
-#endif
 
                if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' ||
                    (*s == ':' && s[1] == ':'))
                {
-#ifdef PERL_MAD
-                   SV *nametoke = NULL;
-#endif
 
                    PL_expect = XBLOCK;
                    attrful = XATTRBLOCK;
                    d = scan_word(s, tmpbuf, sizeof PL_tokenbuf - 1, TRUE,
                                  &len);
-#ifdef PERL_MAD
-                   if (PL_madskills)
-                       nametoke = newSVpvn_flags(s, d - s, SvUTF8(PL_linestr));
-#else
                     if (key == KEY_format)
                        format_name = S_newSV_maybe_utf8(aTHX_ s, d - s);
-#endif
                    *PL_tokenbuf = '&';
                    if (memchr(tmpbuf, ':', len) || key != KEY_sub
                     || pad_findmy_pvn(
@@ -8751,16 +7876,7 @@ Perl_yylex(pTHX)
                    have_name = TRUE;
 
 
-#ifdef PERL_MAD
-                   start_force(0);
-                   CURMAD('X', nametoke);
-                   CURMAD('_', tmpwhite);
-                   force_ident_maybe_lex('&');
-
-                   s = SKIPSPACE2(d,tmpwhite);
-#else
                    s = skipspace(d);
-#endif
                }
                else {
                    if (key == KEY_my || key == KEY_our || key==KEY_state)
@@ -8777,45 +7893,25 @@ Perl_yylex(pTHX)
                }
 
                if (key == KEY_format) {
-#ifdef PERL_MAD
-                   PL_thistoken = subtoken;
-                   s = d;
-#else
                    if (format_name) {
-                        start_force(PL_curforce);
                         NEXTVAL_NEXTTOKE.opval
                             = (OP*)newSVOP(OP_CONST,0, format_name);
                         NEXTVAL_NEXTTOKE.opval->op_private |= OPpCONST_BARE;
                         force_next(WORD);
                     }
-#endif
                    PREBLOCK(FORMAT);
                }
 
                /* Look for a prototype */
                if (*s == '(' && !FEATURE_SIGNATURES_IS_ENABLED) {
-                   s = scan_str(s,!!PL_madskills,FALSE,FALSE,NULL);
+                   s = scan_str(s,FALSE,FALSE,FALSE,NULL);
                    COPLINE_SET_FROM_MULTI_END;
                    if (!s)
                        Perl_croak(aTHX_ "Prototype not terminated");
                    (void)validate_proto(PL_subname, PL_lex_stuff, ckWARN(WARN_ILLEGALPROTO));
                    have_proto = TRUE;
 
-#ifdef PERL_MAD
-                   start_force(0);
-                   CURMAD('q', PL_thisopen);
-                   CURMAD('_', tmpwhite);
-                   CURMAD('=', PL_thisstuff);
-                   CURMAD('Q', PL_thisclose);
-                   NEXTVAL_NEXTTOKE.opval =
-                       (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
-                   PL_lex_stuff = NULL;
-                   force_next(THING);
-
-                   s = SKIPSPACE2(s,tmpwhite);
-#else
                    s = skipspace(s);
-#endif
                }
                else
                    have_proto = FALSE;
@@ -8829,25 +7925,12 @@ Perl_yylex(pTHX)
                        Perl_croak(aTHX_ "Illegal declaration of subroutine %"SVf, SVfARG(PL_subname));
                }
 
-#ifdef PERL_MAD
-               start_force(0);
-               if (tmpwhite) {
-                   if (PL_madskills)
-                       curmad('^', newSVpvs(""));
-                   CURMAD('_', tmpwhite);
-               }
-               force_next(0);
-
-               PL_thistoken = subtoken;
-                PERL_UNUSED_VAR(have_proto);
-#else
                if (have_proto) {
                    NEXTVAL_NEXTTOKE.opval =
                        (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
                    PL_lex_stuff = NULL;
                    force_next(THING);
                }
-#endif
                if (!have_name) {
                    if (PL_curstash)
                        sv_setpvs(PL_subname, "__ANON__");
@@ -8855,9 +7938,7 @@ Perl_yylex(pTHX)
                        sv_setpvs(PL_subname, "__ANON__::__ANON__");
                    TOKEN(ANONSUB);
                }
-#ifndef PERL_MAD
                force_ident_maybe_lex('&');
-#endif
                TOKEN(SUB);
            }
 
@@ -9718,9 +8799,6 @@ S_scan_pat(pTHX_ char *start, I32 type)
     const char * const valid_flags =
        (const char *)((type == OP_QR) ? QR_PAT_MODS : M_PAT_MODS);
     char charset = '\0';    /* character set modifier */
-#ifdef PERL_MAD
-    char *modstart;
-#endif
 
     PERL_ARGS_ASSERT_SCAN_PAT;
 
@@ -9757,9 +8835,6 @@ S_scan_pat(pTHX_ char *start, I32 type)
            PmopSTASH_set(pm,PL_curstash);
        }
     }
-#ifdef PERL_MAD
-    modstart = s;
-#endif
 
     /* if qr/...(?{..}).../, then need to parse the pattern within a new
      * anon CV. False positives like qr/[(?{]/ are harmless */
@@ -9780,12 +8855,6 @@ S_scan_pat(pTHX_ char *start, I32 type)
     }
 
     while (*s && S_pmflag(aTHX_ valid_flags, &(pm->op_pmflags), &s, &charset)) {};
-#ifdef PERL_MAD
-    if (PL_madskills && modstart != s) {
-       SV* tmptoken = newSVpvn(modstart, s - modstart);
-       append_madprops(newMADPROP('m', MAD_SV, tmptoken, 0), (OP*)pm, 0);
-    }
-#endif
     /* issue a warning if /c is specified,but /g is not */
     if ((pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL))
     {
@@ -9808,9 +8877,6 @@ S_scan_subst(pTHX_ char *start)
     line_t first_line;
     I32 es = 0;
     char charset = '\0';    /* character set modifier */
-#ifdef PERL_MAD
-    char *modstart;
-#endif
     char *t;
 
     PERL_ARGS_ASSERT_SCAN_SUBST;
@@ -9823,19 +8889,10 @@ S_scan_subst(pTHX_ char *start)
        Perl_croak(aTHX_ "Substitution pattern not terminated");
 
     s = t;
-#ifdef PERL_MAD
-    if (PL_madskills) {
-       CURMAD('q', PL_thisopen);
-       CURMAD('_', PL_thiswhite);
-       CURMAD('E', PL_thisstuff);
-       CURMAD('Q', PL_thisclose);
-       PL_realtokenstart = s - SvPVX(PL_linestr);
-    }
-#endif
 
     first_start = PL_multi_start;
     first_line = CopLINE(PL_curcop);
-    s = scan_str(s,!!PL_madskills,FALSE,FALSE,NULL);
+    s = scan_str(s,FALSE,FALSE,FALSE,NULL);
     if (!s) {
        if (PL_lex_stuff) {
            SvREFCNT_dec(PL_lex_stuff);
@@ -9847,14 +8904,6 @@ S_scan_subst(pTHX_ char *start)
 
     pm = (PMOP*)newPMOP(OP_SUBST, 0);
 
-#ifdef PERL_MAD
-    if (PL_madskills) {
-       CURMAD('z', PL_thisopen);
-       CURMAD('R', PL_thisstuff);
-       CURMAD('Z', PL_thisclose);
-    }
-    modstart = s;
-#endif
 
     while (*s) {
        if (*s == EXEC_PAT_MOD) {
@@ -9867,14 +8916,6 @@ S_scan_subst(pTHX_ char *start)
        }
     }
 
-#ifdef PERL_MAD
-    if (PL_madskills) {
-       if (modstart != s)
-           curmad('m', newSVpvn(modstart, s - modstart));
-       append_madprops(PL_thismad, (OP*)pm, 0);
-       PL_thismad = 0;
-    }
-#endif
     if ((pm->op_pmflags & PMf_CONTINUE)) {
         Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), "Use of /c modifier is meaningless in s///" );
     }
@@ -9919,31 +8960,19 @@ S_scan_trans(pTHX_ char *start)
     U8 del;
     U8 complement;
     bool nondestruct = 0;
-#ifdef PERL_MAD
-    char *modstart;
-#endif
     char *t;
 
     PERL_ARGS_ASSERT_SCAN_TRANS;
 
     pl_yylval.ival = OP_NULL;
 
-    s = scan_str(start,!!PL_madskills,FALSE,FALSE,&t);
+    s = scan_str(start,FALSE,FALSE,FALSE,&t);
     if (!s)
        Perl_croak(aTHX_ "Transliteration pattern not terminated");
 
     s = t;
-#ifdef PERL_MAD
-    if (PL_madskills) {
-       CURMAD('q', PL_thisopen);
-       CURMAD('_', PL_thiswhite);
-       CURMAD('E', PL_thisstuff);
-       CURMAD('Q', PL_thisclose);
-       PL_realtokenstart = s - SvPVX(PL_linestr);
-    }
-#endif
 
-    s = scan_str(s,!!PL_madskills,FALSE,FALSE,NULL);
+    s = scan_str(s,FALSE,FALSE,FALSE,NULL);
     if (!s) {
        if (PL_lex_stuff) {
            SvREFCNT_dec(PL_lex_stuff);
@@ -9951,16 +8980,8 @@ S_scan_trans(pTHX_ char *start)
        }
        Perl_croak(aTHX_ "Transliteration replacement not terminated");
     }
-    if (PL_madskills) {
-       CURMAD('z', PL_thisopen);
-       CURMAD('R', PL_thisstuff);
-       CURMAD('Z', PL_thisclose);
-    }
 
     complement = del = squash = 0;
-#ifdef PERL_MAD
-    modstart = s;
-#endif
     while (1) {
        switch (*s) {
        case 'c':
@@ -9991,14 +9012,6 @@ S_scan_trans(pTHX_ char *start)
     PL_lex_op = o;
     pl_yylval.ival = nondestruct ? OP_TRANSR : OP_TRANS;
 
-#ifdef PERL_MAD
-    if (PL_madskills) {
-       if (modstart != s)
-           curmad('m', newSVpvn(modstart, s - modstart));
-       append_madprops(PL_thismad, o, 0);
-       PL_thismad = 0;
-    }
-#endif
 
     return s;
 }
@@ -10041,12 +9054,6 @@ S_scan_heredoc(pTHX_ char *s)
     const bool infile = PL_rsfp || PL_parser->filtered;
     const line_t origline = CopLINE(PL_curcop);
     LEXSHARED *shared = PL_parser->lex_shared;
-#ifdef PERL_MAD
-    I32 stuffstart = s - SvPVX(PL_linestr);
-    char *tstart;
-    PL_realtokenstart = -1;
-#endif
 
     PERL_ARGS_ASSERT_SCAN_HEREDOC;
 
@@ -10085,15 +9092,6 @@ S_scan_heredoc(pTHX_ char *s)
     *d = '\0';
     len = d - PL_tokenbuf;
 
-#ifdef PERL_MAD
-    if (PL_madskills) {
-       tstart = PL_tokenbuf + 1;
-       PL_thisclose = newSVpvn(tstart, len - 1);
-       tstart = SvPVX(PL_linestr) + stuffstart;
-       PL_thisopen = newSVpvn(tstart, s - tstart);
-       stuffstart = s - SvPVX(PL_linestr);
-    }
-#endif
 #ifndef PERL_STRICT_CR
     d = strchr(s, '\r');
     if (d) {
@@ -10118,17 +9116,6 @@ S_scan_heredoc(pTHX_ char *s)
        s = olds;
     }
 #endif
-#ifdef PERL_MAD
-    if (PL_madskills) {
-       tstart = SvPVX(PL_linestr) + stuffstart;
-       if (PL_thisstuff)
-           sv_catpvn(PL_thisstuff, tstart, s - tstart);
-       else
-           PL_thisstuff = newSVpvn(tstart, s - tstart);
-    }
-
-    stuffstart = s - SvPVX(PL_linestr);
-#endif
 
     tmpstr = newSV_type(SVt_PVIV);
     SvGROW(tmpstr, 80);
@@ -10194,15 +9181,6 @@ S_scan_heredoc(pTHX_ char *s)
            goto interminable;
        }
        sv_setpvn(tmpstr,d+1,s-d);
-#ifdef PERL_MAD
-       if (PL_madskills) {
-           if (PL_thisstuff)
-               sv_catpvn(PL_thisstuff, d + 1, s - d);
-           else
-               PL_thisstuff = newSVpvn(d + 1, s - d);
-           stuffstart = s - SvPVX(PL_linestr);
-       }
-#endif
        s += len - 1;
        /* the preceding stmt passes a newline */
        PL_parser->herelines++;
@@ -10252,15 +9230,6 @@ S_scan_heredoc(pTHX_ char *s)
       PL_linestr = newSVpvs("");
       PL_bufend = SvPVX(PL_linestr);
       while (1) {
-#ifdef PERL_MAD
-       if (PL_madskills) {
-           tstart = SvPVX(PL_linestr) + stuffstart;
-           if (PL_thisstuff)
-               sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
-           else
-               PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
-       }
-#endif
        PL_bufptr = PL_bufend;
        CopLINE_set(PL_curcop,
                    origline + 1 + PL_parser->herelines);
@@ -10278,9 +9247,6 @@ S_scan_heredoc(pTHX_ char *s)
             PL_bufend = SvEND(PL_linestr);
        }
        s = PL_bufptr;
-#ifdef PERL_MAD
-       stuffstart = s - SvPVX(PL_linestr);
-#endif
        PL_parser->herelines++;
        PL_last_lop = PL_last_uni = NULL;
 #ifndef PERL_STRICT_CR
@@ -10396,7 +9362,7 @@ S_scan_inputsymbol(pTHX_ char *start)
 
     if (d - PL_tokenbuf != len) {
        pl_yylval.ival = OP_GLOB;
-       s = scan_str(start,!!PL_madskills,FALSE,FALSE,NULL);
+       s = scan_str(start,FALSE,FALSE,FALSE,NULL);
        if (!s)
           Perl_croak(aTHX_ "Glob not terminated");
        return s;
@@ -10555,10 +9521,6 @@ S_scan_str(pTHX_ char *start, int keep_bracketed_quoted, int keep_delims, int re
     STRLEN termlen;            /* length of terminating string */
     int last_off = 0;          /* last position for nesting bracket */
     line_t herelines;
-#ifdef PERL_MAD
-    int stuffstart;
-    char *tstart;
-#endif
 
     PERL_ARGS_ASSERT_SCAN_STR;
 
@@ -10567,14 +9529,6 @@ S_scan_str(pTHX_ char *start, int keep_bracketed_quoted, int keep_delims, int re
        s = PEEKSPACE(s);
     }
 
-#ifdef PERL_MAD
-    if (PL_realtokenstart >= 0) {
-       stuffstart = PL_realtokenstart;
-       PL_realtokenstart = -1;
-    }
-    else
-       stuffstart = start - SvPVX(PL_linestr);
-#endif
     /* mark where we are, in case we need to report errors */
     CLINE;
 
@@ -10617,13 +9571,6 @@ S_scan_str(pTHX_ char *start, int keep_bracketed_quoted, int keep_delims, int re
     if (keep_delims)
        sv_catpvn(sv, s, termlen);
     s += termlen;
-#ifdef PERL_MAD
-    tstart = SvPVX(PL_linestr) + stuffstart;
-    if (PL_madskills && !PL_thisopen && !keep_delims) {
-       PL_thisopen = newSVpvn(tstart, s - tstart);
-       stuffstart = s - SvPVX(PL_linestr);
-    }
-#endif
     for (;;) {
        if (PL_encoding && !UTF && !re_reparse) {
            bool cont = TRUE;
@@ -10831,15 +9778,6 @@ S_scan_str(pTHX_ char *start, int keep_bracketed_quoted, int keep_delims, int re
        /* if we're out of file, or a read fails, bail and reset the current
           line marker so we can report where the unterminated string began
        */
-#ifdef PERL_MAD
-       if (PL_madskills) {
-           char * const tstart = SvPVX(PL_linestr) + stuffstart;
-           if (PL_thisstuff)
-               sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
-           else
-               PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
-       }
-#endif
        COPLINE_INC_WITH_HERELINES;
        PL_bufptr = PL_bufend;
        if (!lex_next_chunk(0)) {
@@ -10848,45 +9786,16 @@ S_scan_str(pTHX_ char *start, int keep_bracketed_quoted, int keep_delims, int re
            return NULL;
        }
        s = PL_bufptr;
-#ifdef PERL_MAD
-       stuffstart = 0;
-#endif
     }
 
     /* at this point, we have successfully read the delimited string */
 
     if (!PL_encoding || UTF || re_reparse) {
-#ifdef PERL_MAD
-       if (PL_madskills) {
-           char * const tstart = SvPVX(PL_linestr) + stuffstart;
-           const int len = s - tstart;
-           if (PL_thisstuff)
-               sv_catpvn(PL_thisstuff, tstart, len);
-           else
-               PL_thisstuff = newSVpvn(tstart, len);
-           if (!PL_thisclose && !keep_delims)
-               PL_thisclose = newSVpvn(s,termlen);
-       }
-#endif
 
        if (keep_delims)
            sv_catpvn(sv, s, termlen);
        s += termlen;
     }
-#ifdef PERL_MAD
-    else {
-       if (PL_madskills) {
-           char * const tstart = SvPVX(PL_linestr) + stuffstart;
-           const int len = s - tstart - termlen;
-           if (PL_thisstuff)
-               sv_catpvn(PL_thisstuff, tstart, len);
-           else
-               PL_thisstuff = newSVpvn(tstart, len);
-           if (!PL_thisclose && !keep_delims)
-               PL_thisclose = newSVpvn(s - termlen,termlen);
-       }
-    }
-#endif
     if (has_utf8 || (PL_encoding && !re_reparse))
        SvUTF8_on(sv);
 
@@ -11322,15 +10231,6 @@ S_scan_formline(pTHX_ char *s)
     SV * const stuff = newSVpvs("");
     bool needargs = FALSE;
     bool eofmt = FALSE;
-#ifdef PERL_MAD
-    char *tokenstart = s;
-    SV* savewhite = NULL;
-
-    if (PL_madskills) {
-       savewhite = PL_thiswhite;
-       PL_thiswhite = 0;
-    }
-#endif
 
     PERL_ARGS_ASSERT_SCAN_FORMLINE;
 
@@ -11379,22 +10279,11 @@ S_scan_formline(pTHX_ char *s)
        if ((PL_rsfp || PL_parser->filtered)
         && PL_parser->form_lex_state == LEX_NORMAL) {
            bool got_some;
-#ifdef PERL_MAD
-           if (PL_madskills) {
-               if (PL_thistoken)
-                   sv_catpvn(PL_thistoken, tokenstart, PL_bufend - tokenstart);
-               else
-                   PL_thistoken = newSVpvn(tokenstart, PL_bufend - tokenstart);
-           }
-#endif
            PL_bufptr = PL_bufend;
            COPLINE_INC_WITH_HERELINES;
            got_some = lex_next_chunk(0);
            CopLINE_dec(PL_curcop);
            s = PL_bufptr;
-#ifdef PERL_MAD
-           tokenstart = PL_bufptr;
-#endif
            if (!got_some)
                break;
        }
@@ -11411,12 +10300,10 @@ S_scan_formline(pTHX_ char *s)
                || *s2 == 013)
                s2++;
            if (*s2 == '{') {
-               start_force(PL_curforce);
                PL_expect = XTERMBLOCK;
                NEXTVAL_NEXTTOKE.ival = 0;
                force_next(DO);
            }
-           start_force(PL_curforce);
            NEXTVAL_NEXTTOKE.ival = 0;
            force_next(FORMLBRACK);
        }
@@ -11426,7 +10313,6 @@ S_scan_formline(pTHX_ char *s)
            else if (PL_encoding)
                sv_recode_to_utf8(stuff, PL_encoding);
        }
-       start_force(PL_curforce);
        NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0, stuff);
        force_next(THING);
     }
@@ -11435,15 +10321,6 @@ S_scan_formline(pTHX_ char *s)
        if (eofmt)
            PL_lex_formbrack = 0;
     }
-#ifdef PERL_MAD
-    if (PL_madskills) {
-       if (PL_thistoken)
-           sv_catpvn(PL_thistoken, tokenstart, s - tokenstart);
-       else
-           PL_thistoken = newSVpvn(tokenstart, s - tokenstart);
-       PL_thiswhite = savewhite;
-    }
-#endif
     return s;
 }
 
index 4f9127e..eb1839a 100644 (file)
--- a/uconfig.h
+++ b/uconfig.h
 /*#define PERL_PRIeldbl        "lle"   / **/
 /*#define PERL_SCNfldbl        "llf"   / **/
 
-/* PERL_MAD:
- *     This symbol, if defined, indicates that the Misc Attribution
- *     Declaration code should be conditionally compiled.
- */
-/*#define      PERL_MAD                / **/
-
 /* NEED_VA_COPY:
  *     This symbol, if defined, indicates that the system stores
  *     the variable argument list datatype, va_list, in a format
 #endif
 
 /* Generated from:
- * 4cb92587c221c8c3b0fe3f9c2fbab1293d6798f426cca6a0be90491d0fd04185 config_h.SH
- * 87a71147b46045d5a12e0e15b269db96e2af06d021d25ab516cfe4d0efb6b87b uconfig.sh
+ * a37f46da5285428077feb313bcbe68661740bac16d76fa658d723d9fcc91c2c4 config_h.SH
+ * 4b709c0b049c660c04c0932eaa8481f9ca6fdc697ec4ffaa86b7bef21ee886a8 uconfig.sh
  * ex: set ro: */
index 0dc4171..e8df3c2 100644 (file)
@@ -653,7 +653,6 @@ longlongsize=8
 longsize='4'
 lseeksize=4
 lseektype=int
-mad='undef'
 malloctype='int*'
 malloctype='void *'
 mmaptype='void *'
index da310af..228bee3 100644 (file)
 /*#define PERL_PRIeldbl        "e"     / **/
 /*#define PERL_SCNfldbl        "f"     / **/
 
-/* PERL_MAD:
- *     This symbol, if defined, indicates that the Misc Attribution
- *     Declaration code should be conditionally compiled.
- */
-/*#define      PERL_MAD                / **/
-
 /* NEED_VA_COPY:
  *     This symbol, if defined, indicates that the system stores
  *     the variable argument list datatype, va_list, in a format
index 4c1ae3d..2d9ebfd 100644 (file)
 /*#define PERL_PRIeldbl        "e"     / **/
 /*#define PERL_SCNfldbl        "f"     / **/
 
-/* PERL_MAD:
- *     This symbol, if defined, indicates that the Misc Attribution
- *     Declaration code should be conditionally compiled.
- */
-/*#define      PERL_MAD                / **/
-
 /* NEED_VA_COPY:
  *     This symbol, if defined, indicates that the system stores
  *     the variable argument list datatype, va_list, in a format