Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace ConsoleApplication2
- {
- class Program
- {
- static string s; // тут хранится строка глобально
- static string a; // здесь алфавит
- static string[] left; // массив левых частей введенных правил
- static string[] right; // массив правых частей
- static bool[] end; // массив тру-фолс в зависимости от конечности или не конечности мета-символа в правиле соотв.
- static int AskForAction(int qtyOfActions) // запрос команды меню и проверка вводимых значений
- {
- int act;
- bool ok;
- do
- {
- Console.Write("Команда: ");
- string buf = Console.ReadLine();
- ok = int.TryParse(buf, out act) && act > 0 && act <= qtyOfActions;
- if (!ok)
- RedLn("Доступны команды 1 - " + qtyOfActions + ".");
- } while (!ok);
- Console.WriteLine();
- return act;
- }
- static void RedLn(string str) // Console.WriteLine красного цвета
- {
- Console.ForegroundColor = ConsoleColor.Red;
- Console.WriteLine(str);
- Console.ResetColor();
- }
- static int Check(string rule) // проверка на наличие в строке мета-символа и на его положение, возврат кода ошибки
- {
- int code = 0;
- if (rule.Contains("->"))
- {
- if (rule.IndexOf("->") == 0)
- {
- code = 2;
- }
- else
- {
- if ((rule.IndexOf("->") == rule.Length - 2) || (rule.IndexOf("->.") == rule.Length - 3))
- {
- code = 3;
- }
- }
- }
- else
- {
- code = 1;
- }
- return code;
- }
- static bool Alf(string s) // проверка на соответствие алфавиту
- {
- bool ok = true;
- for (int i = 0; i < s.Length; i++)
- {
- if (!a.Contains(s[i]))
- {
- ok = false;
- break;
- }
- }
- return ok;
- }
- static int Split(string rule, int i) // проверяем левую-правую части переданной строки правила с переданным номером
- { // и записываем куски правила в соотв. массивы под соотв. номерами
- int index = -1;
- index = rule.IndexOf("->.");
- if (index == -1)
- {
- index = rule.IndexOf("->");
- }
- if (!Alf(rule.Substring(0, index)))
- {
- return 1; // левая часть правила не соотв. алф.
- }
- left[i] = rule.Substring(0, index);
- if (rule[index + 2] == '.')
- {
- if (!Alf(rule.Substring(index + 3, rule.Length - index - 3))) // правая часть правила с "->." не соотв. алф.
- {
- return 2;
- }
- else
- {
- end[i] = true;
- right[i] = rule.Substring(index + 3, rule.Length - index - 3);
- }
- }
- else
- {
- if (!Alf(rule.Substring(index + 3, rule.Length - index - 3))) // правая часть правила c "->" не соотв. алф.
- {
- return 2;
- }
- else
- {
- end[i] = false;
- right[i] = rule.Substring(index + 2, rule.Length - index - 2);
- }
- }
- return 0;
- }
- static void Main()
- {
- left = new string[100];
- right = new string[100];
- end = new bool[100];
- bool ok;
- string rule;
- int splitCode = 0;
- Console.Clear();
- Console.Write("Введите алфавит в одну строку: ");
- a = Console.ReadLine() + " ";
- do
- {
- Console.Write("Введите строку для работы: ");
- s = Console.ReadLine();
- ok = Alf(s);
- if (!ok)
- {
- RedLn("Ошибка. В строке обнаружены недопустимые символы. ");
- }
- } while (!ok);
- Console.Clear();
- // удалить пробелы
- Console.WriteLine("Ваш алфавит: " + a);
- Console.WriteLine("Ваша строка: " + s);
- Console.WriteLine("Введите правила: ");
- int ruleNumber = 0;
- int code;
- int act;
- do
- {
- do
- {
- Console.Write("Правило №" + (ruleNumber+1) + ": ");
- rule = Console.ReadLine();
- code = Check(rule);
- switch (code)
- {
- case 1:
- RedLn("Ошибка. В правиле отсутствует мета-символ.");
- Console.WriteLine("Повторите ввод.");
- break;
- case 2:
- RedLn("Ошибка. Левая часть правила не может быть пустой.");
- Console.WriteLine("Повторите ввод.");
- break;
- case 3:
- RedLn("Ошибка. Правая часть правила не может быть пустой.");
- Console.WriteLine("Повторите ввод.");
- break;
- }
- if (code == 0)
- {
- splitCode = Split(rule, ruleNumber);
- switch (splitCode)
- {
- case 1: RedLn("Ошибка. Левая часть правила не соответствует алфавиту.");
- Console.WriteLine("Повторите ввод.");
- break;
- case 2: RedLn("Ошибка. Правая часть правила не соответствует алфавиту.");
- Console.WriteLine("Повторите ввод.");
- break;
- }
- }
- } while (code!=0 || splitCode !=0);
- Console.WriteLine("\n1. Добавить правило.\n2. Закончить ввод правил.");
- act = AskForAction(2);
- ruleNumber++;
- } while (act == 1);
- Split(rule, 0);
- Console.Write(left[0]+" "+right[0]+" "+end[0]);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement