Автор работы: Пользователь скрыл имя, 22 Августа 2014 в 11:19, курсовая работа
Выполнение курсовой работы является одним из важнейших этапов применения теоретических знаний и освоения практических приемов разработки программного обеспечения.
В общении человека и ЭВМ существуют естественные трудности. Машины на атомарном уровне оперируют битами и регистрами, а люди изъясняются на естественных языках или пользуются математическими обозначениями.
Трансляторы стали неотъемлемой частью любой ЭВМ. Поэтому они являются важной практической областью научных исследований, связанных с работой вычислительных систем.
ВВЕДЕНИЕ
4
1
ТЕХНИЧЕСКОЕ ЗАДАНИЕ
5
2
ФОРМАЛЬНОЕ ОПИСАНИЕ ЯЗЫКА ПРОГРАММИРОВАНИЯ
7
3
РАЗРАБОТКА АЛГОРИТМОВ СКАНЕРА, СИНТАКСИЧЕСКОГО АНАЛИЗАТОРА И ГЕНЕРАТОРА ПРОМЕЖУТОЧНОЙ ФОРМЫ ПРЕДСТАВЛЕНИЯ ПРОГРАММЫ
14
4
РАЗРАБОТКА ПРОГРАММНОГО КОМПЛЕКСА ПРОЕКТА
21
5
РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ И ОТЛАДКИ ПС
24
ЗАКЛЮЧЕНИЕ
27
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
28
3.2 Алгоритмизация синтаксического анализатора
Синтаксический анализатор предназначен для проверки исходного кода на наличие в нем синтаксических ошибок.
Проверка осуществляется по лексемам, сгенерированным в результате работы сканера.
На первом шаге работы программы из цепочки лексем формируется строка, соответствующая одному из операторов языка.
На втором шаге программа просматривает строку и вызывает для нее процедуру проверки на ошибки.
На третьем шаге программа выбирает правило для проверки.
На четвертом шаге происходит проверка строки на соответствие правилу и в случае ошибки выдается сообщение.
На пятом шаге программа переходит к лексеме, следующей за последней, принадлежащей к просмотренному оператору, и снова формирует строку, соответствующую одному из операторов языка.
Алгоритм работы синтаксического анализатора приведен на рис. 3.2.
В Таблице 3.2 приведены основные константы и переменные, использованные при реализации данного алгоритма.
Таблица 3.2
Идентификатор |
Назначение |
Тип | |
i,j,k |
параметры циклов |
integer | |
St |
Текущая лексема |
Строковый | |
C |
Позиция текущей лексемы в таблице |
Целый | |
P |
Количество просмотренных лексем в конструкциях, кроме условия и цикла |
Целый | |
Cod |
Код текущей лексемы |
Целый | |
D |
Количество просмотренных лексем в конструкции цикла |
Целый | |
Cond |
Количество просмотренных лексем в конструкции условно оператора |
Целый | |
F |
Возвращает TRUE, если найдена ошибка |
Логический |
3.3 Алгоритмизация генератора промежуточной формы
представления программы
Генератор промежуточной формы представления программы предназначен для перевода программы в запись в виде четверок.
Каждая четверка записывается в виде операция, ор1, ор2, результат, где операция – это выполняемая объектным кодом функция,
Ор1 и ор2 – операнды этой операции, а
Результат – определяет, куда должно быть помещено результирующее значение.
Если в результате работы синтаксического анализатора не обнаружено ошибок, то каждое сформированное в ходе его работы предложения языка переводится в форму четверок по соответствующему данной конструкции алгоритму.
Алгоритм работы генератора промежуточной формы представления программы приведен на рисунке 3.3.
В Таблице 3.3 приведены основные константы и переменные, использованные при реализации данного алгоритма.
Таблица 3.3
Идентификатор |
Назначение |
Тип | |
i,j,k |
параметры циклов |
integer | |
St |
Текущая лексема |
Строковый | |
Kol_s |
Количество знаков в математическом выражении |
Целый | |
Operands |
Операнды математического выражения |
Строковый | |
Stack |
Знаки математических операций в выражении |
Строковый | |
Ch |
Идентификатор, объявленный в цикле как счетчик |
Строковый | |
Expr |
Возвращает TRUE, если в правой части оператора присваивания находится математическое выражение |
логический | |
Ind4 |
Индекс текущей строки в таблице четверок |
Целый | |
ind_jgt |
Позиция четверки JGT в таблице четверок |
Целый | |
Letters |
Буквы английского алфавита |
Константа, set of char=['A'..'Z','a'..'z'] |
4 РАЗРАБОТКА ПРОГРАММНОГО КОМПЛЕКСА ПРОЕКТА
4.1 Программная реализация сканера
Программа реализована на языке Delphi (Object Pascal) в соответствии с алгоритмом. Работа программы основана на разделении ее на подпрограммы, соответствующие выполняемым функциям.
Входными данными является текст исходной программы.
Выходными данными является таблица лексем, с соответствующими типами и кодами. Разработанные подпрограммы приведены в таблице 4.1.
Таблица 4.1 - Подпрограммы
Заголовок подпрограммы |
Описание подпрограммы |
Procedure D_C |
Процедура удаления комментарий |
Procedure D |
Процедура разбиения текста программы на лексемы |
function z (a,b : char) : boolean |
Функция проверки лексемы на принадлежность к классу «Двуместный разделитель». a – первый символ лексемы, b – второй символ лексемы. |
function q (a,b : char) : boolean |
Функция проверки лексемы на принадлежность к классу «Одноместный разделитель». a – первый символ лексемы, b – второй символ лексемы. |
function r (a : string) : boolean |
Функция проверки лексемы на принадлежность к классу «Зарезервированное слово». a – лексема. |
function vint (a : string) : boolean |
Функция проверки лексемы на принадлежность к классу «Целое число». a – лексема. |
function vofloat (a : string) : boolean |
Функция проверки лексемы на принадлежность к классу «Дробное число». a – лексема. |
function vofloat1 (a : string) : boolean |
Функция проверки лексемы, содержащей в качестве разделителя запятую, на принадлежность к классу «Дробное число» a – лексема. |
function i (a : string) : boolean |
Функция проверки лексемы на принадлежность к классу «Идентификатор». a – лексема. |
function s (a : string) : boolean; |
Функция проверки лексемы на принадлежность к классу «Строка символов». a – лексема. |
procedure TMainForm.Scanir(Sender: TObject) |
Процедура сканирования исходного текста программы |
procedure TMainForm.FormActiv (Sender: TObject) |
Процедура заполнения заголовка таблицы при активации формы |
Текст программы приведен в приложении 1.
4.2 Программная реализация синтаксического анализатора
Программа реализована на языке Delphi (Object Pascal) в соответствии с алгоритмом. Работа программы основана на разделении ее на подпрограммы, соответствующие выполняемым функциям.
Входными данными является таблица, сформированная в результате работы сканера.
Выходными данными являются сообщения об обнаруженных ошибках.
Разработанные подпрограммы приведены в таблице 4.2.
Таблица 4.2 - Подпрограммы
Заголовок подпрограммы |
Описание подпрограммы |
function Find: boolean; |
Функция обнаружения ошибок в лексемах |
function k (a : string; k : integer) : boolean; |
Функция проверки выражения. a – выражение, k - номер строки в таблице, в которой находится первая лексема, принадлежащая выражению. |
function e (a : string) : boolean; |
Функция проверки элемента массива. a – элемент массива. |
function list(a : string) : boolean; |
Функция проверки списка идентификаторов. a – список идентификаторов. |
function CLS (a : string; k : integer) : boolean; |
Функция проверки зарезервированного слова, обозначающего очистку экрана. a – слово «CLS», k - номер строки в таблице, в которой находится данная лексема. |
function ent (a : string; k : integer) : boolean; |
Функция проверки операции ввода. a – зарезервированное слово INPUT, k - номер строки в таблице, в которой находится данная лексема. |
function out (a : string; k : integer) : boolean; |
Функция проверки операции вывода. a – зарезервированное слово PRINT, k - номер строки в таблице, в которой находится данная лексема. |
function dim (a : string; k: integer) : boolean; |
Функция проверки раздела описания переменных. a – зарезервированное слово DIM, k - номер строки в таблице, в которой находится данная лексема. |
function pk (k : integer) : boolean; |
Функция проверки операции присваивания. k - номер строки в таблице, в которой находится идентификатор, которому производится присваивание. |
function TMainForm.is_con (a : string; k : integer) : boolean; |
Функция проверки условного оператора. a – зарезервированное слово IF, k - номер строки в таблице, в которой находится данная лексема. |
function TMainForm. cycle (a : string; k : integer) : boolean; |
Функция проверки цикла. a – зарезервированное слово FOR, k - номер строки в таблице, в которой находится данная лексема. |
Текст программы приведен в приложении 1.
4.3 Программная реализация генератора промежуточной формы представления программы
Программа реализована на языке Delphi (Object Pascal) в соответствии с алгоритмом. Работа программы основана на разделении ее на подпрограммы, соответствующие выполняемым функциям.
Входными данными является предложения языка, сформированные в результате работы синтаксического анализатора.
Выходными данными является промежуточная форма представления программы в виде четверок.
Разработанные подпрограммы приведены в таблице 4.3.
Таблица 4.3 - Подпрограммы
Заголовок подпрограммы |
Описание подпрограммы |
function Ga (a : char) : byte; |
Функция определения приоритета математической операции, a – знак операции |
procedure fourexp (a : string); |
Процедура перевода математического выражения в четверки, a - выражение |
procedure fourpr (a : string); |
Процедура перевода конструкции вывода данных в запись в виде четверок, a – конструкция вывода данных |
procedure fourinp (a : string); |
Процедура перевода конструкции ввода данных в запись в виде четверок, a – конструкция ввода данных |
procedure fouras (a : string); |
Процедура перевода конструкции присваивания в запись в виде четверок, a – конструкция присваивания |
procedure TMainForm.fourc (a : string); |
Процедура перевода условного оператора в запись в виде четверок, a – конструкция условного оператора |
procedure TMainForm.fourcy (a : string); |
Процедура перевода цикла в запись в виде четверок, a – конструкция цикла |
Текст программы приведен в приложении 1
В таблице 5.1 приведены результаты тестирования и отладки сканера.
Таблица 5.1 - Результаты тестирования и отладки сканера
№ |
Тестовые данные |
Ожидаемый результат |
Полученный результат |
Тип ошибки |
Исправление |
1 |
#include <stdio.h> int main() { int a = 10; int b = 10; if( a == b ) { printf("a is equalent b\n"); } return 0; } |
Z34 I40 I40 P22 C20 P14 C20 I40 P22 I40 P14 I40 |
Z34 I40 I40 P22 0 I40 P22 I40 P14 I40 |
Не распознается математическое выражение, содержащее только цифры |
Добавление обработки данной ситуации в процедуре разбиения программы на лексемы. Программа выдала ожидаемый результат. |
2 |
int main () { int x cin>>x; if (x%2) cout <<("x-четное"); else cout << ("х-не четное"); return 0; } |
I40 0 C20 P11 I40 P14 C20 P12 I40 |
I40 P10 P22 C20 P11 I40 P14 C20 P12 I40 |
Не выявлено |
Добавление обработки данной ситуации в процедуре разбиения программы на лексемы. Программа выдала ожидаемый результат. |
3 |
int main () { int b; float i; cout >> "введите b"; cin>> b; i = Math.sqrt (b); cout >> i; return 0; } |
Z38 P17 I40 P14 C20 P18 P21 I40 Z39 Z33 I40 |
Z38 P17 I40 P14 C20 P18 P21 I40 Z39 Z33 I40 |
Не выявлено |
|
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; } |
Z35 I40 P22 C20 Z36 C20 Z33 I40 Z37 I40 |
Z35 I40 P22 C20 Z36 C20 Z33 I40 Z37 I40 |
Не выявлено |