private void AddSimpleNext(string actual, string next, List <char> interval)
        {
            AbstractRule <char> roleChar      = new SimpleListIncludeRule <char>(1, interval);
            AbstractRule <char> roleEmpty     = new SimpleIncludeRule <char>(SYMBOLEMPTY, ValueDefaultTransitions);
            AbstractRule <char> roleExclusion = new SimpleListExclusionRule <char>(interval, alphabet.ToList(), ValueDefaultTransitions);

            Automa.AddTransition(actual, next, roleChar);
            Automa.AddTransition(actual, next, roleEmpty);
            Automa.AddTransition(actual, actual, roleExclusion);
            //Automa.AddTransition(actual, actual, roleEmpty);
            Automa.AddTransition(actual, next, roleExclusion);
        }
 private void AddSimpleNext(string actual, string next, List<char> interval)
 {
     AbstractRule<char> roleChar = new SimpleListIncludeRule<char>(1, interval);
     AbstractRule<char> roleEmpty = new SimpleIncludeRule<char>(SYMBOLEMPTY, ValueDefaultTransitions);
     AbstractRule<char> roleExclusion = new SimpleListExclusionRule<char>(interval, alphabet.ToList(), ValueDefaultTransitions);
     Automa.AddTransition(actual, next, roleChar);
     Automa.AddTransition(actual, next, roleEmpty);
     Automa.AddTransition(actual, actual, roleExclusion);
     //Automa.AddTransition(actual, actual, roleEmpty);
     Automa.AddTransition(actual, next, roleExclusion);
 }
        public virtual Automa<char> RegexToAutoma()
        {
            Automa = new Automa<char>(GetAlphabet().ToList(), SYMBOLEMPTY);
            var stateInitial = Automa.AddState(NextNameState(), 1, 0);

            if (string.IsNullOrEmpty(RegexFuzzy))
                return Automa;

            string temp = string.Empty;
            bool escape = false;

            for (int i = 0; i < RegexFuzzy.Length; i++)
            {

                if (RegexFuzzy[i] == '\\')
                {
                    //NOTHING
                }
                else if (escape)
                {
                    switch (RegexFuzzy[i])
                    {
                        case 't':
                            temp += '\t';
                            break;
                        case 'n':
                            temp += '\n';
                            break;
                        case 'r':
                            temp += '\r';
                            break;
                        default:
                            temp += RegexFuzzy[i];
                            break;
                    }

                }
                else
                {
                    switch (RegexFuzzy[i])
                    {
                        case '?':
                            temp += "{0,1}";
                            break;
                        case '+':
                            temp += "{1,}";
                            break;
                        case '*':
                            temp += "{0,}";
                            break;
                        default:
                            temp += RegexFuzzy[i];
                            break;
                    }
                }

                if (RegexFuzzy[i] == '\\')
                {
                    escape = true;
                }
                else
                {
                    escape = false;
                }
            }

            RegexFuzzy = temp;//;RegexFuzzy.Replace("?", "{0,1}").Replace("+", "{1,}").Replace("*", "{0,}");

            List<State<char>> lastStates = new List<State<char>>();
            lastStates.Add(stateInitial);

            for (int i = 0; i < RegexFuzzy.Length; i++)
            {
                bool final = (i == RegexFuzzy.Length - 1);

                TypeCharEnum typeActual = GetTypeChar(RegexFuzzy[i]);

                TypeCharEnum typeNext = TypeCharEnum.Final;

                if (!final)
                {
                    typeNext = GetTypeChar(RegexFuzzy[i + 1]);
                }
                if (typeActual == TypeCharEnum.Interval || typeActual == TypeCharEnum.Symbol || (typeActual == TypeCharEnum.Loop && typeNext == TypeCharEnum.Final))
                {
                    var nextState = Automa.AddState(NextNameState(), 0, Convert.ToInt16(final));
                    List<char> interval = null;
                    if (ValidateInterval(i))
                    {
                        interval = AddInterval(ref i, nextState, lastStates);

                        typeNext = TypeCharEnum.Final;
                        final = (i == RegexFuzzy.Length - 1);
                        if (!final)
                            typeNext = GetTypeChar(RegexFuzzy[i + 1]);
                    }
                    else //if ()
                    {
                        foreach (var item in lastStates)
                        {
                            AddSimpleNext(item.Name, nextState.Name, RegexFuzzy[i]);
                        }
                    }

                    if (typeNext == TypeCharEnum.Loop)
                    {
                        AddLoop(ref i, lastStates, nextState, final, interval);
                        final = (i == RegexFuzzy.Length - 1);
                    }
                    else
                    {
                        lastStates.Clear();
                        lastStates.Add(nextState);
                    }

                    if (final)
                    {
                        List<char> inclusion = alphabet.ToList();
                        inclusion.Add(SYMBOLEMPTY);
                        AbstractRule<char> roleAlphabet = new SimpleListIncludeRule<char>(ValueDefaultTransitions, inclusion);
                        foreach (var item in lastStates)
                        {
                            item.PertinenceFinal = 1;
                            Automa.FinalStates.Add(item);
                            Automa.AddTransition(item.Name, item.Name, roleAlphabet);
                        }
                    }
                }
            }

            return Automa;
        }
        public virtual Automa <char> RegexToAutoma()
        {
            Automa = new Automa <char>(GetAlphabet().ToList(), SYMBOLEMPTY);
            var stateInitial = Automa.AddState(NextNameState(), 1, 0);

            if (string.IsNullOrEmpty(RegexFuzzy))
            {
                return(Automa);
            }

            string temp   = string.Empty;
            bool   escape = false;

            for (int i = 0; i < RegexFuzzy.Length; i++)
            {
                if (RegexFuzzy[i] == '\\')
                {
                    //NOTHING
                }
                else if (escape)
                {
                    switch (RegexFuzzy[i])
                    {
                    case 't':
                        temp += '\t';
                        break;

                    case 'n':
                        temp += '\n';
                        break;

                    case 'r':
                        temp += '\r';
                        break;

                    default:
                        temp += RegexFuzzy[i];
                        break;
                    }
                }
                else
                {
                    switch (RegexFuzzy[i])
                    {
                    case '?':
                        temp += "{0,1}";
                        break;

                    case '+':
                        temp += "{1,}";
                        break;

                    case '*':
                        temp += "{0,}";
                        break;

                    default:
                        temp += RegexFuzzy[i];
                        break;
                    }
                }

                if (RegexFuzzy[i] == '\\')
                {
                    escape = true;
                }
                else
                {
                    escape = false;
                }
            }

            RegexFuzzy = temp;//;RegexFuzzy.Replace("?", "{0,1}").Replace("+", "{1,}").Replace("*", "{0,}");

            List <State <char> > lastStates = new List <State <char> >();

            lastStates.Add(stateInitial);

            for (int i = 0; i < RegexFuzzy.Length; i++)
            {
                bool final = (i == RegexFuzzy.Length - 1);

                TypeCharEnum typeActual = GetTypeChar(RegexFuzzy[i]);

                TypeCharEnum typeNext = TypeCharEnum.Final;

                if (!final)
                {
                    typeNext = GetTypeChar(RegexFuzzy[i + 1]);
                }
                if (typeActual == TypeCharEnum.Interval || typeActual == TypeCharEnum.Symbol || (typeActual == TypeCharEnum.Loop && typeNext == TypeCharEnum.Final))
                {
                    var         nextState = Automa.AddState(NextNameState(), 0, Convert.ToInt16(final));
                    List <char> interval  = null;
                    if (ValidateInterval(i))
                    {
                        interval = AddInterval(ref i, nextState, lastStates);

                        typeNext = TypeCharEnum.Final;
                        final    = (i == RegexFuzzy.Length - 1);
                        if (!final)
                        {
                            typeNext = GetTypeChar(RegexFuzzy[i + 1]);
                        }
                    }
                    else //if ()
                    {
                        foreach (var item in lastStates)
                        {
                            AddSimpleNext(item.Name, nextState.Name, RegexFuzzy[i]);
                        }
                    }

                    if (typeNext == TypeCharEnum.Loop)
                    {
                        AddLoop(ref i, lastStates, nextState, final, interval);
                        final = (i == RegexFuzzy.Length - 1);
                    }
                    else
                    {
                        lastStates.Clear();
                        lastStates.Add(nextState);
                    }

                    if (final)
                    {
                        List <char> inclusion = alphabet.ToList();
                        inclusion.Add(SYMBOLEMPTY);
                        AbstractRule <char> roleAlphabet = new SimpleListIncludeRule <char>(ValueDefaultTransitions, inclusion);
                        foreach (var item in lastStates)
                        {
                            item.PertinenceFinal = 1;
                            Automa.FinalStates.Add(item);
                            Automa.AddTransition(item.Name, item.Name, roleAlphabet);
                        }
                    }
                }
            }

            return(Automa);
        }