2 คะแนน โดย GN⁺ 2024-11-03 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

ไวยากรณ์เชิงคำศัพท์ที่แปลกประหลาด

  • เดือนนี้ได้เรียนรู้ภาษาโปรแกรม 42 ภาษาเพื่อสร้างตัวเน้นไวยากรณ์ตัวใหม่สำหรับ llamafile และเนื่องในวันฮาโลวีนจึงอยากแบ่งปันไวยากรณ์ที่น่าทึ่งที่สุด
  • ภาษาที่รองรับได้แก่ Ada, Assembly, BASIC, C, C#, C++, COBOL, CSS, D, FORTH, FORTRAN, Go, Haskell, HTML, Java, JavaScript, Julia, JSON, Kotlin, ld, LISP, Lua, m4, Make, Markdown, MATLAB, Pascal, Perl, PHP, Python, R, Ruby, Rust, Scala, Shell, SQL, Swift, Tcl, TeX, TXT, TypeScript และ Zig

วิธีเขียนตัวเน้นไวยากรณ์

  • การทำตัวเน้นไวยากรณ์ไม่ใช่เรื่องยาก โดย C++ และ GNU gperf เป็นเครื่องมือที่มีประโยชน์
  • gperf สามารถสร้าง perfect hash table เพื่อเพิ่มประสิทธิภาพให้สูงสุดได้
  • ตัวเน้นไวยากรณ์พื้นฐานสามารถทำได้ด้วย finite-state machine โดยเน้นที่สตริง คอมเมนต์ และคีย์เวิร์ด

เดโม

  • ตัวเน้นไวยากรณ์ตัวใหม่ของ llamafile มีข้อได้เปรียบที่ทรงพลังกว่า ollama
  • มีเดโมการสร้างโค้ดในภาษาโปรแกรมต่าง ๆ โดยใช้โมเดล Meta LLaMA 3.2 3B Instruct บน Windows 10

ตัวอย่างไวยากรณ์เชิงคำศัพท์ที่น่าทึ่ง

  • C: แม้ C จะอ้างว่าเรียบง่าย แต่ก็มีองค์ประกอบซับซ้อนอย่าง trigraphs
  • Haskell: อนุญาตให้มีคอมเมนต์แบบซ้อนกันได้
  • Tcl: สามารถใส่เครื่องหมายอัญประกาศไว้ใน identifier ได้
  • JavaScript: มีไวยากรณ์ regular expression และใช้ตัวอักษร UNICODE เป็นอักขระขึ้นบรรทัดใหม่
  • Shell: สามารถใช้ไวยากรณ์ heredoc ได้หลายรูปแบบ
  • String Interpolation: Kotlin, Scala และ TypeScript อนุญาตให้แทรกโค้ดลงในสตริงได้
  • Swift: สามารถล้อมสตริงด้วย # หลายตัวได้
  • C#: สามารถครอบสตริงด้วยเครื่องหมายอัญประกาศหลายตัวได้
  • FORTH: แบ่งทุกอย่างเป็นโทเคนโดยใช้ขอบเขตของช่องว่าง
  • FORTRAN และ COBOL: llamafile รองรับการเน้นไวยากรณ์ของภาษาเหล่านี้
  • Zig: สตริงหลายบรรทัดเริ่มต้นด้วยแบ็กสแลชสองตัว
  • Lua: ใช้วงเล็บเหลี่ยมและเครื่องหมายเท่ากับกับสตริงหลายบรรทัด
  • Assembly: มีหลายสำเนียง ทำให้การเน้นไวยากรณ์ทำได้ยาก
  • Ada: ใช้เครื่องหมายอัญประกาศเดี่ยวได้หลากหลายจุดประสงค์
  • BASIC: ไม่จำเป็นต้องมีเครื่องหมายอัญประกาศปิดท้ายสตริง
  • Perl: มีไวยากรณ์ regular expression ที่เป็นเอกลักษณ์
  • Ruby: ไวยากรณ์ซับซ้อนและเข้าใจได้ยาก

ความซับซ้อนของภาษาที่รองรับ

  • FORTH เป็นภาษาที่ง่ายที่สุด และ Ruby เป็นภาษาที่ซับซ้อนที่สุด
  • ประเมินความซับซ้อนจากจำนวนบรรทัดโค้ดที่ใช้สำหรับการเน้นไวยากรณ์ของแต่ละภาษา

สรุปโดย GN⁺

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

1 ความคิดเห็น

 
GN⁺ 2024-11-03
ความคิดเห็นบน Hacker News
  • หลายภาษา รองรับการแทรกโค้ดภายในสตริง
    • รวมถึง C#, Python, JavaScript, Ruby, Shell และ Make
  • อธิบายลักษณะเฉพาะที่ไม่เหมือนใครของภาษา Tcl
    • แยกโค้ดกับข้อมูลออกจากกันได้ยาก
    • คอมเมนต์อาจถูกตีความเป็นโค้ดได้
  • อธิบายฟีเจอร์สตริงแบบ dollar-quoted ที่สะดวกของ PostgreSQL
    • สามารถเขียนสตริงได้หลายรูปแบบ
  • อธิบายฟีเจอร์ syntax highlighting ของ Vim
    • ใช้การประกาศ match และ region เพื่อทำ syntax highlighting
    • รองรับ syntax highlighting ที่ซับซ้อน
  • อธิบายการทำ lexical analysis แบบขึ้นกับบริบทของภาษา C
    • จำเป็นต้องมี symbol table
    • เพื่อทำ syntax highlighting อาจต้องมีการ parse ทั้งหมดและข้อมูลจาก symbol table
  • อธิบายตัวอย่างสนุก ๆ ของ C trigraph
    • อธิบายกฎ short-circuit เมื่อใช้ตัวดำเนินการตรรกะ ||
  • อธิบายมุมมองต่อไวยากรณ์ของ Lisp
    • ไวยากรณ์ไม่ใช่ส่วนสำคัญของภาษา และควรเรียบง่ายกับสม่ำเสมอ
  • มีความเห็นว่าไวยากรณ์ของ Ruby เข้าใจได้ยาก
  • Unicode escape ของ Java อาจทำให้ syntax highlighting พังได้
    • สามารถใช้ Unicode escape นอกสตริงได้ด้วย
  • สนใจการทำ syntax highlighting ของ Joe
    • สามารถไฮไลต์ Python f-strings ได้อย่างเหมาะสม
  • อธิบายเหตุผลที่ syntax highlighting ของ TeX ทำได้ยาก
    • TeX สามารถนิยามหน้าที่ของอักขระแต่ละตัวใหม่ได้
    • ทำ syntax highlighting แบบสมบูรณ์ไม่ได้