예제 #1
0
        /// <summary>
        /// Removes the affix suffix rule entry for the word if valid.
        /// </summary>
        /// <param name="word">
        /// The word to be modified.
        /// </param>
        /// <param name="entry">
        /// The affix rule entry to use.
        /// </param>
        /// <returns>
        /// The word after affix removed.  Will be the same word if affix could not be removed.
        /// </returns>
        /// <remarks>
        ///	This method does not verify that the returned word is a valid word, only that the affix can be removed.
        /// </remarks>
        public static string RemoveSuffix(string word, AffixEntry entry)
        {
            int tempLength = word.Length - entry.AddCharacters.Length;

            if ((tempLength > 0) &&
                (tempLength + entry.StripCharacters.Length >= entry.ConditionCount) &&
                (endsWith(word, entry.AddCharacters)))
            {
                // word with out affix
                string tempWord = word.Substring(0, tempLength);
                // add back strip chars
                tempWord += entry.StripCharacters;
                // check that this is valid

                for (int i = 0, j = tempWord.Length - entry.ConditionCount; i < entry.ConditionCount; i++, j++)
                {
                    int charCode = tempWord[j];
                    if ((entry.Condition[charCode] & (1 << i)) == 0)
                    {
                        return(null);
                    }
                }

                return(tempWord);
            }
            return(null);
        }
예제 #2
0
        /// <summary>
        /// Generates the condition character array.
        /// </summary>
        /// <param name="conditionText" type="string">
        /// The text form of the conditions.
        /// </param>
        /// <param name="entry">
        /// The <see cref="AffixEntry"/> to add the condition array to.
        /// </param>
        public static void EncodeConditions(string conditionText, AffixEntry entry)
        {
            // clear the conditions array
            for (int i = 0; i < entry.Condition.Length; i++)
            {
                entry.Condition[i] = 0;
            }

            // if no condition just return
            if (conditionText == ".")
            {
                entry.ConditionCount = 0;
                return;
            }

            bool neg   = false; /* complement indicator */
            bool group = false; /* group indicator */
            bool end   = false; /* end condition indicator */
            int  num   = 0;     /* number of conditions */

            char[] memberChars = new char[200];
            int    numMember   = 0; /* number of member in group */

            foreach (char cond in conditionText)
            {
                // parse member group
                if (cond == '[')
                {
                    group = true; // start a group
                }
                else if (cond == '^' && group)
                {
                    neg = true; // negative group
                }
                else if (cond == ']')
                {
                    end = true; // end of a group
                }
                else if (group)
                {
                    // add chars to group
                    memberChars[numMember] = cond;
                    numMember++;
                }
                else
                {
                    end = true; // no group
                }

                // set condition
                if (end)
                {
                    if (group)
                    {
                        if (neg)
                        {
                            // turn all chars on
                            for (int j = 0; j < entry.Condition.Length; j++)
                            {
                                entry.Condition[j] = entry.Condition[j] | (1 << num);
                            }
                            // turn off chars in member group
                            for (int j = 0; j < numMember; j++)
                            {
                                int charCode = memberChars[j];
                                entry.Condition[charCode] = entry.Condition[charCode] & ~(1 << num);
                            }
                        }
                        else
                        {
                            // turn on chars in member group
                            for (int j = 0; j < numMember; j++)
                            {
                                int charCode = memberChars[j];
                                entry.Condition[charCode] = entry.Condition[charCode] | (1 << num);
                            }
                        }
                        group     = false;
                        neg       = false;
                        numMember = 0;
                    } // if group
                    else
                    {
                        if (cond == '.')
                        {
                            // wild card character, turn all chars on
                            for (int j = 0; j < entry.Condition.Length; j++)
                            {
                                entry.Condition[j] = entry.Condition[j] | (1 << num);
                            }
                        }
                        else
                        {
                            // turn on char
                            int charCode = cond;
                            entry.Condition[charCode] = entry.Condition[charCode] | (1 << num);
                        }
                    } // not group

                    end = false;
                    num++;
                } // if end
            }     // foreach char

            entry.ConditionCount = num;
            return;
        }