Jump to content

MediaWiki:Stemmer.js

Վիքիպեդիայից՝ ազատ հանրագիտարանից

Ծանուցում. Հիշելուց հետո կատարված փոփոխությունները տեսնելու համար մաքրեք ձեր զննարկիչի հիշապահեստը. Mozilla / Firefox / Safari՝ Ctrl+Shift+R (Cmd+Shift+R Mac OS X-ում) Konqueror՝ F5 Opera՝ Tools→Preferences ընտրացանկից։ Internet Explorer՝ Ctrl+F5

// Armenian stemmer
// released under GNU GPL 2.0 or later
// based on Armenian Javascript stemmer from Urim project (http://code.google.com/p/urim/ Mozilla Public License 1.1), which is based on Snowball project (http://snowball.tartarus.org)

//
// Example
//
// var testStemmer = new ArmenianStemmer();
// testStemmer.setCurrent('Википедия');
// var res = testStemmer.getCurrent(); // res == 'Википед'
//

function Among(s, substring_i, result, method) {
	if ((!s && s != "") || (!substring_i && (substring_i != 0)) || !result)
		throw ("Bad Among initialisation: s:" + s + ", substring_i: "
				+ substring_i + ", result: " + result);
	this.s_size = s.length;
	this.s = this.toCharArray(s);
	this.substring_i = substring_i;
	this.result = result;
	this.method = method;
}
Among.prototype.toCharArray = function(s) {
	var sLength = s.length;
	var charArr = new Array(sLength);
	for (var i = 0; i < sLength; i++)
		charArr[i] = s.charCodeAt(i);
	return charArr;
}

