รับสตริงและ CFG อักขระใดบ้างที่สามารถติดตามสตริง (ในรูปแบบประโยคของ CFG)


10

ให้เป็นชุดของขั้วและชุดของสัญลักษณ์ที่ไม่ใช่ขั้วของบางบริบทฟรีไวยากรณ์GΣยังไม่มีข้อความG

บอกว่าฉันมีสายเช่นโดยที่และเป็นรูปแบบที่ sentential ของGa(ΣN)+xayS(G)x,y(ΣN)S(G)G

ได้รับ , ฉันต้องการที่จะตรวจสอบชุดC = { B | W Z S ( G ) , Σ N }GC={bwabzS(G),bΣN}

เพื่อชี้แจงในกรณีนี้คือสตริงของเทอร์มินัลและที่ไม่ใช่เทอร์มินัลและbมีความยาวหนึ่งw,x,y,z,a,bb

ฉันสามารถดูวิธีการทำเช่นนี้ถ้ามีความยาวหนึ่ง; แต่ละเป็นสมาชิกของการติดตามที่ตั้งไว้คือ(รวมทั้งที่ไม่ใช่ขั้ว)aba

อย่างไรก็ตามฉันอยากรู้ว่ามันเป็นไปได้สำหรับลำดับของตัวละคร สำหรับการประยุกต์ใช้ของฉันสตริงไม่ได้นานกว่าด้านขวามือของโปรดักชั่นในGaG

ความแตกต่างระหว่างเทอร์มินัลและที่ไม่ใช่เทอร์มินัลนั้นค่อนข้างเงียบในใบสมัครของฉันเพราะฉันใช้ไวยากรณ์ทั่วไป และฉันเชื่อว่าสิ่งนี้จะไม่นำไปสู่ปัญหามากเนื่องจากมีความยาวหนึ่งb


1
ใบสมัครของคุณคืออะไร? คุณกำลังสร้าง parser หรือไม่?
Raphael

เราสามารถสมมติว่าไวยากรณ์นั้นอยู่ในรูปแบบปกติหรือไม่หรือต้องใช้กับกฎเกณฑ์ใด ๆ ?
Raphael

@AlextenBrink - และyเป็นสตริงที่กำหนดเอง ฉันแค่มองเศษ / ซับสตริง xY
โทมัส

@ ราฟาเอล - ฉันกำลังพยายามเปลี่ยนรูปแบบของระบบ L-System โดยอัตโนมัติ ... ดังนั้นมันจึงไม่ใช่แบบปกติ อันที่จริงฉันจะแก้ไขคำถามนี้อีกครั้งเพื่อให้แม่นยำยิ่งขึ้น
โทมัส

ฉันหวังว่าฉันจะไม่เปลี่ยนคำถามมากเกินไป - ตอนนี้มันมีลักษณะที่แตกต่างออกไปเล็กน้อย
โทมัส

คำตอบ:


6

ฉันจะอธิบายอัลกอริทึมที่ใช้งานได้ เวลาทำงานไม่ควรเลวร้ายเกินไป คุณสามารถคำนวณล่วงหน้าได้บ้างเช่นกัน

ฉันจะคิดว่าไม่ได้มี nonterminals (แม้ว่ามันอาจจะเป็นเรื่องง่ายที่จะปรับให้เข้ากับกรณีที่ว่า) และที่คุณไม่ทราบx , y ที่หรือแหล่งที่มาของ ฉันจะสมมติว่าไวยากรณ์ของคุณไม่ได้มีการผลิตที่ไม่เคยใช้ในการได้มาใด ๆ ( ตัวอย่างเช่นA A )axYaAA

ปัญหาหลักคือเรื่องจริงที่จะแยกตามที่คุณต้องการที่จะรู้ว่าสิ่งที่ชนิดของรัฐคุณจะสิ้นสุดในเพื่อให้คุณรู้ว่าสิ่งที่สามารถทำตาม นี้ไม่ได้ง่ายอย่างที่คุณไม่รู้จักxaax

เราใช้การปรับตัวของอัลกอริทึมของเออร์ลีย์ คุณจะต้องเข้าใจอัลกอริทึมนั้นก่อน อัลกอริทึมของเราทำงานในลักษณะเดียวกันเกือบยกเว้นการกำหนดค่าเริ่มต้นและขั้นตอนการทำให้เสร็จสมบูรณ์นั้นแตกต่างกัน

สำหรับการเริ่มต้นที่เราเมล็ดชุดแรกของเรากับรายการเออร์ลีย์สำหรับการเกิดขึ้นของทุก1 (ตัวอักษรตัวแรกใน) ในการผลิตของไวยากรณ์ของคุณใด ๆ เราตั้งค่าตัวชี้หลังของรายการนี้เป็น -1 ซึ่งเป็นค่าที่ไม่ถูกต้อง นี่เป็นสิ่งสำคัญในการแก้ไขที่สมบูรณ์ของเรา โดยพื้นฐานแล้ว -1 หมายถึง 'ฉันไม่มีความคิดว่าการผลิตนี้เริ่มต้นขึ้นที่ใด'a1a

ตอนนี้เราดำเนินการขั้นตอนวิธี Earley แยกจากกันสำหรับทุกรายการ Earley เริ่มต้นดังกล่าว เราไม่สามารถทำสิ่งเหล่านี้ได้ทั้งหมดในเวลาเดียวกันเนื่องจาก parses อาจรบกวนซึ่งกันและกัน ฉันไม่เห็นวิธีที่เร็วกว่าการย้อนรอยที่นี่

สำหรับขั้นตอนการเสร็จสิ้นเราเพียงทำการปรับเปลี่ยนเพื่อจัดการพอยน์เตอร์พอยน์เตอร์ -1 ในขณะที่เราได้ผลิตเสร็จซึ่งกำเนิดเราไม่ทราบเราก็เดือดร้อน แต่วิธีการที่ใช้ในการคำนวณชุด lookaheadLALR(1)โดยPennello และ DeRemerช่วยเรา: สิ่งที่เราต้องการที่นี่เป็นสิ่งชุด lookahead ทุกรายการในชุด lookahead เหล่านี้มีตำแหน่งที่สอดคล้องกันในไวยากรณ์ซึ่งสอดคล้องกับความต่อเนื่องที่เป็นไปได้ของการผลิตที่เสร็จสมบูรณ์LALR(1)

น่าเสียดายที่ฉันไม่เห็นตัวเลือกอื่นนอกเหนือไปจากการย้อนรอยอีกครั้งที่นี่ สำหรับทุกตำแหน่งในชุด lookahead คุณทำขั้นตอนเสร็จสิ้นด้วยตำแหน่งนี้และดำเนินการแยกวิเคราะห์จากที่นั่น คุณทำสิ่งนี้แยกกันสำหรับการแยกวิเคราะห์ทุกครั้ง โปรดทราบว่าหากไวยากรณ์ของคุณคือ lookahead ของคุณจะกำหนดตำแหน่งที่คุณต้องไปโดยไม่ซ้ำกันดังนั้นคุณจึงไม่ต้องย้อนกลับLALR(1)

คุณยังคงดังกล่าวข้างต้นอัลกอริทึมตัวละครตัวหนึ่งเกินที่คุณจะพิจารณาเป็นพิเศษนี้ตัวละครเสมือนจะเป็น 'ตัวอักษรใด ๆ' ซึ่งทันทีจะช่วยให้คุณ 'ติดตาม' Set คุณกำลังมองหา - เวลาใด ๆ สิ่งที่สแกนเนอร์เฟสพบสุดท้ายนี้ ชุดคุณสามารถเพิ่มตัวละครนี้ในชุดคำตอบของคุณa

แก้ไข:ฉันคิดว่าฉันได้พบวิธีการที่เอาค่าใช้จ่ายส่วนใหญ่ที่แนะนำโดยการย้อนรอย เราเชื่อมโยงชุดตัวระบุซึ่งเป็นสตริงเนื่องจากเราจะต้องใช้ส่วนนำหน้าของตัวระบุเหล่านี้ทุกรายการ ในการเริ่มต้นเราเพิ่มรายการเริ่มต้นทั้งหมดไปที่ชุด Earley และเชื่อมโยงตัวระบุที่ไม่ซ้ำกับทุกชุด

ในขั้นตอนสแกนเนอร์และตัวคาดการณ์ตัวระบุจะถูกส่งไปยังรายการใหม่ รายการ Earley ในชุด Earley เดียวกันที่มีความแตกต่างกันในตัวระบุของพวกเขาจะถูกรวมเข้าด้วยกันโดยการรวมตัวระบุเข้าด้วยกัน โปรดทราบว่าเราสามารถดำเนินการตามขั้นตอนสแกนเนอร์และตัวทำนายสำหรับรายการใหม่เหล่านี้ด้วยตัวระบุโดยไม่ต้องทำตามขั้นตอนนี้สำหรับตัวระบุทุกตัวแยกกัน

LALR(1)

โดยพื้นฐานแล้วเราใช้การย้อนรอยโดยใช้ตัวระบุเหล่านี้เพื่อที่เราจะไม่ทำงานซ้ำซ้อนในขั้นตอนสแกนเนอร์และตัวคาดการณ์


aa

@Thomas นั้นไม่ยากเกินไป: คุณเพียง แต่พิจารณาว่า nonterminal เป็นเทอร์มินัลสำหรับตำแหน่งเฉพาะนั้นในการแยกวิเคราะห์: คุณยังคงคาดเดาและทำให้สมบูรณ์ตามปกติ แต่คุณยังพิจารณาเมื่อสแกน
อเล็กซ์สิบบริงค์

ใช่แน่นอน - ตอนนี้ฉันเข้าใจวิธีการแก้ปัญหาของคุณแล้วมันไม่ควรสร้างความแตกต่างเลย
โทมัส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.