- •Министерство образования
- •Исходная постановка задачи
- •1. Описание входного языка
- •2. Этап лексического анализа Определение типов лексем
- •Соотношения токенов и лексем.
- •Функции лексического анализатора
- •3. Описание синтаксического анализа
- •1) Главная подграмматика
- •2) Подграмматика if/for
- •3) Подграмматика объявлений
- •5. Тестирование дмп-процессора
Министерство образования
Российской Федерации
Санкт-Петербургский государственный
электротехнический университет
Кафедра МО ЭВМ
Пояснительная записка
к курсовой работе по дисциплине
«Теория языков программирования»
Вариант № 13
Группа: 4351
Факультет КТИ
Преподаватель: Самойленко В.П.
Санкт-Петербург
Задание на курсовую работу
В процессе выполнения курсовой работы необходимо разработать язык программирования, являющийся подмножеством заданного языка, и транслятор с этого языка в промежуточный язык, тип которого определяется вариантом индивидуального задания. Метод синтаксического анализа также определяется заданием.
Язык должен обеспечивать операции над переменными и константами заданных базовых типов, а также над переменными и компонентами производного типа, которые определяются вариантом задания. Перечень операций должен включать как предусмотренные базовым языком, так и операции, перечисленные в варианте задания. В языке должна быть определена операция преобразования типов при структурной или именной эквивалентности типов. В языке должна быть предусмотрена возможность создания пользовательских типов.
Язык должен допускать использование арифметических выражений, в состав которых могут входить константы и простые переменные базовых типов, компоненты структурированного типа, круглые скобки и знаки операций: сложения, вычитания, умножения, деления. Приоритет операций - обычный.
Язык должен допускать использование логических выражений, в состав которых могут входить отношения, круглые скобки и знаки логических операций: И, ИЛИ, НЕ и, в случае наличия в языке логического типа, константы и переменные этого типа. Приоритет операций обычный.
Операции над переменными структурированного типа определяются вариантом задания.
Состав операторов языка:
оператор присваивания;
оператор ввода;
оператор вывода;
оператор безусловного перехода;
составной оператор;
условный оператор, условие в котором задается логическим выражением;
оператор цикла, условие в котором задается логическим выражением.
Конкретный вид операторов определяется вариантом задания.
Программа на входном языке может содержать комментарии, вид которых предусмотрен базовым языком.
Исходная постановка задачи
Базовый язык– С++.
Базовые типы:целый, вещественный, перечислимый.
Структурированный тип:массив, указатель.
Операции над указателями:присваивание, разыменование, сравнение (на равенство и неравенство).
Оператор цикла– с параметром.
Перегрузка операций– разрешается.
Эквивалентность типов– структурная.
Класс грамматик– грамматики простого предшествования.
Промежуточный язык– польская инверсная запись.
1. Описание входного языка
1.1) Синтаксис входного языка.
<программа>::=void main() [<инструкция>]
<инструкция>::=<инструкция-выражение>|<составнаяинструкция>|
<инструкциявыбора>|<инструкцияитерации>|<инструкцияобъявления>|
cin >><идентификатор>|cout <<<инструкция-выражение>
<инструкция-выражение>::=<выражение>;
<составнаяинструкция>::={[<последовательностьинструкций>]}
<последовательностьинструкций>::=<инструкция>|<последовательностьинструкций> <инструкция>
<инструкциявыбора>::=if (<выражение>)<инструкция>[else<инструкция>]
<инструкцияитерации>::=for(<инструкцияобъявления>[<выражение>]; [<выражение>])
<инструкция>
<выражение>::=<условноевыражение>|<выражениелогическогоИЛИ>
<операторприсваивания><выражение>
<операторприсваивания>::== | *= | /= | += | -=
<условноевыражение>::=<выражениелогическогоИЛИ>|
<выражениелогическогоИЛИ>?<выражение>:<выражение>
<выражениелогическогоИЛИ>::=<выражениелогическогоИ>|
<выражениелогическогоИЛИ> || <выражениелогическогоИ>
<выражениелогическогоИ>::=<выражениеравенства>|
<выражениелогическогоИ>&&<выражениеравенства>
<выражениеравенства>::=<выражениеотношения>|
<выражениеравенства>== <выражениеотношения>|
<выражениеравенства>!= <выражениеотношения>
<выражениеотношения>::=<аддитивноевыражение>|
<выражениеотношения>< <аддитивноевыражение>|
<выражениеотношения>> <аддитивноевыражение>|
<выражениеотношения><= <аддитивноевыражение>|
<выражениеотношения>>= <аддитивноевыражение>
<аддитивноевыражение>::=<мультипликативноевыражение>|
<аддитивноевыражение>+ <мультипликативноевыражение>|
<аддитивноевыражение>- <мультипликативноевыражение>
<мультипликативноевыражение>::=<унарноевыражение>|
<мультипликативноевыражение>* <унарноевыражение>|
<мультипликативноевыражение>/ <унарноевыражение>
<унарноевыражение>::=<постфиксноевыражение>|
++<унарноевыражение>|
--<унарноевыражение>|
<унарныйоператор><унарноевыражение>|
<new-выражение>|
<delete-выражение>
<унарныйоператор>::=* | + | - | !
<постфиксноевыражение>::=<первичноевыражение>|
<постфиксноевыражение>++|<постфиксноевыражение>--
<первичноевыражение>::=<идентификатор>|(<выражение>)|
<выражение масства>[<выражениелогическогоИЛИ>]
<выражение масства>::= <идентификатор>|
<выражение масства>[<выражениелогическогоИЛИ>]
<new-выражение>::=new[[]]<спецификатор простого типа> (<выражение>)
<delete-выражение>::=delete[[]]<идентификатор>
<инструкцияобъявления>::=<последовательностьспецификаторовтипов>
<списокинициализирующихобъявителей>;
<последовательностьспецификаторовтипов>::=[<последовательностьспецификаторовтипов>] <спецификатортипа>
<спецификатортипа>::=<спецификаторпростоготипа>|<спецификаторперечисления>|const
<спецификаторпростоготипа>::=int|float
<спецификаторперечисления>::=enum[<идентификатор>]{[<списокэлементовперечисления>]}
<списокэлементовперечисления>::=[<списокэлементовперечисления>],
<определениеэлементаперечисления>
<определениеэлементаперечисления>::=<элементперечисления>[=<выражение>]
<элементперечисления>::=<идентификатор>
<списокинициализирующихобъявителей>::=[<списокинициализирующихобъявителей>]
<инициализирующийобъявитель>
<инициализирующийобъявитель>::=<объявитель> [<инициализатор>]
<объявитель>::=<непосредственно объявитель>|<ptr-оператор><объявитель>
<непосредственно объявитель>::=<идентификатор>|
<непосредственно объявитель>[[<выражение>]]
<ptr-оператор>::=*[const]
<инициализатор>::==<выражение>
1.2) Семантика входного языка
Тип |
Размер, байт |
Диапазон значений |
int |
2 |
-32768..32767 |
float |
4 |
+-3.4E-38..+-3.4E38 |
Знак операции |
Название операции |
Порядок выполнения |
Семантика |
() |
Скобки |
Слева направо |
Группирова операций, разрешение приоритетов. |
++ |
Увеличение на 1(постфиксная) |
Слева направо |
Увеличение на, определено для числовых переменных, возвращает переменную такого же типа, что и получает. |
-- |
Уменьшение на 1(постфиксная) |
Слева направо |
Уменьшение на, определено для числовых переменных, возвращает переменную такого же типа, что и получает. |
++ |
Увеличение на 1(префиксная) |
Слева направо |
Увеличение на, определено для числовых переменных, возвращает переменную такого же типа, что и получает. |
-- |
Уменьшение на 1(префиксная) |
Слева направо |
Уменьшение на, определено для числовых переменных, возвращает переменную такого же типа, что и получает. |
- |
Унарный минус |
Слева направо |
Унарный минус, определен для числовых переменных, возвращает переменную такого же типа, что и получает. Меняет знак числа на противоположный. |
! |
Логическое отрицание |
Слева направо |
Логическое НЕ, определено для операций сравнения. |
new |
Выделение памяти |
Слева направо |
Выделяет свободный участок памяти для новой переменной |
delete |
Освобождение памяти |
Слева направо |
Освобождает память, выделенную оператором new |
* |
Разыменование |
Слева направо |
Обратиться по адресу и вернуть значение переменной. |
* |
Умножение |
Слева направо |
Умножение, определено для числовых переменных. Результат вычисляется в наибольшем типе среди указанных операндов |
/ |
Деление |
Слева направо |
Деление, определено для числовых переменных. Результат вычисляется в наибольшем типе среди указанных операндов |
+ |
Сложение |
Слева направо |
Сложение, определено для числовых переменных. Результат вычисляется в наибольшем типе среди указанных операндов |
- |
Вычитание |
Слева направо |
Вычитание, определено для числовых переменных. Результат вычисляется в наибольшем типе среди указанных операндов |
< |
Меньше |
Слева направо |
Операции сравнения, определены для числовых переменных. |
<= |
Меньше или равно |
Слева направо | |
> |
Больше |
Слева направо | |
>= |
Больше или равно |
Слева направо | |
== |
Равно |
Слева направо |
Операции сравнения, определены для числовых переменных и указателей . |
!= |
Не равно |
Слева направо | |
&& |
Логическое И |
Слева направо |
Логическое И, определено для операций сравнения. Необходимо только для формирования условия |
|| |
Логическое ИЛИ |
Слева направо |
Логическое ИЛИ, определено для операций сравнения. |
= |
Присваивание |
Справа налево |
Передает значение левой части правой части. |
*= |
Умножение с присваиванием |
Справа налево | |
/= |
Деление с присваиванием |
Справа налево | |
+= |
Сложение с присваиванием |
Справа налево | |
-= |
Вычитание с присваиванием |
Справа налево |
Каждая переменная должна быть объявлена до момента своего использования. Переменная не может быть объявлена более одного раза.
Выражения группы сравнения (<,<=,>,>=) возвращают значения типа int. В случае выполнения неравенства – 1, в противном случае – 0.
При выполнении операции присваивания результат приводится к типу переменной слева от знака присваивания, при этом возможно преобразование типов как intвfloat, так и наоборот.
Если операнд, стоящий перед операцией деления имеет тип int, то перед выполнением операции он преобразуется к типуfloat.
Если хотя бы один из операндов правой части выражения имеет тип float, в то все операнды правой части, имеющие типintперед выполнением операции преобразуются к типуfloat.
Правила выполнения операторов языка:
Условный оператор if
Вычисляется выражение в круглых скобках.
Если оно возвращает значение отличное от 0, то выполняется блок, следующий за if.
Если оно возвращает значение 0 и есть ключевое слово else, то выполняется блок, следующий заif.
Цикл for
Инструкция инициализации может объявлять переменную, которая будет видима только в теле этого цикла.
Тело цикла выполняется, если первое выражение возвращает значение отличное от 0.
После каждого выполнения тела цикла выполняется второе выражение.
Условный оператор присваивания
Если первое выражение возвращает значение, отличное от 0, то выполняется выражение после ?.
Если первое выражение возвращает значение 0, то выполняется выражение после :.
Оператор new
Выделяет свободный участок памяти для новой переменной.
new[]выделяет память под массив.
Оператор delete
Освобождает память, выделенную оператором new.
delete[]освобождает память, выделенную под массив.
Операции целочисленной арифметики и арифметики с чисел плавающей точкой вычисляются без учета переполнений.
Вычисление логических выражений – неполное: оставшаяся часть логического выражения не вычисляется, если его значение уже известно.
Значение параметра цикла при его нормальном завершении не определено.
Элементы перечисления приобретают имя типа в соответствии с именем перечисления, или int по умолчанию. При этом типы структурно эквивалентны.