Spec-Zone.ru › Elisp

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

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

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/SMIE-Lexer.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API