use jspell; use Data::Dumper; use locale; jspell_dict("port"); loaddict("DICT","pessoal"); $word='\w+\b'; # regular expression for word # $m='___'; # marc of the currente position RULESM trad ($word)\s+($word)==>$dict{"$1 $2"}!! defined($dict{"$1 $2"}) ($word)==>$dict{$1}!! defined($dict{$1}) ($word)=e=> ucfirst($dict{lc($1)}) !!defined($dict{lc($1)}) ($word)=e=> procPalInd($1) !! not defined($dict{$1}) (.)==>$1 RULES posproc de ([ao]s?)==>d$1 o#1\s+($work)==>o $1!! gn_is({G=>"m",N=>"s"},$1) o#1\s+($work)==>os $1!! gn_is({G=>"m",N=>"p"},$1) o#1\s+($work)==>a $1!! gn_is({G=>"f",N=>"s"},$1) o#1\s+($work)==>as $1!! gn_is({G=>"f",N=>"p"},$1) um#1\s+($work)==>um $1!! gn_is({G=>"m",N=>"s"},$1) um#1\s+($work)==>uns $1!! gn_is({G=>"m",N=>"p"},$1) um#1\s+($work)==>uma $1!! gn_is({G=>"f",N=>"s"},$1) um#1\s+($work)==>umas $1!! gn_is({G=>"f",N=>"p"},$1) ENDRULES sub gn_is{my ($constraint,$word)=@_; scalar onethat($constraint,fea($word)); } for (@ARGV){ open(File,$_) or die; while(){ chomp; print posproc(trad($_)),"\n"; } close File;} savePern(); sub savePern { open(A,">>pessoal") or warn("nao encontrei fich. pessoal\n"); for(@novas) { print A "$_=$dict{$_}\n"} } sub artAgree{ my $art=shift; my $pal=shift; my @a= fea($pal); my $r; if ($a[0]{G} eq "m") { $r= "o"} elsif ($a[0]{G} eq "f") { $r= "a"} else { $r= "o"} if ($a[0]{N} eq "p") { $r.= "s"} {o => { o => "o", a => "a", os => "os", as => "as"}, um => { o => "um", a => "uma", os => "uns", as => "umas"}, }->{$art}{$r}; } sub loaddict{ my @l = @_; for(@l){ open(A,$_) or warn("nao encontrei $_\n"); while (){ if(/(.*)=(.*)/){$dict{$1}=$2;}} } } sub procPalInd{ # processa palavras indefinidas print "..\n"; my $p=shift; print STDERR "$p ? "; open(TTY,"/dev/tty") or die; my $r = ; close TTY; chomp $r; $dict{$p}=$r; push(@novas,$p); $r }