ฉันจะอธิบายอัลกอริทึมที่ใช้งานได้ เวลาทำงานไม่ควรเลวร้ายเกินไป คุณสามารถคำนวณล่วงหน้าได้บ้างเช่นกัน
ฉันจะคิดว่าไม่ได้มี nonterminals (แม้ว่ามันอาจจะเป็นเรื่องง่ายที่จะปรับให้เข้ากับกรณีที่ว่า) และที่คุณไม่ทราบx , y ที่หรือแหล่งที่มาของ ฉันจะสมมติว่าไวยากรณ์ของคุณไม่ได้มีการผลิตที่ไม่เคยใช้ในการได้มาใด ๆ ( ตัวอย่างเช่นA → A )axYaA → A
ปัญหาหลักคือเรื่องจริงที่จะแยกตามที่คุณต้องการที่จะรู้ว่าสิ่งที่ชนิดของรัฐคุณจะสิ้นสุดในเพื่อให้คุณรู้ว่าสิ่งที่สามารถทำตาม นี้ไม่ได้ง่ายอย่างที่คุณไม่รู้จักxaax
เราใช้การปรับตัวของอัลกอริทึมของเออร์ลีย์ คุณจะต้องเข้าใจอัลกอริทึมนั้นก่อน อัลกอริทึมของเราทำงานในลักษณะเดียวกันเกือบยกเว้นการกำหนดค่าเริ่มต้นและขั้นตอนการทำให้เสร็จสมบูรณ์นั้นแตกต่างกัน
สำหรับการเริ่มต้นที่เราเมล็ดชุดแรกของเรากับรายการเออร์ลีย์สำหรับการเกิดขึ้นของทุก1 (ตัวอักษรตัวแรกใน) ในการผลิตของไวยากรณ์ของคุณใด ๆ เราตั้งค่าตัวชี้หลังของรายการนี้เป็น -1 ซึ่งเป็นค่าที่ไม่ถูกต้อง นี่เป็นสิ่งสำคัญในการแก้ไขที่สมบูรณ์ของเรา โดยพื้นฐานแล้ว -1 หมายถึง 'ฉันไม่มีความคิดว่าการผลิตนี้เริ่มต้นขึ้นที่ใด'a1a
ตอนนี้เราดำเนินการขั้นตอนวิธี Earley แยกจากกันสำหรับทุกรายการ Earley เริ่มต้นดังกล่าว เราไม่สามารถทำสิ่งเหล่านี้ได้ทั้งหมดในเวลาเดียวกันเนื่องจาก parses อาจรบกวนซึ่งกันและกัน ฉันไม่เห็นวิธีที่เร็วกว่าการย้อนรอยที่นี่
สำหรับขั้นตอนการเสร็จสิ้นเราเพียงทำการปรับเปลี่ยนเพื่อจัดการพอยน์เตอร์พอยน์เตอร์ -1 ในขณะที่เราได้ผลิตเสร็จซึ่งกำเนิดเราไม่ทราบเราก็เดือดร้อน แต่วิธีการที่ใช้ในการคำนวณชุด lookaheadLA L R ( 1 )โดยPennello และ DeRemerช่วยเรา: สิ่งที่เราต้องการที่นี่เป็นสิ่งชุด lookahead ทุกรายการในชุด lookahead เหล่านี้มีตำแหน่งที่สอดคล้องกันในไวยากรณ์ซึ่งสอดคล้องกับความต่อเนื่องที่เป็นไปได้ของการผลิตที่เสร็จสมบูรณ์L A L R (1 )
น่าเสียดายที่ฉันไม่เห็นตัวเลือกอื่นนอกเหนือไปจากการย้อนรอยอีกครั้งที่นี่ สำหรับทุกตำแหน่งในชุด lookahead คุณทำขั้นตอนเสร็จสิ้นด้วยตำแหน่งนี้และดำเนินการแยกวิเคราะห์จากที่นั่น คุณทำสิ่งนี้แยกกันสำหรับการแยกวิเคราะห์ทุกครั้ง โปรดทราบว่าหากไวยากรณ์ของคุณคือ lookahead ของคุณจะกำหนดตำแหน่งที่คุณต้องไปโดยไม่ซ้ำกันดังนั้นคุณจึงไม่ต้องย้อนกลับL A L R ( 1 )
คุณยังคงดังกล่าวข้างต้นอัลกอริทึมตัวละครตัวหนึ่งเกินที่คุณจะพิจารณาเป็นพิเศษนี้ตัวละครเสมือนจะเป็น 'ตัวอักษรใด ๆ' ซึ่งทันทีจะช่วยให้คุณ 'ติดตาม' Set คุณกำลังมองหา - เวลาใด ๆ สิ่งที่สแกนเนอร์เฟสพบสุดท้ายนี้ ชุดคุณสามารถเพิ่มตัวละครนี้ในชุดคำตอบของคุณa
แก้ไข:ฉันคิดว่าฉันได้พบวิธีการที่เอาค่าใช้จ่ายส่วนใหญ่ที่แนะนำโดยการย้อนรอย เราเชื่อมโยงชุดตัวระบุซึ่งเป็นสตริงเนื่องจากเราจะต้องใช้ส่วนนำหน้าของตัวระบุเหล่านี้ทุกรายการ ในการเริ่มต้นเราเพิ่มรายการเริ่มต้นทั้งหมดไปที่ชุด Earley และเชื่อมโยงตัวระบุที่ไม่ซ้ำกับทุกชุด
ในขั้นตอนสแกนเนอร์และตัวคาดการณ์ตัวระบุจะถูกส่งไปยังรายการใหม่ รายการ Earley ในชุด Earley เดียวกันที่มีความแตกต่างกันในตัวระบุของพวกเขาจะถูกรวมเข้าด้วยกันโดยการรวมตัวระบุเข้าด้วยกัน โปรดทราบว่าเราสามารถดำเนินการตามขั้นตอนสแกนเนอร์และตัวทำนายสำหรับรายการใหม่เหล่านี้ด้วยตัวระบุโดยไม่ต้องทำตามขั้นตอนนี้สำหรับตัวระบุทุกตัวแยกกัน
L A L R (1 )
โดยพื้นฐานแล้วเราใช้การย้อนรอยโดยใช้ตัวระบุเหล่านี้เพื่อที่เราจะไม่ทำงานซ้ำซ้อนในขั้นตอนสแกนเนอร์และตัวคาดการณ์