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));
        }
Exemple #2
0
        public INfa Union(INfa nfa)
        {
            var newStart = new NfaState();
            var newEnd   = new NfaState();

            newStart.AddTransistion(new NullNfaTransition(Start));
            newStart.AddTransistion(new NullNfaTransition(nfa.Start));

            End.AddTransistion(new NullNfaTransition(newEnd));
            nfa.End.AddTransistion(new NullNfaTransition(newEnd));

            return(new Nfa(newStart, newEnd));
        }
Exemple #3
0
        public INfa Kleene()
        {
            var newStart = new NfaState();
            var newEnd   = new NfaState();

            newStart.AddTransistion(new NullNfaTransition(Start));
            newStart.AddTransistion(new NullNfaTransition(newEnd));

            newEnd.AddTransistion(new NullNfaTransition(Start));
            End.AddTransistion(new NullNfaTransition(newEnd));

            return(new Nfa(newStart, newEnd));
        }
Exemple #4
0
        public INfa Union(INfa nfa)
        {
            var newStart = new NfaState();
            var newEnd = new NfaState();

            newStart.AddTransistion(new NullNfaTransition(Start));
            newStart.AddTransistion(new NullNfaTransition(nfa.Start));

            End.AddTransistion(new NullNfaTransition(newEnd));
            nfa.End.AddTransistion(new NullNfaTransition(newEnd));

            return new Nfa(newStart, newEnd);
        }
Exemple #5
0
        public INfa Kleene()
        {
            var newStart = new NfaState();
            var newEnd = new NfaState();

            newStart.AddTransistion(new NullNfaTransition(Start));
            newStart.AddTransistion(new NullNfaTransition(newEnd));

            newEnd.AddTransistion(new NullNfaTransition(Start));
            End.AddTransistion(new NullNfaTransition(newEnd));

            return new Nfa(newStart, newEnd);
        }
        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 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 Any()
        {
            var start = new NfaState();
            var end   = new NfaState();

            start.AddTransistion(new TerminalNfaTransition(new AnyTerminal(), end));
            return(new Nfa(start, end));
        }
        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 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));
        }
Exemple #11
0
        private static INfa Character(RegexCharacterClassCharacter character, bool negate)
        {
            var start    = new NfaState();
            var end      = new NfaState();
            var terminal = CreateTerminalForCharacter(character.Value, character.IsEscaped, negate);

            var transition = new TerminalNfaTransition(
                terminal: terminal,
                target: end);

            start.AddTransistion(transition);

            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 Character(RegexCharacterClassCharacter character, bool negate)
        {
            var start = new NfaState();
            var end   = new NfaState();

            ITerminal terminal = null;

            if (!character.IsEscaped)
            {
                terminal = new CharacterTerminal(character.Value);
            }
            else
            {
                switch (character.Value)
                {
                case 's':
                    terminal = new WhitespaceTerminal();
                    break;

                case 'd':
                    terminal = new DigitTerminal();
                    break;

                case 'w':
                    terminal = new WordTerminal();
                    break;

                case 'D':
                    terminal = new DigitTerminal();
                    negate   = !negate;
                    break;

                case 'S':
                    terminal = new WhitespaceTerminal();
                    negate   = !negate;
                    break;

                case 'W':
                    terminal = new WordTerminal();
                    negate   = !negate;
                    break;

                default:
                    terminal = new CharacterTerminal(character.Value);
                    break;
                }
            }

            if (negate)
            {
                terminal = new NegationTerminal(terminal);
            }

            var transition = new TerminalNfaTransition(
                terminal: terminal,
                target: end);

            start.AddTransistion(transition);

            return(new Nfa(start, end));
        }