Add regression test for previous commit
[xapian.git] / xapian-core / languages / arabic.sbl
blobb741a3a933b05b99ea61c85da7e95baf73a79ca7
1 // Alias: ar
2 /*
3  * Authors:
4  * - Assem Chelli, < assem [dot] ch [at] gmail >
5  * - Abdelkrim Aries <ab [underscore] aries [at] esi [dot] dz>
6  *
7 */
9 stringescapes { }
11 /* the Arabic letters in Unicode */
12 // Hamza
13 stringdef o     '{U+0621}' // Hamza
14 stringdef ao    '{U+0623}' // Hamza above Alef
15 stringdef ao_   '{U+0625}' // Hamza below Alef
16 stringdef a~    '{U+0622}' // Alef madda
17 stringdef wo    '{U+0624}' // Hamza above waw
18 stringdef yo    '{U+0626}' // Hamza above yeh
20 // Letters
21 stringdef a     '{U+0627}' // Alef
22 stringdef a_    '{U+0649}' // Alef Maksura
23 stringdef b     '{U+0628}' // Beh
24 stringdef t_    '{U+0629}' // Teh_Marbuta
25 stringdef t     '{U+062A}' // Teh
26 stringdef th    '{U+062B}' // Theh
27 stringdef j     '{U+062C}' // Jeem
28 stringdef h     '{U+062D}' // Hah
29 stringdef x     '{U+062E}' // Khah
30 stringdef d     '{U+062F}' // Dal
31 stringdef dz    '{U+0630}' // Thal
32 stringdef r     '{U+0631}' // Reh
33 stringdef z     '{U+0632}' // Zain
34 stringdef s     '{U+0633}' // Seen
35 stringdef sh    '{U+0634}' // Sheen
36 stringdef c     '{U+0635}' // Sad
37 stringdef dh    '{U+0636}' // Dad
38 stringdef tt    '{U+0637}' // Tah
39 stringdef zh    '{U+0638}' // Zah
40 stringdef i     '{U+0639}' // Ain
41 stringdef gh    '{U+063A}' // Ghain
42 stringdef f     '{U+0641}' // Feh
43 stringdef q     '{U+0642}' // Qaf
44 stringdef k     '{U+0643}' // Kaf
45 stringdef l     '{U+0644}' // Lam
46 stringdef m     '{U+0645}' // Meem
47 stringdef n     '{U+0646}' // Noon
48 stringdef e     '{U+0647}' // Heh
49 stringdef w     '{U+0648}' // Waw
50 stringdef y     '{U+064A}' // Yeh
52 // Diacritics
53 stringdef aan   '{U+064B}' // FatHatan
54 stringdef uun   '{U+064C}' // Dammatan
55 stringdef iin   '{U+064D}' // Kasratan
56 stringdef aa    '{U+064E}' // FatHa
57 stringdef uu    '{U+064F}' // Damma
58 stringdef ii    '{U+0650}' // Kasra
59 stringdef oo    '{U+0652}' // Sukun
60 stringdef ~     '{U+0651}' // Shadda
62 // Hindu–Arabic numerals
63 stringdef 0     '{U+0660}'
64 stringdef 1     '{U+0661}'
65 stringdef 2     '{U+0662}'
66 stringdef 3     '{U+0663}'
67 stringdef 4     '{U+0664}'
68 stringdef 5     '{U+0665}'
69 stringdef 6     '{U+0666}'
70 stringdef 7     '{U+0667}'
71 stringdef 8     '{U+0668}'
72 stringdef 9     '{U+0669}'
73 stringdef %     '{U+066A}'  // PERCENT
74 stringdef .     '{U+066B}'  // DECIMAL
75 stringdef '     '{U+066C}'  // THOUSANDS
77 // Kasheeda
78 stringdef _     '{U+0640}' // Kasheeda, Tatweel
80 // Ponctuation marks
81 stringdef ,   '{U+060C}' // COMMA
82 stringdef ;   '{U+061B}' // SEMICOLON
83 stringdef ?   '{U+061F}' // QUESTION
85 // Shaped forms
86 stringdef o1     '{U+FE80}'  // HAMZA
87 stringdef ao1    '{U+FE83}'  // ALEF_HAMZA_ABOVE
88 stringdef ao2    '{U+FE84}'  // ALEF_HAMZA_ABOVE
89 stringdef ao_1   '{U+FE87}'  // ALEF_HAMZA_BELOW
90 stringdef ao_2   '{U+FE88}'  // ALEF_HAMZA_BELOW
91 stringdef yo1    '{U+FE8B}'  // YEH_HAMZA
92 stringdef yo2    '{U+FE8C}'  // YEH_HAMZA
93 stringdef yo3    '{U+FE89}'  // YEH_HAMZA
94 stringdef yo4    '{U+FE8A}'  // YEH_HAMZA
95 stringdef a~1    '{U+FE81}'  // ALEF_MADDA
96 stringdef a~2    '{U+FE82}'  // ALEF_MADDA
97 stringdef wo1    '{U+FE85}'  // WAW_HAMZA
98 stringdef wo2    '{U+FE86}'  // WAW_HAMZA
99 stringdef a1     '{U+FE8D}'  // ALEF
100 stringdef a2     '{U+FE8E}'  // ALEF
101 stringdef b1     '{U+FE8F}'  // BEH
102 stringdef b2     '{U+FE90}'  // BEH
103 stringdef b3     '{U+FE91}'  // BEH
104 stringdef b4     '{U+FE92}'  // BEH
105 stringdef t_1    '{U+FE93}'  // TEH_MARBUTA
106 stringdef t_2    '{U+FE94}'  // TEH_MARBUTA
107 stringdef t1     '{U+FE97}'  // TEH
108 stringdef t2     '{U+FE98}'  // TEH
109 stringdef t3     '{U+FE95}'  // TEH
110 stringdef t4     '{U+FE96}'  // TEH
111 stringdef th1    '{U+FE9B}'  // THEH
112 stringdef th2    '{U+FE9C}'  // THEH
113 stringdef th3    '{U+FE9A}'  // THEH
114 stringdef th4    '{U+FE99}'  // THEH
115 stringdef j1     '{U+FE9F}'  // JEEM
116 stringdef j2     '{U+FEA0}'  // JEEM
117 stringdef j3     '{U+FE9D}'  // JEEM
118 stringdef j4     '{U+FE9E}'  // JEEM
119 stringdef h1     '{U+FEA3}'  // HAH
120 stringdef h2     '{U+FEA4}'  // HAH
121 stringdef h3     '{U+FEA1}'  // HAH
122 stringdef h4     '{U+FEA2}'  // HAH
123 stringdef x1     '{U+FEA7}'  // KHAH
124 stringdef x2     '{U+FEA8}'  // KHAH
125 stringdef x3     '{U+FEA5}'  // KHAH
126 stringdef x4     '{U+FEA6}'  // KHAH
127 stringdef d1     '{U+FEA9}'  // DAL
128 stringdef d2     '{U+FEAA}'  // DAL
129 stringdef dz1    '{U+FEAB}'  // THAL
130 stringdef dz2    '{U+FEAC}'  // THAL
131 stringdef r1     '{U+FEAD}'  // REH
132 stringdef r2     '{U+FEAE}'  // REH
133 stringdef z1     '{U+FEAF}'  // ZAIN
134 stringdef z2     '{U+FEB0}'  // ZAIN
135 stringdef s1     '{U+FEB3}'  // SEEN
136 stringdef s2     '{U+FEB4}'  // SEEN
137 stringdef s3     '{U+FEB1}'  // SEEN
138 stringdef s4     '{U+FEB2}'  // SEEN
139 stringdef sh1    '{U+FEB7}'  // SHEEN
140 stringdef sh2    '{U+FEB8}'  // SHEEN
141 stringdef sh3    '{U+FEB5}'  // SHEEN
142 stringdef sh4    '{U+FEB6}'  // SHEEN
143 stringdef c1     '{U+FEBB}'  // SAD
144 stringdef c2     '{U+FEBC}'  // SAD
145 stringdef c3     '{U+FEB9}'  // SAD
146 stringdef c4     '{U+FEBA}'  // SAD
147 stringdef dh1    '{U+FEBF}'  // DAD
148 stringdef dh2    '{U+FEC0}'  // DAD
149 stringdef dh3    '{U+FEBD}'  // DAD
150 stringdef dh4    '{U+FEBE}'  // DAD
151 stringdef tt1    '{U+FEC3}'  // TAH
152 stringdef tt2    '{U+FEC4}'  // TAH
153 stringdef tt3    '{U+FEC1}'  // TAH
154 stringdef tt4    '{U+FEC2}'  // TAH
155 stringdef zh1    '{U+FEC7}'  // ZAH
156 stringdef zh2    '{U+FEC8}'  // ZAH
157 stringdef zh3    '{U+FEC5}'  // ZAH
158 stringdef zh4    '{U+FEC6}'  // ZAH
159 stringdef i1     '{U+FECB}'  // AIN
160 stringdef i2     '{U+FECC}'  // AIN
161 stringdef i3     '{U+FEC9}'  // AIN
162 stringdef i4     '{U+FECA}'  // AIN
163 stringdef gh1    '{U+FECF}'  // GHAIN
164 stringdef gh2    '{U+FED0}'  // GHAIN
165 stringdef gh3    '{U+FECD}'  // GHAIN
166 stringdef gh4    '{U+FECE}'  // GHAIN
167 stringdef f1     '{U+FED3}'  // FEH
168 stringdef f2     '{U+FED4}'  // FEH
169 stringdef f3     '{U+FED1}'  // FEH
170 stringdef f4     '{U+FED2}'  // FEH
171 stringdef q1     '{U+FED7}'  // QAF
172 stringdef q2     '{U+FED8}'  // QAF
173 stringdef q3     '{U+FED5}'  // QAF
174 stringdef q4     '{U+FED6}'  // QAF
175 stringdef k1     '{U+FEDB}'  // KAF
176 stringdef k2     '{U+FEDC}'  // KAF
177 stringdef k3     '{U+FED9}'  // KAF
178 stringdef k4     '{U+FEDA}'  // KAF
179 stringdef l1     '{U+FEDF}'  // LAM
180 stringdef l2     '{U+FEE0}'  // LAM
181 stringdef l3     '{U+FEDD}'  // LAM
182 stringdef l4     '{U+FEDE}'  // LAM
183 stringdef m1     '{U+FEE3}'  // MEEM
184 stringdef m2     '{U+FEE4}'  // MEEM
185 stringdef m3     '{U+FEE1}'  // MEEM
186 stringdef m4     '{U+FEE2}'  // MEEM
187 stringdef n1     '{U+FEE7}'  // NOON
188 stringdef n2     '{U+FEE8}'  // NOON
189 stringdef n3     '{U+FEE5}'  // NOON
190 stringdef n4     '{U+FEE6}'  // NOON
191 stringdef e1     '{U+FEEB}'  // HEH
192 stringdef e2     '{U+FEEC}'  // HEH
193 stringdef e3     '{U+FEE9}'  // HEH
194 stringdef e4     '{U+FEEA}'  // HEH
195 stringdef w1     '{U+FEED}'  // WAW
196 stringdef w2     '{U+FEEE}'  // WAW
197 stringdef a_1    '{U+FEEF}'  // ALEF_MAKSURA
198 stringdef a_2    '{U+FEF0}'  // ALEF_MAKSURA
199 stringdef y1     '{U+FEF3}'  // YEH
200 stringdef y2     '{U+FEF4}'  // YEH
201 stringdef y3     '{U+FEF1}'  // YEH
202 stringdef y4     '{U+FEF2}'  // YEH
204 // Ligatures Lam-Alef
205 stringdef la      '{U+FEFB}' // LAM_ALEF
206 stringdef la2     '{U+FEFC}' // LAM_ALEF
207 stringdef lao     '{U+FEF7}' // LAM_ALEF_HAMZA_ABOVE
208 stringdef lao2    '{U+FEF8}' // LAM_ALEF_HAMZA_ABOVE
209 stringdef lao_    '{U+FEF9}' // LAM_ALEF_HAMZA_BELOW
210 stringdef lao_2   '{U+FEFA}' // LAM_ALEF_HAMZA_BELOW
211 stringdef la~     '{U+FEF5}' // LAM_ALEF_MADDA_ABOVE
212 stringdef la~2    '{U+FEF6}' // LAM_ALEF_MADDA_ABOVE
215 booleans (
216             is_noun
217             is_verb
218             is_defined
219          )
221 routines (
222     Prefix_Step1
223     Prefix_Step2
224     Prefix_Step3a_Noun
225     Prefix_Step3b_Noun
226     Prefix_Step3_Verb
227     Prefix_Step4_Verb
229     Suffix_All_alef_maqsura
230     Suffix_Noun_Step1a
231     Suffix_Noun_Step1b
232     Suffix_Noun_Step2a
233     Suffix_Noun_Step2b
234     Suffix_Noun_Step2c1
235     Suffix_Noun_Step2c2
236     Suffix_Noun_Step3
237     Suffix_Verb_Step1
238     Suffix_Verb_Step2a
239     Suffix_Verb_Step2b
240     Suffix_Verb_Step2c
242     Normalize_post
243     Normalize_pre
245     Checks1
248 externals ( stem )
250 groupings (  )
253 // Normalizations
254 define Normalize_pre as (
255     loop len (
256         (
257             [substring] among (
258                 '{aan}' '{uun}' '{iin}' '{aa}' '{uu}' '{ii}' '{oo}' '{~}'( delete ) // strip vocalization
259                 '{_}' ( delete ) // strip kasheeda
261                 // Ponctuation marks
262                 '.' ',' ';' ':'  '?' '!' '/' '*' '%' '\' '"' ( delete) // General
263                 '{,}' '{;}' '{?}'  ( delete ) // Arabic-specific
265                 // Hindu–Arabic numerals
266                 '{0}' ( <- '0')
267                 '{1}' ( <- '1')
268                 '{2}' ( <- '2')
269                 '{3}' ( <- '3')
270                 '{4}' ( <- '4')
271                 '{5}' ( <- '5')
272                 '{6}' ( <- '6')
273                 '{7}' ( <- '7')
274                 '{8}' ( <- '8')
275                 '{9}' ( <- '9')
276                 '{%}' '{.}' '{'}' ( delete )
278                 // Shaped forms
279                 '{o1}' ( <- '{o}' ) // HAMZA
280                 '{ao1}' '{ao2}'  ( <- '{ao}' ) // ALEF_HAMZA_ABOVE
281                 '{ao_1}' '{ao_2}' ( <- '{ao_}' ) // ALEF_HAMZA_BELOW
282                 '{yo1}'  '{yo2}' '{yo3}'  '{yo4}'  ( <- '{yo}' ) // YEH_HAMZA
283                 '{a~1}'  '{a~2}'( <- '{a~}' ) // ALEF_MADDA
284                 '{wo1}' '{wo2}'( <- '{wo}' ) // WAW_HAMZA
285                 '{a1}' '{a2}' ( <- '{a}' ) // ALEF
286                 '{b1}' '{b2}' '{b3}'  '{b4}'  ( <- '{b}' ) // BEH
287                 '{t_1}'  '{t_2}' ( <- '{t_}' ) // TEH_MARBUTA
288                 '{t1}'   '{t2}' '{t3}' '{t4}'  ( <- '{t}' ) // TEH
289                 '{th1}' '{th2}' '{th3}' '{th4}' ( <- '{th}' ) // THEH
290                 '{j1}' '{j2}'  '{j3}' '{j4}'(  <- '{j}' ) // JEEM
291                 '{h1}' '{h2}' '{h3}' '{h4}' ( <- '{h}' ) // HAH
292                 '{x1}' '{x2}' '{x3}' '{x4}'( <- '{x}' ) // KHAH
293                 '{d1}'  '{d2}'  ( <- '{d}' ) // DAL
294                 '{dz1}''{dz2}' ( <- '{dz}' ) // THAL
295                 '{r1}' '{r2}'( <- '{r}' ) // REH
296                 '{z1}' '{z2}'  ( <- '{z}' ) // ZAIN
297                 '{s1}'  '{s2}'   '{s3}' '{s4}'( <- '{s}' ) // SEEN
298                 '{sh1}' '{sh2}' '{sh3}' '{sh4}' ( <- '{sh}' ) // SHEEN
299                 '{c1}' '{c2}' '{c3}' '{c4}'( <- '{c}' ) // SAD
300                 '{dh1}'    '{dh2}'   '{dh3}'  '{dh4}'( <- '{dh}' ) // DAD
301                 '{tt1}'  '{tt2}'  '{tt3}'  '{tt4}' ( <- '{tt}' ) // TAH
302                 '{zh1}' '{zh2}' '{zh3}'    '{zh4}'( <- '{zh}' ) // ZAH
303                 '{i1}' '{i2}' '{i3}'  '{i4}'( <- '{i}' ) // AIN
304                 '{gh1}' '{gh2}' '{gh3}'  '{gh4}'( <- '{gh}' ) // GHAIN
305                 '{f1}'  '{f2}' '{f3}'  '{f4}' ( <- '{f}' ) // FEH
306                 '{q1}' '{q2}' '{q3}' '{q4}' ( <- '{q}' ) // QAF
307                 '{k1}' '{k2}' '{k3}'  '{k4}'( <- '{k}' ) // KAF
308                 '{l1}' '{l2}' '{l3}' '{l4}'( <- '{l}' ) // LAM
309                 '{m1}' '{m2}'  '{m3}' '{m4}'   ( <- '{m}' ) // MEEM
310                 '{n1}'  '{n2}' '{n3}'  '{n4}'( <- '{n}' ) // NOON
311                 '{e1}' '{e2}' '{e3}' '{e4}' ( <- '{e}' ) // HEH
312                 '{w1}'  '{w2}'  ( <- '{w}' ) // WAW
313                 '{a_1}' '{a_2}' ( <- '{a_}' ) // ALEF_MAKSURA
314                 '{y1}' '{y2}' '{y3}' '{y4}' ( <- '{y}' ) // YEH
316                 // Ligatures Lam-Alef
317                 '{la}'  '{la2}'     (<- '{l}{a}')
318                 '{lao}'  '{lao2}'   (<- '{l}{ao}')
319                 '{lao_}'  '{lao_2}' (<- '{l}{ao_}')
320                 '{la~}'  '{la~2}'    (<- '{l}{a~}')
322             )
323         )
324         or
325         next
326     )
329 define Normalize_post as (
331     do (
332         // normalize last hamza
333         backwards (
334         [substring] among (
335             '{ao}''{ao_}' '{a~}' ( <- '{o}')
336         '{wo}' ( <- '{o}')
337         '{yo}' ( <- '{o}')
338         )
339         )
340     )
342     do repeat (
343         (
344         // normalize other hamza's
345             [substring] among (
346                 '{ao}''{ao_}' '{a~}' ( <- '{a}')
347                 '{wo}' ( <- '{w}')
348                 '{yo}' ( <- '{y}')
349             )
350         )
351         or
352         next
353     )
356 // Checks
357 define Checks1 as (
358     [substring] among (
359         '{b}{a}{l}' '{k}{a}{l}' ($(len > 4)  set is_noun  unset is_verb set is_defined)
360         '{l}{l}' '{a}{l}' ($(len > 3)  set is_noun unset is_verb set is_defined)
361     )
365 //prefixes
366 define Prefix_Step1 as (
367          [substring] among (
368              '{ao}{ao}' ($(len > 3) <-  '{ao}'  )
369              '{ao}{a~}' ($(len > 3) <-  '{a~}'  )
370              '{ao}{wo}' ($(len > 3) <-  '{ao}'  )
371              '{ao}{a}' ($(len > 3) <-  '{a}'  )
372              '{ao}{ao_}' ($(len > 3) <-  '{ao_}'  )
373             // '{ao}' ($(len > 3) delete) //rare case
374         )
377 define Prefix_Step2 as (
378         not '{f}{a}'
379         not '{w}{a}'
380         [substring] among (
381             '{f}' ($(len > 3) delete)
382             '{w}' ($(len > 3) delete)
383         )
386 define Prefix_Step3a_Noun as ( // it is noun and defined
387         [substring] among (
388             '{b}{a}{l}' '{k}{a}{l}' ($(len > 5) delete)
389             '{l}{l}' '{a}{l}' ($(len > 4) delete)
390         )
393 define Prefix_Step3b_Noun as ( // probably  noun and defined
394         not '{b}{a}' // exception
395         [substring] among (
396             '{b}' ($(len > 3) delete)
397             // '{k}'  '{l}' ($(len > 3) delete) // BUG: cause confusion
398             '{b}{b}' ($(len > 3) <-  '{b}'  )
399             '{k}{k}'  ($(len > 3) <-  '{k}'  )
400            )
404 define Prefix_Step3_Verb as (
405         [substring] among (
406             //'{s}' ($(len > 4) delete)// BUG: cause confusion
407             '{s}{y}' ($(len > 4) <- '{y}' )
408             '{s}{t}' ($(len > 4) <- '{t}')
409             '{s}{n}' ($(len > 4) <- '{n}')
410             '{s}{ao}' ($(len > 4) <- '{ao}')
411         )
414 define Prefix_Step4_Verb as (
415         [substring] among (
416             '{y}{s}{t}' '{n}{s}{t}' '{t}{s}{t}' ($(len > 4) set is_verb unset is_noun <-  '{a}{s}{t}' )
417         )
420 // suffixes
421 backwardmode (
423         define Suffix_Noun_Step1a as (
424                 [substring] among (
425                         '{y}' '{k}' '{e}' ($(len >= 4) delete)
426                         '{n}{a}' '{k}{m}' '{e}{a}' '{e}{n}' '{e}{m}' ($(len >= 5)  delete)
427                         '{k}{m}{a}' '{e}{m}{a}' ($(len >= 6) delete)
428                 )
429             )
430         define Suffix_Noun_Step1b as (
431             [substring] among (
432                 '{n}' ($(len > 5) delete)
433             )
434         )
436         define Suffix_Noun_Step2a as (
437                 [substring] among (
438                         '{a}' '{y}' '{w}' ($(len > 4) delete)
439                 )
440             )
442         define Suffix_Noun_Step2b as (
443             [substring] among (
444                 '{a}{t}' ($(len >= 5) delete)
445             )
446         )
448         define Suffix_Noun_Step2c1 as (
449             [substring] among (
450                 '{t}' ($(len >= 4) delete)
451             )
452         )
453         define Suffix_Noun_Step2c2 as ( // feminine t_
454             [substring] among (
455                 '{t_}' ($(len >= 4) delete)
456             )
457         )
458         define Suffix_Noun_Step3 as ( // ya' nisbiya
459             [substring] among (
460                 '{y}' ($(len >= 3) delete)
461             )
462         )
464         define Suffix_Verb_Step1 as (
465                 [substring] among (
466                         '{e}' '{k}' ($(len >= 4) delete)
467                         '{n}{y}' '{n}{a}' '{e}{a}' '{e}{m}' '{e}{n}' '{k}{m}' '{k}{n}' ($(len >= 5) delete)
468                         '{e}{m}{a}' '{k}{m}{a}' '{k}{m}{w}'($(len >= 6) delete)
469                 )
470             )
471         define Suffix_Verb_Step2a as (
472                 [substring] among (
473                        '{t}' ($(len >= 4)  delete)
474                         '{a}' '{n}' '{y}' ($(len >= 4) delete)
475                         '{n}{a}' '{t}{a}'  '{t}{n}'  ($(len >= 5) delete)// past
476                         '{a}{n}' '{w}{n}' '{y}{n}' ($(len > 5) delete) // present
477                         '{t}{m}{a}' ($(len >= 6) delete)
478                 )
479             )
481         define Suffix_Verb_Step2b as (
482             [substring] among (
483                 '{w}{a}' '{t}{m}' ($(len >= 5) delete)
484             )
485         )
488         define Suffix_Verb_Step2c as (
489             [substring] among (
490                 '{w}' ($(len >= 4) delete)
491                 '{t}{m}{w}' ($(len >= 6) delete)
492             )
493         )
495         define Suffix_All_alef_maqsura as (
496             [substring] among (
497                 '{a_}' ( <- '{y}' ) // spell error
498                 // '{a_}' ( delete ) // if noun > 3
499                 // '{a_}' ( <- '{a}') // if verb
500             )
501         )
504 define stem as (
505     // set initial values
506     set is_noun
507     set is_verb
508     unset is_defined
510     // guess type and properties
511     do Checks1
513     // normalization pre-stemming
514     do Normalize_pre
517     backwards (
519        do (
520               //Suffixes for verbs
521             (
522            is_verb
523            (
524                (
525                   (atleast 1 Suffix_Verb_Step1)
526                   ( Suffix_Verb_Step2a or Suffix_Verb_Step2c  or next)
527                 )
528                 or Suffix_Verb_Step2b
529                 or Suffix_Verb_Step2a
530             )
531            )
532             //Suffixes for nouns
533           or (
534                is_noun
535                 (
537                  try (
538                      Suffix_Noun_Step2c2
539                      or (not is_defined Suffix_Noun_Step1a (
540                             Suffix_Noun_Step2a
541                             or Suffix_Noun_Step2b
542                             or Suffix_Noun_Step2c1
543                             or next))
544                      or (Suffix_Noun_Step1b (
545                             Suffix_Noun_Step2a
546                             or Suffix_Noun_Step2b
547                             or Suffix_Noun_Step2c1))
548                      or (not is_defined Suffix_Noun_Step2a)
549                      or (Suffix_Noun_Step2b)
550                  )
551                  Suffix_Noun_Step3
552                  )
554             )
556             // Suffixes for alef maqsura
557             or  Suffix_All_alef_maqsura
558         )
559     )
561     //Prefixes
562     do (
563        try Prefix_Step1
564        try Prefix_Step2
565        ( Prefix_Step3a_Noun
566          or (is_noun Prefix_Step3b_Noun)
567          or (is_verb try Prefix_Step3_Verb Prefix_Step4_Verb)
568          )
569     )
571     // normalization post-stemming
572     do Normalize_post