chiark / gitweb /
82c896dcba4fe5ca376e07e2674024c4dab97af9
[appendix-a6.git] / parse
1 #!/usr/bin/perl -w
2 use strict;
3 use utf8;
4
5 use Data::Printer;
6
7 binmode STDIN, 'encoding(UTF-8)' or die;
8 binmode STDOUT, 'encoding(UTF-8)' or die;
9 binmode STDERR, 'encoding(UTF-8)' or die;
10
11 our @choices;
12 our %choices;
13 our @invotes;
14 our $defcho;
15
16 sub addchoice {
17     my $choname = shift @_;
18     my $cho = $choices{$choname} = { @_, Index => (scalar @choices) };
19     push @choices, $choname;
20     return $cho;
21 }
22
23 while (<>) {
24     s/\s+$//;
25     next if m/^\s*\#/;
26     next unless m/\S/;
27     if (m/^([A-Z]+)\s*\=\s*(\S.*)$/) {
28         my ($choname, $desc) = ($1,$2);
29         my $cho = addchoice($choname, Desc => $desc);
30         if ($desc =~ m/\[(\d+):(\d+)\]/) {
31             $cho->{Smaj} = [$1,$2];
32         } elsif ($desc =~ m/\[default\]/) {
33             $defcho = $cho;
34         }
35     } elsif (m/^V:\s+(\S+)\s+(\S.*)/) {
36         push @invotes, [ $1, $2 ];
37     } else {
38         die "invalid input";
39     }
40 }
41
42 $defcho ||= $choices{FD};
43 if (!$defcho) {
44     $defcho = addchoice('FD', Desc => "Further Discussion");
45 }
46 my $defi = $defcho->{Index};
47 die "FD has smaj?!" if $defcho->{Smaj};
48
49 our @vab; # $vab[$ia][$ib] = V(A,B)
50
51 foreach my $iv (@invotes) {
52     my ($votestr,$voter) = @$iv;
53     eval {
54         length $votestr eq @choices or die "wrong vote vector length";
55         my @vs = split //, $votestr;
56         foreach my $ix (0..$#vs) {
57             my $vchr = $vs[$ix];
58             if ($vchr eq '-') {
59                 $vs[$ix] = 1000;
60             } elsif ($vchr =~ m/[0-9a-z]/) {
61                 $vs[$ix] = ord($vchr);
62             } else {
63                 die "bad vote char";
64             }
65         }
66         foreach my $ia (0..$#vs) {
67             foreach my $ib ($ia+1..$#vs) {
68                 my $va = $vs[$ia];
69                 my $vb = $vs[$ib];
70                 if ($va < $vb) { $vab[$ia][$ib]++; }
71                 elsif ($vb < $va) { $vab[$ib][$ia]++; }
72                 print "\$vab[$ia][$ib]=$vab[$ia][$ib] # $voter $va<$vb\n";
73                 print "\$vab[$ib][$ia]=$vab[$ib][$ia] # $voter $va>$vb\n";
74             }
75         }
76     };
77     die "voter $voter $@" if $@;
78 }
79
80 foreach my $iy (-2..$#choices) {
81     foreach my $ix (-2..$#choices) {
82         if ($iy==-1) {
83             if ($ix==-1) {
84                 printf "+" or die;
85             } else {
86                 printf "------" or die;
87             }
88         } elsif ($ix==-1) {
89             printf "|" or die;
90         } elsif ($ix==-2 && $iy==-2) {
91             printf "V(Y,X)" or die;
92         } elsif ($iy==-2) {
93             printf "%5s ", $choices[$ix] or die $!;
94         } elsif ($ix==-2) {
95             printf "%5s ", $choices[$iy] or die $!;
96         } else {
97             my $v = \( $vab[$iy][$ix] );
98             $$v += 0;
99             if ($$v) {
100                 printf "%5d ", $$v or die $!;
101             } else {
102                 printf "%5s ", "" or die $!;
103             }
104         }
105     }
106     printf "\n" or die $!;
107 }
108
109 #p %choices;
110 #p @vab;