Hangi sözdizimi pps'leri uygundur?


12

Geçerli arabellek fontified bakarak bir yorum üzerinde nokta olup olmadığını tespit etmek için bir yol bakıyordum.

Smartparens sp-point-in-comment, hangisine bağlı olduğunu tanımlar syntax-ppss. Bununla birlikte, s-ifadeleri kullanmasalar bile keyfi diller için kullanılabilir syntax-ppssve parse-partial-sexpkullanılabilir.

Örneğin, bu Python:

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

Yorumun içine nokta yerleştirme ve değerlendirme (if (nth 4 (syntax-ppss)) 'comment 'not-comment)doğru çalışır.

syntax-ppssHerhangi bir programlama modu için çalışır mı ? Öğretiler neden s ifadelerini tartışıyor?


1
Bunu iyice araştırdığımdan değil, henüz işe yaramadığı bir dil bulamadım. Lateks gibi metin türetilmiş modlarda bile benim için iyi çalıştı.
Malabarba

Yanıtlar:


13

Aslında, s-ifadeleri, soyut sözdizimi ağaçları için yalnızca somut bir sözdizimi olmaları bakımından temelde “soyut sözdizimi” dir ve bu nedenle herhangi bir dil, s ifadeleri olarak temsil edilebilir ve s-ifadesi komutlarıyla manipüle edilebilir. Dolayısıyla syntax-ppss“Sexps” den bahsetmek Lisp'in soyut sözdizimi ağaçları hakkında konuşmanın basit bir yoludur.

Bununla birlikte, pratik olarak, syntax-ppssgenellikle herhangi bir mod için çalışmaz. Temelde Lisp benzeri dilleri hedefliyor ve bir dilin somut dili Sexps'ten çok farklıysa, dili manipüle etmek için Sexp komutlarını kullanmak artık bir şey ifade etmiyor. İşe yarardı, ancak soyut temsil ile somut sözdizimi arasında çok büyük bir boşluk olurdu, bu da çoğu komutun sezgisel olmasını sağlayacaktır.

Ancak, altta yatan altyapının bir syntax-ppsskısmı oldukça geneldir. Ana modlar genellikle takmak için çok uğraşır, çünkü birçok yerleşik Emacs'ın özellikleriyle iyi çalışır ve Smartparens gibi diğer 3. taraf paketleri için genel bir arayüz sağlar.

Özellikle, dizeler ve yorumlar için Sözdizimi Tablolarınasyntax-ppss dayanır . Sözdizimi Tabloları, tek tek karakterleri sözdizimsel sınıflarına göre sınıflandırır. Eşlenmiş sınırlayıcılar, dize sınırlayıcıları ve yorum karakterleri için sınıflar vardır.

Dizelerin ve yorumların yapısı hemen hemen tüm programlama dillerinde oldukça benzerdir: Dizeler normalde özel sınırlayıcılarla çevrelenir. Yorumlar da özel sınırlayıcılara sahip olabilir veya belirli bir karakterle başlayıp satırın sonuna kadar uzanabilir. Bu yapılar, sözdizimi tablolarında kolayca yakalanabilir ve neredeyse tüm büyük modlar, yalnızca Emacs'ın sözdizimsel takviyesinden faydalanmak için uygun sözdizimi tablolarını tanımlar.

Bu nedenle, syntax-ppssneredeyse her dilde dizeler ve yorumlar için iyi çalışır, ancak diğer özelliklerin desteği ve "kullanışlılığı" değişir.


4

@ Lunaryorn'un cevabına ek olarak, sözdizimi-pps'lerinin sadece çoğu dilde yorum ve dizgi için çalışan emacs sözdizimi tablo sisteminin sağlamlığına güvendiğini düşünüyorum. Ancak dil sözdizimi tablosunun yakalayamayacağı bir sözdizimine sahipse ve mod doğru yerlere sözdizimi özellikleri eklemek için bir ayrıştırıcı oluşturmazsa syntax-ppssbaşarısız olur.

Şunu deneyin html-mode:

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

ve aşağıdaki komutu çağırınız:

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

Sadece aa doğrudur, ama bb de doğru olmalıdır.

İçindeyken nxml-modehiçbiri doğru değil, ama en azından aa doğru olmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.