`ไวยากรณ์ -ppss 'เหมาะสมกับภาษาใด


12

ฉันได้รับการตรวจสอบวิธีการตรวจสอบว่าจุดอยู่ในความคิดเห็นโดยดูว่าบัฟเฟอร์ปัจจุบันเป็นแบบอักษร

Smartparens กำหนดซึ่งอาศัยsp-point-in-comment syntax-ppssอย่างไรก็ตามดูเหมือนว่าsyntax-ppssและparse-partial-sexpสามารถใช้สำหรับภาษาใดก็ได้แม้ว่าพวกเขาจะไม่ใช้ s-expressions

ตัวอย่างเช่น Python นี้:

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

วางจุดภายในความคิดเห็นและประเมินผลการ(if (nth 4 (syntax-ppss)) 'comment 'not-comment)ทำงานอย่างถูกต้อง

ใช้syntax-ppssงานได้กับโหมดการเขียนโปรแกรมใด ๆ หรือไม่? ทำไมเอกสารถึงพูดถึง s-expressions


1
ไม่ใช่ว่าฉันได้สำรวจอย่างละเอียด แต่ฉันยังไม่พบภาษาที่ใช้ไม่ได้ แม้ในโหมดที่ได้จากข้อความเช่นลาเท็กซ์มันใช้ได้ดีสำหรับฉัน
Malabarba

คำตอบ:


13

เอส - นิพจน์เป็นหลัก "ไวยากรณ์นามธรรม" ในแง่ที่ว่าพวกเขาเป็นเพียงไวยากรณ์ที่เป็นรูปธรรมสำหรับต้นไม้ไวยากรณ์ที่เป็นนามธรรมและทำให้ภาษาใด ๆ ที่สามารถเป็นตัวแทนของการแสดงออก s- และจัดการกับคำสั่ง s-expression ดังนั้นการsyntax-ppssพูด“ Sexps” จึงเป็นวิธีที่กระเพื่อมพูดคุยเกี่ยวกับต้นไม้ไวยากรณ์ที่เป็นนามธรรม

แม้ว่าsyntax-ppssโดยทั่วไปจะไม่สามารถใช้งานได้กับโหมดใด ๆ มันมีการกำหนดเป้าหมายพื้นฐานในภาษาที่เหมือนเสียงกระเพื่อมและหากภาษาที่เป็นรูปธรรมของภาษาเบี่ยงเบนจาก Sexps มากเกินไปก็ไม่สมเหตุสมผลอีกต่อไปที่จะใช้คำสั่ง Sexp เพื่อจัดการภาษา มันใช้งานได้ แต่จะมีช่องว่างขนาดใหญ่เกินไประหว่างการแสดงนามธรรมและไวยากรณ์ที่เป็นรูปธรรมซึ่งจะทำให้คำสั่งส่วนใหญ่ตอบโต้ได้ง่าย

อย่างไรก็ตามโครงสร้างพื้นฐานบางส่วนของsyntax-ppssนั้นค่อนข้างทั่วไป โดยทั่วไปแล้วโหมดหลัก ๆ จะพยายามอย่างหนักที่จะเสียบเข้ากับมันเพราะมันทำงานได้ดีกับคุณสมบัติของ Emacs ที่มีอยู่มากมายและให้อินเทอร์เฟซทั่วไปสำหรับแพ็คเกจบุคคลที่สามอื่น ๆ เช่น Smartparens

โดยเฉพาะอย่างยิ่งsyntax-ppssอาศัยSyntax Tablesสำหรับสตริงและความคิดเห็น ตารางไวยากรณ์จัดหมวดหมู่อักขระแต่ละตัวตามคลาสวากยสัมพันธ์ของพวกเขา มีคลาสสำหรับตัวคั่นคู่ตัวคั่นสตริงและอักขระข้อคิดเห็น

โครงสร้างของสตริงและความคิดเห็นมีความคล้ายคลึงกันในเกือบทุกภาษาการเขียนโปรแกรม: Strings มักจะอยู่ในตัวคั่นพิเศษ ความคิดเห็นสามารถมีตัวคั่นพิเศษเช่นกันหรือเริ่มต้นด้วยตัวอักษรบางตัวและขยายไปจนถึงจุดสิ้นสุดของบรรทัด โครงสร้างเหล่านี้สามารถจับภาพได้อย่างง่ายดายในตารางไวยากรณ์และเกือบทุกโหมดหลักจะกำหนดตารางไวยากรณ์ที่เหมาะสมหากเพียงเพื่อผลกำไรจากการเสริมสร้างความเข้มแข็งทางไวยากรณ์ของ Emacs

ดังนั้นsyntax-ppssทำงานได้ดีสำหรับสตริงและความคิดเห็นในเกือบทุกภาษา แต่การสนับสนุนและ "ประโยชน์" ของคุณสมบัติอื่น ๆ นั้นแตกต่างกันไป


4

การเพิ่มคำตอบของ @ lunaryorn ฉันคิดว่า syntax-ppss พึ่งความแข็งแกร่งของระบบตาราง syntax ของ 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แล้วจะไม่มีการคืนค่าใด ๆ แต่อย่างน้อยก็ควรเป็นจริง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.