Семантический уровень ЯП или Контекстные условия ЯП 1

Содержание

Слайд 2

Почему ? A^nВ^nС^n - не КСЯ int A^n; int main (

Почему ?

A^nВ^nС^n - не КСЯ
int A^n;
int main ( ) {
A^n

= 2 * A^n;
}
Нельзя построить КСГ, описывающую правильность использования идентификаторов даже в такой примитивной программе
Слайд 3

Примеры контекстных условий

Примеры контекстных условий

Слайд 4

Каждый объект должен быть описан Языки разделяются на языки с умолчанием

Каждый объект должен быть описан

Языки разделяются на языки с
умолчанием (например,

Бейсик) и языки без умолчания (например, C++ , Java).
В языке без умолчания каждый объект должен быть описан ровно один раз, а в языке с умолчанием объект можно описать не более одного раза.
int * index, data, index[100];
double data;
Ошибки: дублирование идентификаторов index, data.
Слайд 5

Вывод Необходимо хранить в некоторой таблице идентификаторы, которые объявлены в программе

Вывод

Необходимо хранить в некоторой таблице идентификаторы, которые объявлены в программе
При обработке

каждого очередного объявления необходимо выполнять проверку на дублирование имени
Слайд 6

Область использования объекта должна быть согласована с областью его действия int

Область использования объекта должна быть согласована с областью его действия

int i;
int

main ( ) {
int j;
i=1; j=2; // глобальная i и локальная j
{ int i, k;
i=3; k=4; // локальные в новом блоке
}
k=3; // ошибка: недоступная k
}
Слайд 7

Вывод 1. Семантическая таблица должна иметь иерархическую структуру 2. В качестве

Вывод

1. Семантическая таблица должна иметь иерархическую структуру
2. В качестве иерархической структуры

можно использовать дерево
3. Произвольное дерево в программе можно представить бинарным деревом
Слева – сосед,
Справа – потомок.
Слайд 8

Типы формальных и фактических параметров функций и их количество должны совпадать

Типы формальных и фактических параметров функций и их количество должны совпадать

diuble

a[ 1000]; int len;
bool fun (double *, int );
// правильно
fun (a, len) ; fun ( & a [len], len / 2);
// ошибки
Fun ( a[ len], a); fun (a);
Слайд 9

Вывод Функции хранятся в семантическом дереве вместе с информацией о параметрах

Вывод

Функции хранятся в семантическом дереве вместе с информацией о параметрах
Параметры функции

являются локальными в теле функции, следовательно соответствующие вершины являются потомками вершины для функции
При обработке вызова функции требуется осуществлять контроль типа каждого параметра
Кроме контроля типов параметров при вызове функции требуется проверка совпадения количества формальных и фактических параметров
Слайд 10

В программе разрешаются приведения типов данных (явные и неявные) double x,

В программе разрешаются приведения типов данных (явные и неявные)

double x, y,

z , h [ 1000];
int a= 100, b = 3, c = a / b; // c = 33
x= a / b; // x = 33.000000
y = a;
z = y / b; // z = 33.333333
void * addr = ( void *) h;
file * in;
y = in; // неверное приведение типов
Слайд 11

Вывод При трансляции операций необходимо проверять типы данных операндов этой операции

Вывод

При трансляции операций необходимо проверять типы данных операндов этой операции
Для

каждой операции необходимо контролировать допустимость приведения типов
Слайд 12

В ЯП допускается использование именованных констант int index = 100; const

В ЯП допускается использование именованных констант

int index = 100;
const int maxIndex

= 100000;
index = maxIndex / 2; // правильно
maxIndex = maxIndex / 2; // Ошибка
ВЫВОД
В таблице необходимо хранить признак константы
При выполнении операции присваивания контролировать отсутствие этого признака
Слайд 13

В ЯП допускается описание пользовательских типов typedef long long int LL;

В ЯП допускается описание пользовательских типов

typedef long long int LL;
LL ww,

zz; // верно: LL - тип
ww a, b ; // ошибка: ww не тип
LL = 2; // ошибка: LL – тип, а не переменная
struct point {int x, y, z ; };
point a; // такой тип есть
а data; // ошибка - а не является типом
a.x = 0; // верно; а - данные структурного типа
a.x.x – a.j; // ошибки: неверные поля структуры
a.y = point.x; // ошибка: point – тип, а не данные
point.x = 0;
Слайд 14

Вывод В таблице необходимо хранить признак типа для каждого идентификатора С

Вывод

В таблице необходимо хранить признак типа для каждого идентификатора
С типом можно

объявлять данные, по нельзя выполнять вычисления
Иерархия полей и методов в классах и структурах должна контролироваться при обработке соответствующих объектов
Нельзя вызвать не функцию, нельзя (за некоторыми особыми случаями) использовать функции как данные
Слайд 15

Семантика & синтаксис Семантика ЯП – это контекстные условия ЯП. Она

Семантика & синтаксис

Семантика ЯП – это контекстные условия ЯП. Она фактически

неразрывно связана с синтаксисом. Схематически это означает уточнение картины:
Слайд 16

Рефакторинг синтаксиса Требования контекстной зависимости могут привести к корректировке синтаксического уровня.

Рефакторинг синтаксиса

Требования контекстной зависимости могут привести к корректировке синтаксического уровня.
Пример:
D

-> D, id | D , P // список переменных в описании
P -> id = V // присваивание
O -> P | ; | … // оператор
Семантика , связанная с id, разная в P и O:
- в Р надо занести id с соответствующим типом
в таблицу и проконтролировать дублирование,
- в О id надо найти в таблице и узнать его тип.
Слайд 17

Рефакторинг синтаксиса Различия в семантике диктуют разделение синтаксической конструкции Р на

Рефакторинг синтаксиса

Различия в семантике диктуют разделение синтаксической конструкции Р на две

:
D -> D, id | D , id=V // список в описании
P -> id = V // присваивание
O -> P | ; | … // оператор
Семантика id одна и та же в конструкции D, независимо от того, инициализируется id или нет. Более того, такая подстановка упростит и синтаксический анализ, так как отпадает необходимость выбора ветви с инициализацией или без нее.
Слайд 18

Лабораторная работа № 7 Тема : Анализ контекстных условий ЯП Перечислить

Лабораторная работа № 7

Тема : Анализ контекстных условий ЯП
Перечислить типы данных

реализуемого ЯП (например, int, double, …) с указанием диапазона значений и длины памяти для хранения значения
Построить таблицу приведения типов
Перечислить типы объектов программы (например, функции, простые переменные, структуры, …)
Привести список контекстных условий для каждого типа объектов с привязкой к соответствующей СД
Построить перечень данных, которые должны храниться в семантическом дереве для каждого типа объектов
Слайд 19

Переходим к реализации семантического уровня ПРОБЛЕМЫ: Как реализовать и хранить семантические

Переходим к реализации семантического уровня

ПРОБЛЕМЫ:
Как реализовать и хранить семантические типы?
Что хранить

в узле семантического дерева?
Как реализовать класс семантического дерева?
Какие функции должен реализовывать этот класс?
Какую диаграмму классов мы в итоге должны реализовать?
Слайд 20

Диаграмма классов Контекстная зависимость семантики и синтаксиса приводит к необходимости связи

Диаграмма классов

Контекстная зависимость семантики и синтаксиса приводит к необходимости связи между

соответствующими классами.
Необходимость связи между классами лексики и семантики определяется необходимостью выдачи сообщений об ошибках.
Слайд 21

Диаграмма классов (варианты 1 и 2) Классы (вариант 1): Лексический анализатор

Диаграмма классов (варианты 1 и 2)

Классы (вариант 1):
Лексический анализатор
Синтаксический анализатор
Семантическое

дерево
Семантика
Классы (вариант 2):
Лексический анализатор
Синтаксический анализатор
Семантика на семантическом дереве
Слайд 22

Диаграмма классов (вариант 2)

Диаграмма классов (вариант 2)

Слайд 23

Семантические типы enum TypeObject {ObjConst=1, // константа ObjLabel, // метка ObjVar,

Семантические типы

enum TypeObject {ObjConst=1, // константа
ObjLabel, // метка
ObjVar, //

простая переменная
ObjTypeVar, // простой тип
ObjArray, // массив
ObjTypeArray, // тип массива
ObjStruct, // структура
ObjTypeStruct, // тип структуры
ObjFunct // функция

};
Слайд 24

Информация в вершине семантического дерева struct Node { LEX id; //

Информация в вершине семантического дерева

struct Node {
LEX id; //

идентификатор объекта
TypeObject DataType; // тип объекта
// дополнительные возможности:
int FlagConst; // признак константы
int Param; // количество параметров функции
int sizeOfArray; // размерность массива
int lenOfArray [MAX_N]; // длина измерения
int FlagInit; // Флаг начальной инициализации
…..
};
Слайд 25

Класс «семантическое дерево» class Tree { private: Node * n; //

Класс «семантическое дерево»

class Tree {
private:
Node * n; // данные таблицы

Tree * Up, * Left, * Right;
// родитель, левый и правый потомок
public:
Tree(Tree * l, Tree * r, Tree * u, Node * Data);
Tree();
~Tree();
// необходимые функции работы с таблицей:
…..
};
Слайд 26

Функции поиска и дополнения класса «семантическое дерево» class Tree { …..

Функции поиска и дополнения класса «семантическое дерево»

class Tree {
…..
void

SetLeft (Node * data);
void SetRight(Node * data);
Tree * FindUp (Tree * from, TypeLex id);
Tree * FindUp (TypeLex id);
Tree * Find UpOneLevel ( TypeLex id);
Tree * FindDownLeft (Tree * from, TypeLex id);
Tree * FindDownLeft (TypeLex id);

void Print(Tree * from);
};
Слайд 27

Особенности реализации семантического дерева: пустые вершины

Особенности реализации семантического дерева: пустые вершины

Слайд 28

Лексичестор пропро

Лексичестор

пропро

Слайд 29

Семантические подпрограммы Семантика языка программирования - это контекстные условия, то есть

Семантические подпрограммы

Семантика языка программирования - это контекстные условия, то есть

некоторые условия, связанные с обрабатываемым текстом программы.
Следовательно, семантический контроль связан с синтаксисом: в том или ином синтаксическом окружении вызываются определенные фунецииЮ которые эти условия проверяют .
Такая связь реализуется семантическими подпрограммами.
Слайд 30

Семантика описаний Цель - занести объект в таблицу со всеми параметрами

Семантика описаний

Цель - занести объект в таблицу со всеми параметрами

Слайд 31

Семантика выражений Цель – вычислить тип

Семантика выражений

Цель – вычислить тип

Слайд 32

Семантика выражений Цель – вычислить тип и проверить допустимость операции

Семантика выражений

Цель – вычислить тип и проверить допустимость операции

Слайд 33

Семантика присваиваний Цель – проверить допустимость операции

Семантика присваиваний

Цель – проверить допустимость операции

Слайд 34

Семантика функций Цель при объявлении функции – занести поддерево функции в текщее семантическое дерево

Семантика функций

Цель при объявлении функции – занести поддерево функции в текщее

семантическое дерево
Слайд 35

Семантика классов и структур Как и для функций цель оьработки семантики

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

Как и для функций цель оьработки семантики

структур - занести поддерево в общее семантическое дерево
Слайд 36

Семантика классов и структур Дерево классов и структур имеет сложную структуру.

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

Дерево классов и структур имеет сложную структуру.
Пример:

// типы
struct s { int n, m;};
struct ss { double z; s x, y; };
struct sss { s w, q; ss t; };
// данные
s a, b;
ss c, d;
sss f, g;
Слайд 37

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

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


Слайд 38

Семантика классов и структур Дерево классов и структур имеет сложную структуру

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

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

вообще говоря, дерево становится потоковым графом:
struct s { int n, m;};
struct ss { double z; s x, y; };
Вершины x и y в качестве правых ссылок имеют указатели на правого потомка вершины s.
struct sss { s w, q; ss t; };
Вершина t в качестве правой ссылки имеет указатель на правого потомка вершины ss.
Слайд 39

Семантика классов и структур Для данных указатели строятся аналогично s a,

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

Для данных указатели строятся аналогично
s a,

b; // ссылки на правых потомков s
ss c, d; // ссылки на правых потомков ss
sss f, g; // ссылки на правых потомков sss
Корректность полей проверяется обходом дерева по ссылкам:
структура верхнего уровня - поиск от текущей – (последней созданной) вершины вверх по дереву,
каждая точка (стрелка) - переход по правой ссылке,
каждое очередное поле - поиск по левым указателям вниз.
Слайд 40

Лабораторные работы 7, 8, 9 Общая задача – реализовать семантический контроль

Лабораторные работы 7, 8, 9

Общая задача – реализовать семантический контроль
Работа 7

– проектирование
Работы 8 и 9 - реализация
Слайд 41

Лабораторная работа № 7 Тема : Анализ контекстных условий ЯП Перечислить

Лабораторная работа № 7

Тема : Анализ контекстных условий ЯП
Перечислить типы данных

реализуемого ЯП (например, int, double, …) с указанием диапазона значений и длины памяти для хранения значения
Построить таблицу приведения типов
Перечислить типы объектов программы (например, функции, простые переменные, структуры, …)
Привести список контекстных условий для каждого типа объектов с привязкой к соответствующей СД
Построить перечень данных, которые должны храниться в семантическом дереве для каждого типа объектов
Слайд 42

Лабораторная работа № 8 Тема - реализация создания семантического дерева. Создать

Лабораторная работа № 8

Тема - реализация создания семантического дерева.
Создать заголовочный файл

семантического класса.
Реализовать семантические функции, связанные с созданием семантического дерева. Это конструкции описания данных и типов.
Особое внимание обратить на ошибки дублирования идентификаторов в одной области видимости, а так же возврат на предшествующий уровень после завершения блока.
Слайд 43

Лабораторная работа № 9 Тема – полный семантический контроль. Реализовать функции

Лабораторная работа № 9

Тема – полный семантический контроль.
Реализовать функции контроля использования

объектов.
Обратить внимание на приведение типов в выражениях.
Проверить работоспособность на всех требованиях, выделенных в работе № 6.
Слайд 44

Сообщения о семантических ошибках и нейтрализация семантических ошибок

Сообщения о семантических ошибках и нейтрализация семантических ошибок


Слайд 45

Ошибка «неверное приведение типов» Возможен повтор сообщения об ошибке при дальнейшей

Ошибка «неверное приведение типов»

Возможен повтор сообщения об ошибке при дальнейшей обработке

выражения.
Нейтрализация:
1. внести новы семантический тип noType,
2. Все приведения с типом noType считаются корректными. Тип результата операции - noType.
Слайд 46

Ошибка «нет описания идентификатора» Возможен повтор сообщения об ошибке, если забыли

Ошибка «нет описания идентификатора»

Возможен повтор сообщения об ошибке, если забыли описать

идентификатор, но правильно использовали.
Нейтрализация:
1. внести идентификатор сразу после корня с типом noType,
2. Все операции и описания данных с с типом noType считаются корректными.
Недостаток - отсутствие ошибок при фактической ошибке в написании идентификатора при использовании.