Untuk bahasa apa `syntax-ppss` sesuai?

12

Saya telah mencari cara untuk mendeteksi apakah titik ada di komentar dengan melihat bagaimana buffer saat ini diklasifikasi.

Smartparens mendefinisikan sp-point-in-comment, yang bergantung pada syntax-ppss. Namun, tampaknya itu syntax-ppssdan parse-partial-sexpdapat digunakan untuk bahasa yang arbitrer, bahkan jika mereka tidak menggunakan ekspresi s.

Misalnya, Python ini:

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

Menempatkan titik di dalam komentar dan mengevaluasi (if (nth 4 (syntax-ppss)) 'comment 'not-comment)berfungsi dengan benar.

Apakah syntax-ppssberfungsi untuk mode pemrograman apa pun? Mengapa dokumen membahas ekspresi s?

Wilfred Hughes
sumber
1
Bukannya saya sudah menjelajahinya dengan saksama, tapi saya belum menemukan bahasa yang tidak berfungsi. Bahkan dalam mode yang diturunkan dari teks seperti lateks itu berfungsi dengan baik untuk saya.
Malabarba

Jawaban:

13

Ekspresi s pada dasarnya adalah "sintaksis abstrak", dalam arti bahwa itu hanyalah sintaksis konkret untuk pohon sintaksis abstrak, dan dengan demikian bahasa apa pun dapat direpresentasikan sebagai ekspresi-s, dan dimanipulasi dengan perintah ekspresi-s. Oleh karena itu, syntax-ppssberbicara tentang "Sexps" hanyalah cara Lisp untuk berbicara tentang pohon sintaksis abstrak.

Namun, secara praktis, syntax-ppssumumnya tidak berfungsi untuk mode apa pun. Ini secara fundamental ditargetkan pada bahasa seperti Lisp, dan jika bahasa konkret dari suatu bahasa menyimpang dari Sexps terlalu banyak, tidak masuk akal lagi untuk menggunakan perintah Sexp untuk memanipulasi bahasa. Ini akan berhasil, tetapi akan ada kesenjangan yang terlalu besar antara representasi abstrak dan sintaksis konkret, yang akan membuat sebagian besar perintah kontra-intuitif.

Namun, beberapa infrastruktur yang mendasarinya syntax-ppsscukup generik. Mode utama biasanya berusaha keras untuk menyambungkannya, karena membuatnya bekerja dengan baik dengan banyak fitur bawaan Emacs dan menyediakan antarmuka generik untuk paket pihak ketiga lainnya seperti Smartparens.

Khususnya, syntax-ppssbergantung pada Tabel Sintaks untuk string dan komentar. Tabel Sintaks mengategorikan karakter individu berdasarkan kelas sintaksisnya. Ada kelas untuk pembatas berpasangan, pembatas string dan karakter komentar.

Struktur string dan komentar hampir sama di hampir semua bahasa pemrograman: String biasanya terlampir dalam pembatas khusus. Komentar dapat memiliki pembatas khusus juga, atau mulai dengan karakter tertentu dan meluas hingga akhir baris. Struktur ini dapat dengan mudah ditangkap dalam tabel sintaksis, dan hampir semua mode utama menentukan tabel sintaksis yang sesuai, jika hanya untuk mendapat untung dari fortifikasi sintaksis Emacs.

Oleh karena itu, syntax-ppssberfungsi dengan baik untuk string dan komentar dalam hampir semua bahasa, tetapi dukungan dan "kegunaan" dari fitur lain bervariasi.

lunaryorn
sumber
4

Menambahkan ke jawaban @ lunaryorn, saya pikir sintaks-pps hanya mengandalkan ketahanan sistem tabel sintaks emacs, yang berfungsi untuk komentar dan string dalam kebanyakan bahasa. Tetapi jika bahasa memiliki sintaksis bahwa tabel sintaksis tidak dapat menangkap, dan jika mode tidak membangun parser untuk menambahkan properti sintaksis ke tempat yang tepat, syntax-ppssakan gagal.

Coba ini di html-mode:

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

dan panggil perintah berikut:

(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))

Hanya aa yang benar, tetapi bb juga harus benar.

Ketika masuk nxml-mode, tidak ada yang mengembalikan nilai benar, tetapi setidaknya aa harus benar.

Xah Lee
sumber