Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа4 / Курсовик 13 вар(ТЯП).doc
Скачиваний:
11
Добавлен:
01.05.2014
Размер:
862.72 Кб
Скачать

Министерство образования

Российской Федерации

Санкт-Петербургский государственный

электротехнический университет

Кафедра МО ЭВМ

Пояснительная записка

к курсовой работе по дисциплине

«Теория языков программирования»

Вариант № 13

Группа: 4351

Факультет КТИ

Преподаватель: Самойленко В.П.

Санкт-Петербург

2017

Задание на курсовую работу

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

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

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

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

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

Состав операторов языка:

  • оператор присваивания;

  • оператор ввода;

  • оператор вывода;

  • оператор безусловного перехода;

  • составной оператор;

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

  • оператор цикла, условие в котором задается логическим выражением.

Конкретный вид операторов определяется вариантом задания.

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

Исходная постановка задачи

Базовый язык– С++.

Базовые типы:целый, вещественный, перечислимый.

Структурированный тип:массив, указатель.

Операции над указателями:присваивание, разыменование, сравнение (на равенство и неравенство).

Оператор цикла– с параметром.

Перегрузка операций– разрешается.

Эквивалентность типов– структурная.

Класс грамматик– грамматики простого предшествования.

Промежуточный язык– польская инверсная запись.

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.

Правила выполнения операторов языка:

  1. Условный оператор if

  • Вычисляется выражение в круглых скобках.

  • Если оно возвращает значение отличное от 0, то выполняется блок, следующий за if.

  • Если оно возвращает значение 0 и есть ключевое слово else, то выполняется блок, следующий заif.

  • Цикл for

    • Инструкция инициализации может объявлять переменную, которая будет видима только в теле этого цикла.

    • Тело цикла выполняется, если первое выражение возвращает значение отличное от 0.

    • После каждого выполнения тела цикла выполняется второе выражение.

  • Условный оператор присваивания

    • Если первое выражение возвращает значение, отличное от 0, то выполняется выражение после ?.

    • Если первое выражение возвращает значение 0, то выполняется выражение после :.

  • Оператор new

    • Выделяет свободный участок памяти для новой переменной.

    • new[]выделяет память под массив.

  • Оператор delete

    • Освобождает память, выделенную оператором new.

    • delete[]освобождает память, выделенную под массив.

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

    Вычисление логических выражений – неполное: оставшаяся часть логического выражения не вычисляется, если его значение уже известно.

    Значение параметра цикла при его нормальном завершении не определено.

    Элементы перечисления приобретают имя типа в соответствии с именем перечисления, или int по умолчанию. При этом типы структурно эквивалентны.