Автор работы: Пользователь скрыл имя, 22 Августа 2014 в 11:19, курсовая работа
Выполнение курсовой работы является одним из важнейших этапов применения теоретических знаний и освоения практических приемов разработки программного обеспечения.
В общении человека и ЭВМ существуют естественные трудности. Машины на атомарном уровне оперируют битами и регистрами, а люди изъясняются на естественных языках или пользуются математическими обозначениями.
Трансляторы стали неотъемлемой частью любой ЭВМ. Поэтому они являются важной практической областью научных исследований, связанных с работой вычислительных систем.
ВВЕДЕНИЕ
4
1
ТЕХНИЧЕСКОЕ ЗАДАНИЕ
5
2
ФОРМАЛЬНОЕ ОПИСАНИЕ ЯЗЫКА ПРОГРАММИРОВАНИЯ
7
3
РАЗРАБОТКА АЛГОРИТМОВ СКАНЕРА, СИНТАКСИЧЕСКОГО АНАЛИЗАТОРА И ГЕНЕРАТОРА ПРОМЕЖУТОЧНОЙ ФОРМЫ ПРЕДСТАВЛЕНИЯ ПРОГРАММЫ
14
4
РАЗРАБОТКА ПРОГРАММНОГО КОМПЛЕКСА ПРОЕКТА
21
5
РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ И ОТЛАДКИ ПС
24
ЗАКЛЮЧЕНИЕ
27
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
28
В таблице 5.2 приведены результаты тестирования и отладки синтаксического анализатора.
Таблица 5.2 - Тестирование и отладка синтаксического анализатора
№ |
Тестовые данные |
Ожидаемый результат |
Полученный результат |
Тип ошибки |
Исправление |
1 |
#include <stdio.h> int main() { int a = 10; int b = 10; if( a == b ) { printf("a is equalent b\n"); } return 0; } |
Ошибок нет |
Синтаксическая ошибка. Вывод данных. |
Ошибок нет |
Добавление обработки ситуации использования ; в операторе вывода. Программа выдала ожидаемый результат. |
2 |
int main () { int x cin>>x; if (x%2) cout <<("x-четное"); else cout << ("х-не четное"); return 0; } |
Синтаксическая ошибка. Цикл |
Синтаксическая ошибка. Ввод данных. |
Ошибок нет |
Добавление цикла if. Программа выдала ожидаемый результат. |
3 |
int main () { int b; float i; cout >> "введите b"; cin>> b; i = Math.sqrt (b); cout >> i; return 0; } |
Ошибок нет |
Ошибок нет |
Не выявлено |
Добавление указанного условия окончания цикла. Программа выдала ожидаемый результат. |
4 |
#include <stdio.h> int Foot() printf("begin function foot\n"); int r = 5; return r; printf("end function foot\n"); } int main() { int v = 0; v = Foot(); printf("Foot is return %d.\n", v ); return 0; } |
Синтаксическая ошибка. Условие. |
Ошибок нет |
Не выявлено |
В таблице 5.3 приведены результаты тестирования и отладки генератора кодов.
Таблица 5.3- Тестирование и отладка кодов
№ |
Тестовые данные |
Ожидаемый результат |
Полученный результат |
Тип ошибки |
Исправление |
1 |
#include <stdio.h> int main() { int a = 10; int b = 10; if( a == b ) { printf("a is equalent b\n"); } return 0; } |
*, INT A,INT B, IF +, A, INT, B\N =B\N |
*, INT A,INT B, IF +, A, INT, B\N =B\N |
Операция присваивания не выделена в отдельную четверку |
Выделение присваивания в отдельную четверку. Программа выдала ожидаемый результат |
2 |
int main () { int x cin>>x; if (x%2) cout <<("x-четное"); else cout << ("х-не четное"); return 0; } |
%,X , X =, X%2 "X - ЧЕТНОЕ", TRUE, (7) Х - НЕЧЕТНОЕ, FALSE, (9) CALL, XPRINT PARAM, X |
%,X , X =, X%2 "X - ЧЕТНОЕ", TRUE, (7) Х - НЕЧЕТНОЕ, FALSE, (9) X |
Не обрабатывается ветвь ЛОЖЬ для условного оператора |
Добавление обработки ветви ЛОЖЬ для условного оператора. Программа выдала ожидаемый результат. |
3 |
int main () { int b; float i; cout >> "введите b"; cin>> b; i = Math.sqrt (b); cout >> i; return 0; } |
>, INT B FLOAT I, B (8) I, #MATH.SQRT. B =I |
>, INT B FLOAT I, B (8) I, #MATH.SQRT. B =I |
Конструкция цикла обработана не до конца, необходимо удалить обработку т.к. она уже обработана выше, где определяется I |
Добавление удаления из конструкции цикла после обработки счетчика. Программа выдала ожидаемый результат. |
4 |
#include <stdio.h> int Foot() printf("begin function foot\n"); int r = 5; return r; printf("end function foot\n"); } int main() { int v = 0; v = Foot(); printf("Foot is return %d.\n", v ); return 0; } |
>,INT FOOT, PRINTF, INT R RETURN R, INT V, (4) (6) "END FUNCTION FOOT\N" INTV = 0 PRINTF("FOOT IS RETURN%D.N",V") |
>,INT FOOT, PRINTF, INT R RETURN R, INT V, (4) (6) PRINTF "END FUNCTION FOOT\N" INTV = 0 PRINTF("FOOT IS RETURN%D.N",V") |
Нет записи строки символов в массив конструкций языка |
Добавление записи строки символов в массив конструкций |
Заключение
В ходе разработки курсовой работы были выполнены следующие виды работ:
Тестирование программы выполнено в соответствии с оптимальной стратегией.
К недостаткам программы можно отнести ограниченное количество допустимых конструкций языка и небольшой размер исходных программ.
Список использованных источников
ПРИЛОЖЕНИЕ.Листинг программы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, Grids, StdCtrls, Buttons, XPMan;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
Afbk1: TMenuItem;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
Memo1: TMemo;
Label1: TLabel;
BitBtn1: TBitBtn;
StringGrid1: TStringGrid;
Label2: TLabel;
StringGrid2: TStringGrid;
Label3: TLabel;
OpenDialog1: TOpenDialog;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
XPManifest1: TXPManifest;
procedure N2Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure Label1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.N2Click(Sender: TObject);
begin
If opendialog1.Execute
then Memo1.Lines.LoadFromFile(
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
const
zar_slovo: array [1..19]
of string=('InputBox','Private','
zmo: set of char = ['+','-','*','/'];
zs:set of char = ['<','=','>',':'];
zs1:set of char = ['<','=','>'];
odr: set of char = ['=',':','+','-','*','/',';','
cifr: set of char = ['0'..'9'];
mb: set of char = ['a'..'z'];
bb: set of char = ['A'..'Z'];
var
i,i2, j,r,x,i1, j1 ,l,ss1,ss2,t,w,i4,h,nps,ssp1,
s,n,n1,n2,k,l1,
slovo, kod,slovo1,slovo2,p,s1,s2,y1,
Flag,f:boolean;
ssi, odi, dvi, idi, sli,chi:integer;
ss: array[1..13] of string;
// Memo1.Lines.Count количество строк в мемо
// Memo1.Lines[] обращение к конкретной строки
begin
ss1:=0;
ss2:=0;
ssi:=0;
odi:=0;
dvi:=0;
idi:=0;
sli:=0;
chi:=0;
i:=0;
//Проверка комментарий
While i< memo1.Lines.count do
begin
s:= Memo1.Lines[i];
If s[1]= chr(39) then
label4.Caption:= 'Есть комментарий'
else
begin
// в программу добавляем строки
n:= n + s + ' ';
end;
// прибавляем строку
i:=i+1;
end;
i:=1;
while i<=length (n) do
begin
//вхождение в множество
kod:=kod+n[i];
if (n[i] in zs) and (n[i+1] in odr) or (n[i] in zs) and (n[i+1] in zs) then kod:=kod
else
begin
if n[i] in zmo then kod:=kod+' ';
if n[i] in odr then kod:=kod+' ';
if n[i] in zs then kod:=kod+' ';
if n[i+1] in zmo then kod:=kod+' ';
if n[i+1] in odr then kod:=kod+' ';
if n[i+1] in zs then kod:=kod+' ';
if n[i+1] = chr(34) then kod:=kod+' ';
if n[i-1] in zmo then kod:=kod+' ';
If n[i+1] = chr(34) then kod:=kod+' ';
end;
i:=i+1;
end;
i:=1;
slovo:='';
// Проверка слова
r:=0;
While i<=length (kod) do
begin
if kod[i]=chr(32) then
Begin
r:=r+1;
f:=true;
//r номер лексемы
StringGrid1.Cells[0,r]:=slovo;
//если слово входит в одноместное множество, то это одноместный разделитель
if (slovo[1] in odr) or (slovo[1] in zs1) then begin
// определение порядкового номера одномерного разделителя
odi:=odi+1;
StringGrid1.Cells[2,r]:='
StringGrid1.Cells[1,r]:='od'+ IntToStr (odi);
f:=false;
If slovo[1]='(' then
ss2:=ss2+1;
If slovo[1]=')' then
ss1:=ss1+1;
end;
// проверка то что лексемa является цифрой
flag:= false;
for x:=1 to length (slovo) do
if not (slovo[x] in cifr) then
flag := true;
if flag = false then
begin
chi:=chi+1;
StringGrid1.Cells[2,r]:='Целое число';
StringGrid1.Cells[1,r]:='C'+ IntToStr (chi);
f:=false;
end;
for j1:=1 to 19 do
if slovo = zar_slovo [j1] then
begin
ssi:=ssi+1;
StringGrid1.Cells[2,r]:='
StringGrid1.Cells[1,r]:='ss'+ IntToStr (ssi);
f:=false;
end;
If f=true then
StringGrid1.Cells[2,r]:='
if (slovo[1] in odr) and (slovo[2] in odr) or (slovo[1] in zs) and (slovo[2] in zs)
then begin
StringGrid1.Cells[2,r]:='
odi:=odi-1;
dvi:=dvi+1;
StringGrid1.Cells[1,r]:='dv' + IntToStr (dvi);
f:=false;
end;
If f=true then
begin
idi:=idi+1; //увеличение счетчика лексемы идентификатора на 1
StringGrid1.Cells[2,r]:='
StringGrid1.Cells[1,r]:='I' + IntToStr (idi);
end;
slovo:='';
Repeat i:=i+1;
Until kod[i]<> chr (32)
end
else
// проверяем на символьную константу
If kod[i]=chr(34) then
begin
repeat
begin
slovo:=slovo+ kod[i];
i:=i+1;
end
until kod[i]=chr(34);
r:=r+1;
i:=i+2;
sli:=sli+1;
StringGrid1.Cells[0,r]:=slovo+
StringGrid1.Cells[2,r]:='
StringGrid1.Cells[1,r]:='S'+
slovo:=kod[i];
i:=i+1;
end
else
begin
slovo:=slovo+kod[i];
i:=i+1;
end;
end;
// синтаксический анализатор
// проверка соответствия идентификаторов
Flag:=true; // истина, что нет ошибок
for i2:=1 to (r-1) do // цикл от 1 до количества лексем (проверка всех лексем)
begin
n1:= StringGrid1.Cells [1,i2]; //строковой переменной просваиваем код лексмы
if n1[1]='I' then // если первый символ и, то входим в условие
begin
n2:=StringGrid1.Cells [0,i2]; // др строковой перменной присваиваем ячейку с лексемой
If not((n2[1] in mb) or (n2[1] in bb) or (n2[1]='_')) then
flag:=false;
end;
end;
// проверка количества скобок
If not(ss2=ss1) then flag:=false;
//проверка оператора ввода
for i:=1 to(r-1) do
begin
l1:=StringGrid1.Cells [0,i];
if l1='Input' then
begin
slovo:=StringGrid1.Cells [1,i+1];
if not (slovo[1]='I') then
begin
flag:=false;
break;
end;
end;
//проверка оператора вывода
if l1='Print' then
begin
slovo:=StringGrid1.Cells [1,i+1];
if not((slovo[1]='I')or (StringGrid1.Cells [2,i+1]='Символьная константа') ) then
begin
flag:=false;
break;
end;
end;
// Проверка цикла FOR