Кафедра    Организации вычислительных процессов и систем управления
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

                              ВОТКИНСКИЙ ФИЛИАЛ ИЖ Г Т У

Кафедра    Организации вычислительных процессов и систем управления

                                                         

                                                               К защите допустить “____”_________ 2003  г

                                                                   

Зав. кафедрой ___________

 

 

                         дипломный проект

 
Программно-методический комплекс для обучения процессу создания компиляторов


ТЕМА:                                                                                                                              

 

                                                                                                                                           

 

                                                                                                                                           

     

                                                                                                                                           

                                       РАСЧЕТНО - ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

 

 

 Выполнил студент группы Д – 1061       _________ А.И. Кузнецов

                                   

 Руководитель проекта ст. преподаватель _________

                    

  Консультант по     профессор, д.т.н. _________

  охране труда

 

  Консультант по эко-  доцент, к.т.н. _________

  номической части

 

  Председатель экс-     ст. преподаватель _________

  пертной комиссии

      

 

 

Воткинск 2003

 


Определения

 

 

В настоящем дипломном проекте применяются следующие термины с соответствующими определениями.

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

БНФ (Бэкуса нормальная форма) – грамматика, состоящая из конечного множества правил, определяющих в совокупности язык программирования.

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

Идентификатор – имя переменной, процедуры, функции, программы.

Инструкция – синтаксическая структура, содержащая ключевые, шумовые слова и конструкции. Бывают простые и структурированные. Простые инструкции не содержат в себе других вложенных инструкций (присваивание, GOTO). Структурированные инструкции могут содержать вложенные инструкции (IF <булево выражение> THEN <безусловный оператор> ELSE <оператор>).

Компилятор – системная программа, выполняющая преобразование программы, написанной на одном алгоритмическом языке, в программу на языке, близком к машинному, и в определенном смысле эквивалентную первой.

Лексема – единица программы, получающаяся в результате лексического анализа, например: for, i, 10, integer, + и т. п.

Лексический анализ – выделение в исходной программе элементарных составляющих: идентификаторов, ограничителей, символов операторов, чисел, ключевых слов, шумовых слов, пробелов, комментариев и т. п.

Литера – любой символ, множество литер составляют лексему.

Литерал – численное или строковое значение, заданное один раз, и не изменяемое в течение программы.

Метод операторного предшествования – восходящий метод грамматического разбора, основан на анализе пар последовательно расположенных операторов исходной программы и решении вопроса о том, какой из них должен выполняться первым.

Нетерминальный символ – имя конструкции, определенной внутри грамматики.

Рекурсивный спуск – нисходящий метод грамматического разбора, основан на том, что для каждого нетерминального символа, определенного в грамматике, существует отдельная процедура обработки. При этом в процессе своей работы она может вызывать подобные процедуры

Семантика языка программирования - это смысл, который закладывается в каждую конструкцию языка.

Семантический анализ - это проверка смысловой правильности конструкции. Например, если мы в выражении используем переменную, то она должна быть определена ранее по тексту программы, а из этого определения может быть получен ее тип. Исходя из типа переменной, можно говорит о допустимости операции с данной переменной.

Семантический анализ – в нем обрабатываются структуры, распознанные синтаксическим анализатором, и начинает обретать очертания выполняемый код.

Символьное имя – одно из имен, разрешенных в языке, не являющееся терминальным символом.

Синтаксис языка программирования - это правила составления предложений языка из отдельных слов. Такими предложениями являются операции, операторы, определения функций и переменных. Особенностью синтаксиса является принцип вложенности (рекурсивность) правил построения предложений. Это значит, что элемент синтаксиса языка в своем определении прямо или косвенно в одной из его частей содержит сам себя. Например, в определении оператора цикла телом цикла является оператор, частным случаем которого является все тот же оператор цикла.

Синтаксический анализ (грамматический разбор) – формирует синтаксическую единицу – выражение, инструкцию, вызов подпрограммы, декларацию, которые далее обрабатываются семантическим анализатором. Пример структуры: FOR <выражение> TO int DO <body>.

Синтаксический разбор – процесс получения дерева синтаксического разбора на основе заданной грамматики.

Сканер (лексический анализатор) – программа распознавания лексем.

Спецификатор – порядковый номер в таблице, куда занесена лексема.

