- •1. Постановка задачи
- •Задание 10
- •2. Описание входного языка
- •2.1. Синтаксис входного языка
- •2.2. Семантика входного языка
- •2.2.1.Встроенные типы данных входного языка
- •2.2.2.Операции входного языка и их приоритет
- •2.2.3.Конструкции входного языка
- •3. Описание этапа лексического анализа.
- •3.1. Определение типов лексем.
- •3.2. Определение синтаксиса лексем
- •3. Описание этапа синтаксического анализа.
- •3.1 Построение кс-грамматики входного языка.
- •3.2 Определение класса кс-грамматики входного языка.
- •3.3 Постоение таблиц переменных, меток, констант и векторов
- •3.4 Описание промежуточного языка.
- •3.5 Неформальное описание перевода
- •Построение транслирующей грамматики
- •Построение атрибутной транслирующей грамматики
- •Построение атрибутного дмп-процессора
- •Тестирование атрибутного дмп-процессора
Агентство по образованию РФ
Санкт-Петербургский Государственный Электротехнический Университет «ЛЭТИ»
Кафедра МО ЭВМ
Пояснительная записка
к курсовой работе по дисциплине
«Теория языков программирования и методов трансляции».
Преподаватели: Самойленко В.П.
Выполнили: Кузьменко А.
Довбыш А.
гр.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 | <натуральная цифра>
<размерность>::=<натуральное число>
<индекс>::= <выражение>
<строка>::= {<буква>|<цифра>|.|,|!|?|$|…}