|
Packit |
7ece30 |
#!/usr/bin/perl
|
|
Packit |
7ece30 |
#
|
|
Packit |
7ece30 |
# Скрипт для створення зворотніх форм дієслів з файлу афіксів
|
|
Packit |
7ece30 |
# Цей скрипт залежить від форматування файлу афіксів, навіть у коментарях
|
|
Packit |
7ece30 |
# Притримуйтесь, будь ласка, цього формату
|
|
Packit |
7ece30 |
#
|
|
Packit |
7ece30 |
# (c) Андрій Рисін, 2001, 2005
|
|
Packit |
7ece30 |
#
|
|
Packit |
7ece30 |
use strict;
|
|
Packit |
7ece30 |
use locale;
|
|
Packit |
7ece30 |
use utf8;
|
|
Packit |
7ece30 |
use encoding 'utf8';
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
my $UK_CAP ="'АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ";
|
|
Packit |
7ece30 |
my $UK_LOW ="'абвгґдеєжзиіїйклмнопрстуфхцчшщьюя";
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
my $start = '0';
|
|
Packit |
7ece30 |
my $tmp;
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
my $section_header;
|
|
Packit |
7ece30 |
my $line_count;
|
|
Packit |
7ece30 |
my @lines;
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
my %SFX_REV = (
|
|
Packit |
7ece30 |
A => "B", I => "J", K => "L", M => "N",
|
|
Packit |
7ece30 |
G => "H", C => "D", E => "F"
|
|
Packit |
7ece30 |
);
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
# для слів, які мають і "-ся" і "-сь"
|
|
Packit |
7ece30 |
#my $GENERIC ="([аяийіїоуюв])|(те)";
|
|
Packit |
7ece30 |
my $GENERIC ="([аяийіїоуюв])|(те)";
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
print "# DO NOT EDIT!! Use bin/verb_reverse.pl instead to generate this file from ukrainian.aff.VERB!\n";
|
|
Packit |
7ece30 |
print "\n";
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
while(<>) {
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
if( /^#/ ) {
|
|
Packit |
7ece30 |
if( $start eq '1' ) { # cutting off leading comments
|
|
Packit |
7ece30 |
push(@lines, $_);
|
|
Packit |
7ece30 |
}
|
|
Packit |
7ece30 |
next;
|
|
Packit |
7ece30 |
}
|
|
Packit |
7ece30 |
if( /^[\s]*$/ ) {
|
|
Packit |
7ece30 |
push(@lines, $_);
|
|
Packit |
7ece30 |
next;
|
|
Packit |
7ece30 |
}
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
$tmp = $_;
|
|
Packit |
7ece30 |
$start = '1';
|
|
Packit |
7ece30 |
$_ = $tmp;
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
# Заміна груп відповідними парами та зворотні інфінітиви
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
if( /SFX\s[AIKMGCE]\s[YN]\s[0-9]+/ ) {
|
|
Packit |
7ece30 |
my @SFX = split /\s+/, $_;
|
|
Packit |
7ece30 |
my $sfx_rev = $SFX_REV{$SFX[1]};
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
if( $line_count > 0 ) {
|
|
Packit |
7ece30 |
print "\n";
|
|
Packit |
7ece30 |
print $section_header, $line_count, "\n";
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
print @lines;
|
|
Packit |
7ece30 |
}
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
$section_header = $SFX[0] . ' ' . $sfx_rev . ' ' . $SFX[2] . ' ';
|
|
Packit |
7ece30 |
@lines = ();
|
|
Packit |
7ece30 |
$line_count = 0;
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
if( $SFX[1] =~ /[AIKM]/ ) {
|
|
Packit |
7ece30 |
push(@lines, "# Зворотня форма дієслів (-ся та -сь)\n");
|
|
Packit |
7ece30 |
push(@lines, "SFX ", $sfx_rev, " 0\tся ти # ~ти ~тися\n");
|
|
Packit |
7ece30 |
push(@lines, "SFX ", $sfx_rev, " 0\tсь ти # ~ти ~ись\n");
|
|
Packit |
7ece30 |
push(@lines, "SFX ", $sfx_rev, " ся сь тися # ~тися ~ись\n");
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
$line_count += 3;
|
|
Packit |
7ece30 |
}
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
next;
|
|
Packit |
7ece30 |
}
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
if( /SFX\s[AIKMGCE]\s/ ) {
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
my @LINE = split /\s+/, $_;
|
|
Packit |
7ece30 |
my @LINE_COMMENT = split /#/, $_;
|
|
Packit |
7ece30 |
my $comment = $LINE_COMMENT[1];
|
|
Packit |
7ece30 |
my $sfx_rev = $SFX_REV{$LINE[1]};
|
|
Packit |
7ece30 |
my $suffix_oldbody = $LINE[2];
|
|
Packit |
7ece30 |
my $suffix_newbody = $LINE[3];
|
|
Packit |
7ece30 |
my $suffix_match = $LINE[4];
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
# Створення правил для афіксів та прикладів
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
# перші дві умови для спецвипадку "мести - мететься"
|
|
Packit |
7ece30 |
if( ( !($suffix_oldbody =~ /^сти$/) || !($suffix_newbody =~ /^те$/))
|
|
Packit |
7ece30 |
&& ( !($suffix_oldbody =~ /^ти$/) || !($suffix_newbody =~ /^те$/) || !($suffix_match =~ /^ости$/))
|
|
Packit |
7ece30 |
&& $suffix_newbody =~ s/($GENERIC)$/$1сь/ ) {
|
|
Packit |
7ece30 |
$comment =~ s/([^#\s]\s+[$UK_LOW]+$GENERIC)(\s)/$1сь$4/;
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
push(@lines, $LINE[0]. " ". $sfx_rev. " ". $suffix_oldbody. "\t". $suffix_newbody. "\t". $suffix_match. "\t\t#". $comment);
|
|
Packit |
7ece30 |
push(@lines, $LINE[0]. " ". $sfx_rev. " ". get_reversed($suffix_oldbody, $suffix_newbody, $suffix_match, $comment));
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
$suffix_newbody =~ s/($GENERIC)сь$/$1ся/;
|
|
Packit |
7ece30 |
$comment =~ s/([^#\s]\s+[$UK_LOW]+$GENERIC)сь(\s)/$1ся$4/;
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
push(@lines, $LINE[0]. " ". $sfx_rev. " ". $suffix_oldbody. "\t". $suffix_newbody. "\t". $suffix_match. "\t\t#". $comment);
|
|
Packit |
7ece30 |
push(@lines, $LINE[0]. " ". $sfx_rev. " ". get_reversed($suffix_oldbody, $suffix_newbody, $suffix_match, $comment));
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
$line_count += 4;
|
|
Packit |
7ece30 |
}
|
|
Packit |
7ece30 |
else {
|
|
Packit |
7ece30 |
if( $suffix_newbody =~ s/([еє])$/$1ться/ ) { # для слів, які мають тільки "-ться"
|
|
Packit |
7ece30 |
$comment =~ s/([^#\s]\s+[$UK_LOW]+)(\s)/$1ться$2/;
|
|
Packit |
7ece30 |
}
|
|
Packit |
7ece30 |
else {
|
|
Packit |
7ece30 |
if ( $suffix_newbody =~ s/([$UK_LOW])$/$1ся/ ) { # для слів, які мають тільки "-ся"
|
|
Packit |
7ece30 |
$comment =~ s/([^#\s]\s+[$UK_LOW]+)(\s)/$1ся$2/;
|
|
Packit |
7ece30 |
}
|
|
Packit |
7ece30 |
else { # для слів, які не мали закінчень"
|
|
Packit |
7ece30 |
$suffix_newbody =~ s/0/ся/;
|
|
Packit |
7ece30 |
$comment =~ s/([^#\s]\s+[$UK_LOW]+)(\s)/$1ся$2/;
|
|
Packit |
7ece30 |
}
|
|
Packit |
7ece30 |
}
|
|
Packit |
7ece30 |
push(@lines, $LINE[0], " ", $sfx_rev, " ", $suffix_oldbody, "\t", $suffix_newbody, "\t", $suffix_match, "\t\t#", $comment);
|
|
Packit |
7ece30 |
push(@lines, $LINE[0], " ", $sfx_rev, " ", get_reversed($suffix_oldbody, $suffix_newbody, $suffix_match, $comment));
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
$line_count += 2;
|
|
Packit |
7ece30 |
}
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
}
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
}
|
|
Packit |
7ece30 |
if( $line_count > 0 ) {
|
|
Packit |
7ece30 |
print "\n";
|
|
Packit |
7ece30 |
print $section_header, $line_count, "\n";
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
print @lines;
|
|
Packit |
7ece30 |
}
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
# для слів що мають лише зворотню форму
|
|
Packit |
7ece30 |
# тобто для кожного напр. "вбити - вбитись ..." зробити додатково "вбитися - вбитись ..."
|
|
Packit |
7ece30 |
# suff_old, suff_new, suff_match, comment
|
|
Packit |
7ece30 |
sub get_reversed {
|
|
Packit |
7ece30 |
my $suffix_oldbody = @_[0];
|
|
Packit |
7ece30 |
my $suffix_newbody = @_[1];
|
|
Packit |
7ece30 |
my $suffix_match = @_[2];
|
|
Packit |
7ece30 |
my $comment = @_[3];
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
if( $suffix_oldbody eq "0" ) {
|
|
Packit |
7ece30 |
$suffix_oldbody = "ся";
|
|
Packit |
7ece30 |
}
|
|
Packit |
7ece30 |
else {
|
|
Packit |
7ece30 |
$suffix_oldbody .= "ся";
|
|
Packit |
7ece30 |
}
|
|
Packit |
7ece30 |
$suffix_match .= "ся";
|
|
Packit |
7ece30 |
$comment =~ s/^([\s]*[$UK_LOW]+ти)([\s]+)/$1ся$2/;
|
|
Packit |
7ece30 |
|
|
Packit |
7ece30 |
return $suffix_oldbody . "\t" . $suffix_newbody . "\t" . $suffix_match . "\t\t#" . $comment;
|
|
Packit |
7ece30 |
}
|