36.7 Внутреннее устройство таблиц синтаксиса

Таблицы синтаксиса реализованы как char-tables (см. Char-Tables), но большинство программ на Lisp не работают напрямую с их элементами. Таблицы синтаксиса не хранят синтаксические данные в виде синтаксических дескрипторов (см. Синтаксические дескрипторы); они используют внутренний формат, который описан в этом разделе. Этот внутренний формат также может быть назначен в качестве синтаксических свойств (см. Синтаксические свойства).

Каждая запись в таблице синтаксиса — это сырой синтаксический дескриптор: cons-ячейка вида (syntax-code . matching-char). syntax-code — это целое число, которое кодирует класс синтаксиса и флаги синтаксиса в соответствии с таблицей ниже. matching-char, если не nil, указывает соответствующий символ совпадения (подобно второму символу в синтаксическом дескрипторе).

Используйте aref (см. Функции, работающие с массивами), чтобы получить сырой синтаксический дескриптор символа, например (aref (syntax-table) ch).

Ниже приведены коды синтаксиса, соответствующие различным классам синтаксиса:

КодКлассКодКласс
0whitespace8paired delimiter
1punctuation9escape
2word10character quote
3symbol11comment-start
4open parenthesis12comment-end
5close parenthesis13inherit
6expression prefix14generic comment
7string quote15generic string

Например, в стандартной таблице синтаксиса запись для ‘(’ составляет (4 . 41). 41 — это код символа для ‘)’.

Флаги синтаксиса кодируются в старших битах, начиная с 16-го бита от наименее значащего бита. Эта таблица показывает степень двойки, соответствующую каждому флагу синтаксиса.

ПрефиксФлагПрефиксФлаг
‘1’(ash 1 16)‘p’(ash 1 20)
‘2’(ash 1 17)‘b’(ash 1 21)
‘3’(ash 1 18)‘n’(ash 1 22)
‘4’(ash 1 19)‘c’(ash 1 23)
Функция: string-to-syntax desc

Принимая синтаксический дескриптор desc (строку), эта функция возвращает соответствующий сырой синтаксический дескриптор.

Функция: syntax-class-to-char syntax

Принимая сырой синтаксический дескриптор syntax (целое число), эта функция возвращает соответствующий синтаксический дескриптор (символ).

Функция: syntax-after pos

Эта функция возвращает сырой синтаксический дескриптор для символа в буфере после позиции pos, учитывая синтаксические свойства, а также таблицу синтаксиса. Если pos находится за пределами доступной части буфера (см. доступная часть), возвращаемое значение равно nil.

Функция: syntax-class syntax

Эта функция возвращает код синтаксиса для сырого синтаксического дескриптора syntax. Точнее, она извлекает компонент syntax-code сырого синтаксического дескриптора, маскирует старшие 16 бит, которые хранят флаги синтаксиса, и возвращает полученное целое число.

Если syntax равно nil, возвращаемое значение равно nil. Это так, чтобы выражение

(syntax-class (syntax-after pos))

оценивалось как nil, если pos находится за пределами доступной части буфера, без выдачи ошибок или возврата некорректного кода.