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

2.2. Семантика входного языка

2.2.1.Встроенные типы данных входного языка

Базовые типы входного языка:

Имя типа

Кол-во байт

Описание хранимых данных

int

2

Целые числа в диапазоне от -32768 до 32767

float

4

Вещественные числа в диапазоне 3.14E-38 до 3.14E+38.

bool

1

Логические переменные ЛОЖЬ(false) и ИСТИНА(true)

Входной язык также поддерживает структурированный тип – vector - вектор с вещественными компонентами. Вектор представляется совокупностью компонент, каждая из которых, в свою очередь, представляется типом float.

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

2.2.2.Операции входного языка и их приоритет

В рассматриваемом случае существует 4 типа операндов и результатов операций – целые (n) и вещественные числа (f), логические значения (b) и вектора (v). Рассмотрим операции языка, требуемые для каждой операции типы операндов и возвращаемый результат.

знак

название

оп-д1

оп-д2

рез

порядок

1

[]

выделение элемента вектора

v

n

f

слева направо

2

!

отрицание

b

-

b

слева направо

++

префиксный инкремент

n

-

n

справа налево

--

префиксный декремент

n

-

n

справа налево

~~

длина вектора

v

-

n

слева направо

3

*

умножение

n,f

n,f

n,f

слева направо

*

скалярное умножение векторов

v

v

f

*

умножение вектора на число

v

n,f

v

/

деление

n,f

n,f

f

4

+

сложение

n,f

n,f

n,f

слева направо

-

вычитание

n,f

n,f

n,f

+

сложение векторов

v

v

v

-

вычитание векторов

v

v

v

5

<

меньше

n,f,b

n,f,b

b

слева направо

<=

не больше

n,f,b

n,f,b

b

>

больше

n,f,b

n,f,b

b

>=

не меньше

n,f,b

n,f,b

b

6

==

равно

n,f,b

n,f,b

b

слева направо

!=

не равно

n,f,b

n,f,b

b

7

&&

логическое И

b

b

b

слева направо

8

||

логическое ИЛИ

b

b

b

слева направо

9

?:

операция условия

лв

в

в

справа налево

10

=

присваивание

n,f,b,v

n,f,b,v

-

справа налево

*=

составное умножение

n,f,v

n,f,v

-

/=

составное деление

n,f

n,f

-

+=

составное сложение

n,f,v

n,f,v

-

-=

составное вычитание

n,f,v

n,f,v

-

11

++

префиксный инкремент

n

-

n

слева направо

--

префиксный декремент

n

-

n

2.2.3.Конструкции входного языка

1)

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

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

При присваивании переменной-вектору можно присвоить только вектор или выражение, дающее в результате вектор, аналогично нельзя присвоить целой переменной векторное выражение. Нельзя выполнять операции присваивания для констант (в левой части)

2)

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

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

3)

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

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

Условный оператор вычисляет значение логического выражения, если оно истинно, то выполняется оператор, следующий за then, иначе выполняется оператор за else (при его отсутствии выполнение оператора завершается)

4)

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

Тело оператора цикла for выполняется нуль и более раз, до тех пор, выражение (2) не станет ложным. Выражения инициализации (1) и оператор присваивания (3) могут быть использованы для инициализации и модификации величин во время выполнения оператора for.

Первым шагом при выполнении оператора for является вычисление выражения инициализации, если оно имеется. Затем вычисление логического выражения с тремя возможными результатами:

1. Если условное выражение истинно (не равно нулю), то выполняется тело оператора. Затем вычисляется выражение цикла (если оно есть). Процесс повторяется снова с вычислением условного выражения.

2. Если условное выражение опущено, то его значение принимается за истину и процесс выполнения продолжается, как показано выше. В этом случае оператор for может завершиться только при выполнении в теле оператора операторов break, goto, return.

3. Если условное выражение ложно, то выполнение оператора for заканчивается и управление передается следующему оператору в программе.

5)

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

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

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

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

Вектор состоит из элементов вектора, каждый из которых может быть определен с помощью идентификатора – имени вектора и индекса. Индексом может быть только целое неотрицательное число или выражение, дающее в результате такое число. Элемент вектора может использоваться как вещественная переменная. Элемент вектора может иметь свой идентификатор. Количество элементов вектора должно соответствовать размерности вектора, заданной при объявлении переменной. Принимается допущение, что не могут использоваться векторы-константы. Константами могут быть толко простые переменные.

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

Оператор безусловного перехода будет выполнен только в том случае, если в программе определена обозначенная метка, при том не более одного раза

7) векторные операции

7.1) Операция ~~ (длина вектора).

Для аргумента-вектора (x1, x2,.. xN) размерности N возвращается числовое значение вещественного типа .

7.2) Операция + (сумма векторов).

Для аргументов-векторов (x1, x2,.. xN) и (y1, y2,.. yN) размерности N возвращается вектор (z1, z2,.. zN) размерности N, где zK=xK+yK, K=1, 2,.. N.

7.3) Операция * (скалярное произведение векторов).

Для аргументов-векторов (x1, x2,.. xN) и (y1, y2,.. yN) размерности N возвращается числовое значение вещественного типа x1*y1+x2*y2+…+xN+yN.

7.4) Операция * (умножение константы или простой переменной на вектор).

Для аргумента-вектора (x1, x2,.. xN) размерности N и аргумента C (константа или простая переменная целого или вещественного типов) возвращается вектор (y1, y2,.. yN) размерности N, где yK=С*xK, K=1, 2,.. N.

На вектора-операнды накладываются определенные ограничения. При вычитании, сложении и скалярном произведении векторов операнды должны иметь одинаковые размерности.

2.2.4. Правила реализации конструкций языка

Правила преобразования типов.

- если один из операндов типа float, то второй преобразуется к типу float

- если операнд типа float или int используется в операции, требующей операнда типа bool, то они преобразуются в тип bool

- при выполнении операции присваивания результат приводится к типу переменой слева от знака присваивания.

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

Вычисление логических выражений происходит ускоренным способом

Каждая переменная, используемая в программе, должна быть описана в этой же области видимости.

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

Использование неинициализированной переменной в любом выражении или операторе, кроме левой части оператора присваивания, приводит к ошибке.

Имена переменных, констант и меток не могут совпадать.

Имена переменных, констант и меток не могут совпадать с ключевыми словами.

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

В разделе описаний переменных при формировании размерности вектора нельзя использовать имена переменных.