blob: 43dcce154ccc320f8ffd31f196955121d6c220ea [file] [log] [blame]
/*
Copyright (c) 2001, Dr Martin Porter
Copyright (c) 2002, Richard Boulton
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the copyright holders nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using Lucene.Net.Support;
namespace Lucene.Net.Tartarus.Snowball.Ext
{
/// <summary>
/// This class was automatically generated by a Snowball to Java compiler
/// It implements the stemming algorithm defined by a snowball script.
/// </summary>
public class PorterStemmer : SnowballProgram
{
private readonly static PorterStemmer methodObject = new PorterStemmer();
private readonly static Among[] a_0 = {
new Among ( "s", -1, 3, "", methodObject ),
new Among ( "ies", 0, 2, "", methodObject ),
new Among ( "sses", 0, 1, "", methodObject ),
new Among ( "ss", 0, -1, "", methodObject )
};
private readonly static Among[] a_1 = {
new Among ( "", -1, 3, "", methodObject ),
new Among ( "bb", 0, 2, "", methodObject ),
new Among ( "dd", 0, 2, "", methodObject ),
new Among ( "ff", 0, 2, "", methodObject ),
new Among ( "gg", 0, 2, "", methodObject ),
new Among ( "bl", 0, 1, "", methodObject ),
new Among ( "mm", 0, 2, "", methodObject ),
new Among ( "nn", 0, 2, "", methodObject ),
new Among ( "pp", 0, 2, "", methodObject ),
new Among ( "rr", 0, 2, "", methodObject ),
new Among ( "at", 0, 1, "", methodObject ),
new Among ( "tt", 0, 2, "", methodObject ),
new Among ( "iz", 0, 1, "", methodObject )
};
private readonly static Among[] a_2 = {
new Among ( "ed", -1, 2, "", methodObject ),
new Among ( "eed", 0, 1, "", methodObject ),
new Among ( "ing", -1, 2, "", methodObject )
};
private readonly static Among[] a_3 = {
new Among ( "anci", -1, 3, "", methodObject ),
new Among ( "enci", -1, 2, "", methodObject ),
new Among ( "abli", -1, 4, "", methodObject ),
new Among ( "eli", -1, 6, "", methodObject ),
new Among ( "alli", -1, 9, "", methodObject ),
new Among ( "ousli", -1, 12, "", methodObject ),
new Among ( "entli", -1, 5, "", methodObject ),
new Among ( "aliti", -1, 10, "", methodObject ),
new Among ( "biliti", -1, 14, "", methodObject ),
new Among ( "iviti", -1, 13, "", methodObject ),
new Among ( "tional", -1, 1, "", methodObject ),
new Among ( "ational", 10, 8, "", methodObject ),
new Among ( "alism", -1, 10, "", methodObject ),
new Among ( "ation", -1, 8, "", methodObject ),
new Among ( "ization", 13, 7, "", methodObject ),
new Among ( "izer", -1, 7, "", methodObject ),
new Among ( "ator", -1, 8, "", methodObject ),
new Among ( "iveness", -1, 13, "", methodObject ),
new Among ( "fulness", -1, 11, "", methodObject ),
new Among ( "ousness", -1, 12, "", methodObject )
};
private readonly static Among[] a_4 = {
new Among ( "icate", -1, 2, "", methodObject ),
new Among ( "ative", -1, 3, "", methodObject ),
new Among ( "alize", -1, 1, "", methodObject ),
new Among ( "iciti", -1, 2, "", methodObject ),
new Among ( "ical", -1, 2, "", methodObject ),
new Among ( "ful", -1, 3, "", methodObject ),
new Among ( "ness", -1, 3, "", methodObject )
};
private readonly static Among[] a_5 = {
new Among ( "ic", -1, 1, "", methodObject ),
new Among ( "ance", -1, 1, "", methodObject ),
new Among ( "ence", -1, 1, "", methodObject ),
new Among ( "able", -1, 1, "", methodObject ),
new Among ( "ible", -1, 1, "", methodObject ),
new Among ( "ate", -1, 1, "", methodObject ),
new Among ( "ive", -1, 1, "", methodObject ),
new Among ( "ize", -1, 1, "", methodObject ),
new Among ( "iti", -1, 1, "", methodObject ),
new Among ( "al", -1, 1, "", methodObject ),
new Among ( "ism", -1, 1, "", methodObject ),
new Among ( "ion", -1, 2, "", methodObject ),
new Among ( "er", -1, 1, "", methodObject ),
new Among ( "ous", -1, 1, "", methodObject ),
new Among ( "ant", -1, 1, "", methodObject ),
new Among ( "ent", -1, 1, "", methodObject ),
new Among ( "ment", 15, 1, "", methodObject ),
new Among ( "ement", 16, 1, "", methodObject ),
new Among ( "ou", -1, 1, "", methodObject )
};
private static readonly char[] g_v = { (char)17, (char)65, (char)16, (char)1 };
private static readonly char[] g_v_WXY = { (char)1, (char)17, (char)65, (char)208, (char)1 };
private bool B_Y_found;
private int I_p2;
private int I_p1;
private void copy_from(PorterStemmer other)
{
B_Y_found = other.B_Y_found;
I_p2 = other.I_p2;
I_p1 = other.I_p1;
base.CopyFrom(other);
}
[ExceptionToNetNumericConvention]
private bool r_shortv()
{
// (, line 19
if (!(OutGroupingB(g_v_WXY, 89, 121)))
{
return false;
}
if (!(InGroupingB(g_v, 97, 121)))
{
return false;
}
if (!(OutGroupingB(g_v, 97, 121)))
{
return false;
}
return true;
}
private bool r_R1()
{
if (!(I_p1 <= m_cursor))
{
return false;
}
return true;
}
private bool r_R2()
{
if (!(I_p2 <= m_cursor))
{
return false;
}
return true;
}
private bool r_Step_1a()
{
int among_var;
// (, line 24
// [, line 25
m_ket = m_cursor;
// substring, line 25
among_var = FindAmongB(a_0, 4);
if (among_var == 0)
{
return false;
}
// ], line 25
m_bra = m_cursor;
switch (among_var)
{
case 0:
return false;
case 1:
// (, line 26
// <-, line 26
SliceFrom("ss");
break;
case 2:
// (, line 27
// <-, line 27
SliceFrom("i");
break;
case 3:
// (, line 29
// delete, line 29
SliceDel();
break;
}
return true;
}
private bool r_Step_1b()
{
int among_var;
int v_1;
int v_3;
int v_4;
// (, line 33
// [, line 34
m_ket = m_cursor;
// substring, line 34
among_var = FindAmongB(a_2, 3);
if (among_var == 0)
{
return false;
}
// ], line 34
m_bra = m_cursor;
switch (among_var)
{
case 0:
return false;
case 1:
// (, line 35
// call R1, line 35
if (!r_R1())
{
return false;
}
// <-, line 35
SliceFrom("ee");
break;
case 2:
// (, line 37
// test, line 38
v_1 = m_limit - m_cursor;
// gopast, line 38
while (true)
{
do
{
if (!(InGroupingB(g_v, 97, 121)))
{
goto lab1;
}
goto golab0;
} while (false);
lab1:
if (m_cursor <= m_limit_backward)
{
return false;
}
m_cursor--;
}
golab0:
m_cursor = m_limit - v_1;
// delete, line 38
SliceDel();
// test, line 39
v_3 = m_limit - m_cursor;
// substring, line 39
among_var = FindAmongB(a_1, 13);
if (among_var == 0)
{
return false;
}
m_cursor = m_limit - v_3;
switch (among_var)
{
case 0:
return false;
case 1:
// (, line 41
// <+, line 41
{
int c = m_cursor;
Insert(m_cursor, m_cursor, "e");
m_cursor = c;
}
break;
case 2:
// (, line 44
// [, line 44
m_ket = m_cursor;
// next, line 44
if (m_cursor <= m_limit_backward)
{
return false;
}
m_cursor--;
// ], line 44
m_bra = m_cursor;
// delete, line 44
SliceDel();
break;
case 3:
// (, line 45
// atmark, line 45
if (m_cursor != I_p1)
{
return false;
}
// test, line 45
v_4 = m_limit - m_cursor;
// call shortv, line 45
if (!r_shortv())
{
return false;
}
m_cursor = m_limit - v_4;
// <+, line 45
{
int c = m_cursor;
Insert(m_cursor, m_cursor, "e");
m_cursor = c;
}
break;
}
break;
}
return true;
}
private bool r_Step_1c()
{
int v_1;
// (, line 51
// [, line 52
m_ket = m_cursor;
// or, line 52
do
{
v_1 = m_limit - m_cursor;
do
{
// literal, line 52
if (!(Eq_S_B(1, "y")))
{
goto lab1;
}
goto lab0;
} while (false);
lab1:
m_cursor = m_limit - v_1;
// literal, line 52
if (!(Eq_S_B(1, "Y")))
{
return false;
}
} while (false);
lab0:
// ], line 52
m_bra = m_cursor;
// gopast, line 53
while (true)
{
do
{
if (!(InGroupingB(g_v, 97, 121)))
{
goto lab3;
}
goto golab2;
} while (false);
lab3:
if (m_cursor <= m_limit_backward)
{
return false;
}
m_cursor--;
}
golab2:
// <-, line 54
SliceFrom("i");
return true;
}
private bool r_Step_2()
{
int among_var;
// (, line 57
// [, line 58
m_ket = m_cursor;
// substring, line 58
among_var = FindAmongB(a_3, 20);
if (among_var == 0)
{
return false;
}
// ], line 58
m_bra = m_cursor;
// call R1, line 58
if (!r_R1())
{
return false;
}
switch (among_var)
{
case 0:
return false;
case 1:
// (, line 59
// <-, line 59
SliceFrom("tion");
break;
case 2:
// (, line 60
// <-, line 60
SliceFrom("ence");
break;
case 3:
// (, line 61
// <-, line 61
SliceFrom("ance");
break;
case 4:
// (, line 62
// <-, line 62
SliceFrom("able");
break;
case 5:
// (, line 63
// <-, line 63
SliceFrom("ent");
break;
case 6:
// (, line 64
// <-, line 64
SliceFrom("e");
break;
case 7:
// (, line 66
// <-, line 66
SliceFrom("ize");
break;
case 8:
// (, line 68
// <-, line 68
SliceFrom("ate");
break;
case 9:
// (, line 69
// <-, line 69
SliceFrom("al");
break;
case 10:
// (, line 71
// <-, line 71
SliceFrom("al");
break;
case 11:
// (, line 72
// <-, line 72
SliceFrom("ful");
break;
case 12:
// (, line 74
// <-, line 74
SliceFrom("ous");
break;
case 13:
// (, line 76
// <-, line 76
SliceFrom("ive");
break;
case 14:
// (, line 77
// <-, line 77
SliceFrom("ble");
break;
}
return true;
}
private bool r_Step_3()
{
int among_var;
// (, line 81
// [, line 82
m_ket = m_cursor;
// substring, line 82
among_var = FindAmongB(a_4, 7);
if (among_var == 0)
{
return false;
}
// ], line 82
m_bra = m_cursor;
// call R1, line 82
if (!r_R1())
{
return false;
}
switch (among_var)
{
case 0:
return false;
case 1:
// (, line 83
// <-, line 83
SliceFrom("al");
break;
case 2:
// (, line 85
// <-, line 85
SliceFrom("ic");
break;
case 3:
// (, line 87
// delete, line 87
SliceDel();
break;
}
return true;
}
private bool r_Step_4()
{
int among_var;
int v_1;
// (, line 91
// [, line 92
m_ket = m_cursor;
// substring, line 92
among_var = FindAmongB(a_5, 19);
if (among_var == 0)
{
return false;
}
// ], line 92
m_bra = m_cursor;
// call R2, line 92
if (!r_R2())
{
return false;
}
switch (among_var)
{
case 0:
return false;
case 1:
// (, line 95
// delete, line 95
SliceDel();
break;
case 2:
// (, line 96
// or, line 96
do
{
v_1 = m_limit - m_cursor;
do
{
// literal, line 96
if (!(Eq_S_B(1, "s")))
{
goto lab1;
}
goto lab0;
} while (false);
lab1:
m_cursor = m_limit - v_1;
// literal, line 96
if (!(Eq_S_B(1, "t")))
{
return false;
}
} while (false);
lab0:
// delete, line 96
SliceDel();
break;
}
return true;
}
private bool r_Step_5a()
{
int v_1;
int v_2;
// (, line 100
// [, line 101
m_ket = m_cursor;
// literal, line 101
if (!(Eq_S_B(1, "e")))
{
return false;
}
// ], line 101
m_bra = m_cursor;
// or, line 102
do
{
v_1 = m_limit - m_cursor;
do
{
// call R2, line 102
if (!r_R2())
{
goto lab1;
}
goto lab0;
} while (false);
lab1:
m_cursor = m_limit - v_1;
// (, line 102
// call R1, line 102
if (!r_R1())
{
return false;
}
// not, line 102
{
v_2 = m_limit - m_cursor;
do
{
// call shortv, line 102
if (!r_shortv())
{
goto lab2;
}
return false;
} while (false);
lab2:
m_cursor = m_limit - v_2;
}
} while (false);
lab0:
// delete, line 103
SliceDel();
return true;
}
private bool r_Step_5b()
{
// (, line 106
// [, line 107
m_ket = m_cursor;
// literal, line 107
if (!(Eq_S_B(1, "l")))
{
return false;
}
// ], line 107
m_bra = m_cursor;
// call R2, line 108
if (!r_R2())
{
return false;
}
// literal, line 108
if (!(Eq_S_B(1, "l")))
{
return false;
}
// delete, line 109
SliceDel();
return true;
}
public override bool Stem()
{
int v_1;
int v_2;
int v_3;
int v_4;
int v_5;
int v_10;
int v_11;
int v_12;
int v_13;
int v_14;
int v_15;
int v_16;
int v_17;
int v_18;
int v_19;
int v_20;
// (, line 113
// unset Y_found, line 115
B_Y_found = false;
// do, line 116
v_1 = m_cursor;
do
{
// (, line 116
// [, line 116
m_bra = m_cursor;
// literal, line 116
if (!(Eq_S(1, "y")))
{
goto lab0;
}
// ], line 116
m_ket = m_cursor;
// <-, line 116
SliceFrom("Y");
// set Y_found, line 116
B_Y_found = true;
} while (false);
lab0:
m_cursor = v_1;
// do, line 117
v_2 = m_cursor;
do
{
// repeat, line 117
while (true)
{
v_3 = m_cursor;
do
{
// (, line 117
// goto, line 117
while (true)
{
v_4 = m_cursor;
do
{
// (, line 117
if (!(InGrouping(g_v, 97, 121)))
{
goto lab5;
}
// [, line 117
m_bra = m_cursor;
// literal, line 117
if (!(Eq_S(1, "y")))
{
goto lab5;
}
// ], line 117
m_ket = m_cursor;
m_cursor = v_4;
goto golab4;
} while (false);
lab5:
m_cursor = v_4;
if (m_cursor >= m_limit)
{
goto lab3;
}
m_cursor++;
}
golab4:
// <-, line 117
SliceFrom("Y");
// set Y_found, line 117
B_Y_found = true;
// LUCENENET NOTE: continue label is not supported directly in .NET,
// so we just need to add another goto to get to the end of the outer loop.
// See: http://stackoverflow.com/a/359449/181087
// Original code:
//continue replab2;
goto end_of_outer_loop;
} while (false);
lab3:
m_cursor = v_3;
goto replab2;
end_of_outer_loop: { }
}
replab2:;
} while (false);
//lab1: // not referenced
m_cursor = v_2;
I_p1 = m_limit;
I_p2 = m_limit;
// do, line 121
v_5 = m_cursor;
do
{
// (, line 121
// gopast, line 122
while (true)
{
do
{
if (!(InGrouping(g_v, 97, 121)))
{
goto lab8;
}
goto golab7;
} while (false);
lab8:
if (m_cursor >= m_limit)
{
goto lab6;
}
m_cursor++;
}
golab7:
// gopast, line 122
while (true)
{
do
{
if (!(OutGrouping(g_v, 97, 121)))
{
goto lab10;
}
goto golab9;
} while (false);
lab10:
if (m_cursor >= m_limit)
{
goto lab6;
}
m_cursor++;
}
golab9:
// setmark p1, line 122
I_p1 = m_cursor;
// gopast, line 123
while (true)
{
do
{
if (!(InGrouping(g_v, 97, 121)))
{
goto lab12;
}
goto golab11;
} while (false);
lab12:
if (m_cursor >= m_limit)
{
goto lab6;
}
m_cursor++;
}
golab11:
// gopast, line 123
while (true)
{
do
{
if (!(OutGrouping(g_v, 97, 121)))
{
goto lab14;
}
goto golab13;
} while (false);
lab14:
if (m_cursor >= m_limit)
{
goto lab6;
}
m_cursor++;
}
golab13:
// setmark p2, line 123
I_p2 = m_cursor;
} while (false);
lab6:
m_cursor = v_5;
// backwards, line 126
m_limit_backward = m_cursor; m_cursor = m_limit;
// (, line 126
// do, line 127
v_10 = m_limit - m_cursor;
do
{
// call Step_1a, line 127
if (!r_Step_1a())
{
goto lab15;
}
} while (false);
lab15:
m_cursor = m_limit - v_10;
// do, line 128
v_11 = m_limit - m_cursor;
do
{
// call Step_1b, line 128
if (!r_Step_1b())
{
goto lab16;
}
} while (false);
lab16:
m_cursor = m_limit - v_11;
// do, line 129
v_12 = m_limit - m_cursor;
do
{
// call Step_1c, line 129
if (!r_Step_1c())
{
goto lab17;
}
} while (false);
lab17:
m_cursor = m_limit - v_12;
// do, line 130
v_13 = m_limit - m_cursor;
do
{
// call Step_2, line 130
if (!r_Step_2())
{
goto lab18;
}
} while (false);
lab18:
m_cursor = m_limit - v_13;
// do, line 131
v_14 = m_limit - m_cursor;
do
{
// call Step_3, line 131
if (!r_Step_3())
{
goto lab19;
}
} while (false);
lab19:
m_cursor = m_limit - v_14;
// do, line 132
v_15 = m_limit - m_cursor;
do
{
// call Step_4, line 132
if (!r_Step_4())
{
goto lab20;
}
} while (false);
lab20:
m_cursor = m_limit - v_15;
// do, line 133
v_16 = m_limit - m_cursor;
do
{
// call Step_5a, line 133
if (!r_Step_5a())
{
goto lab21;
}
} while (false);
lab21:
m_cursor = m_limit - v_16;
// do, line 134
v_17 = m_limit - m_cursor;
do
{
// call Step_5b, line 134
if (!r_Step_5b())
{
goto lab22;
}
} while (false);
lab22:
m_cursor = m_limit - v_17;
m_cursor = m_limit_backward; // do, line 137
v_18 = m_cursor;
do
{
// (, line 137
// Boolean test Y_found, line 137
if (!(B_Y_found))
{
goto lab23;
}
// repeat, line 137
while (true)
{
v_19 = m_cursor;
do
{
// (, line 137
// goto, line 137
while (true)
{
v_20 = m_cursor;
do
{
// (, line 137
// [, line 137
m_bra = m_cursor;
// literal, line 137
if (!(Eq_S(1, "Y")))
{
goto lab27;
}
// ], line 137
m_ket = m_cursor;
m_cursor = v_20;
goto golab26;
} while (false);
lab27:
m_cursor = v_20;
if (m_cursor >= m_limit)
{
goto lab25;
}
m_cursor++;
}
golab26:
// <-, line 137
SliceFrom("y");
// LUCENENET NOTE: continue label is not supported directly in .NET,
// so we just need to add another goto to get to the end of the outer loop.
// See: http://stackoverflow.com/a/359449/181087
// Original code:
//continue replab24;
goto end_of_outer_loop_2;
} while (false);
lab25:
m_cursor = v_19;
goto replab24;
end_of_outer_loop_2: { }
}
replab24:;
} while (false);
lab23:
m_cursor = v_18;
return true;
}
public override bool Equals(object o)
{
return o is PorterStemmer;
}
public override int GetHashCode()
{
return this.GetType().FullName.GetHashCode();
}
}
}