use jspell; use Data::Dumper; use locale; jspell_dict("port"); loaddict("DICT","pessoal"); $word='\w+'; # regular expression for word $m='___'; # marc of the currente position RULES trad =b=>$_ = "$m$_"; $m$==> $m($word)\s+($word)\b==>$dict{"$1 $2"}$m!! defined($dict{"$1 $2"}) $m($word)\b==>$dict{$1}$m!! defined($dict{$1}) $m($word)\b=e=> ucfirst($dict{lc($1)}) . $m !!defined($dict{lc($1)}) $m($word)\b=e=> procPalInd($1) . $m!! not defined($dict{$1}) $m(.)==>$1$m RULES posproc \bde ([ao]s?)\b==>d$1 (o|um)#1\s+($word)=e=> artAgree($1,$2). " $2" ENDRULES for (@ARGV){ open(File,$_) or die; while(){ print posproc(trad($_))}} 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(File,"/dev/tty") or die; my $r = ; close File; chomp $r; $dict{$p}=$r; push(@novas,$p); $r }