mittens 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (137) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3 -0
  3. data/Gemfile +7 -0
  4. data/LICENSE.txt +30 -0
  5. data/README.md +62 -0
  6. data/Rakefile +21 -0
  7. data/ext/mittens/ext.c +96 -0
  8. data/ext/mittens/extconf.rb +12 -0
  9. data/lib/mittens/version.rb +3 -0
  10. data/lib/mittens.rb +7 -0
  11. data/mittens.gemspec +22 -0
  12. data/vendor/snowball/.gitignore +26 -0
  13. data/vendor/snowball/.travis.yml +112 -0
  14. data/vendor/snowball/AUTHORS +27 -0
  15. data/vendor/snowball/CONTRIBUTING.rst +216 -0
  16. data/vendor/snowball/COPYING +29 -0
  17. data/vendor/snowball/GNUmakefile +742 -0
  18. data/vendor/snowball/NEWS +754 -0
  19. data/vendor/snowball/README.rst +37 -0
  20. data/vendor/snowball/ada/README.md +74 -0
  21. data/vendor/snowball/ada/generate/generate.adb +83 -0
  22. data/vendor/snowball/ada/generate.gpr +21 -0
  23. data/vendor/snowball/ada/src/stemmer.adb +620 -0
  24. data/vendor/snowball/ada/src/stemmer.ads +219 -0
  25. data/vendor/snowball/ada/src/stemwords.adb +70 -0
  26. data/vendor/snowball/ada/stemmer_config.gpr +83 -0
  27. data/vendor/snowball/ada/stemwords.gpr +21 -0
  28. data/vendor/snowball/algorithms/arabic.sbl +558 -0
  29. data/vendor/snowball/algorithms/armenian.sbl +301 -0
  30. data/vendor/snowball/algorithms/basque.sbl +149 -0
  31. data/vendor/snowball/algorithms/catalan.sbl +202 -0
  32. data/vendor/snowball/algorithms/danish.sbl +93 -0
  33. data/vendor/snowball/algorithms/dutch.sbl +164 -0
  34. data/vendor/snowball/algorithms/english.sbl +229 -0
  35. data/vendor/snowball/algorithms/finnish.sbl +197 -0
  36. data/vendor/snowball/algorithms/french.sbl +254 -0
  37. data/vendor/snowball/algorithms/german.sbl +139 -0
  38. data/vendor/snowball/algorithms/german2.sbl +145 -0
  39. data/vendor/snowball/algorithms/greek.sbl +701 -0
  40. data/vendor/snowball/algorithms/hindi.sbl +323 -0
  41. data/vendor/snowball/algorithms/hungarian.sbl +241 -0
  42. data/vendor/snowball/algorithms/indonesian.sbl +192 -0
  43. data/vendor/snowball/algorithms/irish.sbl +149 -0
  44. data/vendor/snowball/algorithms/italian.sbl +202 -0
  45. data/vendor/snowball/algorithms/kraaij_pohlmann.sbl +240 -0
  46. data/vendor/snowball/algorithms/lithuanian.sbl +373 -0
  47. data/vendor/snowball/algorithms/lovins.sbl +208 -0
  48. data/vendor/snowball/algorithms/nepali.sbl +92 -0
  49. data/vendor/snowball/algorithms/norwegian.sbl +80 -0
  50. data/vendor/snowball/algorithms/porter.sbl +139 -0
  51. data/vendor/snowball/algorithms/portuguese.sbl +218 -0
  52. data/vendor/snowball/algorithms/romanian.sbl +236 -0
  53. data/vendor/snowball/algorithms/russian.sbl +221 -0
  54. data/vendor/snowball/algorithms/serbian.sbl +2379 -0
  55. data/vendor/snowball/algorithms/spanish.sbl +230 -0
  56. data/vendor/snowball/algorithms/swedish.sbl +72 -0
  57. data/vendor/snowball/algorithms/tamil.sbl +405 -0
  58. data/vendor/snowball/algorithms/turkish.sbl +470 -0
  59. data/vendor/snowball/algorithms/yiddish.sbl +460 -0
  60. data/vendor/snowball/charsets/ISO-8859-2.sbl +98 -0
  61. data/vendor/snowball/charsets/KOI8-R.sbl +74 -0
  62. data/vendor/snowball/charsets/cp850.sbl +130 -0
  63. data/vendor/snowball/compiler/analyser.c +1547 -0
  64. data/vendor/snowball/compiler/driver.c +615 -0
  65. data/vendor/snowball/compiler/generator.c +1748 -0
  66. data/vendor/snowball/compiler/generator_ada.c +1702 -0
  67. data/vendor/snowball/compiler/generator_csharp.c +1322 -0
  68. data/vendor/snowball/compiler/generator_go.c +1278 -0
  69. data/vendor/snowball/compiler/generator_java.c +1313 -0
  70. data/vendor/snowball/compiler/generator_js.c +1316 -0
  71. data/vendor/snowball/compiler/generator_pascal.c +1387 -0
  72. data/vendor/snowball/compiler/generator_python.c +1337 -0
  73. data/vendor/snowball/compiler/generator_rust.c +1295 -0
  74. data/vendor/snowball/compiler/header.h +418 -0
  75. data/vendor/snowball/compiler/space.c +286 -0
  76. data/vendor/snowball/compiler/syswords.h +86 -0
  77. data/vendor/snowball/compiler/syswords2.h +13 -0
  78. data/vendor/snowball/compiler/tokeniser.c +567 -0
  79. data/vendor/snowball/csharp/.gitignore +8 -0
  80. data/vendor/snowball/csharp/Snowball/Algorithms/.gitignore +1 -0
  81. data/vendor/snowball/csharp/Snowball/Among.cs +108 -0
  82. data/vendor/snowball/csharp/Snowball/AssemblyInfo.cs +36 -0
  83. data/vendor/snowball/csharp/Snowball/Stemmer.cs +660 -0
  84. data/vendor/snowball/csharp/Stemwords/App.config +6 -0
  85. data/vendor/snowball/csharp/Stemwords/Program.cs +114 -0
  86. data/vendor/snowball/doc/TODO +12 -0
  87. data/vendor/snowball/doc/libstemmer_c_README +148 -0
  88. data/vendor/snowball/doc/libstemmer_csharp_README +53 -0
  89. data/vendor/snowball/doc/libstemmer_java_README +67 -0
  90. data/vendor/snowball/doc/libstemmer_js_README +48 -0
  91. data/vendor/snowball/doc/libstemmer_python_README +113 -0
  92. data/vendor/snowball/examples/stemwords.c +204 -0
  93. data/vendor/snowball/go/README.md +55 -0
  94. data/vendor/snowball/go/among.go +16 -0
  95. data/vendor/snowball/go/env.go +403 -0
  96. data/vendor/snowball/go/stemwords/generate.go +68 -0
  97. data/vendor/snowball/go/stemwords/main.go +68 -0
  98. data/vendor/snowball/go/util.go +34 -0
  99. data/vendor/snowball/iconv.py +50 -0
  100. data/vendor/snowball/include/libstemmer.h +78 -0
  101. data/vendor/snowball/java/org/tartarus/snowball/Among.java +29 -0
  102. data/vendor/snowball/java/org/tartarus/snowball/SnowballProgram.java +381 -0
  103. data/vendor/snowball/java/org/tartarus/snowball/SnowballStemmer.java +8 -0
  104. data/vendor/snowball/java/org/tartarus/snowball/TestApp.java +75 -0
  105. data/vendor/snowball/javascript/base-stemmer.js +294 -0
  106. data/vendor/snowball/javascript/stemwords.js +106 -0
  107. data/vendor/snowball/libstemmer/libstemmer_c.in +96 -0
  108. data/vendor/snowball/libstemmer/mkalgorithms.pl +90 -0
  109. data/vendor/snowball/libstemmer/mkmodules.pl +267 -0
  110. data/vendor/snowball/libstemmer/modules.txt +63 -0
  111. data/vendor/snowball/libstemmer/test.c +34 -0
  112. data/vendor/snowball/pascal/.gitignore +4 -0
  113. data/vendor/snowball/pascal/SnowballProgram.pas +430 -0
  114. data/vendor/snowball/pascal/generate.pl +23 -0
  115. data/vendor/snowball/pascal/stemwords-template.dpr +78 -0
  116. data/vendor/snowball/python/MANIFEST.in +7 -0
  117. data/vendor/snowball/python/create_init.py +54 -0
  118. data/vendor/snowball/python/setup.cfg +6 -0
  119. data/vendor/snowball/python/setup.py +81 -0
  120. data/vendor/snowball/python/snowballstemmer/among.py +13 -0
  121. data/vendor/snowball/python/snowballstemmer/basestemmer.py +323 -0
  122. data/vendor/snowball/python/stemwords.py +101 -0
  123. data/vendor/snowball/python/testapp.py +28 -0
  124. data/vendor/snowball/runtime/api.c +58 -0
  125. data/vendor/snowball/runtime/api.h +32 -0
  126. data/vendor/snowball/runtime/header.h +61 -0
  127. data/vendor/snowball/runtime/utilities.c +513 -0
  128. data/vendor/snowball/rust/Cargo.toml +7 -0
  129. data/vendor/snowball/rust/build.rs +55 -0
  130. data/vendor/snowball/rust/rust-pre-1.27-compat.patch +30 -0
  131. data/vendor/snowball/rust/src/main.rs +102 -0
  132. data/vendor/snowball/rust/src/snowball/algorithms/mod.rs +2 -0
  133. data/vendor/snowball/rust/src/snowball/among.rs +6 -0
  134. data/vendor/snowball/rust/src/snowball/mod.rs +6 -0
  135. data/vendor/snowball/rust/src/snowball/snowball_env.rs +421 -0
  136. data/vendor/snowball/tests/stemtest.c +95 -0
  137. metadata +178 -0
