Exemple #1
0
        /// <summary>
        /// Создание type конструкции
        /// </summary>
        /// <param name="text">Текстовое описание конструкции</param>
        /// <param name="charcnt">Количество символов, использованных для создания</param>
        /// <returns>type конструкция</returns>
        public override Rule CreateRule(string text, out int charcnt)
        {
            System.Diagnostics.Debug.WriteLine(text);
            var wsSplit = text.Split().Where(z => z.Length > 0).ToArray();
            var result  = new TypeRule(wsSplit[0]);


            if (wsSplit.Length == 1)
            {
                charcnt = text.Length;
                return(result);
            }

            if (wsSplit[1] != new Presentation().Literal)
            {
                throw new SyntaxError(new Presentation().Literal, wsSplit[1]);
            }


            //charcnt = wsSplit[0].Length + wsSplit[1].Length + 2;
            //return result;

            var declString = wsSplit[2];

            for (int i = 3; i < wsSplit.Length; ++i)
            {
                declString += " " + wsSplit[i];
            }

            if (declString.Contains("|"))
            {
                throw new SyntaxError("Синтаксическая ошибка. Оператор \"|\" в описании типа");
            }

            var basicBNFFactory = new BasicBNFFactory();
            var basicBNFRule    = (BasicBNFRule)basicBNFFactory.CreateRule(declString, out int x);

            if (!basicBNFRule.Contains(new BNFSystemRef(new Child())))
            {
                throw new SyntaxError("Синтаксическая ошибка. Описание типа без символа /child");
            }


            result.Add(basicBNFRule);


            charcnt = text.Length;
            return(result);
        }
Exemple #2
0
        /// <summary>
        /// Создание BNF конструкции
        /// </summary>
        /// <param name="text">Текстовое описание конструкции</param>
        /// <param name="charcnt">Количество символов, использованных для создания</param>
        /// <returns>BNF конструкция</returns>
        public override Rule CreateRule(string text, out int charcnt)
        {
            var wsSplit = text.Split().Where(z => z.Length > 0).ToArray();;
            var result  = new BNFRule(wsSplit[0]);

            if (wsSplit.Length == 1)
            {
                charcnt = text.Length;
                return(result);
            }

            if (wsSplit[1] != new Presentation().Literal)
            {
                throw new SyntaxError(new Presentation().Literal, wsSplit[1]);
            }


            //charcnt = wsSplit[0].Length + wsSplit[1].Length + 2;
            //return result;

            var declString = wsSplit[2];

            for (int i = 3; i < wsSplit.Length; ++i)
            {
                declString += " " + wsSplit[i];
            }



            var basicBNFFactory = new BasicBNFFactory();
            var orStrings       = declString.Split('|');

            foreach (var orStr in orStrings)
            {
                var basicBNFRule = (BasicBNFRule)basicBNFFactory.CreateRule(orStr, out int x);


                if (basicBNFRule.Contains(new BNFSystemRef(new Child())))
                {
                    throw new SyntaxError("Синтаксическая ошибка. /child в описании не типа");
                }

                result.Add(basicBNFRule);
            }

            charcnt = text.Length;
            return(result);
        }