/// <summary>
        /// Получение всех структур языков
        /// </summary>
        /// <param name="rules">Текстовое представление структур</param>
        /// <param name="Minimize"></param>
        /// <returns>Все структуры языков</returns>
        /// <exception cref="InputIsEmpty">
        /// Вызывается при отсутствии входного текста
        /// </exception>
        public AllRules TransformToRules(string rules, bool Minimize = false)
        {
            try
            {
                if (rules.Length == 0)
                {
                    throw new InputIsEmpty();
                }

                Debug.WriteLine("Inside GetAllRules");
                Debug.WriteLine("---------Rules--------");
                Debug.WriteLine(rules);
                Debug.WriteLine("----------------------");

                var result = new AllRules();

                var startIdx = rules.IndexOf(new Start().Literal);
                Debug.WriteLine("Index for /start: " + startIdx);

                if (startIdx == -1)
                {
                    throw new NoStartDetected();
                }


                var endIdx = rules.IndexOf(new End().Literal);
                Debug.WriteLine("Index for /end: " + endIdx);

                if (endIdx == -1)
                {
                    throw new NoEndDetected();
                }


                var text = rules.Substring(startIdx, endIdx - startIdx + new End().Literal.Length);

                Debug.WriteLine("---------Inside text----------");
                Debug.WriteLine(text);
                Debug.WriteLine("-----------------------");


                var firstlang = text.IndexOf(new Language_start().Literal);


                Debug.WriteLine("First idx for /language_start: " + firstlang);
                if (firstlang != -1)
                {
                    var baseLang = GetBaseDescription(text.Substring(0, firstlang), out int line);
                    result.AddBaseRules(baseLang);

                    var languages = (new System.Text.RegularExpressions.Regex("/language_start(.|[\n])*?/language_end")).Matches(text)
                                    .Cast <System.Text.RegularExpressions.Match>()
                                    .Select(m => m.Value)
                                    .ToArray();;

                    Debug.WriteLine("Number of languages: " + languages.Length);
                    foreach (var lang in languages)
                    {
                        string langName = string.Empty;

                        var s = lang.Split('\n')[0].Split().Where(x => !string.IsNullOrWhiteSpace(x)).ToArray();
                        if (s.Length != 2)
                        {
                            throw new SyntaxErrorPlaced(line, 0, null);
                        }
                        langName = s[1];


                        var res = GetLangDescription(lang.Substring(lang.IndexOf('\n') + 1), baseLang, langName, line, out int linec);
                        line += linec;
                        result.AddLanguageRules(langName, res);
                        Debug.WriteLine("Got language: " + langName);
                    }
                }
                else
                {
                    Debug.WriteLine("No other languages");
                    var baseLang = GetBaseDescription(text, out int line_end);
                    result.AddBaseRules(baseLang);
                }


                if (System.Diagnostics.Debugger.IsAttached)
                {
                    Debug.WriteLine("TranformToRules result:");
                    Debug.WriteLine("-------------------Base------------------");
                    foreach (var item in result.GetBaseRules)
                    {
                        Debug.WriteLine(item.Value);
                    }
                    foreach (var item in result.Languages)
                    {
                        Debug.WriteLine("---------------------------");
                        Debug.WriteLine("------------------" + item + "---------------------------");
                        foreach (var item1 in result.GetRulesForLanguage(item))
                        {
                            Debug.WriteLine(item1);
                        }
                    }
                }

                if (Minimize)
                {
                    result = BackTrackTypes(result);

                    if (System.Diagnostics.Debugger.IsAttached)
                    {
                        Debug.WriteLine("TranformToRules result:");
                        Debug.WriteLine("-------------------Base------------------");
                        foreach (var item in result.GetBaseRules)
                        {
                            Debug.WriteLine(item.Value);
                        }
                        foreach (var item in result.Languages)
                        {
                            Debug.WriteLine("---------------------------");
                            Debug.WriteLine("------------------" + item + "---------------------------");
                            foreach (var item1 in result.GetRulesForLanguage(item))
                            {
                                Debug.WriteLine(item1);
                            }
                        }
                    }
                }
                return(result);
            }catch (Exception e)
            {
                throw new RuleParseException("Ошибка при парсинге правил", e);
            }
        }
        /// <summary>
        /// Функция трансформации моделей
        /// </summary>
        /// <param name="text">Текстовое представление исходной модели</param>
        /// <param name="rules">Текстовое представление правил трансформации</param>
        /// <param name="sourceLang">Название исходного языка</param>
        /// <param name="targetLang">Название целевого языка</param>
        /// <returns>Результат трансформации - новое текстовое представление</returns>
        /// <exception cref="NoLanguageRulesFound">
        /// Вызывается при отсутствии определения языка
        /// </exception>
        public string Transform(string text, string rules, string sourceLang, string targetLang)
        {
            AllRules allRules = TransformToRules(rules, true);

            return(Transform(text, allRules, sourceLang, targetLang));
        }