24.8.1.4 Определение токенов

SMIE поставляется с предопределенным лексическим анализатором, который использует таблицы синтаксиса следующим образом: любая последовательность символов, имеющая синтаксис слова или символа, считается токеном, как и любая последовательность символов, имеющая синтаксис пунктуации. Этот лексический анализатор по умолчанию часто является хорошей отправной точкой, но редко бывает действительно правильным для любого данного языка. Например, он будет считать "2,+3" состоящим из 3 токенов: "2", ",+" и "3".

Чтобы описать правила лексического анализа вашего языка для SMIE, вам нужно 2 функции: одна для получения следующего токена и другая для получения предыдущего токена. Эти функции обычно сначала пропускают пробелы и комментарии, а затем смотрят на следующий фрагмент текста, чтобы определить, является ли он специальным токеном. Если да, то следует пропустить токен и вернуть описание этого токена. Обычно это просто строка, извлеченная из буфера, но это может быть что угодно, что вы захотите. Например:

(defvar sample-keywords-regexp
  (regexp-opt '("+" "*" "," ";" ">" ">=" "<" "<=" ":=" "=")))
(defun sample-smie-forward-token ()
  (forward-comment (point-max))
  (cond
   ((looking-at sample-keywords-regexp)
    (goto-char (match-end 0))
    (match-string-no-properties 0))
   (t (buffer-substring-no-properties
       (point)
       (progn (skip-syntax-forward "w_")
              (point))))))
(defun sample-smie-backward-token ()
  (forward-comment (- (point)))
  (cond
   ((looking-back sample-keywords-regexp (- (point) 2) t)
    (goto-char (match-beginning 0))
    (match-string-no-properties 0))
   (t (buffer-substring-no-properties
       (point)
       (progn (skip-syntax-backward "w_")
              (point))))))

Обратите внимание, как эти лексические анализаторы возвращают пустую строку, когда находятся перед скобками. Это потому, что SMIE автоматически обрабатывает скобки, определенные в таблице синтаксиса. Более конкретно, если лексический анализатор возвращает nil или пустую строку, SMIE пытается обработать соответствующий текст как sexp в соответствии с таблицами синтаксиса.