- •1. Формальная постановка задачи Задание 10.
- •2. Описание входного языка
- •2.1. Синтаксис входного языка
- •2.2. Описание семантики входного языка
- •3 Описание этапа лексического анализа
- •3.1. Определение типов лексем
- •Определение синтаксиса лексем.
- •Построение диаграммы лексического анализатора.
- •Функции лексического анализатора
- •Описание этапа синтаксического анализа.
- •4.1. Построение кс-грамматики входного языка.
- •Разбиение исходной грамматики на подграмматики.
- •Описание промежуточного языка.
- •4.4. Неформальное описание перевода.
- •4.5. Посторенние атрибутной транслирующей грамматики.
- •4.6. Построение атрибутного дмп-процессора.
- •4.7. Тестирование атрибутного дмп-процессора
2.2. Описание семантики входного языка
Описание семантики задает представление данных в оперативной памяти, приоритет выполнения операций, правила преобразования типов языка, правила выполнения операторов языка и реализации языковых конструкций.
Представление данных различных типов в оперативной памяти (размер в байтах и диапазон возможных значений) зададим с помощью таблицы (табл. 1).
Табл. 1.
Тип |
Размер, байт |
Диапазон значений |
int |
2 |
Целые числа. -32768….32767 |
float |
4 |
Вещественные числа. 3.14E-38….3.14E+38. |
bool |
1 |
Логические переменные. False, Тrue |
Отметим также, что входной язык к тому же поддерживает структурированный тип – vector -вектор с вещественными компонентами. Вектор представляется совокупностью компонент, каждая из которых, в свою очередь, представляется типом float.
Приоритет операций и порядок выполнения операций с одинаковым приоритетом также зададим с помощью таблицы (см. табл. 2).
Табл. 2.
Знак операции |
Название операции |
Порядок выполнения |
++ -- |
Увеличение на единицу Уменьшение на единицу |
Слева направо Слева направо |
* / |
Умножение Деление |
Слева направо Слева направо |
+ - |
Сложение Вычитание |
Слева направо Слева направо |
< <= > >= |
Меньше Меньше или равно Больше Больше или равно |
Слева направо Слева направо Слева направо Слева направо |
== != |
Равно Не равно |
Слева направо Слева направо |
&& || |
Логическое И Логическое ИЛИ |
Слева направо Слева направо |
not and or |
Не И Или |
Справа налево Слева направо Слева направо |
Правила преобразования типов для бинарных операций включают правила автоматического преобразования операндов к одному общему типу, при этом тип результата выполнения операции, как правило, также имеет общий тип. Обычно операнды бинарных арифметических операций разных типов приводятся к старшему (более длинному) типу.
Правила преобразования типов для бинарных арифметических операций также приведем в таблицу (см. табл. 3).
Табл. 3.
Операнд 1 |
Операнд 2 |
Операция |
Результат |
double |
int |
*, /, +, - |
double |
double |
foat |
*, /, +, - |
double |
double |
double |
*, /, +, - |
double |
Unsigned long |
int |
*, /, +, - |
Unsigned long |
Unsigned long |
foat |
*, /, +, - |
Unsigned long |
Unsigned long |
double |
*, /, +, - |
Unsigned long |
Long |
Unsigned long |
*, /, +, - |
Unsigned long |
Int |
int |
*, +, -, / |
int float |
Int |
Unsigned int |
*, /, +, - |
Unsigned int |
Int |
char |
*, /, +, - |
int |
Int |
Unsigned char |
*, /, +, - |
int |
float |
float |
*, /, +, - |
double |
При выполнении операции присваивания результат приводится к типу переменной слева от знака операции присваивания, при этом возможно преобразование как старшего типа к младшему, так и наоборот.
Задание правил выполнения операторов языка заключается в описании порядка выполнения операторов.
Оператор цикла с параметром for.
< оператор цикла с параметром>::=
for(<оператор присваивания>;<логическое выражение>;<оператор присваивания>)
<составной оператор>
Порядок выполнения оператора:
Параметр цикла инициализируется первым оператором присваивания.
Вычисляется логическое выражение для текущего значения параметра цикла.
Если получившееся логическое выражение ИСТИНА:
Выполняется тело цикла.
Выполняется оператор присваивания над текущим значением параметра цикла.
Переход к пункту 1.
Если получившееся логическое выражение ЛОЖЬ:
6. Выход из цикла.
Значение параметра цикла при корректном завершении цикла определяется логическим выражением из описания цикла.
Оператор присваивания
<оператор присваивания >::= < переменная ><отношение присваивания>< выражение >
< отношение присваивания>::= = | += | -= | *= | /=
Вычисляется арифметическое выражение в правой части и, в случае соответствия типов, запоминается в переменной(для =), указанной в левой части. Если отношение операции отлично от =, то переменная в левой части модифицируется (согласно виду отношения присваивания) с учетом вычисленного арифметического выражения и сохраняется в переменной левой части.
Оператор безусловного перехода goto.
<оператор безусловного перехода>::= goto <метка>
Выполняется переход на метку.
Метка должна встречаться в теле программы один раз.
Условный оператор if-else
< условный оператор >::= if (<логическое выражение>) <составной оператор1>
[else <составной оператор2> ]
Вычисляется значение логического выражения и результат помещается во временную переменную.
Если результат FALSE, то происходит переход на составной оператор2, в противном случае выполняется составной оператор1 и происходит переход в конец оператора if -else.
Условный оператор присваивания
< условный оператор присваивания>::=
(<логическое выражение>)?< выражение1>:< выражение2 >
Вычисляется значение логического выражение и результат помещается во временную переменную.
Если результат TRUE, то происходит присваивание значения выражения1, в противном случае выполняется присваивание значения выражения2 и происходит переход в конец оператора условного присваивания.
