Example #1
0
 private NFAState NewState()
 {
     var state = new NFAState();
     _nodes.Add(state);
     _adjList.Add(state, new List<NFALink>());
     return state;
 }
Example #2
0
        private bool SimulateMatch(string input, int ptr, NFAState curNode)
        {
            var c = ptr < input.Length ? input[ptr] : (char?)null;
            foreach (var link in _adjList[curNode])
            {
                bool res = false;
                if (c.HasValue && CanFollowLink(link, c.Value))
                    res = SimulateMatch(input, ptr + 1, link.Target);
                else if (link.IsEmpty)
                    res = SimulateMatch(input, ptr, link.Target);

                if (res == true) return true;
            }

            return _finishState.Contains(curNode);
        }
Example #3
0
        private void InstantiateFromRegex(RegExpr re)
        {
            _startState = NewState();
            _finishState.Add(NewState());
            foreach (var alt in re.Alternatives)
            {
                var altnfa = new NFAGraph(alt);
                CopyInto(altnfa);

                var nsl = new NFALink();
                var nfl = new NFALink();
                nsl.IsEmpty = true;
                nfl.IsEmpty = true;
                nsl.Target = altnfa._startState;
                nfl.Target = _finishState.Single();
                _adjList[_startState].Add(nsl);
                _adjList[altnfa._finishState.Single()].Add(nfl);
            }
        }
Example #4
0
 private void InstantiateFromCharClass(CharacterClass CClass)
 {
     _startState = NewState();
     _finishState.Add(NewState());
     var link = new NFALink();
     link.CharClass = CClass;
     link.Target = _finishState.Single();
     _adjList[_startState].Add(link);
 }
Example #5
0
        private void InstantiateFromAlternative(Alternative alt)
        {
            _startState = NewState();
            _finishState.Add(NewState());
            var curtail = _startState;
            foreach (var mf in alt.Factors)
            {
                var mfnfa = new NFAGraph(mf);
                CopyInto(mfnfa);

                var nl = new NFALink();
                nl.IsEmpty = true;
                nl.Target = mfnfa._startState;
                _adjList[curtail].Add(nl);
                curtail = mfnfa._finishState.Single();
            }
            var nel = new NFALink();
            nel.IsEmpty = true;
            nel.Target = _finishState.Single();
            _adjList[curtail].Add(nel);
        }
Example #6
0
 private HashSet<NFAState> eClosure(NFAState target)
 {
     var rset = new HashSet<NFAState>();
     rset.Add(target);
     foreach (var link in _adjList[target])
     {
         if (link.IsEmpty)
             rset.UnionWith(eClosure(link.Target));
     }
     return rset;
 }
Example #7
0
 private void CopyIntoWithTerminals(NFAGraph other)
 {
     CopyInto(other);
     this._startState = other._startState;
     this._finishState = other._finishState;
 }