# include <iostream> # include <string> # include <ctime> using namespace std ; Void opF (int *ar , int * gogo){* gogo +=*id;}int main (){srand (time (NULL));intm =0 ; int arr [3] = { 3,4,2} ;string mas=”awd”;for (int i=0; I < 2; I ++){opF(& arr [i], &mmm)} float*m1=new float[m1]; for (int y=0; y < m; y ++){m1[y]=rand()%10;V}}=>
# include <iostream> # include <string> # include <ctime> using namespace std ; Void opF (int *ar , int * gogo){* gogo +=*id;}int main (){srand (time (NULL));intm =0 ; int arr [3] = { 3,4,2} ;string mas=”awd”;for (int i=0; I < 2; I ++){opF(& arr [i], &mmm)} float*m1=new float[m1]; for (int y=0; y < m; y ++){m1[y]=rand()%10;HV}}=>
# include <iostream> # include <string> # include <ctime> using namespace std ; Void opF (int *ar , int * gogo){* gogo +=*id;}int main (){srand (time (NULL));intm =0 ; int arr [3] = { 3,4,2} ;string mas=”awd”;for (int i=0; I < 2; I ++){opF(& arr [i], &mmm)} float*m1=new float[m1]; for (int y=0; y < m; y ++){m1[y]=rand()%10; A<<”_”<<I V}}=>
# include <iostream> # include <string> # include <ctime> using namespace std ; Void opF (int *ar , int * gogo){* gogo +=*id;}int main (){srand (time (NULL));intm =0 ; int arr [3] = { 3,4,2} ;string mas=”awd”;for (int i=0; I < 2; I ++){opF(& arr [i], &mmm)} float*m1=new float[m1]; for (int y=0; y < m; y ++){m1[y]=rand()%10; cout<<”_”<<I V}}=>
# include <iostream> # include <string> # include <ctime> using namespace std ; Void opF (int *ar , int * gogo){* gogo +=*id;}int main (){srand (time (NULL));intm =0 ; int arr [3] = { 3,4,2} ;string mas=”awd”;for (int i=0; I < 2; I ++){opF(& arr [i], &mmm)} float*m1=new float[m1]; for (int y=0; y < m; y ++){m1[y]=rand()%10; cout<<”_”<<id [const] V}}=>
# include <iostream> # include <string> # include <ctime> using namespace std ; Void opF (int *ar , int * gogo){* gogo +=*id;}int main (){srand (time (NULL));intm =0 ; int arr [3] = { 3,4,2} ;string mas=”awd”;for (int i=0; I < 2; I ++){opF(& arr [i], &mmm)} float*m1=new float[m1]; for (int y=0; y < m; y ++){m1[y]=rand()%10; cout<<”_”<<m1 [const] V}}=>
# include <iostream> # include <string> # include <ctime> using namespace std ; Void opF (int *ar , int * gogo){* gogo +=*id;}int main (){srand (time (NULL));intm =0 ; int arr [3] = { 3,4,2} ;string mas=”awd”;for (int i=0; I < 2; I ++){opF(& arr [i], &mmm)} float*m1=new float[m1]; for (int y=0; y < m; y ++){m1[y]=rand()%10; cout<<”_”<<m1 [y] V}}=>
# include <iostream> # include <string> # include <ctime> using namespace std ; Void opF (int *ar , int * gogo){* gogo +=*id;}int main (){srand (time (NULL));intm =0 ; int arr [3] = { 3,4,2} ;string mas=”awd”;for (int i=0; I < 2; I ++){opF(& arr [i], &mmm)} float*m1=new float[m1]; for (int y=0; y < m; y ++){m1[y]=rand()%10; cout<<”_”<<m1 [y] B}}=>
# include <iostream> # include <string> # include <ctime> using namespace std ; Void opF (int *ar , int * gogo){* gogo +=*id;}int main (){srand (time (NULL));intm =0 ; int arr [3] = { 3,4,2} ;string mas=”awd”;for (int i=0; I < 2; I ++){opF(& arr [i], &mmm)} float*m1=new float[m1]; for (int y=0; y < m; y ++){m1[y]=rand()%10; cout<<”_”<<m1 [y] Y}}=>
# include <iostream> # include <string> # include <ctime> using namespace std ; Void opF (int *ar , int * gogo){* gogo +=*id;}int main (){srand (time (NULL));intm =0 ; int arr [3] = { 3,4,2} ;string mas=”awd”;for (int i=0; I < 2; I ++){opF(& arr [i], &mmm)} float*m1=new float[m1]; for (int y=0; y < m; y ++){m1[y]=rand()%10; cout<<”_”<<m1 [y]
Заключение
В ходе работы были рассмотрены некоторые этапы трансляция программного языка, лексический и семантический анализ. Трансляция же представляет собой перевод из языка высокого уровня к языку низкого уровня вплоть до машинного кода.
На этапе лексического анализа текст исходной программы рассматривается как простой набор слов языка - лексем. Здесь идёт проверка корректности написания слов, а также их распределение по классам лексем. Существует несколько классов - ключевые (служебные) слова, идентификаторы, константы (числовые, символьные, строковые) и операторы (знаки операций и пунктуации). Получившиеся на выходе таблица лексем передаётся на рассмотрение следующему анализатор - синтаксическому.
На этапе синтаксического анализа происходит рассмотрение корректности написания кода с точки зрения грамматики, задающей правила написания языка. Синтаксические конструкции языков, как правило, могут быть описаны через контекстно-свободные грамматики. На выходе анализа появляется ответ на вопрос о том, принадлежит или нет цепочка входных символов заданному языку. Синтаксический разбор -- это основная часть компилятора на этапе анализа. Без выполнения синтаксического разбора работа компилятора бессмысленна
В ходе выполнения данной курсовой работы были сконструированы модели лексического и синтаксического анализа для языка программирования, идентичному С++. Также на языке программирования С++ было создано приложение, отражающее принцип работы лексического анализатора.
Список литературы
1. «Теория автоматов», Карпов Ю. Г.;
2. «Основы построения трансляторов», Карпов Ю. Г.;
3. «Компиляторы: принципы, технологии и инструментарий», Альфред В. Ахо, Моника С. Лам, Рави Сети, Джеффри Д. Ульман;
4. «Теория языков программирования и методы трансляции», Ганичева О. Г.;
5. «Введение в теорию автоматов, языков и вычислений», Джон Хопкрофт, Раджив Мотвани, Джеффри Ульман;
6. Першиков В. И., Савинков В. М. Толковый словарь по информатике;
7. Вычислительная техника. Терминология.
Приложения
Приложение 1
МИНОБРАНАУКИ РОССИИ
федеральное государственное бюджетное
образовательное учреждение высшего образования
ЧЕРЕПОВЕЦКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Институт информационных технологий
Математическое и программное обеспечение ЭВМ
Теория автоматов и формальных языков
УТВЕРЖДАЮ
Зав. кафедрой МПО ЭВМ
д. т.н. _________ Ершов Е.В.
«____» ___________2019г.
Конструирование модели лексического и
синтаксического анализа
Техническое задание на курсовую работу
Листов 9
Руководитель: доцент к.т.н., Ганичева О.Г.
Исполнитель: студент гр. 1ИСб-00-21оп
Фурсссов Г.А.
2020
1 Введение
Лексический анализ -- процесс аналитического разбора входной последовательности символов на распознанные группы -- лексемы, с целью получения на выходе идентифицированных последовательностей. Лексический анализ используется в компиляторах и интерпретаторах исходного кода языков программирования, и в различных синтаксических анализаторах.
Как правило, лексический анализ производится с точки зрения определённого формального языка или набора языков. Язык, а точнее его грамматика, задаёт определённый набор лексем, которые могут встретиться на входе процесса.
Цель такой конвертации обычно состоит в том, чтобы подготовить входную последовательность для другой программы, например, для синтаксического анализатора, и избавить его от определения лексических подробностей в контекстно-свободной грамматике.
Настоящее техническое задание относится к курсовой работе и является демонстрацией процесса разработки и сдачи программной продукции, назначение которой описано в расчётно-пояснительной записке и далее в данном приложении.
2 Основания для разработки
Разработка продукта ведётся с задания преподавателя кафедры Математического и программного обеспечения ЭВМ по дисциплине «Теория автоматов и формальных языков» Ганичевой Оксаны Георгиевны.
Задание:
I. Построить лексический анализатор, который решает следующие задачи:
1) выделяет из текста входной программы все лексемы, входящие в заданную языковую конструкцию (согласно варианту);
2) идентификацию распознанных лексем;
3) выполняет дополнительные функции: удаление лишних пробелов, комментариев, подсчет количества строк в программе;
4) выявляет ошибки в написании лексем, выдает сообщения об ошибке (с указанием позиции ошибки и типа ошибки).
II. Построение лексического анализатора выполнить на основе конечного автомата.
III. По конечному автомату построить соответствующую ему регулярную грамматику.
IV. Построить КС-грамматику для заданного варианта задания.
V. По построенной грамматике построить порождение и дерево вывода для заданной синтаксической конструкции.
VI. Записать формальное определение грамматики с использованием формы Бэкуса-Наура и синтаксических диаграмм в графическом виде.
VII. В работе программы предусмотреть диагностику и локализацию лексических ошибок.
3 Назначение разработки
Целью разработки является создание программного продукта - учебной программы для изучения принципов работы лексического и синтаксического анализаторов с целью закрепить материал, полученный в ходе изучения дисциплины «Теория автоматов и формальных языков». Назначение программного продукта - выделение из текста входной программы всех лексем, входящих в заданную языковую конструкцию; идентификация распознанных лексем; удаление лишних пробелов, комментариев; подсчет количества строк в программе; выявление ошибок в написании лексем и сообщение об этом (с указанием позиции ошибки и типа ошибки).
4 Требование к программе
1.1 Требования к функциональным характеристикам
1) Выделение из текста входной программы все лексемы, входящие в заданные языковые конструкции;
2) идентификация распознанных лексем;
3) выполнение дополнительных функций:
a. Удаление лишних комментариев, пробелов и знаков табуляции;
b. Подсчет количества строк в программе.
4) Выявление ошибки в написании лексем и информирование пользователя об ошибке с указанием её позиции и типа.
4.2 Требования к надежности
Программа должна корректно распознавать лексемы и их идентифицировать, указывать ошибки с их типом и позицией.
4.3 Условия эксплуатации
Требования устанавливаются исходя из условий хранения CD-диска.
Не следует:
1) Наносить на поверхность дисков различные жидкости;
2) брать компакт-диск за поверхность, предназначенную для записи;
3) подвергать воздействию загрязняющих веществ и агрессивных сред;
4) ронять, деформировать или подвергать механическому воздействию;
5) наносить на поверхность диска наклейки или различные материалы;
6) подвергать диск воздействию прямых солнечных лучей;
7) рисовать или делать записи на дисках не предназначенными для этого пишущими предметами;
8) оставлять диск после окончания работы с ним в приводе;
9) оставлять диск в выключенном компьютере.
При загрязнении поверхности диска рекомендуется протирать диск ватой, либо какой-либо другой мягкой тканью, радиальными движениями от центра диска к краю.
4.4 Требования к составу и параметрам технических средств
Требования к параметрам технических средств определяются системными требования программного обеспечения Microsoft Visual Studio 2015:
-процессор с тактовой частотой 1,6 ГГц или большей;
- минимум 1 ГБ ОЗУ;
- 4 ГБ доступного пространства на жестком диске;
4.5 Требования к информационной и программной совместимости
1) Операционная система не ниже Windows 7 с пакетом обновления 1 (SP1);
2) наличие Microsoft Visual Studio 2015 и выше.
4.6 Требования к маркировке и упаковке
Требования не предъявляются.
4.7 Требования к транспортированию и хранению
Требования не предъявляются.
4.8 Специальные требования
Требования не предъявляются.
2. Требования к программной документации
Наличие пояснительной записки с приложениями:
1) техническое задание;
2) руководство пользователя (процесс запуска);
3) код программы.
6. Технико-экономические показатели
Не рассчитывается.
7. Стадии и этапы разработки
Стадии и этапы разработки программного обеспечения представлены в таблице (табл. П1.1).
Таблица П1.1 Стадии и этапы разработки ПО
|
Наименование этапа разработки |
Сроки разработки |
Результат выполнения |
Отметка о выполнении |
|
|
Создание обрабатываемого кода программы |
14.02.2020 |
Написан код программы, над которым в последствие будет проводится лексический анализ |
Выполнено |
|
|
Разработка программного кода для обработки комментариев, пробелов и пустых строк |
20.02.2020 |
Написан код программы выполняющая удаление комментариев и лишних пробелов |
Выполнено |
|
|
Создание автоматной модели промежуточного представления |
05.03.2020 |
Создание автоматной модели, выявляющая идентификаторы |
Выполнено |
|
|
Программирование конечного автомата (КА) |
22.03.2020 |
К уже написанному коду добавлена часть лексического анализатора, обрабатывающаявходную строку по конечному автоматуна основе оператора выбора |
Выполнено |
|
|
Дополнение созданной ранее программы формированием таблиц с классами лексем. |
07.04.2020 |
Программа помимо функций, выполняемых КА, выполняет формирование таблиц с классами лексем |
Выполнено |
|
|
Построение дескрипторного кода и псевдокода |
15.04.2020 |
Программа строит дескрипторный код и псевдокод |
Выполнено |
|
|
Написать части лексического анализатора по обработке лексических ошибок |
20.05.2020 |
Программа обрабатывает лексемы по имеющимся шаблонам и, в зависимости от неточности написания, обрабатывает ошибки |
Выполнено |
|
|
Составление КС-грамматики для синтаксического анализа |
28.05.2020 |
Создана КС-грамматика и построены порождение и дерево разбора для заданной языковой конструкции (цикл for в языке С++) |
Выполнено |
|
|
Подготовка расчётно-пояснительной записки |
05.06.2020 |
Расчётно-пояснительная записка по работе готова к сдаче |
Выполнено |
8 Порядок приемки и контроля
Контроль выполнения работы осуществляется преподавателем. В случае обнаружения недостатков исполнитель работ обязан исправить их в срок, согласованный с преподавателем. Контроль разработки продукта осуществляется поэтапно, в соответствии с графиком, представленным в таблице (табл. П1.2)