Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовик по ТЯП. Вариант 4.doc
Скачиваний:
9
Добавлен:
01.05.2014
Размер:
1.66 Mб
Скачать

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

Электротехнический Университет им. В.И. Ленина («ЛЭТИ»)

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

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

к курсовой работе

вариант 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.

irregular

(операция была исключена)

Слева направо,

Унарный

Возвращает неправильное рациональное число (rational). Определен только для типа rational. Тип возвращаемого значения rational.

+

Слева направо,

Унарный

Унарный плюс, определен для числовых переменных, возвращает переменную такого же типа, что и получает. Не меняет знак числа.

-

Слева направо,

Унарный

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

common

Слева направо,

Бинарный

Возвращает общий знаменатель двух рациональных чисел (rational). Операнды типа rational. Тип возвращаемого значения integer.

*

Слева направо,

Бинарный

Умножение, определено для числовых переменных. Если один из операндов имеет тип rational, то результат будет типа rational, иначе integer.

/

Слева направо,

Бинарный

Деление, определено для числовых переменных. Если один из операндов имеет тип rational, то результат будет типа rational, иначе integer.

+

Слева направо,

Бинарный

Сложение, определено для числовых переменных. Если один из операндов имеет тип rational, то результат будет типа rational, иначе integer.

-

Слева направо,

Бинарный

Вычитание, определено для числовых переменных. Если один из операндов имеет тип rational, то результат будет типа rational, иначе integer.