Этот справочник поможет проверить запись токена и понять ошибку чтения. Считыватель проверяет запись исходного текста, после чего нормализатор проверяет структуру выражений.
Сравните знаки и строки
Сохраните эту программу целиком в reader-grammar.lspx. Запустите её через Native CLI.
(list #\a #\x41 "\x41;" #true)lispex run reader-grammar.lspxСтандартный вывод.
(#\a #\A "A" #t)Код завершения равен 0, стандартный поток ошибок пуст, новые файлы не создаются. Первые два элемента имеют тип знака, третий имеет тип строки. #true имеет то же значение, что #t, а #false имеет то же значение, что #f.
Знаки и экранирование в строках
Запись знака начинается с #\. Далее укажите один скаляр Unicode, шестнадцатеричный код вроде x41 или одно из имён ниже. Скаляром Unicode называют кодовую точку Unicode, кроме суррогатных.
Допустимы четырнадцать имён знаков. space, newline, linefeed, tab, return, null, nul, delete, rubout, escape, esc, backspace, alarm и page.
Строки заключаются в двойные кавычки. Внутри строки допустимы шесть форм экранирования.
| Запись | Значение |
|---|---|
\" | двойная кавычка |
\\ | обратная косая черта |
\n | перевод строки |
\t | табуляция |
\r | возврат каретки |
\xHEX; | скаляр Unicode, записанный одной или несколькими шестнадцатеричными цифрами |
Неверные экранирующие последовательности, в том числе \a, дают E150. Неверное имя знака или значение скаляра также даёт E150.
В строке запись \x41; заканчивается точкой с запятой. Знак #\x41 заканчивается перед разделителем или в конце ввода. Точка с запятой после знака начинает строчный комментарий. Поэтому #\x41; читается как #\A, за которым следует комментарий.
Числа
| Токен | Допустимая форма | Возможные ошибки |
|---|---|---|
| целое | -?(0|[1-9][0-9]*) | ведущий ноль, как в 01, даёт E100 |
| рациональное | целый числитель, / и знаменатель вида [1-9][0-9]* | нулевой, отрицательный знаменатель или ведущий ноль дают E100 |
| вещественное | десятичная запись с дробной частью, экспонентой или обеими | 1. даёт E100, выход за конечный диапазон даёт E314 |
В этих шаблонах ? означает необязательную часть, * означает ноль или больше повторений, + означает одно или больше. Квадратные скобки задают диапазон цифр, а | разделяет варианты.
Полный шаблон вещественного числа имеет вид -?(0|[1-9][0-9]*)(\.[0-9]+)?([eE][-+]?[0-9]+)?. Обязательна хотя бы дробная часть или экспонента. По обе стороны десятичной точки нужны цифры.
Рациональные числа сокращаются при чтении, поэтому 4/2 становится точным целым 2. Записи целых, рациональных и вещественных чисел различаются.
Ведущий + создаёт имя. Например, (define +5 7) связывает имя +5 со значением 7. Префиксы системы счисления и точности #x, #b, #o, #e и #i дают E100.
Имена, списки и цитирование
Имена различают регистр. Имена Unicode обрабатываются как записаны, без нормализации. Имя вроде alpha читается как символ. Правила использования имён в коде описаны в разделе «Зарезервированные и запрещённые имена».
| Запись | Значение |
|---|---|
(a b) | список |
(a . b) | пара с хвостом b |
#(1 2) | вектор |
#u8(1 2) | байтовый вектор |
'x | (quote x) |
`x | (quasiquote x) |
,x | (unquote x) |
,@x | (unquote-splicing x) |
Считыватель распознаёт префиксы цитирования. Допустимые места для снятия цитирования проверяет нормализатор.
Списки заключаются в ( и ). Квадратные и фигурные скобки дают E100. Точка отделяет хвост только перед разделителем. Имена ... и .foo остаются символами. Точка внутри вектора, как в #(1 . 2), даёт E100.
Элементы байтового вектора должны быть целыми литералами от 0 до 255. Считыватель отклоняет #u8(4/2) с E100, хотя значение 4/2 равно 2. Незакрытые разделители и неверное положение точки также проверяются при чтении.
Пробелы, комментарии и позиции
Пробелы разделяют токены. Точка с запятой начинает строчный комментарий, а #| ... |# ограничивает блочный. Блочные комментарии допускают вложение. Комментарии к данным #; и директивы #lang считыватель отклоняет с E120.
Диагностика указывает входной текст, строку и столбец. Строки и столбцы считаются с единицы. Порядок чтения, нормализации и вычисления описан в главе «Исходный текст, токены и чтение».