Разработка алгоритма синтаксического анализа оператора вывода printf языка C++
Case 4: {sprintf (er, «Ошибка: Ошибка в перечислении спецификаторов типа»); If (level==2 && (str =='r' || str =='')) {error (3); error (4); error (3); error (5); error (6); error (7); }. If ((! isdigit (str)) && (! isalpha (str)) &&str! ='+'&&str! ='-'&&str! ='*'&&str! ='/'&&str! =',') break; }}. Из состояния В можно перейти в состояние D по цепочке d. If (level==3 && (str =='r' || str… Читать ещё >
Разработка алгоритма синтаксического анализа оператора вывода printf языка C++ (реферат, курсовая, диплом, контрольная)
Постановка задачи
Разработка алгоритма синтаксического анализа оператора вывода printf языка C++. Рассмотреть теорию формальных грамматик, принцип построения графов, и затем разработать проект, средствами среды программирования Builder C++.
Грамматика языка
Грамматикой G [Z] называется конечное непустое множество правил вывода, множества терминальных символов (терминальный словарь), множества нетерминальных символов и начального символа Z, который должен встречаться хотя бы один раз в левой части правила вывода
Содержательная часть языка:
G [<�Оператор>: scanf («%d» ,<�Текст>);
1. <�Программа> - > <�Оператор>
2. <�Оператор> - > printf («%d» <�Текст>)
3. <�Текст> - > Буква|Буква,<�Текст>
4. Буква — > a|b|c. |z|Буква {" «, &}
Правила автоматной грамматики:
А: = <�Оператор>
a: = printf
B: = (D
D: = pC)
C: = Буква|Цифра
b: = Буква
b1: = b,
d: = (
p: = c{" ,&,}
Автоматная грамматика:
A — > aB
B — > dD
D — > pC
C — > b|b1C
Граф состояний
На данном графе представлены состояния нашего языка.
1-А (начальное состояние), которое переходит в состояние В по цепочке a.
2-Из состояния В можно перейти в состояние D по цепочке d.
3-Из состояния D переходим в состояние С по цепочке p.
4-Из состояния С есть два пути, по которым делаем переход в состояние С (петля) по цепочке b1, так же по цепочке b переходим в конечное состояние K.
1. Классификация Хомского
Классификация Хомского включает в себя:
1. Грамматики нулевого типа;
2. Контекстно-зависимые грамматики (КЗ — грамматики);
3. Контекстно-свободные грамматики;
4. Автоматные или регулярные грамматики.
алгоритм язык программирование оператор Данная грамматика, согласно классификации Хомского, является автоматной, так как все правила вывода относятся к виду:
А — > а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»
TForm1 *Form1;
// —————————————————————————————————————;
__fastcall TForm1: TForm1 (TComponent* Owner)
: TForm (Owner)
{
}
void error (int i)
{
char er ="" ;
switch (i)
{
case 1: {sprintf (er, «Ошибка: Ошибка в имени функции»);
break; }
case 2: {sprintf (er, «Ошибка: Отсутствует знак ' ('»);
break; }
case 3: {sprintf (er, «Ошибка: Отсутствует знак ''»);
break; }
case 4: {sprintf (er, «Ошибка: Ошибка в перечислении спецификаторов типа»);
break; }
case 5: {sprintf (er, «Ошибка: Ошибка в записи переменных»);
break; }
case 6: {sprintf (er, «Ошибка: Отсутствует знак ') '»);
break; }
case 7: {sprintf (er, «Ошибка: Отсутствует знак '; '»);
break; }
case 8: {sprintf (er, «Ошибка: Неидентифицируемый символ»);
break; }
}
Form1->Memo2->Lines->Add (er);
}
// —————————————————————————————————————;
void __fastcall TForm1: N4Click (TObject *Sender)
{
Close ();
}
// —————————————————————————————————————;
void __fastcall TForm1: N5Click (TObject *Sender)
{
Application->CreateForm (__classid (TForm2), &Form2);
Form2->ShowModal ();
}
// —————————————————————————————————————;
void __fastcall TForm1: J1Click (TObject *Sender)
{
if (OpenDialog1->Execute ())
{
Memo1->Lines->LoadFromFile (OpenDialog1->FileName);
}
else
{
Application->MessageBox («Файл не был выбран. Попробуйте еще раз!» ," Предупреждение", MB_OK);
}
}
// —————————————————————————————————————;
void __fastcall TForm1: N13Click (TObject *Sender)
{
if (SaveDialog1->Execute ())
{
Memo1->Lines->SaveToFile (SaveDialog1->FileName);
}
else
{
Application->MessageBox («Файл не был сохранен. Попробуйте еще раз!» ," Предупреждение", MB_OK);
}
}
// —————————————————————————————————————;
void __fastcall TForm1: N6Click (TObject *Sender)
{
Application->CreateForm (__classid (TForm3), &Form3);
Form3->ShowModal ();
}
// —————————————————————————————————————;
void __fastcall TForm1: N8Click (TObject *Sender)
{
Application->CreateForm (__classid (TForm4), &Form4);
Form4->ShowModal ();
}
// —————————————————————————————————————;
void __fastcall TForm1: btnStartClick (TObject *Sender)
{
Memo2->Clear ();
bool e=0;
int len, level=0;
char* str;
char mas ="" ;
str=Memo1->Lines->GetText ();
len=Memo1->Lines->Text. Length ();
char *type="printf" ;
int k=0;
int i=0,j=0;
do{
k=0; e=0;
if (str [j] =='') break;
if (str [j] =='p')
{
j++;
i++;
while (type [i]! ='')
{
if (str [j] ==type [i]) {j++; i++; }
else {e=1; error (1); break; }
}
}
else {error (1); e=1;
}
if (e==0 && str [j]! =' (' && str [j]! ='" ' && str [j]! ='%' && str [j]! =',' && str [j]! =') ' &&! isalpha (str [j]) && str [j]! ='; ' && str [j]! ='') {error (1); }
while (1)
level = 1;
while (j! =len)
{
switch (str [j])
{
case ' (': {if (level==1) {level=2; j++;
while (str [j] ==' ') j++; break; }
if (level>1) {
sprintf (mas, «Ошибка: Лишний символ ' ('»);
Memo1->Lines->Add (mas);
mas =''; }
j++; break; }
case '" ': {if (level==3||level>=5) {
sprintf (mas, «Ошибка): Лишний символ ''»);
Memo1->Lines->Add (mas);
mas ='';
j++; break; }
if (level==1) {error (2); level=3; j++; break; }
if (level==2) {level=3; j++; break; }
if (level==4) {level=5; j++; break; }
if (level==3) {error (4); level=5; j++; break; }
j++; break; }
case '%': {if (level==1) {error (2); error (3); }
if (level==2) error (3); j++;
if (str [j] =='" ' || str [j] =='' || str [j] ==',' || str [j] ==') ' || str [j] =='; ')
{error (4); level=4; break; }
while (1) {
if (str [j] =='" ' || str [j] =='' || str [j] ==',' || str [j] ==') ' || str [j] =='; ')
{level=4; break; }
else
{
if (isdigit (str [j]))
{
j++;
while (isdigit (str [j])) j++; }
if (str [j]! ='d') {error (4); break; }
j++;
while (str [j] ==' ') j++;
if ((isdigit (str [j])) || (isalpha (str [j]))) {error (4); j++; break; }
else break;
}}
level=4; break; }
case ',': {if (level==1) {error (2); error (3); error (4); error (3); }
if (level==2) {error (3); error (4); error (3); }
if (level==3) {error (4); error (3); }
if (level==4) {error (3); }
j++;
while (str [j] ==' ') j++;
if (! isalpha (str [j])) {error (5); level=6; break; }
if (str [j] =='0' || str [j] =='r' || str [j] ==') ' || str [j] =='; ') {level=6; break; }
else
{
if (str [j] ==',') j++;
if (isalpha (str [j]))
{
j++;
while (1) {
while ((isdigit (str [j])) || (isalpha (str [j]))) j++;
if (str [j] =='+'||str [j] =='-'||str [j] =='*'||str [j] =='/'||str [j] ==',') {j++;
if (! isalpha (str [j])) {error (5); }}
while ((isdigit (str [j])) || (isalpha (str [j]))) j++;
if ((! isdigit (str [j])) && (! isalpha (str [j])) &&str [j]! ='+'&&str [j]! ='-'&&str [j]! ='*'&&str [j]! ='/'&&str [j]! =',') break; }}
}level=6;
break; }
case ') ': {
if (level==1) {error (3); error (3); error (4); error (3); error (5); }
if (level==2) {error (3); error (4); error (3); error (5); }
if (level==3) {error (4); error (3); error (5); }
if (level==4) {error (3); error (5); }
if (level==5) {error (5); }
if (level==6) {level=7; j++; break; }
if (level>6)
{
sprintf (mas, «Ошибка: Лишний символ ') '»);
Memo1->Lines->Add (mas);
mas =='';
}
j++; level=7;
break; }
case '; ': {if (level==1) {error (2); error (3); error (4); error (3); error (5); error (6); }
if (level==2) {error (3); error (4); error (3); error (5); error (6); }
if (level==3) {error (4); error (3); error (5); error (6); }
if (level==4) {error (3); error (5); error (6); }
if (level==5) {error (5); error (6); }
if (level==6) {error (6); }
if (level==7) level=8; j++; break;
if (level>7)
{
sprintf (mas, «Ошибка: Лишний символ '; '!»);
Memo1->Lines->Add (mas);
mas ='';
}
j++;
level=8;
break;
}
default: {while (str [j] ==' ') j++;
if (level==3 && str [j]! ='%') {level=4; error (4); }
if (level==2 && str [j]! ='" ') {error (8); }
if (level==5 && str [j]! =',') {error (5); }
if (level==7 || level==8)
if (str [j]! ='/r' && str [j]! ='n') error (8);
if (str [j] =='/r' || str [j] =='n') {k=1; break; }
j++; break; }
}
if (k==1) break;
}
if (level==1 && (str [j] =='r' || str [j] =='')) {error (2); error (3); error (4); error (3); error (5); error (6); error (7); }
if (level==2 && (str [j] =='r' || str [j] =='')) {error (3); error (4); error (3); error (5); error (6); error (7); }
if (level==3 && (str [j] =='r' || str [j] =='')) {error (4); error (3); error (5); error (6); error (7); }
if (level==4 && (str [j] =='r' || str [j] =='')) {error (3); error (5); error (6); error (7); }
if (level==5 && (str [j] =='r' || str [j] =='')) {error (5); error (6); error (7); }
if (level==7 && (str [j] =='r' || str [j] =='')) {error (7); }
}
while (str [j]! ='');
if (! Memo2->Lines->Text. Length ()) Memo2->Lines->Text="Ошибок нет!" ;
}
// —————————————————————————————————————;
1. Шорников Ю. В. Теория и практика языковых процессов. — Новосибирск: Издательство НГТУ, 2004. — 208с.