Example #1
0
 /// <summary>
 /// Проверка числа по варианту
 /// </summary>
 /// <param name="str1"></param>
 /// <returns></returns>
 public NumberCheck IsThisNumberDown(string str1)
 {
     if (BooleanNumber(str1))
     {
         m_element_str.Add(constNT);
         return(NumberCheck.True);
     }
     if (CheckNumber16(str1))
     {
         try
         {
             if (str1.Substring(str1.IndexOf("0x"), str1.IndexOf("0x") + 2) == "0x")
             {
                 m_element_str.Add(constNT);
                 return(NumberCheck.True);
             }
         }
         catch
         {
             CompilerEvent.PrintMessageLLParser(string.Format("Число введено некоректно {0} введите число с добавление 0x{0}", str1));
             return(NumberCheck.Error);
         }
         return(NumberCheck.False);
     }
     else
     {
         return(NumberCheck.False);
     }
 }
Example #2
0
        /// <summary>
        /// Парсит входную строку
        /// </summary>
        /// <param name="str">Строка, для парсинга</param>
        /// <returns>Очередь распарщенных слов</returns>
        public Queue <Word> Up(string str)
        {
            string[]       list  = str.Split(' ');
            Queue <string> words = new Queue <string>(list);
            // Коллекция строк, которые были получены в результате парсинга строки
            Queue <Word> splittedWords = new Queue <Word>();

            while (words.Count > 0)
            {
                string word = words.Dequeue();

                Word foundWord = Words.FirstOrDefault(item => item.Value == word && item.Number >= CountOfRules && item.Value != "const" && item.Value != "id");

                if (foundWord != null)
                {
                    splittedWords.Enqueue(new Word(foundWord.Number, foundWord.Value));
                }
                else
                {
                    if (BooleanNumber(word))
                    {
                        splittedWords.Enqueue(new Word(13, "const")
                        {
                            Temp = word
                        });
                    }
                    else if (CheckNumber16(word))
                    {
                        try
                        {
                            if (word.Substring(word.IndexOf("0x"), word.IndexOf("0x") + 2) == "0x")
                            {
                                splittedWords.Enqueue(new Word(13, "const")
                                {
                                    Temp = word
                                });
                            }
                        }
                        catch
                        {
                            CompilerEvent.PrintMessageLRParser(string.Format("Число введено некоректно {0} введите число с добавление 0x{0}", word));
                        }
                    }
                    else
                    {
                        splittedWords.Enqueue(new Word(10, "id")
                        {
                            Temp = word
                        });
                    }
                }
            }
            splittedWords.Enqueue(new Word(20, "$"));
            return(splittedWords);
        }
Example #3
0
        public void Print_Info(List <Grammatics> element_str, string str_nterminals, string pr)
        {
            string s1 = "";

            foreach (var element in element_str)
            {
                s1 += element.m_name + " ";
            }
            CompilerEvent.PrintCompileInfoLLParser("\nСтрока:" + s1);
            CompilerEvent.PrintCompileInfoLLParser("Магазин:" + str_nterminals);
            CompilerEvent.PrintCompileInfoLLParser("Правила:" + pr);
        }
Example #4
0
 /// <summary>
 /// Вывод ошибок
 /// </summary>
 /// <param name="number"></param>
 /// <param name="check_number"></param>
 public void Message_Errors(string number, NumberCheck check_number)
 {
     if (number.Length > 8)
     {
         check_number = NumberCheck.Error;
         CompilerEvent.PrintMessageLLParser("Длина идентификатора должна быть меньше 8 символов!\nОшибка --> " + number);
     }
     if (number.Length == 0)
     {
         check_number = NumberCheck.Error;
         CompilerEvent.PrintMessageLLParser("Длина идентификатора должна быть больше 0 символов!\n");
     }
 }
Example #5
0
        public void Algoritm_Down()
        {
            string str_nterminals = m_nterminals[0].m_name + " " + eps.m_name;
            int    index_i = 0, index_j = 0;

            index_i = m_element_str[0].number;
            index_j = Search_Index_J(Convert.ToString(str_nterminals[0]));
            int    number_rule = 0;
            string pr          = "";

            while (m_tabel[index_j - 1, index_i - 1] != 33)
            {
                number_rule = m_tabel[index_j - 1, index_i - 1]; // определение номера правила
                if (number_rule == 32)
                {
                    int rule = str_nterminals.IndexOf(" ");
                    str_nterminals = str_nterminals.Remove(0, rule + 1); // удаление первого нетерминала
                    m_element_str.RemoveAt(0);                           // удаление первого элемента из списка
                    Print_Info(m_element_str, str_nterminals, pr);
                }
                else
                {
                    foreach (var rule in m_rule)
                    {
                        if (rule.number == number_rule)
                        {
                            string[] str_nterminals_array = str_nterminals.Split(' ');
                            str_nterminals_array[0] = rule.m_name;
                            str_nterminals          = "";
                            Scaning_Eps_Rule(str_nterminals_array, ref str_nterminals, rule.number);
                            pr += " " + Convert.ToString(rule.number);
                            Print_Info(m_element_str, str_nterminals, pr);
                        }
                    }
                }
                index_i = m_element_str[0].number;
                string[] laM = str_nterminals.Split(' ');
                index_j = Search_Index_J(laM[0]);
                if (m_tabel[index_j - 1, index_i - 1] == 31)
                {
                    CompilerEvent.PrintCompileInfoLLParser("Ошибка при выполнении нисходящего разбора!");
                    m_element_str.Clear();
                    break;
                }
            }
        }