TraceLab Component Library
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Properties
ItalianStemmer.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 ItalianStemmer methodObject = new ItalianStemmer();
20 
21 
22  private readonly static Among[] a_0 =
23  {
24  new Among ( "", -1, 7, null ),
25  new Among ( "qu", 0, 6, null ),
26  new Among ( "\u00E1", 0, 1, null ),
27  new Among ( "\u00E9", 0, 2, null ),
28  new Among ( "\u00ED", 0, 3, null ),
29  new Among ( "\u00F3", 0, 4, null ),
30  new Among ( "\u00FA", 0, 5, null )
31  };
32 
33 
34  private readonly static Among[] a_1 =
35  {
36  new Among ( "", -1, 3, null ),
37  new Among ( "I", 0, 1, null ),
38  new Among ( "U", 0, 2, null )
39  };
40 
41 
42  private readonly static Among[] a_2 =
43  {
44  new Among ( "la", -1, -1, null ),
45  new Among ( "cela", 0, -1, null ),
46  new Among ( "gliela", 0, -1, null ),
47  new Among ( "mela", 0, -1, null ),
48  new Among ( "tela", 0, -1, null ),
49  new Among ( "vela", 0, -1, null ),
50  new Among ( "le", -1, -1, null ),
51  new Among ( "cele", 6, -1, null ),
52  new Among ( "gliele", 6, -1, null ),
53  new Among ( "mele", 6, -1, null ),
54  new Among ( "tele", 6, -1, null ),
55  new Among ( "vele", 6, -1, null ),
56  new Among ( "ne", -1, -1, null ),
57  new Among ( "cene", 12, -1, null ),
58  new Among ( "gliene", 12, -1, null ),
59  new Among ( "mene", 12, -1, null ),
60  new Among ( "sene", 12, -1, null ),
61  new Among ( "tene", 12, -1, null ),
62  new Among ( "vene", 12, -1, null ),
63  new Among ( "ci", -1, -1, null ),
64  new Among ( "li", -1, -1, null ),
65  new Among ( "celi", 20, -1, null ),
66  new Among ( "glieli", 20, -1, null ),
67  new Among ( "meli", 20, -1, null ),
68  new Among ( "teli", 20, -1, null ),
69  new Among ( "veli", 20, -1, null ),
70  new Among ( "gli", 20, -1, null ),
71  new Among ( "mi", -1, -1, null ),
72  new Among ( "si", -1, -1, null ),
73  new Among ( "ti", -1, -1, null ),
74  new Among ( "vi", -1, -1, null ),
75  new Among ( "lo", -1, -1, null ),
76  new Among ( "celo", 31, -1, null ),
77  new Among ( "glielo", 31, -1, null ),
78  new Among ( "melo", 31, -1, null ),
79  new Among ( "telo", 31, -1, null ),
80  new Among ( "velo", 31, -1, null )
81  };
82 
83 
84 
85  private readonly static Among[] a_3 =
86  {
87  new Among ( "ando", -1, 1, null ),
88  new Among ( "endo", -1, 1, null ),
89  new Among ( "ar", -1, 2, null ),
90  new Among ( "er", -1, 2, null ),
91  new Among ( "ir", -1, 2, null )
92  };
93 
94 
95  private readonly static Among[] a_4 =
96  {
97  new Among ( "ic", -1, -1, null ),
98  new Among ( "abil", -1, -1, null ),
99  new Among ( "os", -1, -1, null ),
100  new Among ( "iv", -1, 1, null )
101  };
102 
103 
104  private readonly static Among[] a_5 =
105  {
106  new Among ( "ic", -1, 1, null ),
107  new Among ( "abil", -1, 1, null ),
108  new Among ( "iv", -1, 1, null )
109  };
110 
111 
112  private readonly static Among[] a_6 =
113  {
114  new Among ( "ica", -1, 1, null ),
115  new Among ( "logia", -1, 3, null ),
116  new Among ( "osa", -1, 1, null ),
117  new Among ( "ista", -1, 1, null ),
118  new Among ( "iva", -1, 9, null ),
119  new Among ( "anza", -1, 1, null ),
120  new Among ( "enza", -1, 5, null ),
121  new Among ( "ice", -1, 1, null ),
122  new Among ( "atrice", 7, 1, null ),
123  new Among ( "iche", -1, 1, null ),
124  new Among ( "logie", -1, 3, null ),
125  new Among ( "abile", -1, 1, null ),
126  new Among ( "ibile", -1, 1, null ),
127  new Among ( "usione", -1, 4, null ),
128  new Among ( "azione", -1, 2, null ),
129  new Among ( "uzione", -1, 4, null ),
130  new Among ( "atore", -1, 2, null ),
131  new Among ( "ose", -1, 1, null ),
132  new Among ( "ante", -1, 1, null ),
133  new Among ( "mente", -1, 1, null ),
134  new Among ( "amente", 19, 7, null ),
135  new Among ( "iste", -1, 1, null ),
136  new Among ( "ive", -1, 9, null ),
137  new Among ( "anze", -1, 1, null ),
138  new Among ( "enze", -1, 5, null ),
139  new Among ( "ici", -1, 1, null ),
140  new Among ( "atrici", 25, 1, null ),
141  new Among ( "ichi", -1, 1, null ),
142  new Among ( "abili", -1, 1, null ),
143  new Among ( "ibili", -1, 1, null ),
144  new Among ( "ismi", -1, 1, null ),
145  new Among ( "usioni", -1, 4, null ),
146  new Among ( "azioni", -1, 2, null ),
147  new Among ( "uzioni", -1, 4, null ),
148  new Among ( "atori", -1, 2, null ),
149  new Among ( "osi", -1, 1, null ),
150  new Among ( "anti", -1, 1, null ),
151  new Among ( "amenti", -1, 6, null ),
152  new Among ( "imenti", -1, 6, null ),
153  new Among ( "isti", -1, 1, null ),
154  new Among ( "ivi", -1, 9, null ),
155  new Among ( "ico", -1, 1, null ),
156  new Among ( "ismo", -1, 1, null ),
157  new Among ( "oso", -1, 1, null ),
158  new Among ( "amento", -1, 6, null ),
159  new Among ( "imento", -1, 6, null ),
160  new Among ( "ivo", -1, 9, null ),
161  new Among ( "it\u00E0", -1, 8, null ),
162  new Among ( "ist\u00E0", -1, 1, null ),
163  new Among ( "ist\u00E8", -1, 1, null ),
164  new Among ( "ist\u00EC", -1, 1, null )
165  };
166 
167 
168  private readonly static Among[] a_7 =
169  {
170  new Among ( "isca", -1, 1, null ),
171  new Among ( "enda", -1, 1, null ),
172  new Among ( "ata", -1, 1, null ),
173  new Among ( "ita", -1, 1, null ),
174  new Among ( "uta", -1, 1, null ),
175  new Among ( "ava", -1, 1, null ),
176  new Among ( "eva", -1, 1, null ),
177  new Among ( "iva", -1, 1, null ),
178  new Among ( "erebbe", -1, 1, null ),
179  new Among ( "irebbe", -1, 1, null ),
180  new Among ( "isce", -1, 1, null ),
181  new Among ( "ende", -1, 1, null ),
182  new Among ( "are", -1, 1, null ),
183  new Among ( "ere", -1, 1, null ),
184  new Among ( "ire", -1, 1, null ),
185  new Among ( "asse", -1, 1, null ),
186  new Among ( "ate", -1, 1, null ),
187  new Among ( "avate", 16, 1, null ),
188  new Among ( "evate", 16, 1, null ),
189  new Among ( "ivate", 16, 1, null ),
190  new Among ( "ete", -1, 1, null ),
191  new Among ( "erete", 20, 1, null ),
192  new Among ( "irete", 20, 1, null ),
193  new Among ( "ite", -1, 1, null ),
194  new Among ( "ereste", -1, 1, null ),
195  new Among ( "ireste", -1, 1, null ),
196  new Among ( "ute", -1, 1, null ),
197  new Among ( "erai", -1, 1, null ),
198  new Among ( "irai", -1, 1, null ),
199  new Among ( "isci", -1, 1, null ),
200  new Among ( "endi", -1, 1, null ),
201  new Among ( "erei", -1, 1, null ),
202  new Among ( "irei", -1, 1, null ),
203  new Among ( "assi", -1, 1, null ),
204  new Among ( "ati", -1, 1, null ),
205  new Among ( "iti", -1, 1, null ),
206  new Among ( "eresti", -1, 1, null ),
207  new Among ( "iresti", -1, 1, null ),
208  new Among ( "uti", -1, 1, null ),
209  new Among ( "avi", -1, 1, null ),
210  new Among ( "evi", -1, 1, null ),
211  new Among ( "ivi", -1, 1, null ),
212  new Among ( "isco", -1, 1, null ),
213  new Among ( "ando", -1, 1, null ),
214  new Among ( "endo", -1, 1, null ),
215  new Among ( "Yamo", -1, 1, null ),
216  new Among ( "iamo", -1, 1, null ),
217  new Among ( "avamo", -1, 1, null ),
218  new Among ( "evamo", -1, 1, null ),
219  new Among ( "ivamo", -1, 1, null ),
220  new Among ( "eremo", -1, 1, null ),
221  new Among ( "iremo", -1, 1, null ),
222  new Among ( "assimo", -1, 1, null ),
223  new Among ( "ammo", -1, 1, null ),
224  new Among ( "emmo", -1, 1, null ),
225  new Among ( "eremmo", 54, 1, null ),
226  new Among ( "iremmo", 54, 1, null ),
227  new Among ( "immo", -1, 1, null ),
228  new Among ( "ano", -1, 1, null ),
229  new Among ( "iscano", 58, 1, null ),
230  new Among ( "avano", 58, 1, null ),
231  new Among ( "evano", 58, 1, null ),
232  new Among ( "ivano", 58, 1, null ),
233  new Among ( "eranno", -1, 1, null ),
234  new Among ( "iranno", -1, 1, null ),
235  new Among ( "ono", -1, 1, null ),
236  new Among ( "iscono", 65, 1, null ),
237  new Among ( "arono", 65, 1, null ),
238  new Among ( "erono", 65, 1, null ),
239  new Among ( "irono", 65, 1, null ),
240  new Among ( "erebbero", -1, 1, null ),
241  new Among ( "irebbero", -1, 1, null ),
242  new Among ( "assero", -1, 1, null ),
243  new Among ( "essero", -1, 1, null ),
244  new Among ( "issero", -1, 1, null ),
245  new Among ( "ato", -1, 1, null ),
246  new Among ( "ito", -1, 1, null ),
247  new Among ( "uto", -1, 1, null ),
248  new Among ( "avo", -1, 1, null ),
249  new Among ( "evo", -1, 1, null ),
250  new Among ( "ivo", -1, 1, null ),
251  new Among ( "ar", -1, 1, null ),
252  new Among ( "ir", -1, 1, null ),
253  new Among ( "er\u00E0", -1, 1, null ),
254  new Among ( "ir\u00E0", -1, 1, null ),
255  new Among ( "er\u00F2", -1, 1, null ),
256  new Among ( "ir\u00F2", -1, 1, null )
257  };
258 
259 
260 
261  private static readonly char[] g_v = {(char)17, (char)65, (char)16, (char)0, (char)0, (char)0, (char)0,
262  (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0,
263  (char)0, (char)128,(char)128, (char)8, (char)2, (char)1 };
264 
265 
266  private static readonly char[] g_AEIO = {(char)17, (char)65, (char)0, (char)0, (char)0, (char)0, (char)0,
267  (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0,
268  (char)0, (char)128, (char)128, (char)8, (char)2 };
269 
270  private static readonly char[] g_CG = { (char)17 };
271 
272  private int I_p2;
273  private int I_p1;
274  private int I_pV;
275 
276 
277  private void copy_from(ItalianStemmer other)
278  {
279  I_p2 = other.I_p2;
280  I_p1 = other.I_p1;
281  I_pV = other.I_pV;
282  copy_from(other);
283  }
284 
285 
286  private bool r_prelude()
287  {
288  bool subroot = false;
289  int among_var;
290  int v_1;
291  int v_2;
292  int v_3;
293  int v_4;
294  int v_5;
295  // (, line 34
296  // test, line 35
297  v_1 = cursor;
298  // repeat, line 35
299  replab0: while (true)
300  {
301  v_2 = cursor;
302  do
303  {
304  // (, line 35
305  // [, line 36
306  bra = cursor;
307  // substring, line 36
308  among_var = find_among(a_0, 7);
309  if (among_var == 0)
310  {
311  break;
312  }
313  // ], line 36
314  ket = cursor;
315  switch (among_var)
316  {
317  case 0:
318  subroot = true;
319  break;
320  case 1:
321  // (, line 37
322  // <-, line 37
323  slice_from("\u00E0");
324  break;
325  case 2:
326  // (, line 38
327  // <-, line 38
328  slice_from("\u00E8");
329  break;
330  case 3:
331  // (, line 39
332  // <-, line 39
333  slice_from("\u00EC");
334  break;
335  case 4:
336  // (, line 40
337  // <-, line 40
338  slice_from("\u00F2");
339  break;
340  case 5:
341  // (, line 41
342  // <-, line 41
343  slice_from("\u00F9");
344  break;
345  case 6:
346  // (, line 42
347  // <-, line 42
348  slice_from("qU");
349  break;
350  case 7:
351  // (, line 43
352  // next, line 43
353  if (cursor >= limit)
354  {
355  subroot = true;
356  break;
357  }
358  cursor++;
359  break;
360  }
361  if (subroot) { subroot = false; break; }
362  else if (!subroot)
363  {
364  goto replab0;
365  }
366  } while (false);
367  cursor = v_2;
368  break;
369  }
370  cursor = v_1;
371  // repeat, line 46
372  replab2: while (true)
373  {
374  v_3 = cursor;
375  do
376  {
377  // goto, line 46
378  while (true)
379  {
380  v_4 = cursor;
381  do
382  {
383  // (, line 46
384  if (!(in_grouping(g_v, 97, 249)))
385  {
386  break;
387  }
388  // [, line 47
389  bra = cursor;
390  // or, line 47
391  do
392  {
393  v_5 = cursor;
394  do
395  {
396  // (, line 47
397  // literal, line 47
398  if (!(eq_s(1, "u")))
399  {
400  break;
401  }
402  // ], line 47
403  ket = cursor;
404  if (!(in_grouping(g_v, 97, 249)))
405  {
406  break;
407  }
408  // <-, line 47
409  slice_from("U");
410  subroot = true;
411  if (subroot) break;
412  } while (false);
413  if (subroot) { subroot = false; break; }
414  cursor = v_5;
415  // (, line 48
416  // literal, line 48
417  if (!(eq_s(1, "i")))
418  {
419  subroot = true;
420  break;
421  }
422  // ], line 48
423  ket = cursor;
424  if (!(in_grouping(g_v, 97, 249)))
425  {
426  subroot = true;
427  break;
428  }
429  // <-, line 48
430  slice_from("I");
431  } while (false);
432  if (subroot) { subroot = false; break; }
433  cursor = v_4;
434  subroot = true;
435  if (subroot) break;
436  } while (false);
437  if (subroot) { subroot = false; break; }
438  cursor = v_4;
439  if (cursor >= limit)
440  {
441  subroot = true;
442  break;
443  }
444  cursor++;
445  }
446  if (subroot) { subroot = false; break; }
447  else if (!subroot)
448  {
449  goto replab2;
450  }
451  } while (false);
452  cursor = v_3;
453  break;
454  }
455  return true;
456  }
457 
458  private bool r_mark_regions()
459  {
460 
461  bool subroot = false;
462  bool root = false;
463  int v_1;
464  int v_2;
465  int v_3;
466  int v_6;
467  int v_8;
468  // (, line 52
469  I_pV = limit;
470  I_p1 = limit;
471  I_p2 = limit;
472  // do, line 58
473  v_1 = cursor;
474  do
475  {
476  // (, line 58
477  // or, line 60
478  do
479  {
480  v_2 = cursor;
481  do
482  {
483  // (, line 59
484  if (!(in_grouping(g_v, 97, 249)))
485  {
486  break;
487  }
488  // or, line 59
489  do
490  {
491  v_3 = cursor;
492  do
493  {
494  // (, line 59
495  if (!(out_grouping(g_v, 97, 249)))
496  {
497  //break lab4;
498  break;
499  }
500  // gopast, line 59
501  while (true)
502  {
503  do
504  {
505  if (!(in_grouping(g_v, 97, 249)))
506  {
507  break;
508  }
509  else
510  {
511  subroot = true;
512  }
513  if (subroot) { break; }
514  } while (false);
515  if (subroot) { subroot = false; break; }
516  if (cursor >= limit)
517  {
518  subroot = true;
519  break;
520  }
521  cursor++;
522  }
523  if (subroot) { subroot = false; break; }
524  if (!subroot) { subroot = true; break; }
525  } while (false);
526  if (subroot) { subroot = false; break; }
527  cursor = v_3;
528  // (, line 59
529  if (!(in_grouping(g_v, 97, 249)))
530  {
531  root = true;
532  break;
533  }
534  // gopast, line 59
535  while (true)
536  {
537  do
538  {
539  if (!(out_grouping(g_v, 97, 249)))
540  {
541  break;
542  }
543  else if (!subroot)
544  {
545  subroot = true;
546  break;
547  }
548 
549  } while (false);
550  if (subroot) { subroot = false; break; }
551  if (cursor >= limit)
552  {
553  root = true;
554  break;
555  }
556  cursor++;
557  }
558  } while (false);
559  if (root) { root = false; break; }
560  else if (!root)
561  {
562  root = true;
563  break;
564  }
565  } while (false);
566  if (root) { root = false; break; }
567  cursor = v_2;
568  // (, line 61
569  if (!(out_grouping(g_v, 97, 249)))
570  {
571  subroot = true;
572  goto breakLab0;
573  }
574  // or, line 61
575  //lab9:
576  do
577  {
578  v_6 = cursor;
579  do
580  {
581  // (, line 61
582  if (!(out_grouping(g_v, 97, 249)))
583  {
584  break;
585  }
586  // gopast, line 61
587  while (true)
588  {
589  do
590  {
591  if (!(in_grouping(g_v, 97, 249)))
592  {
593  break;
594  }
595  subroot = true;
596  if (subroot) break;
597  } while (false);
598  if (subroot) { subroot = false; break; }
599  if (cursor >= limit)
600  {
601  subroot = true; break;
602  }
603  cursor++;
604  }
605  if (subroot) { subroot = false; break; }
606  else if (!subroot)
607  {
608  subroot = true;
609  break;
610  }
611 
612  } while (false);
613  if (subroot) { subroot = false; break; }
614  cursor = v_6;
615  // (, line 61
616  if (!(in_grouping(g_v, 97, 249)))
617  {
618  subroot = true;
619  goto breakLab0;
620  }
621  // next, line 61
622  if (cursor >= limit)
623  {
624  subroot = true;
625  goto breakLab0;
626  }
627  cursor++;
628  } while (false);
629  } while (false);
630  breakLab0: if (subroot) { subroot = false; break; }
631  // setmark pV, line 62
632  I_pV = cursor;
633  } while (false);
634 
635  cursor = v_1;
636  // do, line 64
637  v_8 = cursor;
638  do
639  {
640  // (, line 64
641  // gopast, line 65
642  //golab14:
643  while (true)
644  {
645  do
646  {
647  if (!(in_grouping(g_v, 97, 249)))
648  {
649  break;
650  }
651  subroot = true;
652  if (subroot) break;
653  } while (false);
654  if (subroot) { subroot = false; break; }
655  if (cursor >= limit)
656  {
657  subroot = true;
658  break;
659  }
660  cursor++;
661  }
662  // gopast, line 65
663  if (subroot) { subroot = false; break; }
664  while (true)
665  {
666  do
667  {
668  if (!(out_grouping(g_v, 97, 249)))
669  {
670  break;
671  }
672  subroot = true;
673  if (subroot) break;
674  } while (false);
675  if (subroot) { subroot = false; break; }
676  if (cursor >= limit)
677  {
678  subroot = true;
679  break;
680  }
681  cursor++;
682  }
683  if (subroot) { subroot = false; break; }
684  // setmark p1, line 65
685  I_p1 = cursor;
686  // gopast, line 66
687  while (true)
688  {
689  do
690  {
691  if (!(in_grouping(g_v, 97, 249)))
692  {
693  break;
694  }
695  subroot = true;
696  if (subroot) break;
697  } while (false);
698  if (subroot) { subroot = false; break; }
699  if (cursor >= limit)
700  {
701  subroot = true;
702  break;
703  }
704  cursor++;
705  }
706  if (subroot) { subroot = false; break; }
707  // gopast, line 66
708  while (true)
709  {
710  do
711  {
712  if (!(out_grouping(g_v, 97, 249)))
713  {
714  break;
715  }
716  subroot = true;
717  if (subroot) break;
718  } while (false);
719  if (subroot) { subroot = false; break; }
720  if (cursor >= limit)
721  {
722  subroot = true;
723  break;
724  }
725  cursor++;
726  }
727  if (subroot) { subroot = false; break; }
728  // setmark p2, line 66
729  I_p2 = cursor;
730  } while (false);
731  cursor = v_8;
732  return true;
733  }
734 
735  private bool r_postlude()
736  {
737  bool subroot = false;
738  int among_var;
739 
740  int v_1;
741  // repeat, line 70
742  replab0: while (true)
743  {
744  v_1 = cursor;
745  do
746  {
747  // (, line 70
748  // [, line 72
749  bra = cursor;
750  // substring, line 72
751  among_var = find_among(a_1, 3);
752  if (among_var == 0)
753  {
754  break;
755  }
756  // ], line 72
757  ket = cursor;
758  switch (among_var)
759  {
760  case 0:
761  subroot = true;
762  break;
763  case 1:
764  // (, line 73
765  // <-, line 73
766  slice_from("i");
767  break;
768  case 2:
769  // (, line 74
770  // <-, line 74
771  slice_from("u");
772  break;
773  case 3:
774  // (, line 75
775  // next, line 75
776  if (cursor >= limit)
777  {
778  subroot = true;
779  break;
780  }
781  cursor++;
782  break;
783  }
784  if (subroot) { subroot = false; break; }
785  else if (!subroot)
786  {
787  goto replab0;
788  }
789  } while (false);
790  cursor = v_1;
791  break;
792  }
793  return true;
794  }
795 
796  private bool r_RV()
797  {
798  if (!(I_pV <= cursor))
799  {
800  return false;
801  }
802  return true;
803  }
804 
805  private bool r_R1()
806  {
807  if (!(I_p1 <= cursor))
808  {
809  return false;
810  }
811  return true;
812  }
813 
814  private bool r_R2()
815  {
816  if (!(I_p2 <= cursor))
817  {
818  return false;
819  }
820  return true;
821  }
822 
823  private bool r_attached_pronoun()
824  {
825  int among_var;
826  // (, line 86
827  // [, line 87
828  ket = cursor;
829  // substring, line 87
830  if (find_among_b(a_2, 37) == 0)
831  {
832  return false;
833  }
834  // ], line 87
835  bra = cursor;
836  // among, line 97
837  among_var = find_among_b(a_3, 5);
838  if (among_var == 0)
839  {
840  return false;
841  }
842  // (, line 97
843  // call RV, line 97
844  if (!r_RV())
845  {
846  return false;
847  }
848  switch (among_var)
849  {
850  case 0:
851  return false;
852  case 1:
853  // (, line 98
854  // delete, line 98
855  slice_del();
856  break;
857  case 2:
858  // (, line 99
859  // <-, line 99
860  slice_from("e");
861  break;
862  }
863  return true;
864  }
865 
866  private bool r_standard_suffix()
867  {
868 
869  bool subroot = false;
870  int among_var;
871  int v_1;
872  int v_2;
873  int v_3;
874  int v_4;
875  // (, line 103
876  // [, line 104
877  ket = cursor;
878  // substring, line 104
879  among_var = find_among_b(a_6, 51);
880  if (among_var == 0)
881  {
882  return false;
883  }
884  // ], line 104
885  bra = cursor;
886  switch (among_var)
887  {
888  case 0:
889  return false;
890  case 1:
891  // (, line 111
892  // call R2, line 111
893  if (!r_R2())
894  {
895  return false;
896  }
897  // delete, line 111
898  slice_del();
899  break;
900  case 2:
901  // (, line 113
902  // call R2, line 113
903  if (!r_R2())
904  {
905  return false;
906  }
907  // delete, line 113
908  slice_del();
909  // try, line 114
910  v_1 = limit - cursor;
911  do
912  {
913  // (, line 114
914  // [, line 114
915  ket = cursor;
916  // literal, line 114
917  if (!(eq_s_b(2, "ic")))
918  {
919  cursor = limit - v_1;
920  break;
921  }
922  // ], line 114
923  bra = cursor;
924  // call R2, line 114
925  if (!r_R2())
926  {
927  cursor = limit - v_1;
928  break;
929  }
930  // delete, line 114
931  slice_del();
932  } while (false);
933  break;
934  case 3:
935  // (, line 117
936  // call R2, line 117
937  if (!r_R2())
938  {
939  return false;
940  }
941  // <-, line 117
942  slice_from("log");
943  break;
944  case 4:
945  // (, line 119
946  // call R2, line 119
947  if (!r_R2())
948  {
949  return false;
950  }
951  // <-, line 119
952  slice_from("u");
953  break;
954  case 5:
955  // (, line 121
956  // call R2, line 121
957  if (!r_R2())
958  {
959  return false;
960  }
961  // <-, line 121
962  slice_from("ente");
963  break;
964  case 6:
965  // (, line 123
966  // call RV, line 123
967  if (!r_RV())
968  {
969  return false;
970  }
971  // delete, line 123
972  slice_del();
973  break;
974  case 7:
975  // (, line 124
976  // call R1, line 125
977  if (!r_R1())
978  {
979  return false;
980  }
981  // delete, line 125
982  slice_del();
983  // try, line 126
984  v_2 = limit - cursor;
985  do
986  {
987  // (, line 126
988  // [, line 127
989  ket = cursor;
990  // substring, line 127
991  among_var = find_among_b(a_4, 4);
992  if (among_var == 0)
993  {
994  cursor = limit - v_2;
995  break;
996  }
997  // ], line 127
998  bra = cursor;
999  // call R2, line 127
1000  if (!r_R2())
1001  {
1002  cursor = limit - v_2;
1003  break;
1004  }
1005  // delete, line 127
1006  slice_del();
1007  switch (among_var)
1008  {
1009  case 0:
1010  cursor = limit - v_2;
1011  subroot = true;
1012  break;
1013  case 1:
1014  // (, line 128
1015  // [, line 128
1016  ket = cursor;
1017  // literal, line 128
1018  if (!(eq_s_b(2, "at")))
1019  {
1020  cursor = limit - v_2;
1021  subroot = true;
1022  break;
1023  }
1024  // ], line 128
1025  bra = cursor;
1026  // call R2, line 128
1027  if (!r_R2())
1028  {
1029  cursor = limit - v_2;
1030  subroot = true;
1031  break;
1032  }
1033  // delete, line 128
1034  slice_del();
1035  break;
1036  }
1037  if (subroot) { subroot = false; break; }
1038  } while (false);
1039  break;
1040  case 8:
1041  // (, line 133
1042  // call R2, line 134
1043  if (!r_R2())
1044  {
1045  return false;
1046  }
1047  // delete, line 134
1048  slice_del();
1049  // try, line 135
1050  v_3 = limit - cursor;
1051  do
1052  {
1053  // (, line 135
1054  // [, line 136
1055  ket = cursor;
1056  // substring, line 136
1057  among_var = find_among_b(a_5, 3);
1058  if (among_var == 0)
1059  {
1060  cursor = limit - v_3;
1061  break;
1062  }
1063  // ], line 136
1064  bra = cursor;
1065  switch (among_var)
1066  {
1067  case 0:
1068  cursor = limit - v_3;
1069  subroot = false;
1070  break;
1071  case 1:
1072  // (, line 137
1073  // call R2, line 137
1074  if (!r_R2())
1075  {
1076  cursor = limit - v_3;
1077  subroot = false;
1078  break;
1079  }
1080  // delete, line 137
1081  slice_del();
1082  break;
1083  }
1084  if (subroot) { subroot = false; break; }
1085  } while (false);
1086  break;
1087  case 9:
1088  // (, line 141
1089  // call R2, line 142
1090  if (!r_R2())
1091  {
1092  return false;
1093  }
1094  // delete, line 142
1095  slice_del();
1096  // try, line 143
1097  v_4 = limit - cursor;
1098  // lab3:
1099  do
1100  {
1101  // (, line 143
1102  // [, line 143
1103  ket = cursor;
1104  // literal, line 143
1105  if (!(eq_s_b(2, "at")))
1106  {
1107  cursor = limit - v_4;
1108  break;
1109  }
1110  // ], line 143
1111  bra = cursor;
1112  // call R2, line 143
1113  if (!r_R2())
1114  {
1115  cursor = limit - v_4;
1116  break;
1117  }
1118  // delete, line 143
1119  slice_del();
1120  // [, line 143
1121  ket = cursor;
1122  // literal, line 143
1123  if (!(eq_s_b(2, "ic")))
1124  {
1125  cursor = limit - v_4;
1126  break;
1127  }
1128  // ], line 143
1129  bra = cursor;
1130  // call R2, line 143
1131  if (!r_R2())
1132  {
1133  cursor = limit - v_4;
1134  break;
1135  }
1136  // delete, line 143
1137  slice_del();
1138  } while (false);
1139  break;
1140  }
1141  return true;
1142  }
1143 
1144  private bool r_verb_suffix()
1145  {
1146  int among_var;
1147  int v_1;
1148  int v_2;
1149  // setlimit, line 148
1150  v_1 = limit - cursor;
1151  // tomark, line 148
1152  if (cursor < I_pV)
1153  {
1154  return false;
1155  }
1156  cursor = I_pV;
1157  v_2 = limit_backward;
1158  limit_backward = cursor;
1159  cursor = limit - v_1;
1160  // (, line 148
1161  // [, line 149
1162  ket = cursor;
1163  // substring, line 149
1164  among_var = find_among_b(a_7, 87);
1165  if (among_var == 0)
1166  {
1167  limit_backward = v_2;
1168  return false;
1169  }
1170  // ], line 149
1171  bra = cursor;
1172  switch (among_var)
1173  {
1174  case 0:
1175  limit_backward = v_2;
1176  return false;
1177  case 1:
1178  // (, line 163
1179  // delete, line 163
1180  slice_del();
1181  break;
1182  }
1183  limit_backward = v_2;
1184  return true;
1185  }
1186 
1187  private bool r_vowel_suffix()
1188  {
1189 
1190  int v_1;
1191  int v_2;
1192  // (, line 170
1193  // try, line 171
1194  v_1 = limit - cursor;
1195  do
1196  {
1197  // (, line 171
1198  // [, line 172
1199  ket = cursor;
1200  if (!(in_grouping_b(g_AEIO, 97, 242)))
1201  {
1202  cursor = limit - v_1;
1203  break;
1204  }
1205  // ], line 172
1206  bra = cursor;
1207  // call RV, line 172
1208  if (!r_RV())
1209  {
1210  cursor = limit - v_1;
1211  break;
1212  }
1213  // delete, line 172
1214  slice_del();
1215  // [, line 173
1216  ket = cursor;
1217  // literal, line 173
1218  if (!(eq_s_b(1, "i")))
1219  {
1220  cursor = limit - v_1;
1221  break;
1222  }
1223  // ], line 173
1224  bra = cursor;
1225  // call RV, line 173
1226  if (!r_RV())
1227  {
1228  cursor = limit - v_1;
1229  break;
1230  }
1231  // delete, line 173
1232  slice_del();
1233  } while (false);
1234  // try, line 175
1235  v_2 = limit - cursor;
1236  do
1237  {
1238  // (, line 175
1239  // [, line 176
1240  ket = cursor;
1241  // literal, line 176
1242  if (!(eq_s_b(1, "h")))
1243  {
1244  cursor = limit - v_2;
1245  break;
1246  }
1247  // ], line 176
1248  bra = cursor;
1249  if (!(in_grouping_b(g_CG, 99, 103)))
1250  {
1251  cursor = limit - v_2;
1252  break;
1253  }
1254  // call RV, line 176
1255  if (!r_RV())
1256  {
1257  cursor = limit - v_2;
1258  break;
1259  }
1260  // delete, line 176
1261  slice_del();
1262  } while (false);
1263  return true;
1264  }
1265 
1266  private bool CanStem()
1267  {
1268  bool subroot = false;
1269  int v_1;
1270  int v_2;
1271  int v_3;
1272  int v_4;
1273  int v_5;
1274  int v_6;
1275  int v_7;
1276  // (, line 181
1277  // do, line 182
1278  v_1 = cursor;
1279  do
1280  {
1281  // call prelude, line 182
1282  if (!r_prelude())
1283  {
1284  break;
1285  }
1286  } while (false);
1287  cursor = v_1;
1288  // do, line 183
1289  v_2 = cursor;
1290  do
1291  {
1292  // call mark_regions, line 183
1293  if (!r_mark_regions())
1294  {
1295  break;
1296  }
1297  } while (false);
1298  cursor = v_2;
1299  // backwards, line 184
1300  limit_backward = cursor; cursor = limit;
1301  // (, line 184
1302  // do, line 185
1303  v_3 = limit - cursor;
1304  do
1305  {
1306  // call attached_pronoun, line 185
1307  if (!r_attached_pronoun())
1308  {
1309  break;
1310  }
1311  } while (false);
1312  cursor = limit - v_3;
1313  // do, line 186
1314  v_4 = limit - cursor;
1315  do
1316  {
1317  // (, line 186
1318  // or, line 186
1319  do
1320  {
1321  v_5 = limit - cursor;
1322  do
1323  {
1324  // call standard_suffix, line 186
1325  if (!r_standard_suffix())
1326  {
1327  break;
1328  }
1329  subroot = true;
1330  if (subroot) { break; }
1331  } while (false);
1332  if (subroot) { subroot = false; break; }
1333  cursor = limit - v_5;
1334  // call verb_suffix, line 186
1335  if (!r_verb_suffix())
1336  {
1337  subroot = true;
1338  break;
1339  }
1340  } while (false);
1341  if (subroot) { subroot = false; break; }
1342  } while (false);
1343  cursor = limit - v_4;
1344  // do, line 187
1345  v_6 = limit - cursor;
1346  do
1347  {
1348  // call vowel_suffix, line 187
1349  if (!r_vowel_suffix())
1350  {
1351  break;
1352  }
1353  } while (false);
1354  cursor = limit - v_6;
1355  cursor = limit_backward; // do, line 189
1356  v_7 = cursor;
1357  do
1358  {
1359  // call postlude, line 189
1360  if (!r_postlude())
1361  {
1362  break;
1363  }
1364  } while (false);
1365  cursor = v_7;
1366  return true;
1367  }
1368 
1374  public string Stem(string s)
1375  {
1376  this.setCurrent(s.ToLowerInvariant());
1377  this.CanStem();
1378  return this.getCurrent();
1379  }
1380  }
1381 }