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