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