Разработка алгоритма синтаксического анализа оператора вывода printf языка C++
Постановка
задачи
Разработка алгоритма синтаксического анализа оператора вывода
printf языка C++. Рассмотреть теорию
формальных грамматик, принцип построения графов, и затем разработать проект,
средствами среды программирования Builder C++.
Грамматика
языка
Грамматикой G [Z] называется конечное непустое множество правил вывода,
множества терминальных символов (терминальный словарь), множества
нетерминальных символов и начального символа Z, который должен
встречаться хотя бы один раз в левой части правила вывода
Содержательная часть языка:[<Оператор>]: scanf
("%d",<Текст>);
. <Программа> - > <Оператор>
. <Оператор> - > printf
("%d"<Текст>)
. <Текст> - > Буква|Буква,<Текст>
. Буква - > 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 <vcl. h>
#include <stdio. h>
#include <ctype. h>
#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);
}
}
}
//
---------------------------------------------------------------------------__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])) || (isalpha (str
[j]))) j++;(str [j] =='+'||str [j] =='-'||str [j] =='*'||str [j] =='/'||str [j]
==',') {j++;(! isalpha (str [j])) {error (5); }}( (isdigit (str [j])) ||
(isalpha (str [j]))) j++;( (! isdigit (str [j])) && (! isalpha (str
[j])) &&str [j]! ='+'&&str [j]! ='-'&&str [j]!
='*'&&str [j]! ='/'&&str [j]! =',') break; }}
}level=6;; }') ': {(level==1) {error (3); error
(3); error (4); error (3); error (5); }(level==2) {error (3); error (4); error
(3); error (5); }(level==3) {error (4); error (3); error (5); }(level==4)
{error (3); error (5); }(level==5) {error (5); }(level==6) {level=7; j++;
break; }(level>6)
{(mas, "Ошибка: Лишний символ ') '");->Lines->Add (mas);[0] =='\0';
}++; level=7;; }'; ': {if (level==1) {error (2);
error (3); error (4); error (3); error (5); error (6); }(level==2) {error (3);
error (4); error (3); error (5); error (6); }(level==3) {error (4); error (3);
error (5); error (6); }(level==4) {error (3); error (5); error (6); }(level==5)
{error (5); error (6); }(level==6) {error (6); }(level==7) level=8; j++;
break;(level>7)
{(mas, "Ошибка: Лишний символ '; '!");->Lines->Add (mas);[0] ='\0';
}++;=8;;
}: {while (str [j] ==' ') j++;(level==3
&& str [j]! ='%') {level=4; error (4); }(level==2 && str [j]!
='"') {error (8); }(level==5 && str [j]! =',') {error (5);
}(level==7 || level==8)(str [j]! ='/r' && str [j]! ='\n') error
(8);(str [j] =='/r' || str [j] =='\n') {k=1; break; }++; break; }
}(k==1) break;
}(level==1 && (str [j] =='\r' || str [j]
=='\0')) {error (2); error (3); error (4); error (3); error (5); error (6);
error (7); }(level==2 && (str [j] =='\r' || str [j] =='\0')) {error
(3); error (4); error (3); error (5); error (6); error (7); }(level==3
&& (str [j] =='\r' || str [j] =='\0')) {error (4); error (3); error
(5); error (6); error (7); }(level==4 && (str [j] =='\r' || str [j]
=='\0')) {error (3); error (5); error (6); error (7); }(level==5 &&
(str [j] =='\r' || str [j] =='\0')) {error (5); error (6); error (7);
}(level==7 && (str [j] =='\r' || str [j] =='\0')) {error (7); }
}(str [j]! ='\0');(! Memo2->Lines->Text.
Length ()) Memo2->Lines->Text="Ошибок нет!";
}
//
---------------------------------------------------------------------------
Список
литературы
1.
Шорников Ю.В. Теория и практика языковых процессов. - Новосибирск: Издательство
НГТУ, 2004. - 208с.