КС-грамматика. Низходящий синтаксический анализатор
Код для кс-грамматики
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) {