/// <summary> /// Создать новый экземпляр грамматики. /// </summary> /// <param name="grammar">Строка с описанием грамматики.</param> /// <param name="specialSymbols">Специальные символы грамматики.</param> public Grammar(string grammar, SpecialSymbols specialSymbols, ActionsContainer actions) { this.specialSymbols = specialSymbols; foreach (var line in grammar.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)) { Rules.Add(new GrammarRule(line, this.specialSymbols)); } foreach (var rule in Rules) { rule.BuildRightPart(Rules, actions); } StartedElement = new GrammarElement(Rules.FirstOrDefault()); }
/// <summary> /// Создать экземпляр правила грамматики, при этом будет инициализирована только левая часть правила /// (т.к. на данном этапе отсутствует полный список нетерминалов). Для инициализирования правой части, /// необходимо вызвать метод BuildRightPart, передав в него полную коллекцию классов <seealso cref="GrammarRule"/> /// с инициализированными левыми частями. /// </summary> /// <param name="line">Строка содержащее правило или несколько подправил.</param> /// <param name="specialSymbols">Специальные символы.</param> internal GrammarRule(string line, SpecialSymbols specialSymbols) { this.specialSymbols = specialSymbols; var splitted = line.Split(new string[] { specialSymbols.Splitter }, StringSplitOptions.None); if (splitted.Length != 2) { throw new Exception($"Правило {line} не соответствует синтаксису правила грамматики."); } Left = splitted.First(); foreach (var part in splitted.Last().Split(new char[] { specialSymbols.Or }, StringSplitOptions.None)) { tmpRight.Add(part); } }
/// <summary> /// Создать новый экземпляр подправила грамматики. /// </summary> /// <param name="part">Часть правила.</param> /// <param name="specialSymbols">Специальные символы.</param> /// <param name="rules">Список правил, необходим для поиска нетерминалов.</param> internal GrammarRulePart(string part, SpecialSymbols specialSymbols, List <GrammarRule> rules, ActionsContainer actions) { Elements = new Tokenizator(part, rules, specialSymbols, actions).GetTokens(); }