ฉันกำลังมองหาไวยากรณ์ไวตามบริบทที่อธิบายภาษาต่อไปนี้: .
ฉันมีปัญหากับความจริงที่ว่าไม่มีกฎเช่น ได้รับอนุญาตและดังนั้นฉันไม่สามารถวาง nonterminal ใด ๆ ที่ระบุ "กลาง" ของคำ มีเคล็ดลับสำหรับปัญหาหรือไม่?
ฉันกำลังมองหาไวยากรณ์ไวตามบริบทที่อธิบายภาษาต่อไปนี้: .
ฉันมีปัญหากับความจริงที่ว่าไม่มีกฎเช่น ได้รับอนุญาตและดังนั้นฉันไม่สามารถวาง nonterminal ใด ๆ ที่ระบุ "กลาง" ของคำ มีเคล็ดลับสำหรับปัญหาหรือไม่?
คำตอบ:
อันที่จริงมีเคล็ดลับง่ายๆที่ช่วยให้คุณเพิ่มข้อมูลพิเศษในตำแหน่งที่แน่นอน: เพียงแทนที่ตัวอักษรที่อยู่ติดกับตำแหน่งและทำเครื่องหมายด้วยข้อมูลและตัวอักษรเดิม
ในตัวอย่างของคุณมี nonterminal สำหรับตรงกลาง แต่เนื่องจากไม่สามารถลบได้มันจึงนับเป็นตัวอักษรปกติ ดังนั้นเราจึงมีสองชุด และ เพื่อระบุตัวอักษรที่ถูกแทนที่ ในตอนท้ายของการสืบทอดเครื่องหมายควรถูกแทนที่ด้วยเนื้อหาจดหมายของพวกเขาโดยการผลิตง่าย ๆ เช่น.
ในกรณีส่วนใหญ่การใช้งานของ จะต้องดำเนินการในตอนท้ายของกระบวนการที่ได้รับมา ในการก่อสร้างบางอย่างนี้ไม่จำเป็นต้อง "หมดเวลา": เมื่อหายไปเร็วเกินไปที่มาไม่สามารถหาตำแหน่งที่เหมาะสมและกระบวนการจะไม่ประสบความสำเร็จ ในอีกกรณีหนึ่งจำเป็นต้องมีการควบคุม บางครั้งจะทำเช่นนี้โดยแนะนำ nonterminal เป็นสัญญาณที่เคลื่อนที่ไปตามตัวอักษร อีกครั้งสัญญาณนี้ควรพกพาเทอร์มินัลมิฉะนั้นคุณจะพบปัญหาเดียวกัน
การย้ายข้อมูลไปรอบ ๆ นั้นง่ายในไวยากรณ์ที่เรียกว่าmonotonic ( กับ ) ใช้กฎเช่น ซึ่งสามารถมองเห็นเป็น กระโดดข้าม . สำหรับไวยากรณ์ไวตามบริบทที่เหมาะสมเราต้องแยกสิ่งนี้ออกเป็นสามขั้นตอน:. ในแต่ละการผลิตจะมีการเปลี่ยนตัวอักษรหนึ่งตัวในบริบทที่เหมาะสม ต้องใช้จินตนาการพอสมควรที่จะเห็นว่ากระบวนการนี้ไม่ได้มีปฏิสัมพันธ์กับส่วนอื่น ๆ ของแหล่งที่มา เช่นเกิดอะไรขึ้นเมื่อ ในขั้นตอนสุดท้ายมีส่วนร่วมในขั้นตอนที่มาอื่นหรือไม่
สิ่งนี้อาจใช้ไม่ได้กับคำศัพท์สั้น ๆ เมื่อมีข้อมูลมากกว่าตำแหน่งว่าง ทางออกที่ง่ายที่สุดคือการไม่สนใจสตริงสั้น ๆ ในการสร้างของคุณและสร้างมันแยกกัน
คำตอบเริ่มต้นสั้น ๆ : เกิดขึ้นกับ LBA ซึ่งยอมรับภาษาและใช้การจำลองที่ใช้เพื่อพิสูจน์ว่าไวยากรณ์ไวตามบริบทและ LBA กำหนดชุดภาษาเดียวกัน แต่แน่นอนว่าไม่ใช่สิ่งที่คุณเป็นหลังจากนั้น
ในกรณีที่เฉพาะเจาะจงนี้ให้ลองนึกถึงการใช้ไวยากรณ์เชิงเส้นตรงสำหรับ สองครั้งหนึ่งอันสำหรับซ้ายและอีกอันหนึ่งสำหรับครึ่งขวา สิ่งที่คุณต้องทำเพื่อให้แน่ใจว่าไวยากรณ์ทั้งสองได้รับ "ซิงค์"
สิ่งนี้สามารถทำได้โดยการสลับโทเค็นการควบคุม กล่าวคือไวยากรณ์ซ้ายเลือกกฎสร้างโทเค็นการควบคุมที่เหมาะสมและส่งผ่านไปยังไวยากรณ์ที่ถูกต้อง ไวยากรณ์ที่เหมาะสมเห็นโทเค็นการควบคุมและดำเนินการกฎการปรับพอดี โปรดทราบว่าคุณสามารถใช้การสื่อสารสองทางด้วยวิธีนี้ แต่ไม่จำเป็นที่นี่
มีปัญหาอย่างหนึ่งสำหรับไวยากรณ์ไวตามบริบท: พวกเขาไม่สามารถลบขั้วที่ไม่ใช่ (ยกเว้น ถ้าคำที่ว่างอยู่ในภาษา) ดังนั้นเราต้องสร้างเทอร์มินัลที่ไม่ใช่จำนวนมากเท่าที่เราต้องการ ไม่มีใครสามารถซ้ำซ้อนได้
วิธีหนึ่งในการบรรลุเป้าหมายนี้คือการใช้เล่ห์เหลี่ยมเช่นเดียวกับข้อพิสูจน์บางประการเกี่ยวกับ LBA: สร้างเทอร์มินัลที่ไม่ใช่ทั้งหมดที่คุณต้องการก่อนเช่นเตรียม "เทป" ต่อมา "ย้ายไปรอบ ๆ " บนเทปนั้น เฉพาะ "ที่ส่วนท้าย" แทนที่เทอร์มินัลที่ไม่ใช่ทั้งหมดด้วยเทอร์มินัล
ดังนั้นขอ กับ การก่อสร้างขยายไปสู่ตัวอักษรที่ใหญ่ขึ้นและ , กำหนดโดยกฎต่อไปนี้
เป็นกฎสำหรับการสร้าง "เทป" โปรดทราบว่าหมวกหมายถึง "ตำแหน่งหัว" และดัชนีแสดงว่าครึ่งหนึ่งของคำที่ไม่ใช่เทอร์มินัลเป็นของ คำศัพท์สั้น ๆ จะถูกสร้างขึ้นเพื่อที่จะปลอดภัยกฎบางอย่างด้านล่าง ตอนนี้เราจำเป็นต้องมีกฎเพื่อรับหนึ่งสัญลักษณ์ในส่วนด้านซ้าย:
เพื่อทุกสิ่ง . สังเกตวิธีที่เราใช้ดัชนีระดับสูงเพื่อนำสัญลักษณ์ที่สร้างขึ้นไปทางขวา และ เป็นเทอร์มินัลที่ไม่ใช่ "ขั้นสุดท้าย" ซึ่งจะใช้สำหรับการย้ายโทเค็นการควบคุมไปรอบ ๆ และเพื่อรับเทอร์มินัลในภายหลัง โปรดทราบว่ากฎข้อที่สองคือ (เท่านั้น) ใช้สำหรับสัญลักษณ์สุดท้ายของครึ่งขวา
สำหรับการเคลื่อนย้ายกระเป๋าไปทางขวาเราต้องเลื่อนผ่านทั้งคู่ที่เหลือ และสร้างขึ้นแล้ว :
เพื่อทุกสิ่ง . ทีนี้เมื่อการพกพามาถึงโทเค็นการควบคุมที่ถูกต้องเราต้องเลียนแบบกฎที่ใช้ทางด้านซ้าย:
เพื่อทุกสิ่ง . โปรดทราบว่ากฎข้อแรกนั้นใช้สำหรับสัญลักษณ์แรกของครึ่งขวาและกฎสุดท้ายสามารถใช้ได้กับสัญลักษณ์สุดท้ายเท่านั้นมิฉะนั้นการสืบทอดจะไม่สิ้นสุด ตอนนี้เราต้องการเพียงกฎการยกเลิก
เพื่อทุกสิ่ง และเราทำเสร็จแล้ว กฎเหล่านี้ก็สามารถใช้ได้หลังจากทำทุกอย่าง (ทางซ้าย) มิฉะนั้นการสืบทอดจะไม่สิ้นสุด
โปรดทราบว่าไวยากรณ์นี้ไม่ชัดเจน ไม่เพียง แต่สามารถ(ปลอดภัย) ถูกนำไปใช้ที่ใดก็ได้ที่ด้านซ้ายของ "หัว" ด้านซ้ายในเวลาใดก็ได้ แต่ยังสามารถดำเนินการหลายอย่างพร้อมกันในเวลาเดียวกัน เนื่องจากพวกเขาไม่สามารถแซงกันได้ดังนั้นคำสั่งที่ถูกต้องจะถูกเก็บไว้
จะต้องมีการกล่าวถึงหนึ่งข้อ: ไวยากรณ์ข้างต้นไม่คำนึงถึงบริบทเนื่องจากกฎหลายข้อได้เปลี่ยนสัญลักษณ์ทั้งสองทางด้านซ้ายมือ ไม่อนุญาตสำหรับไวยากรณ์ไวตามบริบท โชคดีที่เราสามารถจำลองกฎใด ๆ ของแบบฟอร์ม
โดย
ดังนั้นเราจึงดีและสามารถทำงานกับไวยากรณ์ที่เล็กลงได้ แสดงให้เห็นว่าการแทรกสอดระหว่างการจำลองดังกล่าวไม่ทำให้เกิดความเสียหายนั้นถือเป็นแบบฝึกหัด
คุณเห็นวิธีการขยายนี้ ? มันใช้งานได้กับ? คุณสามารถใช้สิ่งก่อสร้างเดียวกันได้หรือไม่ สำหรับปกติ ?
แม้ว่าฉันจะไม่ทราบว่าไวยากรณ์ไวตามบริบทจะเป็นอย่างไรคุณสามารถหลีกเลี่ยงปัญหาของคุณด้วยสัญลักษณ์ ดังนี้
คุณรู้ว่าคำตัดแบ่งของคุณ ต้องมีความยาวอย่างน้อย . ดังนั้นคุณสามารถ "เข้ารหัส" สิ่งเหล่านั้นได้- กฎไวยากรณ์ของคุณโดยกฎบางอย่างเช่น:
แม้ว่าฉันจะยังไม่เห็นโซลูชันโดยรวมเพราะในใจของฉันดูเหมือนว่ามือซ้ายของกฎไวยากรณ์ของคุณอาจมีความยาวตามอำเภอใจเพราะฉันคิดว่าคุณจะลองพิจารณาคำนำหน้าของ อย่างใดในกฎของคุณ