Лабораторная №6 — задание 6.2A #
Нужно написать спецификацию правил семантики для своего языка программирования и внести связанные изменения в другие файлы спецификаций.
Порядок выполнения. #
Изменения зависят от особенностей вашего языка — это описано далее.
- Создайте в проекте файл
docs/specification/semantics.mdдля спецификации семантики языка (кроме семантики типов, описанной вtypes.md) - Напишите спецификацию, учитывая предлагаемую структуру и список особенностей ниже
- Проверьте остальные документы в
docs/specifications- не допускаются противоречия между разными документами
- нежелательно дублировать информацию между разными документами
Предлагаемая структура документа #
Можно задать следующие разделы:
| Название | Что содержит |
|---|---|
| Области видимости | Семантика областей видимости |
| Уникальность имён | Правила использования имён символов |
| Параметры функций | Семантика формальных и фактических параметров |
| Рекурсия | Семантика рекурсии и взаимной рекурсии функций |
| Ветвления | Семантика всех видов ветвлений и связанных конструкций |
| Циклы | Семантика всех видов циклов и связанных конструкций |
| Прочие правила | Остальные правила семантики |
Вопросы на подумать #
Ниже перечислены вопросы, над которыми стоит подумать при написании спецификации.
Области видимости #
- Лексические или динамические области видимости?
- Какими способами можно задать область видимости?
- Функция захватывает переменные внешней области видимости?
- Доступна ли переменная вне своей области видимости (например, локальная переменная после завершения функции)?
Уникальность имён #
- В каких пределах имя символа уникально — в одном блоке, в одной функции, в одной области видимости?
- Переменные и функции используют общее пространство имён?
- Можно ли скрыть переменную внешней области видимости, объявив переменную с тем же именем?
- Можно ли скрыть имя встроенной функции своей переменной?
- Можно ли скрыть имя встроенного типа данных своей переменной?
Параметры функций #
- Параметры передаются по ссылке или по значению?
- Параметр можно скрыть локальной переменной?
- Параметру можно присвоить значение внутри функции?
- Допускается несовпадение числа формальных и фактических параметров?
- В каком порядке вычисляются выражения, указанные в качестве фактических параметров?
- Функция может заканчиваться без оператора return? В каких случаях?
Рекурсия #
- Поддерживается рекурсия (может ли функция вызывать себя)?
- Поддерживается взаимная рекурсия (могут ли две функции вызывать друг друга)?
Ветвления #
- Какие значения считаются истиной в условиях, а какие — ложью?
- Какая ветка выполняется при истинном условии, какая — при ложном?
- Какой тип должно возвращать выражение в условии ветвления?
- Есть аналог switch..case? Если да, то в нём обязательно завершение метки case?
Циклы #
- До каких пор работает цикл while?
- Есть ли цикл for? Если да, то до каких пор он работает (как работает каждая его часть)?
- Где может располагаться инструкция break? А continue?
- Какой тип должно возвращать выражение в условии цикла?
Остальные правила семантики #
Остальные правила описываются в том случае, когда какие-либо конструкции допустимы на уровне грамматики, но ограничены на уровне семантики. Если грамматика уже запрещает ту или иную конструкцию, то описывать это правилами семантики не нужно.
- Что может быть в левой части присваиваний?
- Можно ли обращаться к неинициализированной переменной?
- Есть ли неизменяемые переменные? Что происходит при попытке присвоить значение такой переменной?