Untitled
unknown
plain_text
10 months ago
12 kB
2
Indexable
Never
using System.Data; namespace OtomataOdev { public partial class Form1 : Form { public Form1() { InitializeComponent(); } String emptyWord = "Ø"; List<String> producededWords = new List<string>(); Random random = new Random(); private void btnProduce_Click(object sender, EventArgs e) { textBox1.Clear(); resetAlhabetsText(); String alphabet = textAlfabets.Text; String regularExpression = txtRegularExp.Text; int produceSizeOfWords = Convert.ToInt32(txtSizeOfWords.Text); printRegularExpression(regularExpression); printTheAlphabets(alphabet); produceWord(regularExpression, alphabet, produceSizeOfWords); } private void printTheAlphabets(String alphabet) { String[] alphabets = alphabet.Split(','); foreach (var item in alphabets) { txtAlphabetList.AppendText(item + " "); } } private void printRegularExpression(String regularExpression) { lblRegularExps.Text = regularExpression; } private void resetAlhabetsText() { txtAlphabetList.Clear(); } private void produceWord(String regularExp, String alphabet, int produceSizeOfWords) { String normalWord = ""; List<String> words = new List<String>(); var validWord = ""; var tempproduceSizeOfWords = produceSizeOfWords; while (tempproduceSizeOfWords >= 0) { validWord = ""; normalWord = ""; var i = 0; for (i = 0; i < regularExp.Length; i++) { var item = regularExp[i]; if (item == '(') { if (!string.IsNullOrEmpty(normalWord)) { validWord += normalWord; produceSizeOfWords--; } int openParenthesisIndex = regularExp.IndexOf('('); int closingParenthesisIndex = regularExp.IndexOf(')'); String subRule = regularExp.Substring(openParenthesisIndex + 1, (closingParenthesisIndex - 1) - openParenthesisIndex); i = closingParenthesisIndex; if (regularExp.Length > closingParenthesisIndex + 1 && regularExp[closingParenthesisIndex + 1] == '*') { words.Add(normalWord+"-"); words.Add(emptyWord + "-"); tempproduceSizeOfWords--; // Boş kelime ekledikten sonra // üretmemiz gereken kelime sayısını azaltıyorum. for (int j = 0; j <= random.Next(10); j++) { if (subRule.Contains('+')) { validWord += generateRandomWord(subRule); } else { validWord += subRule; } } } else { if(subRule.Contains('+') && subRule.Contains('*')) { var seperatedWords = subRule.Split('+'); var firstWord = seperatedWords.First(); var secondWord = seperatedWords.Last(); var randomNumber= random.Next(0,2); if (randomNumber == 0) { for (int j = 0; j < firstWord.Length; j++) { var wordItem = firstWord[j]; if (wordItem == '*') { if (random.Next(0, 2) == 0) { continue; } else { // Eğer yıldızlı bir ifade ise o alfabeden istediğimiz // kadar ekleyebiliyorduk. Onu eklemiş oldum. var wordIndex = firstWord.IndexOf(wordItem, j); validWord = validWord.Remove(wordIndex-1); var word = firstWord[wordIndex - 1]; for (int k = 0; k < random.Next(10); k++) { validWord += word; } } } else { validWord += wordItem; } }; } else { for (int j = 0; j < secondWord.Length; j++) { var wordItem = secondWord[j]; if (wordItem == '*') { if (random.Next(0, 2) == 0) { continue; } else { // Eğer yıldızlı bir ifade ise o alfabeden istediğimiz // kadar ekleyebiliyorduk. Onu eklemiş oldum. var wordIndex = secondWord.IndexOf(wordItem, j); validWord = validWord.Remove(wordIndex - 1); var word = secondWord[wordIndex - 1]; for (int k = 0; k < random.Next(10); k++) { validWord += word; } } } else { validWord += wordItem; } }; } } else if (subRule.Contains('+')) { validWord += generateRandomWord(subRule); } else { validWord += subRule; } } words.Add(validWord + "-"); } else if (item == '*') { // Eğer yıldızlı bir ifade ise o alfabeden istediğimiz // kadar ekleyebiliyorduk. Onu eklemiş oldum. var wordIndex = regularExp.IndexOf(item, i); var word = regularExp[wordIndex - 1]; for (int j = 0; j < random.Next(10); j++) { validWord += word; } } else if(item == '+') { normalWord += item; var seperatedWord = generateRandomWord(normalWord); words.Add(seperatedWord); } else { normalWord += item; } } tempproduceSizeOfWords--; } foreach (var item in words.ToHashSet()) { textBox1.AppendText(item); } } private String generateRandomWord(String subRule) { var validWord = ""; var random = new Random().Next(0, 2); var seperatedWords = subRule.Split('+'); if (random == 0) { return validWord += seperatedWords.First(); } else { return validWord += seperatedWords.Last(); } } private String generateRandomWord(String[] seperatedWords) { var validWord = ""; var random = new Random().Next(0, 2); if (random == 0) { return validWord += seperatedWords.First(); } else { return validWord += seperatedWords.Last(); } } String aass = ""; private void GenerateWord(String rule) { var item = rule[0]; if (item=='(') { if (!string.IsNullOrEmpty(aass)) { producededWords.Add(aass); rule = rule.Substring(aass.Length); } int openParenthesisIndex = rule.IndexOf('('); int closingParenthesisIndex = rule.IndexOf(')'); String subRule = rule.Substring(openParenthesisIndex + 1, (closingParenthesisIndex - 1)); GenerateWord(subRule); } else if (item == '+') { String[] seperatedWords = rule.Split("+"); var words =generateRandomWord(seperatedWords); words.Trim('('); words.Trim(')'); producededWords.Add(words); } else if(item == '*') { } else { aass += item; } } private bool IsValidRegularExpression(string alphabet, string regularExpression) { foreach (var c in regularExpression) { if(c != '4' && c!='*' && c!='('&& c!= ')' && !alphabet.Contains(c)) { return false; } } return true; } } }