किस भाषा के लिए `वाक्यविन्यास-ppss` उपयुक्त है?


12

मैं यह पता लगाने का एक तरीका देख रहा हूं कि क्या वर्तमान बफ़र को फ़ॉन्ट द्वारा टिप्पणी पर कोई बिंदु है।

स्मार्टप्रेन परिभाषित करता है sp-point-in-comment, जो पर निर्भर करता है syntax-ppss। हालाँकि, ऐसा लगता है कि syntax-ppssऔर parse-partial-sexpमनमाना भाषाओं के लिए इस्तेमाल किया जा सकता है, भले ही वे एस-एक्सप्रेशन का उपयोग न करें।

उदाहरण के लिए, यह पायथन:

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

टिप्पणी के अंदर बिंदु रखने और (if (nth 4 (syntax-ppss)) 'comment 'not-comment)सही ढंग से काम करने का मूल्यांकन करता है।

किसी syntax-ppssभी प्रोग्रामिंग मोड के लिए काम करता है? डॉकस्ट्रिंग्स एस-एक्सप्रेशन की चर्चा क्यों करते हैं?


1
ऐसा नहीं है कि मैंने इसे अच्छी तरह से समझा है, लेकिन मुझे अभी तक ऐसी भाषा नहीं मिल रही है जिसमें यह काम न करे। यहां तक ​​कि पाठ-व्युत्पन्न मोड जैसे कि लेटेक्स में यह मेरे लिए ठीक काम करता है।
मालाबार

जवाबों:


13

ठीक है, एस-एक्सप्रेशंस अनिवार्य रूप से "एब्सट्रैक्ट सिंटैक्स" हैं, इस अर्थ में कि वे एब्सट्रैक्ट सिंटैक्स पेड़ों के लिए केवल एक ठोस वाक्यविन्यास हैं, और इस प्रकार किसी भी भाषा को एस-एक्सप्रेशन के रूप में दर्शाया जा सकता है, और एस-एक्सप्रेशन कमांड के साथ हेरफेर किया जा सकता है। इसलिए, syntax-ppss"सेक्सप्स" बोलना अमूर्त सिंटैक्स पेड़ों के बारे में बात करने के लिए बस लिस्प तरीका है।

व्यावहारिक रूप से, हालांकि, syntax-ppssआमतौर पर किसी भी मोड के लिए काम नहीं करता है। यह मूल रूप से लिस्प जैसी भाषाओं को लक्षित करता है, और अगर किसी भाषा की ठोस भाषा सेक्सप से बहुत अधिक विचलित हो जाती है, तो भाषा में हेरफेर करने के लिए सेक्सप कमांड का उपयोग करने का कोई मतलब नहीं है। यह काम करेगा, लेकिन अमूर्त प्रतिनिधित्व और कंक्रीट सिंटैक्स के बीच बहुत बड़ा अंतर होगा, जो अधिकांश आदेशों को काउंटर-सहज बना देगा।

हालांकि, कुछ अंतर्निहित बुनियादी ढाँचा syntax-ppssकाफी सामान्य है। प्रमुख मोड आम तौर पर इसे प्लग करने के लिए कड़ी मेहनत करते हैं, क्योंकि यह उन्हें कई अंतर्निहित एमएसीएस सुविधाओं के साथ अच्छी तरह से काम करता है और स्मार्टप्रेन जैसे अन्य 3 पार्टी पैकेजों के लिए एक सामान्य इंटरफ़ेस प्रदान करता है।

विशेष रूप से, स्ट्रिंग्स और टिप्पणियों के लिए सिंटैक्स टेबल्सsyntax-ppss पर निर्भर करता है । सिंटेक्स टेबल्स अपने वर्णनात्मक वर्ग द्वारा अलग-अलग वर्णों को वर्गीकृत करते हैं। युग्मित सीमांकक, स्ट्रिंग परिसीमन और टिप्पणी पात्रों के लिए कक्षाएं हैं।

स्ट्रिंग्स और टिप्पणियों की संरचना लगभग सभी प्रोग्रामिंग भाषाओं में काफी समान है: स्ट्रिंग्स आमतौर पर विशेष सीमांकक में संलग्न हैं। टिप्पणियों में विशेष सीमांकक भी हो सकते हैं, या एक निश्चित चरित्र के साथ शुरू हो सकते हैं और लाइन के अंत तक बढ़ सकते हैं। इन संरचनाओं को आसानी से सिंटैक्स तालिकाओं में कैद किया जा सकता है, और लगभग सभी प्रमुख मोड उपयुक्त सिंटैक्स तालिकाओं को परिभाषित करते हैं, यदि केवल एमएसीएस के सिंटैक्टिक किलेबंदी से लाभ के लिए।

इसलिए, syntax-ppssलगभग किसी भी भाषा में तार और टिप्पणियों के लिए अच्छी तरह से काम करता है, लेकिन अन्य विशेषताओं का समर्थन और "उपयोगिता" भिन्न होता है।


4

@ Lunaryorn के उत्तर में जोड़ते हुए, मुझे लगता है कि सिंटैक्स-पीपीएस सिर्फ 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))

केवल आ सच है, लेकिन बीब भी सच होना चाहिए।

जब nxml-mode, इसमें से कोई भी सच नहीं है, लेकिन कम से कम आ सच होना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.