function SnowballProgram() {
	var current;
	return {
		bra : 0,
		ket : 0,
		limit : 0,
		cursor : 0,
		limit_backward : 0,
		setCurrent : function(word) {
			current = word;
			this.cursor = 0;
			this.limit = word.length;
			this.limit_backward = 0;
			this.bra = this.cursor;
			this.ket = this.limit;
		},
		getCurrent : function() {
			var result = current;
			current = null;
			return result;
		},
		in_grouping : function(s, min, max) {
			if (this.cursor >= this.limit)
				return false;
			var ch = current.charCodeAt(this.cursor);
			if (ch > max || ch < min)
				return false;
			ch -= min;
			if ((s[ch >> 3] & (0X1 << (ch & 0X7))) == 0)
				return false;
			this.cursor++;
			return true;
		},
		in_grouping_b : function(s, min, max) {
			if (this.cursor <= this.limit_backward)
				return false;
			var ch = current.charCodeAt(this.cursor - 1);
			if (ch > max || ch < min)
				return false;
			ch -= min;
			if ((s[ch >> 3] & (0X1 << (ch & 0X7))) == 0)
				return false;
			this.cursor--;
			return true;
		},
		out_grouping : function(s, min, max) {
			if (this.cursor >= this.limit)
				return false;
			var ch = current.charCodeAt(this.cursor);
			if (ch > max || ch < min) {
				this.cursor++;
				return true;
			}
			ch -= min;
			if ((s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) {
				this.cursor++;
				return true;
			}
			return false;
		},
		out_grouping_b : function(s, min, max) {
			if (this.cursor <= this.limit_backward)
				return false;
			var ch = current.charCodeAt(this.cursor - 1);
			if (ch > max || ch < min) {
				this.cursor--;
				return true;
			}
			ch -= min;
			if ((s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) {
				this.cursor--;
				return true;
			}
			return false;
		},
		in_range : function(min, max) {
			if (this.cursor >= this.limit)
				return false;
			var ch = current.charCodeAt(this.cursor);
			if (ch > max || ch < min)
				return false;
			this.cursor++;
			return true;
		},
		in_range_b : function(min, max) {
			if (this.cursor <= this.limit_backward)
				return false;
			var ch = current.charCodeAt(this.cursor - 1);
			if (ch > max || ch < min)
				return false;
			this.cursor--;
			return true;
		},
		out_range : function(min, max) {
			if (this.cursor >= this.limit)
				return false;
			var ch = current.charCodeAt(this.cursor);
			if (!(ch > max || ch < min))
				return false;
			this.cursor++;
			return true;
		},
		out_range_b : function(min, max) {
			if (this.cursor <= this.limit_backward)
				return false;
			var ch = current.charCodeAt(this.cursor - 1);
			if (!(ch > max || ch < min))
				return false;
			this.cursor--;
			return true;
		},
		eq_s : function(s_size, s) {
			if (this.limit - this.cursor < s_size)
				return false;
			for (var i = 0; i != s_size; i++) {
				if (current.charCodeAt(this.cursor + i) != s.charCodeAt(i))
					return false;
			}
			this.cursor += s_size;
			return true;
		},
		eq_s_b : function(s_size, s) {
			if (this.cursor - this.limit_backward < s_size)
				return false;
			for (var i = 0; i != s_size; i++) {
				if (current.charCodeAt(this.cursor - s_size + i) != s
						.charCodeAt(i))
					return false;
			}
			this.cursor -= s_size;
			return true;
		},
		find_among : function(v, v_size) {
			var i = 0;
			var j = v_size;
			var c = this.cursor;
			var l = this.limit;
			var common_i = 0;
			var common_j = 0;
			var first_key_inspected = false;
			while (true) {
				var k = i + ((j - i) >> 1);
				var diff = 0;
				var common = common_i < common_j ? common_i : common_j;
				var w = v[k];
				for (var i2 = common; i2 < w.s_size; i2++) {
					if (c + common == l) {
						diff = -1;
						break;
					}
					diff = current.charCodeAt(c + common) - w.s[i2];
					if (diff != 0)
						break;
					common++;
				}
				if (diff < 0) {
					j = k;
					common_j = common;
				} else {
					i = k;
					common_i = common;
				}
				if (j - i <= 1) {
					if (i > 0)
						break;
					if (j == i)
						break;
					if (first_key_inspected)
						break;
					first_key_inspected = true;
				}
			}
			while (true) {
				var w = v[i];
				if (common_i >= w.s_size) {
					this.cursor = c + w.s_size;
					if (!w.method)
						return w.result;
					var res = w.method();
					this.cursor = c + w.s_size;
					if (res)
						return w.result;
				}
				i = w.substring_i;
				if (i < 0)
					return 0;
			}
		},
		find_among_b : function(v, v_size) {
			var i = 0;
			var j = v_size;
			var c = this.cursor;
			var lb = this.limit_backward;
			var common_i = 0;
			var common_j = 0;
			var first_key_inspected = false;
			while (true) {
				var k = i + ((j - i) >> 1);
				var diff = 0;
				var common = common_i < common_j ? common_i : common_j;
				var w = v[k];
				for (var i2 = w.s_size - 1 - common; i2 >= 0; i2--) {
					if (c - common == lb) {
						diff = -1;
						break;
					}
					diff = current.charCodeAt(c - 1 - common) - w.s[i2];
					if (diff != 0)
						break;
					common++;
				}
				if (diff < 0) {
					j = k;
					common_j = common;
				} else {
					i = k;
					common_i = common;
				}
				if (j - i <= 1) {
					if (i > 0)
						break;
					if (j == i)
						break;
					if (first_key_inspected)
						break;
					first_key_inspected = true;
				}
			}
			while (true) {
				var w = v[i];
				if (common_i >= w.s_size) {
					this.cursor = c - w.s_size;
					if (!w.method)
						return w.result;
					var res = w.method();
					this.cursor = c - w.s_size;
					if (res)
						return w.result;
				}
				i = w.substring_i;
				if (i < 0)
					return 0;
			}
		},
		replace_s : function(c_bra, c_ket, s) {
			var adjustment = s.length - (c_ket - c_bra);
			var left = current.substring(0, c_bra);
			var right = current.substring(c_ket);
			current = left + s + right;
			this.limit += adjustment;
			if (this.cursor >= c_ket)
				this.cursor += adjustment;
			else if (this.cursor > c_bra)
				this.cursor = c_bra;
			return adjustment;
		},
		slice_check : function() {
			if (this.bra < 0 || this.bra > this.ket || this.ket > this.limit
					|| this.limit > current.length) {
				throw ("faulty slice operation");
			}
		},
		slice_from : function(s) {
			this.slice_check();
			this.replace_s(this.bra, this.ket, s);
		},
		slice_del : function() {
			this.slice_from("");
		},
		insert : function(c_bra, c_ket, s) {
			var adjustment = this.replace_s(c_bra, c_ket, s);
			if (c_bra <= this.bra)
				this.bra += adjustment;
			if (c_bra <= this.ket)
				this.ket += adjustment;
		},
		slice_to : function() {
			this.slice_check();
			return current.substring(this.bra, this.ket);
		},
		eq_v_b : function(s) {
			return this.eq_s_b(s.length, s);
		}
	};
}

function ArmenianStemmer() {
		        var a_0 = [
		            new Among ( "\u0580\u0578\u0580\u0564", -1, 1 ),
		            new Among ( "\u0565\u0580\u0578\u0580\u0564", 0, 1 ),
		            new Among ( "\u0561\u056C\u056B", -1, 1 ),
		            new Among ( "\u0561\u056F\u056B", -1, 1 ),
		            new Among ( "\u0578\u0580\u0561\u056F", -1, 1 ),
		            new Among ( "\u0565\u0572", -1, 1 ),
		            new Among ( "\u0561\u056F\u0561\u0576", -1, 1 ),
		            new Among ( "\u0561\u0580\u0561\u0576", -1, 1 ),
		            new Among ( "\u0565\u0576", -1, 1 ),
		            new Among ( "\u0565\u056F\u0565\u0576", 8, 1 ),
		            new Among ( "\u0565\u0580\u0565\u0576", 8, 1 ),
		            new Among ( "\u0578\u0580\u0567\u0576", -1, 1 ),
		            new Among ( "\u056B\u0576", -1, 1 ),
		            new Among ( "\u0563\u056B\u0576", 12, 1 ),
		            new Among ( "\u0578\u057E\u056B\u0576", 12, 1 ),
		            new Among ( "\u056C\u0561\u0575\u0576", -1, 1 ),
		            new Among ( "\u057E\u0578\u0582\u0576", -1, 1 ),
		            new Among ( "\u057A\u0565\u057D", -1, 1 ),
		            new Among ( "\u056B\u057E", -1, 1 ),
		            new Among ( "\u0561\u057F", -1, 1 ),
		            new Among ( "\u0561\u057E\u0565\u057F", -1, 1 ),
		            new Among ( "\u056F\u0578\u057F", -1, 1 ),
		            new Among ( "\u0562\u0561\u0580", -1, 1 )
		        ];
		
		        var a_1 = [
		            new Among ( "\u0561", -1, 1 ),
		            new Among ( "\u0561\u0581\u0561", 0, 1 ),
		            new Among ( "\u0565\u0581\u0561", 0, 1 ),
		            new Among ( "\u057E\u0565", -1, 1 ),
		            new Among ( "\u0561\u0581\u0580\u056B", -1, 1 ),
		            new Among ( "\u0561\u0581\u056B", -1, 1 ),
		            new Among ( "\u0565\u0581\u056B", -1, 1 ),
		            new Among ( "\u057E\u0565\u0581\u056B", 6, 1 ),
		            new Among ( "\u0561\u056C", -1, 1 ),
		            new Among ( "\u0568\u0561\u056C", 8, 1 ),
		            new Among ( "\u0561\u0576\u0561\u056C", 8, 1 ),
		            new Among ( "\u0565\u0576\u0561\u056C", 8, 1 ),
		            new Among ( "\u0561\u0581\u0576\u0561\u056C", 8, 1 ),
		            new Among ( "\u0565\u056C", -1, 1 ),
		            new Among ( "\u0568\u0565\u056C", 13, 1 ),
		            new Among ( "\u0576\u0565\u056C", 13, 1 ),
		            new Among ( "\u0581\u0576\u0565\u056C", 15, 1 ),
		            new Among ( "\u0565\u0581\u0576\u0565\u056C", 16, 1 ),
		            new Among ( "\u0579\u0565\u056C", 13, 1 ),
		            new Among ( "\u057E\u0565\u056C", 13, 1 ),
		            new Among ( "\u0561\u0581\u057E\u0565\u056C", 19, 1 ),
		            new Among ( "\u0565\u0581\u057E\u0565\u056C", 19, 1 ),
		            new Among ( "\u057F\u0565\u056C", 13, 1 ),
		            new Among ( "\u0561\u057F\u0565\u056C", 22, 1 ),
		            new Among ( "\u0578\u057F\u0565\u056C", 22, 1 ),
		            new Among ( "\u056F\u0578\u057F\u0565\u056C", 24, 1 ),
		            new Among ( "\u057E\u0561\u056E", -1, 1 ),
		            new Among ( "\u0578\u0582\u0574", -1, 1 ),
		            new Among ( "\u057E\u0578\u0582\u0574", 27, 1 ),
		            new Among ( "\u0561\u0576", -1, 1 ),
		            new Among ( "\u0581\u0561\u0576", 29, 1 ),
		            new Among ( "\u0561\u0581\u0561\u0576", 30, 1 ),
		            new Among ( "\u0561\u0581\u0580\u056B\u0576", -1, 1 ),
		            new Among ( "\u0561\u0581\u056B\u0576", -1, 1 ),
		            new Among ( "\u0565\u0581\u056B\u0576", -1, 1 ),
		            new Among ( "\u057E\u0565\u0581\u056B\u0576", 34, 1 ),
		            new Among ( "\u0561\u056C\u056B\u057D", -1, 1 ),
		            new Among ( "\u0565\u056C\u056B\u057D", -1, 1 ),
		            new Among ( "\u0561\u057E", -1, 1 ),
		            new Among ( "\u0561\u0581\u0561\u057E", 38, 1 ),
		            new Among ( "\u0565\u0581\u0561\u057E", 38, 1 ),
		            new Among ( "\u0561\u056C\u0578\u057E", -1, 1 ),
		            new Among ( "\u0565\u056C\u0578\u057E", -1, 1 ),
		            new Among ( "\u0561\u0580", -1, 1 ),
		            new Among ( "\u0561\u0581\u0561\u0580", 43, 1 ),
		            new Among ( "\u0565\u0581\u0561\u0580", 43, 1 ),
		            new Among ( "\u0561\u0581\u0580\u056B\u0580", -1, 1 ),
		            new Among ( "\u0561\u0581\u056B\u0580", -1, 1 ),
		            new Among ( "\u0565\u0581\u056B\u0580", -1, 1 ),
		            new Among ( "\u057E\u0565\u0581\u056B\u0580", 48, 1 ),
		            new Among ( "\u0561\u0581", -1, 1 ),
		            new Among ( "\u0565\u0581", -1, 1 ),
		            new Among ( "\u0561\u0581\u0580\u0565\u0581", 51, 1 ),
		            new Among ( "\u0561\u056C\u0578\u0582\u0581", -1, 1 ),
		            new Among ( "\u0565\u056C\u0578\u0582\u0581", -1, 1 ),
		            new Among ( "\u0561\u056C\u0578\u0582", -1, 1 ),
		            new Among ( "\u0565\u056C\u0578\u0582", -1, 1 ),
		            new Among ( "\u0561\u0584", -1, 1 ),
		            new Among ( "\u0581\u0561\u0584", 57, 1 ),
		            new Among ( "\u0561\u0581\u0561\u0584", 58, 1 ),
		            new Among ( "\u0561\u0581\u0580\u056B\u0584", -1, 1 ),
		            new Among ( "\u0561\u0581\u056B\u0584", -1, 1 ),
		            new Among ( "\u0565\u0581\u056B\u0584", -1, 1 ),
		            new Among ( "\u057E\u0565\u0581\u056B\u0584", 62, 1 ),
		            new Among ( "\u0561\u0576\u0584", -1, 1 ),
		            new Among ( "\u0581\u0561\u0576\u0584", 64, 1 ),
		            new Among ( "\u0561\u0581\u0561\u0576\u0584", 65, 1 ),
		            new Among ( "\u0561\u0581\u0580\u056B\u0576\u0584", -1, 1 ),
		            new Among ( "\u0561\u0581\u056B\u0576\u0584", -1, 1 ),
		            new Among ( "\u0565\u0581\u056B\u0576\u0584", -1, 1 ),
		            new Among ( "\u057E\u0565\u0581\u056B\u0576\u0584", 69, 1 )
		        ];
		
		        var a_2 = [
		            new Among ( "\u0578\u0580\u0564", -1, 1 ),
		            new Among ( "\u0578\u0582\u0575\u0569", -1, 1 ),
		            new Among ( "\u0578\u0582\u0570\u056B", -1, 1 ),
		            new Among ( "\u0581\u056B", -1, 1 ),
		            new Among ( "\u056B\u056C", -1, 1 ),
		            new Among ( "\u0561\u056F", -1, 1 ),
		            new Among ( "\u0575\u0561\u056F", 5, 1 ),
		            new Among ( "\u0561\u0576\u0561\u056F", 5, 1 ),
		            new Among ( "\u056B\u056F", -1, 1 ),
		            new Among ( "\u0578\u0582\u056F", -1, 1 ),
		            new Among ( "\u0561\u0576", -1, 1 ),
		            new Among ( "\u057A\u0561\u0576", 10, 1 ),
		            new Among ( "\u057D\u057F\u0561\u0576", 10, 1 ),
		            new Among ( "\u0561\u0580\u0561\u0576", 10, 1 ),
		            new Among ( "\u0565\u0572\u0567\u0576", -1, 1 ),
		            new Among ( "\u0575\u0578\u0582\u0576", -1, 1 ),
		            new Among ( "\u0578\u0582\u0569\u0575\u0578\u0582\u0576", 15, 1 ),
		            new Among ( "\u0561\u056E\u0578", -1, 1 ),
		            new Among ( "\u056B\u0579", -1, 1 ),
		            new Among ( "\u0578\u0582\u057D", -1, 1 ),
		            new Among ( "\u0578\u0582\u057D\u057F", -1, 1 ),
		            new Among ( "\u0563\u0561\u0580", -1, 1 ),
		            new Among ( "\u057E\u0578\u0580", -1, 1 ),
		            new Among ( "\u0561\u057E\u0578\u0580", 22, 1 ),
		            new Among ( "\u0578\u0581", -1, 1 ),
		            new Among ( "\u0561\u0576\u0585\u0581", -1, 1 ),
		            new Among ( "\u0578\u0582", -1, 1 ),
		            new Among ( "\u0584", -1, 1 ),
		            new Among ( "\u0579\u0565\u0584", 27, 1 ),
		            new Among ( "\u056B\u0584", 27, 1 ),
		            new Among ( "\u0561\u056C\u056B\u0584", 29, 1 ),
		            new Among ( "\u0561\u0576\u056B\u0584", 29, 1 ),
		            new Among ( "\u057E\u0561\u056E\u0584", 27, 1 ),
		            new Among ( "\u0578\u0582\u0575\u0584", 27, 1 ),
		            new Among ( "\u0565\u0576\u0584", 27, 1 ),
		            new Among ( "\u0578\u0576\u0584", 27, 1 ),
		            new Among ( "\u0578\u0582\u0576\u0584", 27, 1 ),
		            new Among ( "\u0574\u0578\u0582\u0576\u0584", 36, 1 ),
		            new Among ( "\u056B\u0579\u0584", 27, 1 ),
		            new Among ( "\u0561\u0580\u0584", 27, 1 )
		        ];
		
		        var a_3 = [
		            new Among ( "\u057D\u0561", -1, 1 ),
		            new Among ( "\u057E\u0561", -1, 1 ),
		            new Among ( "\u0561\u0574\u0562", -1, 1 ),
		            new Among ( "\u0564", -1, 1 ),
		            new Among ( "\u0561\u0576\u0564", 3, 1 ),
		            new Among ( "\u0578\u0582\u0569\u0575\u0561\u0576\u0564", 4, 1 ),
		            new Among ( "\u057E\u0561\u0576\u0564", 4, 1 ),
		            new Among ( "\u0578\u057B\u0564", 3, 1 ),
		            new Among ( "\u0565\u0580\u0564", 3, 1 ),
		            new Among ( "\u0576\u0565\u0580\u0564", 8, 1 ),
		            new Among ( "\u0578\u0582\u0564", 3, 1 ),
		            new Among ( "\u0568", -1, 1 ),
		            new Among ( "\u0561\u0576\u0568", 11, 1 ),
		            new Among ( "\u0578\u0582\u0569\u0575\u0561\u0576\u0568", 12, 1 ),
		            new Among ( "\u057E\u0561\u0576\u0568", 12, 1 ),
		            new Among ( "\u0578\u057B\u0568", 11, 1 ),
		            new Among ( "\u0565\u0580\u0568", 11, 1 ),
		            new Among ( "\u0576\u0565\u0580\u0568", 16, 1 ),
		            new Among ( "\u056B", -1, 1 ),
		            new Among ( "\u057E\u056B", 18, 1 ),
		            new Among ( "\u0565\u0580\u056B", 18, 1 ),
		            new Among ( "\u0576\u0565\u0580\u056B", 20, 1 ),
		            new Among ( "\u0561\u0576\u0578\u0582\u0574", -1, 1 ),
		            new Among ( "\u0565\u0580\u0578\u0582\u0574", -1, 1 ),
		            new Among ( "\u0576\u0565\u0580\u0578\u0582\u0574", 23, 1 ),
		            new Among ( "\u0576", -1, 1 ),
		            new Among ( "\u0561\u0576", 25, 1 ),
		            new Among ( "\u0578\u0582\u0569\u0575\u0561\u0576", 26, 1 ),
		            new Among ( "\u057E\u0561\u0576", 26, 1 ),
		            new Among ( "\u056B\u0576", 25, 1 ),
		            new Among ( "\u0565\u0580\u056B\u0576", 29, 1 ),
		            new Among ( "\u0576\u0565\u0580\u056B\u0576", 30, 1 ),
		            new Among ( "\u0578\u0582\u0569\u0575\u0561\u0576\u0576", 25, 1 ),
		            new Among ( "\u0565\u0580\u0576", 25, 1 ),
		            new Among ( "\u0576\u0565\u0580\u0576", 33, 1 ),
		            new Among ( "\u0578\u0582\u0576", 25, 1 ),
		            new Among ( "\u0578\u057B", -1, 1 ),
		            new Among ( "\u0578\u0582\u0569\u0575\u0561\u0576\u057D", -1, 1 ),
		            new Among ( "\u057E\u0561\u0576\u057D", -1, 1 ),
		            new Among ( "\u0578\u057B\u057D", -1, 1 ),
		            new Among ( "\u0578\u057E", -1, 1 ),
		            new Among ( "\u0561\u0576\u0578\u057E", 40, 1 ),
		            new Among ( "\u057E\u0578\u057E", 40, 1 ),
		            new Among ( "\u0565\u0580\u0578\u057E", 40, 1 ),
		            new Among ( "\u0576\u0565\u0580\u0578\u057E", 43, 1 ),
		            new Among ( "\u0565\u0580", -1, 1 ),
		            new Among ( "\u0576\u0565\u0580", 45, 1 ),
		            new Among ( "\u0581", -1, 1 ),
		            new Among ( "\u056B\u0581", 47, 1 ),
		            new Among ( "\u057E\u0561\u0576\u056B\u0581", 48, 1 ),
		            new Among ( "\u0578\u057B\u056B\u0581", 48, 1 ),
		            new Among ( "\u057E\u056B\u0581", 48, 1 ),
		            new Among ( "\u0565\u0580\u056B\u0581", 48, 1 ),
		            new Among ( "\u0576\u0565\u0580\u056B\u0581", 52, 1 ),
		            new Among ( "\u0581\u056B\u0581", 48, 1 ),
		            new Among ( "\u0578\u0581", 47, 1 ),
		            new Among ( "\u0578\u0582\u0581", 47, 1 )
		        ];
		
		        var g_v = [209, 4, 128, 0, 18 ];
		
		        var I_p2;
		        var I_pV;
		
		        var sbp = new SnowballProgram();
		
		        function r_mark_regions() {
		            var v_1;
		            I_pV = sbp.limit;
		            I_p2 = sbp.limit;
		            v_1 = sbp.cursor;
		            lab0: do {
		                golab1: while(true)
		                {
		                    lab2: do {
		                        if (!(sbp.in_grouping(g_v, 1377, 1413)))
		                        {
		                            break lab2;
		                        }
		                        break golab1;
		                    } while (false);
		                    if (sbp.cursor >= sbp.limit)
		                    {
		                        break lab0;
		                    }
		                    sbp.cursor++;
		                }
		                I_pV = sbp.cursor;
		                golab3: while(true)
		                {
		                    lab4: do {
		                        if (!(sbp.out_grouping(g_v, 1377, 1413)))
		                        {
		                            break lab4;
		                        }
		                        break golab3;
		                    } while (false);
		                    if (sbp.cursor >= sbp.limit)
		                    {
		                        break lab0;
		                    }
		                    sbp.cursor++;
		                }
		                golab5: while(true)
		                {
		                    lab6: do {
		                        if (!(sbp.in_grouping(g_v, 1377, 1413)))
		                        {
		                            break lab6;
		                        }
		                        break golab5;
		                    } while (false);
		                    if (sbp.cursor >= sbp.limit)
		                    {
		                        break lab0;
		                    }
		                    sbp.cursor++;
		                }
		                golab7: while(true)
		                {
		                    lab8: do {
		                        if (!(sbp.out_grouping(g_v, 1377, 1413)))
		                        {
		                            break lab8;
		                        }
		                        break golab7;
		                    } while (false);
		                    if (sbp.cursor >= sbp.limit)
		                    {
		                        break lab0;
		                    }
		                    sbp.cursor++;
		                }
		                I_p2 = sbp.cursor;
		            } while (false);
		            sbp.cursor = v_1;
		            return true;
		        }
		
		        function r_R2() {
		            if (!(I_p2 <= sbp.cursor))
		            {
		                return false;
		            }
		            return true;
		        }
		
		        function r_adjective() {
		            var among_var;
		            sbp.ket = sbp.cursor;
		            among_var = sbp.find_among_b(a_0, 23);
		            if (among_var == 0)
		            {
		                return false;
		            }
		            sbp.bra = sbp.cursor;
		            switch(among_var) {
		                case 0:
		                    return false;
		                case 1:
		                    sbp.slice_del();
		                    break;
		            }
		            return true;
		        }
		
		        function r_verb() {
		            var among_var;
		            sbp.ket = sbp.cursor;
		            among_var = sbp.find_among_b(a_1, 71);
		            if (among_var == 0)
		            {
		                return false;
		            }
		            sbp.bra = sbp.cursor;
		            switch(among_var) {
		                case 0:
		                    return false;
		                case 1:
		                    sbp.slice_del();
		                    break;
		            }
		            return true;
		        }
		
		        function r_noun() {
		            var among_var;
		            sbp.ket = sbp.cursor;
		            among_var = sbp.find_among_b(a_2, 40);
		            if (among_var == 0)
		            {
		                return false;
		            }
		            sbp.bra = sbp.cursor;
		            switch(among_var) {
		                case 0:
		                    return false;
		                case 1:
		                    sbp.slice_del();
		                    break;
		            }
		            return true;
		        }
		
		        function r_ending() {
		            var among_var;
		            sbp.ket = sbp.cursor;
		            among_var = sbp.find_among_b(a_3, 57);
		            if (among_var == 0)
		            {
		                return false;
		            }
		            sbp.bra = sbp.cursor;
		            if (!r_R2())
		            {
		                return false;
		            }
		            switch(among_var) {
		                case 0:
		                    return false;
		                case 1:
		                    sbp.slice_del();
		                    break;
		            }
		            return true;
		        }
		
		        this.stem = function() {
		            var v_1;
		            var v_2;
		            var v_3;
		            var v_4;
		            var v_5;
		            var v_6;
		            var v_7;
		            v_1 = sbp.cursor;
		            lab0: do {
		                if (!r_mark_regions())
		                {
		                    break lab0;
		                }
		            } while (false);
		            sbp.cursor = v_1;
		            sbp.limit_backward = sbp.cursor; sbp.cursor = sbp.limit;
		            v_2 = sbp.limit - sbp.cursor;
		            if (sbp.cursor < I_pV)
		            {
		                return false;
		            }
		            sbp.cursor = I_pV;
		            v_3 = sbp.limit_backward;
		            sbp.limit_backward = sbp.cursor;
		            sbp.cursor = sbp.limit - v_2;
		            v_4 = sbp.limit - sbp.cursor;
		            lab1: do {
		                if (!r_ending())
		                {
		                    break lab1;
		                }
		            } while (false);
		            sbp.cursor = sbp.limit - v_4;
		            v_5 = sbp.limit - sbp.cursor;
		            lab2: do {
		                if (!r_verb())
		                {
		                    break lab2;
		                }
		            } while (false);
		            sbp.cursor = sbp.limit - v_5;
		            v_6 = sbp.limit - sbp.cursor;
		            lab3: do {
		                if (!r_adjective())
		                {
		                    break lab3;
		                }
		            } while (false);
		            sbp.cursor = sbp.limit - v_6;
		            v_7 = sbp.limit - sbp.cursor;
		            lab4: do {
		                if (!r_noun())
		                {
		                    break lab4;
		                }
		            } while (false);
		            sbp.cursor = sbp.limit - v_7;
		            sbp.limit_backward = v_3;
		            sbp.cursor = sbp.limit_backward;            return true;
		        }
		
		        this.setCurrent = function(word) {
		                sbp.setCurrent(word);
		        };
		
		        this.getCurrent = function() {
		                return sbp.getCurrent();
		        };
		}