private static INfa Any() { var start = new NfaState(); var end = new NfaState(); start.AddTransistion(new TerminalNfaTransition(new AnyTerminal(), end)); return new Nfa(start, end); }
private static INfa Character(RegexCharacter character) { var start = new NfaState(); var end = new NfaState(); var terminal = new CharacterTerminal(character.Value); var transition = new TerminalNfaTransition( terminal: terminal, target: end); start.AddTransistion(transition); return new Nfa(start, end); }
private static INfa Character(RegexCharacterClassCharacter character, bool negate) { var start = new NfaState(); var end = new NfaState(); ITerminal terminal = new CharacterTerminal(character.Value); if (negate) terminal = new NegationTerminal(terminal); var transition = new TerminalNfaTransition( terminal: terminal, target: end); start.AddTransistion(transition); return new Nfa(start, end); }
private static NfaClosure Closure(IEnumerable <NfaState> states, NfaState endState) { var set = ObjectPoolExtensions.Allocate(SharedPools.Default <HashSet <NfaState> >()); var isFinal = false; foreach (var state in states) { foreach (var item in state.Closure()) { if (item.Equals(endState)) { isFinal = true; } set.Add(item); } } return(new NfaClosure(set, isFinal)); }
public TerminalNfaTransition(AtomTerminal terminal, NfaState target) : base(target) { Terminal = terminal; }
public void AddTransition(AtomTerminal terminal, NfaState target) { AddTransition(new TerminalNfaTransition(terminal, target)); }
public void AddEpsilon(NfaState target) { AddTransition(new EpsilonNfaTransition(target)); }
private static NfaState[] CreateStates(int count) { var states = new NfaState[count]; for (int i = 0; i < states.Length; i++) states[i] = new EntityNfaState(i); return states; }
private static INfa Empty() { var start = new NfaState(); var end = new NfaState(); start.AddTransistion(new NullNfaTransition(end)); return new Nfa(start, end); }
private static INfa Union(INfa first, INfa second) { var start = new NfaState(); start.AddTransistion(new NullNfaTransition(first.Start)); start.AddTransistion(new NullNfaTransition(second.Start)); var end = new NfaState(); var endTransition = new NullNfaTransition(end); first.End.AddTransistion(endTransition); second.End.AddTransistion(endTransition); return new Nfa(start, end); }
private static INfa Range(RegexCharacterRange range, bool negate) { // combine characters into a character range terminal var start = range.StartCharacter.Value; var end = range.EndCharacter.Value; ITerminal terminal = new RangeTerminal(start, end); var nfaStartState = new NfaState(); var nfaEndState = new NfaState(); if (negate) terminal = new NegationTerminal(terminal); nfaStartState.AddTransistion( new TerminalNfaTransition(terminal, nfaEndState)); return new Nfa(nfaStartState, nfaEndState); }
private static INfa Optional(INfa nfa) { var start = new NfaState(); var end = new NfaState(); start.AddTransistion(new NullNfaTransition(nfa.Start)); start.AddTransistion(new NullNfaTransition(end)); nfa.End.AddTransistion(new NullNfaTransition(end)); return new Nfa(start, end); }
private static INfa KleeneStar(INfa nfa) { var start = new NfaState(); var nullToNfaStart = new NullNfaTransition(nfa.Start); start.AddTransistion(nullToNfaStart); nfa.End.AddTransistion(nullToNfaStart); var end = new NfaState(); var nullToNewEnd = new NullNfaTransition(end); start.AddTransistion(nullToNewEnd); nfa.End.AddTransistion(nullToNewEnd); return new Nfa(start, end); }
private static INfa KleenePlus(INfa nfa) { var end = new NfaState(); nfa.End.AddTransistion(new NullNfaTransition(end)); nfa.End.AddTransistion(new NullNfaTransition(nfa.Start)); return new Nfa(nfa.Start, end); }