แยกวิเคราะห์ไวยากรณ์สองมิติ
พื้นหลัง อลิซและบ็อบกำลังสร้างภาษากอล์ฟเพื่อชนะการท้าทาย PPCG ทุกครั้ง อลิซต้องการสร้างภาษาสองมิติเช่น> <> แต่บ๊อบชอบไวยากรณ์ prefix-infix เหมือนใน J ในการประนีประนอมพวกเขาตัดสินใจที่จะสร้างภาษา prefix-infix สองมิติ โปรแกรมแยกวิเคราะห์เป็นความเจ็บปวดที่จะเขียนและพวกเขาต้องการความช่วยเหลือจากคุณ! ข้อกำหนดทางไวยากรณ์ ในภาษาของอลิซและบ๊อบมีตัวแปรซึ่งเป็นตัวแทนจากตัวอักษร ASCII ตัวพิมพ์เล็กa-zและฟังก์ชั่นA-Zซึ่งจะแทนด้วยตัวอักษรตัวพิมพ์ใหญ่ ASCII สามารถเรียกใช้ฟังก์ชันด้วยหนึ่งหรือสองอาร์กิวเมนต์ โปรแกรมเป็นตารางสี่เหลี่ยมของตัวอักษรa-zA-Zและช่องว่างและมุมบนด้านซ้ายไม่ต้องมีช่องว่าง นี่คือตัวอย่างของโปรแกรมที่ถูกต้อง: F Gy H R x เมื่อโปรแกรมจะแยกกันก็กลายเป็นแสดงออกของภาษาซี (C, Java, Python ... ) ที่มีตัวแปรตัวเดียวและบริการโทรฟังก์ชั่นในรูปแบบที่หรือ<func>(<arg>) <func>(<arg1>,<arg2>)ตัวอย่างเช่นโปรแกรมข้างต้นให้ผลลัพธ์ในนิพจน์นี้: F(H(R(x)),G(x,y)) รายละเอียดของกระบวนการแยกวิเคราะห์เป็นดังนี้: ช่องว่างเป็นเพียงฟิลเลอร์ดังนั้นพวกเขาจึงไม่แยกวิเคราะห์ ตัวแปรทุกตัวa-zจะถูกวิเคราะห์คำเหมือนตัวเองเสมอ ทุกฟังก์ชั่นA-Zจะถูกแยกวิเคราะห์เป็นการเรียกใช้ฟังก์ชัน อาร์กิวเมนต์ของมันคือนิพจน์ที่ใกล้เคียงที่สุดที่อยู่ด้านล่างและทางขวาในกริดตามลำดับนี้ หากมีสิ่งใดสิ่งหนึ่งเหล่านี้อยู่ก็จะได้รับเป็นอาร์กิวเมนต์เพียงอย่างเดียว คุณสามารถสันนิษฐานได้ว่าฟังก์ชั่นทั้งหมดมีอาร์กิวเมนต์อย่างน้อยหนึ่งรายการในตาราง ในตัวอย่างข้างต้นตัวแปรxและการyแยกวิเคราะห์เป็นตัวเอง ฟังก์ชันRไม่มีอะไรด้านล่างและxทางด้านขวาดังนั้นจึงแยกวิเคราะห์เป็นการเรียกใช้อาร์กิวเมนต์R(x)เดียว ในทำนองเดียวกันHจะแยกเป็นH(R(x))เพราะมันมีRด้านล่าง ฟังก์ชั่นGที่มีxอยู่ด้านล่างและyไปทางขวาของตนเพื่อให้มันแยกวิเคราะห์เป็นและในทำนองเดียวกันสำหรับG(x,y) Fการแยกวิเคราะห์นิพจน์ที่มุมซ้ายบนเป็นผลลัพธ์ของกระบวนการแยกวิเคราะห์ อินพุตและเอาต์พุต การป้อนข้อมูลของคุณเป็นอาร์เรย์อักขระที่ไม่ว่างเปล่า …