@@ -0,0 +1,254 @@
1
+ routines (
2
+ prelude postlude mark_regions
3
+ RV R1 R2
4
+ standard_suffix
5
+ i_verb_suffix
6
+ verb_suffix
7
+ residual_suffix
8
+ un_double
9
+ un_accent
10
+ )
11
+
12
+ externals ( stem )
13
+
14
+ integers ( pV p1 p2 )
15
+
16
+ groupings ( v keep_with_s )
17
+
18
+ stringescapes {}
19
+
20
+ /* special characters */
21
+
22
+ stringdef a^ '{U+00E2}' // a-circumflex
23
+ stringdef a` '{U+00E0}' // a-grave
24
+ stringdef c, '{U+00E7}' // c-cedilla
25
+
26
+ stringdef e" '{U+00EB}' // e-diaeresis (rare)
27
+ stringdef e' '{U+00E9}' // e-acute
28
+ stringdef e^ '{U+00EA}' // e-circumflex
29
+ stringdef e` '{U+00E8}' // e-grave
30
+ stringdef i" '{U+00EF}' // i-diaeresis
31
+ stringdef i^ '{U+00EE}' // i-circumflex
32
+ stringdef o^ '{U+00F4}' // o-circumflex
33
+ stringdef u^ '{U+00FB}' // u-circumflex
34
+ stringdef u` '{U+00F9}' // u-grave
35
+
36
+ define v 'aeiouy{a^}{a`}{e"}{e'}{e^}{e`}{i"}{i^}{o^}{u^}{u`}'
37
+
38
+ define prelude as repeat goto (
39
+
40
+ ( v [ ('u' ] v <- 'U') or
41
+ ('i' ] v <- 'I') or
42
+ ('y' ] <- 'Y')
43
+ )
44
+ or
45
+ ( [ '{e"}' ] <- 'He' )
46
+ or
47
+ ( [ '{i"}' ] <- 'Hi' )
48
+ or
49
+ ( ['y'] v <- 'Y' )
50
+ or
51
+ ( 'q' ['u'] <- 'U' )
52
+ )
53
+
54
+ define mark_regions as (
55
+
56
+ $pV = limit
57
+ $p1 = limit
58
+ $p2 = limit // defaults
59
+
60
+ do (
61
+ ( v v next )
62
+ or
63
+ among ( // this exception list begun Nov 2006
64
+ 'par' // paris, parie, pari
65
+ 'col' // colis
66
+ 'tap' // tapis
67
+ // extensions possible here
68
+ )
69
+ or
70
+ ( next gopast v )
71
+ setmark pV
72
+ )
73
+ do (
74
+ gopast v gopast non-v setmark p1
75
+ gopast v gopast non-v setmark p2
76
+ )
77
+ )
78
+
79
+ define postlude as repeat (
80
+
81
+ [substring] among(
82
+ 'I' (<- 'i')
83
+ 'U' (<- 'u')
84
+ 'Y' (<- 'y')
85
+ 'He' (<- '{e"}')
86
+ 'Hi' (<- '{i"}')
87
+ 'H' (delete)
88
+ '' (next)
89
+ )
90
+ )
91
+
92
+ backwardmode (
93
+
94
+ define RV as $pV <= cursor
95
+ define R1 as $p1 <= cursor
96
+ define R2 as $p2 <= cursor
97
+
98
+ define standard_suffix as (
99
+ [substring] among(
100
+
101
+ 'ance' 'iqUe' 'isme' 'able' 'iste' 'eux'
102
+ 'ances' 'iqUes' 'ismes' 'ables' 'istes'
103
+ ( R2 delete )
104
+ 'atrice' 'ateur' 'ation'
105
+ 'atrices' 'ateurs' 'ations'
106
+ ( R2 delete
107
+ try ( ['ic'] (R2 delete) or <-'iqU' )
108
+ )
109
+ 'logie'
110
+ 'logies'
111
+ ( R2 <- 'log' )
112
+ 'usion' 'ution'
113
+ 'usions' 'utions'
114
+ ( R2 <- 'u' )
115
+ 'ence'
116
+ 'ences'
117
+ ( R2 <- 'ent' )
118
+ 'ement'
119
+ 'ements'
120
+ (
121
+ RV delete
122
+ try (
123
+ [substring] among(
124
+ 'iv' (R2 delete ['at'] R2 delete)
125
+ 'eus' ((R2 delete) or (R1<-'eux'))
126
+ 'abl' 'iqU'
127
+ (R2 delete)
128
+ 'i{e`}r' 'I{e`}r' //)
129
+ (RV <-'i') //)--new 2 Sept 02
130
+ )
131
+ )
132
+ )
133
+ 'it{e'}'
134
+ 'it{e'}s'
135
+ (
136
+ R2 delete
137
+ try (
138
+ [substring] among(
139
+ 'abil' ((R2 delete) or <-'abl')
140
+ 'ic' ((R2 delete) or <-'iqU')
141
+ 'iv' (R2 delete)
142
+ )
143
+ )
144
+ )
145
+ 'if' 'ive'
146
+ 'ifs' 'ives'
147
+ (
148
+ R2 delete
149
+ try ( ['at'] R2 delete ['ic'] (R2 delete) or <-'iqU' )
150
+ )
151
+ 'eaux' (<- 'eau')
152
+ 'aux' (R1 <- 'al')
153
+ 'euse'
154
+ 'euses'((R2 delete) or (R1<-'eux'))
155
+
156
+ 'issement'
157
+ 'issements'(R1 non-v delete) // verbal
158
+
159
+ // fail(...) below forces entry to verb_suffix. -ment typically
160
+ // follows the p.p., e.g 'confus{e'}ment'.
161
+
162
+ 'amment' (RV fail(<- 'ant'))
163
+ 'emment' (RV fail(<- 'ent'))
164
+ 'ment'
165
+ 'ments' (test(v RV) fail(delete))
166
+ // v is e,i,u,{e'},I or U
167
+ )
168
+ )
169
+
170
+ define i_verb_suffix as setlimit tomark pV for (
171
+ [substring] among (
172
+ '{i^}mes' '{i^}t' '{i^}tes' 'i' 'ie' 'ies' 'ir' 'ira' 'irai'
173
+ 'iraIent' 'irais' 'irait' 'iras' 'irent' 'irez' 'iriez'
174
+ 'irions' 'irons' 'iront' 'is' 'issaIent' 'issais' 'issait'
175
+ 'issant' 'issante' 'issantes' 'issants' 'isse' 'issent' 'isses'
176
+ 'issez' 'issiez' 'issions' 'issons' 'it'
177
+ (not 'H' non-v delete)
178
+ )
179
+ )
180
+
181
+ define verb_suffix as setlimit tomark pV for (
182
+ [substring] among (
183
+ 'ions'
184
+ (R2 delete)
185
+
186
+ '{e'}' '{e'}e' '{e'}es' '{e'}s' '{e`}rent' 'er' 'era' 'erai'
187
+ 'eraIent' 'erais' 'erait' 'eras' 'erez' 'eriez' 'erions'
188
+ 'erons' 'eront' 'ez' 'iez'
189
+
190
+ // 'ons' //-best omitted
191
+
192
+ (delete)
193
+
194
+ '{a^}mes' '{a^}t' '{a^}tes' 'a' 'ai' 'aIent' 'ais' 'ait' 'ant'
195
+ 'ante' 'antes' 'ants' 'as' 'asse' 'assent' 'asses' 'assiez'
196
+ 'assions'
197
+ (delete
198
+ try(['e'] delete)
199
+ )
200
+ )
201
+ )
202
+
203
+ define keep_with_s 'aiou{e`}s'
204
+
205
+ define residual_suffix as (
206
+ try(['s'] test ('Hi' or non-keep_with_s) delete)
207
+ setlimit tomark pV for (
208
+ [substring] among(
209
+ 'ion' (R2 's' or 't' delete)
210
+ 'ier' 'i{e`}re'
211
+ 'Ier' 'I{e`}re' (<-'i')
212
+ 'e' (delete)
213
+ )
214
+ )
215
+ )
216
+
217
+ define un_double as (
218
+ test among('enn' 'onn' 'ett' 'ell' 'eill') [next] delete
219
+ )
220
+
221
+ define un_accent as (
222
+ atleast 1 non-v
223
+ [ '{e'}' or '{e`}' ] <-'e'
224
+ )
225
+ )
226
+
227
+ define stem as (
228
+
229
+ do prelude
230
+ do mark_regions
231
+ backwards (
232
+
233
+ do (
234
+ (
235
+ ( standard_suffix or
236
+ i_verb_suffix or
237
+ verb_suffix
238
+ )
239
+ and
240
+ try( [ ('Y' ] <- 'i' ) or
241
+ ('{c,}'] <- 'c' )
242
+ )
243
+ ) or
244
+ residual_suffix
245
+ )
246
+
247
+ // try(['ent'] RV delete) // is best omitted
248
+
249
+ do un_double
250
+ do un_accent
251
+ )
252
+ do postlude
253
+ )
254
+
@@ -0,0 +1,139 @@
1
+
2
+ /*
3
+ Extra rule for -nisse ending added 11 Dec 2009
4
+ */
5
+
6
+ routines (
7
+ prelude postlude
8
+ mark_regions
9
+ R1 R2
10
+ standard_suffix
11
+ )
12
+
13
+ externals ( stem )
14
+
15
+ integers ( p1 p2 x )
16
+
17
+ groupings ( v s_ending st_ending )
18
+
19
+ stringescapes {}
20
+
21
+ /* special characters */
22
+
23
+ stringdef a" '{U+00E4}'
24
+ stringdef o" '{U+00F6}'
25
+ stringdef u" '{U+00FC}'
26
+ stringdef ss '{U+00DF}'
27
+
28
+ define v 'aeiouy{a"}{o"}{u"}'
29
+
30
+ define s_ending 'bdfghklmnrt'
31
+ define st_ending s_ending - 'r'
32
+
33
+ define prelude as (
34
+
35
+ test repeat (
36
+ (
37
+ ['{ss}'] <- 'ss'
38
+ ) or next
39
+ )
40
+
41
+ repeat goto (
42
+ v [('u'] v <- 'U') or
43
+ ('y'] v <- 'Y')
44
+ )
45
+ )
46
+
47
+ define mark_regions as (
48
+
49
+ $p1 = limit
50
+ $p2 = limit
51
+
52
+ test(hop 3 setmark x)
53
+
54
+ gopast v gopast non-v setmark p1
55
+ try($p1 < x $p1 = x) // at least 3
56
+ gopast v gopast non-v setmark p2
57
+
58
+ )
59
+
60
+ define postlude as repeat (
61
+
62
+ [substring] among(
63
+ 'Y' (<- 'y')
64
+ 'U' (<- 'u')
65
+ '{a"}' (<- 'a')
66
+ '{o"}' (<- 'o')
67
+ '{u"}' (<- 'u')
68
+ '' (next)
69
+ )
70
+
71
+ )
72
+
73
+ backwardmode (
74
+
75
+ define R1 as $p1 <= cursor
76
+ define R2 as $p2 <= cursor
77
+
78
+ define standard_suffix as (
79
+ do (
80
+ [substring] R1 among(
81
+ 'em' 'ern' 'er'
82
+ ( delete
83
+ )
84
+ 'e' 'en' 'es'
85
+ ( delete
86
+ try (['s'] 'nis' delete)
87
+ )
88
+ 's'
89
+ ( s_ending delete
90
+ )
91
+ )
92
+ )
93
+ do (
94
+ [substring] R1 among(
95
+ 'en' 'er' 'est'
96
+ ( delete
97
+ )
98
+ 'st'
99
+ ( st_ending hop 3 delete
100
+ )
101
+ )
102
+ )
103
+ do (
104
+ [substring] R2 among(
105
+ 'end' 'ung'
106
+ ( delete
107
+ try (['ig'] not 'e' R2 delete)
108
+ )
109
+ 'ig' 'ik' 'isch'
110
+ ( not 'e' delete
111
+ )
112
+ 'lich' 'heit'
113
+ ( delete
114
+ try (
115
+ ['er' or 'en'] R1 delete
116
+ )
117
+ )
118
+ 'keit'
119
+ ( delete
120
+ try (
121
+ [substring] R2 among(
122
+ 'lich' 'ig'
123
+ ( delete
124
+ )
125
+ )
126
+ )
127
+ )
128
+ )
129
+ )
130
+ )
131
+ )
132
+
133
+ define stem as (
134
+ do prelude
135
+ do mark_regions
136
+ backwards
137
+ do standard_suffix
138
+ do postlude
139
+ )
@@ -0,0 +1,145 @@
1
+
2
+ /*
3
+ Extra rule for -nisse ending added 11 Dec 2009
4
+ */
5
+
6
+ routines (
7
+ prelude postlude
8
+ mark_regions
9
+ R1 R2
10
+ standard_suffix
11
+ )
12
+
13
+ externals ( stem )
14
+
15
+ integers ( p1 p2 x )
16
+
17
+ groupings ( v s_ending st_ending )
18
+
19
+ stringescapes {}
20
+
21
+ /* special characters */
22
+
23
+ stringdef a" '{U+00E4}'
24
+ stringdef o" '{U+00F6}'
25
+ stringdef u" '{U+00FC}'
26
+ stringdef ss '{U+00DF}'
27
+
28
+ define v 'aeiouy{a"}{o"}{u"}'
29
+
30
+ define s_ending 'bdfghklmnrt'
31
+ define st_ending s_ending - 'r'
32
+
33
+ define prelude as (
34
+
35
+ test repeat goto (
36
+ v [('u'] v <- 'U') or
37
+ ('y'] v <- 'Y')
38
+ )
39
+
40
+ repeat (
41
+ [substring] among(
42
+ '{ss}' (<- 'ss')
43
+ 'ae' (<- '{a"}')
44
+ 'oe' (<- '{o"}')
45
+ 'ue' (<- '{u"}')
46
+ 'qu' ()
47
+ '' (next)
48
+ )
49
+ )
50
+
51
+ )
52
+
53
+ define mark_regions as (
54
+
55
+ $p1 = limit
56
+ $p2 = limit
57
+
58
+ test(hop 3 setmark x)
59
+
60
+ gopast v gopast non-v setmark p1
61
+ try($p1 < x $p1 = x) // at least 3
62
+ gopast v gopast non-v setmark p2
63
+
64
+ )
65
+
66
+ define postlude as repeat (
67
+
68
+ [substring] among(
69
+ 'Y' (<- 'y')
70
+ 'U' (<- 'u')
71
+ '{a"}' (<- 'a')
72
+ '{o"}' (<- 'o')
73
+ '{u"}' (<- 'u')
74
+ '' (next)
75
+ )
76
+
77
+ )
78
+
79
+ backwardmode (
80
+
81
+ define R1 as $p1 <= cursor
82
+ define R2 as $p2 <= cursor
83
+
84
+ define standard_suffix as (
85
+ do (
86
+ [substring] R1 among(
87
+ 'em' 'ern' 'er'
88
+ ( delete
89
+ )
90
+ 'e' 'en' 'es'
91
+ ( delete
92
+ try (['s'] 'nis' delete)
93
+ )
94
+ 's'
95
+ ( s_ending delete
96
+ )
97
+ )
98
+ )
99
+ do (
100
+ [substring] R1 among(
101
+ 'en' 'er' 'est'
102
+ ( delete
103
+ )
104
+ 'st'
105
+ ( st_ending hop 3 delete
106
+ )
107
+ )
108
+ )
109
+ do (
110
+ [substring] R2 among(
111
+ 'end' 'ung'
112
+ ( delete
113
+ try (['ig'] not 'e' R2 delete)
114
+ )
115
+ 'ig' 'ik' 'isch'
116
+ ( not 'e' delete
117
+ )
118
+ 'lich' 'heit'
119
+ ( delete
120
+ try (
121
+ ['er' or 'en'] R1 delete
122
+ )
123
+ )
124
+ 'keit'
125
+ ( delete
126
+ try (
127
+ [substring] R2 among(
128
+ 'lich' 'ig'
129
+ ( delete
130
+ )
131
+ )
132
+ )
133
+ )
134
+ )
135
+ )
136
+ )
137
+ )
138
+
139
+ define stem as (
140
+ do prelude
141
+ do mark_regions
142
+ backwards
143
+ do standard_suffix
144
+ do postlude
145
+ )