Терминальный символ – конечный неделимый элемент конструкции языка, является зарезервированным словом (например READ, (, +).

Транслятор – это системная программа, выполняющая преобразование программы, написанной на одном алгоритмическом языке, в программу на другом алгоритмическом языке в определенном смысле эквивалентную первой.

 


Содержание

 

 

Введение................................................................................................... 19

1 Анализ предметной области................................................................ 20

1.1 Компиляторы........................................................................... 20

1.2 Логическая структура компилятора..................................... 21

1.3 Лексический анализ. Сканер..................................................... 24

1.4 Синтаксический и семантический анализ.............................. 28

1.5 Грамматики............................................................................. 31

1.6 Формирование промежуточного кода................................... 34

Метод четверок..................................................................... 36

1.7 Обоснование создания учебного комплекса............................. 37

1.8 Обзор существующих разработок.......................................... 38

1.9 Обоснование разработки........................................................ 39

2 Создание учебной разработки............................................................. 42

2.1 Краткое описание учебного компилятора............................. 42

2.2 Описание учебного языка......................................................... 43

2.3 Лексический анализатор LEXAN............................................. 46

2.3.1 Таблица терминальных символов.............................. 47

2.3.2 Таблица символических имен..................................... 48

2.3.3 Таблица литералов...................................................... 49

2.3.4 Работа сканера............................................................. 50

2.3.5 Структура листинга..................................................... 50

2.3.6 Структура выходного файла...................................... 50

2.3.7 Примерное задание для студента............................... 52

2.3.8 Описание работы лексического анализатора............. 53

2.4 Синтаксический анализатор SinAn........................................ 56

2.4.1 Таблица переходов...................................................... 56

2.4.2 Правила работы с таблицей переходов...................... 60

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

2.4.4 Формируемая таблица переходов. Правила заполнения 65

2.4.5 Правила заполнения формируемой таблицы переходов 66

2.4.6 Построение деревьев................................................... 81

2.4.7 Семантический анализ................................................. 83

2.5 Формирование промежуточного кода................................... 85

Циклы.................................................................................... 85

3 Определение трудоемкости по стадиям разработки........................... 89

3.1 Методика расчета.................................................................. 89

3.2 Определение затрат на выполнение проекта по стадиям разработки........................................................................................................ 92

3.3 Расчет затрат на выполнение проекта по этапам.............. 94

4 Рекомендации по охране труда при работе с учебным комплексом. 95

Заключение.............................................................................................. 97

Список использованных источников...................................................... 98

Приложения............................................................................................. 99


Введение

 

 

Каждый преподаватель вправе преподносить материал и обучать студентов по любой из дисциплин так, как он считает нужным.

Преподаватель желает, чтобы знания по преподаваемым наукам лучше усваивались студентами. Часто материал не усваивается из-за того, что нет его наглядного представления, нет материалов, будь то программных или выполненных в виде плакатов, стендов, способствующих более глубокому пониманию.

Для того чтобы создать демонстрационный вспомогательный материал следует наработать необходимую базу. Что занимает много времени и требует определенных усилий и больших временных затрат. В результате могут быть получены плакаты, методические пособия, программные средства (тестовые, обучающие) и др. Некоторые из них можно применять и в отсутствии преподавателя для самообучения, для контроля знаний и т. п.

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

 






Анализ предметной области

 

 

Компиляторы

 

 

Транслятор - это программа, которая переводит исходную программу в эквивалентную ей объектную программу. Если объектный язык представляет собой автокод или некоторый машинный язык, то транслятор называется компилятором.

Автокод очень близок к машинному языку; большинство команд автокода - точное символическое представление команд машины.

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

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

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



Лексический анализ. Сканер

 

 

Лексический анализатор представляет собой модуль разбора текста программы. Разбор происходит в зависимости от имеющихся у него в памяти терминальных символов и правилами определения типов данных. Каждый язык имеет свои ограничения по типам данных, допущения и особенности создания (строения) конструкций, применению операторов и т.п. При работе сканера используются три таблицы: таблица терминальных символов, таблица символических имен и таблица литералов – это заполняемые таблицы. Таблица терминальных символов хранит все ключевые слова и специальные символы используемые в языке, а также коды, соответствующие каждому символу. Таблица символических имен заполняется в процессе разбора текста программы и хранит в себе имена идентификаторов (символических имен). Таблица литералов также заполняется в процессе разбора программы и хранит в себе литералы: численные и строковые значения, с указанием типов данных и относительных адресов.

Распределение по таблицам происходит следующим образом.

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

Выходной код, сформированный сканером, передается на следующую стадию обработки – синтаксический анализ.

Таким образом, алгоритм работы простейшего сканера можно описать так:

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

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

· при успешном распознавании информация о выделенной лексеме заносится в таблицу лексем, и алгоритм возвращается к первому этапу;

· при неуспешном распознавании выдается сообщение об ошибке, а дальнейшие действия зависят от реализации сканера - либо его выполнение прекращается, либо делается попытка распознать следующую лексему (идет возврат к первому этапу алгоритма).

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

Таблица терминальных символов в простейшем случае может иметь следующий вид как показано в таблице 1.

 

Таблица 1 – Таблица терминальных символов

№ п.п. Терминальный символ Комментарий (обозначение)
1 PROGRAM Заголовок программы
2 VAR Описание переменных
3 BEGIN Начало тела программы
4 END Конец тела программы
5 INTEGER Целый тип данных
6 FOR Счетный оператор цикла (для)
7 TO Ключевое слово счетного оператора цикла (до)
8 DO Ключевое слово (выполнить)

Продолжение таблицы 1

№ п.п. Терминальный символ Комментарий (обозначение)
9 WHILE Оператор цикла с предусловием (пока)
10 DIV Деление целочисленное
11 MOD Остаток от целочисленного деления
12 AND Логическое И
13 OR Логическое ИЛИ
14 := Присвоить значение

 

Сначала заполняется таблица лексем (терминальных символов), затем начинается считывание и обработка входного текста программы пользователя. При работе сканера происходит заполнение таблиц символических имен и литералов.

Данные таблицы могут выглядеть следующим образом:

 

Таблица 2 – Таблица символических имен

№ п.п. Идентификатор Тип Размер, занимаемый в памяти, байт Относительный адрес в памяти
1 I INTEGER    
2 Y REAL    
3 X1 REAL    
       

 

Таблица 3 – Таблица литералов

№ п.п. Литерал Тип Размер, занимаемый в памяти, байт Относительный адрес в памяти
1 1 INTEGER 2 0
2 100 INTEGER 2 2
       

 

Результатом работы сканера является последовательность кодов лексем. Каждый код лексемы обычно представляется кодом таблицы и спецификатором (порядковый номер в таблице, куда занесена лексема). Это позволяет избежать дополнительного поиска по таблицам на следующих этапах трансляции. Например в результате обработки сканером следующего предложения языка Паскаль

FOR I:=1 TO 100 DO Y:=X1

будет получена строка:

<1,06><2,1><1,14><3,1><1,07><3,2><1,08><2,2><1,14><2,3>,

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

 

Таблица 4 – Таблица выходных символов

№ п.п. 1 2 3 4 5 6 7 8 9 10
Таблица 1 2 1 3 1 3 1 2 1 2
Строка 6 1 14 1 7 2 8 2 14 3

 

Функционально в сканере могут быть выделены следующие модули[4]:

1) выделение из входной строки очередного слова;

2) поиск в таблицах лексем и определение кода лексемы;

3) формирование и вывод выходной строки.

Для модуля выделения слова важна информация о том, какие символы могут быть признаками начала или конца слова. Например, в языке Паскаль ключевые слова отделяются от других элементов предложения пробелами. Сложнее обстоит дело с выделением идентификаторов и чисел, поскольку разделителем для них может служить любой другой символ, не входящий по определению в идентификатор или число.

При заполнении таблиц выполняется проверка на наличие в ней элемента, совпадающего с выделенным идентификатором или константой, и при совпадении занесение в таблицу не выполняется.

В задачи последнего модуля входит занесение в выходную строку кодов лексем.

В дополнение к своей основной функции, распознаванию лексем, сканер обычно также выполняет чтение строк исход­ной программы и, возможно, печать листинга исходной про­граммы. Комментарии игнорируются сканером, за исключением того случая, когда они должны быть напечатаны и, таким об­разом, эффективно удаляются из исходной программы до на­чала процесса грамматического разбора.

Следующей стадией анализа является синтаксический разбор.

Лексический и синтаксический анализаторы взаимодействуют между собой. Существует два основных способа взаимодействия:

1) реализуется на основе прямого лексического анализа. От синтаксического анализатора поступает запрос «дать лексему» и указывается тип лексемы;

2) непрямой лексический анализ. Синтаксический анализатор выдает запрос «дать лексему», тип лексемы не указывается. Нет решающего блока, считаем, что работает группа параллельных автоматов.

 


Грамматики

 

 

Грамматика языка программирования является формальным описанием его синтаксиса или формы, в которой записаны от­дельные предложения программы или вся программа. Грамматика не описывает семантику или значения различных предло­жений. Информация о семантике содержится в программах ге­нерации объектного кода. В качестве иллюстрации разницы между синтаксисом и семантикой рассмотрим два предложения:

I:=J+K

и

I:=X+Y

где Х и Y являются действительными переменными, a I, J, К — целыми переменными. Эти два предложения имеют оди­наковый синтаксис. Оба являются операторами присваивания, в которых присваиваемое значение определяется выражением, состоящим из двух имен переменных, разделенных оператором сложения. Однако семантика этих двух предложений совершен­но различна. Первое предложение говорит о том, что перемен­ные в выражении должны быть сложены с использованием целых арифметических операций, а результат сложения должен быть присвоен переменной I. Второе предложение задает сло­жение с плавающей точкой, результат которого должен быть преобразован в целое число перед присваиванием. Очевидно, эти два предложения будут скомпилированы в раз­личные последовательности машинных команд, хотя их грамматическое описание одинаково. Различия между ними про­явятся на этапе генерации объектного кода.

На рисунке 4 показаны БНФ грамматики, используемые в дипломном проекте. Подчеркнутые волнистой линией элементы могут опускаться (не использоваться).

 

1. <prog>      ::= PROGRAM <prog-name>VAR <dec-list> BEGIN <stmt-list> END.

2. <prog-name> ::= id  ;

3. <dec-list> ::= <dec> { ; <dec> }  ;

4. <dec>       ::= <id-list> : <type>

5. <type>      ::= INTEGER | REAL | STRING

6. <id-list>    ::= id { , id }

7. <stmt-list> ::= <stmt> { ; <stmt> }  ;

8. <stmt>   ::= <assign> | <for> | <read> | <write> | <while> | <repeat> | <if>

9. <assign>   ::= id := <exp>

10. <exp>       ::=  – <term> { + <term> | – <term> }

11. <term>      ::= <factor> { * <factor> | DIV <factor> | / <factor> }

12. <factor>   ::= id | int | real | <text-val> | (<exp>) 

13. <read>      ::= READ ( <id-list> )

14. <write>     ::= WRITE ( <value> { , <value>} )

15. <for>        ::= FOR <index-exp> DO <body>

16. <index-exp> ::= id := <exp> TO|DOWNTO <exp>

17. <body>     ::= <stmt> | BEGIN <stmt-list> END

18. <value>    ::= <id-list> | <text-val>

19. <text-val> ::= ′ <text> ′

20. <text>       ::= string

21. <if>          ::= IF <сравнение> THEN <body> ELSE <body>

22. <сравнение>::= <factor> <условие> <factor>

23. <условие> ::= > | < | = | >= | <= | <>

24. <while>    ::= WHILE <сравнение> DO <body>

25. <repeat>   ::= REPEAT <body> UNTIL <сравнение>

 

Рисунок 4 – Упрощенная грамматика языка Паскаль

Существует несколько различных форм записи грамматик, среди которых мы рассмотрим форму Бекуса—Наура (БНФ). БНФ не самое мощное из известных средств описания синтаксиса. Однако эта форма достаточно проста, широко используется и предоставляет достаточные для большинства приложений средства. На рис.4 изображена одна из возможных грамматик БНФ.

Грамматика БНФ состоит из множества правил вывода, каждое из которых определяет синтаксис некоторой конструкции языка программирования. Рассмотрим, например, правило 13 на рис. 4:

<read> ::= READ ( <id-list> )

Это определение синтаксиса предложения READ языка Паскаль, обозначенное в грамматике как <read>. Символ ::= можно читать как «является по определению». С левой стороны от этого символа находится определяемая конструкция языка (в нашем случае— <read>), а с правой—описание синтаксиса этой конструкции. Строки символов, заключенные в угловые скобки < и >, называются нетерминальными символами (т. е. являются именами конструкций, определенными внутри грамматики). То, что не заключено в угловые скобки, называется терминальными символами грамматики (лексемами). В этом правиле вывода нетерминальными символами являются <read> и <id—list>. Тер­минальными символами являются лексемы READ, (, ). Таким образом, это правило определяет, что конструкция <read> состоит из лексемы READ, за которой следует лексема (, за ней следует конструкция языка, называемая <id—list>, за ко­торой следует лексема ). Пробелы при описании грамматических правил не существенны и вставляются только для наглядности.

Для распознавания нетерминального символа <read> необ­ходимо чтобы было определение для нетерминального символа <id-list>. Это определение дается правилом 6 на рис. 4:

<id-list> ::= id { , id }

Эта нотация, означает, что конструкция, заключенная в фигурные скобки, может быть либо опущена, либо повторяться один или более число раз. Таким образом, правило 6 определяет нетерминаль­ный символ <id-list> как состоящий из единственной лексемы id или же из произвольного числа следующих друг за другом лексем id, разделенных запятой. В соответствии с этим новым определением процедура, соответствующая нетерминальному символу <id-list>, сначала ищет лексему id, а затем продолжает сканировать входной текст до тех пор, пока следующая пара лексем не совпадет с запятой и id. Такая запись устраняет проблему левой рекурсии.

 

Метод четверок

 

 

Каждая четверка записывается в виде:

Обоснование разработки

 

 

Разработка является учебным комплексом, включающим в себя лабораторные работы по изучению процесса компиляции. Это программа, позволяющая без руководителя выполнять и проверять выданные задания (проверять выполненные задания). Теоретический материал для проведения лабораторной работы сформирован в методической (описательной) части.

Особенность данной разработки в том, что спроектированный компилятор построен поэтапно (модульно). Результат работы каждого из этапов может быть зафиксирован (сохранен) в виде файла с определенной структурой. Это файл с промежуточным кодом, получаемый от сканера, файл с формируемой таблицей переходов (хранит структуру дерева), файл с промежуточным кодом (тетрады), ассемблерный код. На каждом из этапов имеется возможность генерации файла отчета со структурами, с описанием и указанием ошибок, а также дополнительной служебной информацией.

Данный комплекс служит для ознакомления с принципами компиляции, получения практических навыков лексического анализа и грамматического разбора (синтаксический анализ), формирования промежуточного кода. Комплекс построен таким образом, чтобы по возможности охватить все этапы компиляции, наглядно представляя формируемые таблицы.

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

Учебное пособие состоит из:

- вводной части (теоретические сведения):

1) описание компиляторов, их суть, назначение;

2) лексический анализатор (сканер);

3) синтаксический анализатор, дерево грамматического разбора;

4) получение промежуточного кода;

- практической (работа с программами):

1) обзор компиляторов (Паскаль, C, Delphi);

2) работа с программой LexAn;

3) работа с программой SinAn;

4) работа с программой SinAn;

- проверка полученных знаний с помощью контрольных вопросов и заданий.

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

Учебный комплекс включает в себя несколько взаимосвязанных лабораторных работ, охватывающих всю предметную область или основную ее часть, например обучение процессу компиляции. При этом при выполнении каждой лабораторной работы происходит поэтапное изучение предметной области.

Лабораторные работы обычно включает в себя:

- теоретические сведения;

- порядок выполнения работы;

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

Теоретические сведения дают представление об изучаемой области, ознакомление с ее основными принципами, структурами и характерными особенностями. При этом часто производится разбор какого-либо наглядного примера.

