Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа3 / Курсовик.doc
Скачиваний:
18
Добавлен:
01.05.2014
Размер:
1.6 Mб
Скачать

Агентство по образованию РФ

Санкт-Петербургский Государственный Электротехнический Университет «ЛЭТИ»

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

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

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

«Теория языков программирования и методов трансляции».

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

Выполнили: Кузьменко А.

Довбыш А.

гр.4351

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

2007

1. Постановка задачи

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Задание 10

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

Базовые типы: целый, вещественный, булевский.

Структурированный тип – вектор с вещественными компонентами.

Операции над векторами: определение длины вектора, сумма и разность векторов, Скалярное произведение векторов, умножение вектора на число.

Дополнительные требования: операции ++, --, условный оператор присваивания, операторы присваивания +=, *=, -=, /=.

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

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

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

Класс грамматик – LL(1)-грамматики.

Промежуточный язык – тетрады.

2. Описание входного языка

2.1. Синтаксис входного языка

<программа>::= [<объявление переменных>] void main() {<составной оператор>}

<составной оператор>::= <оператор>{<оператор>}

<оператор>::= [<метка>:]<непомеченный оператор>;

<непомеченный оператор>::={<составной оператор>}|<условный оператор присваивания>|<условный оператор>| <оператор цикла>|<оператор безусловного перехода>|<оператор ввода>|<оператор вывода>|<выражение>|<определение типа>

<определение типа>::= typedef <тип> [<индекс>] <идентификатор>

<условный оператор присваивания>::= (<выражение>)? <выражение>:<выражение>

<условный оператор>::= if (<выражение>) <оператор>

[else < оператор>]

<оператор цикла>::= for([<выражение>]; <выражение>; [<выражение>]) <оператор>

<оператор безусловного перехода>::=goto <метка>

<оператор вывода>::= printf (<печатные>{,<печатные>})

<печатные>::= <переменная>|<число>|<строка>

<оператор ввода>::= scanf<переменная>

< выражение>::= <выражение>||<дизъюнкция>|<дизъюнкция>|

<выражение><унарная операция>|

<выражение><операция присваивания><выражение>

< дизъюнкция>::=<дизъюнкция>&&<конъюнкция>|<конъюнкция>

< конъюнкция>::=<конъюнкция><аддитивная операция><отношение>|<отношение>

< отношение>::=<отношение><операция отношения><слагаемое>|<слагаемое>

< слагаемое>::=<слагаемое><мультипликативная операция><множитель>| <множитель>

< множитель>::=<число>|<переменная>| (<выражение>)|

<унарная операция><множитель>| ! <множитель>

< мультипликативная операция>::= * | /

< аддитивная операция>::=+|-

< унарная операция>::= ++ |--|~~

<отношение> ::= <выражение> <операция отношения> <выражение>

<операция отношения>::=<| >| <=| >=| == | !=

<объявление переменных>::= <объявление переменной>;{<объявление переменной>;}

<объявление переменной>::=[const] <тип> <идентификатор> [= <число>] | vector <идентификатор> <размерность> [= [<число> {,<число>} ]]

<переменная>::= <простая переменная>|<вектор>

<простая переменная>::=<идентификатор>|<элемент вектора>

<вектор>::=<идентификатор>|[<элемент вектора>{,<элемент вектора>}]

<элемент вектора>::=<идентификатор> [<индекс>] |<идентификатор>| <число>

<тип>::=int| float| bool|<пользовательский тип>

<пользовательский тип>::=ID

<операция присваивания>::= = |+= | -= | *= | /=

<метка>::= <идентификатор>

<идентификатор>::= <буква>{<буква>|<цифра>}

<буква>::= a|b|c|…|z|A|B|C|…|Z|

<число>::=<вещественное число>|<целое число>

<вещественное число>::=[-]{<цифра>}[.<цифра>{<цифра>}]

<целое число>::=0|[-]<натуральное число>

<натуральное число>::=<натуральная цифра>{<цифра>}

<натуральная цифра>::=1|2|3|4|5|6|7|8|9

<цифра>::= 0 | <натуральная цифра>

<размерность>::=<натуральное число>

<индекс>::= <выражение>

<строка>::= {<буква>|<цифра>|.|,|!|?|$|…}