예제 #1
0
        /// <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());
        }
예제 #2
0
        /// <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);
            }
        }
예제 #3
0
 /// <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();
 }