3723 СИСТЕМНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ

1. Требования к выполнению курсовой работы и порядок выполнения

1.1. Цель работы

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

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

Компилятор должен состоять из следующих частей:

  • лексический анализатор;
  • синтаксический анализатор.

В результате выполнения курсовой работы должны быть разработаны программная реализация компилятора и пояснительная записка, выполненная в соответствии с заданием на курсовую работу и оформленная в соответствии с требованиями ГОСТ.

1.2. Порядок выполнения работы

Работа должна выполняться в следующей последовательности:

1) построение лексического анализатора:

  • изучение задания на работу с целью определения перечня используемых типов лексем;
  • разработка для каждого используемого в задании типа лексем своей автоматной грамматики;
  • утверждение разработанных автоматных грамматик у преподавателя;
  • разработка для каждого типа лексем своего конечного автомата и, если необходимо, объединенного (единого для распознавания всех заданных лексем) конечного автомата;
  • выбор (по согласованию с преподавателем) способов организации таблиц лексического анализатора;
  • разработка программной реализации каждого автомата;
  • разработка программной реализации лексического анализатора в целом;
  • тестирование лексического анализатора;

2) построение синтаксического анализатора:

  • уточнение в соответствии с конкретным заданием грамматики входного языка, приведенной в приложении 1;
  • удаление в правилах грамматики левой рекурсии;
  • утверждение уточненной грамматики у преподавателя;
  • разработка в соответствии с грамматикой и требованиями метода рекурсивного спуска распознающих процедур для каждого нетерминального символа грамматики;
  • разработка программной реализации синтаксического анализатора в целом;
  • тестирование лексического анализатора;

3) разработка программной реализации двухфазного (лексический и синтаксический анализ) компилятора в целом;

4) тестирование компилятора.

1.3. Требования к содержанию пояснительной записки

Пояснительная записка к курсовой работе должна быть оформлена в соответствии с требованиями ГОСТ и содержать следующие разделы:

- задание к выполнению курсовой работы;

- анализ задания с описанием всех типов используемых в задании лексем, операторов и их особенностей;

- описание выбранных способов организации таблиц лексического анализатора;

- автоматные грамматики для каждого из типов лексем;

- конечные автоматы для каждого из типов лексем;

- текст программы лексического анализатора;

- описание результатов тестирования лексического анализатора;

- описание уточненной грамматика входного языка в одной из трех возможных форм:

- форма Бэкуса-Наура;

- регулярных выражений (с метасимволами);

- графическая форма (синтаксические диаграммы);

- тексты распознающих процедур для метода рекурсивного спуска;

- текст программы синтаксического анализатора в целом;

- описание результатов тестирования синтаксического анализатора;

- описание принципов программной реализации двухфазного компилятора в целом;

- текст программы компилятора в целом;

- описание результатов тестирования компилятора в целом.

Любое отступление от приведенных требований ведет к снижению итоговой оценки.

1.4. Принципы оценки результатов работы

Выполненная работа оценивается по следующим параметрам:

- степень законченности и самостоятельности разработки компилятора;

- степень соответствия разработанного компилятора требованиям задания;

- степень соответствия содержания пояснительной записки требованиям п. 1.3 «Требования к содержанию пояснительной записки»;

- качество программной реализации компилятора (графический интерфейс, отсутствие зависаний, продуманность сообщений об ошибках);

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

 

2. Построение лексического анализатора

2.1. Задачи лексического анализа

Лексический анализ (ЛА) является первой фазой процесса компиляции и включает в себя

  • просмотр исходного текста программы и преобразование его в длинную строку;
  • удаление из текста программы комментариев и незначащих пробелов;
  • выделение в тексте лексических единиц (нахождение границ лексем);
  • распознавание лексических единиц (типов лексем);
  • преобразование лексем во внутреннюю форму представления (таблицу кодов лексем);
  • формирование служебных таблиц (таблицы терминальных символов, таблицы констант, таблицы имен и.т.д.).

Перечень лексем, которые распознаются ЛА, определяются языком программирования и грамматикой этого языка.

В языках программирования обычно выделяются следующие основные типы лексем: идентификаторы; служебные слова; целые и вещественные константы; строки; операции; разделители.

Границы  лексем (начало и конец лексемы) определяются обычно следующим образом:

- по терминальным символам (пробелы, знаки  операций, символы комментариев, знаки пунктуации – точка, точка с запятой и т.п.); появление в цепочке символов терминального символа обычно означает конец текущей (формируемой) лексемы;

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

Замечание. Важно помнить, что знаки операций, скобки, точка с запятой, двоеточие (они используются как разделители лексем) сами являются лексемами (терминальными символами), и подлежат обработке и запоминанию наравне с другими лексемами. При этом фигурная скобка начинает комментарий (поэтому ее нельзя просто запомнить или пропустить, а надо то, что с нее начинается, и до закрывающей скобки обработать как единую конструкцию – комментарий), а знак двоеточия является также и началом операции присваивания (поэтому надо в таблице кодов лексем различать две лексемы – двоеточие и символ присваивания - и при появлении двоеточия не сразу заносить в таблицу, а проверять, что за ним).