Разработка алгоритма синтаксического анализа оператора вывода printf языка C++

Контрольная работа - Компьютеры, программирование

Другие контрольные работы по предмету Компьютеры, программирование

Постановка задачи

 

Разработка алгоритма синтаксического анализа оператора вывода printf языка C++. Рассмотреть теорию формальных грамматик, принцип построения графов, и затем разработать проект, средствами среды программирования Builder C++.

 

Грамматика языка

 

Грамматикой G [Z] называется конечное непустое множество правил вывода, множества терминальных символов (терминальный словарь), множества нетерминальных символов и начального символа Z, который должен встречаться хотя бы один раз в левой части правила вывода

Содержательная часть языка:[);

.

. )

.

. Буква - > a|b|c. |z|Буква {"",,, &}

Правила автоматной грамматики:

А: =

a: = printf: = (D: = pC)

C: = Буква|Цифра: = Буква: = b,: = (: = c{",&,,}

Автоматная грамматика:

A - > aB- > dD- > pC- > b|b1C

 

Граф состояний

 

На данном графе представлены состояния нашего языка.

-А (начальное состояние), которое переходит в состояние В по цепочке a.

-Из состояния В можно перейти в состояние D по цепочке d.

-Из состояния D переходим в состояние С по цепочке p.

-Из состояния С есть два пути, по которым делаем переход в состояние С (петля) по цепочке b1, так же по цепочке b переходим в конечное состояние K.

 

.Классификация Хомского

 

Классификация Хомского включает в себя:

. Грамматики нулевого типа;

. Контекстно-зависимые грамматики (КЗ - грамматики);

. Контекстно-свободные грамматики;

. Автоматные или регулярные грамматики.

алгоритм язык программирование оператор

Данная грамматика, согласно классификации Хомского, является автоматной, так как все правила вывода относятся к виду:

А - > аB|a|/\, a Є Vt, А,B Є Vn

 

Тест программы

 

Рис.1 - Интерфейс программы

 

Рис.3 - Ошибок нет

 

Рис.4 - одна ошибка

 

Рис.5 - три ошибки

 

И т.д.

 

Листинг

 

// ---------------------------------------------------------------------------

#include

#include

#include

#pragma hdrstop

#include "Unit1. h"

#include "Unit2. h"

#include "Unit3. h"

#include "Unit4. h"

// ---------------------------------------------------------------------------

#pragma package (smart_init)

#pragma resource "*. dfm"*Form1;

// ---------------------------------------------------------------------------

__fastcall TForm1:: TForm1 (TComponent* Owner)

: TForm (Owner)

{

}error (int i)

{er [80] ="";(i)

{1: {sprintf (er, "Ошибка: Ошибка в имени функции");; }2: {sprintf (er, "Ошибка: Отсутствует знак (");; }3: {sprintf (er, "Ошибка: Отсутствует знак ");

break; }4: {sprintf (er, "Ошибка: Ошибка в перечислении спецификаторов типа");; }5: {sprintf (er, "Ошибка: Ошибка в записи переменных");; }6: {sprintf (er, "Ошибка: Отсутствует знак ) ");; }7: {sprintf (er, "Ошибка: Отсутствует знак ; ");; }8: {sprintf (er, "Ошибка: Неидентифицируемый символ");

break; }

}->Memo2->Lines->Add (er);

}

// ---------------------------------------------------------------------------__fastcall TForm1:: N4Click (TObject *Sender)

{();

}

// ---------------------------------------------------------------------------__fastcall TForm1:: N5Click (TObject *Sender)

{>CreateForm (__classid (TForm2), &Form2);->ShowModal ();

}

// ---------------------------------------------------------------------------__fastcall TForm1:: J1Click (TObject *Sender)

{(OpenDialog1->Execute ())

{->Lines->LoadFromFile (OpenDialog1->FileName);

}

{>MessageBox ("Файл не был выбран. Попробуйте еще раз!","Предупреждение",MB_OK);

}

}

// ---------------------------------------------------------------------------__fastcall TForm1:: N13Click (TObject *Sender)

{(SaveDialog1->Execute ())

{->Lines->SaveToFile (SaveDialog1->FileName);

}

{>MessageBox ("Файл не был сохранен. Попробуйте еще раз!","Предупреждение",MB_OK);

}

}

// ---------------------------------------------------------------------------__fastcall TForm1:: N6Click (TObject *Sender)

{>CreateForm (__classid (TForm3), &Form3);->ShowModal ();

}

// ---------------------------------------------------------------------------__fastcall TForm1:: N8Click (TObject *Sender)

{>CreateForm (__classid (TForm4), &Form4);->ShowModal ();

}

// ---------------------------------------------------------------------------__fastcall TForm1:: btnStartClick (TObject *Sender)

{->Clear ();e=0;len, level=0;* str;mas [80] ="";=Memo1->Lines->GetText ();=Memo1->Lines->Text. Length ();*type="printf";k=0;i=0,j=0;{=0; e=0;(str [j] ==\0) break;(str [j] ==p)

{++;++;(type [i]! =\0)

{(str [j] ==type [i]) {j++; i++; }{e=1; error (1); break; }

}

}{error (1); e=1;

}(e==0 && str [j]! = ( && str [j]! =" && str [j]! =% && str [j]! =, && str [j]! =) &&! isalpha (str [j]) && str [j]! =; && str [j]! =\0) {error (1); }(1)

{(str [j] == ( || str [j] ==" || str [j] ==% || str [j] ==, || str [j] ==) || str [j] ==; || str [j] ==\0);j++;

}= 1;(j! =len)

{(str [j])

{ (: {if (level==1) {level=2; j++;(str [j] == ) j++; break; }(level>1) {(mas, "Ошибка: Лишний символ (");->Lines->Add (mas);[0] =\0; }++; break; }": {if (level==3||level>=5) {

sprintf (mas, "Ошибка): Лишний символ ");

Memo1->Lines->Add (mas);[0] =\0;++; break; }(level==1) {error (2); level=3; j++; break; }(level==2) {level=3; j++; break; }(level==4) {level=5; j++; break; }(level==3) {error (4); level=5; j++; break; }++; break; }%: {if (level==1) {error (2); error (3); }(level==2) error (3); j++;(str [j] ==" || str [j] ==\0 || str [j] ==, || str [j] ==) || str [j] ==; )

{error (4); level=4; break; }(1) {(str [j] ==" || str [j] ==\0 || str [j] ==, || str [j] ==) || str [j] ==; )

{level=4; break; }

{(isdigit (str [j]))

{++;(isdigit (str [j])) j++; }(str [j]! =d) {error (4); break; }++;(str [j] == ) j++;( (isdigit (str [j])) || (isalpha (str [j]))) {error (4); j++; break; }break;

}}=4; break; },: {if (level==1) {error (2); error (3); error (4); error (3); }(level==2) {error (3); error (4); error (3); }(level==3) {error (4); error (3); }(level==4) {error (3); }++;(str [j] == ) j++;(! isalpha (str [j])) {error (5); level=6; break; }(str [j] ==0 || str [j] ==\r || str [j] ==) || str [j] ==; ) {level=6; break; }

{(str [j] ==,) j++;(isalpha (str [j]))

{++;(1) {( (isdigit (str [j])) || (isalph