Курсовая работа: Конструирование моделей лексического и синтаксического анализа

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

КС-грамматика. Низходящий синтаксический анализатор

Код для кс-грамматики

do {

for (int i=0;i<n;i++){

x=2*i;

y+=x;}}

while(y<=1000)

for ( int i=100;j>n;j-){

y-=j;

do{x+=y;}while(x<=y)

}

G=(T, N, P, S)

Где T -- конечный алфавит терминальных символов (совпадает с алфавитом языка, задаваемого грамматикой);

N -- конечный алфавит нетерминальных символов;

P -- конечное множество правил порождения;

S -- начальный нетерминал грамматики G.

T={id, const, -, *, ?, >, <, /, +, =, ;, (, ), {, }, >=, <=}

N={S, E, B O, C, K, I, Z, L, P}

S=S

P:

1. S> do LEL while (UL / for (I) LEL

2. E> CS/C

3. U> BOB

4. O> >/</>= /<=/!=/==

5. C> BPK;/BPB;/CC/ е

6. P> +/-/*/Z/+=/-=

7. Z> =

8. K> BPB

9. I>int BZB;BOB;BPP;

10. B>const/id

11. L>(/)/{/}/}S/)S/{S/(S

Порождение грамматики

S ? do LEL while (UL ? do {EL while (UL ? do {CSL while(UL ?

do { SL while(UL? do { for(I)LELL while (UL ? do {for(int BZB;BOB;BPP; ) LELL while (UL? do {for(int id ZB;BOB;BPP; ) LELL while (UL? do {for(int id =B;BOB;BPP; ) LELL while (UL? do {for(int id =const;BOB;BPP; ) LELL while (UL? do {for(int id =const;idOB;BPP; ) LELL while (UL? do {for(int id =const;id<B;BPP; ) LELL while (UL? do {for(int id =const;id<id;BPP; ) LELL while (UL? do {for(int id =const;id<id;idPP; ) LELL while (UL? do {for(int id =const;id<id;id+P; ) LELL while (UL? do {for(int id =const;id<id;id++; ) LELL while (UL?

do {for(int id =const;id<id;id++; ) {ELL while (UL? do {for(int id =const;id<id;id++; ) { CLL while (UL? do {for(int id =const;id<id;id++; ) { CCLL while (UL? do {for(int id =const;id<id;id++; ) { BPK;CLL while (UL? do {for(int id =const;id<id;id++; ) { idPK;CLL while (UL? do {for(int id =const;id<id;id++; ) { id=K;CLL while (UL? do {for(int id =const;id<id;id++; ) { id=BPB;CLL while (UL? do {for(int id =const;id<id;id++; ) { id=constPB;CLL while (UL? do {for(int id =const;id<id;id++; ) { id=const*B;CLL while (UL? do {for(int id =const;id<id;id++; ) { id=const*id;CLL while (UL? do {for(int id =const;id<id;id++; ) { id=const*id;BPB;LL while (UL? do {for(int id =const;id<id;id++; ) { id=const*id;idPB;LL while (UL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=B;LL while (UL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;LL while (UL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;LL while (UL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}L while (UL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (UL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (BOBL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (idOBL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=BL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=constL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}S? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(I)LEL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int BZB;BOB;BPP)LEL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int idZB;BOB;BPP)LEL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=B;BOB;BPP)LEL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;BOB;BPP)LEL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id OB;BPP)LEL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >B;BPP)LEL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;BPP)LEL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;idPP)LEL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-P)LEL?

do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-)LEL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){EL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){CSL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){BPB;SL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){idPB;SL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=B;SL?

do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;SL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do LEL while (ULL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do {EL while (ULL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do {BPB;L while (ULL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do {idPB;L while (ULL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do {id+=B;L while (ULL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do {id+=id;L while (ULL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do {id+=id;} while (ULL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do {id+=id;} while (BOBLL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do {id+=id;} while (idOBLL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do {id+=id;} while (id<=BLL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do {id+=id;} while (id<=idLL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do {id+=id;} while (id<=id)L? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do {id+=id;} while (id<=id)}

Логическое проектирование

Для написания программы, был разработан алгоритм, а по нему составлена упрощённая Блок-схема. Блок-схема программы представлена на Рис. 5.

Рис. 5. Блок-схема

Проектирование интерфейса

Таблица 1 Таблица проектирования интерфейса

Элемент интерфейса

Реализация

Выполняемое действие

Поле для ввода текста программы

Поле TextBox

Действий не выполняется

Кнопка обработка

Кнопка

Удаление коментариев и лишних пробелов в тексте введённой программы

Кнопка сброс

Кнопка

Возврат программы в изначальное состояние

Таблица ключевых слов

Таблица

Вывод результата

Таблица идентификаторов

Таблица

Вывод результата

Таблица числовых переменных

Таблица

Вывод результата

Таблица знаков пунктуации

Таблица

Вывод результата

Поле для вывода дескрипторного кода

Поле TextBox

Вывод результата

Поле для вывода псевдокода

Поле TextBox

Вывод результата

Поле для вывода текста программы после обработки

Поле TextBox

Действий не выполняется

Кодирование

Реализация разработанных алгоритмов и составленный по ним текст программы (с комментариями) в Приложении 3.

Тестирование

На этапе тестирования разработаны тестовые данные и оформлены в виде таблицы.

Таблица 2 Таблица тестовых данных

Исходные данные

Тестируемый модуль или подпрограммы

Ожидаемый результат

1

int x=5;

Form1

Выделение лексем

2

int xQx3=5.5;

Form1

Выделение лексем

3

do{for(int i=0;i<n;i++){}}while

Form1

Выделение лексем

4

int x=5; //sadsad

Form1

Выделение лексем и удаление коментариев

5

//int x=5;

Form1

Пропуск

Проведение тестирования по таблице тестовых данных

Таблица 3 Результаты выполнения тестирования

Дата и время

Тестируемый модуль или подпрограмма

Кто проводил тестирование

Описание теста

Результаты тестирования

1

25.12.2017

Form1

Волков А.A

Ввод текста программы для проверки на определение лексем

Успех

2

25.12.2017

Form1

Волков А.A

Ввод текста на проверку определения введённых переменных и констант

Успех

3

25.12.2017

Form1

Волков А.A

Проверка на определение конструкций оператора

Do-while и for

Успех

4

25.12.2017

Form1

Волков А.A

Проверка на пропуск пробелов и комментариев:

Успех

5

25.12.2017

Form1

Волков А.A

Проверка на пропуск комментария

Успех

Заключение

Для моделирования работы компилятора мной была разработана регулярная грамматика, а для синтаксического анализа - КС-грамматика.

Был решён ряд задач:

· определил требования к программному продукту;

· выбрал типы данных, необходимые для решения задачи;

· написал программный код;

· произвел тестирование.

Источники информации

1. Ю.Г.Карпов “ Теория и технология программирования. Основы построения трансляторов.” СПБ.: БХВ-Петербург, 2005.

2.Справочник С# https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/

Приложение

Введение

В процессе написания курсовой работы необходимо написать программу на языке программирования C#, моделирующую работу лексического и синтаксического анализатора. Средой для разработки служит MicrosoftVisualStudio.

1.Назначение разработки

Программа должна моделировать работу компилятора для операторов do-while и for языка С++.

2.Требования к программе

1. Программа должна выделять из текста входной программы все лексемы, входящие в заданную языковую конструкцию операторов do-while и for языка С++

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

3. Программа должна преобразовывать исходный текст программы в псевдокод

4. Программа должна преобразовывать исходный текст программы в дескрипторный код

5. Программа должна выводить сообщения об ошибках.

3. Требования к надежности:

· программа должна выполнять предписанные функциональные характеристики без сбоев;

· обеспечение контроля входной и выходной информации;

· защита при неверных действиях пользователя;

· контроль соответствия типов данных.

4. Требования к программной документации

Расчетно-пояснительная записка.

Руководство пользователя.

Код программы

5. Технико-экономические показатели

Требования не предъявляются

6. Стадии и этапы разработки

Наименование этапа разработки ПО

Сроки разработки

Результат выполнения

Отметка

о выполнении

Получение задания

9.10.2017

Успешно

Выполнено

Анализ требований

23.12.17

Успешно

Выполнено

Реализация

23.12.17-25.12.17

Успешно

Выполнено

Тестирование

25.12.17

Успешно

Выполнено

Внедрение и поддержка

26.12.17-27.12.17

Успешно

Выполнено

7. Порядок контроля и приемки

Наименование контрольного этапа выполнения курсовой работы

Сроки контроля

Результат

выполнения

Отметка

о выполнении

1.Разработка технического задания

с 23 февраля по 24 февраля

Техническое задание

Выполнено

2.Начальная разработка программы

с 23 февраля по 24 февраля

Блок - схема, либо словесное описание программы, регулярная граматика по КА

Выполнено

3. Написание кода программы

с 23 февраля по 25 февраля

Готовая программа

Выполнено

4. Тестирование программы

25 февраля

Рабочая программа

Выполнено

5. Расчётно -пояснительная записка

с 24 февраля по 25 февраля

Расчётно-пояснительная записка

Выполнено

6.Защита курсовой работы

27 февраля

Защита

Выполнено

Требования к составу и параметрам технических средств:

· для запуска программы требуется Windows XP или более поздняя версия и Super VGA видеоадаптер;

· процессор 233 МГц или лучше;

· как минимум 64 МБ Мб ОЗУ;

· не менее 1, 5 ГБ свободного дискового пространства;

· для установки Windows требуется устройство для чтения компакт-дисков (или же поддержка других устройств, таких как флэш-накопителей);

· необходим монитор Super VGA с разрешением 800x600 или более высоким, отображающий 256 и более цветов;

· необходимы клавиатура и мышь.

Требования к информационной и программной совместимости:

· язык программирования (C++);

· среда для разработки программы (Visual Studio C++)

· операционная система (Windows XP);

· уровень защиты (без защиты).

Приложение 2

Текст программы

1. using System;

2. using System.Collections.Generic;

3. using System.ComponentModel;

4. using System.Data;

5. using System.Drawing;

6. using System.Linq;

7. using System.Text;

8. using System.Threading.Tasks;

9. using System.Windows.Forms;

10. using System.IO;

11. namespace automata

12. {

13. public partial class Form1: Form

14. {

15. int v_id = 0, v_op = 0, v_sy = 0, v_k = 0, v_con = 0, v_nu=0;

16. //добавить идентификатор

17. void add_ident(string cell, ref int v_id) {