File Coverage

blib/lib/Lingua/Jspell/EAGLES.pm
Criterion Covered Total %
statement 6 10 60.0
branch 0 2 0.0
condition n/a
subroutine 2 3 66.6
pod n/a
total 8 15 53.3


line stmt bran cond sub pod time code
1             package Lingua::Jspell::EAGLES;
2              
3             # Mais uma vez, isto tudo é específico do português.
4             # algum código devia passar a ser baseado num YAML qualquer
5             # que defina a estrutura certa.
6             #
7             # para já, não abrir demasiadas frentes.
8              
9 2     2   14 use warnings;
  2         15  
  2         68  
10 2     2   11 use strict;
  2         4  
  2         3562  
11              
12             our $VERSION = '1.96';
13              
14             # modo: {I}ndicativo, {S}ubjuntivo, i{M}perativo,
15             # i{N}finitivo, {G}erundio, {P}articipio
16             # tempo: {P}resente, {I}mperfeito, {F}uturo,
17             # pas{S}ado, {C}ondicional
18             my %temposverbais = (
19             ip => "NE", # infinitivo pessoal ???FIXME(tempo E = pEssoal)
20             inf => "N0", # infinitivo
21             pp => "IS", # pretérito perfeito (simples)
22             ppa => "P0", # particípio passado
23             pc => "SP", # presente do conjuntivo
24             pic => "SI", # pretérito imperfeito do conjuntivo
25             c => "IC", # condicional
26             p => "IP", # presente
27             fc => "SF", # futuro do conjuntivo
28             g => "G0", # gerúndio
29             pmp => "IM", # pretérito mais que perfeito ???FIXME (tempo M = mais que perf.)
30             pi => "II", # pretérito Imperfeito
31             f => "IF", # Futuro
32             i => "M0", # iMperativo
33             );
34              
35             # NUNCA NA VIDA JUNTAR ESTAS DUAS LINHAS
36             # NUMA ÚNICA OU A REGRA DO a_nc DEIXA DE
37             # FUNCIONAR.
38              
39             my %rules;
40             %rules = (
41             ## --[ Pronomes - Artigos ]--
42             art => sub { my %fea = @_;
43             return "D"
44             . (exists($fea{CLA}) && $fea{CLA} eq "indef" ? "I":"A")
45             . "0"
46             . uc($fea{G})
47             . uc($fea{N})
48             . "0";
49             },
50             ## --[ Números Cardinais ]--
51             card => sub {
52             my %fea = @_;
53             return "Z0" . uc($fea{G} || "0") . uc($fea{N} || "0")
54             },
55             ## --[ Números Ordinais ]--
56             nord => sub {
57             my %fea = @_;
58             return "AO0" . uc($fea{G} || "0") . uc($fea{N} || "0") . "0"
59             },
60             ## --[ Pronomes Pessoais ]--
61             ppes => sub {
62             my %fea = @_;
63             my $tag = "PP";
64            
65             # pessoa (1,2,3)
66             $tag .= uc($fea{P} || 0);
67              
68             # género (M,F,Comum,Neutro)
69             my $G = exists $fea{G} ? uc $fea{G} : "0";
70             $G = "C" if $G eq "2";
71             $G = "0" if $G eq "_"; # XXX ????????
72             $tag .= $G;
73              
74             # Numero (S, P, N --impessoal/invariavel)
75             $tag .= exists $fea{P}
76             ? ($fea{P} =~ /[SP]/i ? uc($fea{P}) : "N")
77             : "0";
78             # Caso (nominativo, acusativo, dativo, obliquo)
79             $tag .= exists $fea{C} ? uc($fea{C}) : "0";
80              
81             # possuidor (Singluar, Plural)
82             # XXX --- temos disto? Não --> so nos ppos
83             $tag .= "0"
84            
85             },
86             ## --[ Pronomes Possessivos ]--
87             ppos => sub {
88             my %fea = @_;
89             return "PX"
90             . uc($fea{P} || "0")
91             . uc($fea{G} || "0")
92             . uc($fea{N} || "0")
93             . "0"
94             . uc($fea{NP} || "0")
95             ;
96            
97             # pessoa (1,2,3)
98             # género (M,F,Comum,Neutro)
99             # Numero (S, P, N --impessoal/invariavel)
100             # Caso (nominativo, acusativo, dativo, obliquo)
101             # possuidor (Singluar, Plural)
102             },
103             ## --[ Pronomes Indefinido ]--
104             pind => sub {
105             my %fea = @_;
106             my $tag = "PI"
107             . "0"
108             . uc($fea{G} || "0")
109             . uc($fea{N} || "0")
110             . "0"
111             . "0"
112             ;
113             $tag =~ s/_/0/g;
114             $tag;
115            
116             # pessoa (1,2,3)
117             # género (M,F,Comum,Neutro)
118             # Numero (S, P, N --impessoal/invariavel)
119             # Caso (nominativo, acusativo, dativo, obliquo)
120             # possuidor (Singluar, Plural)
121             },
122             ## --[ Pronomes Relativos ]--
123             prel => sub {
124             my %fea = @_;
125             my $tag = "PR"
126             . "0"
127             . uc($fea{G} || "0")
128             . uc($fea{N} || "0")
129             . uc($fea{C} || "0")
130             . "0"
131             ;
132             $tag =~ s/_/0/g;
133             $tag;
134             # pessoa (1,2,3)
135             # género (M,F,Comum,Neutro)
136             # Numero (S, P, N --impessoal/invariavel)
137             # Caso (nominativo, acusativo, dativo, obliquo)
138             # possuidor (Singluar, Plural)
139             },
140             ## --[ Pronomes Demonstrativos ]--
141             pdem => sub {
142             my %fea = @_;
143             return "PD"
144             . "0"
145             . uc($fea{G} || "0")
146             . uc($fea{N} || "0")
147             . "00";
148            
149             # pessoa (1,2,3)
150             # género (M,F,Comum,Neutro)
151             # Numero (S, P, N --impessoal/invariavel)
152             # Caso (nominativo, acusativo, dativo, obliquo)
153             # possuidor (Singluar, Plural)
154             },
155             ## --[ Pronomes interrogativos ]--
156             pint => sub {
157             my %fea = @_;
158             my $tag = "PT";
159            
160             # pessoa (1,2,3)
161             # género (M,F,Comum,Neutro)
162             # Numero (S, P, N --impessoal/invariavel)
163             # Caso (nominativo, acusativo, dativo, obliquo)
164             # possuidor (Singluar, Plural)
165             },
166             ## --[ Verbos ]--
167             v => sub {
168             my %fea = @_;
169             my $tag = "V";
170              
171             # (XXX) tipo (principal, auxiliar, semiauxiliar...)
172             $tag .= "0";
173             $tag .= ( $fea{rad} eq "ter" ? "A"
174             : $fea{rad} eq "ser" ? "S"
175             : "M"
176             );
177              
178            
179             $tag .= $temposverbais{$fea{T}} || "00";
180              
181             # pessoa (1,2,3) -- 1_3 é desdobrado abaixo
182             $tag .= exists($fea{P}) ? $fea{P} : "0";
183              
184             # numero (S, P)
185             $tag .= exists($fea{N}) ? uc($fea{N}) : "0";
186              
187             # genero (M,F)
188             $tag .= exists($fea{G}) ? uc($fea{G}) : "0";
189              
190             # Desdobrar pessoa.
191             if ($tag =~ /1_3/) {
192             my ($one, $three) = ($tag) x 2;
193             $one =~ s/1_3/1/;
194             $three =~ s/1_3/3/;
195             return ($one, $three)
196             } else {
197             return $tag;
198             }
199             },
200             ## --[ Preposições ]--
201             prep => sub { "SPS00" },
202             ## --[ Advérbios ]--
203             adv => sub {
204             my %fea = @_;
205             my $tag = "R";
206             $tag .= exists($fea{SUBCAT}) && $fea{SUBCAT} eq "neg" ? "N" : "G";
207             return $tag;
208             },
209             ## --[ Interjeições ]--
210             in => sub { return "I" },
211             ## --[ Conjunções ]--
212             con => sub { return "C0" },
213             ## --[ Contrações ]--
214             punct => sub { return "F" },
215             ## --[ Contrações ]--
216             cp => sub {
217             my %fea = @_;
218             return "SPC" . uc($fea{G} || "0") . uc($fea{N} || "0")
219             },
220             ## --[ Nomes Comuns ]--
221             nc => sub {
222             my %fea = @_;
223             my $tag = "NC";
224              
225             my $gen = uc($fea{G} || '0');
226             $gen =~ s/[^MF0]/C/i;
227             $tag .= $gen;
228              
229             my $num = uc($fea{N} || '0');
230             $num =~ s/[^SP0]/N/;
231             $tag .= $num;
232              
233             # tipo de nome
234             $tag .= "00";
235              
236             my $grad = $fea{GR} || "";
237             $grad =~ s/dim/D/i;
238             $grad =~ s/aum/A/i;
239             $grad = "0" unless $grad =~ /^[DA]$/;
240              
241             $tag .= $grad;
242              
243             return $tag;
244             },
245             ## --[ Nomes Próprios ]--
246             np => sub {
247             my %fea = @_;
248             my $tag = "NP";
249              
250             my $gen = uc($fea{G} || '0');
251             $gen =~ s/[^MF0]/C/;
252             $tag .= $gen;
253              
254             my $num = uc($fea{N} || '0');
255             $num =~ s/[^SP0]/N/;
256             $tag .= $num;
257              
258             $tag .= ($fea{SEM} || "") =~ /^p/i ? "SP" : "V0";
259            
260             my $grad = $fea{GR} || "";
261             $grad =~ s/dim/D/i;
262             $grad =~ s/aum/A/i;
263             $grad = "0" unless $grad =~ /^[DA]$/;
264             $tag .= $grad;
265              
266             return $tag;
267             },
268             ## --[ Adjetivos ]--
269             adj => sub {
270             my %fea = @_;
271             my $tag = "A0";
272              
273             my $grad = $fea{GR} || "";
274             $grad =~ s/dim/D/i;
275             $grad =~ s/aum/A/i;
276             $grad =~ s/sup/S/i;
277             $grad = "0" unless $grad =~ /^[DSA]$/;
278             $tag .= $grad;
279              
280             my $gen = uc($fea{G} || '0');
281             $gen =~ s/[^MF0]/C/;
282             $tag .= $gen;
283              
284             my $num = uc($fea{N} || '0');
285             $num =~ s/[^SP0]/N/;
286             $tag .= $num;
287              
288             return $tag . "0";
289             },
290             ## --[ Nomes e Adjetivos ]--
291             a_nc => sub {
292             return ( $rules{nc}->(@_) , $rules{adj}->(@_) );
293             },
294             );
295              
296             sub _cat2eagles {
297 0     0     my %fea = @_;
298              
299 0 0         if (exists($rules{$fea{CAT}})) {
300 0           return $rules{$fea{CAT}}->(%fea);
301             } else {
302 0           return "_UNK"
303             }
304             }
305              
306             1;
307              
308             __END__