Для проведения лабораторных работ могут использоваться различные технические средства. Это могут быть различного рода стенды, имитирующие работу реальных устройств, сами устройства, выступающие в роли исследуемого объекта, компьютер, с набором необходимых для работы программ, а также другие устройства и оборудование, подходящие для этой цели.

Использование в лабораторных работах оборудования позволяет получать дополнительные практические навыки, когда студент может влиять на работу исследуемого объекта, изменяя различные входные и управляющие параметры. При этом учащийся лучше понимает всю картину происходящего, исследуемые процессы.

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

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

 



Создание учебной разработки

 

 

Описание учебного языка

 

 

Учебный язык построен на основе языка Паскаль.

Алфавит учебном языка включает буквы, цифры, специальные символы и зарегистрированные слова.

Буквы – это буквы латинского алфавита от а до я, от А до Я, от a до z и от A до Z. В данном языке нет различия между прописными и строчными буквами алфавита, если только они не входят в символьные и строковые выражения.

Цифры – арабские цифры от 0 до 9.

Специальные знаки учебного языка – это символы:

+  -  *  / = , . : ; < > { } [ ] ( )

К специальным знакам также относятся следующие пары символов:

<> <= >= :=

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

Особое место в алфавите языка занимают пробелы. Эти символы рассматриваются как ограничители идентификаторов, констант, чисел, зарезервированных слов. Несколько следующих друг за другом пробелов считаются одним пробелом.

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

and

begin

div

do

downto

else

end

for

function

if

integer

procedure

program

real

repeat

string

then

to

until

var

while

write

read

 

Их можно изменять при построении компилятора в соответствующей программной среде LEXAN.

Идентификаторы – имена переменных, процедур, функций, программ. Длина идентификатора ограничена 255 символами. Идентификатор всегда начинается буквой или знаком подчеркивания, за которым могут следовать буквы, цифры и знак подчеркивания. Пробелы и специальные символы не могут входить в идентификатор.

Константы.

Последовательность, состоящая из одной или более цифр 0, 1, … , 9, является целой (INTEGER) константой. Данный тип занимает в памяти 2 байта. Последовательность цифр, разделенных точкой, является вещественной (REAL) константой, данный тип занимает в памяти 4 байта. Последовательность любых символов (кроме знака одинарных кавычек), заключенных в одинарные кавычки, является строковой (STRING) константой, длина данного типа варьируется от 1 до 255 байт, в зависимости от числа символов в последовательности.

Выражения.

Операции в выражении выполняются слева направо; как обычно, учитывается наличие скобок и приоритеты операторов. Приоритеты операторов приведены в таблице 5 (оператор в первой строке имеет наивысший приоритет):

 

Таблица 5 – Таблица приоритетов

– (унарный)
* / div
+ – (бинарный)
=  <> < > <= >=

 

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

Возможные для использования символы:

буквы: а..я, А..Я, a..z, A..Z;

символ, разрешенный при написании имен: _

элементы разделения: , ; : пробел       

разделитель целой и дробной частей в вещественных числах: .

выделение текста: ′

знаки операторов: + - * /

комментарии:  { }

расстановка приоритетов: ( )        

знаки сравнения: > < = >= <= <>

признак окончания программы: .



Таблица терминальных символов

 

 

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

 

Таблица 6 – Таблица выбранных терминальных символов

№ стр. Терминальный символ Комментарий Код
1 PROGRAM Объявление переменных 1

 

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

№ стр – номер строки в таблице выбранных терминальных символов;

Терминальный символ – название терминального символа;

Комментарий – описание терминального символа;

Код – код терминального символа, определенный в таблице терминальных символов.

Данная таблица формируется из таблицы терминальных символов, определенной внутри программы (описана в приложении А) путем выбора необходимых терминальных символов в соответствующем окне программы. Она служит (необходима) для проверки, является ли полученная лексема терминальным символом или идентификатором, т.е. производится сравнение со всеми терминальными символами таблицы. Если лексема найдена в таблице, то в таблицу выходных кодов лексем заносится номер таблицы (в программе №1) и код терминального символа.

Некоторые терминальные символы можно изменять – это ключевые слова. Изменение возможно в момент заполнения таблицы выбранных терминальных символов.

 

Таблица символических имен

 

 

Для хранения значений идентификаторов служит таблица символических имен, пример которой приведен в таблице 7.

 

Таблица 7 – Таблица символических имен

Специф Идентификатор Тип Размер в памяти Относительный адрес в памяти
1 а      

 

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

Специф – спецификатор (номер строки) определяет положение идентификатора в таблице;

Идентификатор – имя идентификатора, найденного в тексте программы;

Тип – тип распознанного идентификатора (заполняется в программе LEXAN), поле остается не заполненным;

Размер в памяти – размер идентификатора, занимаемый в памяти, определяется в зависимости от типа (заполняется в программе LEXAN), поле остается не заполненным;

Относительный адрес в памяти – адрес относительно начала объявления переменных, формируется в зависимости от размера памяти предыдущих идентификаторов (заполняется в программе LEXAN), поле остается не заполненным.

Таблица служит для хранения идентификаторов, найденных в тексте программы. После внесения идентификатора или обнаружения уже имеющегося в таблице, в таблицу выходных кодов лексем заносится номер таблицы (№2) и спецификатор найденного элемента.

 

Таблица литералов

 

 

Для хранения значений констант используется таблица литералов, пример ее заполнения показан в таблице 8.

 

Таблица 8 – Таблица литералов

Специф Литерал Тип Размер в памяти
1 10 INTEGER 2

 

Таблица содержит следующие поля:

Специф – спецификатор, определяет положение идентификатора в таблице;

Литерал – значение литерала, найденного в тексте программы;

Тип – тип распознанного литерала;

Размер в памяти – размер литерала, занимаемый в памяти, определяется в зависимости от типа;

Относительный адрес в памяти – адрес относительно начала объявления переменных, формируется в зависимости от размера памяти занимаемой литералами и идентификаторами.

Таблица служит для хранения литералов, найденных в тексте программы. После внесения литерала в таблицу, в таблицу выходных кодов лексем заносится номер таблицы (№3) и спецификатор найденного элемента.

 

Работа сканера

 

 

Работа сканера LEXAN происходит следующим образом. Студент в соответствующее поле пишет (или загружает из файла через меню) текст программы. Далее выбираются терминальные символы, необходимые для разбора текста программы и на основе правил разбора заполняются таблицы символических имен, литералов и выходных кодов лексем. После этого производится проверка правильности заполнения. При этом программа производит анализ текста и заполняет свои внутренние соответствующие таблицы и сравнивает с данными, полученными от студента и, при наличии ошибки, генерирует сообщения в поле сообщений. При необходимости можно получить листинг. Также можно сохранить результаты в файл для передачи данных на следующий этап – синтаксический анализ.

 

2.3.5 Структура листинга

 

 

