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 в соответствии с таблицами синтаксиса.