source: app/src/dgp/dgc @ f5d3b20

help
Last change on this file since f5d3b20 was 12d8443, checked in by pawelk <pawelk@…>, 17 years ago

Naproawiono dgc - teraz obsluguje tez komenatrze w linii z regula.

git-svn-id: svn://atos.wmid.amu.edu.pl/utt@34 e293616e-ec6a-49c2-aa92-f4a8b91c5d16

  • Property mode set to 100755
File size: 5.4 KB
RevLine 
[0214596]1#!/usr/bin/perl
2
3#package:       UAM Text Tools
4#component:     dgc (dg compiler)
5#version:       1.0
6#author:        Tomasz Obrebski
7
[19dfa5c]8# wymaga niejawnie programu canonize!!!!
[0214596]9#use lib "ENV{HOME}/.utt/lib/perl";
[19dfa5c]10
11use strict;
[0214596]12use Getopt::Long;
13use Data::Dumper;
14
15use attr;
[19dfa5c]16use File::HomeDir;
17
18my $systemconfigfile='/usr/local/etc/utt/dgc.conf';
19my $userconfigfile=home()."/.utt/dgc.conf";
20
21Getopt::Long::Configure('no_ignore_case_always');
[0214596]22
23my $help=0;
24my $catfile=0;
25my $dicfile=0;
26my $gramfile=0;
[19dfa5c]27my $outputfile=0;
[0214596]28
[19dfa5c]29#read configuration files###########################
30my $file;
31foreach $file ($systemconfigfile, $userconfigfile){
32  if(open(CONFIG, $file)){
33        while (<CONFIG>) {
34                chomp;
35                s/#.*//;
36                s/^\s+//;
37                s/\s+$//;
38                next unless length;
39                my ($name, $value) = split(/\s*=\s*/, $_, 2);
40                if(($name eq "catfile")or($name eq "c")){
41                        $catfile=$value;
42                }
43                elsif(($name eq "dicfile")or($name eq "d")){
44                        $dicfile=$value;
45                }
46                elsif(($name eq "gramfile")or($name eq "g")){
47                        $gramfile=$value;
48                }
49                elsif(($name eq "outputfile")or($name eq "o")){
50                        $outputfile=$value;
51                }
52                elsif(($name eq "help")or($name eq "h")){
53                        $help=1;
54                }
55
56        }
57        close CONFIG;
58  }
59}
60#########################################################
[0214596]61
62GetOptions("help|h" => \$help,
63           "catfile|c=s" => \$catfile,
64           "dicfile|d=s" => \$dicfile,
[19dfa5c]65           "gramfile|g=s" => \$gramfile,
66           "outputfile|o=s" => \$outputfile);
[0214596]67
68if($help)
69{
70    print <<'END'
[19dfa5c]71Usage: dgc [OPTIONS]
[0214596]72
73Options:
[19dfa5c]74   --catfile -c filename        List of syntactic categories.
75   --dicfile -d filename        Dictionary.
76   --gramfile -g filename       List of grammar rules.
77   --outputfile -o filename     Output filename.
[0214596]78   --help -h                    Help.
79END
80;
81    exit 0;
82}
83
84die("At least one of --cats and --dic must be given.\n") if !$catfile && !$dicfile;
85
[19dfa5c]86my $ncat=0;
87my $nrole=0;
88my $nsgl=0;
89my $nleft=0;
90my $nright=0;
91my $nreq=0;
92my $nlink=0;
93
[0214596]94my %cats;
95my %roles;
96my %agr;
97my %gov;
98
[19dfa5c]99if(!$outputfile) {
100        *OUTPUT = *STDOUT;
101}
102elsif($outputfile eq "-") {
103    *OUTPUT = *STDOUT;
104}
105else {
106        open(OUTPUT, ">$outputfile") or die("Can't open output file: $outputfile!");
107}
108
109
110
[0214596]111loadcats($catfile) if $catfile;
112extractcats($dicfile) if $dicfile;
113
114
[19dfa5c]115my $cats_re = qr/(?:$attr::cat_re\s*(?:,\s*$attr::cat_re)*)/;
[0214596]116
117# class parse_class:
118# /$attr::cat_re/g;
119
[19dfa5c]120
121if(!$gramfile) { 
122        *INPUT = *STDIN;
123}
124elsif($gramfile eq "-"){
125    *INPUT = *STDIN;
126}
127else {
128        open(INPUT, $gramfile) or die("Unable to open: $gramfile!");
129}
130
131while(<INPUT>)
[0214596]132{
[12d8443]133    s/#.*//;
134    s/^\s+//;
135    s/\s+$//;
136    if(/^AGR\s+(\S+)\s+(\S+)$/)
[0214596]137    {
138        push @{$agr{$1}}, $2;
139    }
[12d8443]140    elsif(/^GOV\s+(\S+)\s+(\S+)$/)
[0214596]141    {
142        push @{$gov{$1}}, attr::parse($2);
143    }
[12d8443]144    elsif(/^ROLE\s+\S+$/)
[0214596]145    {
146        $roles{$_}=1;
[12d8443]147        print OUTPUT "$_\n";
[0214596]148    }
[12d8443]149    elsif(/^SGL\s+\S+$/)
[0214596]150    {
151        ++$nsgl;
[12d8443]152        print OUTPUT "$_\n";
[0214596]153    }
[12d8443]154    elsif(/^REQ\s+(\S+)\s+(\S+)$/)
[0214596]155    {
[12d8443]156        print OUTPUT "#$_\n";
[0214596]157        my $cat = attr::parse $1;
158        for my $atomcat (keys %cats)
159        {
160            if(attr::match @$cat, @{$cats{$atomcat}})
161            {
[19dfa5c]162                print OUTPUT "REQ ".$atomcat." $2\n";
[0214596]163                ++$nreq;
164            }
165        }
166    }
[12d8443]167    elsif(/^LEFT\s+\S+$/)
[0214596]168    {
169        ++$nleft;
[12d8443]170        print OUTPUT "$_\n";
[0214596]171    }
[12d8443]172    elsif(/^RIGHT\s+\S+$/)
[0214596]173    {
174        ++$nright;
[12d8443]175        print OUTPUT "$_\n";
[0214596]176    }
[12d8443]177    elsif(my ($hs,$ds,$r) = /^LINK\s+($cats_re)\s+($cats_re)\s+(\S+)$/)
[0214596]178    {
[12d8443]179        print OUTPUT "#$_\n";
[19dfa5c]180        for my $h ($hs =~ /$attr::cat_re/g)
[0214596]181        {
[19dfa5c]182            for my $d ($ds =~ /$attr::cat_re/g)
[0214596]183            {
184                addlinks($h,$d,$r);
185            }
186        }
187    }
[12d8443]188    elsif(/^$/) {
189        # pomijamy puste linie oraz komentarze
190        }
191        else
[0214596]192    {
[12d8443]193        print STDERR "Illegal format: $_\n";
[0214596]194    }
195}
196
197
198sub addlinks
199{
[19dfa5c]200    my ($h,$d,$r) = @_;
[0214596]201
[19dfa5c]202    for my $a (@{$agr{$r}}) { print OUTPUT "#AGR $r $a\n"; }
203    for my $c (@{$gov{$r}}) { print OUTPUT "#GOV $r ".attr::unparse(@$c)."\n"; }
[0214596]204    my $head = attr::parse $h;
205    my $dep = attr::parse $d;
206   
207    for my $atomhead (keys %cats)
208    {
209        if(attr::match @$head, @{$cats{$atomhead}})
210        {
211          DEP:
212            for my $atomdep (keys %cats)
213            {
214                next DEP if ! attr::match @$dep, @{$cats{$atomdep}};
215               
216                for my $a (@{$agr{$r}})
217                {
218                    next DEP if ! attr::agree(@{$cats{$atomhead}},@{$cats{$atomdep}},$a);
219                }
220               
221                for my $c (@{$gov{$r}})
222                {
223                    next DEP if ! attr::match(@$c,@{$cats{$atomdep}});
224                }
225               
[19dfa5c]226                print OUTPUT "LINK ";
227                print OUTPUT $atomhead." ";
228                print OUTPUT $atomdep." $r\n";
[0214596]229                ++$nlink;
230               
231            }
232        }
233    }
234}
235
236
237printf STDERR "%6d CAT   statements\n", 0+keys(%cats);
238printf STDERR "%6d ROLE  statements\n", 0+keys(%roles);
239printf STDERR "%6d SGL   statements\n", $nsgl;
240printf STDERR "%6d REQ   statements\n", $nreq;
241printf STDERR "%6d LEFT  statements\n", $nleft;
242printf STDERR "%6d RIGHT statements\n", $nright;
243printf STDERR "%6d LINK  statements\n", $nlink;
244
245
246sub extractcats
247{
248    my $file = shift;
249    open DICFILE, "canonize $file |";
250    while(<DICFILE>)
251    {
252        while(/,([^[:space:];]+)/g)
253        {
[19dfa5c]254            my $cat=$1;
[0214596]255            next if !$cat || exists $cats{$cat};
256            $ncat++;
[19dfa5c]257            print OUTPUT "CAT $1\n";
[0214596]258            $cats{$cat}=attr::parse($cat);
259        }
260    }
261    close DICFILE;
262}
263
264
265sub loadcats
266{
267    my $file = shift;
268    open CATFILE, "canonize $file |";
269    while(<CATFILE>)
270    {
271        tr/ \t\n//d;
272        next if !$_ || exists $cats{$_};
[19dfa5c]273        print OUTPUT "CAT $_\n";
[0214596]274        ++$ncat;
275        $cats{$_}=attr::parse($_);
276    }
277    close CATFILE;
278}
[19dfa5c]279
Note: See TracBrowser for help on using the repository browser.