ในบทความการแยกวิเคราะห์นิพจน์โดย Recursive Descent โดย Theodore Norvell (1999)ผู้เขียนเริ่มต้นด้วยไวยากรณ์ต่อไปนี้สำหรับนิพจน์ทางคณิตศาสตร์:
E --> E "+" E | E "-" E | "-" E | E "*" E | E "/" E | E "^" E | "(" E ")" | v
ซึ่งค่อนข้างแย่เพราะมันคลุมเครือและซ้ำซาก ดังนั้นเขาจึงเริ่มต้นจากการลบการเรียกซ้ำซากด้านซ้ายออกจากผลลัพธ์นั้นเป็นดังนี้:
E --> P {B P}
P --> v | "(" E ")" | U P
B --> "+" | "-" | "*" | "/" | "^"
U --> "-"
แต่ฉันไม่สามารถเข้าใจได้ว่าเขาไปถึงผลลัพธ์นี้ได้อย่างไร เมื่อฉันพยายามลบการสอบถามซ้ำทางซ้ายด้วยตนเองฉันกำลังทำตามวิธีต่อไปนี้:
Firs ฉันจัดกลุ่มการผลิตที่ไม่เหลือการเรียกซ้ำในกลุ่มเดียวและอื่น ๆ (จากซ้ายซ้ำ) ในกลุ่มอื่น:
E --> E "+" E | E "-" E | E "*" E | E "/" E | E "^" E // L-recursive E --> v | "(" E ")" | "-" Eต่อไปฉันตั้งชื่อพวกเขาและปัจจัยเพื่อการจัดการที่ง่ายขึ้น:
E --> E B E // L-recursive; B stands for "Binary operator" E --> P // not L-recursive; P stands for "Primary Expression" P --> v | "(" E ")" | U E // U stands for "Unary operator" B --> "+" | "-" | "*" | "/" | "^" P --> "-"ตอนนี้ฉันต้องจัดการกับสองโปรดักชั่นแรกซึ่งตอนนี้ง่ายต่อการจัดการ
ฉันเขียนใหม่สองโปรดักชั่นโดยเริ่มจากการผลิตที่ไม่ใช่ L-recursive (ซึ่งก็คือ
Pนิพจน์หลัก) และตามด้วย Tail ทางเลือกTซึ่งฉันกำหนดให้เป็นส่วนที่เหลือของการผลิตดั้งเดิมน้อยกว่า nonterminal ซ้ายซ้ำแรก (นั่นคือเพียงB E) ตามด้วยหางT, หรือซึ่งอาจจะเป็นที่ว่างเปล่าE --> P T T --> B E T |(สังเกตทางเลือกที่ว่างสำหรับหาง)
การผลิตสองอย่างนี้ฉันสามารถเขียนใหม่ใน EBNF ดังนี้:
E --> P {B E}ซึ่งเกือบจะเป็นสิ่งที่ผู้เขียนได้รับ แต่ฉันมี
Eแทนที่จะPมีในรูปแบบการทำซ้ำเป็นศูนย์หรือมากกว่า (หาง) โปรดักชั่นอื่น ๆ ที่ฉันได้ค่อนข้างเหมือนที่เขาได้รับ:P --> v | "(" E ")" | U E B -> "+" | "-" | "*" | "/" | "^" U -> "-"แต่ที่นี่เกินไปฉันมี
Eแทนในการผลิตครั้งแรกสำหรับPP
ดังนั้นคำถามของฉันคืออะไรฉันหายไปไหน การแปลงพีชคณิตในไวยากรณ์ที่ฉันต้องดำเนินการในตอนนี้เพื่อให้ได้รูปแบบที่แน่นอนเหมือนกับที่ autor ได้รับ ฉันลองใช้การแทนที่Eแต่มันนำพาฉันไปสู่ลูปเท่านั้น ฉันสงสัยว่าฉันต้องการอย่างใดที่จะทดแทนPสำหรับEแต่ผมไม่ทราบว่าการเปลี่ยนแปลงทางกฎหมายใด ๆ ที่จะปรับมัน คุณอาจจะรู้ว่าขั้นตอนที่ขาดหายไปสุดท้ายคืออะไร