Для яких мов підходить `syntax-ppss`?


12

Я розглядав спосіб визначення того, чи є точка на коментарі, дивлячись, як поточний буфер визначений.

Smartparens визначає sp-point-in-comment, на що спирається syntax-ppss. Тим НЕ менше, здається , що syntax-ppssі parse-partial-sexpможе бути використано для будь-яких мов, навіть якщо вони не використовують S-вирази.

Наприклад, цей Python:

x = 1
# I'm a comment
y = 2

Розміщення точки в коментарі та оцінка (if (nth 4 (syntax-ppss)) 'comment 'not-comment)роботи працює правильно.

Чи syntax-ppssпрацює в будь-якому режимі програмування? Чому в документах обговорюються s-вирази?


1
Не те, щоб я все це ґрунтовно дослідив, але я ще не знайшов мови, на якій це не працює. Навіть у текстових режимах, таких як латекс, для мене це добре працює.
Малабарба

Відповіді:


13

Ну, s-вирази по суті є "абстрактним синтаксисом", в тому сенсі, що вони є лише конкретним синтаксисом для абстрактних синтаксичних дерев, і тому будь-яка мова може бути представлена ​​як s-вирази та маніпулювати командами s-вираження. Отже, syntax-ppssговорити про "Sexps" - це просто Lisp спосіб говорити про абстрактні синтаксичні дерева.

Практично, однак, syntax-ppssяк правило, не працює для жодного режиму. Він в основному орієнтований на мови, схожі на Lisp, і якщо конкретна мова мови занадто сильно відхиляється від Sexps, більше не має сенсу використовувати команди Sexp для маніпулювання мовою. Це спрацювало б, але був би занадто великий розрив між абстрактним поданням та конкретним синтаксисом, який би робив більшість команд контрінтуїтивними.

Однак частина базової інфраструктури Росії syntax-ppssє загальною. Основні режими, як правило, дуже важко підключаються до нього, оскільки вони змушують їх добре працювати з багатьма вбудованими функціями Emacs та забезпечує загальний інтерфейс для інших сторонніх пакетів, таких як Smartparens.

Зокрема, для рядків та коментарів syntax-ppssпокладається на синтаксичні таблиці . Синтаксичні таблиці класифікують окремих символів за їх синтаксичним класом. Є класи для парних роздільників, розділових рядків та символів коментарів.

Структура рядків та коментарів досить схожа майже у всіх мовах програмування: рядки зазвичай укладені в спеціальні роздільники. У коментарях також можуть бути спеціальні роздільники, або починати з певного символу і поширюватися до кінця рядка. Ці структури можна легко зафіксувати в синтаксичних таблицях, і майже всі основні режими визначають відповідні таблиці синтаксису, якщо тільки отримати прибуток від синтаксичного фортифікації Emacs.

Отже, syntax-ppssдобре працює для рядків та коментарів майже будь-якою мовою, але підтримка та «корисність» інших функцій різняться.


4

Додаючи відповідь @ lunaryorn, я думаю, що синтаксис-ppss просто покладається на надійність системи синтаксису таблиць синтаксису emacs, яка працює для коментарів і рядків на більшості мов. Але якщо мова має синтаксис, таблиця синтаксису не може захопити, і якщо режим не створив аналізатор, щоб додати властивості синтаксису до потрібних місць, syntax-ppssце не вдасться.

Спробуйте це html-mode:

<p class="aa" id='bb'>"cc" 'dd'</p>

і викликайте таку команду:

(defun inside-string-p (&optional pos)
  "Return non-nil if inside string, else nil.
This depends on major mode having setup syntax table properly."
  (interactive)
  (let ((result (nth 3 (syntax-ppss pos))))
    (print result)
    result))

Тільки aa є правдою, але bb також має бути правдою.

Коли в nxml-mode, жодне з них не повертає істину, але принаймні аа має бути правдою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.