
- •8.1. Определение синтаксиса
- •8.1.1. Схема трансляции программы
- •8.2. Сравнение синтаксиса sml и ламбда-исчисления
- •8.2.1. Обозначения бнф
- •8.2.2. Синтаксис ламбда-исчисления
- •8.2.3. Синтаксис sml
- •9.1. Обобщенные требования к описанию языков программирования
- •9.2. Семантика языка программирования
- •9.3. Теория вычислений д. Скотта
- •9.3.1. Последовательность изложения теории вычислений д. Скотта
- •9.3.2. Определения способов комбинирования доменов
- •9.4. Формализация семантики языка функционального программирования sml
- •9.4.1. Порядок построения формальной модели семантики языка программирования sMalL согласно ранее представленному формальному описанию синтаксиса языка в терминах бнф
- •9.4.2. Вычислительная модель на основе состояний программы языка sMalL
- •9.5. Описание семантических предложений
- •9.5.1. Семантические предложения для выражений
- •9.5.2. Семантические предложения для команд
- •9.5.3. Семантические предложения для денотатов
9.4.1. Порядок построения формальной модели семантики языка программирования sMalL согласно ранее представленному формальному описанию синтаксиса языка в терминах бнф
1. Прежде всего, необходимо дать определение синтаксических доменов (т.е. доменов, характеризующих основные синтаксические категории) для идентификаторов (домен Ide), выражений (домен Exp) и команд (домен Com).
2. Следует представить определение вычислительной модели на основе синтаксических доменов.
3. Необходимо перейти к определению семантических функций (E для домена Exp, C для домена Com и т.д.), которые отображают синтаксические конструкции языка программирования в соответствующие им семантические представления.
4. Следует сформулировать определение семантических предложений в терминах смены состояний программы.
Заметим, что при выполнении программы (в частности, написанной на языке программирования SMalL) происходит изменение состояния памяти (m, memory), которое в простейшем случае характеризует соответствие идентификаторов и значений (то есть, по сути, связывание переменной со значением), либо имеет значение unbound (характеризующее отсутствие связи идентификатора со значением, т.е. аналог свободной переменной).
В соответствии с намеченной схемой рассуждений перейдем к описанию синтаксических доменов, которые в полной мере определяют синтаксис языка SMalL:
Ide = {I | I - идентификатор};
Com = {C | C - команда};
Exp = {E | E - выражение}.
Совокупность всех возможных идентификаторов языка SMalL организуем в домен Ide, команд - в домен Com, и, наконец, выражений - в домен Exp.
9.4.2. Вычислительная модель на основе состояний программы языка sMalL
Для наглядности она представлена в виде следующей таблицы 9.1:
Таблица 9.1. Вычислительная модель на основе состояний программы языка SMalL
Параметр |
Домен |
Соотношение |
Состояние |
State |
(s) State=Memory |
Память |
Memory |
(m) Memory = Ide -> [Value+{unbound}] |
Значение |
Value |
(v) Value=Int+Bool |
Заметим, что состояние программы в произвольный момент времени определяется состоянием "памяти" абстрактной машины той или иной формы. При этом под памятью понимается отображение из домена идентификаторов в домен значений (т.е. аналог связывания переменной со значением в ламбда-исчислении). Для корректной обработки исключительных ситуаций, возникающих в случае свободных переменных, вводится дополнительный элемент unbound. Домен значений представляет собой дизъюнктную сумму доменов, содержащих существующие в языке SMalL типы Int и Bool.
9.5. Описание семантических предложений
9.5.1. Семантические предложения для выражений
Приведем семантические предложения для выражений языка программирования SMalL:
E : Exp -> [State -> [[Value, State] +
{error}]];
E[E]s = (v,s'),
если v - значение E в s, s'- состояние после означивания;
E[E]s = error,
если возникает ошибка несоответствия типов.
Из приведенных соотношений следует, что вычисление значения выражения языка программирования SMalL приводит к такому изменению состояния, что происходит связывание переменной со значением, либо (в случае невозможности связывания по причине несоответствия типов переменной и значения) генерируется сообщение об ошибке. При этом состояние программы изменяется с s на s'.