# complete hack to generate stuff. # # We have Foo.hs, which generates # - Program/Foo.hs (the Syntax defn) # - Definition/Foo.hs (the entries for the dictionary) # - Equation/Foo.hs (the various derived equations) foreach (@ARGV) { local $file = $_; open(FILE,"$file"); $outfile = $file; if ($outfile =~ /^Library\/(.*)$/) { $outfile = $1; } open(OUTFILE,">Program/$outfile") || die "can not open Program/$outfile\n"; local $mode = 0; local @defns = (); while() { if (/^([a-z]\S+)\s+::/) { push(@defns,$1); } if ($mode == 0 && /^module ([^\s]+)(\s+.*)$/) { $module = $1; $fullmodule = $1; $rest = $2; print OUTFILE "module Program.$module"; $mode = 1; if ($rest =~ /where\s*$/) { print OUTFILE "$`where {\n"; $mode = 2; } else { print OUTFILE "$rest\n"; } } elsif ($mode == 1 && /^\s*\)\s*where/) { print OUTFILE " where {"; $mode = 2; } elsif ($mode == 1 && /where/) { print OUTFILE "$_ {"; $mode = 2; } elsif ($mode == 2 && (/^import/ || /^\s*$/)) { print OUTFILE "$_;"; } elsif ($mode == 2) { print OUTFILE "import Language.Haskell.TH;\n"; print OUTFILE "\n"; print OUTFILE "import Language.Haskell.ER.Syntax;\n"; print OUTFILE "import Language.Haskell.ER.HaskellRewrite;\n"; print OUTFILE "import Language.Haskell.ER.MiscRewrite;\n"; print OUTFILE "import Language.Haskell.ER.Utils;\n"; print OUTFILE "import Language.Haskell.ER.Frees;\n"; $pkg_name = "main"; print "$fullmodule\n"; if ($fullmodule =~ /^GHC/) { $pkg_name = "base"; } print OUTFILE "defns = \$(quoteModule \"$pkg_name\" \"$fullmodule\" [d|\n"; print OUTFILE "-- automatically included\n\n\n"; print OUTFILE "$_"; $mode = 3; } elsif ($mode == 3) { print OUTFILE "$_"; } else { print OUTFILE "-- $_"; } } print OUTFILE "|])\n}\n\n"; close(FILE); close(OUTFILE); if (1) { open(OUTFILE,">Definition/$file"); print OUTFILE "module Definition.$fullmodule where\n"; print OUTFILE "\n"; print OUTFILE "import Language.Haskell.TH\n"; print OUTFILE "import Language.Haskell.ER.Syntax\n"; print OUTFILE "import Language.Haskell.ER.HaskellRewrite\n"; print OUTFILE "import Language.Haskell.ER.MiscRewrite\n"; print OUTFILE "import Language.Haskell.ER.Utils\n"; print OUTFILE "import Language.Haskell.ER.Frees\n"; print OUTFILE "import Program.$fullmodule\n"; if ($fullmodule !~ /^Prelude/) { print OUTFILE "import $fullmodule\n"; } print OUTFILE "\n"; print OUTFILE "dictionary :: [ UniHaskellRewrite ]\n"; print OUTFILE "dictionary = map HaskellRewriteExp\n"; $sep = '['; foreach (@defns) { print OUTFILE "\t$sep defn_$_\n"; $sep = ','; } print OUTFILE "\t]\n\n"; foreach (@defns) { print OUTFILE "defn_$_ :: HaskellRewrite Exp\n"; if ($fullmodule =~ /^Prelude/) { print OUTFILE "defn_$_ = defn 'Prelude.$_ Program.$fullmodule.defns\n\n" } else { print OUTFILE "defn_$_ = defn '$fullmodule.$_ Program.$fullmodule.defns\n\n" } } close(OUTFILE); } }