TraceLab Component Library
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Properties
EnglishStemmer.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  {
19  private readonly static Among[] a_0 =
20  {
21  new Among ( "arsen", -1, -1,null ),
22  new Among ( "commun", -1, -1, null ),
23  new Among ( "gener", -1, -1, null )
24  };
25 
26 
27  private readonly static Among[] a_1 =
28  {
29  new Among ( "'", -1, 1, null),
30  new Among ( "'s'", 0, 1, null),
31  new Among ( "'s", -1, 1, null)
32  };
33 
34 
35  private readonly static Among[] a_2 =
36  {
37  new Among ( "ied", -1, 2, null),
38  new Among ( "s", -1, 3, null),
39  new Among ( "ies", 1, 2, null),
40  new Among ( "sses", 1, 1, null),
41  new Among ( "ss", 1, -1, null),
42  new Among ( "us", 1, -1, null)
43  };
44 
45 
46  private readonly static Among[] a_3 =
47  {
48  new Among ( "", -1, 3, null),
49  new Among ( "bb", 0, 2, null),
50  new Among ( "dd", 0, 2, null),
51  new Among ( "ff", 0, 2, null),
52  new Among ( "gg", 0, 2, null),
53  new Among ( "bl", 0, 1, null),
54  new Among ( "mm", 0, 2, null),
55  new Among ( "nn", 0, 2, null),
56  new Among ( "pp", 0, 2, null),
57  new Among ( "rr", 0, 2, null),
58  new Among ( "at", 0, 1, null),
59  new Among ( "tt", 0, 2, null),
60  new Among ( "iz", 0, 1, null)
61  };
62 
63 
64  private readonly static Among[] a_4 =
65  {
66  new Among ( "ed", -1, 2, null),
67  new Among ( "eed", 0, 1, null),
68  new Among ( "ing", -1, 2, null),
69  new Among ( "edly", -1, 2, null),
70  new Among ( "eedly", 3, 1, null),
71  new Among ( "ingly", -1, 2, null)
72  };
73 
74 
75  private readonly static Among[] a_5 =
76  {
77  new Among ( "anci", -1, 3, null),
78  new Among ( "enci", -1, 2, null),
79  new Among ( "ogi", -1, 13, null),
80  new Among ( "li", -1, 16, null),
81  new Among ( "bli", 3, 12, null),
82  new Among ( "abli", 4, 4, null),
83  new Among ( "alli", 3, 8, null),
84  new Among ( "fulli", 3, 14, null),
85  new Among ( "lessli", 3, 15, null),
86  new Among ( "ousli", 3, 10, null),
87  new Among ( "entli", 3, 5, null),
88  new Among ( "aliti", -1, 8, null),
89  new Among ( "biliti", -1, 12, null),
90  new Among ( "iviti", -1, 11, null),
91  new Among ( "tional", -1, 1, null),
92  new Among ( "ational", 14, 7, null),
93  new Among ( "alism", -1, 8, null),
94  new Among ( "ation", -1, 7, null),
95  new Among ( "ization", 17, 6, null),
96  new Among ( "izer", -1, 6, null),
97  new Among ( "ator", -1, 7, null),
98  new Among ( "iveness", -1, 11, null),
99  new Among ( "fulness", -1, 9, null),
100  new Among ( "ousness", -1, 10, null)
101  };
102 
103 
104 
105 
106  private readonly static Among[] a_6 =
107  {
108  new Among ( "icate", -1, 4, null),
109  new Among ( "ative", -1, 6, null),
110  new Among ( "alize", -1, 3, null),
111  new Among ( "iciti", -1, 4, null),
112  new Among ( "ical", -1, 4, null),
113  new Among ( "tional", -1, 1, null),
114  new Among ( "ational", 5, 2, null),
115  new Among ( "ful", -1, 5, null),
116  new Among ( "ness", -1, 5, null)
117  };
118 
119 
120 
121  private readonly static Among[] a_7 =
122  {
123  new Among ( "ic", -1, 1, null),
124  new Among ( "ance", -1, 1, null),
125  new Among ( "ence", -1, 1, null),
126  new Among ( "able", -1, 1, null),
127  new Among ( "ible", -1, 1, null),
128  new Among ( "ate", -1, 1, null),
129  new Among ( "ive", -1, 1, null),
130  new Among ( "ize", -1, 1, null),
131  new Among ( "iti", -1, 1, null),
132  new Among ( "al", -1, 1, null),
133  new Among ( "ism", -1, 1, null),
134  new Among ( "ion", -1, 2, null),
135  new Among ( "er", -1, 1, null),
136  new Among ( "ous", -1, 1, null),
137  new Among ( "ant", -1, 1, null),
138  new Among ( "ent", -1, 1, null),
139  new Among ( "ment", 15, 1, null),
140  new Among ( "ement", 16, 1, null)
141  };
142 
143 
144 
145 
146  private readonly static Among[] a_8 =
147  {
148  new Among ( "e", -1, 1, null),
149  new Among ( "l", -1, 2, null)
150  };
151 
152 
153  private readonly static Among[] a_9 =
154  {
155  new Among ( "succeed", -1, -1, null),
156  new Among ( "proceed", -1, -1, null),
157  new Among ( "exceed", -1, -1, null),
158  new Among ( "canning", -1, -1, null),
159  new Among ( "inning", -1, -1, null),
160  new Among ( "earring", -1, -1, null),
161  new Among ( "herring", -1, -1, null),
162  new Among ( "outing", -1, -1, null)
163  };
164 
165 
166 
167  private readonly static Among[] a_10 =
168  {
169  new Among ( "andes", -1, -1, null),
170  new Among ( "atlas", -1, -1, null),
171  new Among ( "bias", -1, -1, null),
172  new Among ( "cosmos", -1, -1, null),
173  new Among ( "dying", -1, 3, null),
174  new Among ( "early", -1, 9, null),
175  new Among ( "gently", -1, 7, null),
176  new Among ( "howe", -1, -1, null),
177  new Among ( "idly", -1, 6, null),
178  new Among ( "lying", -1, 4, null),
179  new Among ( "news", -1, -1, null),
180  new Among ( "only", -1, 10, null),
181  new Among ( "singly", -1, 11, null),
182  new Among ( "skies", -1, 2, null),
183  new Among ( "skis", -1, 1, null),
184  new Among ( "sky", -1, -1, null),
185  new Among ( "tying", -1, 5, null),
186  new Among ( "ugly", -1, 8, null)
187  };
188 
189 
190 
191  private static readonly char[] g_v = { (char)17, (char)65, (char)16, (char)1 };
192 
193  private static readonly char[] g_v_WXY = { (char)1, (char)17, (char)65, (char)208, (char)1 };
194 
195  private static readonly char[] g_valid_LI = { (char)55, (char)141, (char)2 };
196 
197  private bool B_Y_found;
198  private int I_p2;
199  private int I_p1;
200 
201 
202  private void copy_from(EnglishStemmer other)
203  {
204  B_Y_found = other.B_Y_found;
205  I_p2 = other.I_p2;
206  I_p1 = other.I_p1;
207  copy_from(other);
208  }
209 
210 
211  private bool r_prelude()
212  {
213  bool returnn = false;
214  bool subroot = false;
215  int v_1;
216  int v_2;
217  int v_3;
218  int v_4;
219  int v_5;
220  // (, line 25
221  // unset Y_found, line 26
222  B_Y_found = false;
223  // do, line 27
224  v_1 = cursor;
225  // lab0:
226  do
227  {
228  // (, line 27
229  // [, line 27
230  bra = cursor;
231  // literal, line 27
232  if (!(eq_s(1, "'")))
233  {
234  break;
235  }
236  // ], line 27
237  ket = cursor;
238  // delete, line 27
239  slice_del();
240  } while (false);
241  cursor = v_1;
242  // do, line 28
243  v_2 = cursor;
244  do
245  {
246  // (, line 28
247  // [, line 28
248  bra = cursor;
249  // literal, line 28
250  if (!(eq_s(1, "y")))
251  {
252  break;
253  }
254  // ], line 28
255  ket = cursor;
256  // <-, line 28
257  slice_from("Y");
258  // set Y_found, line 28
259  B_Y_found = true;
260  } while (false);
261  cursor = v_2;
262  // do, line 29
263  v_3 = cursor;
264  do
265  {
266  // repeat, line 29
267  replab3:
268  while (true)
269  {
270  v_4 = cursor;
271  do
272  {
273  // (, line 29
274  // goto, line 29
275  while (true)
276  {
277  v_5 = cursor;
278  do
279  {
280  // (, line 29
281  if (!(in_grouping(g_v, 97, 121)))
282  {
283  break;
284  }
285  // [, line 29
286  bra = cursor;
287  // literal, line 29
288  if (!(eq_s(1, "y")))
289  {
290  break;
291  }
292  // ], line 29
293  ket = cursor;
294  cursor = v_5;
295  subroot = true;
296  if (subroot) break;
297  } while (false);
298  if (subroot) { subroot = false; break; }
299  cursor = v_5;
300  if (cursor >= limit)
301  {
302  subroot = true;
303  break;
304  }
305  cursor++;
306  }
307  returnn = true;
308  if (subroot) { subroot = false; break; }
309  // <-, line 29
310  slice_from("Y");
311  // set Y_found, line 29
312  B_Y_found = true;
313  if (returnn)
314  {
315  goto replab3;
316  }
317  } while (false);
318  cursor = v_4;
319  break;
320  }
321  } while (false);
322  cursor = v_3;
323  return true;
324  }
325 
326 
327  private bool r_mark_regions()
328  {
329  bool subroot = false;
330  int v_1;
331  int v_2;
332  // (, line 32
333  I_p1 = limit;
334  I_p2 = limit;
335  // do, line 35
336  v_1 = cursor;
337  do
338  {
339  // (, line 35
340  // or, line 41
341  do
342  {
343  v_2 = cursor;
344  do
345  {
346  // among, line 36
347  if (find_among(a_0, 3) == 0)
348  {
349  break;
350  }
351  subroot = true;
352  if (subroot) break;
353  } while (false);
354  if (subroot) { subroot = false; break; }
355  cursor = v_2;
356  // (, line 41
357  // gopast, line 41
358  while (true)
359  {
360  do
361  {
362  if (!(in_grouping(g_v, 97, 121)))
363  {
364  break;
365  }
366  subroot = true;
367  if (subroot) break;
368  } while (false);
369  if (subroot) { subroot = false; break; }
370  if (cursor >= limit)
371  {
372  goto breaklab0;
373  }
374  cursor++;
375  }
376  // gopast, line 41
377  while (true)
378  {
379  do
380  {
381  if (!(out_grouping(g_v, 97, 121)))
382  {
383  break;
384  }
385  // break golab5;
386  subroot = true;
387  if (subroot) break;
388  } while (false);
389  if (subroot) { subroot = false; break; }
390  if (cursor >= limit)
391  {
392  goto breaklab0;
393  }
394  cursor++;
395  }
396  } while (false);
397  // setmark p1, line 42
398  I_p1 = cursor;
399  // gopast, line 43
400  while (true)
401  {
402  do
403  {
404  if (!(in_grouping(g_v, 97, 121)))
405  {
406  break;
407  }
408  subroot = true;
409  if (subroot) break;
410  } while (false);
411  if (subroot) { subroot = false; break; }
412  if (cursor >= limit)
413  {
414  goto breaklab0;
415  }
416  cursor++;
417  }
418  // gopast, line 43
419  while (true)
420  {
421  do
422  {
423  if (!(out_grouping(g_v, 97, 121)))
424  {
425  break;
426  }
427  subroot = true;
428  if (subroot) break;
429  } while (false);
430  if (subroot) { subroot = false; break; }
431  if (cursor >= limit)
432  {
433  goto breaklab0;
434  }
435  cursor++;
436  }
437  // setmark p2, line 43
438  I_p2 = cursor;
439  } while (false);
440  breaklab0:
441  cursor = v_1;
442  return true;
443  }
444 
445 
446  private bool r_shortv()
447  {
448  bool subroot = false;
449  int v_1;
450  // (, line 49
451  // or, line 51
452  // lab0:
453  do
454  {
455  v_1 = limit - cursor;
456  do
457  {
458  // (, line 50
459  if (!(out_grouping_b(g_v_WXY, 89, 121)))
460  {
461  break;
462  }
463  if (!(in_grouping_b(g_v, 97, 121)))
464  {
465  break;
466  }
467  if (!(out_grouping_b(g_v, 97, 121)))
468  {
469  break;
470  }
471  subroot = true;
472  if (subroot) break;
473  } while (false);
474  if (subroot) { subroot = false; break; }
475  cursor = limit - v_1;
476  // (, line 52
477  if (!(out_grouping_b(g_v, 97, 121)))
478  {
479  return false;
480  }
481  if (!(in_grouping_b(g_v, 97, 121)))
482  {
483  return false;
484  }
485  // atlimit, line 52
486  if (cursor > limit_backward)
487  {
488  return false;
489  }
490  } while (false);
491  return true;
492  }
493 
494  private bool r_R1()
495  {
496  if (!(I_p1 <= cursor))
497  {
498  return false;
499  }
500  return true;
501  }
502 
503  private bool r_R2()
504  {
505  if (!(I_p2 <= cursor))
506  {
507  return false;
508  }
509  return true;
510  }
511 
512 
513  private bool r_Step_1a()
514  {
515  bool subroot = false;
516  int among_var;
517  int v_1;
518  int v_2;
519  // (, line 58
520  // try, line 59
521  v_1 = limit - cursor;
522  do
523  {
524  // (, line 59
525  // [, line 60
526  ket = cursor;
527  // substring, line 60
528  among_var = find_among_b(a_1, 3);
529  if (among_var == 0)
530  {
531  cursor = limit - v_1;
532  break;
533  }
534  // ], line 60
535  bra = cursor;
536  switch (among_var)
537  {
538  case 0:
539  cursor = limit - v_1;
540  subroot = true;
541  break;
542  case 1:
543  // (, line 62
544  // delete, line 62
545  slice_del();
546  break;
547  }
548  if (subroot) { subroot = false; break; }
549  } while (false);
550  // [, line 65
551  ket = cursor;
552  // substring, line 65
553  among_var = find_among_b(a_2, 6);
554  if (among_var == 0)
555  {
556  return false;
557  }
558  // ], line 65
559  bra = cursor;
560  switch (among_var)
561  {
562  case 0:
563  return false;
564  case 1:
565  // (, line 66
566  // <-, line 66
567  slice_from("ss");
568  break;
569  case 2:
570  // (, line 68
571  // or, line 68
572  // lab1:
573  do
574  {
575  v_2 = limit - cursor;
576  do
577  {
578  // (, line 68
579  // hop, line 68
580  {
581  int c = cursor - 2;
582  if (limit_backward > c || c > limit)
583  {
584  break;
585  }
586  cursor = c;
587  }
588  // <-, line 68
589  slice_from("i");
590  subroot = true;
591  if (subroot) break;
592  } while (false);
593  if (subroot) { subroot = false; break; }
594  cursor = limit - v_2;
595  // <-, line 68
596  slice_from("ie");
597  } while (false);
598  break;
599  case 3:
600  // (, line 69
601  // next, line 69
602  if (cursor <= limit_backward)
603  {
604  return false;
605  }
606  cursor--;
607  // gopast, line 69
608  while (true)
609  {
610  do
611  {
612  if (!(in_grouping_b(g_v, 97, 121)))
613  {
614  break;
615  }
616  subroot = true;
617  if (subroot) break;
618  } while (false);
619  if (subroot) { subroot = false; break; }
620  if (cursor <= limit_backward)
621  {
622  return false;
623  }
624  cursor--;
625  }
626  // delete, line 69
627  slice_del();
628  break;
629  }
630  return true;
631  }
632 
633 
634  private bool r_Step_1b()
635  {
636  bool subroot = false;
637  int among_var;
638  int v_1;
639  int v_3;
640  int v_4;
641  // (, line 74
642  // [, line 75
643  ket = cursor;
644  // substring, line 75
645  among_var = find_among_b(a_4, 6);
646  if (among_var == 0)
647  {
648  return false;
649  }
650  // ], line 75
651  bra = cursor;
652  switch (among_var)
653  {
654  case 0:
655  return false;
656  case 1:
657  // (, line 77
658  // call R1, line 77
659  if (!r_R1())
660  {
661  return false;
662  }
663  // <-, line 77
664  slice_from("ee");
665  break;
666  case 2:
667  // (, line 79
668  // test, line 80
669  v_1 = limit - cursor;
670  // gopast, line 80
671  while (true)
672  {
673  do
674  {
675  if (!(in_grouping_b(g_v, 97, 121)))
676  {
677  break;
678  }
679  subroot = true;
680  if (subroot) break;
681  } while (false);
682  if (subroot) { subroot = false; break; }
683  if (cursor <= limit_backward)
684  {
685  return false;
686  }
687  cursor--;
688  }
689  cursor = limit - v_1;
690  // delete, line 80
691  slice_del();
692  // test, line 81
693  v_3 = limit - cursor;
694  // substring, line 81
695  among_var = find_among_b(a_3, 13);
696  if (among_var == 0)
697  {
698  return false;
699  }
700  cursor = limit - v_3;
701  switch (among_var)
702  {
703  case 0:
704  return false;
705  case 1:
706  // (, line 83
707  // <+, line 83
708  {
709  int c = cursor;
710  insert(cursor, cursor, "e");
711  cursor = c;
712  }
713  break;
714  case 2:
715  // (, line 86
716  // [, line 86
717  ket = cursor;
718  // next, line 86
719  if (cursor <= limit_backward)
720  {
721  return false;
722  }
723  cursor--;
724  // ], line 86
725  bra = cursor;
726  // delete, line 86
727  slice_del();
728  break;
729  case 3:
730  // (, line 87
731  // atmark, line 87
732  if (cursor != I_p1)
733  {
734  return false;
735  }
736  // test, line 87
737  v_4 = limit - cursor;
738  // call shortv, line 87
739  if (!r_shortv())
740  {
741  return false;
742  }
743  cursor = limit - v_4;
744  // <+, line 87
745  {
746  int c = cursor;
747  insert(cursor, cursor, "e");
748  cursor = c;
749  }
750  break;
751  }
752  break;
753  }
754  return true;
755  }
756 
757 
758  private bool r_Step_1c()
759  {
760  bool returnn = false;
761  bool subroot = false;
762  int v_1;
763  int v_2;
764  // (, line 93
765  // [, line 94
766  ket = cursor;
767  // or, line 94
768  // lab0:
769  do
770  {
771  v_1 = limit - cursor;
772  do
773  {
774  // literal, line 94
775  if (!(eq_s_b(1, "y")))
776  {
777  break;
778  }
779  subroot = true;
780  if (subroot) break;
781  } while (false);
782  if (subroot) { subroot = false; break; }
783  cursor = limit - v_1;
784  // literal, line 94
785  if (!(eq_s_b(1, "Y")))
786  {
787  return false;
788  }
789  } while (false);
790  // ], line 94
791  bra = cursor;
792  if (!(out_grouping_b(g_v, 97, 121)))
793  {
794  return false;
795  }
796  // not, line 95
797  {
798  v_2 = limit - cursor;
799  do
800  {
801  returnn = true;
802  // atlimit, line 95
803  if (cursor > limit_backward)
804  {
805  break;
806  }
807  if (returnn)
808  {
809  return false;
810  }
811  } while (false);
812  cursor = limit - v_2;
813  }
814  // <-, line 96
815  slice_from("i");
816  return true;
817  }
818 
819 
820  private bool r_Step_2()
821  {
822  int among_var;
823  // (, line 99
824  // [, line 100
825  ket = cursor;
826  // substring, line 100
827  among_var = find_among_b(a_5, 24);
828  if (among_var == 0)
829  {
830  return false;
831  }
832  // ], line 100
833  bra = cursor;
834  // call R1, line 100
835  if (!r_R1())
836  {
837  return false;
838  }
839  switch (among_var)
840  {
841  case 0:
842  return false;
843  case 1:
844  // (, line 101
845  // <-, line 101
846  slice_from("tion");
847  break;
848  case 2:
849  // (, line 102
850  // <-, line 102
851  slice_from("ence");
852  break;
853  case 3:
854  // (, line 103
855  // <-, line 103
856  slice_from("ance");
857  break;
858  case 4:
859  // (, line 104
860  // <-, line 104
861  slice_from("able");
862  break;
863  case 5:
864  // (, line 105
865  // <-, line 105
866  slice_from("ent");
867  break;
868  case 6:
869  // (, line 107
870  // <-, line 107
871  slice_from("ize");
872  break;
873  case 7:
874  // (, line 109
875  // <-, line 109
876  slice_from("ate");
877  break;
878  case 8:
879  // (, line 111
880  // <-, line 111
881  slice_from("al");
882  break;
883  case 9:
884  // (, line 112
885  // <-, line 112
886  slice_from("ful");
887  break;
888  case 10:
889  // (, line 114
890  // <-, line 114
891  slice_from("ous");
892  break;
893  case 11:
894  // (, line 116
895  // <-, line 116
896  slice_from("ive");
897  break;
898  case 12:
899  // (, line 118
900  // <-, line 118
901  slice_from("ble");
902  break;
903  case 13:
904  // (, line 119
905  // literal, line 119
906  if (!(eq_s_b(1, "l")))
907  {
908  return false;
909  }
910  // <-, line 119
911  slice_from("og");
912  break;
913  case 14:
914  // (, line 120
915  // <-, line 120
916  slice_from("ful");
917  break;
918  case 15:
919  // (, line 121
920  // <-, line 121
921  slice_from("less");
922  break;
923  case 16:
924  // (, line 122
925  if (!(in_grouping_b(g_valid_LI, 99, 116)))
926  {
927  return false;
928  }
929  // delete, line 122
930  slice_del();
931  break;
932  }
933  return true;
934  }
935 
936 
937  private bool r_Step_3()
938  {
939  int among_var;
940  // (, line 126
941  // [, line 127
942  ket = cursor;
943  // substring, line 127
944  among_var = find_among_b(a_6, 9);
945  if (among_var == 0)
946  {
947  return false;
948  }
949  // ], line 127
950  bra = cursor;
951  // call R1, line 127
952  if (!r_R1())
953  {
954  return false;
955  }
956  switch (among_var)
957  {
958  case 0:
959  return false;
960  case 1:
961  // (, line 128
962  // <-, line 128
963  slice_from("tion");
964  break;
965  case 2:
966  // (, line 129
967  // <-, line 129
968  slice_from("ate");
969  break;
970  case 3:
971  // (, line 130
972  // <-, line 130
973  slice_from("al");
974  break;
975  case 4:
976  // (, line 132
977  // <-, line 132
978  slice_from("ic");
979  break;
980  case 5:
981  // (, line 134
982  // delete, line 134
983  slice_del();
984  break;
985  case 6:
986  // (, line 136
987  // call R2, line 136
988  if (!r_R2())
989  {
990  return false;
991  }
992  // delete, line 136
993  slice_del();
994  break;
995  }
996  return true;
997  }
998 
999 
1000  private bool r_Step_4()
1001  {
1002  bool subroot = false;
1003  int among_var;
1004  int v_1;
1005  // (, line 140
1006  // [, line 141
1007  ket = cursor;
1008  // substring, line 141
1009  among_var = find_among_b(a_7, 18);
1010  if (among_var == 0)
1011  {
1012  return false;
1013  }
1014  // ], line 141
1015  bra = cursor;
1016  // call R2, line 141
1017  if (!r_R2())
1018  {
1019  return false;
1020  }
1021  switch (among_var)
1022  {
1023  case 0:
1024  return false;
1025  case 1:
1026  // (, line 144
1027  // delete, line 144
1028  slice_del();
1029  break;
1030  case 2:
1031  // (, line 145
1032  // or, line 145
1033  do
1034  {
1035  v_1 = limit - cursor;
1036  do
1037  {
1038  // literal, line 145
1039  if (!(eq_s_b(1, "s")))
1040  {
1041  break;
1042  }
1043  subroot = true;
1044  if (subroot) break;
1045  } while (false);
1046  if (subroot) { subroot = false; break; }
1047  cursor = limit - v_1;
1048  // literal, line 145
1049  if (!(eq_s_b(1, "t")))
1050  {
1051  return false;
1052  }
1053  } while (false);
1054  // delete, line 145
1055  slice_del();
1056  break;
1057  }
1058  return true;
1059  }
1060 
1061 
1062  private bool r_Step_5()
1063  {
1064  bool returnn = false;
1065  bool subroot = false;
1066  int among_var;
1067  int v_1;
1068  int v_2;
1069  // (, line 149
1070  // [, line 150
1071  ket = cursor;
1072  // substring, line 150
1073  among_var = find_among_b(a_8, 2);
1074  if (among_var == 0)
1075  {
1076  return false;
1077  }
1078  // ], line 150
1079  bra = cursor;
1080  switch (among_var)
1081  {
1082  case 0:
1083  return false;
1084  case 1:
1085  // (, line 151
1086  // or, line 151
1087  do
1088  {
1089  v_1 = limit - cursor;
1090  do
1091  {
1092  // call R2, line 151
1093  if (!r_R2())
1094  {
1095  break;
1096  }
1097  subroot = true;
1098  if (subroot) break;
1099  } while (false);
1100  if (subroot) { subroot = false; break; }
1101  cursor = limit - v_1;
1102  // (, line 151
1103  // call R1, line 151
1104  if (!r_R1())
1105  {
1106  return false;
1107  }
1108  // not, line 151
1109  {
1110  v_2 = limit - cursor;
1111  do
1112  {
1113  returnn = true;
1114  // call shortv, line 151
1115  if (!r_shortv())
1116  {
1117  break;
1118  }
1119  if (returnn)
1120  {
1121  return false;
1122  }
1123  } while (false);
1124  cursor = limit - v_2;
1125  }
1126  } while (false);
1127  // delete, line 151
1128  slice_del();
1129  break;
1130  case 2:
1131  // (, line 152
1132  // call R2, line 152
1133  if (!r_R2())
1134  {
1135  return false;
1136  }
1137  // literal, line 152
1138  if (!(eq_s_b(1, "l")))
1139  {
1140  return false;
1141  }
1142  // delete, line 152
1143  slice_del();
1144  break;
1145  }
1146  return true;
1147  }
1148 
1149 
1150  private bool r_exception2()
1151  {
1152  // (, line 156
1153  // [, line 158
1154  ket = cursor;
1155  // substring, line 158
1156  if (find_among_b(a_9, 8) == 0)
1157  {
1158  return false;
1159  }
1160  // ], line 158
1161  bra = cursor;
1162  // atlimit, line 158
1163  if (cursor > limit_backward)
1164  {
1165  return false;
1166  }
1167  return true;
1168  }
1169 
1170 
1171  private bool r_exception1()
1172  {
1173  int among_var;
1174  // (, line 168
1175  // [, line 170
1176  bra = cursor;
1177  // substring, line 170
1178  among_var = find_among(a_10, 18);
1179  if (among_var == 0)
1180  {
1181  return false;
1182  }
1183  // ], line 170
1184  ket = cursor;
1185  // atlimit, line 170
1186  if (cursor < limit)
1187  {
1188  return false;
1189  }
1190  switch (among_var)
1191  {
1192  case 0:
1193  return false;
1194  case 1:
1195  // (, line 174
1196  // <-, line 174
1197  slice_from("ski");
1198  break;
1199  case 2:
1200  // (, line 175
1201  // <-, line 175
1202  slice_from("sky");
1203  break;
1204  case 3:
1205  // (, line 176
1206  // <-, line 176
1207  slice_from("die");
1208  break;
1209  case 4:
1210  // (, line 177
1211  // <-, line 177
1212  slice_from("lie");
1213  break;
1214  case 5:
1215  // (, line 178
1216  // <-, line 178
1217  slice_from("tie");
1218  break;
1219  case 6:
1220  // (, line 182
1221  // <-, line 182
1222  slice_from("idl");
1223  break;
1224  case 7:
1225  // (, line 183
1226  // <-, line 183
1227  slice_from("gentl");
1228  break;
1229  case 8:
1230  // (, line 184
1231  // <-, line 184
1232  slice_from("ugli");
1233  break;
1234  case 9:
1235  // (, line 185
1236  // <-, line 185
1237  slice_from("earli");
1238  break;
1239  case 10:
1240  // (, line 186
1241  // <-, line 186
1242  slice_from("onli");
1243  break;
1244  case 11:
1245  // (, line 187
1246  // <-, line 187
1247  slice_from("singl");
1248  break;
1249  }
1250  return true;
1251  }
1252 
1253 
1254  private bool r_postlude()
1255  {
1256  bool returnn = false;
1257  bool subroot = false;
1258  int v_1;
1259  int v_2;
1260  // (, line 203
1261  // Boolean test Y_found, line 203
1262  if (!(B_Y_found))
1263  {
1264  return false;
1265  }
1266  // repeat, line 203
1267  replab0: while (true)
1268  {
1269  v_1 = cursor;
1270  do
1271  {
1272  // (, line 203
1273  // goto, line 203
1274  while (true)
1275  {
1276  v_2 = cursor;
1277  do
1278  {
1279  // (, line 203
1280  // [, line 203
1281  bra = cursor;
1282  // literal, line 203
1283  if (!(eq_s(1, "Y")))
1284  {
1285  break;
1286  }
1287  // ], line 203
1288  ket = cursor;
1289  cursor = v_2;
1290  subroot = true;
1291  if (subroot) break;
1292  } while (false);
1293  if (subroot) { subroot = false; break; }
1294  cursor = v_2;
1295  if (cursor >= limit)
1296  {
1297  subroot = true;
1298  break;
1299  }
1300  cursor++;
1301  }
1302  returnn = true;
1303  if (subroot) { subroot = false; break; }
1304  // <-, line 203
1305  slice_from("y");
1306  if (returnn)
1307  {
1308  goto replab0;
1309  }
1310  } while (false);
1311  cursor = v_1;
1312  break;
1313  }
1314  return true;
1315  }
1316 
1321  public bool CanStem()
1322  {
1323  bool returnn = true;
1324  bool subroot = false;
1325  int v_1;
1326  int v_2;
1327  int v_3;
1328  int v_4;
1329  int v_5;
1330  int v_6;
1331  int v_7;
1332  int v_8;
1333  int v_9;
1334  int v_10;
1335  int v_11;
1336  int v_12;
1337  int v_13;
1338  // (, line 205
1339  // or, line 207
1340  do
1341  {
1342  v_1 = cursor;
1343  do
1344  {
1345  // call exception1, line 207
1346  if (!r_exception1())
1347  {
1348  break;
1349  }
1350  subroot = true;
1351  if (subroot) break;
1352  } while (false);
1353  if (subroot) { subroot = false; break; }
1354  cursor = v_1;
1355  do
1356  {
1357  // not, line 208
1358  {
1359  v_2 = cursor;
1360  do
1361  {
1362  // hop, line 208
1363  {
1364  int c = cursor + 3;
1365  if (0 > c || c > limit)
1366  {
1367  break; ;
1368  }
1369  cursor = c;
1370  }
1371  subroot = true;
1372  if (subroot) break;
1373  } while (false);
1374  if (subroot) { subroot = false; break; }
1375  cursor = v_2;
1376  }
1377  returnn = true;
1378  if (returnn) goto breaklab0;
1379  } while (false);
1380  cursor = v_1;
1381  // (, line 208
1382  // do, line 209
1383  v_3 = cursor;
1384  do
1385  {
1386  // call prelude, line 209
1387  if (!r_prelude())
1388  {
1389  break;
1390  }
1391  } while (false);
1392  cursor = v_3;
1393  // do, line 210
1394  v_4 = cursor;
1395  do
1396  {
1397  // call mark_regions, line 210
1398  if (!r_mark_regions())
1399  {
1400  break;
1401  }
1402  } while (false);
1403  cursor = v_4;
1404  // backwards, line 211
1405  limit_backward = cursor; cursor = limit;
1406  // (, line 211
1407  // do, line 213
1408  v_5 = limit - cursor;
1409  do
1410  {
1411  // call Step_1a, line 213
1412  if (!r_Step_1a())
1413  {
1414  break;
1415  }
1416  } while (false);
1417  cursor = limit - v_5;
1418  // or, line 215
1419  do
1420  {
1421  v_6 = limit - cursor;
1422  do
1423  {
1424  // call exception2, line 215
1425  if (!r_exception2())
1426  {
1427  break;
1428  }
1429  subroot = true;
1430  if (subroot) break;
1431  } while (false);
1432  if (subroot) { subroot = false; break; }
1433  cursor = limit - v_6;
1434  // (, line 215
1435  // do, line 217
1436  v_7 = limit - cursor;
1437  do
1438  {
1439  // call Step_1b, line 217
1440  if (!r_Step_1b())
1441  {
1442  break;
1443  }
1444  } while (false);
1445  cursor = limit - v_7;
1446  // do, line 218
1447  v_8 = limit - cursor;
1448  do
1449  {
1450  // call Step_1c, line 218
1451  if (!r_Step_1c())
1452  {
1453  break;
1454  }
1455  } while (false);
1456  cursor = limit - v_8;
1457  // do, line 220
1458  v_9 = limit - cursor;
1459  do
1460  {
1461  // call Step_2, line 220
1462  if (!r_Step_2())
1463  {
1464  break;
1465  }
1466  } while (false);
1467  cursor = limit - v_9;
1468  // do, line 221
1469  v_10 = limit - cursor;
1470  do
1471  {
1472  // call Step_3, line 221
1473  if (!r_Step_3())
1474  {
1475  break;
1476  }
1477  } while (false);
1478  cursor = limit - v_10;
1479  // do, line 222
1480  v_11 = limit - cursor;
1481  do
1482  {
1483  // call Step_4, line 222
1484  if (!r_Step_4())
1485  {
1486  break;
1487  }
1488  } while (false);
1489  cursor = limit - v_11;
1490  // do, line 224
1491  v_12 = limit - cursor;
1492  do
1493  {
1494  // call Step_5, line 224
1495  if (!r_Step_5())
1496  {
1497  break;
1498  }
1499  } while (false);
1500  cursor = limit - v_12;
1501  } while (false);
1502  cursor = limit_backward; // do, line 227
1503  v_13 = cursor;
1504  do
1505  {
1506  // call postlude, line 227
1507  if (!r_postlude())
1508  {
1509  break;
1510  }
1511  } while (false);
1512  cursor = v_13;
1513  } while (false);
1514  breaklab0:
1515  return true;
1516  }
1517 
1523  public string Stem(string s)
1524  {
1525  this.setCurrent(s.ToLowerInvariant());
1526  this.CanStem();
1527  return this.getCurrent();
1528  }
1529 
1530  }
1531 }