นี่คือการปรับรูปแบบของโปรแกรมไวยากรณ์หรือไม่ หน้าที่แล้วถามโดยVagและคำแนะนำมากมายจากผู้แสดงความคิดเห็น
ไวยากรณ์สามารถมองว่าเป็นการระบุรูปแบบการคำนวณได้อย่างไร ตัวอย่างเช่นถ้าเราใช้ไวยากรณ์ที่ไม่มีบริบทอย่างเช่น
G ::= '1' -> '0' '+' '1'
'1' -> '1' '+' '0'
'2' -> '2' '+' '0'
'2' -> '1' '+' '1'
'2' -> '0' '+' '2'
'3' -> '3' '+' '0'
'3' -> '2' '+' '1'
'3' -> '1' '+' '2'
'3' -> '1' '+' '2'
สมมติว่า parser ไม่แยกความแตกต่างระหว่างสัญลักษณ์เทอร์มินัลและไม่ใช่เทอร์มินัลตามที่ฉันได้แสดงไว้ที่นี่จากนั้นก็เป็นไปได้ที่จะดำเนินการทางคณิตศาสตร์อย่างง่ายสำหรับตัวเลขสูงสุด 3
ตัวอย่างเช่นใช้สตริง
"2 + 0 + 1"
การรันตัวแยกวิเคราะห์ LR (1) บนสตริงนี้ควรให้โครงสร้างไวยากรณ์ที่เป็นรูปธรรมต่อไปนี้แก่เราซึ่งผลลัพธ์ของการคำนวณถูกเก็บไว้ที่รากของต้นไม้:
'3'
/ | \
/ | \
'2' '+' '1'
/ | \
/ | \
'2' '+' '0'
ดังนั้นถ้าเราใช้ไวยากรณ์เป็นโปรแกรมและตัวแยกวิเคราะห์เป็นคอมไพเลอร์เราจะเห็นภาษาสเปคไวยากรณ์เป็นภาษาโปรแกรมหรือไม่?
นอกจากนี้เราสามารถสร้างโปรแกรมทัวริงที่สมบูรณ์โดยการระบุไวยากรณ์คล้ายกับวิธีที่คุณสามารถสร้างโปรแกรมทัวริงที่สมบูรณ์ด้วยcelullar automataหรือlambda แคลคูลัสได้ไหม
ในคำอื่น ๆ ก็เป็นที่รู้จักกันว่าในแง่ของการรับรู้ภาษาภาษาปกติตรงกับออสถานะ จำกัด , ภาษาบริบทตรงตามลักษณะที่กดลงออโตและภาษาบริบทสอดคล้องกับเส้นตรงออโต จำกัด อย่างไรก็ตามถ้าเราดูที่ไวยากรณ์เป็นอุปกรณ์การคำนวณ (เช่นโปรแกรมตามความหมายของตัวอย่างด้านบน) ดังนั้นเราจะจำแนกความแข็งแกร่งในการคำนวณของแต่ละชั้นของไวยากรณ์ในลำดับชั้น Chomsky ได้อย่างไร
นอกจากนี้วิธีการเกี่ยวกับคลาสย่อยที่รู้จักกันน้อยของไวยากรณ์เช่น
- ไม่ จำกัด บริบทไวยากรณ์ (เช่นLR (k) / LL (k) / SLR / LALRเป็นต้น)
- ไวยากรณ์คำที่ซ้อนกัน
- ต้นไม้ที่อยู่ติดกันกับไวยากรณ์
- ไวยากรณ์ดัชนี
แก้ไข:โดยวิธีนี้เป็น nitpick ในคำถามของฉันเอง แต่ฉันไม่ได้พูดถึงว่าฉันไม่ได้ให้สัญลักษณ์เริ่มต้นสำหรับตัวอย่างไวยากรณ์และโบกมือที่ต้องการแยกแยะระหว่างเทอร์มินัลและ nonterminals ในทางเทคนิคหรือตามเนื้อผ้าฉันคิดว่าไวยากรณ์อาจจะต้องถูกเขียนในรูปแบบที่ซับซ้อนมากขึ้นเช่นนี้ (โดยที่ S เป็นสัญลักษณ์เริ่มต้นและ$แสดงถึงเทอร์มินัลสิ้นสุดการสตรีม):
G ::= S -> R0 '$'
S -> R1 '$'
S -> R2 '$'
R0 -> '0'
R0 -> R0 '+' '0'
R1 -> '1'
R1 -> R0 '+' '1'
R1 -> '1' '+' R0
R1 -> R0 '+' '1' '+' R0
R2 -> '2'
R2 -> R0 '+' '2'
R2 -> '2' '+' R0
R2 -> R0 '+' '2' '+' R0
R2 -> R1 '+' '1'
R2 -> R1 '+' '1' '+' R0
... ไม่ใช่ว่ามันจะเปลี่ยนแปลงอะไรจริงๆ แต่ฉันคิดว่าฉันควรพูดถึงมัน
แก้ไข:สิ่งอื่นที่อยู่ในใจเมื่อฉันอ่านคำตอบของแก๊ซคือแต่ละสาขาในต้นไม้ในตัวอย่างของฉันแสดงถึงการคำนวณย่อย หากคุณดูกฎการผลิตแต่ละรายการเป็นฟังก์ชั่นที่ LHS แสดงผลลัพธ์และ RHS แสดงถึงอาร์กิวเมนต์ของมันดังนั้นโครงสร้างของไวยากรณ์จะเป็นตัวกำหนดวิธีที่ฟังก์ชั่นประกอบด้วย
กล่าวอีกนัยหนึ่งบริบทของ parser ร่วมกับกลไก lookahead ช่วยในการพิจารณาไม่เพียง แต่ฟังก์ชันที่จะใช้ ('kinda' เช่น parametric polymorphism) แต่ควรรวมเข้าด้วยกันเพื่อสร้างฟังก์ชันใหม่
อย่างน้อยฉันก็คิดว่าคุณสามารถดูได้ด้วยวิธีนี้สำหรับ CFG ที่ไม่คลุมเครือสำหรับไวยากรณ์อื่น ๆ ยิมนาสติกยิมนาสติกเป็นเรื่องเล็กน้อยสำหรับฉันในตอนนี้