Разработка транслятора

Автор работы: Пользователь скрыл имя, 22 Августа 2014 в 11:19, курсовая работа

Краткое описание

Выполнение курсовой работы является одним из важнейших этапов применения теоретических знаний и освоения практических приемов разработки программного обеспечения.
В общении человека и ЭВМ существуют естественные трудности. Машины на атомарном уровне оперируют битами и регистрами, а люди изъясняются на естественных языках или пользуются математическими обозначениями.
Трансляторы стали неотъемлемой частью любой ЭВМ. Поэтому они являются важной практической областью научных исследований, связанных с работой вычислительных систем.

Содержание

ВВЕДЕНИЕ
4
1
ТЕХНИЧЕСКОЕ ЗАДАНИЕ
5
2
ФОРМАЛЬНОЕ ОПИСАНИЕ ЯЗЫКА ПРОГРАММИРОВАНИЯ
7
3
РАЗРАБОТКА АЛГОРИТМОВ СКАНЕРА, СИНТАКСИЧЕСКОГО АНАЛИЗАТОРА И ГЕНЕРАТОРА ПРОМЕЖУТОЧНОЙ ФОРМЫ ПРЕДСТАВЛЕНИЯ ПРОГРАММЫ
14
4
РАЗРАБОТКА ПРОГРАММНОГО КОМПЛЕКСА ПРОЕКТА
21
5
РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ И ОТЛАДКИ ПС
24

ЗАКЛЮЧЕНИЕ
27

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
28

Прикрепленные файлы: 1 файл

курсовая по сис. прог. Межитханов.docx

— 121.52 Кб (Скачать документ)

 

 

 

 

В таблице 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")

Нет записи строки символов в массив конструкций языка

Добавление записи строки символов в массив конструкций


 

 

 

 

 

 

 

Заключение

 

 

В ходе разработки курсовой работы были выполнены следующие виды работ:

  1. определение требований к программе;
  2. разработка технического задания;
  3. изучение и реализация алгоритмов работы составных частей транслятора:
  4. сканера, синтаксического анализатора и генератора кодов.
  5. создана функционирующая программа-транслятор, которая отвечает всем требованиям технического задания.

Тестирование программы выполнено в соответствии с оптимальной стратегией.

К недостаткам программы можно отнести ограниченное количество допустимых конструкций языка и небольшой размер исходных программ.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Список использованных источников

 

 

  1. Харт Дж. Системное программирование в среде Windows. – М.: Вильямс, 2005. – 592 с.
  2. Побегайло А.П. Системное программирование в Windows (+CD). – СПб: БХВ-Петербург, 2006. – 1056 с.
  3. Гальченко В.Г. Системное программирование в среде WIN32. Создание Windows приложений. - Томск: ТПУ, 2009. – 83 с.
  4. Гордеев А.В., Молчанов А.Ю. Системное программное обеспечение.- СПб: Питер,2001.- 736с.
  5. Донован Дж. Системное программирование. - М:Мир,2005
  6. А.Грис. Конструирование компиляторов для цифровых вычислительных машин. - М.: Мир, 2000 - 544 с.
  7. Льюис Ф. и др. Теоретические  основы  проектирования  компиляторов. - М.: Мир, 2003 – 656 с.
  8. Ф.Хопгуд. Методы компиляции. –М.:Мир,1990.
  9. Одинцов И. О. , Александреску А. Профессиональное программирование. Системный подход - СПб. : БХВ-Петербург, 2002.
  10. Кнут Д. Э. Искусство программирования, том 3. Сортировка и поиск. 2-е изд. :  Пер. с англ. : Уч. пос. — М. : Издательский дом "Вильямc" 2000. — 832 с. :  ил.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ПРИЛОЖЕНИЕ.Листинг программы

 

 

 

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(OpenDialog1.FileName);

end;

procedure TForm1.BitBtn1Click(Sender: TObject);

const

zar_slovo: array [1..19] of string=('InputBox','Private','Next','Input', 'Do','End','While','If','For','Then', 'Int', 'Else','Dim','As','Date','Print','Double','Wend','To');

 

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,ssp: integer;

s,n,n1,n2,k,l1,  slovo, kod,slovo1,slovo2,p,s1,s2,y1,y2,sp,isp,y,zy : string;

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+chr(39);

   StringGrid1.Cells[2,r]:='Символьная константа';

   StringGrid1.Cells[1,r]:='S'+IntToStr(sli);

  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

 

Информация о работе Разработка транслятора