Внутреннее устройство таблиц синтаксиса
Таблицы синтаксиса реализованы как таблицы символов (см. Таблицы символов), но большинство программ Lisp не работают напрямую с их элементами. Таблицы синтаксиса не хранят данные синтаксиса как описатели синтаксиса (см. Описание синтаксиса); они используют внутренний формат, который документирован в этом разделе. Этот внутренний формат также может быть присвоен как свойства синтаксиса (см. Свойства синтаксиса).
Каждый элемент в таблице синтаксиса — это необработанный описатель синтаксиса: ячейка cons вида (syntax-code
. matching-char). syntax-code — это целое число, которое кодирует класс синтаксиса и флаги синтаксиса в соответствии с таблицей ниже. matching-char, если не nil, указывает соответствующий символ (аналогично второму символу в описателе синтаксиса).
Используйте aref (см. Функции массивов), чтобы получить необработанный описатель синтаксиса символа, например, (aref (syntax-table) ch).
Вот коды синтаксиса, соответствующие различным классам синтаксиса:
| Код | Класс | Код | Класс |
| 0 | пробелы | 8 | символ парного разделителя |
| 1 | знаки препинания | 9 | экранирование |
| 2 | слово | 10 | кавычки символа |
| 3 | символ | 11 | начало комментария |
| 4 | открывающая скобка | 12 | конец комментария |
| 5 | закрывающая скобка | 13 | наследование |
| 6 | префикс выражения | 14 | общий комментарий |
| 7 | кавычки строки | 15 | общая строка |
Например, в стандартной таблице синтаксиса запись для ‘(’ равна (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находится вне доступной части буфера, не вызывая ошибок и не возвращая некорректный код.
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Syntax-Table-Internals.html