Exemplo n.º 1
0
        private void ResetPattern()
        {
            matchedStartIndex = 0;
            patternStartIndex = 0;
            patternStartNode  = root;
            matchedStartNode  = null;

            CurrentPattern.Clear();
            for (var currentNode = root; currentNode != null; currentNode = currentNode.Next)
            {
                CurrentPattern.Add(currentNode.Value);
            }

            MinimizePattern();
        }
Exemplo n.º 2
0
        /// <summary>
        /// Shrinks pattern until it finds a match or becomes empty
        /// </summary>
        /// <returns>
        /// Returns false if pattern becomes empty
        /// </returns>
        private bool MinimizePattern()
        {
            while (patternStartIndex != HeadIndex + 1)
            {
                if (FindMatch())
                {
                    return(true);
                }
                CurrentPattern.RemoveAt(0);
                patternStartIndex++;
                patternStartNode = patternStartNode.Next;
            }

            matchedStartIndex = 0;
            patternStartIndex = 0;
            matchedStartNode  = null;
            patternStartNode  = null;
            return(false);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Adds a new node to the current pattern and revalidates
        /// </summary>
        /// <returns>
        /// Returns true if pattern is matched fully and repetition is hit
        /// </returns>
        private bool AddToPattern(PatternStackNode <T> node)
        {
            CurrentPattern.Add(node.Value);

            if (patternStartNode == null)
            {
                patternStartNode  = node;
                patternStartIndex = HeadIndex;
            }


            if (matchedStartNode != null)
            {
                if (CheckIfMatches())
                {
                    if (PatternFull())
                    {
                        return(true);
                    }
                    return(false);
                }
            }

            if (FindMatch())
            {
                if (PatternFull())
                {
                    return(true);
                }
                return(false);
            }

            if (MinimizePattern())
            {
                if (PatternFull())
                {
                    return(true);
                }
            }
            return(false);
        }