Задание 6.2A

Лабораторная №6 — задание 6.2A #

Нужно написать спецификацию правил семантики для своего языка программирования и внести связанные изменения в другие файлы спецификаций.

Порядок выполнения. #

Изменения зависят от особенностей вашего языка — это описано далее.

  1. Создайте в проекте файл docs/specification/semantics.md для спецификации семантики языка (кроме семантики типов, описанной в types.md)
  2. Напишите спецификацию, учитывая предлагаемую структуру и список особенностей ниже
  3. Проверьте остальные документы в docs/specifications
    • не допускаются противоречия между разными документами
    • нежелательно дублировать информацию между разными документами

Предлагаемая структура документа #

Можно задать следующие разделы:

НазваниеЧто содержит
Области видимостиСемантика областей видимости
Уникальность имёнПравила использования имён символов
Параметры функцийСемантика формальных и фактических параметров
РекурсияСемантика рекурсии и взаимной рекурсии функций
ВетвленияСемантика всех видов ветвлений и связанных конструкций
ЦиклыСемантика всех видов циклов и связанных конструкций
Прочие правилаОстальные правила семантики

Вопросы на подумать #

Ниже перечислены вопросы, над которыми стоит подумать при написании спецификации.

Области видимости #

  1. Лексические или динамические области видимости?
  2. Какими способами можно задать область видимости?
  3. Функция захватывает переменные внешней области видимости?
  4. Доступна ли переменная вне своей области видимости (например, локальная переменная после завершения функции)?

Уникальность имён #

  1. В каких пределах имя символа уникально — в одном блоке, в одной функции, в одной области видимости?
  2. Переменные и функции используют общее пространство имён?
  3. Можно ли скрыть переменную внешней области видимости, объявив переменную с тем же именем?
  4. Можно ли скрыть имя встроенной функции своей переменной?
  5. Можно ли скрыть имя встроенного типа данных своей переменной?

Параметры функций #

  1. Параметры передаются по ссылке или по значению?
  2. Параметр можно скрыть локальной переменной?
  3. Параметру можно присвоить значение внутри функции?
  4. Допускается несовпадение числа формальных и фактических параметров?
  5. В каком порядке вычисляются выражения, указанные в качестве фактических параметров?
  6. Функция может заканчиваться без оператора return? В каких случаях?

Рекурсия #

  1. Поддерживается рекурсия (может ли функция вызывать себя)?
  2. Поддерживается взаимная рекурсия (могут ли две функции вызывать друг друга)?

Ветвления #

  1. Какие значения считаются истиной в условиях, а какие — ложью?
  2. Какая ветка выполняется при истинном условии, какая — при ложном?
  3. Какой тип должно возвращать выражение в условии ветвления?
  4. Есть аналог switch..case? Если да, то в нём обязательно завершение метки case?

Циклы #

  1. До каких пор работает цикл while?
  2. Есть ли цикл for? Если да, то до каких пор он работает (как работает каждая его часть)?
  3. Где может располагаться инструкция break? А continue?
  4. Какой тип должно возвращать выражение в условии цикла?

Остальные правила семантики #

Остальные правила описываются в том случае, когда какие-либо конструкции допустимы на уровне грамматики, но ограничены на уровне семантики. Если грамматика уже запрещает ту или иную конструкцию, то описывать это правилами семантики не нужно.

  1. Что может быть в левой части присваиваний?
  2. Можно ли обращаться к неинициализированной переменной?
  3. Есть ли неизменяемые переменные? Что происходит при попытке присвоить значение такой переменной?

Справочные материалы #

  1. Пример PsTiger
  2. Лекция 11. Атрибутные грамматики