Листинг включает в себя текст программы, все таблицы с заполненными студентом данными и все сообщения об ошибках.

 

Структура выходного файла

 

 

Выходной файл хранит в себе все 4 таблицы, построчно храня каждую ячейку. Это позволяет не ограничивать длину идентификаторов и ключевых слов. Вначале файла также построчно указываются размеры таблиц, сначала выбранных терминальных символов (число столбцов, число строк), затем символических имен, литералов и, наконец, выходных кодов лексем (только число столбцов). Структура промежуточного файла показана в таблице 9.

 

Таблица 9 – Пример промежуточного файла

№ строки Содержи-мое Описание содержимого
1 5 4 столбца + 1 (четвертый) зарезервирован
2 7 1 строка – заголовок таблицы, последующие 6 – строки с данными
3 5 5 столбцов
4 4 1 строка – заголовок таблицы, последующие 3 – строки с данными
5 5 5 столбцов
6 3 1 строка – заголовок таблицы, последующие 2 – строки с данными
7 16 1 столбец – описания, остальные 15 – с данными (в таблице три строки)
8  

данные из таблицы 1 по ячейкам, следуют слева направо (построчно), сверху вниз.

 
7+5*7=42  
43  

данные из таблицы 2 по ячейкам, следуют слева направо (построчно), сверху вниз.

 
42+5*4=62  
63  

данные из таблицы 3 по ячейкам, следуют слева направо (построчно), сверху вниз.

 
62+5*3=77  
78  

данные из таблицы 4 по ячейкам, следуют сверху вниз (по столбцам), слева направо.

 
77+16*3=125  

 

В качестве примера приводится пример разбора задания, описанного в приложении А.

 

2.3.7 Примерное задание для студента

 

 

Дана некоторая грамматика языка:

1. <prog>       ::= PROGRAM <prog-name> VAR <dec-list> BEGIN <stmt-list> END.

2. <prog-name> ::= id

3. <dec-list>   ::= <dec> | <dec-list> ; <dec>

4. <dec>         ::= <id-list> : <type>

5. <type>       ::= INTEGER

6. <id-list>     ::= id | <id-list> , id

7. <stmt-list> ::= <stmt> | <stmt-list> ; <stmt>

8. <stmt>       ::= <assign> | <for>

9. <assign>              ::= id := <exp>

10. <exp>             ::= <term> | <exp> + <term> | <exp> - <term>

11. <term>            ::= id | int | ( <exp> )

12. <for>     ::= FOR <index-exp> DO <body>

13. <index-exp>   ::= id := <exp> TO <exp>

14. <body>           ::= <stmt> | BEGIN <begin-list> END

 

Используя программу LEXAN произвести следующие действия:

1. Заполнить таблицу терминальных символов (таблица 1);

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

3. Заполнить таблицы: – символьных имен (таблица 2);

– литералов (таблица 3);

– лексического анализа (выходных символов);

4. Проверить правильность заполнения таблиц встроенным анализатором;

5. При наличии ошибок исправить имеющиеся, и повторно обработать программой LEXAN;

6. Получить листинг полученных результатов;

7. Сохранить результат в файл.

 

Пример выполнения приведен в приложении А.

 

Таблица переходов

 

 

Существует два пути анализа: восходящий и нисходящий, данный проект реализован с помощью нисходящего, он называется рекурсивный спуск. В проекте грамматический разбор реализован с помощью правил БНФ грамматики, заданных в таблице переходов.

В таблице переходов с помощью специальных кодов реализованы ссылки, переходы, обозначения терминальных символов, идентификаторов и литералов, см. таблицу 10. Нетерминальные символы представляют собой ссылки на конструкции, терминальные – указатели на код элемента соответствующей таблицы, идентификаторы и литералы представляют собой соответствующие обозначения. Для решения проблемы выбора одного из нескольких вариантов введен элемент ИЛИ, позволяющий реализовать все возможные варианты ветвления. Для реализации стека в каждой строке предусмотрена ячейка возврата, в которой указывается адрес, куда следует перейти после отработки соответствующей конструкции.

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

Таблица переходов полностью основана на БНФ грамматике, показанной на рис. 4. Эта таблица предназначена для реализации синтаксического разбора с помощью метода рекурсивного спуска. С помощью нее можно определить законченность выражений, отследить грамматику учебного языка. Она служит основной базой при написании программы, хотя ее можно использовать и для построения формируемой таблицы переходов вручную.

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

Работа с данной таблицей не оптимальна по скорости, т.к. при работе не используется стек, зато данное представление более наглядно.

 

Таблица 10 – Таблица переходов

    1 2 3 4 5 6 7 8 9
1 <prog>   PROGRAM| 1,4 $1           |@1,4 <prog-name> ~2 VAR| 1,6 $2 | @1,6 <dec-list> ~3 BEGIN $3 <stmt-list> ~7 END $4 . $30
2 <prog-name>     +id ; $27            
3 <dec-list>   <dec> ~4 ; $27 <dec>| ~4 | @3,1 ; $27   @3,4      
4 <dec>   <id-list> ~6 : $31 <type> ~5          
5 <type>   INTEGER| REAL | STRING   $5 | $6 | $7              
6 <+id-list>     +id , | $29| @6,1   +id   @6,3        
7 <stmt-list>   <stmt> | ~8 | @7,1 ; | $27| @7,1   @7,2            
8 <stmt>  

<assign>|<for>|<read>|<write>|<for>|<while>|<repeat>| <if>  

~9 | ~15 | ~13 | ~14 | ~15 | ~24 | ~25 | ~21 

       
9 <assign>     +id := $28 <exp> ~10          
10 <exp>   - | + | $33 | $32 | @10,3 <term> ~11 + | - | $32| $33| @10,1 <term> ~11   @10,4      
11 <term>   <factor> ~12 * | DIV | / | $34| $17 | $37|11,1 <factor> ~12   11,3        
12 <factor>                            +id | ^int | ^real | ^string |@12,4   ( $35| @12,1 <exp> ~10 ) $36      
13 <read>   READ $19 ( $35 <id-list> ~6 ) $36        
14 <write>   WRITE $18 ( $35 <VALUE> ~18 , | 14,9 $29| @14,9 <VALUE> ~18   @14,5   ) $36
15 <for>   FOR $8 <index-exp> ~16 DO $10 <body> ~17        
16 <index-exp>     +id := $28 <exp> ~10 TO|DOWNTO  $9 | $20 <exp> ~10      
17 <body>   <stmt>| 17,4 ~8 | @17,4   BEGIN $3 <stmt-list> END $4 ; | $27| @17,1    
18 <value>   <id-list>| <text-val> ~6   | ~19              

Продолжение таблицы 10

