Виведення ланцюжків у формальній граматиці

  • Вид работы:
    Практическое задание
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    101,20 kb
  • Опубликовано:
    2011-05-15
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Виведення ланцюжків у формальній граматиці

Міністерство освіти та науки України

Житомирський державний технологічний університет

ФІКТ

Кафедра ПЗОТ

Група ПІ-39








Лабораторна робота №2

Тема: «Виведення ланцюжків»











м. Житомир,

р.

Мета роботи: вивчити математичну модель формальної граматики, одержати практичні навички виведення ланцюжків в формальній граматиці.

Завдання: потрібно написати програму, що одержує на вході контекстно-вільну граматику, яка визначена правилами підстановки, та друкує в результаті роботи одне або більше виведення термінального ланцюжка в граматиці.

Контекстно-вільну граматику вважати заданою у виді текстового файлу, кожен рядок якого вміщує єдине правило підстановки у вигляді a -> b (a - ідентифікатор нетермінала, b - рядок ідентифікаторів терміналів і нетерміналів, розділених пробільними символами). Пустий ланцюжок ідентифікується відсутністю правою частиною правила підстановки. Довжина ідентифікаторів обмежена 32 символами. Ідентифікатори, які починаються з великої літери вважаються нетерміналами, з маленької - терміналами, нетермінал в лівій частині першого правила підстановки вважається початковим символом.

Припустимо, що на вхід програми поступає граматика виду

S ® a = F ;

F ® F + T | T T ® T * E | T / E | E E ® ( F ) | - ( F ) | a


Тоді результатом роботи програми лабораторної роботи може бути рядок виведення

Þa = F ; Þa = T ; Þa = E ; Þa = a ;

Порядок виконання лабораторної роботи:

1. Написати програму на ЕОМ.

2. Здати працюючу програму викладачу.

3. Підготувати і захистити звіт.

Демонстрація роботи алгоритму на прикладі виведення речення в граматиці

Граматика, задана у вигляді текстового файлу:

-> abr = aTest E Test;-> Fu1 + T | T-> T * E | E / E | E-> ( alma ) | - ( Fu1 ) | -ab-q(-> Quite-> T | Quite

Результат роботи програми


Фрагменти коду програми

KPZ__Lab2

{

   public partial class Form1 : Form

   {

       Dictionary<string, string[]> list = new Dictionary<string, string[]>();

         

       public Form1()

       {

           InitializeComponent(    );

       }

       private void ReadFile(StreamReader files)

       {

           int indexBegin, indexEnd;

           string strFile;

           string strCheck;

           string strKey;

       

           while ((strFile = files.ReadLine()) != null)

           {

               List<string> strValue = new List<string>();

               indexBegin = strFile.IndexOf(" -> ");

               if (-1 != indexBegin)

               {

                   if (strFile[strFile.Length - 1] != 32)

                   {

                       strFile += " ";

                   }

                  

                   strCheck = strFile.Substring(0, indexBegin + 1);

                   if (strCheck[0] != 32)

                   {

                       strKey = "";

                       strKey += " ";

                       strKey += strFile.Substring(0, indexBegin + 1);

                   }

                   else

                   {

                       strKey = strFile.Substring(0, indexBegin + 1);

                   }

                   indexBegin = indexBegin + 3;

                   indexEnd = strFile.IndexOf(" | ", indexBegin);

                   while (indexEnd != -1)

                   {

                       indexBegin = indexEnd + 2;

                       indexEnd = strFile.IndexOf(" | ", indexBegin);

                   }

                   strValue.Add(strFile.Substring(indexBegin));

                   list.Add(strKey, strValue.ToArray());

               }

           }

       }

        private void button1_Click(object sender, EventArgs e)

       {

          

           string result = " S ";

           int i = 0;

           int j = 25;

           int terminal = 1;

           int random;

           string[] strCutted;

           list.Clear();

           textBox2.Clear();

           OpenFileDialog openFileDialog1 = new OpenFileDialog();

           openFileDialog1.InitialDirectory = "C:\\kpz2";

               if (openFileDialog1.ShowDialog() == DialogResult.OK)

           {

              

               using (StreamReader files = new StreamReader(openFileDialog1.FileName))

               {                

                   FileInfo infF = new FileInfo(openFileDialog1.FileName);

                  ReadFile(files);

               }

              

           }

               Random rand = new Random();

               while(1==1)

               {

                   if (i > j)

                   {

                       i = j;

                       break;

                   }

                   terminal = 0;

                   foreach (string strKeys in list.Keys)

                       if (result.IndexOf(strKeys) != -1)

                       {

                           terminal = 1;

                           strCutted = result.Split(new string[] { strKeys }, 2, StringSplitOptions.None);

                           random = rand.Next(list[strKeys].Length);

                           result = strCutted[0] + list[strKeys][random] + strCutted[1];

                           textBox2.Text += "S ->" + result;

                           textBox2.Text += Environment.NewLine;

                           break;

                       }

                   i++;

               }

               button1.Enabled = true;

       }

   }

}

Висновок

математичний формальний граматика ланцюжок термінальний

Виконавши лабораторну роботу, я вивчила математичну модель формальної граматики, одержала практичні навички виведення ланцюжків в формальній граматиці.

Я написала програму, що одержує на вході контекстно-вільну граматику з (.txt) файлу, яка визначена правилами підстановки, та друкує в результаті роботи одне виведення термінального ланцюжка в граматиці.

Похожие работы на - Виведення ланцюжків у формальній граматиці

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!