Đối với những ngôn ngữ nào là `cú pháp-ppss` thích hợp?


12

Tôi đã xem xét một cách để phát hiện xem điểm có trong một nhận xét hay không bằng cách xem cách bộ đệm hiện tại được phông chữ.

Smartparens định nghĩa sp-point-in-comment, dựa vào syntax-ppss. Tuy nhiên, dường như syntax-ppssparse-partial-sexpcó thể được sử dụng cho các ngôn ngữ tùy ý, ngay cả khi chúng không sử dụng biểu thức s.

Ví dụ: Python này:

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

Đặt điểm bên trong bình luận và đánh giá (if (nth 4 (syntax-ppss)) 'comment 'not-comment)hoạt động chính xác.

syntax-ppsshoạt động cho bất kỳ chế độ lập trình? Tại sao các tài liệu thảo luận về biểu thức s?


1
Không phải là tôi đã khám phá điều này một cách kỹ lưỡng, nhưng tôi vẫn chưa tìm thấy một ngôn ngữ mà nó không hoạt động. Ngay cả trong các chế độ có nguồn gốc từ văn bản như latex, nó vẫn hoạt động tốt với tôi.
Malabarba

Câu trả lời:


13

Chà, biểu thức s về cơ bản là cú pháp trừu tượng của người Viking, theo nghĩa là chúng chỉ là một cú pháp cụ thể cho các cây cú pháp trừu tượng, và do đó, bất kỳ ngôn ngữ nào cũng có thể được biểu diễn dưới dạng biểu thức s và được xử lý bằng các lệnh biểu thức s. Do đó, syntax-ppssnói về Giới tính Sexps Chỉ đơn giản là cách Lisp để nói về cây cú pháp trừu tượng.

Trên thực tế, mặc dù, syntax-ppssthường không hoạt động cho bất kỳ chế độ. Về cơ bản, nó nhắm mục tiêu vào các ngôn ngữ giống Lisp và nếu ngôn ngữ cụ thể của ngôn ngữ lệch khỏi Sexps quá nhiều, thì sẽ không còn ý nghĩa gì nữa khi sử dụng các lệnh Sexp để thao túng ngôn ngữ. Nó hoạt động, nhưng có một khoảng cách quá lớn giữa biểu diễn trừu tượng và cú pháp cụ thể, điều này sẽ khiến hầu hết các lệnh phản trực giác.

Tuy nhiên, một số cơ sở hạ tầng cơ bản syntax-ppsslà khá chung chung. Các chế độ chính thường cố gắng cắm vào nó, bởi vì nó làm cho chúng hoạt động tốt với nhiều tính năng của Emacs tích hợp và cung cấp giao diện chung cho các gói bên thứ 3 khác như Smartparens.

Đáng chú ý, syntax-ppssdựa vào Bảng cú pháp cho chuỗi và nhận xét. Các bảng cú pháp phân loại các ký tự riêng lẻ theo lớp cú pháp của chúng. Có các lớp cho các dấu phân cách được ghép nối, các dấu phân cách chuỗi và ký tự nhận xét.

Cấu trúc của chuỗi và nhận xét khá giống nhau trong hầu hết các ngôn ngữ lập trình: Chuỗi thường được đặt trong các dấu phân cách đặc biệt. Nhận xét cũng có thể có các dấu phân cách đặc biệt hoặc bắt đầu bằng một ký tự nhất định và kéo dài đến cuối dòng. Các cấu trúc này có thể dễ dàng bị bắt trong các bảng cú pháp và hầu như tất cả các chế độ chính xác định các bảng cú pháp phù hợp, nếu chỉ để kiếm lợi từ việc củng cố cú pháp của Emacs.

Do đó, syntax-ppsshoạt động tốt đối với các chuỗi và nhận xét trong hầu hết mọi ngôn ngữ, nhưng tính hữu dụng và hỗ trợ của các tính năng khác khác.


4

Thêm vào câu trả lời của @ lunaryorn, tôi nghĩ rằng các cú pháp pps chỉ dựa vào sự mạnh mẽ của hệ thống bảng cú pháp của emacs, hoạt động cho nhận xét và chuỗi trong hầu hết các ngôn ngữ. Nhưng nếu ngôn ngữ có cú pháp mà bảng cú pháp không thể nắm bắt được và nếu chế độ không xây dựng trình phân tích cú pháp để thêm thuộc tính cú pháp vào đúng vị trí, syntax-ppsssẽ thất bại.

Hãy thử điều này trong html-mode:

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

và gọi lệnh sau:

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

Chỉ có aa là đúng, nhưng bb cũng nên đúng.

Khi vào nxml-mode, không ai trong số đó trả về đúng, nhưng ít nhất aa phải đúng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.