#!/usr/bin/perl -w use strict; use Data::Dumper; my @fl; my @in; my @add; my %stuff; my @ds; open PR, ") { chomp; next unless /\S/; next if /^\s*#/; my @a = split /\s*,\s*/; push @ds, \@a; } print "module Name.Prim where\n\n"; print "import Name.Name\n\n"; my %done; my %rt; foreach my $d (@ds) { my $ctype = $d->[1]; my $hsname = $d->[0]; my $sname = $hsname; my $rt = $ctype; $rt =~ s/^[su]//; $rt{$rt}++; $sname =~ s/(.*)\.([A-Za-z0-9]+)$/$2/ or die "improper name"; my $mname = $1; next if $done{"tc_$sname"}++; next if $done{"dc_$sname"}++; print "{-# NOINLINE tc_$sname #-}\n"; print "tc_$sname = toName TypeConstructor (\"$mname\",\"$sname\")\n"; print "{-# NOINLINE dc_$sname #-}\n"; print "dc_$sname = toName DataConstructor \"$sname#\"\n"; } print "\n"; foreach my $ort (sort keys %rt) { my $rt = $ort; $rt =~ s/[ <>]/_/g; print "{-# NOINLINE rt_$rt #-}\n"; print "rt_$rt = toName RawType \"$ort\"\n"; } my ($nametype,$leader); open my $fd, ") { chomp; next unless /\S/; next if /^\s*#/; ($nametype,$leader) = ($1,$2),next if /^([A-Za-z]+):([a-z]+):\s*$/; /^([_A-Za-z0-9]+)\s+(([0-9_A-Za-z.@]+)\.)?([0-9)(#&|><=\/A-Za-z%:_\[\]]+)\s*$/ or die "unrecognized line $_"; my ($name,$mod,$var) = ($1,$3,$4); $name = $leader . "_" . $name; next if $done{$name}; print "{-# NOINLINE $name #-}\n"; if (defined $mod) { print "$name = toName $nametype (\"$mod\",\"$var\")\n"; } else { print "$name = toName $nametype \"$var\"\n"; } } print "\n\n";