TraceLab Component Library
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Properties
FinnishStemmer.cs
Go to the documentation of this file.
1 /*
2  * Port of Snowball stemmers on C#
3  * Original stemmers can be found on http://snowball.tartarus.org
4  * Licence still BSD: http://snowball.tartarus.org/license.php
5  *
6  * Most of stemmers are ported from Java by Iveonik Systems ltd. (www.iveonik.com)
7  */
8 using System;
9 using System.Collections.Generic;
10 using System.Text;
11 
12 namespace TraceLab.Components.DevelopmentKit.Preprocessors.Stemmers.Snowball.Languages
13 {
18  {
20 
21  private readonly static FinnishStemmer methodObject = new FinnishStemmer();
22 
27  public delegate bool DelegateType();
28 
29  private readonly static Among[] a_0 = {
30  new Among ( "pa", -1, 1, null ),
31  new Among ( "sti", -1, 2, null ),
32  new Among ( "kaan", -1, 1, null ),
33  new Among ( "han", -1, 1, null ),
34  new Among ( "kin", -1, 1, null ),
35  new Among ( "h\u00E4n", -1, 1, null ),
36  new Among ( "k\u00E4\u00E4n", -1, 1, null ),
37  new Among ( "ko", -1, 1, null ),
38  new Among ( "p\u00E4", -1, 1, null ),
39  new Among ( "k\u00F6", -1, 1, null )
40  };
41 
42  private readonly static Among[] a_1 = {
43  new Among ( "lla", -1, -1, null ),
44  new Among ( "na", -1, -1, null ),
45  new Among ( "ssa", -1, -1, null ),
46  new Among ( "ta", -1, -1, null ),
47  new Among ( "lta", 3, -1, null ),
48  new Among ( "sta", 3, -1, null )
49  };
50 
51  private readonly static Among[] a_2 = {
52  new Among ( "ll\u00E4", -1, -1, null ),
53  new Among ( "n\u00E4", -1, -1, null ),
54  new Among ( "ss\u00E4", -1, -1, null ),
55  new Among ( "t\u00E4", -1, -1, null ),
56  new Among ( "lt\u00E4", 3, -1, null ),
57  new Among ( "st\u00E4", 3, -1, null )
58  };
59 
60  private readonly static Among[] a_3 = {
61  new Among ( "lle", -1, -1, null ),
62  new Among ( "ine", -1, -1, null )
63  };
64 
65  private readonly static Among[] a_4 = {
66  new Among ( "nsa", -1, 3, null ),
67  new Among ( "mme", -1, 3, null ),
68  new Among ( "nne", -1, 3, null ),
69  new Among ( "ni", -1, 2, null ),
70  new Among ( "si", -1, 1, null ),
71  new Among ( "an", -1, 4, null ),
72  new Among ( "en", -1, 6, null ),
73  new Among ( "\u00E4n", -1, 5, null ),
74  new Among ( "ns\u00E4", -1, 3, null )
75  };
76 
77  private readonly static Among[] a_5 = {
78  new Among ( "aa", -1, -1, null ),
79  new Among ( "ee", -1, -1, null ),
80  new Among ( "ii", -1, -1, null ),
81  new Among ( "oo", -1, -1, null ),
82  new Among ( "uu", -1, -1, null ),
83  new Among ( "\u00E4\u00E4", -1, -1, null ),
84  new Among ( "\u00F6\u00F6", -1, -1, null )
85  };
86 
87  private readonly static Among[] a_6 = {
88  new Among ( "a", -1, 8, null ),
89  new Among ( "lla", 0, -1, null ),
90  new Among ( "na", 0, -1, null ),
91  new Among ( "ssa", 0, -1, null ),
92  new Among ( "ta", 0, -1, null ),
93  new Among ( "lta", 4, -1, null ),
94  new Among ( "sta", 4, -1, null ),
95  new Among ( "tta", 4, 9, null ),
96  new Among ( "lle", -1, -1, null ),
97  new Among ( "ine", -1, -1, null ),
98  new Among ( "ksi", -1, -1, null ),
99  new Among ( "n", -1, 7, null ),
100  new Among ( "han", 11, 1, null ),
101  new Among ( "den", 11, -1, delegate{ return methodObject.r_VI();} /*"r_VI"*/ ),
102  new Among ( "seen", 11, -1, delegate{return methodObject.r_LONG();}/*"r_LONG"*/ ),
103  new Among ( "hen", 11, 2, null ),
104  new Among ( "tten", 11, -1,delegate{ return methodObject.r_VI();} /*"r_VI"*/ ),
105  new Among ( "hin", 11, 3, null ),
106  new Among ( "siin", 11, -1,delegate{ return methodObject.r_VI();} /*"r_VI"*/ ),
107  new Among ( "hon", 11, 4, null ),
108  new Among ( "h\u00E4n", 11, 5, null ),
109  new Among ( "h\u00F6n", 11, 6, null ),
110  new Among ( "\u00E4", -1, 8, null ),
111  new Among ( "ll\u00E4", 22, -1, null ),
112  new Among ( "n\u00E4", 22, -1, null ),
113  new Among ( "ss\u00E4", 22, -1, null ),
114  new Among ( "t\u00E4", 22, -1, null ),
115  new Among ( "lt\u00E4", 26, -1, null ),
116  new Among ( "st\u00E4", 26, -1, null ),
117  new Among ( "tt\u00E4", 26, 9, null )
118  };
119 
120  private readonly static Among[] a_7 = {
121  new Among ( "eja", -1, -1, null ),
122  new Among ( "mma", -1, 1, null ),
123  new Among ( "imma", 1, -1, null ),
124  new Among ( "mpa", -1, 1, null ),
125  new Among ( "impa", 3, -1, null ),
126  new Among ( "mmi", -1, 1, null ),
127  new Among ( "immi", 5, -1, null ),
128  new Among ( "mpi", -1, 1, null ),
129  new Among ( "impi", 7, -1, null ),
130  new Among ( "ej\u00E4", -1, -1, null ),
131  new Among ( "mm\u00E4", -1, 1, null ),
132  new Among ( "imm\u00E4", 10, -1, null ),
133  new Among ( "mp\u00E4", -1, 1, null ),
134  new Among ( "imp\u00E4", 12, -1, null )
135  };
136 
137  private readonly static Among[] a_8 = {
138  new Among ( "i", -1, -1, null ),
139  new Among ( "j", -1, -1, null )
140  };
141 
142  private readonly static Among[] a_9 = {
143  new Among ( "mma", -1, 1, null ),
144  new Among ( "imma", 0, -1, null )
145  };
146 
147  private static readonly char[] g_AEI = {(char)17, (char)1, (char)0, (char)0, (char)0, (char)0,
148  (char)0, (char)0, (char)0, (char)0, (char)0, (char)0,
149  (char)0, (char)0, (char)0, (char)0, (char)8 };
150 
151  private static readonly char[] g_V1 = {(char)17, (char)65, (char)16, (char)1, (char)0, (char)0,
152  (char)0, (char)0, (char)0, (char)0, (char)0, (char)0,
153  (char)0, (char)0, (char)0, (char)0, (char)8, (char)0,
154  (char)32 };
155 
156  private static readonly char[] g_V2 = {(char)17, (char)65, (char)16, (char)0, (char)0, (char)0,
157  (char)0, (char)0, (char)0, (char)0, (char)0, (char)0,
158  (char)0, (char)0, (char)0, (char)0, (char)8, (char)0,
159  (char)32 };
160 
161  private static readonly char[] g_particle_end = {(char)17, (char)97, (char)24, (char)1, (char)0,
162  (char)0, (char)0, (char)0, (char)0, (char)0,
163  (char)0, (char)0, (char)0, (char)0, (char)0,
164  (char)0, (char)8, (char)0, (char)32 };
165 
166  private bool B_ending_removed;
167  private StringBuilder S_x = new StringBuilder();
168  private int I_p2;
169  private int I_p1;
170 
171 
172  private void copy_from(FinnishStemmer other)
173  {
174  B_ending_removed = other.B_ending_removed;
175  S_x = other.S_x;
176  I_p2 = other.I_p2;
177  I_p1 = other.I_p1;
178  base.copy_from(other);
179  }
180 
181 
182  private bool r_mark_regions()
183  {
184  bool subroot = false;
185  int v_1;
186  int v_3;
187  // (, line 41
188  I_p1 = limit;
189  I_p2 = limit;
190  // goto, line 46
191  while (true)
192  {
193  v_1 = cursor;
194  do
195  {
196  if (!(in_grouping(g_V1, 97, 246)))
197  {
198  break;
199  }
200  cursor = v_1;
201  subroot = true;
202  if (subroot) break;
203  } while (false);
204  if (subroot) { subroot = false; break; }
205  cursor = v_1;
206  if (cursor >= limit)
207  {
208  return false;
209  }
210  cursor++;
211  }
212  // gopast, line 46
213  while (true)
214  {
215  do
216  {
217  if (!(out_grouping(g_V1, 97, 246)))
218  {
219  break;
220  }
221  subroot = true;
222  if (subroot) break;
223  } while (false);
224  if (subroot) { subroot = false; break; }
225  if (cursor >= limit)
226  {
227  return false;
228  }
229  cursor++;
230  }
231  // setmark p1, line 46
232  I_p1 = cursor;
233  // goto, line 47
234  while (true)
235  {
236  v_3 = cursor;
237  do
238  {
239  if (!(in_grouping(g_V1, 97, 246)))
240  {
241  break;
242  }
243  cursor = v_3;
244  subroot = true;
245  if (subroot) break;
246  } while (false);
247  if (subroot) { subroot = false; break; }
248  cursor = v_3;
249  if (cursor >= limit)
250  {
251  return false;
252  }
253  cursor++;
254  }
255  // gopast, line 47
256  while (true)
257  {
258  do
259  {
260  if (!(out_grouping(g_V1, 97, 246)))
261  {
262  break;
263  }
264  subroot = true;
265  if (subroot) break;
266  } while (false);
267  if (subroot) { subroot = false; break; }
268  if (cursor >= limit)
269  {
270  return false;
271  }
272  cursor++;
273  }
274  // setmark p2, line 47
275  I_p2 = cursor;
276  return true;
277  }
278 
279  private bool r_R2()
280  {
281  if (!(I_p2 <= cursor))
282  {
283  return false;
284  }
285 
286  return true;
287  }
288 
289 
290  private bool r_particle_etc()
291  {
292  int among_var;
293  int v_1;
294  int v_2;
295  // (, line 54
296  // setlimit, line 55
297  v_1 = limit - cursor;
298  // tomark, line 55
299  if (cursor < I_p1)
300  {
301  return false;
302  }
303  cursor = I_p1;
304  v_2 = limit_backward;
305  limit_backward = cursor;
306  cursor = limit - v_1;
307  // (, line 55
308  // [, line 55
309  ket = cursor;
310  // substring, line 55
311  among_var = find_among_b(a_0, 10);
312  if (among_var == 0)
313  {
314  limit_backward = v_2;
315  return false;
316  }
317  // ], line 55
318  bra = cursor;
319  limit_backward = v_2;
320  switch (among_var)
321  {
322  case 0:
323  return false;
324  case 1:
325  // (, line 62
326  if (!(in_grouping_b(g_particle_end, 97, 246)))
327  {
328  return false;
329  }
330  break;
331  case 2:
332  // (, line 64
333  // call R2, line 64
334  if (!r_R2())
335  {
336  return false;
337  }
338  break;
339  }
340  // delete, line 66
341  slice_del();
342  return true;
343  }
344 
345 
346  private bool r_possessive()
347  {
348  bool returnn = false;
349  int among_var;
350  int v_1;
351  int v_2;
352  int v_3;
353  // (, line 68
354  // setlimit, line 69
355  v_1 = limit - cursor;
356  // tomark, line 69
357  if (cursor < I_p1)
358  {
359  return false;
360  }
361  cursor = I_p1;
362  v_2 = limit_backward;
363  limit_backward = cursor;
364  cursor = limit - v_1;
365  // (, line 69
366  // [, line 69
367  ket = cursor;
368  // substring, line 69
369  among_var = find_among_b(a_4, 9);
370  if (among_var == 0)
371  {
372  limit_backward = v_2;
373  return false;
374  }
375  // ], line 69
376  bra = cursor;
377  limit_backward = v_2;
378  switch (among_var)
379  {
380  case 0:
381  return false;
382  case 1:
383  // (, line 72
384  // not, line 72
385  {
386  v_3 = limit - cursor;
387  do
388  {
389  // literal, line 72
390  returnn = true;
391  if (!(eq_s_b(1, "k")))
392  {
393  returnn = false;
394  break;
395  }
396  else if (returnn)
397  {
398  return false;
399  }
400  } while (false);
401  cursor = limit - v_3;
402  }
403  // delete, line 72
404  slice_del();
405  break;
406  case 2:
407  // (, line 74
408  // delete, line 74
409  slice_del();
410  // [, line 74
411  ket = cursor;
412  // literal, line 74
413  if (!(eq_s_b(3, "kse")))
414  {
415  return false;
416  }
417  // ], line 74
418  bra = cursor;
419  // <-, line 74
420  slice_from("ksi");
421  break;
422  case 3:
423  // (, line 78
424  // delete, line 78
425  slice_del();
426  break;
427  case 4:
428  // (, line 81
429  // among, line 81
430  if (find_among_b(a_1, 6) == 0)
431  {
432  return false;
433  }
434  // delete, line 81
435  slice_del();
436  break;
437  case 5:
438  // (, line 83
439  // among, line 83
440  if (find_among_b(a_2, 6) == 0)
441  {
442  return false;
443  }
444  // delete, line 84
445  slice_del();
446  break;
447  case 6:
448  // (, line 86
449  // among, line 86
450  if (find_among_b(a_3, 2) == 0)
451  {
452  return false;
453  }
454  // delete, line 86
455  slice_del();
456  break;
457  }
458  return true;
459  }
460 
461  private bool r_LONG()
462  {
463  // among, line 91
464  if (find_among_b(a_5, 7) == 0)
465  {
466  return false;
467  }
468  return true;
469  }
470 
471  private bool r_VI()
472  {
473  // (, line 93
474  // literal, line 93
475  if (!(eq_s_b(1, "i")))
476  {
477  return false;
478  }
479  if (!(in_grouping_b(g_V2, 97, 246)))
480  {
481  return false;
482  }
483  return true;
484  }
485 
486 
487  private bool r_case_ending()
488  {
489  bool subroot = false;
490  int among_var;
491  int v_1;
492  int v_2;
493  int v_3;
494  int v_4;
495  int v_5;
496  // (, line 95
497  // setlimit, line 96
498  v_1 = limit - cursor;
499  // tomark, line 96
500  if (cursor < I_p1)
501  {
502  return false;
503  }
504  cursor = I_p1;
505  v_2 = limit_backward;
506  limit_backward = cursor;
507  cursor = limit - v_1;
508  // (, line 96
509  // [, line 96
510  ket = cursor;
511  // substring, line 96
512  among_var = find_among_b(a_6, 30);
513  if (among_var == 0)
514  {
515  limit_backward = v_2;
516  return false;
517  }
518  // ], line 96
519  bra = cursor;
520  limit_backward = v_2;
521  switch (among_var)
522  {
523  case 0:
524  return false;
525  case 1:
526  // (, line 98
527  // literal, line 98
528  if (!(eq_s_b(1, "a")))
529  {
530  return false;
531  }
532  break;
533  case 2:
534  // (, line 99
535  // literal, line 99
536  if (!(eq_s_b(1, "e")))
537  {
538  return false;
539  }
540  break;
541  case 3:
542  // (, line 100
543  // literal, line 100
544  if (!(eq_s_b(1, "i")))
545  {
546  return false;
547  }
548  break;
549  case 4:
550  // (, line 101
551  // literal, line 101
552  if (!(eq_s_b(1, "o")))
553  {
554  return false;
555  }
556  break;
557  case 5:
558  // (, line 102
559  // literal, line 102
560  if (!(eq_s_b(1, "\u00E4")))
561  {
562  return false;
563  }
564  break;
565  case 6:
566  // (, line 103
567  // literal, line 103
568  if (!(eq_s_b(1, "\u00F6")))
569  {
570  return false;
571  }
572  break;
573  case 7:
574  // (, line 111
575  // try, line 111
576  v_3 = limit - cursor;
577  do
578  {
579  // (, line 111
580  // and, line 113
581  v_4 = limit - cursor;
582  // or, line 112
583  do
584  {
585  v_5 = limit - cursor;
586  do
587  {
588  // call LONG, line 111
589  if (!r_LONG())
590  {
591  break;
592  }
593  subroot = true;
594  if (subroot) break;
595  } while (false);
596  if (subroot) { subroot = false; break; }
597  cursor = limit - v_5;
598  // literal, line 112
599  if (!(eq_s_b(2, "ie")))
600  {
601  cursor = limit - v_3;
602  subroot = true;
603  break;
604  }
605  } while (false);
606  if (subroot) { subroot = false; break; }
607  cursor = limit - v_4;
608  // next, line 113
609  if (cursor <= limit_backward)
610  {
611  cursor = limit - v_3;
612  break;
613  }
614  cursor--;
615  // ], line 113
616  bra = cursor;
617  } while (false);
618  break;
619  case 8:
620  // (, line 119
621  if (!(in_grouping_b(g_V1, 97, 246)))
622  {
623  return false;
624  }
625  if (!(out_grouping_b(g_V1, 97, 246)))
626  {
627  return false;
628  }
629  break;
630  case 9:
631  // (, line 121
632  // literal, line 121
633  if (!(eq_s_b(1, "e")))
634  {
635  return false;
636  }
637  break;
638  }
639  // delete, line 138
640  slice_del();
641  // set ending_removed, line 139
642  B_ending_removed = true;
643  return true;
644  }
645 
646 
647  private bool r_other_endings()
648  {
649  bool returnn = false;
650  int among_var;
651  int v_1;
652  int v_2;
653  int v_3;
654  // (, line 141
655  // setlimit, line 142
656  v_1 = limit - cursor;
657  // tomark, line 142
658  if (cursor < I_p2)
659  {
660  return false;
661  }
662  cursor = I_p2;
663  v_2 = limit_backward;
664  limit_backward = cursor;
665  cursor = limit - v_1;
666  // (, line 142
667  // [, line 142
668  ket = cursor;
669  // substring, line 142
670  among_var = find_among_b(a_7, 14);
671  if (among_var == 0)
672  {
673  limit_backward = v_2;
674  return false;
675  }
676  // ], line 142
677  bra = cursor;
678  limit_backward = v_2;
679  switch (among_var)
680  {
681  case 0:
682  return false;
683  case 1:
684  // (, line 146
685  // not, line 146
686  {
687  v_3 = limit - cursor;
688  do
689  {
690  returnn = true;
691  // literal, line 146
692  if (!(eq_s_b(2, "po")))
693  {
694  returnn = false;
695  break;
696  }
697  else if (returnn)
698  {
699  return false;
700  }
701  } while (false);
702  cursor = limit - v_3;
703  }
704  break;
705  }
706  // delete, line 151
707  slice_del();
708  return true;
709  }
710 
711 
712  private bool r_i_plural()
713  {
714  int v_1;
715  int v_2;
716  // (, line 153
717  // setlimit, line 154
718  v_1 = limit - cursor;
719  // tomark, line 154
720  if (cursor < I_p1)
721  {
722  return false;
723  }
724  cursor = I_p1;
725  v_2 = limit_backward;
726  limit_backward = cursor;
727  cursor = limit - v_1;
728  // (, line 154
729  // [, line 154
730  ket = cursor;
731  // substring, line 154
732  if (find_among_b(a_8, 2) == 0)
733  {
734  limit_backward = v_2;
735  return false;
736  }
737  // ], line 154
738  bra = cursor;
739  limit_backward = v_2;
740  // delete, line 158
741  slice_del();
742  return true;
743  }
744 
745 
746  private bool r_t_plural()
747  {
748  bool returnn = false;
749  int among_var;
750  int v_1;
751  int v_2;
752  int v_3;
753  int v_4;
754  int v_5;
755  int v_6;
756  // (, line 160
757  // setlimit, line 161
758  v_1 = limit - cursor;
759  // tomark, line 161
760  if (cursor < I_p1)
761  {
762  return false;
763  }
764  cursor = I_p1;
765  v_2 = limit_backward;
766  limit_backward = cursor;
767  cursor = limit - v_1;
768  // (, line 161
769  // [, line 162
770  ket = cursor;
771  // literal, line 162
772  if (!(eq_s_b(1, "t")))
773  {
774  limit_backward = v_2;
775  return false;
776  }
777  // ], line 162
778  bra = cursor;
779  // test, line 162
780  v_3 = limit - cursor;
781  if (!(in_grouping_b(g_V1, 97, 246)))
782  {
783  limit_backward = v_2;
784  return false;
785  }
786  cursor = limit - v_3;
787  // delete, line 163
788  slice_del();
789  limit_backward = v_2;
790  // setlimit, line 165
791  v_4 = limit - cursor;
792  // tomark, line 165
793  if (cursor < I_p2)
794  {
795  return false;
796  }
797  cursor = I_p2;
798  v_5 = limit_backward;
799  limit_backward = cursor;
800  cursor = limit - v_4;
801  // (, line 165
802  // [, line 165
803  ket = cursor;
804  // substring, line 165
805  among_var = find_among_b(a_9, 2);
806  if (among_var == 0)
807  {
808  limit_backward = v_5;
809  return false;
810  }
811  // ], line 165
812  bra = cursor;
813  limit_backward = v_5;
814  switch (among_var)
815  {
816  case 0:
817  return false;
818  case 1:
819  // (, line 167
820  // not, line 167
821  {
822  v_6 = limit - cursor;
823  do
824  {
825  returnn = true;
826  // literal, line 167
827  if (!(eq_s_b(2, "po")))
828  {
829  returnn = false;
830  break;
831  }
832  else if (returnn)
833  {
834  return false;
835  }
836  } while (false);
837  cursor = limit - v_6;
838  }
839  break;
840  }
841  // delete, line 170
842  slice_del();
843  return true;
844  }
845 
846 
847  private bool r_tidy()
848  {
849  bool subroot = false;
850  int v_1;
851  int v_2;
852  int v_3;
853  int v_4;
854  int v_5;
855  int v_6;
856  int v_7;
857  int v_8;
858  int v_9;
859  // (, line 172
860  // setlimit, line 173
861  v_1 = limit - cursor;
862  // tomark, line 173
863  if (cursor < I_p1)
864  {
865  return false;
866  }
867  cursor = I_p1;
868  v_2 = limit_backward;
869  limit_backward = cursor;
870  cursor = limit - v_1;
871  // (, line 173
872  // do, line 174
873  v_3 = limit - cursor;
874  do
875  {
876  // (, line 174
877  // and, line 174
878  v_4 = limit - cursor;
879  // call LONG, line 174
880  if (!r_LONG())
881  {
882  break;
883  }
884  cursor = limit - v_4;
885  // (, line 174
886  // [, line 174
887  ket = cursor;
888  // next, line 174
889  if (cursor <= limit_backward)
890  {
891  break;
892  }
893  cursor--;
894  // ], line 174
895  bra = cursor;
896  // delete, line 174
897  slice_del();
898  } while (false);
899  cursor = limit - v_3;
900  // do, line 175
901  v_5 = limit - cursor;
902  do
903  {
904  // (, line 175
905  // [, line 175
906  ket = cursor;
907  if (!(in_grouping_b(g_AEI, 97, 228)))
908  {
909  break;
910  }
911  // ], line 175
912  bra = cursor;
913  if (!(out_grouping_b(g_V1, 97, 246)))
914  {
915  break;
916  }
917  // delete, line 175
918  slice_del();
919  } while (false);
920  cursor = limit - v_5;
921  // do, line 176
922  v_6 = limit - cursor;
923  do
924  {
925  // (, line 176
926  // [, line 176
927  ket = cursor;
928  // literal, line 176
929  if (!(eq_s_b(1, "j")))
930  {
931  // break lab2;
932  break;
933  }
934  // ], line 176
935  bra = cursor;
936  // or, line 176
937  do
938  {
939  v_7 = limit - cursor;
940  do
941  {
942  // literal, line 176
943  if (!(eq_s_b(1, "o")))
944  {
945  break;
946  }
947  subroot = true;
948  if (subroot) break;
949  } while (false);
950  if (subroot) { subroot = false; break; }
951  cursor = limit - v_7;
952  // literal, line 176
953  if (!(eq_s_b(1, "u")))
954  {
955  subroot = true;
956  break;
957  }
958  } while (false);
959  if (subroot) { subroot = false; break; }
960  // delete, line 176
961  slice_del();
962  } while (false);
963  cursor = limit - v_6;
964  // do, line 177
965  v_8 = limit - cursor;
966  do
967  {
968  // (, line 177
969  // [, line 177
970  ket = cursor;
971  // literal, line 177
972  if (!(eq_s_b(1, "o")))
973  {
974  break;
975  }
976  // ], line 177
977  bra = cursor;
978  // literal, line 177
979  if (!(eq_s_b(1, "j")))
980  {
981  break;
982  }
983  // delete, line 177
984  slice_del();
985  } while (false);
986  cursor = limit - v_8;
987  limit_backward = v_2;
988  // goto, line 179
989  while (true)
990  {
991  v_9 = limit - cursor;
992  do
993  {
994  if (!(out_grouping_b(g_V1, 97, 246)))
995  {
996  break;
997  }
998  cursor = limit - v_9;
999  subroot = true;
1000  if (subroot) break;
1001  } while (false);
1002  if (subroot) { subroot = false; break; }
1003  cursor = limit - v_9;
1004  if (cursor <= limit_backward)
1005  {
1006  return false;
1007  }
1008  cursor--;
1009  }
1010  // [, line 179
1011  ket = cursor;
1012  // next, line 179
1013  if (cursor <= limit_backward)
1014  {
1015  return false;
1016  }
1017  cursor--;
1018  // ], line 179
1019  bra = cursor;
1020  // -> x, line 179
1021  S_x = slice_to(S_x);
1022  // name x, line 179
1023  if (!(eq_v_b(S_x)))
1024  {
1025  return false;
1026  }
1027  // delete, line 179
1028  slice_del();
1029  return true;
1030  }
1031 
1032 
1033  private bool CanStem()
1034  {
1035  bool subroot = false;
1036  int v_1;
1037  int v_2;
1038  int v_3;
1039  int v_4;
1040  int v_5;
1041  int v_6;
1042  int v_7;
1043  int v_8;
1044  int v_9;
1045  // (, line 183
1046  // do, line 185
1047  v_1 = cursor;
1048  do
1049  {
1050  // call mark_regions, line 185
1051  if (!r_mark_regions())
1052  {
1053  break;
1054  }
1055  } while (false);
1056  cursor = v_1;
1057  // unset ending_removed, line 186
1058  B_ending_removed = false;
1059  // backwards, line 187
1060  limit_backward = cursor; cursor = limit;
1061  // (, line 187
1062  // do, line 188
1063  v_2 = limit - cursor;
1064  do
1065  {
1066  // call particle_etc, line 188
1067  if (!r_particle_etc())
1068  {
1069  break;
1070  }
1071  } while (false);
1072  cursor = limit - v_2;
1073  // do, line 189
1074  v_3 = limit - cursor;
1075  do
1076  {
1077  // call possessive, line 189
1078  if (!r_possessive())
1079  {
1080  break;
1081  }
1082  } while (false);
1083  cursor = limit - v_3;
1084  // do, line 190
1085  v_4 = limit - cursor;
1086  do
1087  {
1088  // call case_ending, line 190
1089  if (!r_case_ending())
1090  {
1091  break;
1092  }
1093  } while (false);
1094  cursor = limit - v_4;
1095  // do, line 191
1096  v_5 = limit - cursor;
1097  do
1098  {
1099  // call other_endings, line 191
1100  if (!r_other_endings())
1101  {
1102  break;
1103  }
1104  } while (false);
1105  cursor = limit - v_5;
1106  // or, line 192
1107  do
1108  {
1109  v_6 = limit - cursor;
1110  do
1111  {
1112  // (, line 192
1113  // Boolean test ending_removed, line 192
1114  if (!(B_ending_removed))
1115  {
1116  break;
1117  }
1118  // do, line 192
1119  v_7 = limit - cursor;
1120  do
1121  {
1122  // call i_plural, line 192
1123  if (!r_i_plural())
1124  {
1125  break;
1126  }
1127  } while (false);
1128  cursor = limit - v_7;
1129  subroot = true;
1130  if (subroot) break;
1131  } while (false);
1132  if (subroot) { subroot = false; break; }
1133  cursor = limit - v_6;
1134  // do, line 192
1135  v_8 = limit - cursor;
1136  do
1137  {
1138  // call t_plural, line 192
1139  if (!r_t_plural())
1140  {
1141  break;
1142  }
1143  } while (false);
1144  cursor = limit - v_8;
1145  } while (false);
1146  // do, line 193
1147  v_9 = limit - cursor;
1148  do
1149  {
1150  // call tidy, line 193
1151  if (!r_tidy())
1152  {
1153  break;
1154  }
1155  } while (false);
1156  cursor = limit - v_9;
1157  cursor = limit_backward;
1158  return true;
1159  }
1160 
1166  public string Stem(string s)
1167  {
1168  this.setCurrent(s.ToLowerInvariant());
1169  this.CanStem();
1170  return this.getCurrent();
1171  }
1172 
1173  }
1174 }