Вопросы для самопроверки #
Вы должны проверить свою спецификацию по этому списку вопросов.
- Не надо вписывать в спецификацию эти вопросы и ответы на них — вы лишь должны проверить, что спецификация так или иначе отвечает на них.
- Не обязательно иметь встроенный оператор или функцию на все случаи — достаточно иметь понятный способ написать программу под указанный случай
- Пример: если в вашем языке нет готовой функции преобразования числа в строку, но её возможно написать самому — значит, в вашем языке можно преобразовать число в строку
- Пример: если в вашем языке нет встроенной операции конкатенации и нет возможности её реализовать самому другими средствами — значит, в вашем языке нет поддержки конкатенации строк
Вопросы разделены на несколько секций.
Вопросы по лексике #
- Вы описали правила составления идентификаторов?
- Ключевые слова и идентификаторы чувствительны к регистру?
- Для литералов строк достаточно символов экранирования?
Вопросы по синтаксису #
- Какие есть инструкции (statements) в вашей грамматике?
- Приоритеты и ассоциативность операторов достаточно подробно описаны?
- Приоритеты и ассоциативность операторов соответствуют естественным ожиданиям разработчика или отличаются от них?
- В EBNF-грамматике устранены проблемы левой рекурсии и левой факторизации?
Вопросы по типам данных #
Целые числа #
- В вашем языке есть целочисленный тип?
- Какой диапазон целых чисел поддерживается?
- Как записывается литерал целого числа?
- Какие бинарные и унарные операции поддерживаются для целых чисел?
Числа с плавающей точкой #
- В вашем языке есть тип для чисел с плавающей точкой?
- Какой формат чисел с плавающей точкой поддерживается — binary float 32, binary float 64 или иной?
- Как записывается литерал числа с плавающей точкой?
- Какие бинарные и унарные операции поддерживаются для целых чисел?
Символы и строки #
- В вашем языке есть символьный тип?
- В вашем языке есть строковый тип?
- Как записывается литерал символа / строки?
- Как экранировать служебные символы в литералах символа / строки?
- Какая кодировка поддерживается — ASCII, UTF-8, UTF-16, UCS-2?
- Какие есть краевые случаи?
- Какими тест-кейсами это проверено?
- Поддерживается ли ввод и вывод символов/строк?
- Поддерживается ли конкатенация строк?
- Поддерживается ли декомпозиция строки на части?
- Как получить длину строки?
Вопросы по семантике #
Области видимости #
- Лексические или динамические области видимости?
- Какими способами можно задать область видимости?
- Функция захватывает переменные внешней области видимости?
- Доступна ли переменная вне своей области видимости (например, локальная переменная после завершения функции)?
Уникальность имён #
- В каких пределах имя символа уникально — в одном блоке, в одной функции, в одной области видимости?
- Переменные и функции используют общее пространство имён?
- Можно ли скрыть переменную внешней области видимости, объявив переменную с тем же именем?
- Можно ли скрыть имя встроенной функции своей переменной?
- Можно ли скрыть имя встроенного типа данных своей переменной?
Параметры функций #
- Параметры передаются по ссылке или по значению?
- Параметр можно скрыть локальной переменной?
- Параметру можно присвоить значение внутри функции?
- Допускается несовпадение числа формальных и фактических параметров?
- В каком порядке вычисляются выражения, указанные в качестве фактических параметров?
- Функция может заканчиваться без оператора return? В каких случаях?
Рекурсия #
- Поддерживается рекурсия (может ли функция вызывать себя)?
- Поддерживается взаимная рекурсия (могут ли две функции вызывать друг друга)?
Ветвления #
- Какие значения считаются истиной в условиях, а какие — ложью?
- Какая ветка выполняется при истинном условии, какая — при ложном?
- Какой тип должно возвращать выражение в условии ветвления?
- Есть аналог switch..case? Если да, то в нём обязательно завершение метки case?
Циклы #
- До каких пор работает цикл while?
- Есть ли цикл for? Если да, то до каких пор он работает (как работает каждая его часть)?
- Где может располагаться инструкция break? А continue?
- Какой тип должно возвращать выражение в условии цикла?
Остальные правила семантики #
Остальные правила описываются в том случае, когда какие-либо конструкции допустимы на уровне грамматики, но ограничены на уровне семантики. Если грамматика уже запрещает ту или иную конструкцию, то описывать это правилами семантики не нужно.
- Что может быть в левой части присваиваний?
- Можно ли обращаться к неинициализированной переменной?
- Есть ли неизменяемые переменные? Что происходит при попытке присвоить значение такой переменной?