コード例 #1
0
 private static INfa Any()
 {
     var start = new NfaState();
     var end = new NfaState();
     start.AddTransistion(new TerminalNfaTransition(new AnyTerminal(), end));
     return new Nfa(start, end);
 }
コード例 #2
0
 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);
 }
コード例 #3
0
 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);
 }
コード例 #4
0
        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));
        }
コード例 #5
0
 public TerminalNfaTransition(AtomTerminal terminal, NfaState target)
     : base(target)
 {
     Terminal = terminal;
 }
コード例 #6
0
 public void AddTransition(AtomTerminal terminal, NfaState target)
 {
     AddTransition(new TerminalNfaTransition(terminal, target));
 }
コード例 #7
0
 public void AddEpsilon(NfaState target)
 {
     AddTransition(new EpsilonNfaTransition(target));
 }
コード例 #8
0
 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;
 }
コード例 #9
0
 private static INfa Empty()
 {
     var start = new NfaState();
     var end = new NfaState();
     start.AddTransistion(new NullNfaTransition(end));
     return new Nfa(start, end);
 }
コード例 #10
0
        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);
        }
コード例 #11
0
 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);
 }
コード例 #12
0
 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);
 }
コード例 #13
0
        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);
        }
コード例 #14
0
 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);
 }