ในบทความการแยกวิเคราะห์นิพจน์โดย 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
แทนในการผลิตครั้งแรกสำหรับP
P
ดังนั้นคำถามของฉันคืออะไรฉันหายไปไหน การแปลงพีชคณิตในไวยากรณ์ที่ฉันต้องดำเนินการในตอนนี้เพื่อให้ได้รูปแบบที่แน่นอนเหมือนกับที่ autor ได้รับ ฉันลองใช้การแทนที่E
แต่มันนำพาฉันไปสู่ลูปเท่านั้น ฉันสงสัยว่าฉันต้องการอย่างใดที่จะทดแทนP
สำหรับE
แต่ผมไม่ทราบว่าการเปลี่ยนแปลงทางกฎหมายใด ๆ ที่จะปรับมัน คุณอาจจะรู้ว่าขั้นตอนที่ขาดหายไปสุดท้ายคืออะไร