19 <text-val>   ′ $38 <text> ~20 ′ $38          
20 <text>     ^string              
21 <if>   IF $14 <сравнение> ~22 THEN $15 <body> ~17 ELSE | $16 | @21,1 <body> ~17    
22 <сравнение>   <factor> ~12 <условие> ~23 <factor> ~12          
23 <условие>   < | > | = | >= | <=| <> $39|$40|$41|$42|$43|$44              
24 <while>   WHILE ~13 <сравнение> ~22 DO $10 <body> ~17        
25 <repeat>   REPEAT $11 <body> ~17 UNTIL $12 <сравнение> ~22        

Построение деревьев

 

 

Для наглядного отображения полученных грамматик используют синтаксические деревья, пример показан на рисунке 3.

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

Деревья могут быть представлены в вертикально как показано на рисунке 5, а и горизонтально – рисунок 5, б.

Рассмотрим выражение: a := c – (1 + b)

 


а)

                                                                                                  б)

 

Рисунок 5 – а) вертикальное дерево, б) горизонтальное дерево

 

Рисунок 6 – Горизонтальное синтаксическое дерево


На рисунке 6 показано горизонтальное синтаксическое дерево, построенное по следующей программе:

PROGRAM prog1;

VAR a,b:INTEGER;

s:STRING;

BEGIN

b:=78;

s:='Дерево';

WRITE(s);

a:=b*(2+a);

END.

 




Семантический анализ

 

 

Функции семантического анализатора:

1) ведение табличных символов;

2) включение неявной информации (по умолчанию);

3) обнаружение ошибок;

4) макрообработка и операции, выполняемые во время компиляции.

После проведения синтаксического анализа формируется дерево грамматического разбора, представленное в виде таблицы. По этому дереву на этапе семантического анализа производится новый смотр.

Одно из предназначений семантического анализатора – поиск ошибок. Существуют следующие критерии поиска ошибок:

1) не должно быть повторного описания идентификатора;

2) все идентификаторы, используемые в программе, должны быть описаны;

3) запрещается присвоение значению переменной одного типа значение другого типа (возможно только присвоение вещественному типу целого значения);

4) результат деления “ / “ всегда вещественное число;

5) перед использованием переменной (идентификатора) ей должно быть присвоено значение (данная ошибка не относится к критическим).

6) в цикле FOR, структуре <index-exp>, идентификатор должен быть целого типа, как и оба значения возвращаемые структурой <exp>.

 

Пример неправильно написанных элементов программы.

VAR

A,B,C:INTEGER;

C,D:REAL                   – повторное описание переменной C

BEGIN

A:=3.5;                         – присвоение переменной целого типа вещественного значения

B:=A/2;                        – присвоение переменной целого типа вещественного значения, образующегося при делении

D:=F*5;                        – не описана переменная F

FOR A:=1 TO D DO C:=C+A – переменная D вещественного типа

END.

 

 



Циклы

 

 

При адресации используются следующие команды.

C $BR – безусловный переход на позицию (индекс) в массиве, содержащем тетрады.

L $BRL – безусловный переход на метку

L - имя в таблице символов. Значение его - адрес перехода. Основная проблема при реализации этого оператора – определение адреса перехода.

<операнд1> <операнд2> BRZ|$BRM|$BRP|$BRMZ|$BRPZ

<операнд1> - значение арифметического выражения,

<операнд2> - номер или место позиции (адрес).

$BRZ - переход по значению 0,

$BRM - переход по значению <0,

$BRP - переход по значению >0,

$BRMZ - переход по значению <=0,

$BRPZ - переход по значению >=0.

Реализация циклов не вызывает сложностей. Имея оператор безусловного перехода и условный оператор, можно сконструировать цикл "вручную". Например, цикл вида

FOR I=N1 TO N2 DO operator

может быть сконструирован на исходном языке:

I := N1;

L1: IF I>N2 THEN GOTO L2;

operator;

I:=I+1;

GOTO L1;

L2:

Представление конструкции FOR I=N1 TO N2 DO operator в виде тетрад показано в таблице 15.

 

Таблица 15 – конструкция for в виде тетрад

Выражения

Тетрады (четверки)

I:=N1 := N1   I
L1        
IF I>N2 THEN GOTO L2 (IF N2-I<0 THEN GOTO L2) – $BRM N2 L2 I T1 T1  
operator

operator

I:=I+1 + I 1 I
GOTO L1 $BR L1    
L2        
         

 

Далее рассмотрены циклы WHILE, REPEAT, а также конструкция IF…THEN…ELSE.

В таблице 16 разобрана конструкция WHILE a<b DO operator.

 


Таблица 16 – Конструкция while

Выражения

Тетрады (четверки)

L1        
IF a-b>0 THEN GOTO L2 – $BRP a L2 b T1 T1
operator

operator

GOTO L1 $BR L1    
L2        

 

В таблице 17 разобрана конструкция REPEAT operator UNTIL a<b

 

Таблица 17 – Конструкция repeat

Выражения

Тетрады (четверки)

L1        
operator

operator

IF a-b<0 THEN GOTO L1 – $BRM a L1 b T1 T1  

 

В таблице 18 разобрана конструкция IF a>b THEN operator1 ELSE operator2.

 

Таблица 18 – Конструкция if

Выражения

Тетрады (четверки)

L1        
IF a-b<0 THEN GOTO L2 – $BRM a L2 b T1 T1
operator1

operator1

GOTO L3 $BR L1    
L2        
operator2

operator2

L3        

 



ЭКОНОМИЧЕСКАЯ ЧАСТЬ

 

В данном разделе дипломного проекта рассмотрены следующие вопросы:

1. Определена трудоемкость анализа предметной области создания компилятора.

2. Определены затраты на анализ предметной области создания компилятора.

3. Определена трудоемкость создания учебного комплекса.

4. Определены затраты на создание учебного комплекса.

5. Определена трудоемкость разработки программного обеспечения для учебного комплекса.

6. Определены затраты на разработку программного обеспечения для учебного комплекса.

7. Определены суммарные затраты.

 

 



Методика расчета

 

 

Фактическое время, затраченное на анализ предметной области, включающий в себя анализ документов и связей, необходимых для создания компилятора, составило 105 человеко-часов.

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

Для расчета затрат времени на разработку программной части использованы типовые нормы времени [10]. Нормы времени охватывают следующие стадии разработки:

- техническое задание;

- эскизный проект;

- технический проект;

- внедрение.

Нормы времени рассчитываются в человеко-часах при продолжительности рабочего дня – 8 ч.

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

Для расчетов приняты:

- степень новизны разрабатываемого комплекса – Б. Так как нет аналогичных решений;

- сложность алгоритма – 2, так как включает создание отчетности, анализа и учета данных;

- трудоемкость разработки – ПИ, так как информация постоянно видоизменяется;

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

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

- количество разновидностей форм входной информации – 1;

- количество разновидностей форм выходной информации – 4.

Объем входной информации не превышает 50 тысяч документострок.

Нормы времени определены для комплекса задач подсистемы управления научно-технической информации.

