ฉันเพิ่งทำภารกิจการเขียนภาษาโปรแกรมสแต็ก ก่อนที่ฉันจะเริ่มออกแบบภาษาของฉัน แต่ฉันคิดว่ามันเป็นความคิดที่ดีที่จะอ่านและทดลองใช้ภาษาที่มีอยู่เดิม
นี่นำฉันมาที่หัวข้อของโพสต์นี้ ฉันอ่านบทความวิกิพีเดียใน Forthซึ่งเป็นภาษาที่ใช้สแต็กซึ่งใช้การแสดงออกสไตล์ postfix ในบทความฉันเห็นข้อความต่อไปนี้:
ความยืดหยุ่นของ Forth ทำให้ไวยากรณ์ BNF คงที่ไม่เหมาะสมและไม่มีคอมไพเลอร์เสาหิน การขยายคอมไพเลอร์เพียงต้องการเขียนคำใหม่แทนที่จะแก้ไขไวยากรณ์และเปลี่ยนการใช้งานพื้นฐาน
จากความเข้าใจของฉันในศัพท์แสง Forth คำว่า "คำว่า" ดูเหมือนจะตรงกันกับ "subroutine" ด้วยสิ่งนี้ข้อความข้างต้นดูเหมือนแปลก ทำไมความสามารถในการสร้างฟังก์ชั่นใหม่ใน Forth จึงทำให้ไวยากรณ์เป็นทางการสำหรับ Forth ไม่เหมาะสม? ทำไมคุณต้องเขียนไวยากรณ์ใหม่สำหรับแต่ละรูทีนย่อยใหม่ที่คุณกำหนด การเขียนคำศัพท์ใหม่ในสภาพแวดล้อมประกอบด้วยการขยายคอมไพเลอร์อย่างไร ข้อความข้างต้นดูเหมือนจะคล้ายกับว่าไวยากรณ์อย่างเป็นทางการไม่เหมาะสมสำหรับ Python เพราะคุณสามารถกำหนดฟังก์ชั่นใหม่ได้
ในความเป็นจริงฉันตัดสินใจที่จะพยายามเขียนไวยากรณ์สไตล์ BNF สำหรับชุดย่อยง่ายๆของ Forth ด้านล่าง:
program ::= stmt+
stmt ::= func | expr
func ::= ':' expr+ ';'
expr ::= INTEGER | word
word ::= ('+' | '-' | '*' | '/' )
ไวยากรณ์ข้างต้นดูเหมือนจะครอบคลุมชุดย่อยที่ถูกต้องของคำสั่ง Forth และดูเหมือนว่าไม่ยากที่จะขยายเพื่อให้ครอบคลุมคำสั่งที่ถูกต้องทั้งหมดในภาษา Forth นอกจากนี้หากตัวแยกวิเคราะห์ของคอมไพเลอร์ใช้ไวยากรณ์ข้างต้นฉันล้มเหลวในการดูว่าคอมไพเลอร์จะขยายได้อย่างไร คอมไพเลอร์ก็จะเพิ่มคำใหม่ ๆ ไปของสภาพแวดล้อม มีการเปลี่ยนแปลงสภาพแวดล้อมเท่านั้น ดูเหมือนว่าข้อความที่ตัดตอนมาจากวิกิพีเดียข้างต้นกำลังทำให้เกิดความสับสนกับโค้ดที่ขีดเส้นใต้ซึ่งรวบรวมคอมไพเลอร์ (ซึ่งไม่เปลี่ยนแปลง) กับสภาพแวดล้อมของคอมไพเลอร์ (ซึ่งเปลี่ยนแปลง)
โดยสรุปเหตุใด ablitiy ของ Forth จึงกำหนดคำศัพท์ใหม่ (รูทีนย่อย) ทำให้ไม่เหมาะสมสำหรับไวยากรณ์ที่เขียน