Blame bin/verb_reverse.pl

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
}