/// <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)); }