Вопросы для самопроверки

Вопросы для самопроверки #

Вы должны проверить свою спецификацию по этому списку вопросов.

  • Не надо вписывать в спецификацию эти вопросы и ответы на них — вы лишь должны проверить, что спецификация так или иначе отвечает на них.
  • Не обязательно иметь встроенный оператор или функцию на все случаи — достаточно иметь понятный способ написать программу под указанный случай
    • Пример: если в вашем языке нет готовой функции преобразования числа в строку, но её возможно написать самому — значит, в вашем языке можно преобразовать число в строку
    • Пример: если в вашем языке нет встроенной операции конкатенации и нет возможности её реализовать самому другими средствами — значит, в вашем языке нет поддержки конкатенации строк

Вопросы разделены на несколько секций.

Вопросы по лексике #

  1. Вы описали правила составления идентификаторов?
  2. Ключевые слова и идентификаторы чувствительны к регистру?
  3. Для литералов строк достаточно символов экранирования?

Вопросы по синтаксису #

  1. Какие есть инструкции (statements) в вашей грамматике?
  2. Приоритеты и ассоциативность операторов достаточно подробно описаны?
  3. Приоритеты и ассоциативность операторов соответствуют естественным ожиданиям разработчика или отличаются от них?
  4. В EBNF-грамматике устранены проблемы левой рекурсии и левой факторизации?

Вопросы по типам данных #

Целые числа #

  1. В вашем языке есть целочисленный тип?
  2. Какой диапазон целых чисел поддерживается?
  3. Как записывается литерал целого числа?
  4. Какие бинарные и унарные операции поддерживаются для целых чисел?

Числа с плавающей точкой #

  1. В вашем языке есть тип для чисел с плавающей точкой?
  2. Какой формат чисел с плавающей точкой поддерживается — binary float 32, binary float 64 или иной?
  3. Как записывается литерал числа с плавающей точкой?
  4. Какие бинарные и унарные операции поддерживаются для целых чисел?

Символы и строки #

  1. В вашем языке есть символьный тип?
  2. В вашем языке есть строковый тип?
  3. Как записывается литерал символа / строки?
  4. Как экранировать служебные символы в литералах символа / строки?
  5. Какая кодировка поддерживается — ASCII, UTF-8, UTF-16, UCS-2?
    • Какие есть краевые случаи?
    • Какими тест-кейсами это проверено?
  6. Поддерживается ли ввод и вывод символов/строк?
  7. Поддерживается ли конкатенация строк?
  8. Поддерживается ли декомпозиция строки на части?
  9. Как получить длину строки?

Вопросы по семантике #

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

  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. Есть ли неизменяемые переменные? Что происходит при попытке присвоить значение такой переменной?