ความท้าทายด้านล่างกำหนดให้คุณต้องคุ้นเคยกับทฤษฎี parser อย่างเป็นทางการหากคุณไม่ทราบว่าคำถามนี้ถามอะไรเพราะคุณไม่รู้ว่าคำศัพท์หมายถึงไวยากรณ์และบริบทชุดแรก / ชุดติดตามตามที่ครอบคลุมในหลักสูตรมหาวิทยาลัยจำนวนมาก
ฉันสามารถแนะนำหลักสูตรสแตนฟอร์ดนี้โดยเฉพาะเอกสารประกอบคำบรรยาย 08 และ 09 (จากหน้า 7) ฉันได้แยกไฟล์โกงออกมาจากเอกสารประกอบคำบรรยายเหล่านี้แล้ว - ฉันแนะนำให้ทุกคนที่พยายามอ่านข้อท้าทายนี้ผมขอแนะนำให้ทุกคนพยายามที่ท้าทายนี้จะอ่านมัน
เขียนโปรแกรมหรือฟังก์ชั่นที่ให้ไวยากรณ์ที่ไม่มีบริบทพบชุดต่อไปนี้ของ nonterminal ทุกชุด อย่างไม่เป็นทางการชุดติดตามที่ไม่ใช่เทอร์มินัลคือชุดของเทอร์มินัลและ$
(หมายถึงจุดสิ้นสุดของอินพุต) ที่คุณสามารถค้นหาเทอร์มินัลนั้นในประโยคที่ถูกต้อง
อินพุตถูกกำหนดเป็นสตริง ASCII เดียวที่พิมพ์ได้หรืออาร์เรย์ของบรรทัด ASCII ที่พิมพ์ได้ คุณสามารถส่งออกชุดในรูปแบบที่เหมาะสมโดยใช้$
(ไม่ว่าจะเป็นตัวอักษรออกหรือสตริงภายในชุด ฯลฯ ) เพื่อระบุจุดสิ้นสุดของการป้อนข้อมูล คุณอาจจะสมมติว่าอินพุตนั้นใช้ได้เสมอตามรูปแบบด้านล่าง
บริบทของไวยากรณ์ฟรีถูกกำหนดในลักษณะที่ง่ายมาก ทุกบรรทัดมีการผลิตรายการเดียว ทุกการผลิตคือรายการสัญลักษณ์คั่นด้วยช่องว่าง เทอร์มินัลคือสตริงของอักขระที่ล้อมรอบด้วยอะโพสโทรฟี (เช่น'**'
) เพื่อความง่ายคุณอาจสมมติว่าเทอร์มินัลไม่มีช่องว่าง แต่มันจะดีถ้าโปรแกรมของคุณอนุญาต nonterminal อาจจะเป็นสตริงใด ๆ $
ที่ไม่มีช่องว่างหรือ การผลิตที่ว่างเปล่า (ปกติระบุด้วยε) เป็นเพียงบรรทัดที่มีเฉพาะที่ไม่ใช่ด้านซ้ายมือ บรรทัดแรกคือการผลิตที่กำหนดสัญลักษณ์เริ่มต้น
เป็นตัวอย่างไวยากรณ์ต่อไปนี้:
S → aSa | bSb | ε
จะได้รับเป็น:
S 'a' S 'a'
S 'b' S 'b'
S
ตัวอย่างอินพุต / เอาต์พุต:
In:
S 'a' S 'a'
S 'b' S 'b'
S
Out:
S {'a', 'b', $}
In:
S A B C
A 'a'
A C 'b'
A
B C
B 'd' A
B
C 'e'
C 'f'
Out:
S {$}
A {'d', 'e', 'f'}
B {'e', 'f'}
C {'b', 'e', 'f', $}
In:
Start Alice Bob
Alice Charlie 'a'
Alice
Bob Bob 'a' Alice Charlie
Bob '!!!'
Charlie 'b'
Charlie
Out:
Start {$}
Alice {'a', '!!!', 'b', $}
Bob {'a', $}
Charlie {'a', $}
รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