#!/usr/bin/perl -w use strict; use Data::Dumper; use Getopt::Long; my $modname = "Name.Prim"; my @import = qw/Name.Internals StringTable.Atom System.IO.Unsafe/; my $input = "names.txt"; GetOptions( "modname=s" => \$modname, "import=s" => \@import, "i=s" => \$input) or die "Error in command line arguments\n"; print "{- WARNING! Do not edit!!!\n"; print " This code is autogenerated from $input! -}\n\n"; print "{-# Language NoOverloadedStrings, MagicHash #-}\n"; print "module $modname where\n\n"; for (@import) { print "import $_\n"; } print "\n"; my %done; my ($nametype,$leader); open my $fd, "<", $input or die "$!: $input"; my %mods; my %quoted; while(<$fd>) { chomp; s/;.*$//; next unless /\S/; #next if /^\s*#/; ($nametype,$leader) = ($1,$2),next if /^([A-Za-z]+):([a-z]+):\s*$/; die "need nametype:leader declaration" unless defined $nametype && defined $leader; my ($name,$mod,$var,$smod); if ($nametype eq 'Quoted') { /^([0-9_A-Za-z]+)\s*$/ or die "unrecognized line $_"; $quoted{$1}++; next; } elsif ($nametype eq 'Module') { /^([0-9_A-Za-z.@]+)\s*$/ or die "unrecognized line $_"; $mod = $1; } else { /^([_A-Za-z0-9]+|\-)\s+(([0-9_A-Za-z.@]+)\.)?([-0-9*!)(\$@~#&|><=\/\+\.\,A-Za-z%:_\[\]?]+)\s*$/ or die "unrecognized line $_"; ($name,$mod,$var) = ($1,$3,$4); } if (defined $mod) { $smod = $mod; $smod =~ s/\.//g; $smod =~ s/\@/_/g; $smod = "mod_$smod"; $mods{$mod} = $smod; next unless defined $name; } $name = $leader . "_" . $name; next if $done{$name}; print "{-# NOINLINE $name #-}\n"; if (defined $mod) { print "$name = forgeName $nametype (Just $smod) \"$var\"\n"; } else { print "$name = forgeName $nametype Nothing \"$var\"\n"; } } print "\n"; foreach (sort keys %mods) { my $lmod = length $_; my $mod = $_; print "{-# NOINLINE $mods{$_} #-}\n"; print "$mods{$_} = Module (unsafePerformIO \$ addrToAtom_ \"$mod\"# $lmod# )\n"; } foreach (sort keys %quoted) { my $lmod = length $_; my $mod = $_; print "{-# NOINLINE q$_ #-}\n"; print "q$_ = quoteName $_\n"; }