ไวยากรณ์เชิงคำศัพท์ที่แปลกประหลาด
- เดือนนี้ได้เรียนรู้ภาษาโปรแกรม 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 ความคิดเห็น
ความคิดเห็นบน Hacker News