private NFAState NewState() { var state = new NFAState(); _nodes.Add(state); _adjList.Add(state, new List<NFALink>()); return state; }
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); }
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); } }
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); }
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); }
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; }
private void CopyIntoWithTerminals(NFAGraph other) { CopyInto(other); this._startState = other._startState; this._finishState = other._finishState; }