private Alternative ParseAlternative() { var alt = new Alternative(); var first = new HashSet<TokenType>() { TokenType.CHAR, TokenType.OPENCLASS, TokenType.OPENGROUP, }; while (first.Contains(_ts.Peek().Type)) { alt.Factors.Add(ParseMatchOp()); } return alt; }
public NFAGraph(Alternative alt) { InstantiateFromAlternative(alt); }
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); }