#!/usr/bin/perl -w
use strict;
use warnings;
use Encode;
use utf8;
use BerkeleyDB;
use vars qw( %rule %tail %root );
tie %rule, "BerkeleyDB::Hash", -Filename => "rule.db", -Flags => DB_RDONLY or die "cant";
tie %tail, "BerkeleyDB::Hash", -Filename => "tail.db", -Flags => DB_RDONLY or die "cant";
tie %root, "BerkeleyDB::Hash", -Filename => "root.db", -Flags => DB_RDONLY or die "cant";
my $cmda = eu("./query-morph.pl тест");
my $s = du($ARGV[0]) or die("need argument, word surface:\n$cmda\n");
my @res = ();
for(my $i=0; $i <= length($s); $i++) {
my ($left, $right) = (substr($s,0,$i), substr($s,$i));
if ( my $d = dk($root{ek($left)}) ) {
my $rightspace = join("", map { " " } split(//,$right));
print eu("$i \"$left.$rightspace\"\t$d\n");
my @paradigm_list = split /:/, $d;
shift @paradigm_list;
foreach my $num (@paradigm_list) {
if ( my $c = dk($tail{ek("$num:$right")}) ) {
print eu("\t\"$num:$right\"\t$c\n");
my @grammems_list = unpack "A2" x (length($c)/2), $c;
foreach my $l ( @grammems_list ) {
print eu("\t$l\t");
my $rule = dk($rule{ek($l)});
print eu("\t$rule\n");
if ( $rule =~ /мр-жр/ ) {
$rule =~ s/мр-жр/мр/;
push @res, $rule;
$rule =~ s/мр/жр/;
push @res, $rule;
} else {
push @res, $rule;
}
}
}
}
}
}
untie %rule; untie %tail; untie %root;
print "\nres:\n\t\t", eu(join("\n\t\t", @res)), "\n\n";
sub eu {
return encode("utf-8",shift);
}
sub du {
return decode("utf-8",shift);
}
sub ek {
return encode("koi8-r",shift);
}
sub dk {
return decode("koi8-r",shift);
}