Beispiel #1
0
        /// <summary>
        /// 根据当前的正则表达式构造 NFA。
        /// </summary>
        /// <param name="nfa">要构造的 NFA。</param>
        internal override void BuildNfa(Nfa nfa)
        {
            NfaState head     = nfa.NewState();
            NfaState tail     = nfa.NewState();
            NfaState lastHead = head;
            // 如果没有上限,则需要特殊处理。
            int times = maxTimes == int.MaxValue ? minTimes : maxTimes;

            if (times == 0)
            {
                // 至少要构造一次。
                times = 1;
            }
            for (int i = 0; i < times; i++)
            {
                innerExp.BuildNfa(nfa);
                lastHead.Add(nfa.HeadState);
                if (i >= minTimes)
                {
                    // 添加到最终的尾状态的转移。
                    lastHead.Add(tail);
                }
                lastHead = nfa.TailState;
            }
            // 为最后一个节点添加转移。
            lastHead.Add(tail);
            // 无上限的情况。
            if (maxTimes == int.MaxValue)
            {
                // 在尾部添加一个无限循环。
                nfa.TailState.Add(nfa.HeadState);
            }
            nfa.HeadState = head;
            nfa.TailState = tail;
        }
        /// <summary>
        /// 根据当前的正则表达式构造 NFA。
        /// </summary>
        /// <param name="nfa">要构造的 NFA。</param>
        internal override void BuildNfa(Nfa nfa)
        {
            left.BuildNfa(nfa);
            NfaState head = nfa.HeadState;
            NfaState tail = nfa.TailState;

            right.BuildNfa(nfa);
            tail.Add(nfa.HeadState);
            nfa.HeadState = head;
        }
Beispiel #3
0
        /// <summary>
        /// 根据当前的正则表达式构造 NFA。
        /// </summary>
        /// <param name="nfa">要构造的 NFA。</param>
        internal override void BuildNfa(Nfa nfa)
        {
            NfaState head = nfa.NewState();
            NfaState tail = nfa.NewState();

            left.BuildNfa(nfa);
            head.Add(nfa.HeadState);
            nfa.TailState.Add(tail);
            right.BuildNfa(nfa);
            head.Add(nfa.HeadState);
            nfa.TailState.Add(tail);
            nfa.HeadState = head;
            nfa.TailState = tail;
        }
Beispiel #4
0
 /// <summary>
 /// 根据当前的正则表达式构造 NFA。
 /// </summary>
 /// <param name="nfa">要构造的 NFA。</param>
 internal override void BuildNfa(Nfa nfa)
 {
     innerExp.BuildNfa(nfa);
     if (TrailingExpression != null)
     {
         NfaState head = nfa.HeadState;
         TrailingHeadState = nfa.TailState;
         TrailingExpression.BuildNfa(nfa);
         TrailingHeadState.Add(nfa.HeadState);
         nfa.HeadState = head;
         TrailingHeadState.StateType = NfaStateType.TrailingHead;
         nfa.TailState.StateType     = NfaStateType.Trailing;
     }
 }