- •Задание на курсовую работу
- •1. Описание входного языка.
- •1.2.3. Конструкции входного языка.
- •Если результат false, то происходит переход на оператор2, в противном случае выполняется оператор1 и происходит переход в конец оператора if-then-else. Лексический анализатор.
- •Представление основных операторов в полиз
- •Операционный символ { вычислить адрес }p, n, r
- •Операционный символ {сложить}p, q, r
- •Операционный символ {вычесть}p, q, r
- •Операционный символ { умножить }p, q, r
- •Операционный символ { делить }p, q, r
- •Операционный символ { общий знаменатель }p, q, r
- •Операционный символ { дизъюнкция }p, q, r
- •Операционный символ { конъюнкция }p, q, r
- •Операционный символ { отрицание }p, q
- •Операционный символ { меньше }p, q, r
- •Операционный символ { отношение }q1, q2, q3, r
- •Операционный символ { id }n
- •Операционный символ { init }n, V, r
- •Операционный символ { нач_ц }q1, q2, q3, m1, m2, r2
- •Операционный символ { кон_ц } q4, q5, m1, m2
- •Операционный символ { присвоить }p, q
- •Операционный символ { имя }q, r
- •Операционный символ { последовательность имён }p, q, r
- •Операционный символ {индекс}p, r
- •Операционный символ {массив}t, q, r
- •Операционный символ { последовательность индексов }p, q, r
- •Операционный символ {диапазон}p, q, r
- •Операционный символ {создать метку}p, r
- •Описание типа
- •Структуры данных дмп-процессора
- •Структура символа
- •Магазин дмп процессора
- •Часть 1 :
- •Часть 2 :
- •Разработка дмп-процессора
- •Взаимодействие дмп-процессоров
- •Алгоритм работы дмп-процессора
- •Передача атрибутов в дмп-процессоре
- •Тестирование дмп-процессора
Санкт-Петербургский Государственный
Электротехнический Университет им. В.И. Ленина («ЛЭТИ»)
Кафедра МО ЭВМ
Пояснительная записка
к курсовой работе
вариант 4
Выполнила студентка: |
Гвоздякова Е.И. |
Проверил преподаватель: |
Самойленко В.П. |
-
Санкт-Петербург
2006
Задание на курсовую работу
В процессе выполнения курсовой работы необходимо разработать язык программирования, являющийся подмножеством заданного языка, и транслятор с этого языка в промежуточный язык, тип которого определяется вариантом индивидуального задания. Метод синтаксического анализа также определяется заданием.
Язык должен обеспечивать операции над переменными и константами заданных базовых типов, а также над переменными и компонентами производного типа, которые определяются вариантом задания. Перечень операций должен включать как предусмотренные базовым языком, так и операции, перечисленные в варианте задания. В языке должна быть определена операция преобразования типов при структурной или именной эквивалентности типов. В языке должна быть предусмотрена возможность создания пользовательских типов.
Язык должен допускать использование арифметических выражений, в состав которых могут входить константы и простые переменные базовых типов, компоненты структурированного типа, круглые скобки и знаки операций: сложения, вычитания, умножения, деления. Приоритет операций - обычный.
Язык должен допускать использование логических выражений, в состав которых могут входить отношения, круглые скобки и знаки логических операций: И, ИЛИ, НЕ и, в случае наличия в языке логического типа, константы и переменные этого типа. Приоритет операций обычный.
Операции над переменными структурированного типа определяются вариантом задания.
Состав операторов языка:
оператор присваивания;
оператор ввода;
оператор вывода;
составной оператор;
оператор безусловного перехода;
условный оператор, условие в котором задается логическим выражением;
оператор цикла, условие в котором задается логическим выражением.
Конкретный вид операторов определяется вариантом задания.
Программа на входном языке может содержать комментарии, вид которых предусмотрен базовым языком.
Задание 4
Базовый язык – Паскаль.
Базовые типы: целый, рациональный, ограниченный, перечислимый.
Структурированный тип: массив.
Операции над рациональными числами: обрашение к числителю и знаменателю, выделение целой и дробной частей, приведение к неправильной дроби, нахождение общего знаменателя двух рациональных чисел, приведение к простой дроби.
Оператор цикла – с параметром.
Перегрузка операций – разрешается.
Эквивалентность типов – именная.
Класс грамматик – LL(1)-грамматики.
Промежуточный язык – польская инверсная запись.
1. Описание входного языка.
1.1. Синтаксис входного языка.
<программа>::=[program <имя>;][<раздел описаний>]<раздел операторов>
<раздел описаний>::={<раздел описания меток>
|<раздел описания констант>
|<раздел описания типов>|<раздел описания переменных>}
<раздел описания меток>::=label <метка>{,<метка>};
<метка>::=<имя>|беззнаковое целое
<раздел описания констант>::=const <объявление константы>;
{<объявление константы>;}
<объявление константы>::=<имя>= беззнаковое целое
<раздел описания типов>::=type <объявление типа;>{ <объявление типа;>}
<объявление типа>::=<имя>=<тип>
<тип>::=<встроенный тип>|<массив>|<перечислимый тип>|<ограниченный тип>|<имя>
<встроенный тип>::=integer|rational
<массив>::=array[<тип индекса>{,<тип индекса>}] of <тип>
<тип индекса>::=<перечислимый тип>|<ограниченный тип>|<имя>
<перечислимый тип>::=(<список имен>)
<ограниченный тип>::=<константное выражение>..<константное выражение>
<константное выражение>::=<имя>| беззнаковое целое
<раздел описания переменных>::=var <список имен>:<тип>;
{<список имен>:<тип>;}
<список имен>::=<имя>{,<имя>}
<выражение>::=<слагаемое>{<аддитивная операция><слагаемое>}
<слагаемое>::=<множитель>{<мультипликативная операция><множитель>}
<множитель>::=([<унарный оператор>]<множитель>)|<переменная>
|беззнаковое целое|(<выражение>)
<аддитивная операция>::= + | -
<мультипликативная операция>::= * | / | common
<унарный оператор>::= frac | int | + | - | simplify | irregular
<переменная>::=<имя>[[<выражение>{,<выражение>}]][.numerator|.denominator]
<имя>::=идентификатор
<логическое выражение>::=<конъюнкция>{or <конъюнкция>}|<отношение>
<конъюнкция>::=<логический множитель>{and <логический множитель>}
<логический множитель>::=(<логическое выражение>)|(<отношение>)
|not <логический множитель>
<отношение>::=<выражение><операция отношения><выражение>
<операция отношения>::= <|<=|>=|<>|>|=
<раздел операторов>::=<составной оператор>.
<составной оператор>::= begin <оператор>{;<оператор>} end
<оператор>::=[<метка>:]<непомеченный оператор>
<непомеченный оператор>::=<оператор цикла с параметром>
|<оператор присваивания>|<пустой оператор>|<составной оператор>
|<условный оператор> |<оператор ввода>|<оператор вывода>
|<оператор безусловного перехода>
<оператор цикла с параметром>::= for <имя>:=<выражение> <направление изменения переменной цикла> <выражение> do <оператор>
<направление изменения переменной цикла>::= to | downto
<оператор присваивания>::=<переменная> := <выражение>
<пустой оператор>::=
<оператор безусловного перехода>::=goto <метка>
<условный оператор>::=if< логическое выражение>then<оператор>[else<оператор>]
<оператор ввода>::=read(<переменная>{,<переменная>})
<оператор вывода>::=write(<выражение>{,<выражение>})
1.2. Семантика входного языка.
1.2.1. Встроенные типы данных входного языка.
Имя типа |
Размер, байт |
Описание хранимых данных |
integer |
2 (в реализации 4) |
Целые числа в диапазоне -32768..32767 |
rational |
4 (в реализации 8) |
Рациональные числа, числитель в диапазоне от -32768..32767, знаменатель в диапазоне от -32768..32767 (имеет смысл убрать знак у знаменателя) |
Входной язык также поддерживает перечислимый и ограниченный типы.
- Ограниченный тип описывает множество чисел, находящихся между двумя значениями заданных константных выражений. Это множество должно быть перечислимым, следовательно, значения константных выражений должны быть целыми числами. Все результирующие и промежуточные (полученные на каком-то шаге вычисления) значения константных выражений должны соответствовать ограничениям, накладываемым на встроенный тип Integer. В случае несоответствия компилятор вернет ошибку компиляции.
- Перечислимый тип описывает последовательность идентификаторов, значение которых не определено, зато определен порядок (на самом деле стоит определить еще и значение).
Замечание: во время проектирования считалось, что данные типы будут занимать в памяти 2 и 4 байта соответственно, в то время как в текущей реализации было удобнее сделать так, чтобы они занимали 4 и 8 байт.
1.2.2. Операции входного языка и их приоритет.
Операции перечислены в порядке убывания приоритета (чем выше в таблице расположена операция, тем раньше она выполняется). Операции разбиты на приоритетные группы: унарные операции всегда выполняются раньше других, затем бинарные операции из мультипликативной группы, затем бинарные операции из аддитивной группы). Операции выполняются без учета переполнения.
Знак операции |
Порядок выполнения и особенности исполь-зования |
Семантический смысл |
int |
Слева направо, Унарный
|
Возвращает целую часть рационального числа (rational). Определен только для типа rational. Тип возвращаемого значения integer. |
frac |
Слева направо, Унарный
|
Возвращает дробную часть рационального числа (rational). Определен только для типа rational. Тип возвращаемого значения rational. |
simplify |
Слева направо, Унарный |
Возвращает упрощенное рациональное число (rational). Определен только для типа rational. Тип возвращаемого значения rational. |
(операция была исключена)
|
Слева направо, Унарный |
Возвращает неправильное рациональное число (rational). Определен только для типа rational. Тип возвращаемого значения rational. |
+ |
Слева направо, Унарный |
Унарный плюс, определен для числовых переменных, возвращает переменную такого же типа, что и получает. Не меняет знак числа. |
- |
Слева направо, Унарный |
Унарный минус, определен для числовых переменных, возвращает переменную такого же типа, что и получает. Меняет знак числа на противоположный. |
common |
Слева направо, Бинарный |
Возвращает общий знаменатель двух рациональных чисел (rational). Операнды типа rational. Тип возвращаемого значения integer.
|
* |
Слева направо, Бинарный |
Умножение, определено для числовых переменных. Если один из операндов имеет тип rational, то результат будет типа rational, иначе integer. |
/ |
Слева направо, Бинарный |
Деление, определено для числовых переменных. Если один из операндов имеет тип rational, то результат будет типа rational, иначе integer. |
+ |
Слева направо, Бинарный |
Сложение, определено для числовых переменных. Если один из операндов имеет тип rational, то результат будет типа rational, иначе integer.
|
- |
Слева направо, Бинарный |
Вычитание, определено для числовых переменных. Если один из операндов имеет тип rational, то результат будет типа rational, иначе integer. |