По табл. 1.1 [10] получен поправочный коэффициент для определения трудоемкости работ на стадии «Технический проект». Принимаем К=1,2.

По табл. 1.2 [10] получен поправочный коэффициент для определения трудоемкости работ на стадии «Рабочий проект». Принимаем К=1,44.

В табл. 1.4 [10] выбран коэффициент, учитывающий сложность контроля входной и выходной информации. Получаемый коэффициент К=1,07.

По таблице 1.7 определен поправочный коэффициент для определения времени работы ЭВМ при отладке и внедрении программ комплексов задач, принят равным 1,19, с учетом того, что программа пишется на языке высокого уровня в программной среде Delphi5.

Общий поправочный коэффициент Коб выражен через произведение всех коэффициентов.

 

Коб=1,2·1,44·1,07·1,19= 2,20

 

Норма времени (Нвр) с учетом общего поправочного коэффициента определяется по следующей формуле

 

,       (1.1)

где Нврi – базисная норма времени, определенная по нормативной таблице, Коб – общий поправочный коэффициент.

    Основной расчет трудоемкости программной части:

Разработка технического задания. По табл. 4.1 [10] значение человеко-дней – 36 (норма б8), при значении поправочного коэффициента 0,35 затраты времени равны 36·0,35 = 12,6 человеко-дней.

Разработка эскизного проекта. По табл. 4.2 [10] значение человеко-дней – 101 (норма б8), при значении поправочного коэффициента 0,3 затраты времени равны 101·0,3 = 30,3 человеко-дней.

Разработка технического проекта. По табл. 4.18 [10] значение человеко-дней – 8 (норма в1), при значении поправочного коэффициента Коб=2,20 затраты времени равны 8·2,20 = 17,6 человеко-дней.

Разработка рабочего проекта. По табл. 4.44 [10] значение человеко-дней – 59 (норма в1), при значении поправочного коэффициента 2,20 затраты времени равны 59·2,20 = 129,8 человеко-дней.

Разработка на внедрение. По табл. 4.70 [10] значение человеко-дней – 13 (норма в1), при значении поправочного коэффициента 2,20 затраты времени будут равны 13·2,20 = 28,6 человеко-дней.

Общая норма времени на создание программной части составляет

 

12,6+30,3+17,6+129,8+28,6 = 218,9 человеко-дней.

 

При продолжительности рабочего дня 8 ч, затраты на выполнение программной части составили

 

218,9·8 =1751 ч.

 

В связи с тем, что разрабатываемый комплекс программ для учебных целей, программа, реализованная на данном этапе незначительна по объему и сложности, является некоммерческой, для определения трудоемкости принимаем коэффициент пересчета Кпер = 0,1.

Тогда: трудоемкость разработки программной части составит

 

1751·0,1 = 175 ч.

 

Расчет общей трудоемкости разработки проекта (Тоб) производится по формуле

 

,                                                                                             (1.2)

 

где t – трудоемкость работ по стадиям проектирования (от 1 до n).

Суммируем затраты, связанные с разработкой проекта.

105 + 152 + 175 = 432 ч.

 

Рекомендации по охране труда при работе с учебным комплексом

 

 

Учебный комплекс представляет собой несколько лабораторных работ, объединяющих практическую (программную) и методическую (описательную) части.

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

Необходим достаточный уровень освещенности для чтения с монитора и бумажного носителя. Чтобы не уставали глаза от различной яркости монитора и остального освещения, а также достаточной освещенности для удовлетворительной работы с бумажным носителем требуется наличие общего и местного освещения. Общая освещенность должна составлять 500лк (светильники потолочные люминесцентные типа ПУ-66-4х40), местного – 300 лк (настенный светильник типа БЛ-19-1х20Б) [11].

При работе с программой приходится работать с текстовой информацией, при этом, чтобы текст был читабельным следует установить разрешение экрана при 14” мониторе не выше 800х600, при15” не выше 960х720.

Необходимо соблюдать следующие параметры монитора:

- частота кадров монитора не должна быть ниже 75 Гц;

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

С эргономичной точки зрения необходимо следующее:

- удобный доступ к дисководу, CD-ROM;

- удобство работы с методической литературой;

- удобное положение (по высоте) клавиатуры, либо стул, регулируемый по высоте.

Практические работы должны проводиться за компьютером на вычислительном центре, например аудитории 205. Общее освещение данной аудитории достаточно для проведения лекций, но не для работы за компьютером и чтением литературы. Поэтому требуется использование дополнительного местного освещения.

Для работы с литературой, например, методического пособия, требуется дополнительное пространство на рабочем столе. Его можно освободить, убрав со стола системный блок в стол и применив специальную конструкцию стола, показанную на рисунке 7. Стул должен быть вращающимся для удобства маневрирования, а также с регулировкой по высоте, чтобы обеспечить оптимальные условия при работе с клавиатурой и монитором.

Примерное рабочее место студента показано на рисунке 7.

 

 


Рисунок 7 – Рабочее место студента

1 – монитор, 2 – системный блок, 3 – клавиатура, 4 – стул, 5 – методический материал, 6 – стол.

 

 




Заключение

 

 

Результатом проделанной работы явилось создание учебного комплекса состоящего из двух программ LEXAN и SINAN, соответственно программа лексического и грамматического разбора. При этом была разработана общая схема компилятора с описанием структур и их взаимодействия.

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

Разработка включает в себя первые два из четырех этапов учебного комплекса по созданию компилятора. Разработанная структура позволяет реализовать последующие этапы, т.к. определены последующие направления и описаны способы взаимодействия между этапами. На следующих этапах должны формироваться промежуточный и ассемблерный коды.

Данный проект позволит разобраться студентам с методами анализа программы и на практике проверить знания, полученные при изучении предмета «Системное программное обеспечение». Также является основой для дальнейшей разработки учебного комплекса.

Был выполнен экономический расчет, в результате которого были подсчитаны общие затраты на выполнение дипломного проекта, они составили 7000 рублей.

 

 



МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

                              ВОТКИНСКИЙ ФИЛИАЛ ИЖ Г Т У

Кафедра    Организации вычислительных процессов и систем управления

                                                         

                                                               К защите допустить “____”_________ 2003  г

                                                                   

Зав. кафедрой ___________

 

 

                         дипломный проект

 
Программно-методический комплекс для обучения процессу создания компиляторов


ТЕМА:                                                                                                                              

 

                                                                                                                                           

 

                                                                                                                                           

     

                                                                                                                                           

                                       РАСЧЕТНО - ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

 

 

 Выполнил студент группы Д – 1061       _________ А.И. Кузнецов

                                   

 Руководитель проекта ст. преподаватель _________

                    

  Консультант по     профессор, д.т.н. _________

  охране труда

 

  Консультант по эко-  доцент, к.т.н. _________

  номической части

 

  Председатель экс-     ст. преподаватель _________

  пертной комиссии

      

 

 

Воткинск 2003

 


Определения

 

 

