xref: /Lucene/lucene/analysis/common/src/java/org/tartarus/snowball/ext/FinnishStemmer.java (revision 0b1d8ccba6cf394f707a09217813a25ec1504e50)
1 // Generated by Snowball 2.0.0 - https://snowballstem.org/
2 
3 package org.tartarus.snowball.ext;
4 
5 import org.tartarus.snowball.Among;
6 
7 /**
8  * This class implements the stemming algorithm defined by a snowball script.
9  *
10  * <p>Generated by Snowball 2.0.0 - https://snowballstem.org/
11  */
12 @SuppressWarnings("unused")
13 public class FinnishStemmer extends org.tartarus.snowball.SnowballStemmer {
14 
15   private static final long serialVersionUID = 1L;
16   private static final java.lang.invoke.MethodHandles.Lookup methodObject =
17       java.lang.invoke.MethodHandles.lookup();
18 
19   private static final Among a_0[] = {
20     new Among("pa", -1, 1),
21     new Among("sti", -1, 2),
22     new Among("kaan", -1, 1),
23     new Among("han", -1, 1),
24     new Among("kin", -1, 1),
25     new Among("h\u00E4n", -1, 1),
26     new Among("k\u00E4\u00E4n", -1, 1),
27     new Among("ko", -1, 1),
28     new Among("p\u00E4", -1, 1),
29     new Among("k\u00F6", -1, 1)
30   };
31 
32   private static final Among a_1[] = {
33     new Among("lla", -1, -1),
34     new Among("na", -1, -1),
35     new Among("ssa", -1, -1),
36     new Among("ta", -1, -1),
37     new Among("lta", 3, -1),
38     new Among("sta", 3, -1)
39   };
40 
41   private static final Among a_2[] = {
42     new Among("ll\u00E4", -1, -1),
43     new Among("n\u00E4", -1, -1),
44     new Among("ss\u00E4", -1, -1),
45     new Among("t\u00E4", -1, -1),
46     new Among("lt\u00E4", 3, -1),
47     new Among("st\u00E4", 3, -1)
48   };
49 
50   private static final Among a_3[] = {new Among("lle", -1, -1), new Among("ine", -1, -1)};
51 
52   private static final Among a_4[] = {
53     new Among("nsa", -1, 3),
54     new Among("mme", -1, 3),
55     new Among("nne", -1, 3),
56     new Among("ni", -1, 2),
57     new Among("si", -1, 1),
58     new Among("an", -1, 4),
59     new Among("en", -1, 6),
60     new Among("\u00E4n", -1, 5),
61     new Among("ns\u00E4", -1, 3)
62   };
63 
64   private static final Among a_5[] = {
65     new Among("aa", -1, -1),
66     new Among("ee", -1, -1),
67     new Among("ii", -1, -1),
68     new Among("oo", -1, -1),
69     new Among("uu", -1, -1),
70     new Among("\u00E4\u00E4", -1, -1),
71     new Among("\u00F6\u00F6", -1, -1)
72   };
73 
74   private static final Among a_6[] = {
75     new Among("a", -1, 8),
76     new Among("lla", 0, -1),
77     new Among("na", 0, -1),
78     new Among("ssa", 0, -1),
79     new Among("ta", 0, -1),
80     new Among("lta", 4, -1),
81     new Among("sta", 4, -1),
82     new Among("tta", 4, 2),
83     new Among("lle", -1, -1),
84     new Among("ine", -1, -1),
85     new Among("ksi", -1, -1),
86     new Among("n", -1, 7),
87     new Among("han", 11, 1),
88     new Among("den", 11, -1, "r_VI", methodObject),
89     new Among("seen", 11, -1, "r_LONG", methodObject),
90     new Among("hen", 11, 2),
91     new Among("tten", 11, -1, "r_VI", methodObject),
92     new Among("hin", 11, 3),
93     new Among("siin", 11, -1, "r_VI", methodObject),
94     new Among("hon", 11, 4),
95     new Among("h\u00E4n", 11, 5),
96     new Among("h\u00F6n", 11, 6),
97     new Among("\u00E4", -1, 8),
98     new Among("ll\u00E4", 22, -1),
99     new Among("n\u00E4", 22, -1),
100     new Among("ss\u00E4", 22, -1),
101     new Among("t\u00E4", 22, -1),
102     new Among("lt\u00E4", 26, -1),
103     new Among("st\u00E4", 26, -1),
104     new Among("tt\u00E4", 26, 2)
105   };
106 
107   private static final Among a_7[] = {
108     new Among("eja", -1, -1),
109     new Among("mma", -1, 1),
110     new Among("imma", 1, -1),
111     new Among("mpa", -1, 1),
112     new Among("impa", 3, -1),
113     new Among("mmi", -1, 1),
114     new Among("immi", 5, -1),
115     new Among("mpi", -1, 1),
116     new Among("impi", 7, -1),
117     new Among("ej\u00E4", -1, -1),
118     new Among("mm\u00E4", -1, 1),
119     new Among("imm\u00E4", 10, -1),
120     new Among("mp\u00E4", -1, 1),
121     new Among("imp\u00E4", 12, -1)
122   };
123 
124   private static final Among a_8[] = {new Among("i", -1, -1), new Among("j", -1, -1)};
125 
126   private static final Among a_9[] = {new Among("mma", -1, 1), new Among("imma", 0, -1)};
127 
128   private static final char g_AEI[] = {17, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8};
129 
130   private static final char g_C[] = {119, 223, 119, 1};
131 
132   private static final char g_V1[] = {17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32};
133 
134   private static final char g_V2[] = {17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32};
135 
136   private static final char g_particle_end[] = {
137     17, 97, 24, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32
138   };
139 
140   private boolean B_ending_removed;
141   private java.lang.StringBuilder S_x = new java.lang.StringBuilder();
142   private int I_p2;
143   private int I_p1;
144 
r_mark_regions()145   private boolean r_mark_regions() {
146     I_p1 = limit;
147     I_p2 = limit;
148     golab0:
149     while (true) {
150       int v_1 = cursor;
151       lab1:
152       {
153         if (!(in_grouping(g_V1, 97, 246))) {
154           break lab1;
155         }
156         cursor = v_1;
157         break golab0;
158       }
159       cursor = v_1;
160       if (cursor >= limit) {
161         return false;
162       }
163       cursor++;
164     }
165     golab2:
166     while (true) {
167       lab3:
168       {
169         if (!(out_grouping(g_V1, 97, 246))) {
170           break lab3;
171         }
172         break golab2;
173       }
174       if (cursor >= limit) {
175         return false;
176       }
177       cursor++;
178     }
179     I_p1 = cursor;
180     golab4:
181     while (true) {
182       int v_3 = cursor;
183       lab5:
184       {
185         if (!(in_grouping(g_V1, 97, 246))) {
186           break lab5;
187         }
188         cursor = v_3;
189         break golab4;
190       }
191       cursor = v_3;
192       if (cursor >= limit) {
193         return false;
194       }
195       cursor++;
196     }
197     golab6:
198     while (true) {
199       lab7:
200       {
201         if (!(out_grouping(g_V1, 97, 246))) {
202           break lab7;
203         }
204         break golab6;
205       }
206       if (cursor >= limit) {
207         return false;
208       }
209       cursor++;
210     }
211     I_p2 = cursor;
212     return true;
213   }
214 
r_R2()215   private boolean r_R2() {
216     if (!(I_p2 <= cursor)) {
217       return false;
218     }
219     return true;
220   }
221 
r_particle_etc()222   private boolean r_particle_etc() {
223     int among_var;
224     if (cursor < I_p1) {
225       return false;
226     }
227     int v_2 = limit_backward;
228     limit_backward = I_p1;
229     ket = cursor;
230     among_var = find_among_b(a_0);
231     if (among_var == 0) {
232       limit_backward = v_2;
233       return false;
234     }
235     bra = cursor;
236     limit_backward = v_2;
237     switch (among_var) {
238       case 1:
239         if (!(in_grouping_b(g_particle_end, 97, 246))) {
240           return false;
241         }
242         break;
243       case 2:
244         if (!r_R2()) {
245           return false;
246         }
247         break;
248     }
249     slice_del();
250     return true;
251   }
252 
r_possessive()253   private boolean r_possessive() {
254     int among_var;
255     if (cursor < I_p1) {
256       return false;
257     }
258     int v_2 = limit_backward;
259     limit_backward = I_p1;
260     ket = cursor;
261     among_var = find_among_b(a_4);
262     if (among_var == 0) {
263       limit_backward = v_2;
264       return false;
265     }
266     bra = cursor;
267     limit_backward = v_2;
268     switch (among_var) {
269       case 1:
270         {
271           int v_3 = limit - cursor;
272           lab0:
273           {
274             if (!(eq_s_b("k"))) {
275               break lab0;
276             }
277             return false;
278           }
279           cursor = limit - v_3;
280         }
281         slice_del();
282         break;
283       case 2:
284         slice_del();
285         ket = cursor;
286         if (!(eq_s_b("kse"))) {
287           return false;
288         }
289         bra = cursor;
290         slice_from("ksi");
291         break;
292       case 3:
293         slice_del();
294         break;
295       case 4:
296         if (find_among_b(a_1) == 0) {
297           return false;
298         }
299         slice_del();
300         break;
301       case 5:
302         if (find_among_b(a_2) == 0) {
303           return false;
304         }
305         slice_del();
306         break;
307       case 6:
308         if (find_among_b(a_3) == 0) {
309           return false;
310         }
311         slice_del();
312         break;
313     }
314     return true;
315   }
316 
r_LONG()317   public boolean r_LONG() {
318     if (find_among_b(a_5) == 0) {
319       return false;
320     }
321     return true;
322   }
323 
r_VI()324   public boolean r_VI() {
325     if (!(eq_s_b("i"))) {
326       return false;
327     }
328     if (!(in_grouping_b(g_V2, 97, 246))) {
329       return false;
330     }
331     return true;
332   }
333 
r_case_ending()334   private boolean r_case_ending() {
335     int among_var;
336     if (cursor < I_p1) {
337       return false;
338     }
339     int v_2 = limit_backward;
340     limit_backward = I_p1;
341     ket = cursor;
342     among_var = find_among_b(a_6);
343     if (among_var == 0) {
344       limit_backward = v_2;
345       return false;
346     }
347     bra = cursor;
348     limit_backward = v_2;
349     switch (among_var) {
350       case 1:
351         if (!(eq_s_b("a"))) {
352           return false;
353         }
354         break;
355       case 2:
356         if (!(eq_s_b("e"))) {
357           return false;
358         }
359         break;
360       case 3:
361         if (!(eq_s_b("i"))) {
362           return false;
363         }
364         break;
365       case 4:
366         if (!(eq_s_b("o"))) {
367           return false;
368         }
369         break;
370       case 5:
371         if (!(eq_s_b("\u00E4"))) {
372           return false;
373         }
374         break;
375       case 6:
376         if (!(eq_s_b("\u00F6"))) {
377           return false;
378         }
379         break;
380       case 7:
381         int v_3 = limit - cursor;
382         lab0:
383         {
384           int v_4 = limit - cursor;
385           lab1:
386           {
387             int v_5 = limit - cursor;
388             lab2:
389             {
390               if (!r_LONG()) {
391                 break lab2;
392               }
393               break lab1;
394             }
395             cursor = limit - v_5;
396             if (!(eq_s_b("ie"))) {
397               cursor = limit - v_3;
398               break lab0;
399             }
400           }
401           cursor = limit - v_4;
402           if (cursor <= limit_backward) {
403             cursor = limit - v_3;
404             break lab0;
405           }
406           cursor--;
407           bra = cursor;
408         }
409         break;
410       case 8:
411         if (!(in_grouping_b(g_V1, 97, 246))) {
412           return false;
413         }
414         if (!(in_grouping_b(g_C, 98, 122))) {
415           return false;
416         }
417         break;
418     }
419     slice_del();
420     B_ending_removed = true;
421     return true;
422   }
423 
r_other_endings()424   private boolean r_other_endings() {
425     int among_var;
426     if (cursor < I_p2) {
427       return false;
428     }
429     int v_2 = limit_backward;
430     limit_backward = I_p2;
431     ket = cursor;
432     among_var = find_among_b(a_7);
433     if (among_var == 0) {
434       limit_backward = v_2;
435       return false;
436     }
437     bra = cursor;
438     limit_backward = v_2;
439     switch (among_var) {
440       case 1:
441         {
442           int v_3 = limit - cursor;
443           lab0:
444           {
445             if (!(eq_s_b("po"))) {
446               break lab0;
447             }
448             return false;
449           }
450           cursor = limit - v_3;
451         }
452         break;
453     }
454     slice_del();
455     return true;
456   }
457 
r_i_plural()458   private boolean r_i_plural() {
459     if (cursor < I_p1) {
460       return false;
461     }
462     int v_2 = limit_backward;
463     limit_backward = I_p1;
464     ket = cursor;
465     if (find_among_b(a_8) == 0) {
466       limit_backward = v_2;
467       return false;
468     }
469     bra = cursor;
470     limit_backward = v_2;
471     slice_del();
472     return true;
473   }
474 
r_t_plural()475   private boolean r_t_plural() {
476     int among_var;
477     if (cursor < I_p1) {
478       return false;
479     }
480     int v_2 = limit_backward;
481     limit_backward = I_p1;
482     ket = cursor;
483     if (!(eq_s_b("t"))) {
484       limit_backward = v_2;
485       return false;
486     }
487     bra = cursor;
488     int v_3 = limit - cursor;
489     if (!(in_grouping_b(g_V1, 97, 246))) {
490       limit_backward = v_2;
491       return false;
492     }
493     cursor = limit - v_3;
494     slice_del();
495     limit_backward = v_2;
496     if (cursor < I_p2) {
497       return false;
498     }
499     int v_5 = limit_backward;
500     limit_backward = I_p2;
501     ket = cursor;
502     among_var = find_among_b(a_9);
503     if (among_var == 0) {
504       limit_backward = v_5;
505       return false;
506     }
507     bra = cursor;
508     limit_backward = v_5;
509     switch (among_var) {
510       case 1:
511         {
512           int v_6 = limit - cursor;
513           lab0:
514           {
515             if (!(eq_s_b("po"))) {
516               break lab0;
517             }
518             return false;
519           }
520           cursor = limit - v_6;
521         }
522         break;
523     }
524     slice_del();
525     return true;
526   }
527 
r_tidy()528   private boolean r_tidy() {
529     if (cursor < I_p1) {
530       return false;
531     }
532     int v_2 = limit_backward;
533     limit_backward = I_p1;
534     int v_3 = limit - cursor;
535     lab0:
536     {
537       int v_4 = limit - cursor;
538       if (!r_LONG()) {
539         break lab0;
540       }
541       cursor = limit - v_4;
542       ket = cursor;
543       if (cursor <= limit_backward) {
544         break lab0;
545       }
546       cursor--;
547       bra = cursor;
548       slice_del();
549     }
550     cursor = limit - v_3;
551     int v_5 = limit - cursor;
552     lab1:
553     {
554       ket = cursor;
555       if (!(in_grouping_b(g_AEI, 97, 228))) {
556         break lab1;
557       }
558       bra = cursor;
559       if (!(in_grouping_b(g_C, 98, 122))) {
560         break lab1;
561       }
562       slice_del();
563     }
564     cursor = limit - v_5;
565     int v_6 = limit - cursor;
566     lab2:
567     {
568       ket = cursor;
569       if (!(eq_s_b("j"))) {
570         break lab2;
571       }
572       bra = cursor;
573       lab3:
574       {
575         int v_7 = limit - cursor;
576         lab4:
577         {
578           if (!(eq_s_b("o"))) {
579             break lab4;
580           }
581           break lab3;
582         }
583         cursor = limit - v_7;
584         if (!(eq_s_b("u"))) {
585           break lab2;
586         }
587       }
588       slice_del();
589     }
590     cursor = limit - v_6;
591     int v_8 = limit - cursor;
592     lab5:
593     {
594       ket = cursor;
595       if (!(eq_s_b("o"))) {
596         break lab5;
597       }
598       bra = cursor;
599       if (!(eq_s_b("j"))) {
600         break lab5;
601       }
602       slice_del();
603     }
604     cursor = limit - v_8;
605     limit_backward = v_2;
606     golab6:
607     while (true) {
608       int v_9 = limit - cursor;
609       lab7:
610       {
611         if (!(out_grouping_b(g_V1, 97, 246))) {
612           break lab7;
613         }
614         cursor = limit - v_9;
615         break golab6;
616       }
617       cursor = limit - v_9;
618       if (cursor <= limit_backward) {
619         return false;
620       }
621       cursor--;
622     }
623     ket = cursor;
624     if (!(in_grouping_b(g_C, 98, 122))) {
625       return false;
626     }
627     bra = cursor;
628     slice_to(S_x);
629     if (!(eq_s_b(S_x))) {
630       return false;
631     }
632     slice_del();
633     return true;
634   }
635 
636   @Override
stem()637   public boolean stem() {
638     int v_1 = cursor;
639     r_mark_regions();
640     cursor = v_1;
641     B_ending_removed = false;
642     limit_backward = cursor;
643     cursor = limit;
644     int v_2 = limit - cursor;
645     r_particle_etc();
646     cursor = limit - v_2;
647     int v_3 = limit - cursor;
648     r_possessive();
649     cursor = limit - v_3;
650     int v_4 = limit - cursor;
651     r_case_ending();
652     cursor = limit - v_4;
653     int v_5 = limit - cursor;
654     r_other_endings();
655     cursor = limit - v_5;
656     lab0:
657     {
658       lab1:
659       {
660         if (!(B_ending_removed)) {
661           break lab1;
662         }
663         int v_7 = limit - cursor;
664         r_i_plural();
665         cursor = limit - v_7;
666         break lab0;
667       }
668       int v_8 = limit - cursor;
669       r_t_plural();
670       cursor = limit - v_8;
671     }
672     int v_9 = limit - cursor;
673     r_tidy();
674     cursor = limit - v_9;
675     cursor = limit_backward;
676     return true;
677   }
678 
679   @Override
equals(Object o)680   public boolean equals(Object o) {
681     return o instanceof FinnishStemmer;
682   }
683 
684   @Override
hashCode()685   public int hashCode() {
686     return FinnishStemmer.class.getName().hashCode();
687   }
688 }
689