В настоящем дипломном проекте применяются следующие термины с соответствующими определениями.

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

БНФ (Бэкуса нормальная форма) – грамматика, состоящая из конечного множества правил, определяющих в совокупности язык программирования.

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

Идентификатор – имя переменной, процедуры, функции, программы.

Инструкция – синтаксическая структура, содержащая ключевые, шумовые слова и конструкции. Бывают простые и структурированные. Простые инструкции не содержат в себе других вложенных инструкций (присваивание, GOTO). Структурированные инструкции могут содержать вложенные инструкции (IF <булево выражение> THEN <безусловный оператор> ELSE <оператор>).

Компилятор – системная программа, выполняющая преобразование программы, написанной на одном алгоритмическом языке, в программу на языке, близком к машинному, и в определенном смысле эквивалентную первой.

Лексема – единица программы, получающаяся в результате лексического анализа, например: for, i, 10, integer, + и т. п.

Лексический анализ – выделение в исходной программе элементарных составляющих: идентификаторов, ограничителей, символов операторов, чисел, ключевых слов, шумовых слов, пробелов, комментариев и т. п.

Литера – любой символ, множество литер составляют лексему.

Литерал – численное или строковое значение, заданное один раз, и не изменяемое в течение программы.

Метод операторного предшествования – восходящий метод грамматического разбора, основан на анализе пар последовательно расположенных операторов исходной программы и решении вопроса о том, какой из них должен выполняться первым.

Нетерминальный символ – имя конструкции, определенной внутри грамматики.

Рекурсивный спуск – нисходящий метод грамматического разбора, основан на том, что для каждого нетерминального символа, определенного в грамматике, существует отдельная процедура обработки. При этом в процессе своей работы она может вызывать подобные процедуры

Семантика языка программирования - это смысл, который закладывается в каждую конструкцию языка.

Семантический анализ - это проверка смысловой правильности конструкции. Например, если мы в выражении используем переменную, то она должна быть определена ранее по тексту программы, а из этого определения может быть получен ее тип. Исходя из типа переменной, можно говорит о допустимости операции с данной переменной.

Семантический анализ – в нем обрабатываются структуры, распознанные синтаксическим анализатором, и начинает обретать очертания выполняемый код.

Символьное имя – одно из имен, разрешенных в языке, не являющееся терминальным символом.

Синтаксис языка программирования - это правила составления предложений языка из отдельных слов. Такими предложениями являются операции, операторы, определения функций и переменных. Особенностью синтаксиса является принцип вложенности (рекурсивность) правил построения предложений. Это значит, что элемент синтаксиса языка в своем определении прямо или косвенно в одной из его частей содержит сам себя. Например, в определении оператора цикла телом цикла является оператор, частным случаем которого является все тот же оператор цикла.

Синтаксический анализ (грамматический разбор) – формирует синтаксическую единицу – выражение, инструкцию, вызов подпрограммы, декларацию, которые далее обрабатываются семантическим анализатором. Пример структуры: FOR <выражение> TO int DO <body>.

Синтаксический разбор – процесс получения дерева синтаксического разбора на основе заданной грамматики.

Сканер (лексический анализатор) – программа распознавания лексем.

Спецификатор – порядковый номер в таблице, куда занесена лексема.

Терминальный символ – конечный неделимый элемент конструкции языка, является зарезервированным словом (например READ, (, +).

Транслятор – это системная программа, выполняющая преобразование программы, написанной на одном алгоритмическом языке, в программу на другом алгоритмическом языке в определенном смысле эквивалентную первой.

 


Содержание

 

 

Введение................................................................................................... 19

1 Анализ предметной области................................................................ 20

1.1 Компиляторы........................................................................... 20

1.2 Логическая структура компилятора..................................... 21

1.3 Лексический анализ. Сканер..................................................... 24

1.4 Синтаксический и семантический анализ.............................. 28

1.5 Грамматики............................................................................. 31

1.6 Формирование промежуточного кода................................... 34

Метод четверок..................................................................... 36

1.7 Обоснование создания учебного комплекса............................. 37

1.8 Обзор существующих разработок.......................................... 38

1.9 Обоснование разработки........................................................ 39

2 Создание учебной разработки............................................................. 42

2.1 Краткое описание учебного компилятора............................. 42

2.2 Описание учебного языка......................................................... 43

2.3 Лексический анализатор LEXAN............................................. 46

2.3.1 Таблица терминальных символов.............................. 47

2.3.2 Таблица символических имен..................................... 48

2.3.3 Таблица литералов...................................................... 49

2.3.4 Работа сканера............................................................. 50

2.3.5 Структура листинга..................................................... 50

2.3.6 Структура выходного файла...................................... 50

2.3.7 Примерное задание для студента............................... 52

2.3.8 Описание работы лексического анализатора............. 53

2.4 Синтаксический анализатор SinAn........................................ 56

2.4.1 Таблица переходов...................................................... 56

2.4.2 Правила работы с таблицей переходов...................... 60

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

2.4.4 Формируемая таблица переходов. Правила заполнения 65

2.4.5 Правила заполнения формируемой таблицы переходов 66

2.4.6 Построение деревьев................................................... 81

2.4.7 Семантический анализ................................................. 83

2.5 Формирование промежуточного кода................................... 85

Циклы.................................................................................... 85

3 Определение трудоемкости по стадиям разработки........................... 89

3.1 Методика расчета.................................................................. 89

3.2 Определение затрат на выполнение проекта по стадиям разработки........................................................................................................ 92

3.3 Расчет затрат на выполнение проекта по этапам.............. 94

4 Рекомендации по охране труда при работе с учебным комплексом. 95

Заключение.............................................................................................. 97

Список использованных источников...................................................... 98

Приложения............................................................................................. 99


Введение

 

 

Каждый преподаватель вправе преподносить материал и обучать студентов по любой из дисциплин так, как он считает нужным.

Преподаватель желает, чтобы знания по преподаваемым наукам лучше усваивались студентами. Часто материал не усваивается из-за того, что нет его наглядного представления, нет материалов, будь то программных или выполненных в виде плакатов, стендов, способствующих более глубокому пониманию.

Для того чтобы создать демонстрационный вспомогательный материал следует наработать необходимую базу. Что занимает много времени и требует определенных усилий и больших временных затрат. В результате могут быть получены плакаты, методические пособия, программные средства (тестовые, обучающие) и др. Некоторые из них можно применять и в отсутствии преподавателя для самообучения, для контроля знаний и т. п.

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

 






Анализ предметной области

 

 

Компиляторы

 

 

Транслятор - это программа, которая переводит исходную программу в эквивалентную ей объектную программу. Если объектный язык представляет собой автокод или некоторый машинный язык, то транслятор называется компилятором.

Автокод очень близок к машинному языку; большинство команд автокода - точное символическое представление команд машины.

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

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

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





Дата: 2019-05-29, просмотров: 154.